メモ : ソフトウェアエンジニアに求められる能力
前提 : IT システムを含んだサービスの提供の全体像
提供価値の創出・磨きこみ
定常的な価値提供 (定常業務)
抽象度・時間軸を考えたソフトウェアエンジニアが見るべきもの
nobuoka.icon 例えば 「SEO 戦略」 みたいなのはここに入るイメージ (デジタル戦略の一部とかかな)
より細分化された中長期のゴール (部署単位など) や、ゴール達成のためのより短期的 (四半期から 1 年程度) な達成目標、戦術 (四半期から 1 年程度のスパン) 戦術のための日々の実務 (運用、実践)
対象物での分け
事業要件 : 事業要件に対する理解
業務要件 : 業務に対する理解、あるいはその要件定義への伴走
システム・ソフトウェア要件、SLA 定義など : システムやソフトウェアに求められていることの理解、あるいは要件を定義すること
アーキテクチャ設計や基盤周り、運用や移行の設計など
詳細設計や構成の詳細など
実コードの生成や実際の運用など
範囲での分け
nobuoka.icon 何をもってひとつの IT システムとするかは明確には定義できなさそう 一部 : IT システムの要素 (ソフトウェアやコンポーネント) とか、一部の業務など nobuoka.icon ここら辺はフラクタルな構造
システム要件定義 (下にも別でシステム要件定義はあるが、この段階ではざっくりとやるということ?) 扱う範囲 : スコープ、プロジェクト方針、スケジュール (進捗)、資源、組織要員、調達、費用、品質 (品質保証、品質管理)、リスク管理、コミュニケーション、知識管理、問題管理、ステークホルダ・エンゲージメント管理、変更管理
プロジェクト計画書の作成、プロジェクトの実行管理、プロジェクトの監視と追跡、プロジェクト状況の報告、終結
問題管理、変更管理、構成管理、リリース管理、障害管理、性能管理、資源管理、セキュリティ障害管理、障害対応・保守支援、予防保守
https://gyazo.com/cc244d81f2263ffb3ba19fbcf4e6b7f1
より不確実性の高い新規サービスの提供などの場合は、DX 推進プロセスのような試行プロセスを繰り返すような流れになりうる ソフトウェアエンジニアの価値の発揮のしどころ
全体 : 素早い変更の実現と安定した価値提供の両立と、組織として改善し続ける文化 (いわゆる DevOps) 新規システム開発や新規機能開発、保守による変更等
全体 : バッチサイズを小さくすることで、素早く動くソフトウェアを実現し、素早くフィードバックサイクルを回す
企画段階 (システム構想・システム化計画)
企画メンバーと協働して、より良いソリューションの候補の提案やシステム化の計画を立案する
特に、プロジェクト・案件を分けることでスコープを小さくして不確実性を下げ、価値提供までのリードタイムを短縮することを重視 (プロダクト志向でワンチームに動く) 業務要件定義の支援と、業務要件を踏まえたシステム要件の明確化 (特に非機能要件部分で専門性を発揮) 運用の観点も入れて、システム要件を定める (例えば SLA を踏まえた性能要件や、デバッグしやすいアプリケーションログの導入など)
システム要件を踏まえて、より良いアーキテクチャ設計を創ることに専門性を発揮
特に、進化可能性を重視し、継続的に改善し続けられる IT システムの構築を行うことに価値を置く コンテナ導入などもこの中に含まれる
この段階でも、開発する範囲を分割することでスコープを小さくして不確実性を下げ、動くソフトウェア実現までのリードタイムを短縮することを重視する
ソフトウェア開発、システムテスト、移行・導入 (リリース)
テストに対する自動化・仕組みの構築により、(継続的な) テストのコストを低減し、ソフトウェア変更時の意図せぬ破壊を防ぐ (品質向上、コストとリードタイムを削減)
機能フラグなどを活用し、デプロイとリリースを分離することで、リリースの粒度よりも小さな粒度でコードの変更をマージしていけるようにする
保守性を高い状態で維持する (あるいは既に下がっている保守性を上げる)
SOLID 原則などの設計原則を踏まえて保守性の高い設計を行う
機能開発時には必要に応じてリファクタリングを行い、より良い設計に変更する (機能開発時に場当たり的なコード追加をして保守性を下げることを避ける)
詳細設計とコードをできるだけ紐づける (例えば OpenAPI による外部インターフェイス定義とコードの自動生成)
ビルドパイプライン・デプロイパイプラインの構築により、(検証環境・本番環境への) デプロイのコストを下げ、問題を早期検知できる状態を作り、安定して本番環境にデプロイできる状態を維持する
システム運用
全体 : いわゆる SRE 的なところでの価値発揮 人手による繰り返しの運用業務 (いわゆるトイル) の自動化による、運用業務の安定化・効率化
SLO、SLA を踏まえたリスクの許容を行うことで、安定性と素早い変更の両立を実現する 構成変更
監視
監視の仕組みをよりよくすることで、問題の早期発見に繋げる 障害対応
発生した障害から学習し、組織を強くする
問い合わせ対応
ソフトウェアエンジニアが持つべき能力