見出し画像

シニアソフトウェアエンジニアまでの歩み方

お知らせ:noteの更新はこれからしないので同じ内容を読みたい方はThe Pathをご覧ください

ジョブレベル

呼び方は組織によって違うが一般的にジョブレベルは

  • ジュニア(新卒・インターンなど)

  • ミッド

  • シニア

  • スタッフ -> シニアスタッフなど/マネージャ -> シニアマネージャ

のように分けられてます。
実例を見るとwiseはこのようにキャリアマップを作っています

wiseエンジニアのキャリアマップ

シニアに到達するとその次はICのトラック(スタフ、プリンシパル)を続けるかピープルマネジメントトラック(エンジニアリングリード、シニアエンジニアリングリード、ディレクター)に移すか選択できる。もちろんシニアのままにいるのも企業によって可能だったりします。シニアエンジニアは1人前でタスクをこなせたりプロジェクトをリードしたりできると期待されているでしょう。チームメイトのメンターシップも必要があれば手伝えます。シニアに到達するには 3 ~ 10年かかると言われてます。

ゴール

この記事はシニアエンジニアに到達するまで必要になってくるスキルや考え方をまとめます。読むと人より早くシニアエンジニアに到達するかもしれないです。中には僕がソフトウェアエンジニアをやってきた中先輩たちからもらったアドバイスややってよかった、やればよかった話が入っています。

シニアエンジニアとは

これも企業によりますがopensalaryを見ると10年目の中央値が950万で75th percentileが1200万円です。10年目はシニアを呼んでもいいでしょう。実力的にはおそらく差がそんなにないが国内企業と外資企業どちらかで働いているかによって年収のその差分が出てます。この記事では10年目のエンジニアのような年収をもらうのに何を意識すればいいか話します。

ジョブレベル歴

今まで自分のソフトウェアエンジニアのジョブレベルは概ね

  • 1~2年目:スタートアップでアルバイト

  • 3年目:新卒で日経web企業(400人弱、エンジニアは100人以上)に入り

  • 4年目:ミッドレベルに昇格

  • 5年目:シニアレベルに昇格

  • 8.5年目:外資IT企業(3000人以上、エンジニアは1000人以上)に転職。ジョブレベルはミッドレベル(降格!)

  • 9年目:外資IT企業で1回目のパフォーマンスレビューにてシニアレベルに昇格

見せびらかすつもりなくサクサクと昇格できたのはチームメイトやマネージャーに恵まれてます。それと仕事中に何度も何度も以下に述べることを意識していました。

マインドセット

ロール

ソフトウェアエンジニアの一番重要な仕事は他の職種と同じくビジネスを成長させるです。コードはただの一つの手段でありもっと大事なのでどうやってコードでビジネスに価値を加えていくことです。

PM(プロダクトマネージャー)、営業、デザイナーなどと同じくプロダクトへの影響力が同等であるべき。ソフトウェアエンジニアはコードに一番近いのでコードがビジネスのポテンシャルやリミットがPMと違う角度で見えるはずです。プロダクトのオーナーであり自分の書いたコードをリリースして価値をユーザーに届くまでがのなげれとても大事。バグがある時もオーナーシップをとって自分達で修正してパッチをデプロイする。その繰り返しがあってからこそいいエンジニアになれます。

プロダクトマネージャーからビジネスへちょっとしか価値出せないがコードベースには大きな負債となる機能依頼がきたら断るべきだしセールスチームから売上増大のためにちょっとグレーの機能依頼が来るときリスクを考慮しながら議論すべきです。わかりますよね?コード書けるということは世の中に対してポジティブなインパクトは出せるがその逆を防ぐのも我々の仕事です。

ただのコーダーでプロダクトへのオーナーシップがない場合は一旦技術だけにフォーカスするが転職はすぐ視野を入れましょう。オーナーシップという感覚を最初から理解しとかない後々難しくなります。

コード

コードを書くのが一つの手段でコードがどれだけ綺麗書けるとしてもビジネスに対して価値がなければただの負債だ。あと書いたコードがデプロイされてなければそれも同様に価値がゼロに近い綺麗なコード書きたいなら仕事以外で書け。仕事ではメンテナンスしやすさが大事。

make it work → make it fast → make it maintainableの順番でコードを書く

make it work: これがないと何も始まらないのでまずは動くものを作りましょう。workの定義ですがcorrectlyとsecurelyが入っても良いという考えです。いわゆる正しく、安全に動くものを作ります

make it fast: スピードは一つの機能として考えていい。スピードが上がればサーバーコストの節約やユーザー体験の向上などにつながるので大きな価値にはなる

make it maintainable: コードを書く時間より読む時間の方が圧倒的に多い。しかも読む人数のが多いからメンテナンスしやすさの効果もその数の倍になる

リリース

リリースしないとどれだけ綺麗なコード書いても価値にならないです。コードを書くのと同じくリリースが大事です。組織にリリースの問題があればまずそれを直しましょう。リリースするのにすごく手間がかかってストレスな環境なら優先的にそれを直すべきです。理想なリリースのプロセスはエンジニア誰でもボタン一個押すかmasterブランチにマージするかだけで終わらせたいですね。リバートも同じ手順であるべきです。

リリースはあくまでユーザーやビジネスに価値を届ける手段でありその真の価値を理解することが大事です。理解した上でスコープの再定義ができるわけです。スコープが大きすぎるとリリースまで時間がかかるのでユーザーからのフィードバックが遅くなるリスクになります。

https://www.industrialempathy.com/posts/how-to-ship/

上の図のようにスコープを再定義することによってリリースしていくのがオススメです。

エラーメッセージ

エラーメッセージはギフトでし。エラーメッセージ理解できるエンジニアは確実にデバッグ力違ってくるからエラーをすぐ無くそうとしないでなんでそのエラーが発生したのか理解すべきです。やっていくうちに分かると思うがエラーメッセージは本当にその数パターンしかなく大体StackOverflowに解説があるのでそれを学ぶです。

本番環境でこういうランタイムエラーが起きてます

java.lang.NullPointerException: null
at com.example.api.v1.services.ClassA.find(ClassA.scala:138)

関係ありそうなコードはあえて見せないけどエラーから推測したいです。ここであり得そうなのはfindかClassAがnullと推測してます。

findというメソッドがnull: findがないならランタイエラーではなくコンパイル時に例外になるはずだが発生してなかったです。コンパイルとランタイムのバージョンが違えば論理上発生する可能性があります。ランタイムエラーにしてもコンパイルエラーにしてもfindがnullの場合おそらくNullPointerExceptionではなくMethodNotFoundExceptionになるので一番大きな可能性はClassAがnullです。

こうやってエラーメッセージになれるとデバッグ力が強くなります。

コードのリファクタリング

新卒の時から先輩に教わった最も大事なリファクタリングの話:リファクタリングはビジネスに対して価値がなければやりません。リファクタリングのためのリファクタリングするのはやめましょう。

https://ronjeffries.com/xprog/articles/refactoring-not-on-the-backlog/ が本当に素晴らしい記事で一度読んでほしいです。そのまとめですが:

コードベースが小さいときはこういうふうに左から右までサクサクと行ける。早くデプロイできてユーザーに価値届けられる。素晴らしい

そのうち使われてないクラスなのか重複しているコードなのか手動でのハードコーディングなのかみたいなのが出てくるよ。それが邪魔となり左から右まで行くのに以前より遠回さないといけない

上の状況が悪化して。ユーザーに価値を届くのに時間がかかる。いざどうするか

コードベース全部をリファクタリングはしない。すると時間かかるしいいリファクタリングになるか誰でも担保できない。左から右に行くのに通らないといけない道だけのリファクタリングをします。

リファクタリングはメインタスクではなくメンテナンスしやすさを保ちつつやるサブタスク的な考えで良いです。なのでPR(プールリクエスト)もそのように分けるべきです。機能を足すPRと一緒に足すのではなくリファクタリングだけのPR出してマージされてから機能を足すPRを出すとレビューがスムーズです

優先順位

タスクはインパクト対エフォートで考えられます。low effort high impactはタスク的に難しくないがビジネスへのインパクトが大きい。high effort low impactがその逆。

  1. low effort high impact:新規プロジェクトならこれを選びたいがコスパが一番良いので一番早く完成される

  2. high effort high impact:計画したはずのタスクなのでやればいい

  3. high effort low impact:コスパ的に良くないのでやらない判断になりそう

  4. low effort low impact:snackingともいいやってもいいが慣れてしまうとビジネスもエンジニアとしても成長がしなくなるので避けるべき

エンジニアとしては1、2をなるべくやって3と4を避けるべきです。

新規プロジェクト

新規プロジェクトはビジネスに新たなインパクトを与えるポテンシャル一番高いので携われるようにしたいです。マネージャーにやりたいのをアピールしたりパブリックチャンネルで興味を示したりしておくのが良いです。

新規プロジェクトをやる場合新たなコードベースから始めらるからユーザーに価値を届けるスピードが違ってきます。下の状態です

コードリファクタリングの図

比較的に簡単にインパクト出せて昇格につながります。

レガシープロジェクト

レガシーコードとの向き合い方は

  • コードはすぐレガシーになってしまうのでなくすよりどう延命できるのか考える

  • レガシープロジェクトはビジネスに新たな価値を付与しないので頑張らない方向に持っていきたい

  • 触らなくてもいいところは触らない

  • テストコードないならテストコード追加してから作業しましょ

  • コードを削除したい気持ちはわかるがなんでそのコードが最初にあったのか理解するのが大事。Chesterton’s Fenceというやつ

プロジェクトは完成させましょう

「メインな機能をリリースしてバリューを出したがまだ小さなタスクが残って重要ではないしやる気もあまりなく次の面白いことやりたいね」と思ったことないでしょうか。GitHubのブログに出てたjQuery移行の話だがこれも100%移行できていい話でした。99%と100%は1%の差しかないがそのインパクトが全然違うので完成させるのが大事です。

もちろん全てのプロジェクトがそういうわけにはならないのでコミュニケーションととって完成のスコープを再定義して切り替えるのも一つのスキル。メタissueを閉じて残りのタスクを別のissueにまとめるのはよくやってました。

議論

チームで働くとみんな違う背景持っているし当然意見が合わないときもあります。ここで自分の意見が反対されても大事なのはdisagree and commitです。理由は議論に時間を使うより早くアイディアを検証してフィードバックをもらうことが大事からです

Ask for help

現職(外資IT)に入ったとき最初からマネージャーに言われたのは「You are not supposed to know everything, so does everyone. Ask for help」。チームが大きくなるやることがはっきり決められて他チームの仕事の関わりが少なくなりました。なので他チームの仕事を理解する必要が出てきたら「Ask for help」が一番良いアプローチですね。

Swinging the pendulum

組織はKPIがあってそのKPIを達成するためにセールス、運用、サポート、エンジニアなどが動いています。ただしいつまでもKPIを達成するために働いているかというとそうでもないです。時にはKPIと全く関係ない(ように見える)仕事をしているときなかったですか。これはShopify社内ではSwinging the pendulumと呼ばれてます(source)。

swinging the pendulum

場合によっては機能をたくさんリリースする時期もあれば機能をリリースを全く考えない(整備などにシフト)時期もあります。長期的に見るとバランスの良い結果になります。

シニアソフトウェアエンジニアまでの道

昇格の数式

昇格しないとシニアにならないので昇格するための数式をまとめます。

昇格するには価値を出してアピールします。たったこの二つの繰り返しです。ソフトウェアエンジニアとして価値だすためのマインドセットやスキルを上に書いていました。アピールもいきなり自己アピール会を作るのではなくいる組織やその時作った価値によって違います。

ここからは自分が今まで3社で働いていてシニアレベルになった話を詳しく書いていきます。8年間にやっていたプロジェクトとそのインパクト、昇格に伴って給料の変化という情報も入れたいので有料コンテンツとさせていただきます。キャリアについて少しでも参考になってもらえると嬉しいです。

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