...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

「ソフトウェアの仕様書は料理のレシピに似ている」を読んで

「ソフトウェアの仕様書は料理のレシピに似ている」

某奥村先生のブログ経由で,こんなエントリを見つけた.ちょっとショックなことを言うかもしれないが,ソフトウェアを作る仕事をするつもりがある人にはぜひ読んでもらいたい.

リンク先のエントリの記述順序とは前後するが,まずはこれから言いたい.

そしてもっとも許せないのが、そういった上流→下流という階層構造でプログラムを作る工程そのものだ。

現場のエンジニアの間ではもう当たり前のこととして考えられているが,日本のソフトウェア業界には未だに直らない有名な悪癖がある.それは,上流工程と下流工程を行う人間が,あるいは組織自体が,異なっていることだ.業界の人間ではないので詳しいことは分からないが,まともにプログラミングをやってない人間がソフトウェアを設計するところもあるとか.高々1万行程度のプログラムさえ書いた経験を持たないシステムエンジニアにまともなソフトウェアの設計ができるとは到底思えない.プログラムというものは,小規模のものとそうでないものとでは,その性質がまったく異なるからだ.

しかし,最初から完璧な設計を行うことはとても難しいことなので,挑戦するのは諦めたほうがいい.ただ,つまらない設計を改めずに書かれたプログラムの複雑さは,指数的に増大していく.これを緩和するためには,歪んだ設計に基づいた実装を苦労して行うのではなく,よりエレガントな実装を実現できるように設計を変化させていかなければらない.それによって徐々に複雑な構造から無駄が取り去られ,より引き締まったシンプルなものすることができる.

「彼らは下流のエンジニアで、詳細仕様書に従った通りのプログラムを書くだけの簡単な仕事をしているから給料が安い」という説明を聞いたことがあるが、それにも全く賛成できない。私はこの業界で多くのエンジニアも使ってきたが、優秀なエンジニアとそうでないエンジニアの生産性は(誇張抜きで)20対1ぐらいである。

本当に20対1というのは誇張ではないと思う.プログラミングは,キーボードを叩いているからといって事務的な作業ではまったくなく,とても創造的な作業だ.操作マニュアル片手にその通りやれば誰でもできるような代物ではないのだ.先に述べたように,実装を設計にフィードバックすることは重要だが,それは確かに手戻りでもあるだろう.しかし,それなりに経験を積んだエンジニアであれば,設計の段階で実装の詳細までイメージし,後に問題になりそうなことに気づくことができ,小さな変更ですむ設計を最初から行うことができる(まったく変更しないですむわけではない).ただ,そういう怪しいにおいを嗅ぎ取れるようになるには,それこそ日々の研鑽が物を言う.そういう意味でプログラマは職人だし,職人でなくてはならない.エンジニアとして幸せになるためには,守ればよい手順として示されはしない,センスや直感というものの会得が必要だ.

日々の情報収集によって得られる技術ももちろんある.例えば,既に常識レベルであるが, scanf strcat などのC言語の入門書で必ず出てくる基本的な関数の多くは,セキュアでないため使ってはいけないことを知っているだろうか(参考: バッファ オーバーランを解消せよ!)? こういう知識を持たないエンジニアが実装することによってどれほど大きな問題を引き起こすか,ニュースを見ていればよくわかるだろう.

ソフトイーサ株式会社の登さん(同社の会長に就任したらしい・・・まだ大学3回生なのに・・・すげぇな)が日経ソフトウェアで,本当のプログラマは仕事でプログラムを書いていなくてもいいんだと,仕事で書いている人はたまたまそれが仕事なだけだと,趣味で書いている人の方がよいコードを書くことがある,と語っていた.実際その通りなんだろうけど,そのままでいいとは思わない.日本のソフトウェア業界から世界に旅立ったソフトウェアがほとんど存在しないのは,多くのソフトウェアエンジニアの志が低すぎるのか,まっとうできる環境が作られていないのか.無理な納期設定,ソフトウェアテストの欠落,過剰な残業による疲弊と入院.これが本当に最先端技術者なのか疑問になる.IT業界への就職を避ける人がちらほらいるらしいが,そういうパターンが出てくるのもうなずける.

ソフトウェア業界に限った話ではないが,日本では下流エンジニアの地位は極端に低い.20の能力を持ったエンジニアに対して,1の能力しか持たないエンジニアと比較して(20倍払えとは言わないが)相応の対価が支払われているだろうか? 後者のエンジニアにすれば同じ対価をもらえる環境は素晴らしいだろうが,これからはインドやその他の国に外注することが増えて国内の仕事はさらに減る傾向にあるから,代わりがきく人間で満足していたら職を失うかもしれない.これからのソフトウェア開発技術者は,「納期までに動いているように見えればいいプログラミング」ではなく,「一応動くプログラミング」でもなく,「設計も実装もエレガントなプログラミング」を目指そう.