チュートリアルをやっていると11月に書いた。 https://jnsato.hateblo.jp/entry/2021/11/28/230000
Getting Started を終えて、 Advanced に着手したところで、しばらく止まっていた。放送大学の期末試験の準備をしていたためである。期末試験がおわり、いまはいわば春休み期間であるので、あれこれ読み書きして楽しんでいる。そのあれこれを、チェックポイントがてら書き下しておこうとおもう。
まず宙吊りになっていたチュートリアルを終わらせた。 Agent, GenServer, Supervisor といったモジュールでプログラムの実行を分散させるだとか、小さなアプリケーションを分離して階層化するやり口とかを、 ExUnit のテストコードと実装を行き来する実践的なやりかたで学ばされる。
ひとしきり写経をして、なんとなく Elixir のコードの傾向は知った気になったものの、ちょっと一気に詰め込み型の学習をするカタチになってしまい、うまく飲み込めなかったところのほうが多い。最初に概観をとらえようとすることが無意味だったとはいわないが、チュートリアルの常で「やった気になった」という以上のことはなく、不完全燃焼の感覚は余った。
次いで、 exercism.org でクイズをばんばん解きはじめている。名前だけは知っているというくらいのサービスだったが、 Elixir のコースが充実している様子がうかがえたので、この機にサインアップしてみた。
慣れた言語であればわけもなく書けるくらいの出題でも、手についていない言語ではなんとも難しいことがわかる。チュートリアルをやっただけでは、シンタックスの把握もあいまいだし、せっかくの言語の特性もまったく活かせないわけである。
自力で解いてテストケースを通すと、他のユーザーの回答が閲覧できる。20行もかけてぐちゃぐちゃに書いて通した答案と同じことが、3行ばかりの魔法的なコードで解決できることを知ったときなどは、なるほど! と世界が開かれる感覚がする。
メンタリングサービスというのもあり、これはどうしても実行時間を改善できなかったときにいちどだけ使ってみたが、懇切丁寧に指導してくれて非常に満足度が高かった。総じて、これからもお世話になりたいサービスである。
そのようにしてクイズを解いていくのも享楽的な楽しさがあるが、結局のところ、短く済むはずの実装を長ったらしくしてしまうのは、標準ライブラリを使いこなせていないからとおもい、ドキュメントをいったん全部読んでみるということにチャレンジしている。
https://hexdocs.pm/elixir/Kernel.html
基本的なデータ構造の数は知れているが、それらを便利に操作する手段を頭のなかにストックするとなると、まあ結局はドキュメントをどれだけ読み込むかに尽きるのだろう。exercism でコミュニティの回答例を眺めるのも勉強にはなるが、どうしても一問一答形式の知識になり、チートをしているような背徳感もある。Elixir コミュニティはドキュメンテーションを尊重するコミュニティであるとのことだから、そうして整備されたドキュメントをきちんと読み込むことも当然重んじるべきなのだろう。
手を動かすことよりも文法の抽象構造をみて言語の特性を直観するということが「アリ」ということを、この記事が啓発してくれた。 https://atmarkit.itmedia.co.jp/ait/articles/0901/15/news131.html
業界のなかに「手を動かしてナンボ」という価値観は強く、実際のところそうしないとわからないところもあるが、絶対ではない。言うなれば、「英語は話してナンボ」という、真偽の疑わしい価値観と通底しているのかもしれない。英語については文法ありきで習得したクチなので、プログラミング言語にしても「書くよりも先に文法を習得する」というのが肯定されているのをみて、それでもいいんだ! と気持ちが楽になった。
中途半端にチュートリアルをやったくらいで、手を動かした気になってその実なにも身についていない、というのはよくある話で、できればそうはなりたくないものだ。ドキュメンテーションとガイドラインを読むことでその言語の特性をおおざっぱにでも把握する、というのは一般に有効なのかもしれない。