🐧

設計と複雑さについて、A Philosophy of Software Design の導入

に公開

設計をうまくできるようになること、複雑さに対処することが肝であることを主張する話を社内のLT会でしました。発表資料はSpeakerdeckで公開しています。

https://speakerdeck.com/naoyafurudono/she-ji-tofu-za-sanohanasi

この記事では内容を変えずに文章のフォーマットで同一の主張をします。

ソフトウェアを簡単に作れるようになるという願い

私たちソフトウェア開発者は、よりすごいシステムをより安価に作れるようになりたいと願っています。この願いには個人と組織それぞれの視点があります。

個人としては、開発が楽しく、実現したいことを自由に実現できるようになることを望みます。事業会社としては、ユーザに価値を提供でき、事業の試行錯誤を素早く行えることが重要です。

しかし、自由自在にソフトウェアを作れないとき、それは何が原因なのでしょうか?

作るシステムを理解することがソフトウェア開発を律速する

ソフトウェア開発において最も支配的な能力は、作るシステムがどんなものであるか(つまり設計)を理解する能力です。言い換えれば、設計する能力が開発速度を決定づけます。

ソフトウェア開発では、まず何を作るのかを明らかにすることが難しいものです。どんなものが欲しいかを明確に表現できれば(つまり設計をアウトプットできれば)、実装はそれに従うだけとも言えます。私自身は、どのように作るべきかを実際に作りながら考えることが多いです。

また、既存のシステムを拡張する際には、既存システムの理解を土台にして新しい拡張を設計する必要があります。実は、完全に新しいソフトウェアを作ることはほとんどありません。例えばCLIツールを作る場合でも、コマンドラインインターフェースやファイルシステムといった既存のシステム上に構築することになります。

では、ソフトウェア開発を高速化するためにはどうすればよいのでしょうか?

理解する主体が賢くなるか、理解する対象を簡単にする

ソフトウェア開発を高速化するためには、大きく二つのアプローチがあります。

一つ目は、「理解する主体」つまり開発者自身が賢くなることです。具体的には:

  • コードリーディングの能力を高める
  • エディタやツールを効率的に使いこなす
  • 設計の能力を高める

もう一つは、「理解する対象」つまりソフトウェア自体を簡単にすることです:

  • インクリメンタルに開発を進める
  • 適切なドキュメントやテストを書く
  • ソフトウェアをシンプルに保つ

ソフトウェアをシンプルに保つことの重要性

人間は流動的であり、プロダクトは際限なく複雑になりうるものです。何も工夫しなければ、誰も理解できない状態に陥りやすいのが現実です。

先ほど挙げた二つのアプローチのうち、特に注目したいのが「ソフトウェアをシンプルに保つ」という点です。開発者が賢くなることも重要ですが、チームメンバーが入れ替わる中でも持続可能な開発を実現するには、ソフトウェア自体の複雑さをコントロールする必要があります。

つまり、シンプルにするということは、複雑さを減らすことに他なりません。

複雑さを減らすためのアプローチ

複雑さを減らすには、主に二つのアプローチがあります:

  1. コードをシンプルに保つ

    • 適切な命名を心がける
    • 例外的な処理をできるだけ減らす
  2. 複雑性をカプセル化する

    • モジュールの内部実装が複雑になったとしても、インターフェースをシンプルに保つ
    • これにより、システム全体としての複雑さを下げる戦略(モジュラーデザイン)を実現する

しかし、これだけの説明ではまだピンとこないかもしれません。複雑さとは何か、そしてそれにどう対処するかをより深く理解する必要があります。

これからできること

私たちがこれから取り組むべきことは二つあります:

  1. 複雑さを理解すること

    • 複雑さとは具体的に何を意味するのか
    • 複雑さがもたらすどんな問題があるのか
    • 設計時や実装後に、不必要な複雑さをいかに認識するか
  2. 複雑さを減らす手法を身につけること

    • 先人の知恵を学ぶ
    • 日々の開発を通じて実践する
      • 他者のコードをレビューする際に複雑さに注目する
      • 自分のコードがレビューされる際にフィードバックを活かす

「A Philosophy of Software Design」を読むと良い

本に期待できること

「A Philosophy of Software Design」は、一人で読むのもよいですが、みんなで輪講形式で読み進めることでより理解が深まります。この本からは主に次のことが学べます:

  • 複雑さを理解すること

    • 複雑さの本質的な意味
    • 複雑さがもたらす具体的な問題
    • 設計時や実装後に不必要な複雑さを認識する方法
  • 複雑さを減らす手法を習得すること

    • 先人の知恵から学ぶ実践的なテクニック
    • (実践については輪講ではなく日常の開発で取り組むことになります)

この発表と「A Philosophy of Software Design」の関係

  • この発表ではA Philosophy of Software DesignのPrefaceとChapter 1を参考にしました
  • 本書は全体で200ページほどのボリュームです
  • 日本語訳は現時点で存在しませんが、英語は比較的平易で読みやすい内容となっています
GMOペパボ株式会社

Discussion