ユーザー系システム子会社におけるエンジニアのキャリア形成①
この記事の目的
この度10数年をいわゆる金融系のユーザー系システム子会社にて過ごしつつ、某有名外資の企業に技術職として転職をしました。スキルが付きにくいと言われるユーザー系子会社において技術的なスキルをどう付けれたのか?過去経験したプロジェクトなどでどのような事が有効に働いたのか?などを振り返りたく情報をまとめるものです。自身のキャリアの整理であるとともに、同様にユーザー系システム子会社に勤める方や、これから就職を検討している新卒の方に何か再現性のある気づきや情報を残せたら…と思い書き始めました。複数回に分けて書く予定です。今回は入社してから5年ほどのキャリア初期の振り返りです。
筆者の経歴
大学は当時MARCHクラスの偏差値ぐらいの大学で情報工学科を卒業してます。ただし、成績は学部の中で下位10%ぐらい。単位もギリギリ。ITエンジニアとしての下地はありつつも学生の頃からバリバリにスキルがある、とかそういった部類ではないです。金融系のユーザー系システム会社も人生を置きに行くつもりで、安定感があって福利厚生が凄くしっかりしているという基準で選んでおりキャリアへの意識も元々高い部類ではありませんでした。(今も決して高いとは言えない)
入社した会社と配属された部署
入社した会社は、最近でもどうやら就活生の人気企業としてランキングされるぐらいには程々の会社で日系の金融系ユーザー子会社です。私は元々インターンシップで東芝という会社に1ヶ月ほど行っていたのですが、その当時に体験した社内システムを扱う部署という役割に興味を持ち、入社した金融系ユーザー子会社でも社内システムの部署を希望し希望通りに配属されました。
配属された部署は親会社のシステム、ではなく自社で使う人事系や各種管理系のシステムを内製で開発・運用することと、技術的な検証などを行うことがミッションでした。また、幅広いレイヤーを担当しており、社内NW、サーバー(複数のラック+サーバ)、ミドルウェア、ソフトウェア(基本内製+一部パッケージ)みたいな形で自分の手を動かして色々なものを触ることができる環境でした。今思えば、このような環境に身を置けた事こそが自分のスキルを付けていく上で最も有効で幸運なことだったと思います。年次も比較的〜5年目ぐらいの若手が多く、年次も近しい先輩に教えてもらいつつ業務ができました。
担当していた業務
配属された部署ではいくつかの業務を行っていました。
アプリケーション開発
主にアプリケーション開発と既存のシステムの運用を担当していました。Javaと当時企業システムでは流行っていたStrutsというフレームワークがメインでありつつ、部署としてwindows系も開拓したいね、ということでC#を学びつつASP.NETでwebアプリ開発もしていました。比較的少人数で小規模なアプリ開発をする関係で、開発環境(当時IDEが主流)のセットアップなどから自分でやる必要があり自分で調べて、試して解決すること必要がありました。
開発環境の整備と管理(インフラ)
アプリをデプロイしてテストするための環境は、本番環境は管理する専任のチームがあったのですが開発環境はなぜかアプリ開発チームの持ち分でした。年次予算が余ると、購入できるスペックのサーバを購入し、ラッキングしてESXiを導入して仮想環境を作る。そして、仮想サーバを作成して、OSをインストールして、必要なミドルウェアをセットアップしてアプリをデプロイする必要がありました。開発しながら環境が欲しい時に使いたかったので、自分で手を動かすようになったことで気づいたらその仕事をできる人がチームでは自分のみみたいなことになってました。でも、やっぱり物理のサーバを買って、箱を開けて、ラッキングして動くのをみるってのが楽しくてとても好きな業務でした。
新しい技術の調査研究
と書くと、凄くたいそうな物に聞こえるのですが流行りの技術やまだその組織で使ってない技術などを使ってみようという取り組みです。有志が集まり、その対象について調べたり実際にちょっと触って見たりして報告するという物です。本当に調べて、ちょっと触って見てぐらいのものがほとんどなのですが、これによって新しい技術と呼ばれるものも実は過去の技術の組み合わせのものがあったり、全く新しい概念のものであったりと多少なり見分けられる下地になっている気がします。
振り返って何がよかったか?
振り返って見て以下がその後のキャリア形成においてとても有用だったと感じます。
小さなアプリケーションの設計からリリースまでを何度も経験したこと
HWからアプリまで一気通貫で開発できたこと
まず、若手のうちにアプリケーション開発の流れ、それこそ要件定義から設計・実装・テスト・リリースそして運用を経験できた事でアプリケーション開発におけるイメージが確実にできるようになったと感じます。自分の設計の問題が運用フェーズで自分がしっかり実感できる事でアンチパターンも自分の中にできますし、それを元に次の開発では改善をした設計を実践できるのは経験値を非常に効率よく貯めることができたのではないかと。対象のアプリケーションがシビアなお金を扱うなどではないこともありましたが、それでも「アプリケーションを設計・開発して、運用した経験」はどういった形ではあれ、システムを扱う仕事をしていく上では開発上の各フェーズにおいて益しかない経験だと思います。
また、やはり一件は百聞にしかず、というようにアプリ〜基盤まで一度自分でものを作ってみる、という経験はとても大事です。昨今のシステム開発においてはクラウドの台頭やDevOpsという思想のもの境も曖昧になってきており広く手を動かすことはレベル感はどうあれ少なくとも、会話の中で自分で引っ掛けることができる引き出しにはなっています。
再現性を持たせる為に今できる事
とは言っても、それらの条件ってたまたま環境が良かっただけじゃん!と言われたらそれまでです。(いま振り返ってみると本当にその通りで、贅沢な環境にいたことは今になって強く実感します)なので、これらを実行する為に今成の考え方で何ができるか?を考えて見ました。
何か身近な課題を解決するような簡単なアプリを作ってみよう
あーよくある話ね、と思われるかもしれませんがこう言った観点に気を付けて見ては?という点を添えながら書いて見ます。
なお、ITエンジニアとして今の時代はとにかく恵まれていると私は思っています。月々数百円〜数千円でAWSやGCPのクラウドサービスでインフラを構築・運用でき、アプリケーション開発もVSCodeやプラグインで実際の開発を行うプロと同じものが簡単に誰でも手に入る時代なので。情報も書籍の他にWebにもこのnoteやはてぶをはじめとした素晴らしいコンテンツがたくさんあります。個人の学習において経験値を積むだけでなく、これら世で求められる本職で求められるスキルセットの向上にもつながる点、本当にいい時代になったなと思います。…と脇道にそれましたが、以下の4点意識して見てはというご提案です。
作るものを定義する
作るものに必要な構造・機能を考える
実際に設計して作ってみる
しばらく動かして使ってみる
1.作るものを定義する
まず身近な何か情報を記録するとかでもいいのでアプリがあることで何か便利になるネタを考えて見ましょう。このフェーズで実際に何かの課題を解決するために必要なプロセス(システム外の流れ)みたいなものをイメージし、そしてどの部分をシステムで補うのか?を考える練習になります。例えば、毎日の体重や食事を入力して記録し、その内容をグラフ表示させる…みたいなレベルでも結構です。どんな機能が、なんのために必要か?をたくさん考えることになるはずです。課題解決の方法やスコープを考える練習になります。
2.作るものに必要な構造・機能を考える
実際に作りたいものが決まったらどのような形式で作るのかを考えます。スマホのネイティブアプリなのか、Webアプリなのか、神Excelなのか。ネイティブアプリやWebアプリならば言語やフレームワーク、アプリのアーキテクチャはどうするか?などいっぱい考えることがあります。まずは作りやすいところから、でいいですが少なくとも複数の方式を見比べて何が良いか?を考えて見ましょう。複数の選択肢を挙げる、メリデメを何某かの基準で考えて判断する、そして選択するというフェーズはどう言った尺度であれ今後の技術選択の基準になってくれるはずです。また、何かを作る時にやらなければいけないことの洗い出し、という点の練習にもなります。誰かに作業をお願いするにしてもそれらがどれだけコストが掛かる作業か?をイメージできることはとても重要なスキルだと私は考えています。
3.実際に設計して作ってみる
実際に作ってみると大小色々な問題にぶち当たると思います。プログラムのデバッグ、環境セットアップなどなどです。これらを検索エンジンで、調べ実践することで情報の取捨選択の練習になります。それこそ途方のない数調べ試すことになると思いますが、それによって情報の調べ方・取捨選択のスキルは間違いなく向上させることができるはずです。取得したスキルが日々腐っていくこの業界、新しい情報や知識を調べ取捨選択できるスキルは必ず必要になります。
4.しばらく動かして使ってみる
これ意外としないことが多いかもですが、実際に動かしてみることはとても大事です。実際に使ってみると、使いづらい、思ったのと違う…ということが起きるはずです。そう言った想定に対して、実際に使って見た時の印象を実感することで要件の出してと作り手の意識の差を感じられるのではないかと思います。また、自分以外の人に使ってもらう可能性があるのであれば、運用という形でデータの増減やアクセス数の管理など運用を体験できるはずです。システム開発は機能開発だけでなく、それらを運用するコストや効率も含めて考えなければ適切なソリューションとは言えません。その感覚を養う練習となるはずです。
まとめ
巷で新卒のキャリア形成において最初の数年は大事、と言われると聞きますが私はその点非常に恵まれていた、というのはまとめながらより実感しました。一方で、昨今のクラウドサービスの発達によりプロと変わらないレベルのツールや環境や情報を手に入れるハードルはぐっと下がっています。どう言ったキャリアであれ、システム開発や運用に関わるのであれば上記のような一度ものを作ってみる、という経験を何某かの方法で得るのはとても有用だと感じます。
もちろん、使った技術は廃れそのまま使えなくなるものも多いです。しかし、根底にある考え方や仕組みについては実は生かせるものがたくさんあります。この先にさらなる成長を続けるために基礎として、こう言った考え方はいかがでしょうか…?続きはまたそのうちに。
お付き合い頂きありがとうございました。