サイトアイコンmaita tomoya dev io

技術選定の評価基準

introduction

技術選定の評価基準

はじめに

技術選定で最も難しいのは、「何を基準に判断するか」を決めることです。明確な評価基準がないまま議論を始めると、個人の好みや経験に基づいた主観的な判断になりがちです。

本記事では、技術選定における評価基準を体系的に解説し、実際に使える評価マトリクステンプレートを紹介します。


機能要件 vs 非機能要件

技術選定の出発点は、要件を「機能要件」と「非機能要件」に分類することです。

機能要件(Functional Requirements)

「システムが何をするか」を定義するものです。

例: ECサイトの場合
+-------------------------------------------+
| 機能要件                                   |
+-------------------------------------------+
| - 商品の検索ができる                        |
| - カートに商品を追加できる                   |
| - クレジットカードで決済できる                |
| - 注文履歴を確認できる                      |
| - 商品レビューを投稿できる                   |
+-------------------------------------------+

非機能要件(Non-Functional Requirements)

「システムがどのように動くか」を定義するものです。技術選定では、非機能要件がより大きな影響を持ちます。

例: ECサイトの場合
+-------------------------------------------+
| 非機能要件                                 |
+-------------------------------------------+
| - ページ表示が2秒以内                       |
| - 同時10,000人のアクセスに耐えられる         |
| - 99.9%の可用性                            |
| - 個人情報を暗号化して保存                   |
| - 24時間365日稼働                          |
| - 障害発生時に30分以内に復旧                 |
+-------------------------------------------+

なぜ非機能要件が技術選定に大きく影響するのか

機能要件は、ほとんどの技術で実現できます。ECサイトはJavaでもPythonでもGoでも作れます。しかし非機能要件は、選んだ技術によって達成の難易度が大きく変わります。

非機能要件技術選定への影響例
高スループットNode.jsの非同期I/O vs Rubyの同期処理
低レイテンシRustのゼロコスト抽象化 vs Pythonのインタプリタ
高可用性Erlang/OTPの耐障害性 vs 一般的なWebフレームワーク
リアルタイム性Go/Elixirの並行処理 vs PHPのリクエスト/レスポンスモデル

パフォーマンス

パフォーマンスは複数の指標で測定します。

主要なパフォーマンス指標

+-------------------------------------------------------------------+
|                      パフォーマンス指標                               |
+-------------------------------------------------------------------+
|                                                                   |
|  レイテンシ (Latency)                                              |
|  → リクエストを送ってからレスポンスを受け取るまでの時間                  |
|  → 単位: ミリ秒 (ms)                                               |
|  → 例: API応答時間 50ms以下                                        |
|                                                                   |
|  スループット (Throughput)                                          |
|  → 単位時間あたりに処理できるリクエスト数                              |
|  → 単位: requests/second (rps)                                    |
|  → 例: 10,000 rps                                                 |
|                                                                   |
|  同時接続数 (Concurrency)                                          |
|  → 同時に処理できる接続の数                                         |
|  → 例: WebSocket 100,000同時接続                                   |
|                                                                   |
|  レスポンスタイム分布                                               |
|  → P50, P95, P99で測定                                            |
|  → 平均値だけでは不十分(外れ値の影響)                               |
|                                                                   |
+-------------------------------------------------------------------+

パーセンタイルの重要性

パフォーマンスを「平均値」だけで判断するのは危険です。

例: API応答時間

平均値: 100ms(一見問題なさそう)

しかし実際の分布:
  P50 (50%):   50ms  ← 半数のリクエストは50ms以下
  P95 (95%):  200ms  ← 95%のリクエストは200ms以下
  P99 (99%): 2000ms  ← 1%のリクエストが2秒かかっている!

1日100万リクエストの場合:
  → 10,000リクエストが2秒以上かかる
  → これは無視できない数字

言語別パフォーマンス比較(Web API処理の目安)

言語/ランタイムレイテンシ(P99)スループット(rps)メモリ使用量
C/C++極めて低い極めて高い極めて少ない
Rust極めて低い極めて高い極めて少ない
Go低い高い少ない
Java (JVM)低い(ウォームアップ後)高い多い
C# (.NET)低い高いやや多い
Node.js中程度中〜高い中程度
Pythonやや高い中程度中程度
Rubyやや高い低〜中程度やや多い
PHP中程度中程度少ない(リクエスト単位)

注意: これは一般的な傾向であり、フレームワークや実装方法によって大きく変動します。


スケーラビリティ

垂直スケーリング vs 水平スケーリング

垂直スケーリング(スケールアップ)
  サーバーのスペックを上げる

  Before:          After:
  +--------+       +--------+
  | 4 CPU  |       | 16 CPU |
  | 8GB RAM|  -->  | 64GB   |
  | 100GB  |       | 1TB    |
  +--------+       +--------+

  メリット: シンプル、アプリ変更不要
  デメリット: 物理的な上限がある、コスト効率が悪い


水平スケーリング(スケールアウト)
  サーバーの台数を増やす

  Before:          After:
  +--------+       +--------+ +--------+ +--------+
  | Server |       | Server | | Server | | Server |
  +--------+       +--------+ +--------+ +--------+
                         \       |       /
                        +-----------------+
                        | Load Balancer   |
                        +-----------------+

  メリット: 理論上無限に拡張可能、コスト効率が良い
  デメリット: アプリの設計が複雑になる、状態管理が難しい

技術選定とスケーラビリティの関係

技術特性垂直スケーリング向き水平スケーリング向き
ステートフル(状態を持つ)向いているセッション管理が課題
ステートレス(状態を持たない)問題なし非常に向いている
マルチスレッドCPUコア増加で性能向上問題なし
シングルスレッドCPU増加の恩恵が小さいプロセス分散で対応
共有メモリ向いている分散キャッシュが必要

開発生産性

開発生産性は技術選定で最も議論が分かれるポイントの一つです。

学習曲線

                    習熟度
                    ^
                    |
                    |                              ......... Python
                    |                       .......
                    |                 ....../
                    |           ...../
                    |       .../        _ _ _ _ _ TypeScript
                    |     ./      _ _ _/
                    |   ./   _ _/
                    |  /  __/    .  .  .  .  .  . Rust
                    | / _/   . .
                    |/_/ . .
                    |. .
                    +---------------------------------> 学習時間

開発生産性を構成する要素

要素説明測定方法の例
学習曲線新しいメンバーが生産的になるまでの時間オンボーディング期間
ボイラープレート繰り返し書く必要のあるコード量同じ機能を実装するのに必要な行数
デバッグ容易性バグの原因特定にかかる時間エラーメッセージの質、デバッグツール
ツールチェーンビルド、テスト、デプロイの自動化しやすさCI/CDパイプライン構築時間
IDE対応コード補完、リファクタリング支援主要IDEのプラグイン数
ドキュメント公式ドキュメントの質と量主観的評価 + ページ数

採用市場

技術選定がビジネスに直接影響する領域の一つが「採用市場」です。

プログラミング言語の採用市場(2025-2026年の傾向)

言語求人数(相対値)平均年収(目安)候補者数採用難易度
JavaScript/TypeScript非常に多い中〜高非常に多い
Python非常に多い中〜高多い
Java多い中〜高多い
Go中程度高いやや少ない
Rust少ない高い少ない
Ruby中程度中〜高中程度
PHP多い中程度多い
Kotlin中程度高いやや少ない
Swift中程度高いやや少ない

採用市場を考慮した技術選定の考え方

                      採用コスト
                      ^
                      |
                      |  *Rust
                      |
                      |     *Go    *Kotlin
                      |
                      |        *Ruby
                      |
                      |  *Java      *TypeScript
                      |        *Python
                      |  *PHP
                      +-------------------------> 候補者プール
                      少ない               多い

コミュニティとエコシステム

パッケージマネージャー別パッケージ数(2025-2026年時点の概算)

パッケージマネージャー言語パッケージ数(概算)
npmJavaScript/TypeScript200万+
PyPIPython50万+
Maven CentralJava60万+
NuGetC#40万+
crates.ioRust15万+
RubyGemsRuby17万+
PackagistPHP35万+
pkg.go.devGo100万+ モジュール
pub.devDart5万+

エコシステムの健全性を評価する指標

パッケージ数だけではなく、以下の指標も重要です。

指標説明確認方法
メンテナンス頻度パッケージが定期的に更新されているか最終リリース日
セキュリティ対応脆弱性が報告されたときの対応速度CVEデータベース
ドキュメント品質使い方が分かりやすく文書化されているかREADMEとAPI doc
テストカバレッジパッケージ自体のテストが充実しているかCI結果
ライセンス商用利用が可能かライセンスファイル
ダウンロード数実際にどれくらい使われているかパッケージマネージャーの統計
依存関係の深さ間接依存がどれくらいあるか依存解析ツール

セキュリティ

セキュリティ観点での技術評価

評価項目説明重要度
メモリ安全性バッファオーバーフロー等の脆弱性
型安全性型に起因するバグの防止
脆弱性対応速度CVE公開から修正までの時間
セキュリティ機能暗号化、認証、サンドボックス
依存関係の監査サプライチェーン攻撃への耐性
セキュリティツールSAST、DAST、SCA対応

言語別メモリ安全性

メモリ安全性のスペクトル

安全 <-------------------------------------------------> 危険

  Rust     Go      Java     JavaScript    C++       C
  (所有権   (GC +    (GC)     (GC)         (手動     (手動
   システム) ポインタ                       管理 +    管理)
            制限)                          スマート
                                          ポインタ)

コスト

TCO(Total Cost of Ownership / 総所有コスト)

技術選定のコストは初期費用だけでなく、運用期間全体を通じた総コストで評価します。

+-----------------------------------------------------------+
|                   TCO(総所有コスト)の構成                    |
+-----------------------------------------------------------+
|                                                           |
|  初期コスト (Year 0)                                       |
|  +-----------------------------------------------------+ |
|  | ライセンス購入費                                      | |
|  | 環境構築費                                            | |
|  | トレーニング費                                        | |
|  | 移行費(既存システムからの移行がある場合)               | |
|  +-----------------------------------------------------+ |
|                                                           |
|  年間運用コスト (Year 1-N)                                 |
|  +-----------------------------------------------------+ |
|  | インフラ費用(クラウド、サーバー)                      | |
|  | ライセンス更新費                                      | |
|  | 保守・監視費用                                        | |
|  | セキュリティ対応費                                    | |
|  | バージョンアップ対応費                                | |
|  +-----------------------------------------------------+ |
|                                                           |
|  人件費                                                    |
|  +-----------------------------------------------------+ |
|  | 開発者の給与                                          | |
|  | 採用コスト                                            | |
|  | トレーニングコスト(新メンバー)                        | |
|  +-----------------------------------------------------+ |
|                                                           |
+-----------------------------------------------------------+

OSSとプロプライエタリの比較

項目OSSプロプライエタリ
ライセンス費無料(多くの場合)有料
サポートコミュニティ依存公式サポート
カスタマイズ自由制限あり
ベンダーロックイン低い高い
セキュリティコミュニティ監査ベンダー責任
隠れコスト自前サポート、運用追加ライセンス

評価マトリクステンプレート

実際のプロジェクトで使える評価マトリクスのテンプレートを紹介します。

手順

  1. 評価観点の選定: プロジェクトに関係する評価観点を選ぶ
  2. 重み付け: 各観点の重要度を1〜5で設定する
  3. 候補技術のスコアリング: 各候補技術を1〜5で評価する
  4. 加重スコアの計算: 重み x スコアを計算する
  5. 定性的評価の追加: スコアだけでは表現できない要素を補足する

テンプレート例

プロジェクト名: [                    ]
評価日: [YYYY-MM-DD]
評価者: [                    ]

+-------------------+------+----------+----------+----------+
| 評価観点           | 重み  | 候補A     | 候補B     | 候補C     |
|                   |      | スコア(加重)| スコア(加重)| スコア(加重)|
+-------------------+------+----------+----------+----------+
| 機能適合性         | [ ]  | [ ]( )   | [ ]( )   | [ ]( )   |
| パフォーマンス     | [ ]  | [ ]( )   | [ ]( )   | [ ]( )   |
| スケーラビリティ   | [ ]  | [ ]( )   | [ ]( )   | [ ]( )   |
| 開発生産性         | [ ]  | [ ]( )   | [ ]( )   | [ ]( )   |
| 学習コスト         | [ ]  | [ ]( )   | [ ]( )   | [ ]( )   |
| エコシステム       | [ ]  | [ ]( )   | [ ]( )   | [ ]( )   |
| コミュニティ       | [ ]  | [ ]( )   | [ ]( )   | [ ]( )   |
| 採用市場           | [ ]  | [ ]( )   | [ ]( )   | [ ]( )   |
| セキュリティ       | [ ]  | [ ]( )   | [ ]( )   | [ ]( )   |
| コスト             | [ ]  | [ ]( )   | [ ]( )   | [ ]( )   |
+-------------------+------+----------+----------+----------+
| 合計               |      |          |          |          |
+-------------------+------+----------+----------+----------+

定性的評価:
候補A: [                                                    ]
候補B: [                                                    ]
候補C: [                                                    ]

最終判断: [                                                  ]
判断理由: [                                                  ]

技術レーダーの読み方

ThoughtWorks Technology Radar とは

ThoughtWorks社が半年ごとに発行する、技術トレンドのレポートです。技術を4つのカテゴリと4つのリングで分類しています。

4つのカテゴリ(Quadrants)

カテゴリ説明
Techniques開発手法やプロセスマイクロサービス、TDD
PlatformsインフラやプラットフォームKubernetes、Cloudflare Workers
Tools開発ツールGitHub Copilot、Terraform
Languages & Frameworks言語やフレームワークRust、Next.js

4つのリング(Rings)

+--------------------------------------------------+
|                                                  |
|   +------------------------------------------+   |
|   |                                          |   |
|   |   +----------------------------------+   |   |
|   |   |                                  |   |   |
|   |   |   +--------------------------+   |   |   |
|   |   |   |                          |   |   |   |
|   |   |   |       ADOPT(採用)       |   |   |   |
|   |   |   |    業界で実績あり。        |   |   |   |
|   |   |   |    積極的に採用すべき      |   |   |   |
|   |   |   |                          |   |   |   |
|   |   |   +--------------------------+   |   |   |
|   |   |          TRIAL(試行)            |   |   |
|   |   |       リスクを管理して試すべき     |   |   |
|   |   +----------------------------------+   |   |
|   |            ASSESS(評価)                 |   |
|   |          調査・検討する価値がある          |   |
|   +------------------------------------------+   |
|                  HOLD(保留)                      |
|               慎重に扱うべき。新規採用は非推奨      |
+--------------------------------------------------+
リング意味技術選定での扱い
Adopt業界で実績があり、推奨本番環境での採用を積極的に検討
Trial十分に成熟しており、試す価値があるPoCでの検証を推奨
Assess将来性がある。調査する価値がある情報収集を開始。PoCはまだ早い
Hold注意が必要。新規採用は推奨しない既存プロジェクトの移行を検討

技術レーダーの活用方法

  1. 自社の技術レーダーを作る: ThoughtWorksの形式を参考に、自社の技術レーダーを定期的に更新する
  2. 新技術の評価基準にする: 「Adopt」の技術は安心して採用、「Hold」の技術は新規採用を避ける
  3. チーム内の共通言語にする: 「この技術はTrialフェーズなので、PoCから始めよう」という会話ができるようになる

まとめ

技術選定の評価基準は多岐にわたりますが、以下のポイントを押さえておけば、大きく外すことはありません。

  1. 機能要件と非機能要件を分けて整理する -- 特に非機能要件が技術選定に大きく影響する
  2. パフォーマンスは平均値ではなくパーセンタイルで測定する -- P99を見落とさない
  3. スケーラビリティは水平・垂直の両面で評価する -- 将来の成長を見据える
  4. 採用市場は軽視しない -- 素晴らしい技術でも人が採れなければ意味がない
  5. コストはTCOで計算する -- ライセンス費だけでなく、人件費や運用費も含める
  6. 評価マトリクスを使って定量的に比較する -- 感覚ではなくデータで判断する
  7. 技術レーダーを参考にする -- ただし、自社の文脈に合わせて判断する

参考資料