∑考=人

そして今日も考える。

1人システム開発に設計はいるのだろうか

また簡単な3階層Webシステムを作り始めた。ほとんど以前作ったものとロジック自体は変わらないものにするつもりだが、今回は少し設計段階に時間を費やした。まだ設計で何を決めるべきなのか、どこまで具体化するのか、ほとんどわかっていないができる範囲で、データベースモデルや画面なんかを初めに定義した。

 

今までプログラムを書く時にまず設計をするということはほとんどなかった。そもそも学生レベルでは設計のやり方なんて体系的には学ばないからやりようもない。とは言え、いきなりコーディングを初めてしまうと、どうしてもコードの重複が起こったりして無駄が多くなる。例えば後半になって、変数名をxからyに変えようと思ったら、全部のソースファイルをグレップして書き換えるなんて面倒くさい作業が必要になる。

 

もちろん、現状のファイルとの整合性を保ちながらいかに改善していくのかを考えるのもそれなりに面白い作業ではあるが、生産性は落ちる。地道な作業量が増えるという意味ではモチベーションも下がってしまう。

 

一方で、ちゃんと設計手順を踏むとコード量はやはり圧倒的に少なくなったように思う。こんな機能を実現したい(要件定義)というところから始まり、じゃあこういう画面が必要だ(画面定義)とか、こういう情報を一元で管理したい(データベース)とかを徐々に掘り下げていく。

 

それらをさらに具体化すると、この画面にはこういうボタンが必要だとか、このボタンを押したときにどういう処理が実行される必要があるのかというところまで見えてくる。この時、全体像が見えていると、この処理ロジックはあの処理ロジックとほとんど同じだから一つのモジュール(関数)にまとめられるとか、そういうことがわかるので、無駄を省くことができるのだ。

 

とは言え、効率化され保守性が高い一方で、ソースファイス間のインターフェースは複雑になる。要するにシステムを作る難易度がちょっと上がる。単一のプログラムで全ての処理を動かす場合とは異なり、デバッグに時間がかかるのだ。

 

特に、オブジェクト指向言語なんかの場合は、セオリーとしては、クラスファイルのデバッグのために、テストドライバみたいな別のファイルが必要になる。ソースファイルが細分化されているほど保守性は高いが、試験のために必要なファイルが増加することになる。私はこれが面倒(というかつまらない)なので、基本的にある程度結合した形でデバッグをする。

 

これがまぁしかし上手くいかない。ちゃんと動作するかわからないコードを書いている上に、モジュールの呼び出し方も理解していないから当たり前なのだが。昨日なんか大ハマりで、一つの機能のデバッグにほぼ丸一日かかった。お陰で凄く勉強にはなったけど。

 

こうやって試験も含めて考えると、設計を入念にしてファイルを細分化したところで、返って時間が増えてしまうのではないかという懸念がある。(もちろんテストドライバを作っていればもう少し早く終わったのかもしれないが。)

 

チームでシステムを開発する上では、できるだけファイルを細かくしたほうが良い。それだけ分業して進めることができるからだ。ただ、1人で開発するなら、そんなに粒度の細かいモジュールにするメリットは少ないのかもしれない。