
この記事は、CYBOZU SUMMER BLOG FES '25の記事です。
はじめに
こんにちは、kintone開発チームでプロダクトエンジニアをしている青木です。
以前、以下の記事でサーバーサイドコード分割という取り組みについて紹介しました。
私が所属するナビゲーション / コミュニケーション系チームでも、シニアエンジニアのレビューを受けながらコードの分割を進めています。そのレビューの中で学んだ考え方が、エンジニアとしてステップアップするヒントになると思ったのでご紹介したいと思います。
この記事のターゲットとアウトカム
ターゲット
- 自走して開発はできるが、設計判断に迷う事が多い
- チームで「どうするか」を議論する場面が増えた
- 「自分の判断をうまく説明できない」と感じている
アウトカム
- 設計判断するときの考え方がわかる
空・雨・傘(事実・解釈・アクション)を分ける
「空・雨・傘」というのはコンサル会社などで使われる思考のフレームワークで、以下のようなものです。
- 空に雲がある = 皆が確認できる事実
- 雨が降りそうだ = 事実に基づいた自分の解釈
- 傘を持っていこう = 解釈に基づいたアクション・解決策
事実・解釈・アクションを区別して「だから何?」「なぜそうなるのか?」への答えを明確にする、というロジカルシンキングの基本で、後述の2つの取り組みの基礎となるものです。できて当然と思われるかもしれませんが、説明や議論の過程でいずれかが抜け落ちて議論の妨げになることがあります。
例えば「技術的負債が溜まってきて開発効率が落ちているので、リファクタリングが必要だ」と文を例にすると、「技術的負債が溜まっている」「開発効率が落ちている」は解釈、「リファクタリングが必要だ」がアクション・解決策で、空 = 事実が抜けています。何をもって技術的負債が溜まっている、開発効率が落ちていると判断したのか、それを説明しないとリファクタリングが必要である、との主張に説得力がなく、その要否の議論ができません。
この例のほかにも、自分やメンバーがもっている暗黙知が原因で「空」が抜け落ちて他者への説明がうまくいかなかったり、ADRとして残しているのに再現性のある判断となっていないこともあります。基本であるからこそ、意識的にこの考え方に立ち戻るよう心掛けています。
常に複数の選択肢を検討する
API設計やクラス設計、命名などソフトウェア開発には多くの判断の機会がありますが、これらを判断するとき、最初に思いついた案をそのまま採用せず、常に複数の選択肢を検討するよう心掛けています。
最初に思いついた選択肢は慣れた手法や過去の成功体験、自分の思い込みに引っ張られていることが多いです。それをそのまま採用するのではなく、複数の選択肢を検討・比較して、どういった前提・理由からその選択をするのかを説明するよう習慣づけることで、他者へ説明する力を鍛え、再現性のある判断ができるようになります。
例えばAPIパスを設計するときであれば、そのAPI・業務に関連するワードや、製品内の同種のAPIを列挙してから、それぞれの性質の違いを分類したうえで検討し説明するようにします。
理想的な構造がなにかを考えた上で意志決定をする
新たに機能を追加するときや既存コードの改善をおこなうとき、既存の設計・実装だけを理由とせず、理想の構造がなにかを考えた上で意志決定するよう心掛けています。理想の構造を考える、とは言い換えると、そのクラスやモジュールを製品の中でどういう立ち位置にすべきなのか、どういう価値を提供すべきなのか、またなぜそうすべきなのかを考えるということです。
このような意志決定とその説明を心掛けることで部分最適を避けることができるほか、「役割や価値は何か・なぜそう設計したか」を考え議論する文化が生まれ、チーム内での設計判断が揃っていき、コードの構造的劣化を抑えることができると考えています。
よくやりがちなのは、既存のコードがこう書いているから同じようにしておこう・同じものを使っておこう、という意志決定です。現在の設計・実装から理由もなく乖離したものを作られるのは問題ですし、重視することは間違いではないのですが、あくまで意志決定する理由の一部とします。残りは理想的な構造がどういうもので、だからこういう選択をした、という理由で意志決定をするようにします。
例えばリファクタリングでは、現在のクラス設計を前提として一部を見直すのではなく、そのモジュールの中における各クラスの役割がどうあるのが理想なのかを考えてから、その理想に近づけるための改修をおこないます。
終わりに
私がレビューを通じて学んだ考え方についてご紹介しました。これらの考え方の根底にあるのは「なぜそうなのか」を追求し言語化することにあります。空・雨・傘で構造を整理して「なぜ」を説明・議論しやすくし、複数の選択肢を検討することで「なぜ」その選択がよいと考えるのかの言語化させ、理想的な構造を考えさせることで「なぜ」その選択が全体にとってよいものといえるのかを言語化させます。
こうしてまとめてみると文量としては少ないですが、実践し続けるのは容易でなく、まだまだ研鑽が必要だと日々感じています。今回紹介した考え方をより具体化したものをいつかまた紹介できたらと思います。
最後までお読みいただき、ありがとうございました。本記事が少しでもどなたかのお役に立てれば幸いです。