tomoyaki BLOG

いちSEの学習記録

『プリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則』を読んだ

この本について

  • プログラマとしてチームで開発を行う際に、理解しておきたい「べきべからず集」のような内容。辞書的に読むのがよさそう。
  • ひとつの原則に対してWhat, Why, Howの3段構成となっており、原則の背景、使いどころなどがわかりやすくまとまっている。
  • 個人的には各原則に出典と関連書籍が記載されているのが嬉しい。気になる本はメモして、今後の読書キューに入れておく。

雑感

  • プログラマでなくても、ソフトウェア開発に携わる者として読んでおいて損はない。
  • ひとつひとつの原則にそこまで目新しさはないが、アイディアが言語化されて腹落ちしたものが多々あった。
  • 単純な疑問として、世のプログラマーはどれほどこれらの原則が身に染み付いているのだろうか?
  • 自分は職業プログラマーではないので何とも言えないのだが、これらの原則を常識レベルで身につけているメンバが集まれば、相当クオリティの高いソフトウェア開発ができるのではないか?と思う。ひとまずプログラマーであれば必携書になりそう。
  • 設計やプログラミングで行き詰まった際に、アイディアをもらうための本として定期的に読み直したい。

メモ

第1章 前提〜プログラミングの変わらぬ真実〜

銀の弾丸」はよく見かけるキーワードだが、出典を抑えられていなかった。後で読む本リストに追加。

日本のSIerのSEにはクリティカルヒットするプリンシプル。コードを書けないなら「設計できる」とはいえないと言われているようでツライ。「設計〜プログラミング〜テスト」はすべて設計の枠組みのため、分担すべきでないという主張が出てくるが、これは大規模かつウォーターフォール開発プロセスにおいても同じことが言えるのだろうか?出典書籍を見るにアジャイルを前提としているような気もするので、もう少し深掘りたい。

第2章 原則〜プログラミングのガイドライン

  • YAGNI(You Aren’t Going to Need It)
    • コードは「たぶん必要になるだろう」「必要になるかもしれない」で書いてはいけない
    • 本当に必要になった時、必要なものだけを書く
    • 色々な事態に備えてコードを盛り込んでおても、結局利用されない
    • 結果、そのプログラミングの時間が無駄になる

これは頭の中ではなんとなく正しいと思っていたが、言語化されると納得感がある。一方で、改修を見据えてコードに拡張性をもたせるという考え方もあると思うので、そのバランスをどう取るべきかが気になった。少しググると「YAGNI 思考停止」とか出てくるので、そのあたりの解釈についての議論はありそう。

第3章 思想〜プログラミングのイデオロギー

  • アーキテクチャ非機能要件
    • ソフトウェアの目的は、機能を作ることではなくユーザが目的を果たせるようにすることであるため、非機能要件が大きな役割を占める

こちらも言われてみれば当たり前だが、経験上、機能要件に対して非機能要件は曖昧であったりスキが生まれやすい傾向にあるため、意識する必要があると再認識。

  • 再利用性
    • ソフトウェア開発を効率よく、品質よくするためには「できる限り作らないこと」が重要。つまり、どこかから借りてくる。

便利なライブラリがあればそれを利用するという行為は通常無意識的に行っているが、効率・品質観点のメリットを考えるとより積極的にライブラリ活用を行なっていくべきだと思った。

コードレビューの観点としてある程度体系化されたものがあるというのは知らなかった。コードを書くときにも使えるので、頭の片隅に入れておきたい。

初耳の概念だったが、読んでいる中で興味深いものがいくつかあったため、以下抜粋。

  • 明確性の原則
    • コードを書くときにもっとも重要な観点は、コードを実行するコンピュータを相手にするのではなく、コードを読んで保守をするプログラマを相手にする。
    • コードは、人に対して読みやすく書かなければならない。
  • 驚き最小の原則
    • インターフェースの設計では、意味もなく新奇なことをしたり、過度に巧妙なことをしたりすることは避ける。
    • 「一見似ているが微妙に異なる」ということを避ける。
  • 経済性の原則
    • プログラマの時間を大切にする。ハードウェアが貧弱だったり、使用するソフトウェアに対して制限があったり、環境に関するルールや制限が厳しいとプログラマの時間を浪費してしまう。

よくあるのは、インターネットにおいて、開発に必要なサイトなのに、アクセスできない場合です。クラウドで稼働するソフトウェアが使用できないルールのところもあります。インターネット接続すら禁止されている場合もあります。しかし、そもそも、情報処理技術者から、情報を遮断してはいけません。

ハードウェアやソフトウェアの購入を抑制するのは、経費節減のためです。しかし、設備の費用とプログラマの費用は、比較にならないほど後者が高価です。設備に投資して、プログラマが効率よく、気持ちよく仕事ができれば、簡単に投資は回収できます。

なかなか面白い観点だし、日本の大企業のあるあるだったので深く頷きながら読んだ。

  • 最適化の原則
    • 速いコードより正しいコード。正しく動作する前に最適化に走ることは、コードの設計を台無しにする。
    • 透明性や単純性が犠牲になったり、部分に対する半端な最適化が、全体最適化の妨げになる。
    • まず動かし、正しくしてから、速くする。
  • データはテキスト
    • バイナリよりテキストファイルに保存する。
    • テキストファイルは、もっとも一般的で移植性が高い。人間がただちにデータを確認できる。ツールやコマンドが扱いやすい形式。

第4章 視点〜プログラマの観る角度〜

心に残った箇所は特になし

第5章 習慣〜プログラマのルーティーン〜

第6章 手法〜プログラマの道具箱〜

心に残った箇所は特になし

第7章 法則〜プログラミングのアンチパターン

  • ブルックスの法則
    • スケジュールが遅れているソフトウェア開発プロジェクトにおいて、遅れを取り戻すために後半に人を追加すると、さらなる遅延を招く
    • 「人」と「月」は交換不可能
      • 依存関係によるオーバーヘッド
      • 教育に時間をとられる
    • リスケジュールせよ

炎上プロジェクトあるあるそのまま。出典書籍の『人月の神話』は有名だけど未読。後で読む。

組織編成を先にしてしまいがちだが、アーキテクチャがある程度見えてから組織を編成すべきという話。