CS/SE Fundamentals

全体マップ: CS/SE の領域

はじめに

ソフトウェアエンジニアとして働く上で、コンピュータサイエンス (CS) とソフトウェアエンジニアリング (SE) の全体像を把握しておくことは極めて重要だ。個別のトピックを深く学ぶ前に、まずどのような領域が存在し、それらがどう繋がっているかを理解しよう。

この全体マップは「すべてを暗記する」ためのものではない。自分が今どの領域の問題に取り組んでいるかを素早く認識し、適切な知識を引き出すための地図だ。


CS/SE の主要領域

1. データ構造とアルゴリズム (Data Structures & Algorithms)

ソフトウェアの「計算の基盤」にあたる領域。

  • データ構造: 配列、連結リスト、ハッシュテーブル、木、グラフなど
  • アルゴリズム: ソート、探索、グラフ走査、動的計画法など
  • 計算量 (Big-O): 処理の効率を評価する共通言語

実務での関連: API レスポンスタイムの改善、大量データの効率的な処理、適切なデータ構造の選択。

2. システム設計 (System Design)

「どうやって大規模なシステムを構築・運用するか」を扱う領域。

  • スケーラビリティ、可用性、一貫性
  • ロードバランシング、キャッシュ、メッセージキュー
  • マイクロサービス vs モノリス
  • データベース設計とシャーディング

実務での関連: 医療 SaaS としての信頼性設計、患者データの安全な取り扱い。

3. ネットワークと通信 (Networking & Communication)

データがシステム間をどう流れるかを理解する領域。

  • OSI / TCP-IP モデル
  • HTTP/HTTPS、DNS、TLS
  • REST、GraphQL、WebSocket
  • CDN、リバースプロキシ

実務での関連: API 設計、パフォーマンス最適化、セキュアな通信の確保。

4. データベース (Databases)

データの永続化と効率的な取得を扱う領域。

  • リレーショナル DB (PostgreSQL, MySQL) と NoSQL
  • ACID 特性、インデックス、クエリ最適化
  • 正規化、マイグレーション
  • ORM の利点と落とし穴

実務での関連: 患者情報・診療データの管理、レポーティング、監査ログ。

5. OS とインフラストラクチャ (OS & Infrastructure)

ソフトウェアが動作する「土台」を理解する領域。

  • プロセス、スレッド、メモリ管理
  • コンテナ (Docker)、オーケストレーション
  • クラウド (AWS): VPC, ECS, S3, IAM
  • Infrastructure as Code (IaC)

実務での関連: デプロイメント、スケーリング、コスト最適化、環境の再現性。

6. セキュリティ (Security)

システムとデータを脅威から守る領域。

  • 認証 (Authentication) と認可 (Authorization)
  • 暗号化、OAuth/OIDC
  • OWASP Top 10 (XSS, CSRF, SQL Injection など)
  • 医療データ特有のセキュリティ要件

実務での関連: 患者データの保護、コンプライアンス、脆弱性対策。

7. ソフトウェアエンジニアリングの実践 (SE Practices)

チームとして質の高いソフトウェアを継続的に届けるための方法論。

  • バージョン管理 (Git)、ブランチ戦略
  • コードレビュー、テスト戦略
  • CI/CD パイプライン
  • 技術的負債の管理

実務での関連: 開発速度と品質のバランス、チームコラボレーション。


領域間の関係性

これらの領域は独立しているわけではなく、密接に関連し合っている。

                    ┌─────────────────┐
                    │  SE Practices   │
                    │ (横断的な実践)   │
                    └────────┬────────┘
                             │
        ┌────────────────────┼────────────────────┐
        │                    │                    │
  ┌─────┴─────┐      ┌──────┴──────┐     ┌──────┴──────┐
  │  System    │      │  Security   │     │  Networking │
  │  Design    │◄────►│             │◄───►│             │
  └─────┬──────┘      └──────┬──────┘     └──────┬──────┘
        │                    │                    │
  ┌─────┴──────┐      ┌──────┴──────┐     ┌──────┴──────┐
  │ Databases  │◄────►│  OS & Infra │◄───►│  DS & Algo  │
  └────────────┘      └─────────────┘     └─────────────┘

具体的な繋がりの例:

シナリオ関連する領域
API のレスポンスが遅いアルゴリズム + データベース + ネットワーク
新機能のデプロイSE Practices + インフラ + セキュリティ
データ漏洩リスクの評価セキュリティ + データベース + ネットワーク
システム障害への対応システム設計 + インフラ + ネットワーク
患者データの新しい集計機能データベース + アルゴリズム + システム設計

学び方のガイドライン

広さと深さのバランス

すべてを深く知る必要はないが、各領域の基本概念と用語は押さえておきたい。以下のレベル感を目安にしよう:

レベル説明目安
認知概念の存在を知っている全領域
理解仕組みを説明できる日常業務に関連する領域
応用実際の問題に適用できる自分の専門領域
評価トレードオフを判断できるシニアレベルの領域

実践的なアプローチ

  1. 日常業務から学ぶ: 使っている技術の「なぜ」を掘り下げる
  2. 障害から学ぶ: インシデントの根本原因を追うと複数領域の理解が深まる
  3. 設計レビューに参加する: システム設計の議論はあらゆる領域の知識を動員する
  4. 教えることで学ぶ: 他のエンジニアに説明すると理解の穴が見える

医療 SaaS エンジニアとしての優先順位

raica のエンジニアとして、特に重視すべきポイント:

  1. セキュリティと患者データ保護 - 最優先。データ漏洩は事業の存続に関わる
  2. データベースと永続化 - 診療データの正確性と完全性は生命に関わりうる
  3. システムの可用性 - 医療現場でシステムが止まることの影響は大きい
  4. SE Practices - 品質を担保する仕組みがなければ、上記すべてが危うくなる

Agent-first 開発においてこれが重要な理由

AI コーディングエージェントに的確な指示を出すには、何を作るべきかの全体像を理解している必要がある。

  • 適切な制約を与えられる: 「この機能はセキュリティ上の配慮が必要」「ここはパフォーマンスが重要」といった文脈をエージェントに伝えられる
  • 出力を評価できる: エージェントが生成したコードが適切かどうか、CS/SE の知識がなければ判断できない
  • 問題を正しく分解できる: 大きな課題を「データベース設計の問題」「ネットワークの問題」「セキュリティの問題」と切り分けて、それぞれに適切な指示を出せる
  • 用語で正確にコミュニケーションできる: 「O(n^2) になっているので O(n log n) のアルゴリズムに変更して」のように、曖昧さのない指示が可能になる

エージェントは実装の細部を担えるが、アーキテクチャの判断と品質の評価は人間の責任だ。この全体マップはその判断力の土台となる。


Further Reading