📱

Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考を輪読会で読んだ話

2023/12/15に公開

この記事は スターフェスティバル スターフェスティバル Advent Calendar 2023の15日目の記事です。

スターフェスティバル株式会社 ソフトウェアエンジニアのishidaです。
先日社内の輪読会で 「Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考」という本を読みました。 本記事はそのレポートになります

輪読会参加の動機

弊社エンジニアの@ikkitangさんが
輪読会やるよーと告知があったので、参加させていただきました。

announce

個人的な動機としては、開発やコードレビューの視点を広げられるのではと思ったためです。
コードを書く際やレビューをする際に違和感を感じるが改善策が浮かばない、うまく言語化できない...といったことがあり
読書会を通して解決策の引き出しを増やし、より効率的で適切な開発やレビューに繋がることを期待して参加しました。

輪読会について

以下のような流れで行いました。

  • 当日に10-15分程度で読める量に区切り黙読後、ディスカッション
  • 週2回 16:00 - 17:00に1回につき1章を目安に進める

対応する章を一読しておく、資料にまとめておくなどの事前準備は特になく、気軽に参加できました。個人的に朝早い時間だと継続的に参加しにくいので、16:00からという時間帯はありがたかったです。

書籍の概要

全体を通して高品質なコードを書くために必要な考え方や実践方法が解説されていました。
3部で構成されています。

1部

1部は1-6章で構成されていおり
1章では「コード品質の4つのゴール」とゴールを達成するための「コード品質の6つの柱」が紹介されています。

コード品質の4つのゴール

  1. 正しく動くこと
  2. 正しく動作し続けること
  3. 要件の変更に対応しやすいこと
  4. 車輪の再発明をしないこと

(Tom Long 著 秋 勇紀 ・ 高田 新山 訳 山本大祐「Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考」秀和システム,2023年2月,8ページ)

コード品質の6つの柱

  1. コードを読みやすくする
  2. 想定外の事態をなくす
  3. 誤用しにくいコードを書く
  4. コードをモジュール化する
  5. コードを再利用、汎化しやすくする
  6. テストしやすいコードを書き、適切にテストする

(Tom Long 著 秋 勇紀 ・ 高田 新山 訳 山本大祐「Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考」秀和システム,2023年2月,12ページ)

2-6章ではどのようにして6つの柱を実現するかが解説されています。
例えば2章では

  • 抽象化レイヤーについて取り上げ、抽象化レイヤーがコード品質の柱を達成することにどのように役立つか
  • 関数、クラス、インターフェイスを使ってコードを抽象化レイヤーに分割する方法

などが取り上げています

2部

2部では良いコード、悪いコードの例を挙げながら、以下の5つの品質の柱を満たすためにどのような解決策が考えられるかが説明されています。

  • 想定外の事態を無くす
  • 誤用しにくいコードを書く
  • コードをモジュール化する
  • コードを再利用、汎化しやすくする

3部

3部は 効果的なユニットテストを書くための原則や実践方法が解説されています。

ディスカッション

内容は基本的に同意できる内容ばかりでしたが、
以下のような一人では気づけなかった視点や考え方を議論することができました。

  • ゴールにある「正しく動くこと」、「正しく動作し続けること」については、適切に落ちる事も大事。エラーが発生してることに気づけないのは怖い。
  • 柱の1つ「想定外の事態を無くす」ために「予期せぬ副作用の発生を避ける」というアプローチについて
    • エンジニアが正しくコードを利用するために、細かいコメントに頼らなければならない状況を作るのではなく、間違ったことを出来なくする方がよい
      • 間違った使い方をなくすのもそうだが正しい使い方をする方が楽なインターフェースを作るのも大事かも
    • 副作用が発生する場合は命名により副作用を明白にするのはそうだが
      クラス名や関数名が長すぎるなら立ち止まって「小さい問題に切り分け出来るか?」、「その関数名のすべてを呼び出し側は興味があるのか?」と自問してもよいかも
      → 小さな問題に切り分ける際に、別の問題なのかメインの問題一部とされるべきかの判断が難しい
      → そういう判断の軸として客観的な軸を持ってこれるといいね
  • 再利用/汎化について
    • 再利用性のあるコードを書く時、実際に難しいのはコードを書くことよりも複数のシナリオが同じ問題を抱えていることを認知することな気がする

まとめ

内容として同意できる内容ばかりで、具体的な例も豊富で読みやすい本だと感じました。
トピックごとに不明点があれば質問しながら読み進められたため、大きくつまづくポイントも少なく読了することができました。
(悪い例が挙げられたところで、あ、経験あるかも...とギクリとした内容もありましたが)
読み終えてから開発やレビュー時に意識できることが増えましたが、まだ実践できていないことも多くあります。
前書きには

コードは、関わるプロジェクトの要件や開発体制、開発ポリシーなど、それぞれ異なるコンテキストの上に構築されます。そのため、他の成功事例をそのまま活用できることは滅多になく、自分自身のコンテキストに合うように修正する必要があります。しかし、自分の中にコードの善し悪しの明確な判断基準がないと、どんな修正を加えれば良いかがわからず、良いコードを書いているつもりが、いつの間にか悪いコードを書いていたという結果に陥る可能性が非常に高いのです
(Tom Long 著 秋 勇紀 ・ 高田 新山 訳 山本大祐「Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考」秀和システム,2023年2月,訳者前書きより)

とあります。
紹介されていた解決策もそのまま活用できるとは限らないと思いますので
定期的に読み返し、良いコードを書くための軸をしっかりと持ち、今後の開発やレビューに活かしていければと思います。

スタフェステックブログ

Discussion