14 October 2018

アプレンティスシップ・パターン - 徒弟制度に学ぶ熟練技術者の技と心得

アプレンティスシップ・パターン ―徒弟制度に学ぶ熟練技術者の技と心得 (THEORY/IN/PRACTICE)
Dave H. Hoover Adewale Oshineye
オライリージャパン
売り上げランキング: 139,738

ソフトウェアエンジニアとして成長するには良い習慣を身につけるのが大切だが、それをパターン化して紹介しているのが本書。2010 年ごろのちょっと古い本だが、内容は普遍的なので今読んでも問題なかった。

アプレンティス とは徒弟制度における徒弟の身分のこと。これになぞらえてパターンの説明をしたり徒弟制度の用語がでてきたりするが、あまりわかりやすくはない。そうする必然性があったのかは謎だった。こういうベストプラクティス集をパターンという形態で整理するのも、2010 年前後の当時らしいなとも思う。仰々しさが先に鼻についてしまうので、もっと軽めに・必要十分な感じでまとめたほうが今っぽいのかもしれない。

とはいえ書いてある内容は正しく、自分の習慣を振り返って足りていないところを棚下ろすには最適な本。自分の場合は後述の Dig Deeper パターンは最近全然できていないところだった。エンジニアのためのマネジメントキャリアパス なんて本が出ている昨今で、「管理職になんてなるな。現場でコードを書き続けるべし」という主張も出てきて、これは過激だなと思うが、徒弟の身分 ということなら正しいのかもしれない。

エゴを持たないとか、自分が一番下手になるチームにとどまるとかいろいろなパターンが出てくるが、Dig Deeper パターンは一言で言うと「ちゃんと技術を深掘りしよう」というもの。その反対は「何がおこっているのかわからずに書いている」状態で、これを偶発的プログラミング (達人プログラマーより) とか、カーゴ・カルト・ソフトウェア・エンジニアリング (スティーブ・マコネルがそう言っていたらしい) と切り捨てる。大聖堂を建築 (ビジネス書によく出てくるこういうやつのことかと) するようなプログラマーに共通するのは、RFC等仕様書・一次情報にあたっていることと、何が起こっているのか掘り下げているところだという。

一次情報にあたることは、アイデアの本質をとらえるために重要。アイデアの本質とは、「それはどんな問題を解決しているのか」「どんなアプローチがあるのか」「このアプローチにはどんなトレードオフがあるのか」「他にどんなアプローチがあるのか」ということ。そのような本質は二次・三次情報と伝播するごとに薄まったり歪んだりするという。一次情報にあたるとそれがわかるのかは疑問だが、新しい技術やパラダイムにふれるとこに、これらを理解しようと努めることは非常に大切だと思う。

また掘り下げについては、すべての問題をコンピュータサイエンスのレベルにまで落とし込むこと、つまり問題の抽象化と一般化をすることが大切だという。すべての問題がそのレベルにまで一般化できるのかはわからないけれど、そう努力することは重要だと思う。すでに議論されている問題なのでより正しく解決できるし、そもそも自力だけでは解決にたどり着けない可能性もある (List, Set, Hash しか知らないプログラマが、トライを使ってデータ構造のチューニングができるか、という例が書かれていた)。何かを身につけるには、悩んで・調べて・アクションして振り返る経験が必要。一方でそれを一般化して理解しておかないと、せっかく身につけたことを他のケースに応用できない。個人的には以前携わっていたシステムのコアな技術的課題はキャッシュ戦略と機械学習 (後者は自分は殆どやっていないが) で、今は分散トランザクションなのかなと思っていて、この機会に身に着けたい。