実務未経験でエンジニアにジョブチェンした地獄の半年を振り返る
私は 2022 年 5 月にソフトウェアエンジニアとして初のキャリアをスタートし、半年が経過しました。実務経験がない中でぶち当たった壁はいくつもありますが、キャリアがスタートする前、した直後、そして半年経って落ち着き始めるこの流れを言語化してみたいと思うようになりました。
実務未経験がうまく仕事を回せるようになるために気をつけた具体的なアクションについては、需要がありそうであれば「実践編」で別記事としてまとめようと思います。
具体的にはコードリーディング、コードレビュー、そして実際にコードを書く上での話になる気がしています。需要がありそうであればまとめます。大事なことなので 2 回言いました。
背景
今までかんたんな CRUD を実現する程度の個人開発や、仕事でインフラ系の業務に携わってきましたが、ソフトウェアエンジニアとして働いたことはなく、いわゆる実務経験ゼロエンジニアでした。
そんな私がソフトウェアエンジニアにジョブチェンジして半年経った今、「ここが苦しかった」とか「こうしたらうまくいった」ことを振り返りたいなと思います。
前提
おそらく「未経験からエンジニアになりたい」人とは違う前提条件なので、参考にならない部分が多いかもしれません。私の場合は色々と土台のある恵まれた状態だったと思います
- IT 系専門学校卒業し、SIer 子会社でインフラ系に従事
- 基本情報、応用情報、LPIC や CCNP など持っており、基礎的な CS 知識は身につけている(つもり)
- 業務改善のために簡単な自動化スクリプトや、アプリを作ったことはあるが、業務におけるチーム開発の経験はゼロ。自分のコードばかりで他人のコードを読む機会がなかった。
- あくまで個人開発では十分なものを作ってきたので、大規模環境におけるベストプラクティスや考え方は全く身に付いていない。学びたい意欲はあったものの、どうしていいかわからなかった。
ソフトウェアエンジニアにジョブチェンジするまで
SIer 子会社でインフラ系の業務を 4 年超経験した後、SaaS スタートアップにカスタマーサクセスとして転職しました。
同じインフラ系でもなく、いきなり直でアプリ系でもなく、カスタマーサクセスという職を選んだのはそれ相応の深い理由と、数年先を見据えたキャリアプランがあってのことなのですが、ここで書くとまた別の記事ができてしまうので割愛します。
一言でまとめると、ソフトウェアエンジニアになるまでにわざと回り道をしていました。
ただし上司や同僚には、日頃から「いつかはエンジニア系の職に戻るつもりでいる」と打ち明けていましたし、1on1 でも「5 年後どうなってたいん?」みたいなよくある話の流れで「多分エンジニアとして働いてるんじゃないですかねー(上の空)」と話していました。
カスタマーサクセスとしての職を 3 年経験し、いつのまにかチームリーダーになり、いつのまにかセクションヘッド(いわゆる課長職)の道がみえてきたタイミングで、「あれ?このままいくと戻ってこれなくなるのでは?」と感じ、本格的に上司に相談しはじめました。
すると 1 週間も経たないうちに上司が各部署のヘッド、CPO 交えて話を調整していただき、異動前提で話が進んでいきました。
もちろん、私が今までいたポジション(カスタマーサクセス)の中で、チームの中でひときわ「技術要素に詳しい人」という立ち位置ではあったのですが、具体的にソフトウェアエンジニアとしての実務経験があるわけではないので、今まで開発した成果物の確認と、面接が異動までの過程に入りました。完全に社内転職でした。
成果物
実は社内教育用のツールを Node.js + React で 1 年ほど一人で開発していて、これがうまく社内に刺さり、その年度の VP 賞を受賞していました。開発チームのエラい人からは当時からこのプロダクトをめちゃくちゃ評価してくださっていて、「基礎的な技術力はあるからキリンさんなら異動してきてくれても大丈夫」と言ってくれたのが心強かったです。
一人で気軽に開発していたものだったので、あまり設計やコードの綺麗さには自信がなかったです。
このあとの面接では、この成果物をみた上で進んでいくことになります。
面接
完全にガチの技術面接でした。異動先候補のテックリード、部門のヘッドと1:2で 1 時間半ぐらい話しました。
会社としてのカルチャーフィットは社外から転職してくる方に比べると、すでに 3 年、今の会社で働いてきた私にアドバンテージがあります。そのため、この 1 時間半は完全に私の力量が試される質問ばかりでした。
会社固有の質問事項は除いて記載しますが、まぁおそらくどの企業の面接でも聞かれてもおかしくない内容でした。
- プロフィール、経歴
- 専門学校ではどんなことをしていた?
- 前職では何をしていた?ていうか何歳だっけ?
- Web開発
- コンパイルってなに?どんなことをする?
- ビルドとコンパイルの違いは?
- 個人開発で TypeScript を選んだ理由は?
- なんで型付けが嬉しいの?
- Ruby にも型はあるけど、それとの違いは? TypeScript の型付けは何が嬉しい?
- プリミティブ型とは何?
- TypeScript のプリミティブ型は何?
- Object 型ってプリミティブ?
- メモリ管理でヒープ領域とスタック領域があるけどそれぞれの違いは?
- JavaScript はスタック領域をどんな時に使う?
- マイクロサービスアーキテクチャに理解はある?
- なぜマイクロサービスアーキテクチャが流行ったのか知っている?
- インフラ サーバー
- クラウドサービス使ったことは?
- コンテナサービスで運用をしたことは?
- コンテナってどんな仕組み?
- Linux のAPIって触ったことある?
- Linux が提供している API で Docker に近いことできるけど、どうやってやるか知っている?
- コンテナだと何が嬉しいと思う?
- データベース
- RDPの特徴を教えて
- NoSQL との違いを引き合いにして説明してくれたけど、それぞれのメリデメって何?
- ACID って何?
- データベースのインデックスの仕組みについて理解している?
- B-tree って知ってる?
- アーキテクチャ
- 個人開発は MVC で開発したみたいだけど、なぜ MVC を選んだ?
- MVC 以外の設計は何か知っている?知っていたら、MVC とどんな違いがある?
- オブジェクト指向とは?
- ビジネスロジックって言ってたけど、ビジネスロジックって何?
- アジャイル、スクラム
- アジャイルって何?
- スクラムって何?
いずれも一問一答で即答できたわけではなく、質問の意図や背景を会話で確認しながら、自分が知っている限りの情報と、知らない・理解できていない部分をすり合わせていく形で進めました。
この辺、自信持って回答できませんでした。むしろほとんど回答できませんでした。普通にやったら落とされるような状況でしたが、3 年のカスタマーサクセス経験で培ったスキルで切り抜けた感じがします。
設計やデータベースに関する知識・理解に若干の不安はあるものの、コードを書く力とカルチャーフィットの有利さを鑑みて、晴れて社内転職を認めてもらえることとなりました。
2022 年の 3 月頭に異動が決まり、5 月 1 日付けで異動しました。
異動までの間でしていたこと
今持っている業務引き継ぎをしつつ、異動先の先輩エンジニアからの課題図書を読み進めたり、新しいコマンドラインのツールを作るなどしていました。
またこれまでと違って異動先の公用語は英語なので、英語の学習もはじめました。
TOEIC でいうと 600 点にも満たない基礎力ゼロの状態からの学習だったので、この語学力の低さも後の業務で苦しむ原因になります。
異動してから
圧倒的に何もできません。
本当になんの成果も生み出せず、先輩エンジニアにおんぶにだっこの状態で仕事をすることでようやく、といったところで、給料泥棒と言われても何もいい返せない、そう思いながら最初の数ヶ月を過ごしました。
しかも、前部署でリーダー〜課長のはざ間まで経験した上で、異動先では「見習い」「初心者」「アソシエイト」といった、そんなレベルの立ち回りです。驚くことに、それでいて給料が変わりませんでした。新卒ぐらいのレベルまで下がるものだと思っていました。私は家庭を持っており、何千万もの住宅ローンを持つ身なので、めちゃくちゃありがたいという気持ちの反面、それ以上に申し訳無さで心の底から苦しかったのを覚えています。
ただし、そんな自尊心ゼロの状態でも仕事をこなすこと、取り組む事はひたすら楽しみを感じていました。今までカスタマーサクセス時代に感じていた「もどかしさ」を自分で解決できる立ち位置にいること、前の部署のメンバーを違う側面から助けることができること、そして何よりようやく自分の目指していたキャリアに 3 年越しに戻ってこれたことが仕事をする上でのモチベーションをうまく保てていました。
自立してスプリントをこなせるようになるまで
異動して約2ヶ月は、スプリントタスクやチームの状況の都合上、コードを書いたり、仕事をしながら技術力を高める機会に恵まれていなかったようです。これは先輩エンジニアも「気の毒だ」というほどでした。
また、その期間は今までの自分のスキルセットと違う言語でのコードを書くのに慣れていなかったので、何をするにも検索してはエラーが出て直す、試行錯誤の繰り返しでした。
ただ後述の出来事を経験していくうちに、周りのメンバーに助けてもらいながらも、自分自身が成果を出さなきゃいけない状況に追い込まれることで、いつのまにか、補助輪なしでスプリントをこなしていくことができるようになっていました。
細かいテクニックというか、心がけていた事は「実践編」で書いていく予定ですが、ここでは主に立ち位置や状況について書いていきます。
スキルセットの不一致で苦労する
私は TypeScript(JavaScript)で Node.js でバックエンド、React でフロントを書く・・・というスキルセットしかないくせに、異動先では Ruby on Rails, Vue.js、そして Go 言語 という、全く得意領域を活かせない組み合わせでした。ほんと、なぜ転職ではなく、異動しようと思ったのか&異動できたのか謎です。
ただ、フロントに関しては React を触っていた分、 Vue に乗り換えるぐらいであればそれほど苦労はしなかったので、最初の数ヶ月、フロントのコードを書く時だけは水を得た魚のようでした。
Ruby に集中できるように
夏の終りの時期、Go 言語によるマイクロサービスの開発をストップしてモノリシックな方向に寄せる決断をチームでしました。
Go 言語の習得も自然と必要なくなり、Ruby on Rails 一極集中できるようになりました。ここから個人がセットアップできる開発環境も Ruby 寄りにするために Rubymine を導入することで、メキメキと Ruby でコードを書くことができるようになったのを覚えています。
語学力の低さに苦労する
所属している部署の公用語は英語です。隣に座っている先輩エンジニアは日本人なので、日頃の技術的な質問や、雑談は日本語でできました。ですが、ちゃんとしたミーティングでは外国人の同僚も入ってくるため、英語で会話する必要がありました。
英語に抵抗はなかったですが、話すスキルがあるかというと全くの別でした。幸い、今の会社に入社した1年目は割と頑張って英語を勉強していた下地があるので、2年経った今、英語学習を再開してひどく苦労するという状態ではなかったです。
それでも5月から9月までで、毎日3時間ほど、300時間前後の学習時間を費やしました。
コーチングサービスも受けました。ただし先述した約 1 年の学習期間と、この数ヶ月の学習期間を合算してもだいたい 700~800 時間前後のため、ご存知の方からすると「この学習時間だと、まだマスターには程遠い」と気づかれるのではないかと思います。
ここで一番伝えたいポイントは、今の部署に異動してから、コードを書いたり、読んだりする事もままならない中、さらに英語の学習をしていく必要があったのは、かなり辛かった、ということです。
特に業務時間外で使える時間を、「エンジニアリング」、「英語」どっちに注ぐのかは悩みました。
結果的に「話せない、聞けない、と何を作るべきなのかもついて行けない。これはマジでやばい」という結論になり、9月まで英語一本集中で学習していました。
そのため、エンジニアリングに手を出せず、別のシーンで自分のスキルの低さにもどかしさを感じる事もありました。
ただ結果的に英語やりまくったのは正解でした。
理由は、9月になったタイミングで自分にとってのメンターであり、テックリードであった人が別のチームに異動することになり、自分がメインで頼れる相手が、日本語が話せない同僚になってしまったからです。(テックリードや同僚に対して嘆く意図はまったくなく、然るべき時に備えて準備できた点に触れています。二人とも私が尊敬するすごい方々です。)
まだ完璧に仕事をこなせるほどではないですが、それでも初期に比べればマシ、を大きく感じる今、仕様や設計について話し合う際に英語を先にやっておいてよかったと感じるシーンはたくさんあります。
どんな学習をしたのか、のような英語トピックに関してはまた別の記事がかけそうな気がするので、未来の自分に任せます。
自立型組織を目指し、新しい形でチームを支える
ちょっとずつ給料泥棒を卒業しはじめ、これからガンガン吸収していくぞ!となりかけた頃、先に触れたとおり、自分のメンターであり、テックリードだった人がチームから離れ、別のチームで活躍することになりました。
組織全体にとってはめちゃくちゃ大事であり、喜ばしい事な一方、チームにとって大打撃で、話を初めて聞いた時はチームがどうなる事か心配になりました。
また、それまでは自分がテックリードの負担を減らせるよう、様々なスクラムイベント、会社の調整ごとをテックリードから巻き取って動いていたのもあってか、自然と「次のリーダー的ムーブはお前がするんだろう?」的な雰囲気になります。
そうですね、たしかに私は前部署でリーダーもやってました。ですがコードも満足にかけないのにこのスクラムチームをリードするなんて、とてもじゃないが出来ません。
そもそもスクラムにリーダーという役割なんてものは無いと本で読みました。だから違う方向でチームを支えたいと思うようになりました。
全員が何でもできる を目指す
どんな事でも無双してできるテックリードが抜けたあと、実際にコードを書くメンバーは私含めて 3 人、これに QA やデザイナー、スクラムマスター、プロダクトオーナーが加わります。
私はフロントエンドを得意領域としながら、バックエンドはまだ見習い・・・という状況で、他のメンバーはその逆というイメージでした。
このスキル差を埋めるために、スプリントプランニングの際、積極的に私はバックエンドのタスクを取るようにします。周りのメンバーもその意図を理解してか、積極的にフロントエンドのタスクを取り、お互い不得意な領域で業務をこなすスプリントが何回かありました。
そのスプリントはスプリントゴールを達成するのに必死で、今までと違って「余力あるからこのバックログタスクもやろうぜ」なんてことはできません。私がフロントやって、他の二人がバックエンドやったり、サイドタスクこなしたほうがめちゃくちゃ速いのも理解していますが、あえて苦しい方向を舵取りしました。
この試みは始まってまだしばらく経っていないですが、ちょっとずつお互い慣れてきて、できる領域が広がった気がしています。
何でもできる状況を目指した事で、「これは俺の専門じゃないから、触れないでおこう」といった暗黙の動きがなくなりつつあります。なので、チームの状況にも敏感になるし、お互いどこで苦労しているんだろうと考える事もでてくるようになりました。つまり私がチームの状況を細かく意識する必要なんてのはなく、チームメンバー全員がそうなりつつ理想的な状態に近づいたんじゃないかなと思います。
半年が経った今、改めて振り返る
自分で望んだキャリアとはいえ、心臓が痛くなるような地獄を感じながらも、仕事のやりがい、楽しさも同時に感じる、とても不思議な半年でした。
半年経ったあとこうして振り返ってみると、異動した当初に想像した半年後と大分違うムーブ、考え方で仕事しているなと思います。苦しい半年でしたが、思ったよりもコードが書けるようになっていて、成長を感じました。
社内では「カスタマーサクセス」部門の中で組織をリードしていく立ち位置を期待されていたのを感じていたために、自分の希望するキャリアに対して真剣に向き合っていただいた元上司や、チームメンバー達、そして異動先で右も左も分からない私を手厚く指導してくださったテックリード、同僚達には感謝しています。
次の半年では、駆け出しエンジニア Lv 100 を目指して頑張ってまいりたいと思います。
/以上
Discussion