9年振りにプログラマが知るべき97のことを読んで学びになった
最近仕事でリファクタリングをやっているが悩ましい部分が多く、ヒントを求めて家の本棚に眠っていた「プログラマが知るべき97のこと」をパラパラ読んでみたら思いのほか学びになった。
本を買わなくても97のことシリーズは全てWebでも公開されている様子(自分はほとんど買っちゃってるけど)。
xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com
この本を買ったのは2010年なので9年振りに読んだことになるが、この9年間の経験が繋がったことで初めて理解できた部分が多く、ほぼ初見に近い感覚で本を読めた。
本に書かれている内容は変わらないが、その本を読む自分自身の脳が常に変わっていて理解度もその時で異なるんだなと感じた。
97のことのうち、前半30個までの中から特に印象に残った部分をメモ。
2. 関数型プログラミングを学ぶことの重要性
関数型プログラミングを学ぶことの重要性 | プログラマが知るべき97のこと
リファクタリングで意識する部分として、この章で書かれている「参照透過性(referential transparency)」を高めることが1つだと思う。
グローバル変数を色んな箇所で参照・変更するような可変な部分がバグを生みやすい場所になっていることは確かで、ここをどう修正するか今手こずっている。
wikiに書いてある関数型言語を1個もガッツリ触ったことがないので、参照透過性の考え方を強めるためにも1つは関数型プログラミングを学ばないとなぁと感じた。
Erlang, Haskell, Scalaあたりを考えてみようかなぁ。
7. 共有は慎重に
コードの再利用を容易に促進すると、かえってひんしゅくを買ってしまうのだ、ということを。
考えた結果わかったのは、私が1つ重大なことを見逃していた、ということです。
それは「コンテキスト」です。
例えばシステム内に同様の処理を行う部分が2つあったとしても、両社のシステムにおける役割が大きく異なっていれば、再利用によるメリットは小さいのです。
同じミスを、自分もこの9年間で何度か犯していたなぁと気づかせられた章だった。
再利用を勧めすぎた結果、巨大なUtilクラスができあがって管理しづらくなるようなケースも何度も見たし、作った覚えがある。
私は、システムを構成するコードの絶対的な行数は減らしたのですが、依存しあう部分を増やしてしまったわけです。
こういうミスはとても厄介です。「再利用」は一般的に良いこととされており、たしかに基本的には良いことだからです。コンテキストさえ適切なら、間違いなく有効です。
「共有は慎重に。事前のコンテキスト確認を忘れずに」ということですね。
コーディングをミクロな視点で見ているのか、マクロな視点で見れているのかの違いとも言えそう。
コーディングテクニックばかり学んでいても良いプログラマになれないというのは、こういった視点の違い・コンテキストの理解度によるものでもあるのかなと感じた。
経済学と同じく、ミクロとマクロをバランス良く学んでいきたい。
10. ツールの選択は慎重に
Unityでゲーム開発していると、便利な外部Assetがたくさんあるので労力を減らすためにどんどん流用していきたいとも思うが、ここに挙げられてるようなデメリットも多く存在する。
外部Assetを使うことでその機能を作る最初のコストは減らせるものの、その後のメンテナンスコストがどうしてもかかってしまうので、最近自分が思うには、短期的なプロジェクトもしくは人手が足りなすぎるプロジェクトでは有効だけども、そうじゃないプロジェクトでは慎重にしたほうがいいかなと思う。
短絡的に外部Assetを採用することは、その後のメンテナンスコストを考えると技術的負債を抱えたことにもなると思うので、下の記事にもある通り長期的な開発効率の低減を招いてしまいそう。
ソフトウェア開発において質と開発速度はトレードオフの関係ではなく、早期から質に投資すれば結果的に安く早く開発できる。技術的負債を軽視すると速度は落ち続ける。質への投資の損益分岐点は1ヶ月以内に訪れる / “Is High Quality Software Worth the Cost?” https://t.co/tL3zIPjcM0
— Takuto Wada (@t_wada) July 29, 2019
ここまであげてきたような問題の発生を防ぐために、私は「まずは最低限のツールだけを導入する」という戦略を採っています。よく検討して、どうしても必要と判断したものだけに絞り込んで導入するのです。
というわけで、「まずは最低限のツールだけを導入する」というのが技術的負債の増加を抑えられるバランス取れた戦略だなぁと同意した。
13. コードレビュー
おそらくコードレビューを成功させるために最も有効な方法は、レビューを楽しいものにすることです。
ほんとこれはそう思う。
コードレビューは楽しく!
仕事の全てを楽しくしていきたい。
自分は日々ずっと楽しくゲームをして生きていきたいと思ってるけれど、それぐらい仕事も楽しくなっていればいいじゃないかと常に思う。
先日も厚生労働省の労働環境の問題について挙がった記事が話題になってたけど、「仕事は苦しい」「仕事は楽しくない」という考え方を撲滅したい。
・職員の4割がハラスメントの被害
— 米村歩@日本一残業の少ないIT企業社長 (@yonemura2006) August 28, 2019
・残業することが美学
・暑い暗い狭いの劣悪な職場環境
管理職がよほど無能でなければこうはならない。おそらく、上層部に頭の固いどうしようもない人たちが居座って権力を持ってしまっているから組織が腐ってしまっている。https://t.co/3VqSWnbUAQ
18. 学び続ける姿勢
これはまあ当然という内容だけど、改めて良いことが書いてあるのでメモとして残しておきたい。
新しく学ぶのは、必ずしもコンピュータ関連技術でなくても構わない。システムが応用されるドメインについて学ぶことも重要で、ある。そうすれば、顧客の求めていることがよくわかり、ビジネス上の問題の解決により役立つシステムを作ることができる。また、自分の生産性を高める方法も学ぶべし。「生産性を高める」とは、一定の労力、時間で得られる成果を大きくすることを意味する。
技術はすごい速さで変化していきます。学ばなければ置いていかれるのは確実です。
すごく分かる。仕事が忙しいとなかなかインプットできず、技術貯金を切り崩し、手持ちの技術だけで作ってしまう。それを数年繰り返すと、あっという間にどんどん技術は新しくなって置いてきぼりに。アート面の根源は技術ほど刷新されないように思いますが、それでも時流ありますよね
— PKY (@pky_blog) August 15, 2019
人間、忙しくなればなるほど更にパフォーマンスが落ちて、もっと忙しくなるというクソ循環があることを学びました。これも学び。
— Jini | ゲーマー日日新聞 (@J1N1_R) August 13, 2019
学び続ける姿勢が好循環を生むことは間違いない。
26. 言語だけでなく文化も学ぶ
言語だけでなく文化も学ぶ | プログラマが知るべき97のこと
新しい言語を学び、その勘所をつかんだら、前から知っていた言語の使い方がそれまでと変わっていることに気づき、自分で驚くことがよくあります。
私は、Rubyを学んだおかげで、C#のdelegateをうまく利用できるようになりました。また、.NETのGenericsの持つ潜在力を十分に知ったことで、JavaのGenericsの活かし方がわかるようになり、LINQを学んだおかげでScalaを楽に理解できるようになりました。
前に、英語学習が脳にもたらすメリットという記事を書いたけど、
各言語には構造や特徴が存在しており、その特徴に応じて使う人の脳の認識も異なってくる。
複数の言語を学ぶことは、こういった言語の背景にある考え方も学ぶことになり、認知能力にも変化が生じる。
これはプログラミング言語においても同様の効果は期待できると思っていて、プログラミング言語の背景にある文化や構造・目的を学ぶことでプログラマーとしての認知能力にも良い変化が生じると予測できる。
Unityが採用しているC#を深く知ることは大事だし、上にも書いた通り関数型プログラミング言語なども理解して認知能力を変化させていきたいなと思った。
28. 「魔法」に頼りすぎてはいけない
「魔法」に頼りすぎてはいけない | プログラマが知るべき97のこと
他人のする仕事というのは、どういうものであれ、遠くから見ているとどうしても実際より簡単に思えてしまうものです。自身が開発を経験していないマネージャは、プログラマの仕事を簡単だと思ってしまいますし、逆にマネージメントの経験のないプログラマは、マネージャの仕事を簡単だと思い込んでしまいがちです。
自分の知らない仕事、自分の直接関わっていない仕事をしている人を尊重するということが大事です。
忘れてはならないのは、「魔法が解けてしまった時は、誰かがかけなおさなくてはならない」ということです。
これは、Googleでさえミスってしまった事例があるので、人間が起こしてしまうバグなんだと思う。
先日も、チームの要のディレクターを追放にしたら、チームが言うことを聞くようになるだろうと考えたP氏が実際にその通りにしてみたら、たった一ヶ月で制作ラインが瓦解し、慌ててるみたいな話を聞いたばかり。洋の東西を問わず、現場を理解してないマネージャのやらかすことは同じだねと思った次第。
— 小林信行 Nobuyuki Kobayashi (@nyaa_toraneko) August 17, 2019
どうすれば自分の中で謙虚さをKeepできるのかなぁといつも課題に感じている。
自分だけでさえ難しいんだから、謙虚さを他人に強制することなんてできないし、謙虚さをKeepできているチームや組織にすることなんてめちゃくちゃ難しいだろうなぁとも思う。
まとめ
9年前に買って読んだはずの本でも、全然自分の血肉になっていなかったことが分かったのは良かった。
こうやってブログにアウトプットする前提で本を読んでるのも効果として出ているので、今後もアウトプットを意識して昔読んだ本を再読していくの有りだなと思った。