共通化と標準化を混同せずに使い分けること
技術的な標準化を進める中で、重要な観点。
まだきれいに言語化できる状態ではないが、メモしておく。
共通化・標準化の違い
ChatGPTに聞いてみた。
共通化と標準化は、両方とも異なるものを同じにすることを意味しますが、微妙な違いがあります。
共通化は、複数の要素やプロセスを共通の基準や形式に統一することです。これにより、異なるものが互換性を持ち、相互運用可能になります。共通化は、一般的な目的を持つ要素やプロセスに適用されます。例えば、異なる製造業者が同じ規格のネジを作ることで、ネジが共通化されます。
一方、標準化は、特定の分野や業界において、品質や性能、手順などの基準を定めることです。標準化は、特定の製品やサービスが一定の品質や性能を満たすようにするために行われます。例えば、ISO(国際標準化機構)が定める品質管理の規格は、製品の品質を標準化します。
要するに、共通化は異なるものの間での互換性や相互運用性を高めるために行われる一般的なプロセスであり、標準化は特定の品質や性能を確保するための規格を定めるプロセスです。
3行でまとめると
- 標準化は守るための基準を定める。共通化は同じものを使い回す。
- 共通化の目的:コスト削減、効率化
- 標準化の目的:互換性の確保、品質や性能の確保
共通化・標準化を使い分けるための観点
共通化・標準化をうっかり混同してしまうことがある。
そこで共通化・標準化の使い分けに有用な観点を、例とともに挙げる。
例外を許容するか、しないか
標準化は例外を許容するが、共通化は例外を許容しない。
そして例外を許容しないこと、すなわち共通化は認知負荷を大きく下げるという大きなメリットが存在する。
共通であるならば、1つを理解すれば共通部分については全て理解したことになる。
しかし誤って共通化を適用すると、変化への対応力が低下する可能性がある。
例えば「現時点では共通しているが、それは偶然一致しているだけ」というケースがある。
本質的に共通なのか・時代や環境が変わっても共通するのかを考えず、安易な共通化を選択することは避けたい。
変化への適応か、コスト最適化か
標準化は変化に適応しやすく、共通化はコスト最適化に優れる。
共通化を進めれば進めるほど足並みを揃える必要があるため、スピード感が下がり、変化への適応力は低下する。
いわゆるアジャイル開発の価値の一つは、変化への適応。
変化への適応によって価値を生み出そうとしているのであれば、共通化によるコスト最適化の優先度は低くなるだろう。
トップダウンか、ボトムアップか
標準化はトップダウン的な活動で、共通化はボトムアップ的な活動。
現場に近いほど共通化に関心が向きやすく、マネジメントや経営に近いほど標準化に関心が向きやすい。
「標準化の一手段として共通化が効果的」というケースは存在するため、トップダウンの共通化を全否定するつもりはない。
しかし「標準化が目的の活動なのに、いつのまにか共通化が目的」にすり替わってしまわないよう注意が必要。
共通化・標準化のケーススタディ
開発プロセスは標準化
社内の開発プロセスは、標準化を目指すのが適切だろう。
マネージャー視点での認知負荷から共通化したくなる場合もあるだろうが、共通化するとプロダクトやドメインが異なる場合に非効率・不適切な部分が出てくる。
標準化しておけば、詳細はプロダクトやドメインによって異なるアプローチを取る自由度があるので、最適化しやすくなる。
ソフトウェアモジュールの標準化・共通化
ソフトウェアのモジュールにおいては、標準化・共通化の双方のアプローチがあり得る。
共通化する場合は、社内ライブラリとしてパッケージ化し、各チームが利用できるように配布することとなる。
標準化する場合は、リファレンスとなる実装サンプルを用意し、各チームはそれを参照することとなる。
顧客からの要求によって変化するような領域は、下手に共通化を選択すると要求への対応力が失われることになる。
一方、デザインやコンポーネントの実装においては、共通化を選択することで例外をなくし、統一感を実現することができる。
抽象クラスは共通化、インタフェースは標準化
例として、Javaにおける抽象クラス(abstract class)とインタフェース(interface)の使い分けを挙げる。
抽象クラスは、インタフェースよりも強力な共通化と制約をもたらす。
スーパークラスは実装を持つことができ、スーパークラスのメソッドの実装が変わるとサブクラスにも影響し得る。
また、抽象クラスは多重継承できないという制約が存在する。
一方で、インタフェースが共通化するのはメソッド名やその入出力までに留まり、具体的な処理(How)は共通化されない。
またインタフェースは複数実装することが可能であり、継承よりも柔軟である。
つまり抽象クラスはHowを共通化するが、インタフェースはHowを共通化しない。
共通化は標準化の一手段であるが、「何のために、何をどこまで共通化したいのか」によって使い分ける必要がある。