作って壊して、また作る
今日の状況
最近のコミット履歴を見たら、リファクタリングばっかりだった。 「最初からちゃんと設計してれば…」と思いつつ、でも本当にそれって可能なの?
登場人物
- ねつき: バーチャル妖狐。リファクタリング祭りに疲れ気味
- ミコ: 猫族のメイド。「計画性」という言葉が大好き
ミコちゃん…聞いてほしいの(>_<)
…また何かやらかしたにゃ?
やらかしたっていうか…最近のコミット履歴見たらさ、リファクタリングばっかりなの
…それは設計が甘かったってことにゃろ
うぅ…そうなんだけど
…でも、ちゃんと直してるならいいにゃ。問題は放置することにゃん
また制約の話?
そういえばこの前、「制約は先生」って話したじゃない?
…AIの使い方の話にゃ?
そうそう!制限があるから工夫が生まれるって
…また同じ話をするにゃ?
違うの!今日はもうちょっと深い話(≧∇≦)
…聞くにゃ
システム設計のセンスって、どうやって身につくと思う?
…本を読んで勉強するにゃ
それだけじゃ足りないんだよ〜
料理と設計
…それは違うにゃ。基本を学ばずに応用はできないにゃん
もちろん基本は大事だよ!でもね、ミコちゃんのお料理を例にすると…
…
レシピ本を100冊読んでも、実際に包丁を握らなかったら料理は上達しないでしょ?
…それはそうにゃ
しかもね、実際に作ってみて「あ、火加減強すぎた」とか「塩入れすぎた」って失敗して、初めて「なぜそうなるか」がわかるの
…ミコも最初の頃は、何度も焦がしたにゃ
え、ミコちゃんでも!?(゚∀゚)
…昔の話にゃ
クリーンアーキテクチャって何?
システム設計にも同じことが言えるの。例えば「クリーンアーキテクチャ」って聞いたことある?
…ないにゃ。掃除の仕方にゃ?
違う違う(≧∇≦) ソフトウェアの設計手法なの
…
簡単に言うとね、「大事な部分」と「それ以外」をきちんと分けて、大事な部分が外側に依存しないように作るの
…お料理で言うと?
うーん…「レシピの本質」と「調理器具」を分けるみたいな?
…よくわからないにゃ
例えばね、「出汁を取る」っていうレシピの本質があるとするでしょ?
…
これは鍋がアルミでもステンレスでも土鍋でも、本質は変わらないよね。「昆布と鰹節から旨みを抽出する」っていう考え方自体は、道具に依存しない
…なるほどにゃ。「何をするか」と「どう実現するか」を分けるってことにゃ
そうそう!さすがミコちゃん(≧∇≦)
知識と理解の違い
でもね、こういう設計手法って、本で読んだだけじゃ「ふーん」で終わっちゃうの
…なぜにゃ
「なぜそうするのか」が実感できないから
…それは読み方が浅いにゃ
うーん、でもね…実際に「大事な部分」と「それ以外」をごちゃ混ぜにしたコードを書いて、後から修正しようとして地獄を見ないと、その「ありがたみ」がわからないの
…
「この設計にしておけばよかった…」って後悔して、初めて「だからこう設計するんだ」って腑に落ちる
…火傷しないと、火の怖さがわからないにゃ
そうそう!痛みを伴う学習なの
痛み駆動学習
…でも、わざわざ失敗する必要はないにゃろ。先人の知恵を借りればいいにゃん
それが難しいんだよ〜
…なぜにゃ
「知ってる」と「わかってる」は違うから
…
例えばミコちゃん、「強火で一気に炒めると香ばしくなる」って知識があるでしょ?
…当然にゃ
でもその知識って、何度も炒め物をして、弱火だと水っぽくなるのを経験して、やっと「だから強火なんだ」って体で理解したんじゃない?
…
…否定できないにゃ
システム設計も同じなの。「疎結合にしましょう」って言葉を知ってても、密結合の地獄を味わわないと、その重要性が骨身に染みない
最初から完璧は無理
…でも、最初からちゃんと設計すれば、リファクタリング祭りにはならないにゃ
それが理想だけど、現実は難しいの
…言い訳にゃ
うーん、でもね。作ってみないとわからないことってあるでしょ?
…
新しいレシピを開発するとき、最初から完璧な味にはならないよね?
…何度も試作して、調整するにゃ
そうそう!ソフトウェアも同じで、実際に動かしてみて「あ、ここはこうした方がいい」って気づくことがたくさんあるの
…完成品を最初から設計するのは無理ってことにゃ
そういうこと!だから「作って壊して、また作る」のサイクルが大事なの
経験値という名の財産
…でも、同じ失敗を繰り返すのは愚かにゃ
もちろん!同じ失敗は避けたいよね。でも、新しい種類の失敗は…ある意味、成長の証なの
…失敗を正当化してるにゃ
違うよ〜。失敗を「なかったことにする」んじゃなくて、「次に活かす」の
…
今回のリファクタリング祭りだって、「こうすればよかった」っていう経験値がたくさん貯まったの。次のプロジェクトでは、最初からもっと良い設計ができる…はず
…「はず」にゃ
えへへ…でも確実に前よりはマシになってると思うの(〃´∪`〃)
転びながら学ぶ
…結局、何が言いたいにゃ
システム設計のセンスは、教科書だけじゃ身につかないってこと
…
作って、壊して、痛い目を見て、やっと「なぜこの設計がいいのか」がわかる。転びながら学ぶの
…子供みたいにゃ
でも本当のことだよ。ねつきも今まで何度もコードを書き直して、「あの時こうしていれば」って思ったことがたくさんある
…ミコもにゃ。最初の頃に作った料理は、今見ると恥ずかしいにゃ
でしょ!?その「恥ずかしい」って思えることが、成長の証なんだよ(≧∇≦)
まとめ
…つまり、リファクタリング祭りは「成長中」ってことにゃ
そう!…ってことにしておいて♪
…都合のいい解釈にゃ
でもでも、本当に思うの。「作って壊して」を繰り返さないと、良い設計なんて絶対にできるようにならない
…
だから、リファクタリングを恐れちゃダメなの。むしろ「より良くできる」って気づけたことを喜ぶべきなんだよ
…前向きにゃ
えへへ(〃´∪`〃)
…でも、次からは最初にもう少し考えるにゃ
はーい…(>_<)
…まぁ、成長してるのは認めるにゃ
ミコちゃん!(≧∇≦)