
箱 ーモジュール化
構造図の四角い箱が識別可能なモジュール単位です。粒度が小さい順に、関数 < ファイル < コンポーネントがモジュールに相当します。モジュールは名称とインタフェースを持ちます。名称は、問題ドメインの名称(What名称)を使い、ソフトウェア技術の名称(How名称)を避けることで、理解し易くなります。インタフェースは提供インタフェースとして、他のモジュールからの使われ方を定義します。
線 ーレベル化
関数コールや変数アクセスが線になります。モジュールは上位が下位を利用するという上下関係を設計します。それを「レベル化」と呼びます。レベル化することでソースコードとしては単方向依存になり、変更の影響範囲を限定することができます。
配置 -水平垂直分割規則
水平方向はレイヤー化、垂直方向はパーティション化することが設計になります。水平方向はアプリ層ーミドル層ードライバ層をいった階層化をします。垂直方向は局所的設計での縦割り、そして大局的設計では横断的関心や異ドメインを分離します。階層化は階層ごとのポータビリティを上げるとともに、差し替えることで複数のハードウェアへの対応や、アプリケーションの追加削除が容易になります。横断的関心の分離は、局所的設計では入出力分離やSTS分割することができます。入力(センサー)が変わっても出力(アクチュエータ)に影響しないという設計ができます。大局的設計では、横断的関心として初期化やエラー処理を機能実現部と分離します。そのことで機能実現部は明快で安定した構造になります。エラー処理が内部に入り込むと、構造が絡み合ってしまいます。異ドメインの分離では、ユーザインタフェースや通信プロトコルを分離します。操作パネルや外部通信の置換が容易になります。A2G配置というフォルダ構成をすることでカテゴリ(コンポーネント)を設計することができます。
時代を6つに分類してみました。
1.アセンブリ時代
CPUアーキテクチャを知ったうえでプログラミング。
2.ファームウェア時代
コードが全体を見通せる規模。
3.モジュール化時代
全体を見通せない規模になり抽象化技術が必要になった時代。
4.リファクタリング時代
「動くコード」を局所的に保守改訂した時代。
5.アーキテクティング時代
全体構造を俯瞰しつつビジネスとテクノロジをつなぐ時代。
6.書く⇒読むへの転換の時代
自分で作っていないコードを使って開発する時代。
ソフトウェアの規模とエンジニア個人についての所感を書いてみます。
ソフトウェアの規模は、アセンブリ時代/ファームウェア時代は、一人で全体を把握できる規模でした。職人技の時代です。
その後、機器の機能が増えるに伴いモジュール化時代に推移していきました。 実装に近い設計技法が出現して、構造化手法やオブジェクト指向に取り組む動きが出てきました。 モジュール化することで、ある程度大きな規模でも、きちんと動くコードが作られました。
その後、その動くコードを改修するリファクタリング時代に入りました。 動くコードがあるため、それを部分的に修正していくという開発が横行し、コードが徐々に在庫化してしまいました。 リファクタリング時代で、実装改善や設計改善は、あまり行われなかったことが、さらに状況を悪化させています。 プロセス改善活動で品質の維持ができていますが、ソフトウェア設計の失われた20年、という印象です。 さすがに部分最適の積み上げでは、不具合のモグラたたきや開発期間の超過が目立つようになり、アーキテクティング時代に突入しつつあります。
アーキテクティング時代は、モジュール作成よりもモジュール利用に重心が移り、モジュール間のデータを定義・分析・活用して、新たな価値を生み出す時代です。 2025年現在で、部署内にソフトウェアアーキテクトが存在している組織は少ない状況です。 技術リーダーとして、ビジネスとテクノロジを繋ぎ、アーキテクチャドキュメントを使ってリーダーシップを発揮する人材の育成が鍵です。
そして、書く⇒読むへの転換へ。自分で作っていないコードをアーキテクチャに当てはめて品質を作り込む設計が求められています。 他者が作って積み上げてきた「秘伝レガシー」そして、生成AIが作り出す「即席レガシー(インスタントレガシー)」を、素早く理解し、責任を持って使いこなす開発になるでしょう。「読む→理解する→責任を持って使う」ためには、下に示す「カテゴリAPI駆動アプローチ」がひとつの解になるはずです。
カテゴリAPIファースト工法とは
カテゴリ単位のインタフェースを決めてコードを当てはめていく手法です。通称:CAFEアプローチ。[Category API First Engineering]
カテゴリとは、同種のファイル(クラス)の集合体であり、インタフェースを有するコンポーネントです。
粒度の大きなソフトウェア集合をコンポーネントとしてインタフェースを定義します。秘伝レガシーや即席レガシーのコードを当てはめてインタフェースを崩さずに開発できます。
開発初期にはドラフトの全体構造とインタフェースを決めて、スケルトンコードで構造を確認します。
開発中盤では、動くコードを当てはめつつインタフェースを洗練化していきます。
開発後半では、インタフェースを崩さずに開発します。インタフェースの門番となる「アーキテクト」が開発チームを支えます。
設計意図発掘ツールAtScopeでコードとアーキテクチャを一致させながら開発できます。
生成AI時代の組込みソフトウェア開発
ビースラッシュが考える生成AI時代の組込みソフトウェ開発です。

AIによる音声ガイドは こちら です。