ラベル 組込み技術 の投稿を表示しています。 すべての投稿を表示
ラベル 組込み技術 の投稿を表示しています。 すべての投稿を表示

2008-09-16

組込みソフトってなに?(高校生の質問から)

『組込みソフト開発におけるプロセス改善』の記事に匿名さんから次のようなコメントをもらった。
すみません、初めてのコメントです。実は私、高校生なんですが、
組込みソフトに興味を持っています。今、私たちの生活の中で(身近なところ)よく使われている組込みソフトってなんですか。答えてくれるならすごくうれしいです。お願いします。
そもそも、このブログを始めた最初の目的は読者との双方向コミュニケーションなので、いただいたお題に対して答えてきたいと思う。(=○○)の記述は大人向けの解説。

自分は組込みソフトを説明するときにこの絵を使うことが多い。

まずは、一番左を見てもらいたい。

そもそも、人間が生活していく上であると便利なものはたくさんある。便利なものがあってもオーダーメードで作っていたのでは多くの人に使ってもらうことができない。

だから、加工しやすい部材を使って同じ働きをするものをいくつも作ることを人間は考えた。加工しやすい部材とは古くは木材であっただろう。今でも木はさまざまなものに加工され商品となっている。

その後、電気で動く部品(トランジスタなど)が発明され、定電圧で動くさまざまな電子部品、機械部品が作られて流通するようになった。これらの電子部品、機械部品の中にはセンサーと呼ばれる外界の状態をセンシングする電子部品や、モーターのように物理的に物体を動かすことのできるアクチュエータと呼ばれる機械部品もある。

これらセンサーやアクチュエータは、総称してハードウェアと呼ばれる。ハードウェアは決められた入力に対して決められた動作をする。それぞれのハードウェアにはデータシートもしくはスペックシートという取扱説明書がついている。ハードウェア部品を利用するエンジニアはこの取扱説明書を見てある目的を達成するための機器を作ろうとする。

センサーを使うと外界の状況を機器に取り込むことができる。また、アクチュエータにある入力を与えると何らかの動作をさせることができる。

センサーとアクチュエータを組み合わせると、外界の状況に合わせて組込み機器に何らかの動作をさせることができそうだ。ところが、センサーからの出力をアクチュエータに直接つないで期待通りの動きをさせることができるかというとなかなかそうはいかない。

センサーからの出力を期待通りの動きになるように変換してからアクチュエータに入力してしなければいけない。

このハードウェアとハードウェアの間に入って信号を変換する役割を担うのが元祖組込みソフトウェアだ。(上図の左)

組込みソフトウェアはCPU(中央演算装置:Central Processing Unit)という特殊なハードウェアにプログラムで命令を与えることで、信号をいろいろな信号に変換することができる。プログラムは書き換えることが可能なので、いろいろな信号の変換を試してみて「これでいける」と思ったら完成したプログラムをROM(Read Only Memory)と呼ばれる電子部品に書きこんで組込み機器に搭載する。(=設計情報の転写)

ハードウェア部品群とハードウェアとハードウェアをつなぐソフトウェアが協力しあって組込み機器が完成する。ハードウェア部品もソフトウェアも同じものを大量に生産できるので工場で部品を組み上げて消費者に届けることができる。(=設計から生産へ)

上図の左で、ハードウェアとハードウェアの隙間を埋めるような感じでソフトウェアを描いているのはソフトウェアにこんな特長があるからだ。

もうひとつ別な見方をすると、ユーザーや市場が欲しいと思うものに対して、メーカーは何らかのキーデバイスを選択して「こんな素晴らしいハードウェアを使った商品なんですよ」と宣伝する。

例えば薄型テレビのキーデバイスはもちろん液晶パネルやプラズマのパネルだ。このキーデバイスが表の顔であり、この表の顔にユーザーは惹かれる。(=コアコンピタンスとしてのハードウェア)

しかし、大抵の場合キーデバイスだけでは組込み機器に目的の動作をさせることはできない。ユーザーやマーケットが欲している機能や性能を実現するためには、キーデバイスの能力を引き出すソフトウェアが必要になる。これが組込みソフトウェアだ。(=コアコンピタンスとしてのソフトウェア)

ユーザーやマーケットの要求が複雑でかつ多様になるにつれ、組込み機器における組込みソフトの割合は大きくなってきた。

最初の絵の左から右への変遷がその様子を表している。今ではソフトウェアの分量は20年前の100倍から1000倍以上になっており、ハードウェアとハードウェアの隙間を埋めるためだけの役割だけではなくなってきている。

ソフトウェア自体を再利用可能な部品にしてそれらを組み合わせることもしないと、ソフトウェア作りが間に合わなくなってきた。(=ソフトウェアプロダクトラインの必要性)

昔はハードウェアとハードウェアの間を埋めるだけの役割をソフトウェアが担っていたので、試作品に対して何らかの入力を与え出力をチェックしながらプログラムを直していって「これで完成」という時点でソフトウェアをフィックスすればよかったが、今ではそんなやり方をしていたらソフトウェアが固まるまで何年もかかってしまう。(=Verification & Validationの計画と実行)

商品を作って他社との競争に勝つためには開発のスピード、商品が提供する機能や性能及び品質が大事になる。(=マーケティングと要求品質定義、トレーサビリティ)

ハードウェアは故障することで製品の品質を悪化させるが、ハードウェア部品の故障を最小限にするための技術は長い年月をかけて確立してきたと言える。(=故障解析、歩留まり)

一方でソフトウェアはバグと言われる意図しない動作をするプログラムが入ったまま製品を出荷することで製品の品質を悪化させる。これが市場で見つかるとメーカーは製品を回収してプログラムを正しいものに入れ替えたりする。(=リコール)

ではバグをなくしてから製品を出荷すればよいのに・・・と思うだろう。それはそう簡単ではない。例えば、400字詰めの原稿用紙で100枚ぶんの作文を書いたとしよう。この4万字の作文の中で誤字脱字を一個もない状態にするにはどれくらいの時間がかかるだろうか。

100枚の原稿を何回も何回も見直したりしていると、ふとこ「この文章を直しておきたいなあ」と思うこともある。手書きの原稿ならいざ知らず、今はパソコンで簡単に直せるので余り気にせずに直してしまう。これを何回も何回も繰り返していると、いつの間にか直す前の文章と直した後の文章がどれがどれだか分からなくなりごちゃごちゃになってしまったりする。(=構成管理、変更管理の必要性)

組込みソフトでもこれと同じことが起こる。100万行にも膨れあがったプログラムを一点のミスもない状態にするのは至難の業であり、時間もかかるし、みんなの知恵を借りていろいろなくふうをしないといけない。(=ソフトウェア工学の利用)

最後に、ひとつ現代の組込みソフトエンジニアのやりがいというプラスの面を書いておこう。ハードウェアは決まった動きをする要素部品であり、ハードウェアエンジニアは目的を果たすためにどのハードウェアをどのように組み合わせればよいかを考え、その考えを製品で実現し大量生産できるようにする。(=組み合わせとすり合わせの組み合わせ技術)

ソフトウェアエンジニアはハードウェアの構成が決まれば、勝負の世界は自分が書くプログラムにゆだねられる。毎日のプログラミングの積み重ねが商品の善し悪しを決定する。(=組み合わせとすり合わせ技術のすり合わせ技術)

ある意味、自分の技術や努力の結果が商品の品質にストレートに影響するとも言える。ようするに腕のよいソフトウェアエンジニアが書いたプログラムが高い商品価値を生み出すということだ。技術的な成長を反映させやすい、また成果を実感しやすい仕事であるとも言えるだろう。

また、ハードウェアとソフトウェアが協力して合って組込み機器ができあがるため、特にアクチュエータが使われていると物理的な動きが見えてきて機器が完成して自分の思い通りに機器が動いたとき喜びが大きい。そして、自分が作ったソフトウェアが組込み機器に載って多くのお客さんに使ってもらえるという喜びもある。これらが組込みソフトの醍醐味である。(=組込みソフトエンジニアのモチベーションの源泉)

以上、「組込みソフトってなに?」の疑問の解消にこの記事が少しでも役に立てれば幸いである。
 

2008-06-29

エレキの分かる組込みソフトエンジニアの育て方

今回は、まっさらな新人が入ってきて組込みソフトエンジニアとして育てたいとき、どんな学習方法を取り入れるとよいかという提案をしてみたい。

ちなみに、ここで紹介する方法はたぶんデジタル系の電気系技術者の教育にも使えると思う。

【前提条件】

・複数人の新人を教育する場合に有効。(できれば4人以上がよい。チームを2つ以上作れるので)
・3ヶ月以上は現場から隔離できることが望ましい。(集中して課題に取り組んでもらいたいから)
・プログラミングの経験は必要なし。・電気回路設計の経験も必要なし。
・Word や Excel や PowerPoint 、インターネットブラウザでの検索等は使えること。

【教材】

1. CPUの創りかた











2. 電子回路シミュレータ TINA7(日本語・Book版)で見てわかる デジタル回路の「しくみ」と「基本」










3. 電子回路シミュレータ TINA7(日本語・Book版2)で見てわかる 電子回路の「しくみ」と「基本」

※純粋にソフトウェアしかやらないのなら3は省いてもよい。








【ねらい】

「CPUの創りかた」は秋葉原で買えるロジックデバイスを組み合わせて CPU を自分で作ってしまおうという本だ。イラストはちょっと怪しいが中身はいたってまじめであり非常にていねいに解説してあるので、本に書いてあるように進めていけばシンプルなCPUを自作することができる。

何をするにもはじめに原点を追求しておくのはよいことだ。CPUをディスクリートで自作し、実際にプログラムコードの読み出しやアキュームレータの動きをテスターやオシロスコープを使いながら確かめることは、組込みソフトウェアエンジニアにとっても、デジタル回路設計技術者にとっても貴重な経験となるはずだ。

次に、電子回路シミュレータ TINA7 は実機がなくても、回路を書いてその動きをシミュレーションすることができる。回路に電源を供給して回路上の不特定の端子ポイントをバーチャルオシロスコープで観察することもできる。東京電機大学高等学校教諭の小峯龍男先生は、このTINA7を使った学習本の中で、「ひとつだけ残念に思うことは、TINAでは回路の組み立てに失敗しても、コンデンサをパンクさせたり、抵抗器の被覆焼け焦げたり、ICのパッケージが火傷するほど熱くなるという経験をできないことです。」と書いているが、『CPUの創りかた』で実際にCPUを作ってしまうことで、その欠点を補おうというのが今回の作戦となる。

電子回路シミュレータ TINA7(日本語・Book版)には、機能限定で TINA7のCDがついているので安価に学習ができる。

3つの本を使って、各チームにそれぞれCPUボードを作るという目標を達成させる。(Project Based Learning)

教育とマネージメントする側はPCの用意などインフラの整備、最低限のルールの規定、ポイントポイントで進捗をチェックする以外は基本的にチームに運営を任せる。

スケジューリング、材料リストの作成、道具の購入、予算管理、材料収集、回路シミュレーション、一次試作、製品制作をすべてチームに任せることで、製品開発工程のミニチュア版を体験させる。(本番と比べると商品企画と自分たちで考える回路設計だけが欠けている)

【学習方法】

まず、新人を複数のチームに分けて、各チームのリーダを決めておく。いい加減に決めるのではなく、できるだけ人物をよく観察して適性がありそうな者を指名しておく。

次に、PCやインターネットなどのインフラを使えるようにして、プロジェクトの主旨を説明し、まずは『デジタル回路の「しくみ」と「基本」』を頭から読んで、回路シミュレーションをやらせてみる。

しばらくしたら、CPUを作るための簡単な工程の説明をして、スケジューリングをさせる。(スケジューリングするためのツールとしては、GanttProject などのフリーツールを指定してもよい)

毎週一回週末に各チームの代表1人に10分間で、その週に学んだこと次週の予定などをプレゼンさせる。(週報プレゼン) また、月末には30分のプレゼンをさせる。(月報プレゼン)

【CPU制作プロジェクト】

CPU制作は、『CPUの創りかた』に書いてあるとおりにやれば出来るはずだが以下の点を考慮するとよい。

【材料収集と予算管理】
  • 必要な材料と道具のリストを作らせ、大まかな価格をインターネットで調べさせる。
  • 部品の購入方法について検討させる。(首都圏なら秋葉原で購入する)
  • 部品は一台ぶんではなく、一次試作ぶんと製品ぶんの2セット以上を購入させる。
  • 予想価格と実際に購入した価格の差を明確にさせる。
この後の工程の注意については、また今度本ブログで紹介したいと思う。
 
【この学習方法の良いところ】
  • 管理者サイドの工数がほとんどかからない。
  • チームが複数あるとそれぞれの様子を見て、良い点を取り入れようとする。
  • 週報プレゼン、月報プレゼンをさせることで学習の進度や進捗が分かる。
  • 製品の開発工程を体験させることができるので、現場に出たとき何かと役に立つ。
  • CPUの動きの原点を学習できる。
  • 早い段階で回路デバッグを経験させることができる。
  • 一発では完成度の高い製品レベルの制作は難しいことが分かる。
  • 教材費が安い(本3冊で1万円以内。CPU制作費はたぶん数万円)
  • 新人は最初とてもまじめなので黙々と学習に取り組み学習効率がよい。
  • まだ現場の仕事をしていないため割り込みの仕事がほとんどなく集中できる。
とてもよい教材本を作成してくれた『CPUの創りかた』の著者 渡波 郁氏と『電子回路シミュレータ TINA7(日本語・Book版)で見てわかる デジタル回路の「しくみ」と「基本」』『電子回路シミュレータ TINA7(日本語・Book版2)で見てわかる 電子回路の「しくみ」と「基本」』の著者 小峯 龍男先生に感謝したい。

ぜひ、お試しあれ。
 

2008-03-30

組込みソフトウェアの品質について再考する

組込みソフトウェア工房(Embedded Software Manufactory)への記事投稿がちょうど今回で100回になった。我ながらよく続いていると思う。なんとか、細々とでも続けていきたいのでこれからも懲りずにお付き合いいただきたい。

さて、今回は、ソフトウェアの品質と言えば誰もが引用するISO 9126 のソフトウェアの6つの品質特性、機能性(Functionality)、信頼性(reliability)、使用性 (Usability)、効率性(Efficiency)、保守容易性(Maintainablity)、移植性(Portability)にケチを付けるところから、組込みソフトウェアの品質について再考してみたい。

【ISO9126の品質特性と副特性】

1. 機能性(functionality) - 機能とその特性に影響する特性群。
  • 合目的性(suitability)
  • 正確性(accuracy)
  • 相互運用性(interoperability)
  • 標準適合性(compliance)
  • セキュリティ(security)
2. 信頼性(reliability) - ある状況がある時間続いたときにソフトウェアがどの程度機能するかに影響する特性群。
  • 成熟性(maturity)
  • 回復性(recoverability)
  • 障害許容性(fault tolerance)
3. 使用性(usability) - 利用するのにかかる手間、個人の努力などに影響する特性群。
  • 習得性(learnability)
  • 理解性(understandability)
  • 運用性(operability)
4. 効率性(efficiency) - ソフトウェアの性能やそれに要するリソース量に影響する特性群。
  • 時間効率性(time behaviour)
  • 資源効率性(resource behaviour)
5. 保守性(maintainability) - 何らかの変更を加えるのにかかる手間に影響する特性群。
  • 安定性(stability)
  • 解析性(analyzability)
  • 変更性(changeability)
  • 試験性(testability)
6. 移植性(portability) - 別の環境にソフトウェアを移行させる可能性に影響する特性群。
  • 設置性(installability)
  • 置換性(replaceability)
  • 環境適応性(adaptability)
一見、非の打ち所がないように見えるこの6つの品質特性と副特性。これらに付けるケチとは、6つの品質特性を高めることと、顧客満足を高めることは必ずしもイコールにならないという問題だ。

『ソフトウェア品質とは何か』の 記事で書いたように品質の定義として「品質とは、顧客要求を満たし満足させる程度」というものがある。上記の6つの品質特性を高めることと、顧客要求を満たし満足させる程度である品質を高めることは組込みソフトウェア開発においてはイコールではない。

ちなみに、6つの品質特性のうち、機能性(Functionality)、信頼性(reliability)、使用性(Usability)、保守容易性(Maintainablity)、移植性(Portability)の5つを目指すということと、再利用を見越したソフトウェアの部品化とは目標が同じであるように見える。

再利用戦略は顧客満足を高めることにつながるというスタンスをこのブログでも取っている。でも、ソフトウェアを部品化することと、商品群全体を見据えた再利用戦略とは同じではない。仮に、もしうまいことソフトウェアを部品化することに成功し、ソフトウェア部品を組み合わせるだけでシステムを作り上げることができるようになったら、それはソフトウェア開発と言えるのだろうか? 電気回路設計で部品を組み合わせて回路を書くのと同じではないだろうか。

自分は組込み機器開発でハードウェアとソフトウェアが分かれているのは、ソフトウェアには変更容易性があるからだと思っている。その歴史的な背景を考えれば、組込みソフトはハードウェアとハードウェアの隙間を埋めるような存在であり、隙間を埋められる変更容易性こそがソフトウェアの強みでもあったはずだ。

ただ、ソフトウェアシステムが30万行を越えるようになっても、隙間を埋めるような試行錯誤的な作り方をしていれば品質を維持・向上できない。だから、信頼性を高めたソフトウェアのコア資産を作ってこれを出来るかぎり長い期間、再利用するという戦略は正しいと思うし、実際そうすべきだと思う。

けれども、ソフトウェアの変更容易性を捨てては組込み製品の顧客満足を高めることはできないと直感する。

なぜなら、組込みソフトウェアではビジネス要求とコストや制約条件やら、機能と性能やらとのトレードオフが必ず発生し、それらをすり合わせて最適なバランスポイントを見いだすことが顧客満足を高めるためには必要であり、そのためにはソフトウェアの変更容易性を使わなければいけないからだ。

ソフトウェアの変更容易性の特長を使わなければ最適なトレードオフができないから、例えばコストや性能が犠牲になる。モジュール化されたソフトウェア部品を組み合わせてシステムを構築すると目的の機能を早く確実に実現できるが、コストが見合わなかったり、レスポンスが悪かったり、機動時間が遅くなったりする。

例えば、現実問題として開発工程の終盤でライバル会社が新しい製品をリリースし、市場においてアドバンテージを得るようなソフトウェア機能を見せつけてきたらどうする?

ハードウェアはもう変えられない。もしかしたら、ユーザーにとってはよく使うような機能ではなく、カタログスペックだけの勝負で必要な機能かもしれない。その機能をいれないとダメだ、といっているのは会社の中ではたった一人の声の大きいステークホルダーかもしれない。

でも、現実には多くのプロジェクトはその機能を入れることになるのだ。もしかしたら、ライバル会社が入れてきたのは本当にユーザーに役立つ機能かもしれない。そうだとしたら、嫌々ながらではなく、開発工程の終盤であっても、商品の価値を高め競争に勝つために、その機能を入れなければならない。

そんな芸当はハードウェアではできない。ソフトウェアだからこそできる。ハードウェアを変更したらプリントP板を書き換え、部品を選定しなおし、何回か試作し、性能要件が満たしているか、EMCは大丈夫か確かめなければいけない。確実に数ヶ月以上リリースが遅れる。

ソフトウェアの場合でもリリースは数ヶ月遅れるかもしれないが、ソフトウェアの変更容易性を活用して、機能を基に戻したり、バージョンアップで実現したりする作戦を取ることもできる。

また、きれいにソフトウェア部品を作って、それらをつなぎ合わせて、メモリが足らなかったり、ROM容量が足らなかったり、タイミングが間に合わなかったりすることが分かったらどうする?

そんなときは、作ったソフトウェア部品の一部を壊して、すり合わせの作業をし、制約条件や要求性能をクリアするしかない。顧客満足を満たし、商品の価値を高めるためには機能性(Functionality)、信頼性(reliability)、使用性(Usability)、保守容易性(Maintainablity)、移植性(Portability)を犠牲にしても効率性(Efficiency)を優先させなければいけない場合がある。(この例では6つの品質特性は同時には実現できず、一部が背反している)

そもそも、品質特性には組込み機器の価値を高めるために何かを犠牲にしなければならないというトレードオフの概念はない。悪い言い方をすれば、現場を知らない人たちが抽象論だけで作ったガラスの城のように見える。中身のある実態が見えない。

自分がイメージする美しいアーキテクチャとはまず、顧客満足が高く多くの人がその価値を認め購入し、長い間使い込むほど満足が高まるような商品がそこに実現されており、その中身をのぞいてみると価値の高いソフトウェア資産が独立しており、この資産を使って商品バリエーションを作れるような構造のことだ。

ようするに、商品として価値が高くないのなら中身がどんなにきれいにでも美しいとは思わないし、品質が高いとは思わないということだ。

だから、商品価値が高くないのなら、機能性(Functionality)、信頼性(reliability)、使用性(Usability)、効率性(Efficiency)、保守容易性(Maintainablity)、移植性(Portability)の品質特性が満たされていても意味がない。

ただ、30万行を超えるようなソフトウェアで機能性(Functionality)、信頼性(reliability)、使用性(Usability)、効率性(Efficiency)、保守容易性(Maintainablity)、移植性(Portability)がめちゃめちゃなシステムではバグをほとんどゼロにすることは不可能に近い。だから、品質特性を満たすことができないソフトウェアシステムは、結果的に商品価値(特に潜在的な価値、当たり前品質)が低くなる可能性が高い。

それでもなお強調したいのは、機能性(Functionality)、信頼性(reliability)、使用性(Usability)、効率性(Efficiency)、保守容易性(Maintainablity)、移植性(Portability)を高めることを組込みソフトウェア開発の目的にしたのでは、組込みソフトウェアの最適なトレードオフは成就せず、そのハードウェアにおいて商品の価値を最大限に引き出すことはできないということだ。

そうなると一番難しいのは「品質特性を高めること」と「商品価値を高めるために品質特性を犠牲にすること」のバランスポイントをどこに持って行くかだ。どれくらい品質特性を犠牲にすればよいかを判断するためには、もちろん品質特性とは何か、品質特性がなぜ提唱されたのかも知らねばならない。

さらに、最適なバランスポイントを見極めるためには、トップダウンとボトムアップの両方の視点が必要だし、ユーザーやユーザーが商品を使う環境や、世の中の幅広い科学技術や新しいハードウェアデバイスの情報や既成概念を打ち破る発想の転換もいる。

それが簡単ではないからこそ、組込みソフトエンジニアを極めるのは難しいし、顧客満足を高めることに成功したときの喜びが大きいのだ。

それぞれの業務ドメインのおいて、組込みソフトウェアの技術的ゴールはない。ゴールがないからこそ、その市場のユーザーを満足させるための技術的鍛錬をいつまでも続けていけるのだと思う。
 
もう一つ付け加えるなら、優れた組込みアーキテクトとは組込みソフトウェア開発において商品の価値を最大にする最適なバランスポイントを見つけることのできるエンジニアのことだと言える。最適なバランスポイントを見定めるためには、見渡せる範囲の隅から隅まで知っている必要がある。だから、ソフトウェアの品質特性は知らなくてもいいのではなくて知っている上でどこまで使うべきかを判断できるようにしておく必要がある。

知っているべき範囲は非常に広いので、勉強することがないという状況には絶対ならない。「この技術を使った顧客満足を最適にできるかどうか」という目で世の中を見ながら、「もしかしたら」と思ったら、深く入り込んでその技術を習得し、その技術のメリット・デメリットを頭の中にインプットして必要なときに使えるようにしておく。

これができるようになると広い範囲で問題解決能力を発揮できるようになる。すなわち、どこにいっても「使える」エンジニアになれるはずなのだ。

個人的に、ソフトウェア品質と組込みソフトウェア品質は同じではないと考えている。組込みソフトウェア品質においては、顧客満足を高めることを第一に考え、そのための顕在的な価値と潜在的な価値を高めることを目指し、潜在的な価値を高めるために有効と考えられる品質特性をどこまで取り入れれば、商品価値が最大になるかを見極めるべきだと思う。
 
P.S.

ソフトウェア品質に関して過去に書いた以下の記事も参考にしていただきたい。

『理系白書から考えるソフトウェア工学』で書いたソフトウェア工学と自然科学の違い。
  1. ソフトウェア工学は実用的で社会の利益となるような手法・技術を発見することが目的である。
  2. ソフトウェア工学では、よりどころになる自然科学の法則がほとんど使えず、思考や行動が必ずしも論理的でない人間を研究の対象にするしかない。
  3. 自然科学で解明された法則は安定しており寿命は長いが、自然科学に立脚した説明がほとんどできないソフトウェア工学は必ずしも安定ではなく寿命もそう長くはない。
『ソフトウェア品質とは何か』の 記事で書いた品質特性のこと。

また、東京大学大学院経済学研究科教授兼 ものづくり経営研究センター長 藤本隆宏先生が語った「ものの価値について」の話と、広島市立大学情報学部教授 大場充先生のソフトウェア品質の考え方について。『ものづくり戦略とソフトウェア品質』
 

2007-10-27

活用力がないのは大人も同じ

今年4月に小学6年生と中学3年生およそ220万人を対象に、国語と算数・数学の2つの教科で行われた全国学力テストの結果が報告された。

算数では左図のような地図上にある長方形と平行四辺形の2つの公園のどちらが広いかを説明させる問題の正答率が最も低く、5人に1人の18%にとどまった。単純な平行4辺形の面積を求める問題の正答率が96%だったことと比べ、基礎的な知識を日常の場面で具体的に活用する力が不足している実態が浮き彫りになっている。

公式に当てはめるだけの問題なら96%の子供が解けるが、公式をどこに使うべきか考える必要のある問題にすると正解率が18%に落ちる。

公園の問題の解法は長方形は縦×横で、平行四辺形の面積は底辺×垂直方向の高さで計算し、計算した面積を比較することなのだが、いつもは図形のすぐ脇に書いてある長さがこの問題ではちょっと遠いところに書かれている。長さを平行移動して平行四辺形の底辺と垂直方向の高さがどれに当てはまるのか考えないといけない。

この問題の点数が低い(=活用力がない)原因は、子供にあらかじめ答えが決まっているペーパーテストばっかりやらせているからだと思う。

この公園の面積を比較する問題も、公式を使った応用問題のテストを山ほど実施すれば解けるようになるはずだ。人間の記憶のメカニズムを考えればそれはうなずける。でも、それはあくまでも記憶をたよりにした問題解決であり、記憶の引き出しの中にない問題を解決することはできない。

短い時間、たとえば90分とか、4時間とかいった限られた時間の中で、テストの点数を高くするには、早く正しい答えを見つけるしかない。この記憶にたよった問題解決方法だと問題を早く解けるようになるが、たくさんパターンを覚えなければならない。一方、記憶の引き出しにはパターンがそれほど蓄積されていなくても、対象となる問題について考えて考えて考える問題解決方法なら、時間はかかるがいろいろな問題に対応することができる。平行四辺形の面積を計算する公式を知らなくても、その公式さえ思いつくことも可能だろう。前者の記憶をたよりにしてパターンの中から正解を見つける方法だと、記憶の中に今回のパターンらしきものがないとすぐにあきらめてしまう。その問題に時間をかけているより、より多くの別の問題を解いた方がテストの点数が高くなるからだ。

これを10年以上訓練してきた子供が大人になってエンジニアになると、長期的なレンジに立った問題解決能力の低い技術者になってしまう可能性が高い。この近視眼的な問題解決しかできない、解決のパターンが記憶にないとすぐにあきらめてしまう技術者はカイゼンが苦手だ。今そこにはない正解のパターンを自らが作り上げるということができない。

大学生の場合、卒業論文や修士論文などが長い時間をかけた問題解決の練習になると思うが何しろそれ一回限りだとまったく訓練が足りない。あるテーマに対してレポート提出を要求する方法だって、1分でも早く終わらせるために google で検索してコピペで終わらせてしまう。

だからこそ、今大学の教育で見直されているのがPBL(Project Based Learning)なのだろう。プロジェクトが達成すべき目標に向かって、長い時間をかけて解決を見いだしていくという学習方法だ。

活用力が下がっているのは、簡単に言えば「考えること」が不足しているのだと思う。ひとつのテーマに対して、考えて考えて考えて、いろいろなアプローチで考えて、出した答えの根拠を明確にしていき、他の問題にも活用できるかどうかをまた考え体系化していく。この訓練が必要だ。

ちなみに、そのようなアプローチで考えを体系化した人は、その知識を論文に書いたり、書籍にしたりする。そのような人達はもれなく「考える人」である。

そして、先人の知恵であるソフトウェア工学を自分の現場に適用しようと考える技術者は、考えを体系化した人ほど「考える人」である必要はないが、そこそこ「考える人」になっていないといけない。

前述の記憶をたよりにしてパターンに当てはめることしかしない人は、先人が体系化した知恵が自分の現場の問題にピッタリ当てはまっていないとすぐにさじを投げる。そこそこ「考える人」は、先人がなぜそんなことを考えたのかを考えたりしながら、どうやって自分の現場に応用したらいいのか考えを巡らすのだ。

果たして、みなさんは常日頃簡単には答えのでない問題について考える習慣を持っているだろうか?自分は、このブログに記事を書くことでその訓練をしている。

NASAゲームという、考えを巡らすのにぴったりの問題があるので、それを紹介して今回の記事を終わりにしたい。

「月で遭難した時に何を持っていくか?」
あなた達は月旅行宇宙船のメンバーです。計画では"明るい方の月面上"で迎えに来る母船とランデブーすることになってました。ところが、あなた達の乗った宇宙船が機械の故障で着陸予定地点(母船とのランデブー地点)から、"200キロメートル"離れた所に不時着してしまいました。

あなた達は損害を免れた品々のなかから、必要な物を選んで、月面上を200キロメートル移動し、母船まで辿り着かなければなりません。

と、いう中で、課題は「残された携帯可能な品々である"下の15品目"に、その必要度(重要度)に応じて順位をつけなさい。」というものです。

携帯可能な15品は次の物です。[ ]の中に優先順位を書いてください。

[ ] マッチとマッチ箱
[ ] 宇宙食(月面移動中でも摂取可能)
[ ] ナイロンのロープ15m
[ ] パラシュート(地球に帰る時に開く)   
[ ] ポータブルの暖房機(月面でも使用可)
[ ] 45口径のピストル2丁
[ ] 粉乳 1ケース
[ ] 100ポンドの酸素入りボンベ2個。
[ ] 月から見た星座図。
[ ] 救命いかだ ガスボンベ付(海上へ着陸したとき使う)
[ ] 磁石のら針儀。
[ ] 5ガロンの水。(補給可能)
[ ] 発火信号(月面でも使用可)
[ ] 救急箱。(応急用のテープやビタミン剤、注射器等入り)
[ ] 太陽で作動するFMの受信機。
ちなみに、この問題は個々に考えた優先順位を複数人で付き合わせてコンセンサスを得る訓練のためのものだが、必ずしも答えが一つではない問題にたいして、いろいろなシチュエーションを考えながら自分が考えた優先順位の根拠を明確にしていくという過程は、「考える人」になる訓練にもなる。
 

2007-09-21

ソフトウェアシステムの分割法

先日、豆蔵のコンサルタントでEEBOFのメンバーでもある井上樹さんと、ソフトウェアシステムの規模のことで話をしていた。自分はプロセスネットワークの金子龍三氏が語っていた30人、30万行以上というソフトウェアプロジェクト、ソフトウェアの規模が分岐点になるという話をしたら、井上さんも同じような別の指標を教えてくれた。

まず、プログラマが自分の作ったソフトウェアについて誰かに聞かれたとき、あのモジュールのあの関数の部分とパッと頭の中に浮かぶソフトウェアの規模はだいたい5000行くらい、そして一人のソフトウェアエンジニアがソースコードだけで保守できる範囲はせいぜい10000行くらいとのこと。また、プロジェクトチームは人数が増えてきたらチームリーダを含めた一チーム6人に分割し、プロジェクト全体では最大5~6チーム以上にはしないようにした方がよいだろうという話だった。これを超えるようならプロジェクト自体を分割して別々のプロジェクトになるようにマネージメントした方がよいのだそうだ。

井上さんの話から、プログラマのソースコードレベルでの守備範囲が10000行だとすると、1プロジェクトの限界が30人で30万行となり、冒頭の30人、30万行の話を符合する。30人、30万行の指標はソースコードレベルで把握できるレベルの限界であるというのは、ソフトウェアエンジニアの管理限界の平均値に近いのだろう。

ちなみに、プロジェクトメンバの数は簡単に数えられるが、ソフトウェアのコードの規模としてコード行数を数えるのはそれほど簡単ではない。自分の中ではソースコードの行数と言えば、コメント行や宣言文を除いた実行コード行数ということになる。実行コード行数を目視でカウントするのはあまり現実的ではない。そうなると何らかのツールを使わないとある程度正確なカウントができない。でもツールがないからといってコード行数をカウントしないとソフトウェアシステムの規模が把握できない。組込みソフトの場合、実機にアップロードするときのコードサイズをソフトウェア規模の指標にする場合もあるが、プログラミングをソフトウェアエンジニアの文章書き作業だと考えると、ソフトウェアの複雑性を計る意味ではプログラムサイズよりも実行コード行数の方が実態に近いのではないかと思う。

もしも、実行コード行数を計るツールを持っていない場合は、C,C++,java,htmlプログラムの行数を計算する C&C というフリーツールがあるので参考にしてはどうかと思う。(このツールはSESSAMEメンバーの國方さんに教えてもらった。このブログでツールを使うときは宣伝文句に惑わされるなといったことを何回も書いているが、できるエンジニアは大抵いくつかのツールを上手に使いこなしている。常にアンテナを張っているので、ツールの選び方も上手い。)

さて、30人、30万行の規模に達していないプロジェクトは何もしなくてよいのだろうか。それは、もちろんそうではない。ソフトウェアの規模が徐々に拡大して何の危機感も感じることなく試行錯誤的なアプローチで30人、30万行の規模に達してしまったら、もう身動き取れないし、その状態からソフトウェアの構造やプロジェクトを立て直すのは相当大変だと思う。

感覚的には10人、10万行くらいの規模に達したら、何かしないとまずいと感じないといけないし、その時点から対策を打っていけば、30人、30万行に達したときでも破綻することはないと予想する。そもそも組込みソフトでゼロからスクラッチで作ることはないので、一回の開発で作るソフトウェアの量はそんなに多くないと思っていると、いつの日か痛い目にあうときがくる。もともと先々のことまでよく考えずにスクラッチでソフトウェアを作っていると CPUやOSが変わったとたんに、これまで作ったソフトウェアのいろんなところに手を入れないといけなくなる。結果的にスクラッチでゼロから作り直したのと同じぐらいの時間がかかってしまうこともある。

さて、そうなると最初に考えるべきはソフトウェアシステムをどのように分割すべきかということだ。ソフトウェアシステムのモジュール分割については30年以上も前から不文律がある。それは「システム分割に際しては分割したモジュールを高凝集、疎結合にすべし」という考え方だ。
【凝集の種類】 (数字が大きくなる方がよいとされる)
  1. 暗号的凝集度 プログラムを単純に分割しただけで、モジュールの機能を定義できない。または、複数の機能をあわせもつが、機能間にまったく関連はない。
  2. 論理的凝集度 関連した複数の機能をもち、モジュールが呼び出されるときの引数(機能コード)で、モジュール内の1つの機能が選択、実行される。
  3. 時間的凝集度 初期設定や終了設定モジュールのように、特定の時期に実行する機能をまとめたモジュール。モジュール内の機能間にあまり関連はない。
  4. 手順的凝集度 複数の逐次的に実行する機能をまとめたモジュール。
  5. 連絡的凝集度 手順的凝集度のうち、モジュール内の機能間にデータの関連性があるモジュール。
  6. 情報的凝集度 同一のデータ構造や資源を扱う機能を1つにまとめ、機能ごとに入口点と出口点をもつモジュール。
  7. 機能的凝集度 1つの機能だけからなるモジュール。
※参考文献:平成16年度 ソフトウェア開発技術者合格教本 ISBN4-7741-1882-6
組込みシステムでよく見られるのは、3の時間的凝集を意識したモジュール分割だ。リアルタイム性を重視する余り、10ms毎、100ms毎、1秒毎に起動するモジュールといった感じで時間的な視点のみでモジュールを分割する。リアルタイム性が非常に強いシステムでは当然時間的凝集を意識したモジュール分割も必要だが、ソフトウェアシステムが巨大化した場合は、時間的凝集や手順的凝集だけを意識していると移植性や保守性、再利用性が悪くなる。

巨大化したソフトウェアシステムに立ち向かうには、機能的凝集の考え方が必要であり、責務ごとにモジュールを分割する必要がある。システム全体を責務に分割し、機能的凝集に成功すると分割したモジュールの内部でやっていることについて、モジュールの外部は意識する必要がなくなり、そのモジュールが外部に対して公開しているサービスについてのみ考えればよくなる。ようするにシステムの上位層から見たときにモジュール内部の(不要な)データや処理を隠蔽していかないと、システム全体を把握することが難しくなる。人間が一度に把握できる構造には限界があるので階層的にソフトウェアシステムを眺めていくには、機能的凝集のモジュール分割、責務に基づいたモジュール分割が必要になる。

このようなモジュール分割の考え方は、ビジネス系でオブジェクト指向設計を行う際には普通に行われていると思うが、組込み系のシステムで制約条件のことに考慮せずに機能的凝集のことだけ考えてモジュール分割を行っていると、リアルタイム性やメモリ容量、CPUパフォーマンスをクリアできない場合もあるから注意が必要だ。だから、『組込みソフトエンジニアを極める』では、第1章で時間分割のハードルを越える 第2章で機能分割のハードルを越える といった順番で、時間分割、機能分割の考え方を書いた。

だから10万行を超えた組込みソフトウェアシステムでは、いろいろな凝集についての考え方があることをきちんと理解しながら、トップダウンの視点(機能分割)とボトムアップの視点(時間分割)の両方の視点でシステムを眺めることが大事だ。組込みソフトエンジニアは機能分割と時間分割の最良のバランスポイントを見つけなければいけない。

次に、結合の種類 6種類を挙げておく。ちなみに、この分類は最初に提唱したのは、G.J. マイヤーズだと思う。
【結合の種類】 (数字が大きくなる方がよいとされる)
  1. 内容結合 絶対番地を用いて直接相手モジュールを参照したり、相手モジュールに直接分岐する。
  2. 共有結合 共通領域(グローバル領域)に定義されたデータを参照する。
  3. 外部結合 必要なデータだけを外部宣言し、ほかのモジュールから参照を許可し共有する。
  4. 制御結合 機能コードなど、モジュールを制御する要素を引数として相手モジュールに渡し、モジュールの機能や実行を制御する。モジュール凝集度の論理的凝集度がこれに相当する。
  5. スタンプ結合 相手モジュールで、構造体データ(レコード)の一部を使用する場合でも、構造体データすべてを引数として相手モジュールに渡す。
  6. データ結合 相手モジュールをブラックボックスとして扱い、必要なデータだけを引数として渡す。
※参考文献:平成16年度 ソフトウェア開発技術者合格教本 ISBN4-7741-1882-6
G.J. マイヤーズがこの6つの結合を分類したのは30年以上前のことだ。だから、この結合の分類はC言語ならば関数と関数の結合といった関係のことしか書かれていない。オブジェクト指向設計で考慮の対象になる、結合の方向性(結合の方向性は一方向にした方が結合度が低い)については考えられていない。

何はともあれ、巨大化してしまったソフトウェアシステムは何らかの視点でシステムを分割していかないとすぐに手に負えなくなる。何らかの視点の何らかの部分は組織や商品やプロジェクトによって異なるのだか、多くの場合は機能的な分割をベースに、時間的分割を考慮する方法がセオリーになると思われる。

また、データの取り扱いが重要とされるシステムでは、プレゼンテーションレイヤー、ドメインレイヤー、データソースレイヤーといったレイヤリングの分割視点が有効な場合もある。

さらに、商品に求められる価値をQFD(品質機能展開)で分析して、その要求・価値を実現する機能や性能をモジュールとして括りだすという視点もある。

どっちにしても、大規模・複雑化した組込みソフトウェアシステムでは、どんな視点でシステムを分割するかといった戦略(=アーキテクチャ)が、製品の開発を効率化し、信頼性や安全性を高めるカギとなるのは間違いない。
 

2007-09-06

トヨタのソフト戦略

ソフトウェア品質シンポジウムの基調講演でトヨタ自動車常務役員の重松崇氏の話を聞いた。トヨタの重松氏はESECなどの組込み系、ソフトウェア系のイベントでよく講演しているのを見掛ける。

もともと重松氏はソフトウェア技術者としてのたたき上げではなく、根っからの車屋から車載ソフトウェアを任されたという経歴を持つ。では、なぜバリバリのソフトウェア技術者ではない重松氏が組込みソフトウェア系、品質系のイベントに呼ばれるのか? それはもちろんトヨタ自動車が日本だけでなく世界的に高い業績を上げている企業であり、トヨタ式と呼ばれるハードウェアの生産方式と同じように、ソフトウェアの開発にもトヨタ式と呼ばれるものが存在し、それを真似すれば高品質のソフトウェアをアウトプットできるだろうと多くの人が期待しているからだ。

さて、重松氏は90分の講演時間のうち、半分以上を使って現在と未来の自動車に求められること(エネルギー効率のよいモビリティの追求と安全の確保)を語った。さすがだと思う。つい最近、JR のSuicaのプロジェクトを牽引した椎橋氏の話を聞いたが、椎橋氏も講演のほとんどの時間、鉄道を利用するお客さんの利便性を向上するために自分がやってきたことをとうとうと語っていた。

ようするに組込みは業務ドメインを知り尽くし、顧客要求(トヨタの場合は顧客というより地球や人類のことを考えているとのこと)を高める意志と戦略を持った者が、ソフトウェア開発のどこに力を入れればよいのかわかるということだ。(これはビジネス系のソフトも同じか)

でも、なぜ重松氏は車に特化したソフトウェア開発戦略をわざわざあっちこっちでレクチャーするのだろうか。その情報の公開はトヨタにとってどんなメリットがあるのか? 

これは予想だが、トヨタはトヨタのソフトウェア戦略を公の場でしゃべることで、トヨタ社内やサプライヤのソフトウェアエンジニアに対して自分達の考え方を浸透させたいのだと思う。トップの方針を末端まで届けたいという意志があるに違いない。それに重松氏がしゃべった内容は、すぐに日経エレクトロニクスなどに取り上げられちまたの話題となる。なぜなら、冒頭で書いたように日経エレの読者はトヨタ式のソフトウェア開発方式がすべての業務ドメインに使えるだとうと期待しているからだ。

でも、特に組込みソフトの世界ではすべてのドメインに共通して有効な解法はない。なぜなら、業務ドメインや組織によって、市場要求や得意な技術、リアルタイム性などの性能要件、メモリ、CPUパフォーマンスなどの制約条件、組織成熟度、エンジニアのスキルがバラバラだからだ。でも、ツールベンダーやプラットフォーム提供者は、必ず自分たちのソリューションがすべて組込み開発に有効であるかのように宣伝するので気をつけた方がいい。こういうのにコロッとやられてしまう鴨ネギタイプのエンジニアやマネージャは組織の中に必ずひとりやふたりはいるものだ。

さて、重松氏は自動車に搭載する約60のECU群を今後4群に減らしていくと言っていた。自動車におけるECUのプラットフォームを共通化し、ソフトウェアの連携によって多様な要求(交通インフラから上がってくる情報を使って危険回避するような要求)に対応していくそうだ。

この施策の最大のリスクは、エネルギー効率のよいモビリティの追求と安全の確保のうち「安全の確保」の方が危うくなる可能性があるという点だ。

ECUが物理的に分かれ責務分割されている状態では、各ECUが起こす不具合、バグの責任は明確で、ECU別に責務の重さやソフトウェア品質の検証のハードルの高さを変えることができた。でもECUの数が少なくなってしまうと、責務の分割や安全の重要性はソフトウェアの中を見ないと分からなくなる。アーキテクチャを可視化して、システムの安全を確保するための安全アーキテクチャが確立されていることをソフトウェアの範疇で証明しなければいけない。安全クラスの低いアプリケーションソフトがメモリリークを繰り返して、重要なソフトに影響を与えないことを証明しなければいけない。ソフトウェアは人間が作っているモノなので絶対大丈夫とは言い切れないし、誰かがちょこっとなおした1行の変更がシステムに大打撃を与える可能性も否定できない。

ECUの数を極力少なくするのなら、ソフトウェアの安全設計、安全アーキテクチャが絶対に必要だと思う。大規模・複雑化したクリティカルデバイスにおいては、安全アーキテクチャは今後重要なテーマになっていくだろう。また、プラットフォームの共通化のメリットがデメリットを上まわる自信がないといけない。組込みソフトはいろいろなトレードオフのバランスの上で顧客満足を確保しているのだ。

さて、重松氏はモデル駆動開発についてサラッと問題点を口にしたが、自分は大事なその一言を聞き逃さなかった。それは「戦略なきプラットフォームの共通化は失敗(プラットフォームベンダにいいようにやられる)する」ということばだ。

プラットフォームの共通化・モデル駆動開発ということばに踊らされて、商品の価値を高めることができるという確信がないままに、共通プラットフォームを採用してしまうと後々商品開発の基盤をプラットフォーム提供者に握られてしまうことに気がつく。重松氏はこの例として、ヨーロッパの共通規格団体 AUTOSAR が Windows を車載ソフトの共通プラットフォームとして採用する提案をしてきたので、日本の共通化団体の JasPar で使えない部分があることを証明してAUTOSARに進言したという例で語っていた。

重松氏の話を聞いていてトヨタは自前で自動車のソフトウェア全部を作り上げるつもりはないように聞こえた。サプライヤからのソフトウェア供給は今後も続くという考えのようだ。そうなると、クライアントとなる自動車メーカは難しくなっていくソフトウェアの理論についてどんどんうとくなり、サプライヤ側は自動車を取り巻く環境の詳細を把握しきれなくなる。トヨタの重松氏やJRの椎橋氏のように車や鉄道のことを知り尽くし、ソフトウェアの品質がどうあるべきかがわかる技術者がだんだんいなくなって顧客要求をよく理解しないソフトウェア技術者が作ったプログラムを自分たちの商品に実装せざるを得なくなってくると思う。

これはかなり危ない。車や鉄道の特性やリスクを知らない、意識しない技術者が作ったソフトウェアは間違いなく危ない。その機器が使われる場面においてどんな危険やリスクがあるのか知らないツールメーカのツールやプラットフォームも危ない。どうしてもそれらを使うのなら、それらが危なくないことを証明する責任は採用した側にある。それだけは忘れてはいけない。

P.S.

「トヨタはソフトウェアでもトヨタ式を提唱していくつもりなのか?」という会場からの質問(電通大のにしさんより)に対して、重松氏は「生産方式には自信があるが、ソフトウェアについてはむしろ外部の知恵(例えばソフトウェア工学で培われたプロセスアプローチなど)を取り入れていきたいというようなことを語っていた。トヨタ式ソフトウェア開発は参考にするべきもので、生産方式のように安易に真似してはいけないということだ。
Blogger のコメントは読みにくいので本文の方に入れてしまいました。

自動車エンジニアさん さんは書きました...

先日、コメントを書かせて頂きました『自動車エンジニア』です。

また、コメントさせて頂きます。

-----------------------------------
プラットフォームの共通化・モデル駆動開発ということばに踊らされて、商品の価値を高めることができるという確信がないままに、共通プラットフォームを採用してしまうと後々商品開発の基盤をプラットフォーム提供者に握られてしまうことに気がつく。
----------------------------------

確かにそのとおりだと思います。
自動車業界でいうと、モデルベース開発がMATLABという1つのツールに依存しすぎると、ツールベンダーに主導権を握られるリスク当然はあります。

実際そうなりつつありますが...
MathWorksがマイクロソフト状態にならないように、MAAB、J-MAABなんかでも、MathWorksにソフト改良への要求などを(強気に?)行って、かなり牽制しようとしてますが...


デンソーなんかは、ツールベンダーに依存しなくてよいような方向を志向しているのかどうかわかりませんが、最近はプラットフォーム環境を内製化しようとしてしいる感じは、各公演等から感じられます。
トヨタでも同じようなことは考えられているかもしれません。




----------------------------------
重松氏の話を聞いていてトヨタは自前で自動車のソフトウェア全部を作り上げるつもりはないように聞こえた。サプライヤからのソフトウェア供給は今後も続くという考えのようだ。
----------------------------------

参考までに、トヨタは自前で組み込み用のOSの開発を行っているようです
あくまで、メディアの情報です。

【トヨタ、「クルマOS」独自開発】

【50人体制の開発組織・トヨタ正発表】

【経済産業省、車載標準OSを開発へ--トヨタや日産らが参加】


トヨタも現状は、サプライヤーにソフトの供給を依存しているかもしれませんが、もしかしたら、将来的に自前でいくことも考えているのかしれませんね。

ただ、本当の戦略??です


-----------------------------------
これはかなり危ない。車や鉄道の特性やリスクを知らない、意識しない技術者が作ったソフトウェアは間違いなく危ない。その機器が使われる場面においてどんな危険やリスクがあるのか知らないツールメーカのツールやプラットフォームも危ない。
----------------------------------

自動車業界にいる者として、真摯にご指摘を受け止めなければなならないと思います。
現状、車メーカー側には組み込みのエキスパートは少ないように感じます。
いくつかの車メーカーはグループ内にECUメーカーをもっていて、組み込みは子会社のECUメーカーに任せて、車メーカーはシステムのアルゴリズム開発に注力するという方向かもしれませんが、それが、大問題の原因になるとのご指摘かと思います。

車メーカー:組み込みの素人、制御アルゴリズムや車両の特性には詳しく、ロジック開発のみやる
⇒どんどん、組み込みに疎くなる。
⇒【組み込み技術】と【制御ロジック/制御対象特性】の両方を把握するエンジニアがいなくなる。
システム/組み込み開発で全体を把握でる人がいなくなり、部分分のみの知識/経験しかない人だけになると絶望的になる。

さらに、自動車の特性に関する知識に疎いツールベンダーが、人命を預かって走る車において、ECUの組み込みの根幹を握るようにると、さらに怖いというご指摘かと思います。
(間違っていたらご容赦ください)

車メーカー側は組み込み技術の向上(組み込みエンジニアの育成も含めて)を真剣に考えていかなければいけなかと思います。
最後は車メーカーが全ての責任をとらなければいけませんので、組み込みECUの責任も最後は車メーカーが持たなければなりません。


私も、組み込みに関する知識不足を痛感しています。
最近、組み込み関連の本を何冊か購入して勉強していますが...

『組込みソフトエンジニアを極める』も今、読ませて頂いております!

ECUメーカーの組み込みエンジニアとも情報交換及び、今後のシステム/組み込み開発のやり方を議論する場なども定期的にもっていたりします。

----------------------------------
こういうのにコロッとやられてしまう鴨ネギタイプのエンジニアやマネージャは組織の中に必ずひとりやふたりはいるものだ。
----------------------------------
私もそんな1人ですね(笑)
ベンダーの営業トーク(いいことしか言わない)によくコロッといったりします(笑)

9月 08, 2007

削除

sakai さんは書きました...

自動車エンジニアさん、コメントありがとうございます。

自動車エンジニアさんは本当に自動車のソフトウェア開発にお詳しいですね。

自動車のソフトウェア安全については、ISO 26262 の策定が進んでいると思いますが、ソフトウェアの安全性を分析する考え方として MISRA-SA というのもあります。

どっちにしても、ソフトウェアの安全性は電気的安全性のようにはっきりと白黒つけることは難しいので、エンジニアがどれだけ客観的な根拠・証拠をもってシステムの安全性や信頼性を証明できるかどうかにかかっていると思います。

自動車ソフトウェアの安全性は、これまでソフトウェアエンジニアがユーザーの要求や機器のメカニズムを熟知しており、どんな風に使われるのか、どんな風に ハードソフトが動くのか知っていてソフトウェアを作っているということで担保されていた部分が大きかったと思いますが、これからは誰がどんなソフトウェア を作り込んでしまうか分からないという前提で、ソフトウェアの安全性や信頼性が確保されていることを客観的に示していかないといけないと思います。

モデルベース開発は安全を客観的に示すための有力な方策の一つだと思いますが、モデル変換のソフトウェアを作っているエンジニアが特に車のメカニズムを意識していない場合、意図しない洩れや抜けにより変なコードが埋め込まれてしまう可能性はあると思います。

ただ、「理系白書から考えるソフトウェア工学」で書いたように、モデルベース開発が自然科学を相手にしているうちは正しく変換できているという信頼性をVerification(検証)することは難しくないと思います。

しかし、自然科学以外のすり合わせ的ソフトウェアアーキテクチャをモデル駆動開発に取り込んでいった場合は、信頼性の証明やシステム全体のValidation(妥当性確認)は難しくなってくると予想します。

組織内部の Closed のすり合わせ的アーキテクチャ・アルゴリズムの安全性や信頼性は、そのハード・ソフトが使われる場面や要求を実現するメカニズムを熟知しているソフトウェ アエンジニアの「慎重さ」「そのソフトウェアが安全を担っているという使命感」のようなものが確保していたのが本当のところでしょう。(要求通りに作られ ているかどうかを検証するのは Verification です)

これからは、その安全アーキテクチャ、安全ソフトウェアをカプセル化して、他の安全クラスの低いソフトウェアから隔離し、影響を受けにくいソフトウェアの構造を作っていかないといけないと思います。

これは ECUが物理的に分かれていることで責任分担され証明しやすかった状態に比べると、自信を持って「安全です」と言えるところまで持っていくのに時間も手間やソフトウェア的工夫もいるだろうと予想しています。

自分は自動車ドメインのエンジニアではありませんが、このブログでもその方策について考えていきたいと思います。

9月 08, 2007


2007-08-28

理系白書から考えるソフトウェア工学

理系白書には、何しろたくさんの研究と研究者が登場する。研究者達の苦労や待遇、評価の低さについての現状についても興味深く読んだが、自分はこの本が訴えたい内容とは別のところで考えさせられることがあった。

それは同じ理系でも自然科学と情報工学・ソフトウェア工学では、導かれた成果の性質や寿命がかなり違うのではないかということだ。

Wikipedia で「工学」を引くと冒頭に次のような定義が書いてある。
工学(こうがく、engineering)は、科学、特に自然科学の蓄積を利用して、実用的で社会の利益となるような手法・技術を発見し、製品などを発明することを主な研究目的とする学問の総称である。大半の分野では数学と物理学が基礎となる。
工学と理学の違いは、理学がある現象を目の前にしたとき「なぜそのようになるのか?」を追求するのに対して、工学は「どうしたら目指す成果に結び付けられるか」を考えることにある。

また、自然科学については、次のように書いてある。
自然科学(しぜんかがく、natural science)とは、科学的方法により一般的な法則を導き出すことで自然の成り立ちやあり方を理解し、説明・記述しようとする学問の総称。
自然科学の法則は寿命が長い。きちんと証明されると訂正されることはほとんどなく、自然科学の法則同士に矛盾も生じない。自然科学の研究の根拠となるデータがしっかりしていれば疑いの余地がないことが多い。

工学(エンジニアリング)は科学、特に自然科学の蓄積を利用して、実用的で社会の利益となるような手法・技術を発見し、製品などを発明することを主な研究目的とする学問だとすると、ソフトウェアエンジニアリングの何の科学の蓄積を利用していると言えるのだろうか?

プロセッサの構造や電気的特性にまでさかのぼれば、物理学や化学が関係してくると思うが、ソフトウェア工学がテーマとして扱っているのは自然科学から遠いところの話がほとんどではないかと、理系白書を読んで思った。ようするにソフトウェア工学が扱っている対象はなく突き詰めれば人間ではなかろうかということだ。

無理矢理自然科学に結びつけるとすれば、人間の頭の中、脳の情報処理の生化学となるのだろう。でも、脳神経の生化学的な研究と、脳の情報処理の仕組みとの関係はまだまだ解明できていないことが多く人間が考えること、考えるしくみを自然科学で十分に説明できるところまでには至っていない。(そうはいうものの『考える脳 考えるコンピューター』ではかなり踏み込んでいる)

そうなると、工学が実用的で社会の利益となるような手法・技術を発見することが目的であり、ソフトウェア工学に至っては、よりどころになる自然科学の法則がほとんど使えず、思考や行動が必ずしも論理的でない人間を研究の対象にするしかないということになる。

そこで最初の疑問に戻る。自然科学で解明された法則は安定しており寿命は長いが、自然科学に立脚した説明がほとんどできないソフトウェア工学は必ずしも安定ではなく寿命もそう長くはない(例えば50年以上はもつものは本当に少ない)のではないかと思う。

今、『ソフトウェア・テスト技法』で有名なJ.マイヤーズが1978年に書いた『ソフトウェアの複合/構造化設計』という本を読んでいる。マイヤーズ自身、1974年に書いた著書で「源泉・変換・吸収(STS)型の分割法」だけを紹介していたが、4年後に書いたこの本では、STS型の分割法に加えてトランザクション分割、共通機能分割、データ構造分割といった分割法も紹介している。巨匠と呼ばれる人でさえ築き上げた方法論を何年かたつと修正したり付け足したりすることが分かる。

別な見方をすれば、ソフトウェア工学は対象となる人(エンジニア)の性質や考え方に変化がなければ、構築した法則の寿命は長い。でも、地域による人の考え方の差や気質などが異なると同じ法則が有効に働くとは限らない。もしも、同じ法則がどの地域でもどのプロジェクトでも有効に働いているように見えるのであれば、それは地域や人がその法則を受け入れた、もしくは染まっただけなのではないあろうか。

その見極めをするのは非常に難しい。自然科学がベースにないと、方法論の有効性を検証したデータの再現性は高いかどうかわからない。ある方法論をソフトウェアプロジェクトに適用してよい成果が出たとしても、デマルコが言うようにプロジェクトメンバのそれぞれが失恋して落ち込んでいたり、気になることがあって気もそぞろな状態でデータを取ったらまったく違うメトリクスになるかもしれない。

対象としているのが論理的とは言い難い人なのだからしょうがない。

そうであるなら、ソフトウェア工学は先人の知恵と考えればよいのではないか。先人が失敗したり成功したりして、失敗を繰り返さない、次は効率よく進めようと考え、編み出した先人の知恵、それがソフトウェア工学だと考えるのだ。

そう考えると、その先人の知恵が自分たちにも有効に作用するかどうかという視点で見るようになる。場合によっては、欧米発の先人の知恵は日本では有効に働かないかもしれない。民族の気質が大いに関係するようなアクティビティの実践を促しているようなものは特に気をつけなければいけない。

また、その組織やプロジェクトの気質とは少しずれがあるけれども、先人の知恵に乗っかってやりきってしまうという方法もある。やりきって成功体験となれば、自分たちの気質自体が変わってくることもある。

30年前に書かれた『ソフトウェアの複合/構造化設計』の主張が今でも当てはまるかどうか見てみよう。

「代表的なプログラムで、その構造が設計されているものはほとんどない。その構造は、コーディング途上でそれ独自の方法で作られるのが普通である。」
【コメント】 未成熟なプロジェクトではそのような状況はまだ生きていると思うが、Noと言えるプロジェクトも増えてきてはいるだろう。モデル駆動開発が進めば払拭される可能性もある。

「ほとんどのプログラムは、要件とか環境の変化に対応できないようなつくりかたをされている」
【コメント】 これも同じで、未成熟なプロジェクトではYESと言える。

「プログラムはほとんどの時間をまちがいを修正するために費やしている」
【コメント】 またまた、これも同じで、未成熟なプロジェクトではYESと言える。

「我々は他人の成果を利用しようとはしない」
【コメント】 もろ人間系の問題でその性質は今でも変わっていないと思う。

「n人のプログラマを抱えたプロジェクトは、通常、一つ一つ違ったn個の目標を持つ」
【コメント】 この問題を解決するためにプロジェクトマネージメントの技術が構築されていったのだろう。


ちょっと脱線するが、30年前に J.マイヤーズの『ソフトウェアの複合/構造化設計』 に書かれていることが、21世紀の現代でも未成熟なプロジェクトではほとんど当てはまるというのは一体どういうことだろう。

オリンピック記録は毎回毎回更新され、新しく生まれてきた未来のアスリート達のハードルは自分の意志とは関係なく上がっていく。(こちらの記事を参照のこと)それでもオリンピックレコードが更新されるのは、選手達の努力もさることながら用具の進化、トレーニング技術の進化があるからに違いない。

ではなぜ、ソフトウェアの世界では30年前の憂いが払拭されていないのか? それは用具(ツール)の進化はあっても、トレーニング技術(教育)が進化していないからではないだろうか。だからこそ、SEESAMEは技術者教育のコンテンツを開発しているのだけれど、教育機関ももっと頑張って欲しい。オリンピックのように多くの人に注目されるような機会がないこともソフトウェア技術者の基礎体力が上がらない理由があると思う。

さて、自然科学も話題に戻ろう。ちなみに、組込みソフト開発では大抵の場合センサやアクチュエータを使う。センサやアクチュエータは自然科学の法則を使ってできているので、センサやアクチュエータの動作について分析・設計するときは人間の曖昧さを考える必要はない。だから、解決の方向性は大抵一つの向きに収束する。でも GUI でどこに何を表示すると使い勝手がいいとか、どんなデザインパターンを使った方が開発効率がいいとかいう議論は好き・嫌いの要素も多分に含まれており大激論になって収束しないことも多々ある。

人間系の問題を考慮しないとソフトウェア工学が効かない理由はこんなところにあるのではないだろうか。

だからこそ、何らかのソフトウェアの方法論を使いたいと主張するときはその根拠を明確にし、関係者全員に共通する価値観をベースに説得すべきなんだと思う。組込み機器開発の場合、その共通の価値観とは顕在的価値と潜在的価値によって満たされる顧客満足であり、顧客満足を高めるために有効な方法論であることを説明できれば受け入れられる確率が高い。別な見方をすれば、商品に求められる価値が違う(例えば業務ドメインや制約条件の異なる)ソフトウェア開発で同じ方法論が有効に作用するとは限らない。

組込みプレス vol.8 の特集記事で書いた、QFD(品質機能展開)を使ったソフトウェア開発の方法論は、市場要求やユーザーニーズを分析して、商品の価値が最大になるような方向にソフトウェアを収束させようとする。これはまさに顧客満足を高めるための方法論であり、商品に求められる価値が異なる、業務ドメインが異なるソフトウェア開発でも顧客満足や商品の価値を最大にできるはずである。

物理法則やコンピュータを相手にしているときは仕事がサクサク進むのだが、相手が人間になるととたんにスピードが減速するように感じる。人相手のときは共通の価値観、共通の目的を一生懸命バックグラウンドで考えているのだが、だからといってうまくいかないこともある。

そんな頭の切り替えを一日の中で何回もしなければいけないからこそ、理系の研究者よりもソフトウェアエンジニアはガス抜きの機会を作らないともたないのではないかと思う。
 

2007-08-25

モデル駆動開発

SESSAMEで一緒のにしさんがブログでソフトウェアの自動生成を話題にしているので、今回は自動コード生成、モデル駆動開発について考えてみたい。

ソフトウェアの自動生成といっても設計行為がいらないわけではない。実際にはUMLなどでモデルを作ってそのモデルからコードを自動に生成するという話だ。ようするにソフトウェアシステムの抽象度を一段上げようという世の中の傾向のことである。

ソフトウェアをアセンブラで書いていた時代からC言語などの高級言語で書くように時代はシフトしたので、次は言語で記述せずにモデルを記述して、モデルからC言語、C言語からアセンブラといった変換の部分をツールにやらせようという考え方だ。

その背景には、10万行を超える高級言語で書いた組込みソフトウェアは絡まり合い、収拾が付かなくなり、不具合が起こっても問題の原因を追及しきれないことが多いことにある。

手続き型の言語に慣れてしまった組込みソフトエンジニアはC++などのオブジェクト指向言語を使うことに尻込みし、また、オブジェクト指向言語を使っても従来の手続き型の言語でも試行錯誤的プログラミングをやってしまう。

そういう状況を見ていると、いっそモデルしか書けないようにして、モデルからコードへの変換のアーキテクチャの中にアーキテクトのノウハウを隠蔽してしまった方が品質が上がるんじゃないかと思うこともある。

でも、何年かまたは何十年かして、もしそういう時代がきたとしても必ずモデルからコードへの変換がどうなっているのか、今使っているモデル変換のアーキテクチャを変化させる必要がないのかを常に考る技術者が必要になる。今でもC言語とCPU、アセンブラに精通し、Cからアセンブラへ変換するコンパイラを開発しなければいけない人たちが必要なのと同じだ。

ちなみに、組込みソフトエンジニアでハードウェア寄りのソフトを書いている人たちは今でもCPUやグラフィックコントローラなどのデータブックをぼろぼろになるまで読み込む。多くのソフトエンジニアのソフトウェア記述の抽象度を上げても、誰かが抽象度の上がったモデルと下層レイヤのソフトウェアやハードウェアとの橋渡しをしなければいけない。

ソフトウェアプラットフォームがPCの場合は、モデルからコードへの変換のアーキテクチャは一般化しやすいだろうが、組込みの場合、変換アーキテクチャを一般化し、変換アーキテクチャの寿命を長持ちさせようとすると犠牲にしなければいけないことが生じる。

組込みシステムの場合、市場要求が千差万別で機能だけでなく性能要件やコストの要件などもあり、制約も多いからトレードオフが頻繁に発生する。コスト要求からくるメモリやCPUパフォーマンスの制限をクリアするためのトレードオフは手続き言語のレベルなら何とかなることが多い。でも、モデル変換のアーキテクチャの中にトレードオフのパターンが隠蔽されていると最適なすり合わせができない。

モデル変換のルール・アーキテクチャにその製品や製品群特有のすり合わせ要素を注入することは可能だが、トレードオフのポイントが頻繁に変わるような商品だった場合、モデルベースの開発はうまみがなくなってしまう。

モデル変換のルール・アーキテクチャを変えない、プラットフォームを変えないことに固執すると、ソフトウェアの開発効率は上がるが、トレードオフバランスの調整やすり合わせによるまねされにくい強みを作り上げるというアドバンテージは減る。プラットフォームが共通になり、数少ないモデル変換アーキテクチャが組込みソフト開発の世界にも普及するようになると、組込みもアプリケーションソフトだけで勝負することになる。これでは他社がまねしにくいソフトウェアのコアコンピタンスを作り上げることが難しい。

プラットフォームの共通化、フレームワークの共通化は、PC+Windows の現状を見れば分かるように、エンドユーザとアプリケーションソフトウェア開発者にはメリットが大きい。でも、そのメリットとは裏腹にPCのハードウェアメーカは辛いだろう。ユーザはPCを買うときにSONYでも東芝でもNECでもDELLでもどのメーカのパソコンを選んでも使い勝手にさほど変わりがない。変わりがないというよりは変えられないのだ。ここまでプラットフォームや共通クラスライブラリが普及してしまうとハードメーカは独自の特徴を出すことができない。

組込みシステムに対するモデル駆動開発のポイントはトレードオフやすり合わせの必要がないGUIなどのアプリケーションソフトに絞って実施することではないだろうか。組込みソフトウェア開発では開発環境の選択であっても常にトレードオフのことを考え、顧客満足を最大にするポイントを探り続ける必要がある。

P.S.

にしさんのブログのコメントに自動車エンジニアさんが、【MATLAB/Simulink/Stateflow】を使った自動コード生成の実態を書いている。MATLAB/Simlink についてはこのブログでも『MATLABのビジネスから見る知的生産性とは』に記事を書いているが、自動車エンジニアさんの記述によると自動車の世界ではMATLAB/Simlinkを使ったモデルベース開発/自動コード生成は実用段階まで進んでおり、実際の車のソフトにも自動コード生成で作られたソフトウェアが実装されているそうだ。日経エレなどの雑誌の記事では読んだことがあるが、現場の生の声でその実態を聞くとリアリティがある。

モデルベース開発によってコードを自動生成する行為が商品の価値を押し下げる可能性がなく※1、実際の商品の動きからモデルやチューニングパラメータを類推されないのなら、モデルベース開発に移行した方がいいというのは理解できる。

※1 パフォーマンスを低下させたり余計にメモリを食ったり、自動コード生成を実現させるためにCPUのランクを上げてコストアップになったりすることが顧客満足を低くする可能性のこと)

また、高級言語でプログラミングするエンジニアの割合が減って、モデル駆動開発するのが常識になったなら、高級言語ですり合わせ開発してまねされにくいソフトウェア資産を作ることより、開発の効率化や品質向上のメリットの方が大きくなる時代もくるだろう。やっぱりトレードオフのバランスポイントが大事になる。

ただ、一つ気になるのはMATLAB/Simlinkのように、モデルベース開発のツールが一社独占になってしまうことのリスクだ。万が一何かの理由でつぶれてしまったり、IBMやMicrosoftなどの巨人に飲み込まれていきなりツールや保守の価格を10倍ぐらいにされても、その条件を飲まざるを得なくなる。

ソフトウェアは複製コストがほとんどかからないので何万台も何十万台も製品を作って売るメーカーなら開発ツールが少々高くてもエンドユーザーへの負担は少ない。逆にメーカーは高価なCPUを使ったり、メモリ部品を余計に追加したりして材料費が10円でも20円でも高くなることを嫌う。原材料費のアップはエンドユーザーまで行くと数倍の負担になってしまうからだ。

一般的な会社においては開発ツールの価格の高さに加えて、開発ツールのセカンドソースも考えておかないといけないところが辛い。競争相手が次々現れたとしてもコンパイラやRTOSもバグがないかとか信頼性は高いかとか考えないといけないのと同じように、アーキテクチャ変換ツールの信頼性について心配しなければいけない。

やっぱり自動車業界のように業界内での示し合わせができないと普及するのに時間がかかると思うなあ。 

2007-08-09

組込みソフトで勝ちたい人に捧ぐ

今回は宣伝が入っているのでへりくだってですます調でいきますです。

さて、技術評論社の 組込みプレス Vol.8 が8月11日に発売になります。特集1- 制約の多い組込みソフト開発-『効率化と品質向上2つのアプローチ』に寄稿&特集記事をプロデュースしたので内容を紹介したいと思います。

この特集1のサブテーマは「組込みソフト開発の心技体を鍛える」なんですが、開けてびっくり、特集2のテーマは「設計力」ブート★キャンプでした。組込みソフトもスポーツなんですね。

記事を読んでもそんなに疲れるものでもないので、今回の特集記事は夏休みの間にじっくり読んでいただきたいと思います。

今回の号は組込みソフトで「勝ちたい」人に最適です。もしも、あなたが組織の内外で認められ、発言力を増し、出世したいのなら実績を上げることが一番の近道です。組込みの世界で実績を上げるためにはヒット商品を開発したプロジェクトのメンバになっている必要があります。どんなに美しいアーキテクチャを構築しても、どんなに読みやすいコードを書いても残念ながらその成果を認めてくれる人は組織内にはほとんどいません。

組込みの世界では、どれだけたくさんの商品を売り、お客さんに満足してもらい、また次の新しい製品を買ってもらえるかどうかが勝負の分かれ目となります。あなたがサプライヤーの社員だったとしても同じです。ヒット商品のソフトウェアを供給できればそれが実績となります。

火消しが上手い人はかわいそうですが一つ火消しが終わると、もっと大きく燃え上がっている現場に投入されてしまいます。そうならないいためには、ヒット商品のソフトウェアの開発チームにいることが大切です。

今回の特集記事はQFD(Quality Function Deployment:品質機能展開)の技術を使って、市場要求や商品に求められる品質を分析し、組込みソフトの実装技術に結びつける方法を紹介しています。

ようするに売れる商品の要素を分析して、自分たちの得意な技術、他社がまねしにくい商品価値が凝縮されているソフトウェア資産を開発する方法なのです。これがうまくいけば、エンジニア個人としての自分も仕事が楽しくなるし、組織も売れる商品ができてありがたいし、お客さんにも喜んでもらえます。

特集記事の執筆者は酒井と、EEBOFのメンバーである安部田 章さんと、QFD研究の第一人者である山梨大学の新藤 久和先生です。安部田さんは QFD を基礎から丁寧に解説し、どのように組込みソフト開発に活かしていけばよいのかを書き、酒井は現状のソフトウェアシステムを分析してそのアーキテクチャを可視化した上でQFDを使うことで再利用資産を抽出する方法を示し、新藤先生はQFDの歴史と最新の研究を紹介しています。

安部田さんはトップダウン、酒井はボトムアップ、新藤先生はバックとフロントエンドの視点でQFDを解説するという、この一冊でQFDが丸ごと分かるというお得な特集となっています。

(特集2 では、SESSAME WG2 のメンバーである、山田、森、國方トリオが設計力強化のためのブートキャンプを張っていますのでこちらも注目)

もしもあなたが組込みソフトで勝ちたいのなら是非ご一読を。(ちなみに、商売とは関係のない研修者、学生のみなさんが読むと勝つ組込みソフトってどんなものかが分かります。)

【組込みプレス Vol.8 特集1 第1章 特集のはじめに より 引用】

 ユーザー要求や市場要求が明確になれば,組込み製品を使ってくれるユーザーの満足を高めるために何をすればよいのかが分かり,モチベーションの向上や改善への意欲につながります.ユーザー要求や市場要求を実現することができれば,自分自身の満足も高まり,商品が売れることで自分やプロジェクトの成果を組織に認めてもらうことができます.また,要求を満たすための技術が明確になれば,その技術を習得するという目標が定まり必要な技術を身につけるために最短の道筋を進むことができます.

 そして,ソフトウェア開発の途上でソフトウェアプロジェクトチームの意見が別れ,不協和音が聞こえてきても,「ユーザーや市場の要求をより満たすにはこちらの選択の方がよい」という導き方ができます.ソフトウェアエンジニアが10人も集まれば,それぞれの好みや癖により,ソフトウェア開発の方法論やアーキテクチャの選択に差異がでてきます.この差異を組織や会社間の上下関係により押さえつけてしまうこともできるでしょうが,それでは心技体の「心(技術者のモチベーションや改善への欲求)」や「体(チームビルディング力)」を下げてしまいます.

 市場やユーザーが商品に求める要求や品質が明確になっており,それらの重要度があらかじめ分かっていれば,そのときプロジェクトチームは何を取捨選択すればよいのか,どんな技術を習得すればよいのか根拠を持って判断することができます.プロジェクトリーダーの個人的な趣味や声の大きい技術者の好みではなく,ユーザー要求をベースにプロジェクトチームの舵を切ることができるようになります.欧米の責任と権限が明確に分けられたドライなソフトウェアプロジェクト運営と,パフォーマンスの高いうまくいく日本の組込みソフト開発のプロジェクトのあり方の違いは「誰のために仕事をしているのか」「今の仕事は何のためやっているのか」という部分の気持ちの持っていき方の違いであると言えるでしょう.

【引用終わり】

以上、宣伝でした。

2007-07-14

トム・デマルコの「プロジェクト管理」がわかる本

昨日、久しぶりに池袋のジュンク堂に行った。コンピュータ関連のフロアを一通り眺めてみた感じたのは、組込みソフトの本とテスト系の本がここ2~3年でかなり増えたなあということだ。

組込みソフトの本で痛切に感じたのは、組込みソフトだからといって作る対象製品を特定せずに、CPUや周辺デバイスをインタフェースするドライバや、ソフトウェアの作り方を一冊の本で説明してしまうのはどうかなということだ。

なぜかというと、組込みソフトは制約条件や業務ドメイン、商品群、商品を投入する市場によって、アーキテクチャが変わるし、目的を達成する方法も一つではないので、どんな組込みソフトの分野にも効くゴールドスタンダードはないからだ。

ゴールドスタンダードがあるように読者に期待させると嘘になると思う。だから、『組込みソフトエンジニアを極める』では電子レジスタ商品群という具体的なモデルを対象にして、要素技術から商品群全体のアーキテクチャ、品質向上技術、再利用施策について書いた。、『組込みソフトエンジニアを極める』の読者が、自分たちの業務ドメインでそこに書かれている内容を現場で活かすためには、電子レジスタのモデルで展開された具体的な例を、自分たちのプロダクトだったらどういう風に適用すればよいのか、どのように投影すればよいのか考えないといけない。

どんな組込みソフト開発でも「こんな風にやれば成功しますよ」とは書いていないので、もどかしいと思う方もいるかもしれない。仮想の電子レジスタの開発という具体例で、組込みソフト開発の全体の流れや、技術者としての考え方、モチベーションの持ち方をつかんでもらい、自分達の開発現場にその考え方を投影し、展開する必要がある。

そして、この本の中に出てくる個々のソフトウェア工学の技術、たとえば、リアルタイムOS、オブジェクト指向設計、要求分析技術、テスティング技術などはそれぞれ専門書で勉強して欲しいと思う。「こういときに、こういう専門技術が必要なのだ」というあたりをつけて欲しい。

『組込みソフトエンジニアを極める』は組込みソフト開発に対してエンジニアがどのようなスタンスで取り組めばよいのかを考えるガイドラインとしてとらえてもらえるとありがたい。そういう視点で見てもらうと、組込み系では他に類似する本はまだないと思う。

組込みソフトで難しいのは、ここの技術を深く掘り下げて解説する本は書きやすいのだけれど、それらの技術を使って個別の開発を成功させるにはどうすればよいのかについては、その商品をどんなもので、どんな市場に対してどんな制約下で作ろうとしているのかが分からないと最適な方法論をサジェスチョンできないという点だ。

だから、組込みソフトの商品開発に深く入り込んで、開発を成功に導いたコンサルタントはその方法論を知っている筈だが、守秘義務があるのでその核心部分を公にはできない。

さて、前置きが長くなったが、ジュンク堂で良い本を見つけた。『トム・デマルコの「プロジェクト管理」がわかる本―ポケット図解』(吉平 健治著)¥735- だ。

この本は、トム・デマルコの著書『ピープルウェア』『デッドライン』『熊とワルツを』のエッセンスを図解で分かりやすく示してくれている。同じシリーズに『ピーター・ドラッカーの「マネジメント論」がわかる本-ポケット図解』もあるので、これも後で買おうと思う。(ピーター・ドラッカーの原本の方は斜め読みがしにくくめげている)

『トム・デマルコの「プロジェクト管理」がわかる本―ポケット図解』もまだ、読み始めたばかりだが、最初の1-1がプロジェクト管理の本質を示していると思うので、最初の部分から全体を推し量ってもらうべくここで紹介したい。

【『トム・デマルコの「プロジェクト管理」がわかる本―ポケット図解』 1-1 プロジェクト失敗の本当の原因は? より】

1. 本当の原因は人間の中に存在する社会学的問題

 確かに生産性や品質は向上したでしょうが、実際、プロジェクトに対する要求の複雑化、規模の増大は、このような技術の対応だけでは追いつかないところもあります。デマルコは、プロジェクトの失敗の原因は技術的な問題ではなく、実は、プロジェクトとそのチームの「社会学的」な問題によって引き起こされていると宣言しています。チームメンバーの意思疎通が疎かになったり、働く意欲が欠如したり、あるいは退職してしまったり、プロジェクト管理者への不信感が募ったりなどなど、人そのものと人に関する問題がトラブルの原因になっているのです。そらに事態を悪くしているのは、この事実を管理者たちが理解していないことだと彼は言います。

2. 開発者は交換可能な部品ではない

 ソフトウェアは結束したチームによって開発され、他の多くのチームや部署とコミュニケーションしながらでき上がるものです。本当にハイテク技術を使っているのは一部の「研究者」と呼ばれる人たちで、ソフトウェア開発者は実際には「人間関係ビジネス」に携わっているのです。したがって、開発者を機械のように交換可能な部品として考えるのは大変危険です。この危険な傾向が管理者たちの間でまかり通っていると、デマルコは警鐘を鳴らしています。

【引用終わり】

他にもさまざまなベストプラクティスについて書かれているので、まず、この本を眺めてからデマルコの原書を読むとよいと思う。

2007-05-26

カイゼンを実現できる多能工を目指そう!

R30氏のブログ R30::マーケティング社会時評 の記事『ポリバレント=多能工って言えばいいんじゃね?』を読んで、トヨタ生産方式の強みについてどんな人材がカイゼンに向いているのかイメージが沸いた。

「Polyvalent:ポリバレント」とは本来は科学用語で、日本語の意味では「多能工」ということだそうで、「サッカーの日本代表にはポリバレントな選手を登用すべきだ」といった感じで使うらしい。この例では、ひとつのポジション(役割)だけでなく、いろいろなポジション(役割)をこなせるような人材が必要という意味だ。

さて、R30氏はポリバレント=多能工について次のように書いている。

【R30 マーケティング社会時評 「ポリバレント=多能工って言えばいいんじゃね?」より】

 ものづくりの世界での「多能工」の意味には、まず作業負荷の平準化がある。つまり、ある工程の作業ができる人というのがライン内に複数いることで、その工程の作業負荷が一次的に増えてもそれを前後の工程の人が分担できる、だから生産ライン全体で見るとボトルネックが生じにくい、というのがそれだ。

 ただ、多能工のメリットはそれだけでなくて、複数の工程をこなせるため仕事に飽きが来ない、複数工程にまたがる「カイゼン」の提案ができる、そして熟練すれば単工程の作業をこなせる人よりも多くの人から尊敬を集められる、といったこともある。言うなれば作業者のモチベーションそのものを高めることができまっせ、というのが多能工化の本質的な価値である、とトヨタ生産方式の中では言われているわけだ。

【引用終わり】

多能工の特長としてまとめると次の4つになる。
  1. 工程の作業負荷が一次的に増えてもその前後の工程の人が分担できる。
  2. 複数の工程をこなせるため仕事に飽きが来ない。
  3. 複数工程にまたがる「カイゼン」の提案ができる。
  4. 熟練すれば単工程の作業をこなせる人よりも多くの人から尊敬を集められる。
今、大規模・複雑化した組込みソフトの世界では複数工程にまたがる「カイゼン」の提案ができるエンジニアが少なくなっている。

もともと小規模なプロジェクトで組込みソフトの開発を行っていたころは、上記の4つは誰が指示するでもなく組織の文化として浸透していた。だから、TQC活動(カイゼン活動)も特に違和感なく現場に受け入れられていた。

ところが、作らなければいけない組込みソフトが大規模・複雑化し、設計・開発工程も長く、複雑になってくると、技術者の目標として多能工になるという意識がだんだん薄れてきた。

開発日程の縛りからくる締め付けが組込みソフト技術者から余裕を奪ったことが、多能工になりたいと思う気持ちを萎えさせる最大の要因だと感じる。

余裕がないから、自分の役割だけをこなせばいいやという感覚がプロジェクト内に広がってしまう。このブログサイトで再三書いているように、日本人の技術者は責任と権限が曖昧なまま作業を進める。そのため、責任が明確になっていない状態で自分の殻にこもられると、セクション間のインタフェースの認識違いなどが生じる。そうするとインタフェース仕様の調整などを誰かがボランティアでやらないといけない。

多能工を目指すでもなく、(人に指導できるくらいの)専門性があるわけでもない非常に中途半端な技術者が増えてくると当然「カイゼン」は進まない。

組込みソフトにおける多能工とは組込みアーキテクトのことだと思う。組込みアーキテクトは、要求と制約のトレードオフをしてアーキテクチャの最適化を図る必要があるため、要素技術の知識も必要だし、市場要求についても分析できないといけない。

組込みソフトの世界で多能工(=組込みアーキテクト)になれればカイゼンの糸口が見えるようになるし、自分自身のモチベーションにつながる。

以前、このブログで日本のソフトウェアエンジニアも責任と権限を明確化して仕事をしないといけないと書いたが、だからといって何かの技術の専門家に留まれとは言うつもりはない。責任と権限は意識しつつも、自分の周りの技術にも興味を持ち、「それは自分の領域ではない」とった壁を作らずに多能工を目指すべきなのだ。

それを実現するためには、エンジニアの中に心の余裕がないといけない。しかし、現実的には仕事に追われる日々を過ごしている技術者が多いだろう。でも若いうちに苦労して多能工的な幅広い知識とスキルを身につけておくと、徐々にその知識・スキルが生きてきて工程やアーキテクチャのカイゼン点が見えてきて、カイゼンを実行することによって作業効率を高めることが可能になり、さらにカイゼンを進めることができるという好循環のステージに入る。プロジェクト規模は小さかったけれど、自分はこの好循環のステージを経験したことがある。今では、どうしたら悪循環に陥っているプロジェクトを好循環に変えることができるのか試行錯誤しているところだ。まだ、結論はでていないが、実感としてプロジェクトメンバの中で多能工を目指す姿勢を持ったエンジニアがいることが条件であると感じている。

ところで、R30氏は『ポリバレント=多能工って言えばいいんじゃね?』の記事のなかで、多能工を嫌う人種として専門家ホワイトカラーのことをぼろかすに言っている。(R30氏のいつもの語り口なので、特にぼろかすではないのかもしれないが・・・)

【R30 マーケティング社会時評 「ポリバレント=多能工って言えばいいんじゃね?」より】

・・・いわゆる「専門家ホワイトカラー」系の世界の住人である。この方々は1つの領域に深く深くはまっている人にこそ最高の価値があると思っていて、複数の領域を股にかけて何の専門家なのかよく分からないぐらいいろいろな領域に足を突っ込んでいる人を、ことさら卑下するさげすむ傾向がある。

 「専門性」という名の下に隠蔽されたこれら「専門家」の視野狭窄、柔軟性のなさ、そしてもっとぶっちゃけて言うと「使えなさ」みたいなものは、最近とみに深刻だと思う場面が増えているのだけど、当の専門家の間にはそういう世間の評価に対する反省というのがまったくないというのがさらに深刻ですな。
要するに、知的退廃というヤツでしょうか。

【引用おわり】 (この後のくだりは過激すぎてちょっと書けません)

R30氏は、複数領域の専門性を併せ持っている「多能工」が高い価値を生み出すことができ、純粋学問と社会の間の「実務系学問」の領域くらい、多能工専門家の評価をもっと高くする仕組みがあっていいのではないかと書いているが、自分もまったくそのとおりだとおもう。

専門領域を横断して、要求と制約を最適化する多能工は価値の高い商品やサービスを生み出すことができる。しかしながら、そのような多能工はアカデミアの世界では評価されないし、多能工が解決する領域を研究する学会(たとえば失敗学など)は、専門領域の学会よりも下に見られているように思う。

ちょっと話がずれるが、学会やシンポジウムに論文を投稿する際のしくみをご存じだろうか。投稿論文はすべてが採用されるわけではなく、論文の査読者が投稿論文を査読しふるいにかけ、査読に通ったものだけが採録される。

通常、査読はその道の専門家数名が行う。大抵はアカデミアが行う。そして、投稿論文は採録される場合もされない場合も、査読者が“匿名”の状態でコメントが付けられ、投稿者に通知される。

ここで自分が引っかかるのは、なぜ査読者の名前を伏せるのか? という点だ。自分が投稿するときは多くの場合、多能工的なアプローチが解決する方法論なのだが、それに対する特定領域の専門家のコメントがしっくりこないこともある。このようなときは、コメントの真意を聞きたいこともあるし、場合によってはディスカッションしたいときもある。そもそも、ほめるにせよ、批判するにせよ、匿名でコメントをするというところに釈然としない何かがある。

専門家としてのプライドや誇りがあるのなら名前を隠す必要はないし、その後の意見交換で双方ともに有益な情報を得ることができるかもしれない。もしかして、「投稿者は査読者よりも下だからコメントに反論するなどもってのほか」、だけど、「専門以外の領域横断的なことを聞かれても答えられないから名前を出したくない」のでは、と勘ぐりたくなる。

ともあれ、価値の高い商品やサービスを生み出さなければいけない組込み製品の開発組織では、多能工を目指すでもなく、専門性もないような技術者を作らないようにしなければいけないし、専門領域に閉じこもっている技術者はカイゼン力が弱いということを認識しつつ、多能工でありながら自分の役割もキッチリ果たせるような技術者の育成に努めなければいけない。
 

2007-04-22

組込みソフトエンジニアが読むといいデジタル回路の本

久々に「この本は買いだ!」という本に出会った。

それは、『デジタル回路の「しくみ」と「基本」』という本だ。

組込みソフトエンジニアで電気設計担当の技術者と仕事で話をする機会がある技術者はこの本を買って最後まで読むと、彼らの言っていることが「ああ、なるほどそういうことだったのか」と分かるようになる。

また、組込みソフトプロジェクトのマネージャやリーダーで「こいつはハード寄りのことがわかってないなあ」と思う部下がいたら、この本を買って渡してやるといい。2500円なら間違いなくお買い得だと言える。

この本には、電子回路シミュレータ TINA7 日本語版の評価版が付属で付いてくる。この電子回路シミュレータが優れもので、いろんな回路を作れる上に、回路上のポイントにプローブを当ててオシロスコープで波形を眺めたり、3次元で部品類を眺めることができる。

著者は東京電機大学高等学校教諭の小峯龍男さんで、非常に丁寧に電気回路の初心者がゼロから学べるような構成で基本となることを一つずつ丁寧に解説してくれている。

例題の回路もすべて同梱されおり、最終例題として小さな CPU、電卓を作ってみるというゴールが設定されている。 『CPUの創りかた』 も良い本だと思ったが、『デジタル回路の「しくみ」と「基本」』はPC上のシミュレーションで電子回路を基礎から学ぶことができるところが良いところ。

例によって例のごとくはじめにの文章を紹介しようと思う。

【デジタル回路の「しくみ」と「基本」はじめにより引用】

 私がはじめて使った電子回路シミュレータソフトは、DOS(ドス)ベースのモノクロGUI(グラフィック・ユーザ・インタフェース)でした。それでも、シミュレーションした回路をワンチップマイコンへ転送して、実物のLED(発行ダイオード)や小型モータを制御できたときに感激は、オシロスコープ(波形観測器)で初めて期待する波形を出したときの感動と同様に今でも鮮明です。

 ここに「TINA」という素晴らしいシミュレータソフトがあります。我流でICをいじり始めた私からすると、何と便利なソフトかと思います。ひとつだけ残念に思うことは、TINAでは回路の組み立てに失敗しても、コンデンサをパンクさせたり、抵抗器の被覆焼け焦げたり、ICのパッケージが火傷するほど熱くなるという経験をできないことです。

 バーチャル体験を否定するわけではありませんが、工作少年だった私としては、指先のキーボード操作を学習するだけではなく、いつかは実際に本物の回路を作ってみて、実際の質感とはんだの溶ける臭いを経験することが大切だと今でも信じています。

 本書は、私自身のICとの付き合い方を思い出しながら執筆しました。それは、初めに動かしたいものがある。こうすれば動く、それは何故なのか。という教科書とは逆順の手法です。
 題材もゲーム感覚の回路を揃えました。何よりも目の前のパソコンが実験室に変わってしまうのですから、よくある教科書と違って最後まで絶対に飽きません。

 これからデジタルICの勉強を始めようとする方は、本書でイメージをつかんだら、いつかは基板の上に実際の回路を作ってみてください。また、すでに回路の実験を経験していて、本書でシミュレータソフトの挑戦する方は、パソコンの中で動く回路と測定器に新鮮な驚きを感じてください。

【引用終わり】

「はじめに」を見ただけで、この本の良さがいろいろ分かる。たとえば、DOSを(ドス)とふりがなをふり、GUIを(グラフィック・ユーザ・インタフェース)、LEDを(発行ダイオード)、オシロスコープを(波形観測器)と説明している。これだけ見ても小峯先生は小学生や中学生がこの本を読むことを想定していることがうかがえる。

中学生でも分かるように丁寧に書いているのだから、電子回路をまったくさわったことない組込みソフトエンジニアでも、電子回路の基礎が学ぶことができ、最後は簡易電卓が電子回路でどのように動いているのか理解できる。

また、小峯先生が書いている「回路の組み立てに失敗しても、コンデンサをパンクさせたり、抵抗器の被覆焼け焦げたり、ICのパッケージが火傷するほど熱くなるという経験をできないことが残念」というコメントも同感だ。「初めに動かしたいものがある。こうすれば動く、それは何故なのか。という教科書とは逆順の手法」というのも、自分の「具体から抽象へ」のポリシーとぴったり一致する。

電源のプラスマイナスを逆に接続し回路を壊してしまったり、コンデンサを「パン!」と鳴らしてしまったりする経験をすることが、ものづくりの実感につながる。

小峯先生のような方の下で勉強できる高校生は幸せだと思う。でも、この本を最初から最後まで通していろいろな回路を実験してみることで、小峯先生の授業を受けたことと同じ体験をすることができるだろう。

付属しているTINAも非常にすぐれたシミュレータで、印刷できないなどの制限はあるものの、この本にある例題を一通り体験できることから、電子回路の基礎を学ぶための道具としては、この上ないツールである。

この本をマスターした部下が「自分はデジタル回路のおもしろさに目覚めました。ハード屋さんに転向させてください。」なんて言い出しても僕を恨まないでね。
 

2007-03-19

組込みでUMLは何のために使う?

あるソフトウェア技術者の方から、UMLについて問い合わせを受けた。その後、UMLツールやこの本を紹介したら次のような追加質問をもらった。

【追加質問】

詳しいご回答をありがとうございました。
書籍は早速購入しました。
UMLツールを使う上で、オブジェクト指向から学ばなければいけないと思っているのですが、どのようにオブジェクト指向とUMLを勉強していけば良いでしょうか?

【追加質問終わり】

この追加質問の内容で、「UMLツールを使う上で、オブジェクト指向から学ばなければいけないと思っている」というところにちょっと引っかかりがあった。実質的にはそうなのかもしればいが、安直に UML = オブジェクト指向 関連付けると、組込みの場合特に足を踏み外しそうな気がする。

そこで、以下のような返信を書いた。

【追加質問に対する回答(抜粋)】

UMLは表記法です。極端な言い方をすればフローチャートと同じ表記法です。ただ、フローチャートよりは書き方を修得するのに時間がかかります。

では、なぜ修得に時間のかかるUMLを覚えるのか? 

UMLが国際標準の表記法となりつつあり、UMLで書いたモデルはたぶん10年近くは(UMLの表記法を認知している人の中で)通じます。

通じるというのは、UMLのダイアグラムを見ながらディスカッションすれば、ソフトウェアの静的な構造や振る舞いについて、素早く認識できるということです。ソースコードを見ながら議論するよりは、絶対効率的です。

プロジェクト内部だけで通じるブロック図でもいいかもしれませんが、プロジェクトの規模が大きくなって独特なブロック図の表記法について質問してくる人が増えたり、新しい人が入ってきたりすると毎度毎度説明しなければいけません。説明しないでもいいくらい単純な図だと、複雑なソフトウェア構造を示すことができないでしょう。

また、ソフトウェアの開発を海外を含む外部に委託するような場合も同じです。ソフトウェアの構造や振る舞いを共通の記述方法で示すことができれば、表記法の説明を省いて本題に早く入れるようになります。

でも、そんなに大きなプロジェクトではないチームだってあります。では、非常に狭い範囲だけでUMLを使うメリットはなんでしょうか?

同じ市場に対して、同じような製品を、同じメンバーで作り続けている少人数のチームがあった場合、UMLでソフトウェアの構造や振る舞いを表記する必要があるでしょうか?

答えは YES です。

理由は、自分たちのために必要だからです。同じ市場に対して、同じような製品を、同じメンバーで作り続けている少人数のチームであっても、ソフトウェアの規模は年々大きくなっているはずです。この規模が大きくなってしまったソフトウェアシステムの構造や振る舞いをUMLで表現することには意味があります。

例えば次のような目的のためです。

-UMLを使う目的-
  1. 全体を俯瞰して、どのような責任分担でソフトウェアが分割されているのかが分かる。(上記のようなチームであれば、このモジュール分割が技術者の責任分担にもなる)
  2. 分割されたサブシステム同士の関係(依存関係、呼び出し関係)が分かる。(サブシステムの独立性を高めるのに役立ちます)
  3. システム全体もしくは一部の状態遷移が分かるようになる。(状態遷移図・・・古典的ですがやっぱり分かりやすいです)
  4. そのシステムで何かをしたいときのシーケンスを表現できる。(役割分担と手順が分かると、具体的に何をすればいいか見えてきます)

いままでの小規模なソフトウェアプロジェクトでは1~4までの内容は、そのシステムの構造や振る舞いを最初に設計した技術者(アーキテクト)の頭の中だけに暗黙知として存在していました。考え方によっては、その技術者(アーキテクト)をチーム内にずっとキープしておければ、次々に新しい製品を開発できるとも言えます。

しかし、ソフトウェアシステムの規模は一人のアーキテクトでは把握しきれないくらいの大きさにまで拡大しており、また、ソフトウェアシステムに対する要求が複雑化すると、システム全体の構造を熟知しているアーキテクトしか分からない仕事が増えてしまい、そのアーキテクトの仕事が集中し、ついには破綻させてしまったり、その組織から逃げ出されてしまったりします。

悪循環から脱しきれないソフトウェアプロジェクトは、代わりとなる優秀なアーキテクトを探そうとし、人材不足の世の中、結局代わりのアーキテクトは見つからない場合もあるでしょう。その場合は、残されたメンバーで全体構造がよく分からないままソフトウェアを付け足し続け、最初のアーキテクチャを崩ししてしまい、悪循環のスピードを速めてしまいます。

また、運良く変わりのアーキテクトを見つけることができた場合、見つけられてしまったアーキテクトは前任のアーキテクトと同じように過負荷にさらされることになります。このとき、ソフトウェアシステムの構造や振る舞いを示すドキュメントが存在しないと、ソースコードからそれらを分析することになり、立ち上がりには相当な時間を要するでしょう。

もしも、ソフトウェアシステムの構造や振る舞いをUMLで表現できれば、次のような可能性がでてきます。

-UMLでソフトウェアシステムの構造や振る舞いを可視化できると・・・-

  1. サブシステム単位で力のいれ具合に強弱を付けることができる。(まずは、このサブシステム、このモジュールの信頼性を高めようというアプローチが可能)
  2. 再利用資産を抽出することが可能となり、開発の効率を高めることができる。
  3. 不具合が起こったときに、原因となるサブシステムやモジュールを特定しやすくなる。(責務で分割されているため、発生した現象から原因を作った犯人を見つけやすい)
  4. 新たな要求が降りかかってきたとき、どのサブシステムやモジュールに影響を及ぼすか事前に分析できる。
  5. 新たな要求が降りかかってきたときに最小限の変更ですむような、システム構造を変更できる。(アーキテクチャの見直し)
新しい技術を習得しようとする際に大事なのは「何のためにその技術を取り入れるのか」をよく考えておく必要があります。場合によっては、「世の中の流行」や「自分の好み」が理由かもしれませんが、それだけでは、組織やプロジェクトのメンバーを説得するのは難しいでしょう。

新しい技術を習得するためには、時間や費用が必要です。こられのリソースを確保するためには、組織に対しては修得した技術で開発効率やソフトウェア品質を高め、顧客満足を高めることに貢献できることを説明し、プロジェクトメンバーにはその技術の習得が余裕を生み、クリエイティブな仕事ができるきっかけになることを示さなければいけません。

UMLをなぜ使うのかをしっかりと考えて、先に進んでください。

  :

【追加質問に対する回答の抜粋終わり】

P.S.

上記の回答文章は質問に返信するつもりで書いたが、結局はブログネタとして使い本当の回答文章はもっともっと簡略化した。だって、こんな長い文章をメールで返信したらどう見てもへんでしょ。
 

2007-03-10

組込みソフトは「見える化」より「見せる化」

近年、ソフトウェアの分野で要求分析の重要性が叫ばれている。対象となるソフトウェアに求められている要求をしっかり分析することはもちろん重要だが、特定のクライアントがエンドユーザーとなるビジネス系の受託開発ソフトウェアと、特定の分野の不特定多数のお客さんに提供する製品に搭載する組込みソフトウェアでは、ソフトウェアに対する要求についての考え方を変えなければいけない。

組込みソフトにはさまざまな制約条件が科せられるため、要求のすべてを満たすことが難しい。要求が多様になればなるほとリアルタイム性能などの性能要求を満たすことが難しくなるし、性能の高いプロセッサを使うことを余儀なくされコストアップにつながってしまう。

パソコンをプラットフォームとするアプリケーションソフトウェア開発では、組込みソフトウェアに比べれば遙かにリッチなプラットフォームが存在し、競争相手もまったく同じ環境で開発を行うことが分かっているので、要求と制約条件のトレードオフに頭を悩ませるより、ユーザー要求を間違えることなく、できるだけ早くすべて満たすことが目標となる。

ここには、組込みソフトのような強い制約条件や頻繁に発生するトレードオフは存在しない。

ところが、組込みソフトの場合は、エンドユーザーは特定分野の不特定多数のお客さんであり、必ずしも要求は「これだ!」という確約の採れたものではないし、求められるのは機能だけでなく、性能もあるし、安全性や信頼性も要求され、コストは安ければ安いほど喜ばれる。

そうなれば、当然要求に対して何をどれくらい実現すればよいのかについて優先度を付ける必要があり、その分析結果と、自分たちの得意なスキルを照らし合わせて、トレードオフをし、自分たちの商品でどんな機能と性能を実現するのか決断しなければならない。

最近の情報家電を見ると、商品に求められる要求の分析、特に優先度付けやトレードオフが必ずしも十分にできていないように思える。

例えば、5年前に買った 29インチのブラウン管のテレビは5万円台で非常にお買い得だった。ところが、このテレビ買って後悔したことが一つある。電源を入れてから画面が出るまで12秒かかるののだ。音声はタイムラグなしで出力されるのだが、映像が10秒以上かかるのは、せっかちな自分には耐え難いしうちだ。

また、2年前に買った250Gバイトのハードディスク内蔵のDVDプレーヤも5万円台でお買い得だった。こちらは、画面はすぐでるのだが、システムのイニシャライズが終わるのに20秒近くかかり、電源を入れてすぐに録画予約をすることができない。しかも、DVDのディスクが入っている状態で電源を入れるとシステムのイニシャライズ時間は30秒に伸びる。

新しい機能のほとんどを使いこなすことができず、昔使っていた VHSのビデオデッキと同じくらいの機能しか使わない一ユーザーにとって、この状態は性能のデグレードになる。

もちろん、メーカー側にはそれなりの理由があって、多用な要求を満たして他社とカタログスペックで負けないためには、Linuxなどのプラットフォームを搭載する必要があり、さまざまな内蔵デバイスの診断や、メモリチェックや OSの立ち上げをしている間に10秒くらいは立ってしまうのだろう。

でも、自分というユーザーにはそんなことはどうだっていい。電源入れたら早く立ち上がって、基本機能を使えるようにして欲しいのだ。そして、電源の立ち上がり時間で痛い目にあったので次からは素早く立ち上がる機種を選ぶ。もしも、その機種が他社に比べて機能がちょっとくらい少なくたってかまわない。基本機能を早く使う方が自分にとっては大事なのだ。

自分はこのような不満が自分だけの不満だけではないと考えている。だとすると、この情報家電を作ったメーカは先に挙げた、組込みソフトにおける要求の優先度付けに失敗していることになる。

おそらく、パソコンと同じようなプラットフォームを用意した時点で、組込み機器における制約条件やトレードオフのことを忘れてしまったのだろう。

ただ、現場のエンジニアは要求の優先順位に矛盾が生じていることについて、実はよくわかっているという意見もある。プロジェクトが大きくなってしまったり、組織が決めた方針を覆すことができないため、ユーザー要求の優先度がいびつになってしまった商品ができあがってしまっても、自分の力ではどうしようもないというのだ。

一昔前なら、ユーザーニーズの調査や商品企画、プラットフォームの選定などは、組込み機器開発のプロジェクトメンバーが行っていた。その状況なら、お客さんの要求と自分たちの得意な技術を考慮して、要求と機能・性能の実現の最適化が可能だった。

ところが、今ではプロジェクトの規模が大きくなり、要求も多様化してしまったため、要求の正確な分析と要求の実現能力のバランス判断が崩れている。

今、組込みソフトエンジニアの求められているのは、ユーザー要求の分析と自分たちの得意なスキルでどの要求を実現するのかを可視化して、自分たちの技術でどんな商品を作れば顧客満足を最大にできるのかという設計のコンセプトを明確にすることである。

組込みソフトウェア開発の世界では「見える化」をもう一歩踏み込んで「見せる化」が必要になっている。

ユーザー要求・市場要求の正確に分析し、その分析結果を基にソフトウェアシステムをどのように構築するのか、何がこの商品のアドバンテージになっているのか、何かこの商品のコア資産なのかを、組込みソフトエンジニアが可視化し、それを組織に示し、アーキテクチャ設計を主張し、場合によってはそのアーキテクチャを実現するためのプラットフォームを選択して、その選択の実現を組織に迫らなければいけない。

また、すでに自分たちが何世代かにわたって作り上げたソフトウェアシステムの構造を見えるようにして、どの部分がコアな資産であり、そのコア資産の品質を高めるために、何をしなければいけないのかを明確にし、そのために必要な環境や工数、費用を主張する必要がある。

そうしなければ、組織が決めた環境を、顧客満足が最大にできないことを知りながら使い続け、割り切れない気持ちを引きずることになる。

これを避けるために組込みソフトエンジニアがやるべきことは自分たちが「選択したもしくは選択したいアーキテクチャ」が顧客の要求にフィットしているということ可視化して主張するための「見せる化」だ。

それをしないと、プロジェクトはどんどんネガティブになって、メンバーには受け身の考え方が蔓延し、現場は問題解決の力を持っていながら顧客満足の高い商品をアウトプットできなくなり、競合に負け、価格を下げることでしか勝負できなくなり、忙しさは変わらずに給料が下がるという悪循環に陥ってしまう。

この悪循環を断ち切るための組込みソフトウェアシステムにおける要求分析の方法とその実践の仕方については、いずれわかりやすく説明する機会を作りたいと思う。


【組込みソフトで要求の重要度を分析しなければいけない訳】

組込みソフトウェア開発では要求の洗い出しだけでなく、要求の重要度を分析する必要がある。

  ↓なぜ

組込みソフトウェア開発では要求を実現する際にトレードオフが発生しやすいため、要求が示す意味と優先順位を分析し分析した結果を明示的に残しておくことが重要となる。それが、商品の開発コンセプトにつながり、どの他社の商品との差別化につながる。

また、その組織が独自に持っている強み・得意な技術を、顧客要求の強い部分にぶつけることができれば、競争力の強い商品を作り上げることができる。

2007-02-12

組込みソフトの作り方[3]

マイコンがシーケンス処理からリアルタイム制御のコントローラにステップアップしたころ、割り込みを使うことで今までやっていた処理を横に置いて、急いでやらなければいけない処理に対応できるようになった。

ただ、割り込みに使える要因は4つとか7つとか数に限りがあったため、メインループでグルグル回る処理と割り込み処理だけでは、複雑なリアルタイム制御のプログラムをスッキリと書くことはできなかった。

そうこうするうちに、マイコンは進化を遂げて、割り込みコントローラ、拡張ポート、タイマー、A/D変換器、D/A変換器など、リアルタイム制御に使いそうな周辺デバイスとCPUをパッケージにしたワンチップマイコンが登場してきた。

ワンチップマイコンが現れる前は モトローラの 68000 や ザイログの Z80 などの汎用のCPUに周辺デバイスを配線して使っていた。

ワンチップマイコンのおかげで、このような周辺デバイスを配置することなく、ワンチップマイコンの中だけで多くのことができるようになった。

ただ、そのせいでワンチップマイコンの取り扱いは複雑になり、ワンチップマイコンの取扱説明書は分厚いもにになってきた。(ハードウェアデバイスの資料はデータブックと呼ばれるが、ワンチップマイコンの場合、データブックというよりは取扱説明書といった方が近い)

このことから、主にワンチップマイコンを専門に扱うエンジニア=組込みソフトエンジニアという構図が生まれてきたように思う。リアルタイムシステムにおいてワンチップマイコンを使いこなすには、ワンチップマイコンの取扱説明書を熟読する必要がある。

なぜなら、取扱説明書にはCPUのレジスタ構成やアセンブラの命令の説明だけでなく、割り込みコントローラやA/D変換器、タイマー設定など数多くの周辺デバイスの初期設定の方法や起動や停止の仕方について事細かに書かれているからである。

これらの設定を間違うと、思った通りに動かないため、最初にうちは周辺デバイスの設定をマニュアル読みながら、少しずつ習熟していく。

このようなワンチップマイコンとの格闘が一通り終わると、リアルタイムシステムをこのマイコンでどうやって実現しようかと考えることになる。

一番簡単な方法は、各種割り込み処理に、10msとか100msなどの一定間隔でタイマー割り込みを追加する方法だ。割り込みコントローラに登録しておくのは、非常に早い応答が要求される処理で、ハードウェアリアルタイムと呼ばれる。それ以外のもうちょっと対応が遅れてもよいソフトウェアリアルタイムの処理は、前述の定時割り込み処理でイベントが発生したかどうかを巡回しておけばよい。

たとえば、キーが押されたかどうかを察知し、割り当てられた処理を起動するまでの許容時間は数百msである。500ms以上かかると遅いと感じるが、200ms以内にレスポンスを返すことができればサクサク動くと評価されるだろう。

そう考えると、10msの定時割り込みでキーが押されたかどうかをチャタリング取りながら80msくらいかけて調べ、起動をかければ十分に間に合う。

定時割り込みでイベントをウォッチし、イベントが発生したら該当する処理を行うようにする。該当する処理に長い時間がかかるようなら、各イベントに割り当てたフラグを立てておき、時間に余裕のあるときにこの処理を実施しておく。

この続きはまた今度。

2007-01-27

組込みソフトの作り方[2]

組込みソフトの作り方[1] で、マイコンが登場したとき(1980年代前半)マイコンはハードウェアデバイスのシーケンスをトレースするために使われていたと書いた。マイコンはトレースする順番が変わってもROM上のプログラムを書き換えることで対応できるので重宝された。

マイコンに求められたシーケンス制御の次のステップは、リアルタイム性の実現だった。

リアルタイム制御システムで必ず必要になるのが“割り込み”の機能だ。

組込み機器の多くは、外界の状況変化にともなって制御シーケンスの流れを変える必要がある。いつも同じ処理をぐるぐる回していればいいような機器はあまりない。

このような外部状況の変化を察知して、制御シーケンスの流れを変える場合の一番簡単な方法はポーリングである。

外部状況をセンシングしその様子をマイコンの入力ポートで見られるようにし、このポートの状態をウォッチし続ける。そして状態が変化したら、これまでやっていた制御シーケンスの流れを変える。

ここで大事なのは、一般的なマイコンはコアとなるプロセッサはひとつであり、同時に2つのことはできないということだ。同時に2つのことはできないから、外部状況の変化を知るためには、たまに今やっている仕事を中断して外部の様子を見に行かなければいけない。

割り込みの機能を使わない場合、組込みソフトエンジニアはよく簡易モニタというしくみを使っていた。簡易モニタとは定常的にぐるぐる回るループを用意しておき、このループの中で外部状況の変化をウォッチしておき、外部状況の変化を察知したら制御シーケンスが書かれたサブルーチンに飛び、その処理が終わったらまたループに戻るというしくみだ。

外部状況が変化したときに、サブルーチンに飛ばさずにフラグを立てておいて、ループの切りの良いところで処理を行うという方法もあった。このやり方を新人のときに覚えてベテランになった組込みソフトエンジニアはグローバル変数を使ってフラグ処理を多用する者が多い。このグローバル変数を使ったフラグ処理を多用すると、フラグを通じて関数と関数の結合度が強くなってしまうためキレの悪いソフトウェアシステムができあがってしまう。

最初からオブジェクト指向言語でプログラムを書き始めたソフトウェアエンジニアがこのようなプログラムを見ると仰天するかもしれないが、この風習は組込みソフトの歴史がそうさせたともいえる。

さて、ループ処理で外部の変化を察知するやり方はリアルタイム性が強く求められるシステムには向かない。この問題を解決するためには、割り込みの機能が必要になる。

だから、初期のマイコンでは何はなくとも割り込みコントローラは付いていた。割り込みが発生したときに、今行っている処理を横に置いておいて、割り込み専用の処理を走らせることができる。(もちろん、それまで使っていたレジスタはスタックに退避しておく)

割り込みが使えるようになると、リアルタイム性をそれほど必要としない、ぐるぐる回る定常処理+割り込み処理という組み合わせで、ほとんどのことができるようになる。

これが、マイコンがシーケンス処理からリアルタイム制御のコントローラにステップアップした瞬間だ。

この後のマイコンの変遷は 組込みソフトの作り方[3]で紹介する。

2006-12-16

組込みソフトの作り方[1]

本論に入る前に、先週の「MATLABのビジネスから見る知的生産性とは」の記事について、ある方からコメントをいただいた。

【「MATLABのビジネスから見る知的生産性とは」の記事について】

ブログいつも拝読しております。
MATLAB と Simulink には上記のような試行錯誤で作り上げる職人芸のような要素はない。

とありますが,ここは私はちょっと別の感想を持ちました。

というのは,最近ではクルマの制御ソフト開発で,MATLAB/Simulinkからの自動コード生成がかなり普及していて一部のサプライヤでは,MATLAB/Simulinkの枠内で,職人芸的なことをやっていると思います。なので,一概に「ない」とも言い切れない状況かなと感じるのです。
MATLAB , Simulink が、研究者と開発現場のエンジニア、科学技術を必要としている企業の橋渡し
とあるように,自動車業界でも,自動車メーカーとECUサプライヤの間では,MATLAB/Simulinkモデルが仕様書のスタンダートになっています。自動車メーカーが作ったモデルは確かにdoubleの世界ですが,これを受け取ったサプライヤは,モデルがマイコンで走る実際のソフトになるようfixed pointに書き換えるなど,実装に伴う苦労をしているわけです。

10年前は自動車業界でも,その苦労は一般の組み込みソフト開発と同じCプログラム上での試行錯誤でしたが,現在では自動コード生成が普及し,すっかりMATLAB上での試行錯誤に変わっています。

要は,『MATLAB/Simulinkだと職人芸がない』というよりも,『職人芸をインプリする抽象度が,より上のレイヤーに移っている業界も中にはある』というのが現実ではないでしょうか?

以下に詳しい資料があります。


●日経エレクトロニクス 2003年12月22日号,no. 863,What's New,p.27.
「ソフト開発でトヨタら先駆け,量産品に自動生成のコード」

●日経エレクトロニクス 2005年8月29日号,no. 907,What's New,p.42.
「自動コード生成の適用拡大,トヨタが来年開発車種から」,


【引用終わり】

メールをもらって、「なるほど、組込み業界の中でも自動車業界は進んでいる」と思った。でも、これって巨大な市場がある業界だからだろうなって気もした。いずれは多くの組込み業界もC言語プログラムをすり合わせるのではなくモデルをすり合わせるような方向に進んでいくのだろう。しかし、どんなに時代は進んでも組込みには職人芸が付きものっていうのがいいね。

さて、今回の記事の本題に入ろう。

このブログを読んでいるのは必ずしも組込みソフトエンジニアではないと思う。IT系のソフトウェアエンジニアもいるだろうし、学生やアカデミアンもいるだろう。

つい最近、組込みソフトを経験していないどころか、技術系でもない方に「いったい組込みソフトってなんですか」と聞かれたことがある。毎日毎日組込みソフトのことを考えていると、周りの人のが持っている組込みソフトの知識レベルは何ら変わっていないのに、自分の中だけで知らず知らずのうちに周りの人も組込みソフトについてよく知っているかのように思ってしまう。

何か一つのことにのめり込んで知識を蓄え、そのことについて友人からとんちんかんなつっこみをされるとつい「そんなことも知らないの?」とバカにしてしまう。その傾向がどんどん強まっていくとその人は周りの人からオタクと言われるようになる。

さて、組込みソフトエンジニアが外部のコミュニティで活動していると、組込みや組込みソフトのキーワードに触れる機会が多くなり、「組込みの認知度が高くなってきたから、組込み機器や組込みソフトに対する理解者は何もしなくても増えるだろう」と勝手に楽観的な未来を想像してしまうことがある。

でも、それは間違いだ。組込みや組込みソフトが世の中のどんなところで役に立っているのか、また、パソコンのアプリケーションソフトの作り方と何が違うのかについての説明を積極的に発信していかないと、組込みや組込みソフトの対する理解は深まらない。

そこで、今回は「組込みソフトはどのように作られてきたのか」について書いてみたいと思う。これは『組込みソフトエンジニアを極める』の第一章に書いてある内容に近いが、第一章に書いた視点とはまた別の視点で組込みソフトの原点を考えてみた。


[1] 組込みソフトの誕生

そもそもマイクロコンピュータが生まれる前は組込みソフトなるものは存在していなかった。現在の巨大化した組込みソフトは組込みソフトが誕生したときに比べると求められている役割が変わっている。現在、組込みソフト開発の現場で起こっている数々の問題は、組込みソフトに求められる役割の変化について組織の上位層やベテランエンジニアが理解できていないことに原因があるように思えてならない。

そう考えると、組込みソフトが誕生したときの最初の役割がなんだったのかについてきちんと理解しておかないと、現在の変容した役割との差異が明確にならないし、その差異を説明することもできない。

マイクロコンピュータが発明され一般の製造業種にも利用できるようになると、組込み機器の開発の中にこれまでにはなかった新しい環境が生まれた。当然だが、そのころ製造業の中には組込みソフトエンジニアどころかソフトウェアエンジニアと呼ばれる職種もなかった。もちろん、そんな昔でもメインフレームなど大型計算機の世界ではソフトウェアエンジニアは存在していたし、製造業に携わる技術者も大学なので大型計算機を使ってプログラムを書く経験はしている。(プログラムの一行一行を一枚のカードにパンチして読み取らせたりしていた) でも、メインフレームのソフトウェアを書くことを仕事をしていたエンジニアと組込み機器の開発から生まれた組込みソフトエンジニアの出発点は実はまったく異なる。極論を言えばメインフレームの世界で培われたソフトウェア工学の技術は組込みの世界でも使えるけれど組込み向けにテーラリングしないと現場に浸透しない場合が多い。その原因はこの出発点の違いだと常々思っている。

マイコンが初めて組込み機器に使われるようになったころ、ハードウェアエンジニア、特に電気系のエンジニアの中では、アナログ系とデジタル系という役割分担はおぼろげながらできあがってきていた。自然界に存在する情報はアナログ情報だからセンサでセンシングするときはアナログ設計の技術が必要だ。しかし、アナログ情報をデジタルに変換した後はデジタル系のハードウェアエンジニアの出番となる。デジタル系のハードウェアエンジニアは規格化されたロジックデバイスを組み合わせて目的のデジタル回路を設計していく。

マイコンが登場したときにマイコンをプリントP板上に配置し、他のロジックデバイスと接続したのはデジタル系のハードウェアエンジニアだ。そして組込みソフトエンジニアが誕生する以前はデジタル系のハードウェアエンジニアがマイコンのプログラムを書いた。

デジタル系のハードウェアエンジニアは当時どのように仕事をしていたのだろうか。だいたい、次のような手順で仕事をしていたと考えて大きな間違いはないだろう。

<昔のデジタル回路の設計手順>
  1. デジタル回路の使用目的を考え、必要なロジックデバイスが何か目星をつける
  2. ロジックデバイスには必ず部品メーカが作ったデータブックがある。このデータブックを読んで、使用目的に耐えうるかどうか調べる
  3. 選んだロジックデバイスをつなぎ合わせて回路図を作る
  4. 実際にロジックデバイスの部品を入手し、マルチP板(穴がいっぱいあいていてすべての配線を自分で半田付けして行うためのP版)に部品を配置し設計した回路図どおり配線する。
  5. 電源をつないで思った通りに動くかどうか試してみる
  6. ダメだ。動かない。3にもどって回路図や配線を見直し想定した動きになるまで繰り返す。
  7. マルチP板の試作ボードが動いたら、本番用の配線をプリントしたP板を設計し生産する。
  8. 上がってきたP板に部品を載せ半田付けして完成させる。

この流れのうち、3~6の繰り返しは非常に効率が悪い。場合によっては部品を壊してしまったりもするので、きちんと完成するまでにどんどん時間は過ぎていく。この失敗の繰り返しを積み重ねていくとその製品や製品群に合った回路のパターンが見えてきて、その回路のパターンを再利用することになる。実際にうまくいった実績を持つ回路は珍重されることになり、新人は一から回路を設計するのではなく、先輩達が作った実績のある回路を眺めて、それを参考にするという手順が生まれる。

こんなことを繰り返しているデジタル系のハードウェアエンジニアのところに、マイコンという電子部品が現れた。マイコンという部品は他のロジックデバイスの接続に成功していれば、プログラムを書き換えることで上記の3~6を繰り返す必要がなくなる。組込み機器への入力の変化に応じて出力を変えたいときなど非常に便利だ。電子回路で要求仕様を満たすすべての組み合わせを設計していたら配線が間違っていたり、仕様が変わったりして手戻りが非常に大きい。

でもマイコンを使えばプログラムを書き込んだROMを差し替えることで間違いや仕様の変更に対応ができる。このころマイコンは自由度の高いシーケンサーだった。デジタル系のハードウェアエンジニアはロジックデバイスの延長線上としてマイコンという部品を見ていたと考えられる。

当時ROMに書かれていたプログラムは処理の流れのシーケンスが書かれていたのであって、ソースコードが設計要素のすべてであり、設計仕様やテスト仕様などの情報は必ずしも必要ではなかった。仕様書やテストの結果がなくても、誰からも怒られることもなかった。 なぜか? それはソースコードはたいした量ではなかったし、ちょっとだけコメント書いておけば、どんなシーケンスで動いていくのかソースコードを追うことで理解できたし、ソースコードを追っかけることは回路図の配線を確認することと対して違いがなかったのである。

また、電子回路のテストはよっぽどのことがなければ、シミュレーション環境を用意して事前に確認するような大がかりなことはしなかったから、回路図の見直しや配線のチェックは机上でしていたものの本当の思った通りに動くかどうかは試作用のP板を作るまではわからなかった。要するに動かしてみて、その動作から問題点を見つけて直すという手順だ。

マイコンが導入されたころは、これと同じ手順でプログラムが作られた。頭の中でシーケンスを思い浮かべながらコードを書き、プログラムをROMに書いて電源を投入し「さあ、動くか!」と息を飲む。

いろいろなパターンを想定してプログラムを作ったから、そのすべてのパターンを実際にテストしてみて、動作を確認しながら完成度を高めていく。

[2] そこで現役を卒業した技術者はソフトウェアはそういうものだと考え思考が止まる

シーケンスプログラムを実装し、試行錯誤で想定したパターンを実際にやってみて完成度を高めるという手順でプログラムを書いていたデジタル系のハードウェアエンジニアが管理職になって自称「ソフトウェアを作ったことのある」プロダクトマネージャや技術部長クラスになるとどうなるか。

<デジタル系ハードウェア技術者出身のプロダクトマネージャの頭の中>
  1. ソフトウェア(実際頭の中に浮かんでいるのはプログラムコードのこと)はソースコードが設計図
  2. 実装してからいろいろなパターン(テストケース)を試して完成度を高める
  3. バグが残るのは想定したパターン(テストケース)に抜けがあるからであり、パターン(テストケース)の想定漏れは経験のなさからくる

このような経験を持つ上司のもとで巨大化した組込みソフトウェアを作らなければならない組込みソフトエンジニアは間違いなく苦労することになる。

バグの原因はすべて「パターン(テストケース)の想定漏れ」であり、その原因は「エンジニアの経験不足」になってしまうからだ。

人間の脳の情報処理は具体的な体験、経験を階層的に抽象化しながら記憶していき、蓄積された記憶に新たに刺激を与えて出力されたアウトプットで思考が進む。だから、具体的な体験や経験の抽象化の階層が浅いと具体的な自分の経験に合致しない出来事は理解できないか、自分の体験に一番近いもので連想された答えが自分の感覚としてアウトプットされる。

だから、ソフトウェアのバグ=経験不足が原因という結論になってしまうのだ。実際、20年以上前なら、試行錯誤の経験を積んでいけば想定するパターン(テストケース)の漏れがなくなり、不具合も減っていった。

その成功体験だけで、21世紀のソフトウェア開発を同じように考えられたらたまらない・・・ が、現実にはそういった現場はたくさんある。

教育の現場でも同じような環境が発生する可能性はある。

なぜなら、ソフトウェアの設計技術として、要求の分析やアーキテクチャ設計、検証、妥当性確認などの意味や考え方、方法論を学生に教えずに、プログラム言語のテクニックだけを教えていると前述の昔のデジタル系ハードウェア技術者と同じようにソフトウェアエンジニアではなくプログラマを作ってしまうからだ。

そうなると、次の思考の呪縛から抜けきれない。
  1. ソフトウェア(実際頭の中に浮かんでいるのはプログラムコードのこと)はソースコードが設計図
  2. 実装してからいろいろなパターン(テストケース)を試して完成度を高める
  3. バグが残るのは想定したパターンに抜けがあるからであり、パターン(テストケース)の想定漏れは経験のなさからくる
このような経験しかしていない技術者の卵の軍団が会社に入ってきて、プロダクトマネージャや技術部長クラスのの思考回路もこんな感じだったら、サンドイッチになったソフトウェアエンジニアはどうすればいい?

この問題を解決するために、次回の記事では、マイコンがシーケンスをトレースする役割から変革していった過程を書きたいと思う。
 

2006-12-09

MATLABのビジネスから見る知的生産性とは

MATLAB というツールをご存じだろうか? MATLAB とは MATrix LABoratory の略で MathWork 社が市販している計算技術用ソフトウェアのひとつである。日本ではサイバネットシステム株式会社が販売代理店となっている。

12月7日に 毎年恒例の MATLAB EXPO 2006 が東京プリンスホテルパークタワーで開催された。

MATLAB EXPO に行くといつも不思議に思うのはどうして一つの製品とそれにまつわるサードパーティだけの資金でこんなに派手な展示会ができるのだろうという疑問だ。

MATLAB EXPO 2006では、ランチボックスの券が配られていたし、講演を聴いたり、サードパーティのブースに立ち寄ってポイントを集めると帰りに抽選ができ、マウンテンバイクやニンテンドウDS Lite などが当たる。はずれても500円のクオカードがもれなくもらえる。他の展示会と比べてもかなりリッチな感じがする。

MATLAB のビジネスがなぜリッチなのかは後で触れるとして、MATLAB EXPO 2006 で MATLAB と Simulink をそれぞれ1時間ずつさわる機会があった。

簡単な例題をMATLAB と Simulink を使い、インストラクターの指示に従いながらノートパソコンで実際にやってみるというトラックだ。

MATLABの演習トラックの例題は、excelシートに格納されたいろいろな周波数が混在した信号のデータ列を読み込んで FFTをかけて、パワースペクトルを表示させて信号の周波数特性を眺めてみるというものだった。

この例題を通して 分かったMATLAB の特徴とは次のようなものだ。
  1. データは何も指定しなければ double 型で読み込まれる。(インストラクターはMATLABは通常のプログラミング言語のようにデータ型を指定する必要がないと言っていたが、正確にはデフォルトで double型になるということ)
  2. MATLABはBASICのようなインタプリタ型であり、コマンドラインから入力した命令を1行ごとに解釈し実行する。
  3. いろいろ試行錯誤してうまくいったら、プログラムファイルに実行したコマンドをコピーして整形し保存するような使い方が一般的。
  4. プログラムファイルにはスクリプトのファイルと関数のファイルの2種類があり、用途によって使い分けることができる。
  5. スクリプトファイルと関数ファイルはテキストなのでライブラリとして公開することが簡単にできる。(利益を考えなくて良い研究者達には便利)
  6. GUIのインターフェースはあらかじめいろいろなものが用意されている。

さて、用意された信号データの周波数成分を調べる演習で感じたのは「これって、自分が excel でやってた手順と同じだなあ」という感覚だ。

信号処理の仕事を生業としていた技術者としては、A/D変換したデータの周波数特性を調べるという作業はなじみが深い。

今回 MATLAB で実施したようなことは、ちょっと面倒だが excelのシート上で計算を行い、最終的に出た結果をグラフ表示させることで同じことができる。じゃあ、なんで MATLAB EXPO がこんなにリッチなのか。それは、MATLAB のパッケージ力と simulink のコンビネーションが強力なのだ。

MATLAB と Simulinkのコンビネーションが利益を生み出すしくみについては後で触れるとして、次に、Simulink の例題を行った。Simulink では MATLABで作成したコンポーネントをワークスペースに配置し、コンポーネント同士を結線して必要なシステムを構成していく。コンポーネントは分野ごとにライブラリが用意されており、自分でコンポーネントをわざわざ作らなくても大抵のことができてしまう。ただ、特定の分野によって必要なライブラリをパッケージにした商品が別売りされておりこれらのパッケージを売るサードパーティの会社がたくさんある。(ここに MATLAB EXPO がリッチである秘密がある)

演習では、SIN波を発生させて、スコープで眺めたり、ノイズを混入させた音声信号にフィルタをかけ、FFTを行ってパワースペクトルを取り、生波形を表示させながらフィルタの効きを見たりした。

MATLAB を使うとローパスフィルタの設計も簡単にできる。たとえば、カットオフ周波数0.4Hz、次数7、通過帯域リップル1dB、遮断周波数30dBの仕様を満たす楕円フィルタを設計したいとしたら、

>> [b,a] = ellip(7, 1, 30, 0.4)

と打ち込めば、b=分子係数と a=分母係数が求まる。このフィルタの周波数特性をグラフに表示させるとあら不思議、狙った通りの特性がでている。

さて、ここからが本論だ。

信号処理系の組込みソフトエンジニアは、MATLAB と Simulink がいとも簡単にやってのけるこのようなフィルタ設計をどうやってやって設計してきたか。

まず、前提条件として8ビット、16ビットの汎用的なCPUで、double の演算をバシバシ使うフィルタを設計したらまず先輩から「バカ」と言われる。C言語で書いた浮動小数点の演算をアセンブラのコードに落とすとどうなるのか見たことがあるエンジニアなら分かると思うが、整数演算なら3インストラクションで終わるようなたった一行の処理が、浮動小数点演算では100インストラクション以上かかったりする。

(unsigned short)x = (unsigned short)x /2

と

(double)x = (double)x /2.0

は両方ともたった一行で表される式だけれども、アセンブラにすれば上は汎用レジスタに格納して右に一回シフトして終わり。ところが下は延々と処理をこなさないと答えがでない。

要するに浮動小数点の演算は CPUに負荷をかけるし、組込みシステムのCPUはフィルタ以外にもやらなければいけない処理がたくさんあるので、組込みソフトエンジニアはできるだけ整数演算で目的の周波数特性に近い特性が得られるようなフィルタを設計する。

このようなフィルタは基本的な設計の指針はあるものの、最後は組込みソフトエンジニアが試行錯誤で作り上げることになる。組込みソフトエンジニアが要求と制約条件をすり合わせて最適解を求めるのだ。

MATLAB と Simulink がいとも簡単に目的の周波数特性のフィルタを作り上げることができるのは、PCの能力が格段に上がっているからだ。昔なら大学の計算機センターくらいでしかできなかった計算を今ならパソコン上で待ち時間なしで実行できる。

MATLAB と Simulink には上記のような試行錯誤で作り上げる職人芸のような要素はない。MATLAB と Simulink で作るモデルは MDD(Model Driven Design)で言うところの PIM(Platform Independent Model)になるのだろう。ただ、負け惜しみ的な気持ちも含めて言うと、プラットフォームに依存していないといっているのは、非常に高性能なプラットフォームを想定していて、かつ、データ型はデフォルトで double 型にしているからPIM(Platform Independent Model)だと言えるのであって、MATLAB と Simulink で作ったモデルは(コストアップをともなわずに)必ずしも組込みシステムに実装できるとは限らない。

コストアップをともなわずにと注釈を入れたのは、DSP(Digital Signal Processor)を使ったり、FPGAのIP(Intellectual Property:知的財産)に落とし込んでしまえば実装が可能なところまで実装技術が進んでおり、コストを気にしなければPIMはPSM(Platform Specification Model)に変換できる世の中になっているからだ。しかし、多くの場合このようなアプローチはコストアップがともなう。でも、MATLAB と Simulink を使って作ったモデルが商品の価値となり、コストアップとその価値のトレードオフの結果がユーザーに受け入れられるのであれば問題ないし、職人芸で作り上げるコンポーネントよりも早く開発でき品質が高いのであれば、ツールやライブラリが高かったとしても最終的にはペイできるかもしれない。

ところで、Simulink と非常に似ているツールでナショナルインスツルメンツ社の LabVIEW というものがある。LabVIEW も Simulink と同じで、豊富に用意されたコンポーネントをつなぎ合わせて、あっという間にカスタマイズしたオシロスコープなどができてしまう。

MATLAB , Simulink にあって、LabVIEW にないもの、それは研究者に対する配慮ではないだろうか。MATLAB , Simulink は自然科学の研究者にとってとても有効なツールだと思う。過去の研究者が発表した理論式を組み合わせたり修正したりして、まだ未着手の分野の対象から取り出したデータに適用して、グラフィカルに表示させれば論文用の図があっという間にできてしまう。

コンポーネント化された知見を組み合わせるか、モディファイするか、パラメータを変えるかして、未開拓の分野の問題を解決する実験をパソコン上でシミュレーションをし、よさげな結果がでたらグラフィカルに表示して論文にする。うーん、こんなおいしい話はない。(いずれにせよ、科学技術の研究とはそういうものかもしれないが・・・)

そして、新しくできた知見はパッケージにして売り出すこともできる。ただ、ひとつ問題なのは、MATLAB , Simulink で作ったモデルは、強力な性能のCPUと浮動小数点演算によって裏打ちされたPIMであり、ひ弱なCPUと整数演算と限られたメモリいう制約条件を持つシステムに実装するには、また別の組込み技術が必要になるということだ。(どんな技術が必要かは『組込みソフトエンジニアを極める』を参照されたし)

しかし、そうはいうものの、CPUの性能は常に向上し続けており、メモリの価格も安くなっている。分野や用途によっては、研究者が考えた新しいコンポーネントを人の手を介すことなく製品に組み込むことも可能になってきた。

このことは MATLAB , Simulink が、研究者と開発現場のエンジニア、科学技術を必要としている企業の橋渡ししているとも言える。個人的な偏見かもしれないが、研究者と現場のソフトウェアエンジニアは仲が悪い。なぜなら、浮動小数点演算に象徴されるように、研究者は組込みソフトの開発現場の制約条件を考えてくれていないという思いが技術者サイドにあるからである。

しかし、『組込みソフトエンジニアを極める』第2章 機能分割のハードルを越える p147 図2.23 制約条件をクリアしながら最適化を図る に描いたように、規模が拡大したソフトウェアシステムではもうすり合わせ的な作り方では開発が間に合わないし、品質を確保することもできない。

科学技術をコンポーネント化し組み合わせの部品として使うことができればアドバンテージになりやすい。しかも科学技術の部分は利益を欲しないアカデミアンの研究成果やサードパーティのライブラリを使うこともできる。

でも、コンポーネントの組み合わせだけでは十分に要求を満たせないのが組込みソフトの難しいところだ。グニャグニャしたすり合わせ的な要素は必ずある。そして、そのすり合わせ的な要素が商品の快適性や低消費電力を可能にしていたりする。

MATLAB , Simulink を触ってみて分かったのは、MATLAB , Simulink は知的生産性を高めるための道具として優れているいうことだ。科学技術をパッケージ化し、必要な分野の企業に売る。パッケージ化したコンポーネントはオブジェクト指向設計と同じで、高凝集・疎結合なモジュールとなっているためつなぎ合わせて使いやすい。

このコンポーネントの需要が高めれば、黙っていてもどんどん売れる。科学技術をコンポーネントに隠蔽して商品として売るビジネスモデルは当たれば利益率が良いだろう。

組込みソフトウェア、組込み機器自体は、実は知的生産性の高めることに成功した顕著な例と言える。組込み機器のソフトウェアに知見を隠蔽することができ価値が認められば、製品は黙っていても工場がどんどん作ってくれ、知見は製品に乗ってどんどん売れる。

問題は組込みソフトウェアの規模が大きくなってきたので、組込み機器の内部で組み合わせ用のコンポーネントを使わないと開発効率が上がらなくなってきたということだ。

ところが、組込みシステムに使うミドルウェアは必ずといっていいほどチューニングが必要であり、ポーティングを行うことが多い。これは黙っていてもどんどん売れるという流れではない。知的生産性が悪い。

コンサルティングなども同じだ。人がコンサルテーションによって知見を伝えることができる効率には限界がある。著名なコンサルタントの単価を上げても普通のコンサルタント100人分にすることはできないだろう。

一方、書籍は知見を広めるには非常にいい媒体で知的生産性が高いが、単価が安いので利益率が低い。

でも、MATLAB , Simulink はツールを媒介して、比較的単価の高いパッケージを流通させることができる。だから、MATLAB EXPO はリッチなのだ。

今後、MATLAB , Simulink で作ったコンポーネントが組込みシステムに実装できるかどうかは、組込みアーキテクトが組込みシステムを科学技術が適用される部分と適用されない部分に切り分けて設計できるかどうかにかかっていると思う。

科学技術を適用する部分をパッケージにし、インターフェースを明確にして、システムの制約条件をクリアすることができれば製品の付加価値を高めることにつながる。

科学技術は先人の科学者が何百年もかけて積み上げた知見のたかまりだ。すり合わせて作るソフトウェアには数人のエンジニアの知見しか作り込めないが、科学技術をコンポーネント化して組込みシステムに実装できれば、のべ何百人分もの知見を製品にインプリメントすることができる。

それが他社に真似できないような知見ならさらに競争力は高まる。

ちなみに、MATLAB , Simulink を使わなくても、科学技術を利用する部分を特定しコンポーネント化することができ、制約条件をクリアして実装する技術があれば、付加価値の高い製品を作り上げることはできるので、慌ててMATLAB , Simulink の購入を検討するのはやめた方がいい。
 

2006-12-02

エンジニアにどうやってインセンティブを与えるか

先週「組込みか組込みでないかの違いはどこにある?」の記事の中で、任天堂の Wii コントローラを題材にして、組込みか組込みでないかの違いは「世界を固定するかしないかの違い」ではないかと書いた。

この記事の中でハードウェアデバイスは日々進化しており、それらのハードウェアデバイスを取り入れることで世界は広がるはずだとも書いた。

でも、その後よく考えてみたら、これは「洗濯機メーカーは新しい洗濯機を開発しようとしてはいけない」の記事で書いた「真のユーザーニーズ」のことを考えていなかったかもしれないと思った。

「洗濯機メーカーは新しい洗濯機を開発しようとしてはいけない」の記事で書いたのは1993年に聞いた当時東京理科大の高橋 武則先生(現 慶應義塾大学大学院教授,工学博士,健康マネジメント研究科 教授)の話で、ユーザーは衣類をきれいにしたいのであって洗濯機は衣類をきれいにする手段のひとつで、ワイシャツ1枚10円でクリーニングしてくれるクリーニング屋が現れたら、必要なくなるかもしれないという話だ。

この話の真意を考えれば、日々進化するハードウェアデバイスを取り入れることが世界を閉ざさないことに通じるという考え方はおかしい、間違っている。

なぜなら、新しいハードウェアデバイスを取り入れることは手段であって、ユーザーニーズを満たすための本質ではない。

インターネットショップで買ったものが思ったようなものではなかったり、サイズが間違っていたとき、無料で引き取ってくれるサービスを始めた店が売り上げを伸ばしているというニュースを見たことがある。インターネットショッピングで「しまった。やめておけばよかった。」ということはよくある。間違った買い物に対して、ショップが無料で引き取ってくれると店との信頼関係が生まれ次の買い物も安心して気軽に選べる。

これは「プロダクトのよさ」を追求したのではない、サービスのよさを追求した結果だ。

日経ビジネス 2006年11月27日号 に-「お母さん」を狙え! 任天堂がWiiに託すお茶の間戦略 -を読んだ。「組込みか組込みでないかの違いはどこにある?」の記事を書いた後だ。

この記事を見た最初に感じたのは Wii がプロダクトとしてワクワクするのは組込みとか非組込みとかいうことではなく、岩田社長を始め任天堂のトップマネージメントたちは家族を巻き込んで使ってもらうプロダクトやサービスは何かを考えていたということだ。

冒頭の写真は、2006年の5月、米ロサンゼルスの展示会「E3」で Wii Sports をプレゼンする岩田聡社長(左)と宮本茂専務だ。

この写真を見て、社長と専務が自分たちのプロダクトをこんなに楽しそうに披露できる会社ってうらやましいなと思った。

任天堂は今でこそ、ニンテンドウDS Lite が大ヒットしているが、ファミリーコンピュータ以降、ゲームキューブのときに売り上げの低迷を経験している。

岩田社長はもともとゲームソフトHAL研究所から2002年に任天堂に移り社長になった。岩田社長とソフト開発部門のトップの宮本専務とハード開発部門トップの竹田専務の3トップでゲーム人口減少への危機感で議論を重ねたそうだ。

岩田社長がすごいと思うのは、自分が若くゲームソフト会社から来た外様であり、前任社長の山内氏は鋭い直感を武器にカリスマを崇められてきたオーナーであるということをふまえて、自分が何を言ったとしても生え抜き社員が素直に言うことに従うとは限らないと考え、「徹底して丁寧し説明し、同意を得る」ことにしようと決めたことだ。

経営陣とまず議論を重ね、出た結論を自分の言葉で繰り返し社内に説明し続けた。

「高機能・高画質ではない手段で、たくさんのユーザーが楽しめる据え置き型ゲーム機を目指す」という3トップの意見は一致したが、社内からは疑念の声が多く上がったそうだ。これに対して岩田社長は時間をかけて丁寧に説明し、目標を具体的に示した。

この「高機能・高画質ではない手段で、たくさんのユーザーが楽しめる据え置き型ゲーム機を目指す」という目標に、即座に「その通り」と反応する社員が数多くいた一方で、方針転換になかなか踏ん切りにつかない社員もいたそうだ。しかし、ニンテンドウDSが市場に受け入れらたことを目の当たりにして、躊躇していた社員も態度を変えるようになった。

岩田社長が考えるニンテンドウのゲーム機のコンセプトは「ゲームに関心のなかった人にも邪魔に思われないような、特に家庭のお母さんに嫌われないようなゲーム機」とのこと。

これには我が家も見事にはまっている。ニンテンドウDS Lite を手に入れた子供はまず、「どうぶつの森」を買った。どうぶつの森はドラゴンクエストのようなゲームとは違い、特に達成すべき目標のようなものがない。四季が移り変わるどうぶつの森で、虫取りや魚釣りなどをしながら、どうぶつの森の住人達と関わってただ時間を過ごすだけなのだ。

「家庭のお母さんに嫌われない」秘訣がここにある。子供はゲームをしていると季節によってなる果物や釣れる魚の違いがわかったり、お金を貯めて家のローン返すといったことを学ぶことができ、発見したことを母親や父親にうれしそうに話す。そうすると親は「DSは勉強にもなるのか」と思う。

実際、自分は「英語漬け」というソフトを買って、ディクテーション(発音された単語や文章を書き取ること)を続けている。

結局、どうぶつの森は家族全員がやることになり、母親は「ゲームに関心のなかった人にも邪魔に思われないような、特に家庭のお母さんに嫌われないようなゲーム機」に見事にはまっている。

ちょっと話はそれるが、このバーチャルな世界で現実の世界を学習したかのように感じることには問題点もある。どうぶつの森の魚釣りはそれなりに難しいがコツをつかめば釣れる確率は非常に高い。でも実際の釣りはそんなに簡単なものではないだろう。いろいろな経験を疑似体験できるのは良い面もあるが、現実の厳しさや厳しさを乗り切るための我慢強さの重要性を学ぶことができないのはよくない。

現実の世界で、自分の思った通りにならないとキレやすい子供を作っているのはちょっと苦労すれば欲しいものが手に入るバーチャルな世界に慣れてしまっているからではないだろうか。ゲームの存在する世界をいまさら否定することはできないが、ゲームによる弊害についても考えておく必要があると思う。

さて、任天堂の会社の話に戻そう。

Wii の企画で、ハードウェア技術者はロードマップから外れたものを作るという決断に対して不安に思っていたという。そもそも任天堂では (おそらく技術)ロードマップ があったというところがすごい。他社の様子を見ながらの行き当たりばったりの開発ではなく、数年もしくは10年後に開発が進むであろう新しい技術やデバイスの取り込みの準備をしていたに違いない。

そんなロードマップから外れても岩田社長は「ゲームに関心のなかった人にも邪魔に思われないような、特に家庭のお母さんに嫌われないようなゲーム機」を作りたい、作らなければならないというコンセプトを伝え、方針の転換に理解を求めた。

そして、浮かんでは消えた試作品の数々を経て、Wiiリモコンができた。

Wii はハードウェアもすごい、Tech-on の記事によると、「Wii を分解して驚くのは,低コストを狙い,徹底的に練られた設計である」とのこと。

一目見てシンプルと分かるメイン・ボードに載る部品点数はおそらく1000を大幅に切る少なさ。いくつかのカスタムLSIとゲームキューブとの互換性を保つためのコネクタ類を除くと,大半の部品に汎用品を採用している。

数百万台作っても同じ品質を保つのは本当に難しい。ハードもソフトも同じで生産時の検査で乗り切ろうとしても限界がある。設計時に品質を作り込まなければ絶対ムリだ。

だから、Wiiの設計方針は決して低コスト一辺倒ではない。ここぞという部分には思い切ってコストを掛けるメリハリがあり、その象徴が金メッキ部品の多用とのこと。

すぐれたプロダクトには見えないところにさまざまな工夫が施されている。ゲームの遊ぶ側だけした体験していない子供達が、多くの人々に受け入れられるようなプロダクトを作れる技術者になれるのだろうか? ちょっと不安が残る。

Wii の開発秘話で分かったのは、よいプロダクトを生み出すのに必要なのは組織上層部やプロジェクトリーダーの熱意だったりするということだ。

なぜ「だったりする」のかというと、これはあまり科学的でもエンジニアリングでもない話であり、「熱意がなけりゃ良いもの作れないのかよ」という不満も含まれているからだ。

一つ言えるのは組込みはプロジェクトに「熱意」を伝えやすいということだ。プロダクトが形に見えるものであり、最終的に自分たちが思った通りに動くようになるとうれしいし、そのプロダクトが多くの人に受け入れられることを想像すると力がわく。

でも当たり前だが「熱意」だけではものづくりは成就できない。ベースに技術がなければムリだ。また、品質を高く保つには技術だけでなく、組織内でのルールや規範も必要になってくる。

エンジニアにインセンティブを与えるには、市場やユーザーが求めている 顕在的価値(Real Value)と潜在的価値(Potential Value) が何であるかを分析し、根気よく伝え、それらの価値を創造するための製品やサービスを実現するために技術を身につけなければならないと考えてもらうことだろう。(ものづくり戦略とソフトウェア品質 を参照されたし)

市場やユーザーが求めている価値が何であるかがエンジニアに伝われば、必要な技術が何かを理解できるようになり、ツールや規範もなぜ守らなければいけないのかが分かるようになる。

市場やユーザーが求める価値を実感するには、自分以外の人間に心の底から「ありがとう」と感謝される経験を重ねることが大事だ。自分のくふうで感謝される経験が積み重なれば、どんなくふうをすればプロダクトの価値を高めることができるのか分かるようなる。

このことはカルロス・ゴーン氏が語った「働くことの本質は貢献である」につながる。

2006-11-26

組込みか組込みでないかの違いはどこにある?

組込みソフトって何だろうと考えていた。組込みシステム(組込みソフト)を定義する試みはたくさんある。

具体的には、携帯電話、自動車、カーナビゲーションシステム、炊飯器、信号機、エレベーター、自動販売機、デジタルカメラ、テレビなどなど、生活の周りにある電気製品のほとんどが組込みシステムだ。

フリー百科事典『ウィキペディア(Wikipedia)によると、組込みシステムの特徴について以下のように書かれている。

【汎用システムに対する組み込みシステムの特徴】
  • ソフトウェアだけでなくハードウェアも専用のものを開発することが多い。
  • 機械の制御を行う場合にはリアルタイム制御が重要になる。
  • 大量生産される製品の場合にはコストが非常に重要となるので、少ない容量のメモリと、安価なCPUで動作する必要がある。
  • ほとんどの組み込みシステムでは、ユーザがプログラムを入れ替えたり更新したりすることは想定されない。そのため汎用コンピュータよりも自由にオペレーティングシステムやシステム構成を選択できる。
  • 多くの場合、ソフトウェアはROMに書き込まれた状態で出荷されるため、出荷後にバグが発見されると、製品回収・ROM交換作業などが必要になり、多大な費用がかかる。近年、ソフトウェアはROMではなくフラッシュメモリに格納され書き換え可能になったが、出荷後の改修が困難なことは変わっていない。
  • ソフトウェアはC言語で記述されることが多い。32ビットマイコンなどの比較的ハードウェア資源が豊富な環境ではC++やJavaが使用されることもある一方で、ハードウェアを直接操作する場面や、4ビットマイコンなどの資源が貧弱な環境では、現代でもアセンブリ言語の使用が必須である。
  • デバッグは、ICEと呼ばれる機器を用いてパソコンをCPUに接続してリモートで行う。近年では、ICEを使わずJTAGエミュレータやROMエミュレータなどのエミュレータや、パソコン上でCPUの機能をシミュレートするシミュレータも使用される。
  • 近年ではPCベースのハードウェアの低価格化に伴い、PCベースのハードウェアを使用し、OSも組み込み向けにカスタマイズしたWindowsやLinuxを採用することも多い。
  • 携帯電話やデジタル家電、自動車など、必要とする機能が多岐にわたるシステムは、複数のマイコン・複数のOSを組み合わせたものとなり、数百人単位の開発人数・数年規模の開発期間を必要とする。このため、大規模組み込みシステムと呼ばれることがある。

逆に組込みシステムではないもの(Wikipediaでは汎用システム)って具体的にはなんだろうか? 一番分かりやすいのはパーソナルコンピュータやワークステーションだろう。

PCの特徴は IBM と Microsoft のおかげで、アプリケーションソフトから見たハードウェアのインターフェースが共通になっているため、アプリケーションソフトの制作者はPCのハードウェアの違いをあまり意識しないでよいという点だと思う。(Mac もMacの中だけで考えれば同じ)

共通のハードウェアプラットフォームがあり、そこへいろいろなソフトウェアをインストールして使える、もしくは、その都度その都度ソフトウェアをダウンロードして使えるようなシステムは汎用システムとなるように思える。

そうすると、現在の携帯電話は電話としての機能は特定の用途を実現するための組込みシステムだが、電話をかけていないときは、インターネットに接続しWEBブラウジングや Java アプリを実行したりできるので、汎用システムであるとも言える。

ゲーム機も同じだ。CDやカセットを入れ替えて共通のコントローラを使って、いろいろなアプリケーションソフトを使うことができる。

そう思っていたら、任天堂の Wii のコマーシャルが流れてきて「ああ、これが組込みの特徴かも知れない」とピンときた。

Wii は何と言ってもWiiリモコンがこれまでのゲーム機にはないデバイスだ。具体的にはモーションセンサと呼ばれる三次元の加速度センサが新しい。この三次元の加速度センタを使うことで、リモコンを上下、左右に振ったり、突き出したりする動きをセンシングしてゲームに取り入れることができる。

これまでのゲーム機は基本的に左手の親指で十字のコントローラを動かし、右手の親指でボタンを押すというインターフェースしか持っていなかったが、三次元の加速度センタを使うことでまったく新しいゲームの遊び方を提案することが可能になった。

ニンテンドウDS のタッチスクリーンとタッチペンも同じようにそれまでのゲーム機にはなかった新しいインターフェースデバイスだった。リモコンに仕込まれた振動装置も新しいデバイスだったがこれはこれまでの環境を劇的に変化させるようなものではなかった。

Wii リモコンを見たときに「これが組込みの特徴かもしれない」と思った。新しいハードウェアデバイスをシステムに取り込むことで顧客満足度を高めることができるのが組込みシステムではないかという考え方だ。

でも、一般的にはパソコンの方がアプリケーションソフトの入れ替えによって用途が無限に広がり、顧客満足を高めるくふうがしやすいように見える。でも、よく考えるとパソコンのインプットデバイスはキーボード、マウス、マイクであり、アウトプットデバイスはディスプレイとスピーカと意外に限定されている。

だからできることのバリエーションの大部分はディスプレイの中だけに閉じている。人間の入力情報の多くは視覚からきているので、パソコンのディスプレイからいろいろな情報を流すことが可能なのだが、人間の生活はディスプレイの中だけに閉じているわけではない。現実の世界はディスプレイの中の世界よりももっともっと広い。

プラットフォームを共通にするということはアプリケーションソフトの入れ替えが容易になるというメリットはあるものの、見方を変えれば「世界を固定する」ことのようにも考えられる。

世界を固定すると言っても、狭く囲う場合と広く囲う場合がある。固定した世界の範囲が広いと、一見そのプラットフォームで提供できる世界が無限に広がっているように見えるが、システムを作る側も利用する側もそう思い込んでしまうと、実際の世界はどんどん広がっているのに、固定された世界の中しか商品や市場を見ていないということになりかねない。

今回の任天堂のWii を見てそう思った。Wii の登場で、PS3やX-BOXは一見無限に広がっていそうな固定された世界で勝負しようとしていて、現実世界の広さを見失っているように思えてきた。

この話は「洗濯機メーカーは新しい洗濯機を開発しようとしてはいけない」の記事で書いたことに共通する。現行機種と現行機種の使われ方だけを見ていると、真のユーザーニーズや、デバイスの制限でできていなかったことをすっかり忘れてしまう。

ハードウェアデバイスは常に進化している。自分たちの市場とはまったく関係ないところで開発されたデバイスが、思いもよらないところで役に立ったりする。Wii のモーションセンサもITmediaの記事によると、もともとは自動車のエアバッグを作動させるときのために開発されたセンサらしい。

そう考えると、組込みシステムが相手にする世界は非常に広く、現行製品にありとあらゆるデバイスを取り入れることで、その市場における顧客満足をより高める製品に進化させる可能性があるように思う。

そうなると、組込みソフトウェアエンジニア側も、どのようなキーデバイスが取り込まれて、開発環境もどう変化するのか分からないので常に柔軟な対応が迫られる。

逆に言えば、あらゆる未知のデバイスを使いこなせるスキルの下地があればその市場において非常に競争力の高い商品をアウトプットできるようになる。

組込みか組込みでないかの違いは「世界を固定するかしないかの違い」であり、組込みは世界を固定しないだけに技術者に求められるスキルも多様であり、挑戦者にとってのやりがいが大きいと考えるのはどうだろう。