新しい言語、技術を学ぶときの手順について(Scalaを題材に)
ここ1年ぐらいはElmを用いてフロントエンドの開発をすることが多かったのだけど、最近Scalaに入門する機会があったので、「この機会に新しい言語や技術を学ぶときの自分用最強手順を確立しよう」ということでいろいろ工夫して取り組んでみたので、その結果として学んだことを記事にして残しておこうと思う。
目次
新しい技術の学習手順
1. ハンズオン形式の教材を見つける
本当に初期の初期の入門の段階で文字情報から実際の作業手順へと脳内変換する手間が無駄でしかないので、ある程度までは動画などを見ながら脳死で実際に動かしてみる、というのが一番早いと思っている。
動画形式のものがなかったとしても最低でも公式のGet StartedのDocsなど、行間を補う必要なくその通りに進めさえすればある程度のものは作れる、という信頼のおけるものを探す。これが見つかった時点でかなりのショートカットができる。
言語以外のところで言うと、AWSのStart Up DayのハンズオンなどはAppSync x GraphQL x Elastic Searchとかの組み合わせ方、自分で作業手順に落とし込んでいたらかなり時間を失うような工程を全て手順に落とし込んだ上で作業している様を画面に映して解説してくれ、昨今のコロナの情勢の中でも詰まったところはチャットでサポートしてくれるためこういったものを見つけるのが一番いいのは言うまでもない。
追記:最近だと5分のハンズオンを先輩など詳しい人に頼むのが非常に有益だと感じる。5分だと時間をもらう方も頼みやすいし時間を使う方も労力がかからない割に後進が育つのでそれならばやってやろうという気持ちにもなる。
Scalaの場合だとドットインストールがいいと思う。
sbtのインストールから実際にコンパイルを通して実行して標準出力を得る、といった超初歩的なところから丁寧に説明してくれているし、他の言語での基本的なお作法をScalaではどういうふうに表現しているのかを、設計までは入らないものの網羅的に解説してくれている。
36レッスンがあるが1日で終わる内容なので1日で終わらせて解約をした。実際に手元で動かすことのできるサンプルの実装を30ほど学習の初期の段階で手に入れることができたのは、その後の学習をスムーズに進める上でとても役に立った。
また、よく使われている言語ほどネット上で調べると本当かどうかわからないようなただの推論で書かれている記事を見かけることも多い。そんなときに実際に動かしてみて反証することができる環境を一早く作ってしまうことは有益だと感じた。
2. 具体例が添えられた網羅的な入門サイトを探す
先にも述べたようによく使われる言語ほど検索して出てくる情報は玉石混合であるので、手順1で見つけたハンズオンや公式のDocsなどの作業手順を進めていく中で出てきたものはそのまま検索するのでなく、サイト内検索のクエリを結合して直和をとる。
for式 site:http://bach.istc.kobe-u.ac.jp/ OR site:https://scala-text.github.io/ OR site:https://docs.scala-lang.org/ OR site:http://www.ne.jp/asahi/hishidama/home/tech/scala
今回のScalaに入門するにあたっては、公式のScalaLangのDocsには具体例が書かれていないため、ひしだま's ホームページやDwangoのScala初学者用入門テキスト、そして、社内の信頼できる先輩方のブログなどを用いた。
3. 手順2で当たりをつけた信頼できる情報源に載っていない場合には普通にGoogle検索にかける
手順2で当たりをつけた信頼できる情報源に載っていないような応用的な内容である場合には玉石混合の中から検索をする。全ての検索に言えることだが、まずは検索結果の集合が大きめになるように検索をしつつ徐々に絞り込んでいく。
4. デバッグの方法を初期で確立する
その言語においてエラーが発生した時に問題をどう切り分けたらいいのかに早めに当たりをつける。RailsならController内部でbinding.pryで処理を中断してローカル変数の値など確認できるし、JSなら同じことをdebuggerで行い、ElmならDebug.logをパイプで繋いでいる合間や関数合成の合間など任意の場所に挟んで値をlogに出力できるなど。
問題の切り分け方を知らない状態で開発を進めるのは推論でデバッグを行うことになるため時間のロスが大きい。自分の場合は型クラスを用いて共通のインターフェースを作ることでElmのDebug.logのようなメソッドを作ってデバッグを行っていた。(最初は型クラスを知らなかったので、コピペで引っ張ってきただけだったけれど。)
5. 既知の言語・技術との違いを意識する
既知の言語でのこういうことを実装するには新しい言語ではどう表現するのかを整理し、まとめていくと頭に入りやすい。例えば、ElmでのflatMapはflatMap : a -> List b -> List a
など第一引数にとる関数は元の文脈で包み直すものばかりだったが、ScalaのflatMapではdef flatMap(f: (A) => IterableOnce[B]): List[B]
のようにIterableOnceで包み直せばよく、必ずしも元の文脈(この場合だとList)で包み直さなくていいことは驚いたこともあってよく覚えている。
その他、大切だと思ったことを五月雨に
1. 意外と入門書を読む必要はない
検索がいまいちスムーズにできないというのが大きい。ただ既知の言語とは前提が違う場合があるため、知識が狭い状態で開発を進めることで思わぬところで足下を掬われることもある。そんな時には実践scala入門などパラパラとめくってみると思わぬ気づきがあることもあった。
2. 場合によっては、はてブのコメントやツイートなどを見てみる
議論が紛糾している題材が結構見つかるためpros and cons(賛否両論)が見て取れる。
3. 疑問に思ったこと、詰まったところなどをAnswer抜きのQuestionだけでも書き残す
残しておくと、同じところで何度もスタックしていないか、1日の進捗、成長の度合いなどが測りやすい。
以上。