『Tidy First?』〜小さなステップで進めるコード改善のススメ

2025/3/6 Forkwell社主催、Forkwell Library #84

Transcript

1. Forkwell Library #84 『Tidy First?』 〜小さなステップで進めるコード改善 のススメ 細澤あゆみ 株式会社アトラクタ
2. 細澤あゆみ / Hosozawa Ayumi Scrum Alliance認定スクラムマスター(CSM) / 認定スクラムプロダクト オーナー(CSPO) / アドバンスド認定スクラムデベロッパー(A-CSD)。学生 時代、PBL(Project Based Learning)にて、ソフトウェア開発プロジェクト を経験。学生のみで実際の顧客がいるソフトウェアを開発、リリース・運用 する。院生時代にスポンサーの協力により、世界最大のアジャイルカンファ レンスである「Agile 2010」に参加。アジャイルに出会う。卒業後、スクラ ムチームでのソフトウェア開発や、基幹系システム再構築の経験を積む。 産業技術大学院大学非常勤講師(2021)。RSGT、XP祭り、スクフェス三河 実行委員 New! 3/26発売 2
3. 株式会社アトラクタについて ✤ 社名:株式会社アトラクタ 英文表記:Attractor Inc. / https://www.attractor.co.jp ✤ 設立:2016年12月 ✤ 所在:東京都港区 ✤ 開発プロセスに関するコンサルティングやトレーニングを提供 ✤ アジャイル開発 / DevOps / チーム育成 / クラウドコンピューティング / ドメインモデリング などが専門領域 3
4. 登壇 各種イベントでの登壇 コーチング オンサイト トレーニング アジャイル開発やDevOps に関するオンサイトコーチ ング アジャイル開発や組織づくり に関するオンサイト トレーニング 認定研修 認定スクラムマスター研修 Suitable for all categories 等の主催 business and personal 執筆・翻訳 技術書やドキュメントの 執筆や翻訳 などなど
5. ✤ Kent Beck 16年ぶりの書籍 ✤ エクストリーム・プログラミング(XP)の父 ✤ ブログに書かれた記事を書籍化 ✤ 3巻シリーズの1冊目 ✤ コードの改善の取り組みについて書いている ✤ 想定読者:プログラマー、リード開発者、現場にで るソフトウェアアーキテクト、技術マネージャー ✤ 一般的なプログラミングの経験がそこそこ ある人 5
6. 次作は『Tidy Together』 https://tidy rst.substack.com/p/tidy-together-outline fi 6
7. 『Tidy First?』の範囲 書籍 『Tidy First?』 『Tidy Together?』 『???』 Everyone a ected by software development Who Myself Me & my fellow geeks 誰が 自分自身 自分と同僚のプログラマー Techniques Tidyings Refactoring Architectural evolution テクニック 整頓 リファクタリング アーキテクチャの進化 Management Separate behavior & structure changes Sustaining long-running change Balance behavior & structure investment, aligning incentives 管理術 ソフトウェア開発の影響を受けるすべての人 振る舞いと構造の変更を分ける 長期的な変更を維持する 振る舞いと構造への投資のバランスをとり、 インセンティブを整合させる Theory Coupling/cohesion Power laws 理論 結合/凝集 べき乗則 Patterns, systems thinking, queueing theory パターン、システム思考、待ち行列理論 『Tidy Together? Outline』(https://tidy rst.substack.com/p/tidy-together-outline)より fi ff 7
8. Tidyの定義 ✤ (形容詞) きちんとした、片付いている、整然とした ✤ (動詞) 片付ける、整頓する ✤ Kent Beckもこんまりを参考に? Kent BeckのXのポストより 8
9. 「整頓」とは ✤ 将来の振る舞いの変更への準備 ✤ 振る舞いを変更せずにコードの構造を変える ✤ リファクタリングのサブセット ✤ 整頓は「可愛くてふわふわした小さな赤ちゃん」 ✤ とにかく小さい ✤ 数分から1時間ぐらいまでの規模 9
10. 本書で紹介されている整頓 ✤ 1章 ガード節 ✤ 9章 説明定数 ✤ 2章 デッドコード ✤ 10章 明示的なパラメーター ✤ 3章 シンメトリーを揃える ✤ 4章 新しいインターフェース、古い実装 ✤ 5章 読む順番 ✤ 6章 凝集の順番 ✤ 7章 変数宣言と初期化を一緒の場所に移動する ✤ 8章 説明変数 ✤ 11章 ステートメントを小分けにする ✤ 12章 ヘルパーを抽出する ✤ 13章 ひとかたまり ✤ 14章 説明コメント ✤ 15章 冗長なコメントを削除する あくまでも例であり、振る舞いを変えないコードの小さな構造変更は「整頓」といってよい 10
11. 11章 ステートメントを小分けにする `` 大きなコードのチャンクを読んでいると、 「ああ、これはこれをしていて、あそこであれをしているのか」とわかる。 そのあいだに空行を入れよう 『Tidy First?』 p29 ✤ 整頓大賞シンプル部門受賞 11
12. 2章 デッドコード `` 消そう。 以上。 実行されないコードは消すだけだ 『Tidy First?』 p11 ✤ バージョン管理しているので、本当に消えて無くなるわけではない ✤ 使われているかどうかわからなかったらログを仕込む ✤ たいてい書き直したほうがよいコードになる 12
13. 8章 説明変数 `` 式は成長する。 たとえ小さく始めても成長する。 成長して、成長し続ける。 やがて、あなたは老眼鏡をかけながら近づいて、何が起きているのか理解しようとする そして、大きくややこしい式の一部を理解したら、その部分を意図がわかる変数に抽出する 『Tidy First?』 p23 return new Point ( … 大きな長い式…, … 他の大きな長い式… ) ✤ こうする X := … 大きな長い式… Y := … 他の大きな長い式… return new Point (x, y) 式を変更する前に、先に整頓することを考える 13
14. 「リファクタリング」の誤用 `` 「リファクタリング」という言葉は、機能開発の長い中断を指す言葉として 使われ始めたときに致命傷を負った。 「振る舞いを変更することなく」という条項さえもなきものにされ、 「リファクタリング」は簡単にシステムを破壊できるようになった。 新機能なし、損害の可能性あり、最終的に見せるものなし、だって? もう結構だ 『Tidy First?』 p7 14
15. リファクタリングとは `` リファクタリングとは、ソフトウェアの外部の振る舞いを保ったままで、 内部の構造を改善していく作業を指します。 Martin Fowler (2014). 『リファクタリング第2版』 ✤ 初版は1999年(日本語版は2000年) ✤ 第2版が2018年に出ている 15
16. ソフトウェアの振る舞いと構造 IDEA FEATURE STRUCTURE 『Keynote: Tidy First? A Daily Exercise in Empirical Design - Kent Beck - NDC Porto 2024』の動画より 16
17. 「ソフトウェア設計」とは ✤ 整頓はソフトウェア設計である ✤ 本書では個人の範囲のソフトウェア設計 ✤ ソフトウェアの構造を変更すること ✤ ソフトウェア設計を大げさにしない ✤ 「ソフトウェア設計を開発の一部にする」 ✤ ソフトウェア設計の価値は、ソフトウェア設計が価値を生み出したときに生まれる ✤ 時間と共にわかってくる 17
18. Tidy First?の?が重要 ✤ ソフトウェア設計の議論では「何を」「どのように」が話題の中心で、「いつ」「どのぐ らい」が抜けているのではないか ✤ 整頓できるからといってやるべきかどうかは判断が必要 ✤ どのタイミングでどれだけ整頓するのかを判断できるようになってほしい ✤ 最初からできるわけではないので小さいところから訓練すること ✤ やる or やらない or いつやるのか?(第21章) 18
19. 『個人で実践する経験主義的ソフトウェア設計』 ✤ 英語は「A Personal Exercise in Empirical Software Design」 ✤ 理論や純粋な論理よりも、観察や経験にもとづく ✤ 整頓しながら構造が見えてきたり、別の整頓が必要だとわかったり、新しい学びが あったりする ✤ 小さく安全に繰り返すことで整頓がよりうまくなる ✤ 経験的ソフトウェア設計における「いつ?」への回答は「時と場合による」 19
20. 本書の構成 タイトル 内容 章 整頓 整頓の事例 1〜15章 第2部 管理術 整頓の開発ワークフローへの組 み込み方 16〜21章 第3部 理論 なぜ整頓するのか? 22〜32章 第1部 ✤ 後半にかけて難しくなる。 しかし、面白い部分でもある ✤ 何度も読み返すのがオススス 20
21. 今日のゴール ✤ いつ整頓するのか?の判断基準を学ぶ ✤ 第3部(特に23-27章)を理解する ✤ なぜ整頓するのか?なぜ私たちは構造に投資するのか?への回答のヒントを得る 21
22. いつ整頓するか? 振る舞いの変更をするにあたって、 整頓の余地があるコードを発見した やらない 整頓する? 振る舞いの変更のみ (Never) やる いつや るか? 先に整頓する (Before) あとに整頓する (After) 改めて整頓する (Later) 22
23. 大まかな時間軸のイメージ 先に整頓する (Before) あとに整頓する (After) 改めて整頓する (Later) 振る舞いの変更時 • 先に整頓する(Before)...振る舞いの変更より前(直前でもない) • あとに整頓する(After)...振る舞いの変更より後(直後に近い) • 改めて整頓する(Later)...振る舞いの変更より後のどこか(直後ではない) すべては状況による 23
24. 整頓しないとき(Never) ✤ コードの振る舞いをこの先絶対に、二度と変更しない ✤ 実際にはそういうことはほとんどない ✤ ただし、もう改修が全くされない場合は合理的な選択 24
25. 改めて整頓するとき(Later) ✤ 変更箇所が多くなるが、少しずつ整頓できるような場合 ✤ 例えば、古いAPIから新しいAPIへの移行 ✤ 後日整頓することで新しい構造がよりよくなりそうなとき ✤ 注意:「いつか」やると言ってやらないわけではない。必ず整頓する ✤ 「お楽しみリスト」を作って、後日そこから選ぶ 25
26. あとに整頓するとき(After) ✤ 一旦、振る舞いの変更をしたあとで、整頓が必要だと気づく ✤ この先、同じ領域の振る舞いを変更する可能性が高いとき ✤ 将来、振る舞いを変更するときの整頓のコストが増えそうなとき ✤ 今の文脈を忘れてしまっている ✤ 他の変更によって整頓が邪魔される ✤ 振る舞いの変更と整頓のコストがほぼ同じとき ✤ 振る舞いの変更に1時間かかり、整頓が1時間ぐらいならOK ✤ もし1週間かかってしまうようなら「お楽しみリスト」行きにする 26
27. 先に整頓するとき(Before) ✤ 整頓することで、振る舞いの変更が簡単になるとき ✤ 整頓することで、コードの理解しやすくなる ✤ 整頓の仕方がわかっているとき ✤ 整頓による効果が長く続くとき ✤ 将来、1度しかそのコードを変更しないなら整頓を制限する 27
28. いつ整頓するか? ✤ 整頓しない(Never) ✤ コードを二度と変更しない ✤ 改めて整頓する(Later) ✤ すぐに見返りがない大きなかたまり ✤ 整頓をすることで最終的には見返りがある ✤ 小出しに整頓できる ✤ あとに整頓する(After) ✤ 将来の整頓まで待つと整頓のコストが増大する ✤ やりきった感が得られない ✤ 先に整頓する(Before)→この選択肢に偏る ✤ すぐに見返りがある ✤ 整頓の仕方がわかっている 28
29. ソフトウェアの価値 ✤ ソフトウェアが価値を生み出す方法は2つ ✤ ①今日ソフトウェアが行うこと = 振る舞い ✤ 振る舞いの変更はお金を生む ✤ ②明日ソフトウェアに行わせることができそうな新しいこと = 構造 ✤ 構造の変更は将来的な振る舞いの変更への投資 ✤ ソフトウェア設計はこの2つのバランスを取らなければいけない 29
30. ソフトウェアの経済的価値 ✤ 振る舞いの変更を先に行うのは「先に稼いで、あとで使う」 ✤ お金の時間価値 ✤ ディスカウントキャッシュフローの考え方 ✤ 整頓を先に行うのは「先に使って、あとで稼ぐ」 ✤ ソフトウェアのオプション価値 ✤ オプショナリティの考え方 30
31. お金の時間価値 ✤ 明日の1ドルより今日の1ドルのほうが価値が高いことを前提としいる ✤ 先に貰えば投資したり、手に入らないリスクもない ✤ 将来もらう予定の1ドルの現在価値は、1ドルより少ない額になる(割り引かれ る) ✤ 例えば、3ヶ月後に決済される手形を今現金化すると、額面より安くなる ✤ 現在の価値を考慮するときは、将来手に入る金額を割引いた金額で評価する ✤ この考え方を投資判断に適用したのがディスカウントキャッシュフロー(DCF) 31
32. ディスカウントキャッシュフロー ✤ ディスカウントキャッシュフロー(DCF)は将来のキャッシュフローを現在価値に換算 する手法 ✤ ディスカウントキャッシュフロー(DCF)の合計額から初期投資額を差し引いた値が正 味現在価値(NPV: Net Present Value) CF 割引 CF CF 現在 1年後 割引 割引 CF 2年後 3年後 32
33. ディスカウントキャッシュフロー ✤ 例)初期投資1000万円のプロジェクトで、回収期間を3年。1年後に400万円、2年後 に500万円、3年後に600万円の利益が出ると見込んだ場合 ✤ 割引率を10%とする CF 計算 割引後 1年後 400万円 400/1.1 363万円 2年後 500万円 500/(1.1×1.1) 413万円 3年後 600万円 600/(1.1×1.1×1.1) 450万円 合計 1226万円 正味現在価値(NPV)=1226 - 1000=226万円 正味現在価値がプラスなので投資の価値があると判断できる 33
34. お金の時間価値を考えると… ✤ お金の時間価値が推奨するのは、先に整頓するよりもあとに整頓する ✤ お金を生む振る舞いの変更を今すぐ実装して、あとから整頓する ✤ すぐにお金が手に入り、あとでお金を使う 34
35. オプション取引 ✤ オプションとは「特定の原資産をあらかじめ定められた価格で、一定の期間内で売 買する権利」のこと ✤ 4種類の取引パターンがある ✤ 買う権利(コール・オプション)の売り/買い(本書ではコールオプションの買い) ✤ 売る権利(プット・オプション)の売り/買い ✤ 義務ではないので、権利を行使しないこともできる 35
36. オプション取引 ✤ 原資産:その権利行使の対象になる資産のこと ✤ 株式、為替、債券、これらの指数、先物など ✤ 満期日:権利を行使できる期日 ✤ 行使価格:権利を行使し、売買する価格 ✤ プレミアム:権利料(≠原資産の価格や行使価格) ✤ 原資産の価格が将来大きく動くかもしれないことに対して払う期待料 ✤ 大きく上がる、下がるという期待値が高ければプレミアムも高くなる 36
37. オプション取引の例(コールの買い) ✤ 例)Aくんが企業Cの株式を購入する場合 ✤ 現在の市場価格は1株1000円、行使価格は1株1000円 ✤ 権利料は1株50円 権利料(プレミアム) 1株1200円になった 1ヶ月後 権利 Aくん 権利の買い手 Bさん 権利の売り手 1株800円になった × 権利行使しない 37
38. オプションの価値 ✤ オプションの価値 = (本質的価値) + (時間的価値) ✤ 本質的価値:オプションをいま行使した場合の価値 ✤ 時間的価値:オプションの価値から本質的価値を除いた部分 ✤ 時間的価値のことをオプショナリティという ✤ 時間的価値の特徴 ✤ ①満期が近づくと減少する ✤ 市場価格が動く量が少なくなる ✤ ②価格変動(ボラティリティ)が高いほど時間的価値も大きくなる ✤ 有利な状態になる可能性が高まる 38
39. 時間的価値の減少 オプションの 時間的価値 オプションの 満期日 時間 最初はゆっくり減少していき、満期の直前になると急激に減少する 39
40. オプション取引(コールオプション)の要素 パラメータ 『Tidy First?』の26章の例 ソフトウェア 原資産 じゃがいも1個 将来の振る舞いの変更 原資産の価格 (変動性も含む) 現在1ドルより少し少ない金額 (お金の時間価値を想定) 将来の振る舞いの変更から得られる価値 (大きく変動するほどよい) 行使価格 1ドル 将来の振る舞いの変更にかかるコスト プレミアム 行使しない場合に原資産を別で使える 場合は安い金額 今日の設計(=整頓) 1日 将来の変更を実行できる期限 (長ければ長いほどよい) 残存期間 期日の行動 ピクニックに行かない場合はオプションを 振る舞いの変更の価値が低くなった場合は 行使しない オプションを行使しない 40
41. ソフトウェア設計におけるオプション ✤ ソフトウェア設計が「振る舞いの変更のオプション」を持つ ✤ ソフトウェア設計が柔軟であるほど、変更の意思決定を後回しにできる ✤ 変更がすぐ行えるのなら、今決めなくても最適なタイミングで決定できる ✤ これにより、変更の「オプション価値」が高まり、不要なリスクを減らせる ✤ 価値予測の不確実性が高いほど、オプションの価値は高くなる ✤ ソフトウェア設計(整頓)により変更のための行使コストを下げる ✤ つまり、適切な設計をすることで、変更を後回しにしながらも、必要なときにすぐ対応でき る状態を作れる ✤ オプション取引における「安いプレミアムで高価値なオプションを持つ」戦略 41
42. 金融市場のオプション取引との違い ✤ 金融市場のオプション取引では、市場動向によって決まる要素が多い ✤ 市場が決めるもの:原資産価格、変動性(行使時点での市場価格) ✤ 自分で決められるもの:行使価格、満期までの期間(固定) ✤ しかし、ソフトウェアの場合はほとんどの要素がコントロール可能 ✤ 特に時間的価値を積極的にコントロールすることで、「価値が最大化されるタイミングで実行」する ✤ すぐに実行したいので、小さいコストですぐに実行できることが重要 ✤ さらに、どの変更に価値があるかわからない状態では、選択肢が多いほうがよい ✤ 選択肢があること自体にも価値がある ✤ 設計によって時間的価値(オプショナリティ)を維持したり、作り出すことができる ✤ 逆に下げることもできる 42
43. このように考えるとわかりやすいかもしれない ✤ オプションを「判断を先延ばしにする権利を買う」とする ✤ プレミアム:整頓 ✤ 例えば、ある振る舞いの変更が3ヶ月かかるとする。整頓することで1ヶ月にで きたとしたなら、判断を2ヶ月先延ばしにするオプションを整頓というプレミア ムで手に入れたことになる 43
44. オプション vs キャッシュフロー ✤ ディスカウントキャッシュフローの観点 ✤ より早く確実にお金を稼ぎ、あとでお金を使う ✤ 先に整頓しない ✤ あとに整頓するのも、改めて整頓するのもしない方がよいかもしれない ✤ オプションの観点 ✤ 今お金を使って、あとでお金を稼ぐ ✤ 先に整頓する。もしくは、あとに整頓しても、改めて整頓してもよい ✤ この2つは経済的な綱引き 44
45. 先に整頓するか? ✤ cost(整頓) + cost(整頓のあとに振る舞いを変更) < cost(整頓せずに振る舞いを 変更) ✤ 先に整頓する ✤ cost(整頓) +cost(整頓のあとに振る舞いを変更) > cost(整頓せずに振る舞いを 変更) ✤ 他の振る舞いの変更が整頓から恩恵を受けるときは合理的かも ✤ 「セルフケアとしての整頓」は少し正当化される(数分〜1時間程度のため) ✤ ただし、経済的なインセンティブには逆行していることを理解する ✤ つまり、「先に整頓するか?」という問いへの回答は、多くの場合イエスとなる 45
46. PR 株式会社アトラクタ ✤ 社名:株式会社アトラクタAttractorInc. ✤ https://www.attractor.co.jp/ ✤ 開発プロセスに関するコンサルティングやトレーニングを提供 ✤ アジャイルコーチング:貴社のアジャイルチームの伴奏支援をいたします ✤ 技術顧問:組織全体に対してさまざまなテーマでアドバイスいたします ✤ 認定トレーニング:認定スクラムマスターを始めとした各種認定トレーニングを提供して います。所定 の人数が集まる場合は1社向けのプライベート開催も可能です ✤ 集合研修:1社向けにスクラム研修やマネージャー向けアジャイル研修を提供していま す ✤ 初回相談無料。詳しくはお気軽にお問い合わせください 46

Comment

No comments...