2010年2月23日火曜日

ソフトウェア工学教育の問題点(1)

前回の記事に対して,酒井さんより Twitter でコメントがありました.

これを教えられる先生は日本では何人ぐらいいると思いますか? 10人、100人、1000人のうちだいたいどれ?
僕は数字に弱いので,正確な数字はもちろん知らないのですが,思うところあって次のように答えました.
何をもって教えたかというレベルによると思います.教科書に書いてあることを一通り教えるくらいならば,もしかすると100人以上いるかもしれないです.でも,産業界で求められている高いレベルまで教えるとなると,もしかすると日本の大学にはいないかもしれません.
実は僕は酒井さんの質問を額面通りには受け取りませんでした.つまり,現在大学で行われているソフトウェア工学教育には重大な欠陥があることを示唆していると受け止めたのです.もちろん酒井さんの真意がそうだったのかはわかりませんが,酒井さんの質問から連想してしまったのです.

どういう欠陥かを説明します.

前回の科目間の関連図ならびに教授項目は,理論面と実践面の一通りのことを教えているので,当初の計画通りに学生さんたちに教えることができれば,とても素晴らしい教育になり得ます.おそらく他大学でも同様のカリキュラムは持っていて,理想通りに教育できればソフトウェア工学の基礎をきっちり身につけた学生さんがたくさん巣立っていくことでしょう.

しかし,あくまで「理想通り」教えることができれば,という暗黙の前提があります.現実にはそうではないということが,この教育カリキュラムの欠陥なのです.

たとえば現行の C 言語プログラミング教育では,基本的な文法や,アルゴリズムとデータ構造の実装のしかたを一通り教えます.しかし,たとえば関数名・変数名やコメントをどう書くとよいかということは教えていません.学生さんたちは何の疑問も持たずに,次のようなコメントを書きます.
a = 0;  /* 変数 a に 0 を代入する */
もちろん,こんなコメントはナンセンスです.プログラムに書かれていることと全く同じ意味の内容を繰り返してコメントとして書いているだけで,冗長です.

冗長だとムダだというだけでなく,有害ですらあります.実際のソフトウェア開発でよく起こるのが,プログラムは変更したけれど,対応するコメントは変更し忘れることです.その結果,次のような混乱の原因になります.
a = 1;  /* 変数 a に 0 を代入する */
 こういう大事だが細かいことは,大学ではあまり教えていません.つまり,カリキュラムとしては一通り教えているのだけれど,それぞれの教授項目に抜け漏れが多く,企業で要求されるレベルに到達していない,ということになります.


原因としては,大学の先生は実開発の経験がない,もしくはその先生の専門がソフトウェアではないことが多く,そもそもそういう問題があることを知らない場合もあるでしょう.教授項目が多すぎて,細かいところまで行き届かないという問題もあるでしょう.あるいは研究で行っている最先端の技術に比べ,こういった教育内容は古いとされているので,探求するモチベーションがわかないのかもしれません.そもそもソフトウェア工学が未成熟で体系化されておらず,どんどん最新技術が投入されるので追いつくだけでも大変なので,何を教えるべきで何は教えなくてもいいのかの判断基準が不明確だという面もあるでしょう.

その結果,大学で習ったはずのことを企業で再教育する必要があり,大学でのソフトウェア教育は,何の役にも立たない,むしろ先入観を持つ分,有害ですらあるという話になります.

つづく