AsaHP
Top > 高品質・高速な開発のためのソフトウェア方法論

概論


私は普通の日本人ソフトウェア技術者よりは技術力があるが、世界レベルから見れば大した事はない。日本人は一般人でも技術者でも情報処理の技術力は低い。学習・教育や現実化・規則化により、技術力を上げるべきだ。

世界から見て日本のIT技術力は低いので、世界のIT技術を見るべきである。製品・サービスなどでも世界のものを見るべきであり、日本国内だけを見ていると問題が生じる。

日本人全体として見ると、基本的な情報処理への志向から低い。情報をデータでなく書類として見ている部分がある。これは印鑑やFAXを未だに使用している事が典型的である。データの流れも作業としてしか見ていない。製品への理解も足りない。情報処理の製品は無数にあり日々新製品が生まれている。これらを学習するのは専門家でも簡単ではない。システムとして見るとデータや製品が分からなくても分かったような気になり、無駄なシステム開発などに繋がってしまう。

開発の現場を見ると、ソフト本体より書類や会議が優先されることが多い。直近の上司でさえソフト本体のチェックが不十分な事も多く、これではソフト本体の品質が向上しない。

高度なソフトウェア技術はスポーツカーのようなものだ。レーシング場では高速になるが、生活道路で走っても速度は出ない。高品質のソフトウェアを積み重ねていく事により開発速度が上がっていく。できの悪いソフトウェアの改造や、能力の低い開発者との共同作業では、品質も開発速度も上がらない。日本では高度なソフトウェア技術について理解されにくいが、こういう世界がある事を知って欲しい。

現実化・規則化


最も重要なのは現実化・規則化である。現実に沿うという条件の下で、可能な限り規則化を行うべきである。

現実に問題なく動くというのはソフトウエアとして最低限だが、これさえ守られない場合も多い。ソフトウエアとしてあるべき論よりも、まずは現実に問題なく動くことが重要である。ソフトウエアの方法論は思想的で実務として疑問が残るような場合も多い。思想としての方法論でなく実務的な技術でなければならない。

規則化を行う目的は、情報を可能な限り単純化する事にある。単純になるほど開発が高速になり、品質も向上する。いくら構造を作っても複雑化したら意味がない。同じ場面で使われる情報や、関係の深い情報を一つにまとめ、それと他の情報との関連性を明確にする事が重要だ。意味が同じ情報が多数ある状態では適切に動かない。特に中心となる情報の種類・転送・変換などは注意が必要だ。

情報処理が用いられる場面は非常には幅広いが、基本は現実化・規則化だ。業務アプリでも、Webでも、数値計算でも、Excelでもこの事は変わらない。十分な検討と整理の継続が重要であり、これが情報処理の実務の根幹となる。何が適切なのかは状況により変わるため、柔軟で全体を見た検討が必要である。他の仕事と同様にPDCAと改善の連続が品質向上の中核となる。

大きく異なるのは情報が示す対象である。業務系のアプリケーションでは業務内容になり、担当者の作業内容レベルまで正しく理解しなければならない。WebならWebユーザの利用内容が対象になる。数値計算の場合は背景となる理論になり、その理解が正しくないとソフトウェアの設計ができない。数式そのものより数式を含む理論構造が重要になる。

どの場合でも現実化・規則化の手法は同じであり、対象を正しく理解すれば同じように設計を行う事ができる。ただし対象の理解は経験が必要で容易ではない。

現実化・規則化は、ソフトウェアの使用においても重要である。大量のデータを収集し、必要なデータを抽出して再構築し、それを利用できる形で提供する、という方法論は様々な分野で見られる。例えばデータウェアハウスとBI、検索キーワード抽出と分析、ビッグデータなどが挙げられる。現在では様々な分野に大量のデータが存在するが、実用的なデータ抽出と提供は情報や対象ソフトの高度な理解が必要で容易でない。

プログラムにおいて基本となるのは、同一のデータや処理を一つにまとめる事と、データと処理を一体的に扱う事である。この2つはあらゆる局面でプログラム作成の基本となる。その上でデータで区分して処理を共通化すれば、うまく規則化できる。



建て増し旅館のように少しずつ処理を追加する作り方では整理する事ができない。先にデータを中心に構造を整理した上で、まとめて処理を追加しなければならない。これにより処理の共通化が実現できる。処理をだらだらと書くのは絶対に避けなければならない。処理全体をまとめて作成し、同時に共通化やモジュール分割を行うべきだ。

常にソースを改善する努力が必要である。適当に作る事、全体を見ない事、後の手間を考えない事は絶対に避けなければならない。これらはすぐに現実化・規則化を破壊する。これに慣れてしまうと直すのが難しいが、結局は自分の首を絞めるだけだという事を理解する必要がある。

日本の技術の低さ


残念ながら日本人技術者は、海外と比べてソフトウェア開発技術に劣っている。汎用ソフトウェアとして流通しているものの大半が海外製である事がそれを物語っている。海外製品と同様のソフトが作れないなら技術力は低い。コンサルティングを含めたソリューションなら成立するが、汎用製品より必要とされる技術力は低い。日本製の汎用製品が売れないのは、日本人自体が日本のソフト技術を信用していないためである。もはやインドや中国より劣るかもしれない。

日本国内だけでなく海外のレベルを見てソフトウェア開発技術を磨かなければならない。海外サイトを見て情報収集を行うべきだ。そのためには英語力も重要である。製品・サービスなどでも世界的なものを使うべきであり、そのための学習も重要である。現状の技術レベルでは、残念ながら日本製の製品・サービスより海外製の製品・サービスを使った方が良い。

根本的な問題は現実化・規則化の不足である。書類や会議よりもソフト本体を優先的に検討すべきだ。コードのチェックは難しくても、操作の現状なら上司によるチェックも可能である。書類や会議だけは実態が分からず揉めるだけだ。ソフトウエアの日本人技術者は、もっと十分な検討と整理の継続を行うべきだ。製造業やサービス業ではPDCAや品質改善が頻繁に行われているが、情報処理では非常に少ない。ハンコやFAXの温存のように、日本は一般人でも情報処理の技術力が低い。一般人と技術者のレベルは相互に関係している。顧客から案件を聞き出しても、話が整理されていないとまともなシステムは作れない。欧米では単純化した物事を「美しい」と見なす文化があり、日本もこれを見習うべきである。

重要なのは基礎的な技術力である。先端的な技術は日々進化しているが、その下の基礎は変わる事がない。基礎力は高度・大規模・汎用ソフトウェアで特に重要になるため、日本人技術者はこれらのソフトを作る事ができない。実践の中での技術の咀嚼が足りないため、海外の先端技術を追っても同等の製品開発ができない。海外の製品を使うだけでは不十分で、最終的にはそれを「作れる」レベルまで上げなければならない。ただ現状ではそれを目指すのは困難である。

ソフトウェアは現在も将来も非常に重要な技術分野である。日本の競争力を維持するためにも、ソフトウェア技術の向上は重要である。

データ構造


ソフトウェア開発において最も重要なのはデータ構造である。データは情報そのものであり、プログラムはデータを扱う事が主目的である。データ構造はソフトウェアの開発者だけでなく、利用者も含めて全員が理解すべき事象である。

データ構造にはデータ種別・繰り返し・データ間の関係などがあり、この構造がソフトウェアの品質を左右する。構造はできるだけ単純化すべきであり、複雑だとソフトウェアの規模が膨らみ品質が下がる。状況により適切なデータ構造は異なり、構造の変換が必要になる。

データ構造と構造変換はあらゆる情報処理の場面に存在し、Excelにも存在する。VLOOKUP関数やピボットテーブルは構造変換の機能である。Excelでも構造を単純化すれば品質を向上でき、他のソフトウェアとの連携も容易になる。Excelを文章としてでなくデータ処理ツールとして扱うべきである。表の末尾に合計を入れるだけで、データ構造としては複雑化し扱いにくくなる。

プログラム構造よりデータ構造の方が重要である。データ構造の関係・配置・階層・発生・消去などがプログラム構造を決定する。1つのデータは1ヵ所でまとめて処理されるのが正しい。配置や処理がばらけていると過剰に複雑になり、高度なブログラムだとすぐに構造が破綻する。

堅牢なルール


ソフトウェア開発においては、人間の行動に対する堅牢なルールも重要である。これは現実化・規則化の延長線上にあり、コンピュータとうまく連携するために必要な事だ。残念ながら日本人は堅牢なルール作りも苦手である。時間外労働に対する暗黙の要求などが典型例で、これは海外では通用しない。

例えば日本語や漢字を含むUnicodeを海外勢が懸命に作っている時、日本人はあまり協力的でなかった。欧米より日本の問題の方が遥に大きいにも関わらずだ。ソフトウェアの世界はW3Cなど大量の規約で構築されており、これらの堅牢なルールがないとコンピュータを効率的に動かせない。

実際のソフトウェア開発において問題になるのは、コーディング規約や開発手順のルールである。例え人数や開発日数が少なくても堅牢なルールは重要である。私はある程度大規模なソフト開発も経験があるが、その場合でさえルールは不十分だった。

概念的なルールでなく、現実として意味のあるルールが必要である。実際の運用に支障があるルールでは意味がない。開発対象について包括的なルールが必要である。このようなルールを作るのは容易ではない。開発の重要な基礎として、十分な検討のうえで作成する必要がある。

情報処理の外側


情報処理には、業界動向、数学、AI、芸術、思想、交渉力、調整力など様々なものが影響してくる。ITの専門バカでは役に立たない。開発対象となる業界の動向の理解は、ある程度上流になれば必須となる。スティーブ・ジョブズは芸術性を持つIT開発者の典型であり、それに近い芸術的なソフトウェアは多い。高品質のソフトウェアは最低条件で、そこに何を追加できるかがソフトウェアの価値を決定する。細かい所だけ見ていても駄目で、全体をとらえる必要がある。幅広い知識が必要だが、断片的な理解は無意味で、系統的な理解がないと役に立たない。

情報処理と数学は非常に近く、高度な情報処理では必須になる。またAI的な概念も多い。これらを理解するとソフトウェア構造の意味自体が変わってくる。ただし数学の知識だけでは開発はできない。

コンピュータは元々数学者(チューリング等)や物理学者(ノイマン等)が作ったもので、根本的に数学と関係がある。高度なソフトになると数学の理解は必須になる。これらを理解するとソフトの意味が違ってくる。

グラフやネットワークなどの概念はデータ構造と密接な関係があり、様々なソフトウェアに現れる。3D計算にはグラフや幾何学や物理計算など様々な数学的要素が用いられる。

確率統計や画像処理などの概念も頻繁に用いられる。繰り返しの多い収束計算の高速化は非常に重要な手法であり、科学的な数値計算だけでなく確率統計や画像処理やAIなど様々な分野で用いられる。

情報理論は統計や熱力学を情報処理に適用したもので、データ圧縮等の様々な分野に現れる。

高度・大規模ソフトウェア


高度・大規模ソフトウェアにおいては地味な基礎技術が重要になる。高度技術は地味で継続的に行われた研究からの成果が大きい。研究と実装の強い結びつきを理解すれば、高度技術の意味は違ってくる。どんな分野でも高度技術は地味で難解なものなのだ。

高度なソフトウェアは難易度の高い構造が必要になり、必ず高い品質で開発しなければならない。高品質のプログラム開発能力は必要条件であり十分条件ではない。それ以上の多様な知識と能力がないと開発できない。

OSレベルに近い中核部分だと、コーディングからバグがないレベルを要求される。これはテストすら困難なためだろう。高度な開発力を持っていてもバグのないコーディングは難しい。高い能力を持つ者が慎重にコーディングを行わなければならない。

海外のソフトウェアは長期間研究開発を行った後で製品としてまとめられる。この後で「バズワード」と言われるような売り文句をつける。バズワードは多分に営業的で話を大きくしているため、うまくいかない事も多い。夢のような話だとまずうまくいかない。こういう売り文句に踊らされないよう注意しなければならない。

大規模ソフトウェアの場合、特に中核部分の品質が重要になる。中核部分の質が悪いと全体に悪影響が及び開発自体が立ち行かなくなる。特に開発管理モジュール分割、プログラム構造、データファイルに関しては中小規模のソフトウェアとは質の違う手法が必要になる。

中小規模のソフトウェアでは散発的な手法でも制作できるが、大規模ソフトウエアの場合は十分に管理された階層的な手法を用いなければならない。計画段階から非常に高い技術力が必要とされ、場当たり的な開発では破綻してしまうので注意が必要である。基礎的なソフトウェア技術が重要で、地味でも信頼性の高さが必要だ。

これらに注意しないと欧米でも破綻する事がよくある。特に特定企業向けの作り込みを行う場合の失敗が多い。失敗の可能性を頭に入れて計画を立てる必要がある。

Top > 高品質・高速な開発のためのソフトウェア方法論