とらきす の ぐだログ

とらきすのぐだログ

ぐだぐだとなんかするブログ。

紙ブログ

しばらくブログ放置してたので、なんか適当に書いた。

もともとは「ここ1年で学んだこと」みたいな趣旨で書き始めたはずなんですけど、言いたいことを言う記事になりました。久米田先生の紙ブログみたい。そうでもないかな。

まぁたまにはそういうのも良いかなと。


TOC


Scala すき...

Scala を触りはじめたのはちょうど1年前くらい。

なんで Scala なのかというと、単純明快、周りに書いてる人がいなかったからですね。

マイナー言語... 逆にメジャー言語ってなんなんですかね。
C、C++C#JavaJavaScriptPythonRuby あたりはメジャーといえるでしょうが、その線引きはひどく曖昧です。まぁ、しかし Scala がメジャーということはないと思うので、とりあえずマイナー言語ということで。

高専にいたころは、これとまったく同じ理由で Haxe というもっとマイナーな言語を触っていました。といっても、それは当時の観測範囲がせまかったのが問題で、Scala 詳しい界隈の人たちは普通に Haxe を知っていて、書けたりするんですよね。すごいや。
えー、まぁそれと少し方向性の似ている言語ということで Scala をチョイスしたんです。

いや、いい言語ですよ Scala は。だいいち書いていて楽しい。これ大事です。

関数型プログラミング

先の話のつづきになりますが、やはり関数型プログラミングの考え方はいいものです。

Haskell の美しさはようやく理解できるようになってきましたが、やはり実用的かと言われると素直に首を縦にふるわけにはいかないもので、その点に関して Scala はよく考えられていると思います。

Haxe を触っていたころから、強力な型推論や if / switch 式、パターンマッチなど、なぜこの機能がほかの言語にないんだ? と思うような数々の機能に魅力を感じていました。

最近はいろいろな言語に関数型プログラミング由来の要素が取りこまれつつありますが、やはり知らなければみずから使おうとは思わない (というか気づけない) ので、一度自分から大海に飛びこむ勇気が必要ですね。

Scala では、さらに Option や Either、map に flatten といったモナド周りであったり、カリー化や部分適用、高カインド型、そしてそれまでボンヤリとしていた型システム全般に関する理解を改めました。

デザイン パターンとアーキテクチャ

Chatwork のインターンではじめて設計手法云々を勉強しました。それまでは完全に個人で開発してたので、そういった類のものはあまり触れてこなかったんです。

もっとも、DDD はそこまで違和感なく受け入れられることができました。
私はもともとゲーム作りからプログラミングに入門しているので、オブジェクト指向的な DDD は、なんかこう、わりとスッと頭に入ってきました。

逆に、トランザクション スクリプトの話が出てきたときなんかは「そんな気持ち悪いデザイン パターンなんてあるのか...」と、むしろ違和感しかなかったです。

Clean Architecture は、いまだにベストプラクティスがわかりません。一応自分で書いてみたりはしましたが、やはり要件によって形は変わってくるものです。

先人の実装例を見てみても千差万別、Layered Architecture 派生の中では Clean Architecture は詳細がしっかり定められているほうだとは思うのですが、やはり必要なエッセンスをどれだけ抽象的に捉えられるかが大事なようです。

なので、あまり規模の大きなアプリケーションでないのなら、より抽象的な Leyered Architecture からスケールしていくのが良い気がしています。

CQRS は、データソースまで分けなければ、わりと気軽にプロジェクトに取り入れられそう。というか、取り入れるべきでしょう。Event Soucing しないからやめておこう、なんてことは言わずに、可能なら採用すべきだと思っています。

Event Soucing は、個人レベルのプロジェクトだとあまり触る機会がないのがつらいですね。Akka の勉強もかねて、一度組んでみようかしら...

Japanese traditional xxxxx

卒研やってます。専門学校とはいえ、そのへんは一応きちんとあるんです。
何人かでグループになり、各々すきなテーマに沿ってなにか作ります。

で、うちの学科はですね、10人もいない極小学科なので、全体で卒研することになったのですが。

なんと、「卒研として某企業のシステム開発をしないか」という先生からの提案が!


いや提案っていうか、半ば強制なんですけどね。事後報告。

まぁ滅多にない経験であるのは間違いないし、とりあえず要件を決めて作業にとりかk...


_人人人人人人人人_
> 突然のコロナ <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^ ̄


でました。

あちらさんの社員の方が出社できないので、当然なにも進みません。
先生は今のうちにできることをやっておいてなどとおっしゃってますが、いやいや、なにもできないですから。

とはいうものの、時間を無駄にするわけにもいかないので、とりあえず TypeScript + PWA でやってみるかー という話に。
私も TypeScript と NestJS の勉強してたんですよ、ここ最近は。

で、TypeScript の話はなくなりました (は?)。
社外秘なので、企業内の端末からしかアクセスできないようでなくてはダメだと。

いや、うん。それはまったくもってそのとおりなんですが、少し前に、この方向性でやるよっていうプレゼンやったじゃないですか。そのときに言えよ。

早いところ MTG の機会を設けてほしいものです。別にオンラインでだってできるでしょうに。
ですが、そもそもこのプロジェクトの調印式が終わってないんだそうです。これが噂に聞く調印ってやつか...! ジャパニーズ・トラディショナルは実在した!

結局、フロントエンドは C#、バックエンドは未定。

ま、個人的にはもちろん Scala で書きたいわけなんですが...
書き慣れているのだけでなく、私がこうして内定を頂けたのは完全に Scala のおかげですから、そういう意味でも思い入れがある言語だというだけで。かならずしもベストな言語とは言いきれないわけです。そんな銀の弾丸みたいな言語はないんですが。

Event Sourcing とかやるなら Akka が使える Scala がよさそうですけどね、今回はそこまでやらない予定ですしおすし。

Scala それ自体は実にすばらしい言語だし、もちろん必要であれば Scala を教えることもできますが、それでも、ほとんどの人にとっては書き慣れない言語であることには違いないわけで。
クリーンでスケーラブルな設計と習得難度はトレードオフの関係にあるのです。私自身も、まだ Scala をフルに使いこなせていないと自覚しています。

万が一、結果的に私がほとんど書いてしまうようなことになってしまっては元も子もありません。
ただでさえ今の設計段階でもかなりオレオレなデザインになってしまっていて、少し申し訳ないと思っているぐらいです。軽量 DDD + オリジナルの Layered Architecture + 軽量 CQRS、みたいな。

でも来年以降もこのプロジェクト引き継ぐらしいので、多少複雑になってでも合理的なアーキテクチャを導入したほうが、のちのち破綻するようなことにはなりにくいかなと。 一応そういう考えはあるのです。

そんなこんなで、どうしようかねー ってなってるとこです。

技術選定難しい

結局、プログラミング言語の違いなんて些細なもので、DB だとかコントローラーだとか、そういった外部的な部分を要件に合わせてまず選ばなければいけない。もしくは、使用するフレームワークアーキテクチャが、要件にマッチしているかどうか、とかですかね。

もっとも、今どきのたいていの言語にはどんな DB のドライバーでも用意されているでしょうし、結局のところはチームの合意が取れればいいわけです。
強いていうなら ORM。ORM はモノによって使いやすいか使いやすくないかの差がとても大きいので、慎重に吟味する必要があります。

というか、今回のケースだとそもそも要件が不確定なので技術選定もなにもないんですけど。

Kotlin、お前 Scala でいいだろ

先の件にともなって、少し Kotlin を触ってみました。

ビックリするくらいそっくりですね。なので、これもう Scala で書けばいいやん... ってなる。精神的につらみが深いです。
Scala ユーザー的には、後発のくせにどんどんと市民権を得てきている Kotlin の存在を危惧しているわけなのですが (私だけじゃないよね?)、やはり言語としては Scala のほうがはるかに多機能です。

そもそも Kotlin の設計思想のひとつに「Scala よりも学習しやすい言語」というのがあるそうで、Android 開発なら Kotlin、バックエンドなら Scala というようにまずまず住み分けられているのかな、と思いきや、最近はサーバーサイド Kotlin が増えてきているんですよね。

JVM 以外の実装にしても、Scala.js と Kotlin/JS、Scala Native と Kotlin/Native... 完全に食いにきてますね。

Kotlin、Either がないのがしんどいですね。もし使うときがきたら、DB 周りのエラーの扱いとかに便利なので、絶対に Either を導入するライブラリを使うと思います。
Scala でいう Try.apply() がわりに使える Result なんてのがありますが、型としては使えないもよう。ゴミ

結局は、学習コストとのトレードオフScala のほうがややコスト高めなのは間違いないと思います。
もっとも、Kotlin -> Scala だともちろん追加で勉強は要りますけれど、Java -> Kotlin と Java -> Scala だったら、なんかそこまで差はないのではないかと。

Rust 難しいね

若者もすなる Rust といふものに、私も手を出してみました。

言語仕様をざっと見た感じ、いろんな言語のいいとこどりって感じですね。ただ、API Docs を眺めていると、これ欲しい! っていうのが experimental だったりして、少し物足りない感もありました。

標準でイミュータブルなのはとてもいいですね。
エラーが Result<T, E> なのもいい。Go も少し書いてみて、やはりこの言語は私には合わないとはっきり感じ取りましたが、ことエラー処理に関しては実に合理的にできていると思います。

Java は例外とエラーを区別しなかった、より厳密には、例外処理と大域脱出を融合させてしまった、というアレ。

あと検査例外。それ自体は、閉鎖/開放原則に違反しているとはいえ、堅牢性とのトレードオフということでなら全然許されてもいいのではないかと思います。
Rust の Result<T, E> だって、実質的な検査例外です。Go はエラーチェックを強制しないことで閉鎖/開放原則に違反しない道を選びましたが、それでも、Java における非検査例外とは違って、基本的にはチェックすべきものです。
Java の場合、やはり検査例外と大域脱出とを組み合わせてしまったのはよくないですよね。エフェクトが大きくなりすぎます。

いや、でも難しいですね。Rust。
まだ見よう見まねで書いてただけなので、IDE で書いたらもう少し感想が変わるかとは思いますが、うん、難しい。Scala よりだいぶ難しい気がします。

ドキュメントを読みあさることにします。

YouTube を観るようになった

遅くね?
はい、遅いですね。

流行りものが嫌いなめんどくさい性格なので、どうしてもニコニコから離れられないでいたのです。結果、Vtuber の波からも遅れてしまいましたが。

かといって、ニコニコを観ているかといえばそうでもない。
最近はめっきり観てないです。気に入っている数人の投稿者の動画を追っているくらい。

で、ちょっとひさびさにニコニコでゲーム実況を観てたんですよ。懐かしいな、こんな実況者いたなー、とか思いながら。

でも、もうニコニコで新作はアップロードされないんです。
みんな YouTube 行っちゃったもんね。

ということで、ようやく YouTube を観るようになりました。でも、まだニコニコ出身の実況者の動画しか観てないですね。キヨさん、ガッチマンさんの2人。

最近はホラー実況をよく観てます。普通のゲームなら、実況観るよりも自分でプレイしたいって思いますもん。
ホラーだと自分でプレイできないので、申し訳ないですが動画で終わらせることにしてます。

ゲームやりたい

もしかしたら自分はゲームがあまり好きじゃないのかも、と思うことはあります。
すごく飽きっぽいので、ひとつのゲームをプレイし続けられません。

もっと言うなら、オンラインの対人ゲームが苦手です。見ず知らずのオンラインの相手と接するのが怖くてしょうがない。

よく Twitter とかで、ネットで知り合った人と通話してる人を見かけるんですよ。ほんとすごいなと思います。

せっかくグラボはそこそこ良いの持ってる (Radeon RX Vega 64) のに、あまり活かしきれてないんですよね。2D ゲームが好きなので。
下手なインディーズ ゲームよりも、RPG ツクール製のゲームのほうがおもしろいって何度でも言います。

ツクール製のフリーゲームはだいたいやり尽くしてしまって、今後もあまりおもしろそうなものに出会える可能性は限りなく低いでしょう。ホラーゲームが多いのも、個人的にはあまり歓迎したくない傾向...

そういうのを求めているのなら、🔞のツクール製ゲーム、すごくいいですよ。かなり長時間遊べるものが多いです。特に RPG 系だと寄り道クエストがたくさん用意してあったり、めちゃくちゃマップが広かったり、無駄にやりこみ要素が充実してたりして、100時間とか遊べるものもザラにあります。
むしろアレなイベントやシーンとかは飛ばしちゃうことが多いですね、長いし、そこにあまり興味を持ってるわけではないんです。

まぁそんなことは置いておいて、TL を見てるとですね、つよつよな方たちは普通にゲームやってたりするんですよ。でも強い。
いっぽう私は、コードを触っていたり読んでいる時間はまぁまぁ長いのですが、強くはない。

だからなんだって話なんですが。要領の良さを見習いたいものです。


いつもどおり収集つかなくなってきたのでここらでいったんストップ。

でもなにも気にせず書けるので、書きたいことが出てきたらこういうの書くかもしれません。

bye