勘と経験と読経

略すとKKD。ソフトウェア開発やITプロジェクトマネジメントに関するあれこれ。

ソフトウェア設計にプログラミング経験は必要か、あるいは再びログハウスの例え

ソフトウェア設計にプログラミング経験は必要か。私なりの結論は「ある部分についてはプログラミング経験(というか完成までの全工程の経験)があったほうがいいけれども、全部ではない」だ。オーダーメードのソフトウェアを作ろうとした場合、無限とも言える選択と意思決定が可能となる。選択肢の範囲が広い部分と、狭い部分では必要なスキルも違うのではないだろうか。

本記事は、以下のブログエントリを参考に書いたもの。

以前に書いたログハウスの例えはこちら

ログハウスの例え、ふたたび

一部省略しているけれども、以前こんなふうに書いた

  • オーダーメイドのソフトウェアは、例えるならログハウスを作ろうとしているようなもの
  • 対象としているビジネス領域が「土地」であって、その中にログハウスというシステムを建てる。システムとビジネス領域はイコールではない
  • 土台の上に、手組みでログハウスを建てていく。手順があるので人を多くしても建てる早さには限界がある
  • サッシやドアノブなどのレベルは汎用的な部品を使うけれど、あとは人手で仕上げた一品モノの材料で建てる
  • 手組みなので作業途中である程度は失敗するが、失敗を是正しながら建てていく。失敗することも考慮に入れて作業を行う
  • お客様と打合せたのこだわりのポイント以外は、過去の事例や技術的な判断で開発側で都度決めてつくっていく。完全な設計を行おうとすると、一棟建てるくらいの時間と金が設計だけに必要になってしまう
  • 完全設計が出来ないのと同じ理由で、正確な見積りもできない
  • 完全設計が出来ないのと同じ理由で、共通部品を先に作って工期短縮するのもかなり難しい
  • 内装や外構の変更は簡単だけど、建物部分の変更は難しい場合もある。ドアの場所を変えるとなると、相当な部分を捨ててやり直す必要がある

ログハウスの例えとソフトウェアの特性と - 勘と経験と読経

このログハウスの例えに基づいて、設計というものについてもう少し考えてみる

  • わかりやすく考えるために、プログラム経験のない人は、ログハウスを建てたことのないシロートと呼ぶ。同様に、プログラム経験がある人を職人さんと呼ぶ
    • 冒頭でも書いたけれども、プログラム経験の有無というよりソフトウェアを完成させるトータルのプロセスの経験有無だと思う
  • シロートが全体設計(グランドデザイン)を行うと、かなりの確率でログハウスを建てるプロジェクトは失敗する
    • 構造的に建たないかもしれないし、建ったとしても例えばドアのない部屋が出来たり、日当たりがまったくないとか住むに耐えないものになる
    • シロートさんが考える「こだわりのポイント」と、ログハウスを建てる際に考えなければいけない「重要なポイント」はおそらく違う。住むことと建てることは違う
  • 職人さんが細部まで全てを設計すると素晴らしいログハウスの設計書が手に入るが、倍ほどの金と時間がかかる。
    • そもそも完全設計することが自体が高くつく(前述のログハウスの例え参照)
    • 職人さんそのものも、おそらく希少で高給だ。そして優秀な職人さんだからといって人間なので、設計するのには時間がかかる。シロートさんの100倍の速さで設計ができるわけではない

結局はグランドデザインと、「重要で難しいポイント」だけは職人さんが設計すべきで、それ以外の部分の設計は違う人が担当する。もしくは設計しないでDIYで作るというのが合理的なのだと考えている。

難しいのは、「重要で難しいポイント」はどこなのかという判断だろう。「重要で難しいポイント」は一般的にアーキテクチャと呼ばれる部分になるのだと思うのだけれども、この言葉自体が非常に曖昧でとらえにくいのが問題をややこしくしている。

基本的には適材適所

ソフトウェア設計には「仕様の設計」と「ソースコードの設計」があります。

「仕様の設計」は、ソフトウェアを作りたいと思う人(プロダクトオーナー)には、必ずしもプログラミングのスキルは必須ではないですが、そのソフトウェアのプログラミングを行うプログラマが一緒に入って設計しなければ、良い設計は出来ないでしょう。

ソースコードの設計」は、間違いなくプログラミングのスキルは必要になります。そもそも現代のプログラミングにおいて、ソースコードの設計とコーディングは不可分であり、それがもし分かれているとしたら、相当に非効率なことが起きているはずです。

これから先は「仕様を設計する」ことだけをする人の仕事はなくなるでしょう。
そして「ソースコードを設計する」ことだけしか出来ない人も生き残れません。
ソフトウェア設計とは何か 〜 設計にはプログラミング経験が必要か否か | Social Change!

倉貫さんのブログにはこう書いてあるけれども、要は適材適所だということだと思う。

  • プロダクトオーナー(PO)が考えたほうが合理的な領域(他の人には決められない部分やこだわりのポイント)は、POが設計すべき
    • ただし「業務仕様」の全領域がこれに該当するというわけではない。業界の一般的知識で決められるようなことならPO以外が設計しても良いだろう。
  • ソースコードの設計」についても、アーキテクチャ(意図的にぼやかした表現)で検討の範囲が十分に狭められているのであれば、プログラミング経験が無い人間が設計しても問題ない
    • 経験があったほうが良いだろうけど、必須の要件ではない。むしろコストや効率の観点で判断すればいいと思う

イノベーションのジレンマ

最近デザイン思考の本を読んだりしている影響かもしれないけれども、適材適所を進める弊害への注意も必要だと思う。「全部わかっている」人が全体を設計するのは堅実だけれども、斬新な発想やイノベーションを阻害する要因にもなりうる。このあたりについてはまた考えようと思っている。