hitode909の日記

以前はプログラミング日記でしたが、今は子育て日記です

作り直し

ソフトウェアを作ってて、作り直したり、書き直したりするべきかどうかという話をすることがある。
大きな規模だと、ソフトウェアを作り直す、というところから、小さな規模だと、込み入った機能を書き直す、くらいまであるけど、作り直すとうまくいくのは、次の二つのうちどちらかではないか。

最初に作ったときより世の中の技術が発展したとき

昔のコンピュータでは収まらなかったとか、昔は良いライブラリがなかったけど、今はある、というとき。
単に今ありふれた技術で作り直すと、よいものができそう。
最初に作ったときよりはコンピュータのスペックが上がったので、そのつもりで、並列度倍に上げても止まらないし、より速く動かせる、とか。
昔はバッチで計算しないといけなかったけど、今ならリアルタイムに返せる、とか。
昔は依存管理のよいライブラリがなかったけど、今ならこれ入れたら簡単、とか。

最初に作ったときより人間の技術が発展したとき

昔作ったときは知らなかったことを学んで、今作ると、こういう技術に基づいて議論や設計、実装できるので、よりよいものができる、というとき。
昔はぐにゃぐにゃのクラスを作ってたけど、今ならそのドメインについては理解が深まったので、より合理的で堅牢なクラスを作れる、とか。
最初はなんとなく書いてたけど、いろいろ作ってるうちに、ソフトウェア作るのがうまくなって、使える理論や、パターンがわかってきた、とか。
この二つのうちどちらかではないか。

なんでも書き直せばよくなるというものではない

コードがいまいちなのは分かるとして、書き直せばよくなるとしたら、どういう観点でどこがどうよくなるのか明らかになってから書き直さないと、好みの違いくらいに留まって、よいものはできない。
コーディング規約に沿ってない、とか、リーダブルでない、とかなら、単純に直せるけど、それを超えたソフトウェアのアーキテクチャの話になると、前よりよくなる根拠がないのに書き直しても、よいものにはならない。

なんでこんな話をしているのか

こないだソフトウェア開発について発表したところ、いろんな質問が来て、懇親会とかでいろいろしゃべってた。
けど、なんかしゃべっても、汎用的な知識というものでもないので、自分で決められるくらいあれこれ勉強して、絶対こっちのほうがいい、ということが分かって、そっちに変えられるようになるのを待つしかないな、ということを思ってた。
前者の、世の中がだんだんよくなるのは待ってられない。後者は自分でやらないとあんまりよくならないので、自分でやらないといけない。
スターターキットとして、エリック・エヴァンスのドメイン駆動設計と、実践ドメイン駆動設計を読むと、手っ取り早いと思う。
実践できれば、ふだん会話してるだけで、言葉が研ぎ澄まされていって、そこからコードにフィードバックできて、より研ぎ澄まされた会話が生まれて、俺たちがドメインモデルだみたいな雰囲気になっていく。
うちのチームでは今日ついにディレクターも実践ドメイン駆動設計を購入していて、普通に実践しようという感じになりつつある。
バイトの人がコード書いてて、この命名でいいんだろうか、とか言ってて、実践ドメイン駆動設計2章によるとこういう話なので、よいと思います、とかそういう会話をしてる。
実践的なコード例はともかく、最初のコンセプチュアルな章だけとか、カウボーイの声だけでも、全員が読んでると全員でよい会話できてよさそう。
僕に質問するよりは本読むほうが役立ちそうなので、ソフトウェア開発に関する質問に対する回答としては、回答が分かるまでは本を読むとよい、ということになりそう。

エリック・エヴァンスのドメイン駆動設計

エリック・エヴァンスのドメイン駆動設計


実践ドメイン駆動設計 (Object Oriented Selection)

実践ドメイン駆動設計 (Object Oriented Selection)