だらだらと思いついたこととか書くブログ

エンジニア的なネタとか備忘録とかを書いていく予定

CODE COMPLTE 第1章 読書メモ

背景

ソフトウェア開発に携わるものとして読んでおくべき名著としてよく名前のあがるCODE COMPLETE。 上下巻揃えたものの、今ままでかいつまんで一部分読む程度で「ちゃんと読んだ」と言える状態になかったので、あと2ヶ月弱となった今年中に気になった箇所だけでも、しっかり読んでおこうと思い立ち、読み進めるとともに、後から見返したりできるようにちょっとしたメモがわりにこちらに書きました。

読書メモ

1.ソフトウェアコンストラクション

ソフトウェア開発の大部分を占める、開発の中心的なアクティビティのこと。どのプロジェクトでも必ず実行される唯一のアクティビティ。

コンストラクションのほとんどの部分はコーディングとデバッグだが、設計や計画、テストといったアクティビティも含まれる

コンストラクションは機械的なものでなく、創造力と判断力を必要とする

結果として、コンストラクションの方法をどれだけ理解しているかが、どれだけ優秀なプログラマであるかを決める。

2.ソフトウェア開発への理解を深めるメタファ

よく理解できないものをよく理解できるものと照らし合わせた結果、何かがひらめいて、解明できなかったテーマへの理解が深まることがある。メタファのこうした利用を「モデリング」と呼ぶ

メタファは、ソフトウェア開発プロセスを既知のアクティビティと関連づけることでその理解を促進する。

メタファをどれだけ理解できるかによって、ソフトウェア開発をどれだけ理解できるかが決まる

ソフトウェアメタファは「アルゴリズム」というよりも、「ヒューリスティクス(発見的)」という意味合いが強い。見つける方法を教えるだけで、何を見つけるのかは教えてくれない。 答えを見つけるために役立つテクニックの一つ。

ソフトウェアに関するメタファには様々なものがあるので、目的にあったメタファを組み合わせて利用すれば良い。

3.上流工程の必要性

プロジェクトの成功の行方は、コンストラクションが始まる前に大方決まってしまう。 コントラクションの前の下準備である、アーキテクチャ、設計、プロジェクト計画といった上流工程が大事。

準備が不十分になる一般的な原因は、上流の作業を担当する開発者が、与えられた仕事をこなすための専門知識を持っていないことである

準備を事前にどの程度まで完了しておくかについては、ソフトウェアの種類、プロジェクトの形式、技術的な環境、スタッフのスキル、プロジェクトの目標によって異なる。 大抵のプロジェクトは高い反復性を必要とするが、プロジェクトによっては逐次性を重視する場合もある

課題定義が十分でないと、コンストラクションの際に解決すべき課題ではなく、誤った課題を解決する羽目になる

要求の策定が十分でないと、課題の重要な特徴を見逃してしまう恐れがある。

アーキテクチャの設計が十分でないと、コンストラクションの際に解決すべき課題はあっていても、誤った方法で解決する羽目になる

プロジェクトにおいて、コンストラクションの準備がどのように行われたかを理解し、それに応じてコンストラクションのアプローチを選択する

4.コンストラクションの重要な決断

  1. プログラミング言語の選択
    • 使用する言語の長所と短所を把握しておく
  2. プログラミング規約を定める
    • 複雑なプログラムではアーキテクチャガイドラインがあると、プログラムが構造的にバランスのとれたものになる
    • コンストラクションのガイドラインがあると、各クラスが設計全体の信頼できるパーツとしてつなぎ合わされ、実装が調和のとれたものになる
    • プログラミングを成功させる鍵は、自由裁量によるばらつきをなくし、必要な箇所に思考を集中させること
  3. コンストラクションプラクティスの選択
    • 特定のプロジェクトに適さないものがあある
    • 適切なプラクティスを選択する
    • コンストラクションプラクティスの例
      • コーディング規約
      • マージ、ブランチ戦略
      • ペアプロやモブプロなどを導入するかどうか
      • テストコードの有無やレビュー体制
      • VCSを使うかどうか
      • 言語のバージョン、フレームワーク、Lint、CIなど
  4. テクノロジの波に乗って
    • テクノロジの波のどの位置に乗っているのかを把握する
    • どこにいるかによって、どういうアプローチが効果的なのか、もしくは可能なのかが決まる
    • テクノロジの波のどの位置に乗っているのかを見極め、それに応じて計画や予測を調整する

第1章の振り返り

ソフトウェアコンストラクションという、開発の大部分を占める作業についての定義や、それに関わる準備から実践までの作業の必要性、重要性について説いている部分で、 自分の感想や感覚としては、今までやってきたことや、ソフトウェア、サービス開発とはこういうものだというのが丁寧に整理され、言語化されていたのがこの章だと感じた。

アーキテクチャの部分については、自分は基本的にwebサービスしか携わってこなかったため他の分野ではこういうところに着眼するのかということが、ざっと見レベルだが垣間見れたように感じた。

1章の中では、自分は特に「メタファ」についての箇所はとても興味深かかったと感じた。 最近、思考法についてやDDDについての本を読むことが多く、どちらでも必要かつ重要な概念・スキルとして「抽象化」が取り上げられていたが、その抽象化を行う過程で必要となるのが「メタファ」であると考えている。

特に本書で、ソフトウェアのメタファについて、「ヒューリスティクス(発見的)」であるとされている点については、なるほどと思わされた。 今まで、何かしらの「答え」を探して「答え合わせ」をするようになってしまっていた部分が多く、 何かが違う、うまくいかない、と感じていた部分が、この言葉ではっきりしてきたように感じられた。

もちろん、ここが言語化されてクリアになったところですぐに何かが改善できるわけではないと思うが、今後はこの勘違いの沼に今後ハマらず開発を進めていくきっかけにはなりそうだと思う

今は次の2章を読んでいるところだが、ボリュームも多く内容もぎっしりなので、いつまとめられるか、そもそもまとめられるのかどうか不安・・