はじめに
- システム工学とは
- システムとは,
- 様々な要素の集まりからなり,それらの要素が互いに関連しあい,全体として,ある目的を果たすための機能を有するもの
- といえます.「要素が互いに関連しあい,全体として,ある目的を果たすための機能を有する」という点が特に重要です.少なくとも,単に要素が集まっているだけではシステムとはいえないからです.従って,システムにおいては,個々の要素技術と共に,それらの要素の組み合わせ技術も非常に重要となります.例えば,単に最適な要素を組み合わせただけでは,全体として最適なシステムになるとは限りません.組み合わせたものを全体として評価し,その結果を各要素に反映させることができるような技術者が必要です.そのような技術者の基礎となるのが,システム工学(SE : Systems Engineering, System Engineering)です.そして,システム工学的な知識に基づき,システムの解析,設計,運用などに携わる技術者がシステムエンジニアであると言えます.
- 人口の増加や,生産技術,科学技術,情報伝達・処理手段等の進歩等により,システムが大規模かつ複雑になり,単に要素技術だけでなく,それらをまとめる技術-システム工学-がますます重要になっています.そのため,要素技術や科学技術一般に関する知識と共に,モデリング,スケジュール,最適化,制御等,システム工学固有の技術・知識を持った人に対する必要性は今後ともさらに高まっていくものと思われます.勿論,ここで言うシステムとは情報システム( IT システム,コンピュータシステム)だけを表しているわけではありません.ここでは,システムエンジニアという言葉を,情報システムを含む一般的なシステムの解析,設計,運用などに携わる技術者を表す言葉として使用します.「システムエンジニアの基礎知識」では,そのような技術者が身につけて欲しい知識について記述していきます.
- システム工学と似た分野としてオペレーションズ・リサーチ( OR : Operations Research )という分野が存在します.非常に似た分野ですが,
- システム工学はハードウェア,OR はソフトウェアに重点を置いている.
- システム工学は新しいシステムの設計・製造,OR は既存のシステムを如何に運用するかといった点に重点を置いている.
- といった点で異なっているといえます.しかし,製造したシステムをどのように運用するべきかといった問題は,システム工学にとっても非常に重要です.そのような意味で,OR はシステム工学に含まれるといっても良いかもしれません.「システムエンジニアの基礎知識」においては,そのような立場で記述しています.
- 情報システム
- システムの一つとして,情報の収集,処理,伝達等を目的としたシステム-情報システム( IT システム,コンピュータシステム)-が存在します.このようなシステムの解析,設計,運用に携わるシステムエンジニアを情報システムエンジニア( IT システムエンジニア)と呼ぶことにします.日本において,職種の一つとして使用されている SE(システムエンジニア)は,一般的には,プログラマ,組み込みエンジニア,サポートエンジニアなど,IT 関係の要素業務をこなす技術者を指す場合がほとんどです.言葉として,電気技術者が電気工学に対応するように,システムエンジニアは,システム工学( Systems Engineering, System Engineering )という言葉に対応しますので,システム工学的な知識・考え方を身につけた技術者であるように感じられますが,必ずしもそのようにはなっていません.明らかに,SE は,単なる職種を表した言葉であり,ここで述べているシステムエンジニアとは異なります(以後,SE と記述した場合は職種を表すものとする).しかし,情報システムもシステムの一種です.必ず,システムエンジニアが必要です.実際,SE の中には,情報システムエンジニア的な業務に携わっている人も多いと思います.システム工学に関わる知識を身につけ,その重要性を十分認識し,SE という言葉にふさわしい真のシステムエンジニアを目指してもらいたいと思います.「システムエンジニアの基礎知識」を記述した目的の一つはここにあります.
- システム工学の手順
- システム工学の手順を簡単に述べれば以下のようになります.その各段階で,ここで述べるシステムエンジニアの基礎知識が必要になってくると思います.
- システムの目的 システムの目的・目標を明確にします.単に,与えられた要求を満たすシステムを作成するだけではなく,「システムの目的は何か」,「なぜ必要なのか」,「業務記善など,他の方法で実行できないか」,「他の分野(システム)との関係は?」など,より踏み込んだ検討をする必要があります.ある意味で,システムエンジニアにとって,最も重要な過程であるといえます.場合によっては,この過程において,システムの開発自体を行わないといった結果に至ることもあり得ます.
- システム分析 構成すべきシステムに対して,システムの目的に基づき,運用,効率,コスト,品質,信頼性分析等を行います.場合によっては,目的自身を再検討する場合もあり得ます.
- システム計画 システムが完成するまでの日程計画を作成します.このとき,予算(コスト)や信頼性などの管理計画も作ります.
- システム設計 最適なシステムを目指し,システム全体,サブシステム,構成部品等の設計を行います.
- システム製造 システム設計にしたがって,実際にハードウェア,ソフトウェアを製造します.
- システム運用 システムが本来の目的を達成できるように保守,整備を行います.
- ステムエンジニアに必要な知識
- SE に必要な知識としてコミュニケーション能力が良くあげられます.また,複数の人間でシステムを作り上げる際には,管理能力も当然必要になります.これらの能力は,一般的なシステムエンジニアに対しても当然要求される能力ですが,ここでは,これらの社会人基礎力的な能力については触れません.
- SE の仕事内容や必要な知識に関して,インターネットなどに書かれているものを読むと非常に気になる点があります.SE の仕事は,顧客の要求を聞き,それを満足するコンピュータシステムを構築することであるといった内容がほとんどです.コンピュータ等の構成が決まっていれば,これでは,単に,「顧客が要求する入出力を行うプログラム」を書くプログラマに過ぎません.しかし,先に述べたように,情報システムもシステムの一種です.必ず,システムエンジニアが必要です.システムエンジニアにとって最も重要なのは,システム工学の手順の中に記述した「システムの目的」を明確にすることですが,そのような記述がほとんどありません.顧客の業務内容,システム利用者の要求・使用方法,他のシステムとの関係等を分析し,その中で顧客やシステム利用者にとって最適なコンピュータシステムを提案できるようでなければなりません.また,場合によっては,顧客の業務内容の他の部分を改善することによって,顧客が要求するシステムを必要としない場合もあるかもしれません.単に顧客の要求を聞き,それを実現するだけでなく,より踏み込んだ検討が必要です.そのようなことができなければ,とてもシステムエンジニアとは言えません.
- 情報システムを例として,もう少し,システムエンジニアの必要性について述べていきます.現在,業務ごとに,多くのパッケージソフトが販売されています.従って,組織全体の情報システムのあり方等を検討するシステムエンジニアが存在しなくても,組織内のある分野で必要な処理を行うパッケージソフトを導入し,また,別の分野ではその分野で必要な別のパッケージソフトを導入するといったことを繰り返して,全体の情報システムを構築することも可能です.要するに,各分野にとって最適なサブシステムの集まりとして,全体システムを構築する方法です.一つのサブシステムに問題が生じても他のサブシステムに影響を与えにくい,情報の漏洩も一部のサブシステム内にとどまる可能性が高いなどの利点もありますが,一般には,使いやすさ,マンパワーを含めたりソースの無駄遣い等の問題が発生する場合が多いと思います.その一つの例が官公庁のシステムです.ある処理を行うために,複数の窓口を訪れるなどという経験は誰にでもあるかと思います.極端な例かもしれませんが,"父親が亡くなった"ような場合について考えてみてください.官公庁の情報システムが統合されていれば,死亡届と相続者情報を一つの窓口に提出すれば,ほとんどすべての処理が終わるはずです.実際には,市役所の複数の窓口,年金事務所,法務局など,複数の場所へ,同じような書類を用意して出向かざるを得ません.我々の手間も必要ですし,さらに,それらの書類を処理する公務員も必要(税金が高くなる)です.確かに,個人番号制度に対する反対の理由として挙げられているセキュリティ上の問題もありますが,全体システムを考慮した優れたシステムが存在すれば,我々の手間と公務員の削減には大きな力となるはずです.
- 「システムエンジニアの基礎知識」は,Ⅱ部構成になっています.システムエンジニアは,システム工学的な考え方と共に,システムの分析,設計,運用を行うための手法に対する知識も必要です.直接自分で行うことはなくても,どのような手法が存在するか程度の知識は必要だと思います.第 Ⅱ 部では,そのような手法について簡単に述べています.実際の問題においては,システムが対象とする各分野に関する知識も必要となりますが,ここでは触れません.第 Ⅱ 部で扱う各手法をより深く知ろうとすれば,どうしても数学的な知識が必要になります,第 Ⅰ 部は,そのような数学に関する記述です.特に,線形代数,微分積分,確率統計は,様々な分野の基礎となっていますので,システムエンジニアだけではなく,一般の技術者にも身につけてもらいたいと思います.ただし,「代数系」,「ブール代数」,及び,「記号論理学」に関しては,第 Ⅱ 部を理解する上で直接必要とすることはないと思われますので,読み飛ばしてもらっても構いません.なお,第 Ⅰ 部の「基礎数学」は,小学校から高校までに学んだ数学を思い出し,理解し治してもらうための部分になっています.その内容は,「基礎数学」とほとんど同じです(「基礎数学」内に記述がある「集合」,「ブール代数と命題論理」,「空間図形」,「微分・積分」,「順列・組合せと確率」は除く)が,演習問題は含まれていません.
- また,現在では,多くのシステムにおいて,コンピュータが主要な役割を果たしています.従って,どのような分野であれ,コンピュータ関連の知識も多かれ少なかれ必要になってくる場合が多いと思います.特に,コンピュータソフトウェアの開発が大きな部分を占めるようなシステムにおいては,少なくとも一つ以上の言語に対する十分なプログラミング技術を持っている必要があるのではないでしょうか.なぜなら,目的とすることをソフトウェアで実現可能か,どの程度の困難さが伴うのか,どのようにすれば最適なプログラムかを書けるのか,などといった判断は,そのシステムの開発に携わっている人自身が判断するのが最も好ましいからです.それが可能であるためには,判断者自身が十分なプログラミング能力を持っている必要があります.コンピュータ関連の知識やプログラミング技術については触れませんが,本文には,各手法に対する C/C++ と Java (一部に,JavaScript を含む)によるプログラム例をできるだけ添付すると共に,他の言語( PHP,Ruby,Python,C#,VB )によるプログラム例も示してしていくつもりです.これらのプログラミング言語に関しては,「C/C++ 言語」,「 Java と C/C++ 」,「 JavaScript と C/C++」,「 PHP と C/C++」,「Python と C/C++ 」,「Ruby と C/C++ 」,「プログラミング言語の落とし穴」などを参考にして下さい.