新米エンジニアが思う、システム開発の各工程で出すべきバリューとは

## はじめに
私はエンジニアとして4年目を迎え、業務にも慣れてきた中で「自分がどの工程でバリューを出しているのか」「私がこのプロジェクトに存在する意味とは何か」「どんな時にやりがいを感じるのか」を改めて考えることが増えました。

特に、システム開発において、各工程におけるバリューの出し方について悩むことも多く、実装などの下流工程で不安を感じていました。

この記事では、システム開発の各工程で新米エンジニアがどうやってバリューを提供できるのか、私自身の考えを元に紹介したいと思います。

## 1. 要件定義フェーズでのバリュー
要件定義は、プロジェクト全体の土台を作る非常に重要な工程です。
ここでバリューを出すためには、以下の点に注力する必要があります。

#### クライアントの真のニーズを見抜く
- クライアントの要望をそのまま受け入れるのではなく、背後にある隠れたニーズを探り、提案を行うことがバリューを生むポイントです。 

#### 業務フローの最適化提案
- システム導入によって業務プロセスがどう効率化されるか、具体的な提案を行うことが価値につながります。

##### 例：
クライアントから「在庫管理システムが欲しい」と言われた場合、単なる在庫管理ではなく、
「どのタイミングで在庫を補充すべきか」や「在庫不足を自動で通知する機能が必要か」といった点をヒアリングで深掘りし、提案する。


:dog::speech_balloon:　
要件定義フェーズは、私にとって苦手な部分でもありますが、一番楽しさを感じるフェーズでもあります。
まだ、クライアントの要望をそのまま受け入れてしまったり、「それって本当に必要なの？」と自問することが足りていないと感じています。

しかし、要件定義の中でクライアントやチームのニーズを分析し、自分なりのアイデアを提案できる場面があると、自分の思考がプロジェクトに影響を与えている実感がわきます。このような瞬間に、価値を生み出しているという感覚を強く感じます。

## 2. システム設計フェーズでのバリュー
設計フェーズでは、システムの構造や機能が具体化されます。
ここでは、以下の点を意識してバリューを出すことができます。

#### 将来を見据えた拡張性のある設計
- 今後の変更や機能追加を容易にするために、柔軟で拡張性の高い設計を考えることが大切です。

#### パフォーマンスやセキュリティを考慮
- 設計段階でしっかりとパフォーマンスやセキュリティ面を考慮することで、後々のトラブルを未然に防ぎ、価値を生み出せます。

##### 例：
マイクロサービスアーキテクチャの導入や、将来の機能追加に対応できるプラグイン型の設計を採用する。
これにより今後の開発コストやメンテナンス負荷を大幅に軽減できる。

:dog::speech_balloon:　
私自身、将来の拡張性や柔軟性を意識しながら設計することの重要性は理解しているつもりですが、まだまだ考慮不足な点が目立つフェーズになります。

設計した内容がプロジェクトの骨格となり、他のメンバーがその設計に基づいて動くという責任感がある一方で、その設計がうまく機能すると大きな満足感を得られる場面でもあります。

## 3. 詳細設計フェーズでのバリュー
詳細設計は、実際の実装に繋がる重要な工程です。
ここでは、以下の点を意識してバリューを出すことができます。

#### 保守性の高い設計
- 将来的に保守や改修がしやすい設計を意識することで、長期的にバリューを提供できます。

#### 他のチームメンバーが理解しやすいドキュメント
- チーム全体がスムーズに進行できるよう、分かりやすいドキュメント作成も重要です。

##### 例：
機能ごとに責任を持ったモジュール設計を行い、将来的に特定機能だけを修正・追加しやすい構造を設計する。
これにより、各モジュールが独立して動作しやすくなり、バグの特定や修正が容易になる。

## 4. 実装フェーズでのバリュー
実装フェーズは、私にとって苦手意識が強い部分でした。
しかし、ここでも価値を提供することは可能です。

#### 品質の高いコードを意識
- シンプルで読みやすく、効率的なコードを心がけることで、後々のバグ修正や機能追加が楽になります。

#### テストとドキュメントの充実
- 他のエンジニアや将来の自分が困らないよう、しっかりとしたテストとドキュメントを作成することで、プロジェクト全体に価値を与えられます。

##### 例：
- 複雑な非同期処理があった場合、すべての箇所で同じ処理を書くのではなく、共通のユーティリティ関数として切り出すことで再利用性を高める。これにより、コードが読みやすくなり、他の開発者にも使いやすくなる。

:dog::speech_balloon:　
実装フェーズは、私にとっては一番の課題です。
新卒の頃から、処理が冗長・クラス名や変数名が最悪・１つのメソッドが異様に長い...等の数々を指摘を受け、4年目にしてマシなコードが書けるようになりました。
また、実装段階では、要件がほぼ固まっており、自分がクリエイティブに考える余地が少なくなる印象があります。
単に言われた通りに作業を進めている感覚が強くなり、付加価値を提供している実感が薄れることがありました。


現在は、品質の高いコードを意識し、後からメンテナンスしやすいように心がけることで、少しでもプロジェクトに貢献しようとしています。

## 5. テストフェーズでのバリュー
テストフェーズは、システムの品質を保証する工程です。
ここでは、以下の点を意識してバリューを出すことができます。

#### 自動化テストの導入
- 単純な手動テストではなく、将来の保守も考慮し自動化テストを導入することで、長期的なコスト削減につながります。

#### 負荷テストやセキュリティテスト
- 非機能要件にも注目し、負荷やセキュリティ面でのテストを行うことで、システムの信頼性を高めることができます。

##### 例：
- 負荷テストを行う際に、実際のユーザー数を想定した負荷をかけ、システムが正常に動作するかを確認する。
この結果、システムが高負荷下で遅延することが判明し、対策を提案することで、クライアントの信頼性向上につながる。

:dog::speech_balloon:　
テストフェーズは、新卒エンジニアにとって一番担当しやすいフェーズだと感じています。
私自身も、最初に担当した業務はテストが多く、手順通りにテストケースを消化していくことに集中していました。

ただ、ケース数が増えると「どれだけ早く終わらせるか」に意識が向きがちで、単なる動作確認をしている感覚になりがちです。

しかし、テストフェーズで本当に重要なのは、動作確認だけではなく、潜在的なバグを見つけ出すことです。
特に、システムの隠れた不具合や想定外の動作を見つけた時には、ただのチェックではなく、システム全体の品質を高めるために貢献しているという実感が得られます。

## 6. 運用・保守フェーズでのバリュー
システムが運用に入った後も、価値を提供し続けることは可能です。

#### モニタリングと改善提案
- 運用データを基にパフォーマンスや使用状況を監視し、改善策を提案することで、システムの信頼性を向上させます。

#### 運用効率化のツール開発
- 自動化ツールやスクリプトを活用し、運用の効率化を図ることで、チーム全体にバリューを提供できます。

##### 例：
- 毎回手動で行っていた運用作業をスクリプト化し、自動化することで、チームの作業負担を大幅に減らす。
これにより、運用コストの削減につながり、チーム全体にバリューを提供できる。

:dog::speech_balloon:　
運用・保守フェーズでは、日々の運用作業を効率化するために、自動化ツールを導入することが推奨されます。
運用を円滑に進めることはもちろん、日々の作業負担を減らすための工夫が、ここでのバリューだと感じています。

## その他のバリュー
技術的な作業以外でも、プロジェクトに貢献できる方法は多くあると考えています。


#### 知識共有と教育
- 新しい技術や学習内容をチームに共有し、全体の技術力を向上させることができます。

#### プロセス改善提案
- 非効率な作業や無駄なタスクを見つけ、効率化する提案を行うことでチームの生産性を向上させます。

#### リスク管理と早期の課題発見
- 問題が発生しそうなときや、リスクが見えてきた段階で上司にエスカレーションすることで、早期対応につなげられます。

#### ドキュメントの誤字脱字の確認
- ドキュメントの誤字や脱字に気を配り、正確な情報が伝わるよう注意することで、ミスを防ぎ、信頼性を高めることができます。

#### 柔軟な対応と協力姿勢
- 仕様変更やタスク追加に柔軟に対応し、チーム全体をサポートする姿勢がバリューにつながります。

#### チームビルディングとモチベーションの向上
- メンバーのモチベーションを高め、良好なチームの雰囲気作りに貢献することも重要です。

## おわりに
システム開発の各工程には、それぞれ異なる形でバリューを出すチャンスがあります。
自分の得意な部分や好きなフェーズを見つけ、それをどうプロジェクトに活かすかが、エンジニアとしての成長に繋がると感じています。

もちろん、私自身まだまだ足りない部分が多く、もっと改善すべき点がたくさんあります。
引き続き、日々の業務を通じて少しずつ成長し、プロジェクトに貢献できるよう精進してまいります。

かなり抽象的な表現が多かったと思いますが、この記事が同じように悩んでいる新米エンジニアの一助となれば嬉しいです。