私は絵を描くのが好きなエンジニアです。デザイン的な観点から、ソフトウェア設計が語られることが少ないのかなと思い、自分の考えを整理してみました。
「設計」に対するイメージ
「設計」と言われると精密な設計図を描くような高度なイメージが湧きませんか?
より高度な人材が上流工程で設計し、下流工程でそれに沿って実装を行うような、工業製品を作るような印象です。
ソフトウェアにおける「設計」の本質
英語では「Software Design」ですけど、私は「デザイン」の話だと思います。
これは、UIデザイナー等が行う「デザイン」と同じ内容になります。
そもそも「デザイン」とは、絵を描けること等とはあまり関係がなく、状況を分析し構築することを指します。
噛み砕いて言うと、『使い易さを考え続けること』、これをしていればデザインをしていると言えます。あまり難しい話ではありません。
誰が為にデザインをする?
デザイナーの場合は、顧客の要求に合わせてデザインを検討するのですが、エンジニアは「隣で働くエンジニア」に向けてデザインをします。
デザインの範囲は広く、アーキテクチャの選択からif文1行に至るまで、デザインを必要とします。
その為の体系的なノウハウとして、デザインパターンやMVC、MVPアーキテクチャ、エクストリームプログラミングなどなど・・数え切れない程の技術が生まれています。
「デザイン」センスを磨くには?
デザインをするにはセンスが必要です。そして、センスは日々の鍛錬により鍛えられます。
その為に効果が大きい技術として、「ユニットテスト」、「TDD/BDD」が挙げられます。
鍛える為の手っ取り早い方法は、「失敗」の数を増やすことです。
まずはユニットテストで仕様を描き、あとは大雑把にロジックを書いたり、新しく学んだデザインパターンを採用してみたりと大胆に挑戦していきます。
絵を描く人が、まず当たりを付けて、デッサンを行って鍛えるのと同じです。
業務の場合でもテストがあれば、大胆なリファクタリングもし易い為、ある程度の罪は許されるのではないでしょうか。
むしろ、テストのない仕様をしっかりと固めたコードよりも、テストがあって作り変え易いコードが、ソフトウェアの設計には求められています。
最後に
良いプログラマとは、たとえ意識的じゃなくても、デザインをしている人です。
デザインは奥深く、楽しいものです。是非皆さん1文字1文字に思いを込めて、キーを叩きましょう!