見出し画像

ドイツのソフトウェア企業でも役に立ってる日本でのエンジニア経験

はじめに

ドイツ・ベルリンに本社がある新興の大手IT企業に、ソフトウェアエンジニアとして、2022年夏から現地で働いてます。

この記事では、日本のソフトウェア企業での経験で、ドイツに来てからも役に立っていることについて書きます。

前提ですが、私は日本の中堅のシステムインテグレーター(SIer)で5年ほど働いてました。ユーザー企業向けからソフトウェアシステムの受託開発をしており、5000万円から2億ほどのプロジェクトに年間で2~3つほど関わっていました。今回はこの時に得た経験・スキルについて触れます。


1. フルスタックエンジニアとしての基礎力


自社での内製開発と比較してSIerのエンジニアは、バックエンド・フロントエンド・インフラストラクチャー・データ・デザインなど、俗にフルスタックと言われる幅広いスキルと経験を得やすいです。

なぜかというと、ユーザー企業からすればSIerはシステムの専門家であり、システム全般についてコンサルティングから開発・導入まで一貫して提供できる方が付加価値を生みやすいからです。

また、一つのプロジェクトで大量のエンジニアを配置できるほど、ユーザー企業から予算をもらえる訳ではないです。(1億円かけるプロジェクトでも半年で10人ほど)そのため、一人一人のエンジニアがフルスタックになる方が特定の分野の専門家になるよりも費用対効果が高いです。

ソフトウェアの開発スキル

そういう私も典型的なSIerのエンジニア経験を積んできました。

  • Big data関係のサービス実装と同時に、ユーザー向け画面のテスト

  • RestfulAPIのバックエンド開発と同時に、そのアプリケーションにおける開発、本番環境の整備

  • Eコマースのフロントエンド開発と同時に、そのシステムフローの設計と改善

この「と同時に」となるのは偶然ではなく、一つのプロジェクトにおいて主な担当を綺麗に区切ると品質を高めづらいため、周辺の業務も実行していました。

つまり、専門分野の境界を曖昧にし、関連分野には積極的に取り組む方がプロジェクトにとっても自分にとってもメリットになっていました。

フルスタックのメリット

  • (SIerに関わらず)どのプロジェクトでも短い期間で戦力になれます。また、特定分野の流行り廃りに依存せず長く安定して働けます。

  • 多くのプロジェクトに参画することができるため、さらに多くの経験を踏んで、設計・実装・テスト・運用全般の技術とセンスを磨けます。

  • システム全般を自分で実装できるようになるので、自信がつきます。

上記を簡単に言い直せば、

  • 潰しが効く

  • 百戦錬磨になる

  • インポスター症候群を克服する

になります(笑)

これらの経験は、ドイツにおけるプロジェクトでも大変役に立っています。ドイツの企業でも、日々の業務でシステム開発の基礎力が重要だからです。

現在はbig data周りのバックエンドの設計・開発をしていますが、集計クエリはpartitionやindexを意識して最適化、計算資源は自動スケーリング、集計期間を絞って計算量は一定にするなど、しています。

また、big dataでは集計結果をブラウザでグラフ表示などもありますが、表示エラーが出ている時にはブラウザの検証ツールで確認し、Javscriptの単純なバグなのか、バックエンドのサービスがダウンしているのか、など切り分けを行い、修正しています。

結論、日本のSIerにおけるフルスタックの経験は貴重であり、海外のソフトウェア企業でも役に立ちます。


2. ウォーターフォール開発の経験

日本のSIerに多いウォーターフォール開発では、ある程度の大きさの機能を長期間かけて開発します。

要件定義
  → 基本設計
   → 詳細設計
    → 実装
     → 単体テスト
      → 結合テスト
       → システムテスト
        → ユーザー受け入れテスト
         → リリース
          → 運用
           → 評価

という滝の流れのように開発を行います。一方で、アジャイル開発では6~12週間という短い期間で上記のフローを実施し、最小限の機能開発を繰り返します。

以前の記事では、ウォーターフォールは炎上しやすいと書きましたし、開発手法としてはアジャイル開発が多くのケースで望ましいです。

しかし、ウォーターフォールの手法ではエンジニアを成長させる一面も持っています。

ピラミッドのように大きなシステムを開発していくので、ユースケースの考慮漏れなどがあると手戻りが大変になります。そのため、各工程の方法論が成熟しています。

また、自分自身で考えさせられる機会も多いです。より大きなシステムのウォーターフォール開発になるほど、この傾向は顕著になります。

どうすれば
大規模のユーザー
大規模の要件定義
大規模の設計
大規模の実装
大規模のテスター
大規模のシステム結合
大規模のリリース
でもプロジェクトを運用できるかというスケーラビリティを常に意識することになり、ソフトウェア・エンジニアとして根本的に大切な視点です。

ソフトウェアの開発工程

また、先の章でも述べたように、一つのプロジェクトでエンジニアの数は限られています。そのため、どのエンジニアも要件定義から運用まである程度のスキルと経験を持っている方が活躍できます。

例えば私の場合ですが、大きな機能のテストをしている時に以下のような疑問を思いました。

外部モジュールからデータを受け取って加工するモジュールを実装
→ 単体部品とは言えないけど、システム全体を制御する部品でもない。
→ 単体テストと結合テストのどちらのテストにあたるのか、教科書的な説明の理解のままだと分からない。
→ この場合、どこまで、何をテストすれば十分なのか。
→ 実装した機能は手動で確認できるけど、自動化する方が良いのか。
→ 自動化する場合、外部モジュールからデータをもらう部分は擬似データを作るか
→ 擬似データでテストになるのか
→ 結局、テストとは何のためにしているのか。

一方で、小さく機能を開発していくアジャイルだと、上記のような疑問に当たる機会は少ないです。何となくの理解で開発を進めていて後々に困っても、次のサイクルで修正すれば何とかなる傾向にあるからです。


ドイツにおける開発スキルと開発工程

ドイツでは内製開発&アジャイルなので、開発スキルも開発工程も分業と専門化が進んでいます。

例えばインフラエンジニアはAWSのネットワーク、セキュリティ、DevOpsなどに関して非常に専門的な知識を得る機会を得られます。一方で、フロントエンド・バックエンドの本格的な開発の経験はない場合が多いです。

また、ビジネス・システム要件はプロダクト・マネージャー、実装は開発エンジニア、テストはテストエンジニアというように分かれている場合が多いです。各工程の責任が明確になりますが、工程間の連携が弱くなりがちです。


結論

日本のSIerで働くと、下図のような感じでスキルが広がっていきます。

開発工程と開発スキルの関係図

日本とドイツの仕事環境でそれぞれに一長一短がありますが、ビジネス的に上手くいくのはドイツ、エンジニアが育つ環境があるのは日本のように思えます。

なので、ソフトウェアエンジニアとして日本で経験を積んでおいて良かったと思ってます。

以上です。

Happy Coding! 👩‍💻👨‍💻 🤖  

この記事が参加している募集

この経験に学べ

この記事が気に入ったらサポートをしてみませんか?