新卒開発者だった私に伝えてあげたいアドバイス
未熟だった私の新卒時代
開発者としてのキャリアを歩み始めて3年半が経ちました。物理学者の道を夢見ていましたが、中学校でゲーム制作のためにC言語を学んだこと、そして高校でHamachiを使ってVPNとネットワークに興味を持ったことをきっかけに、学士・修士課程を終えた後、時代の技術トレンドに乗りたいという欲求から、初めての職場としてCoupangに入社しました。
新卒の頃の私は、未熟でした。 目立つことが大好きで、服装も言動も非常に奔放だったと思いますし、開発スキルが優れているならまだしも、まともにできることもないのに情熱だけが高く、あれこれ手を出してばかりいたので、チームにとっても個人的にも、それほど多くのものが残りませんでした。 開発面では、Spring、Java、そしてReactにもっと集中していたらどうだっただろうという心残りはありますが、大企業でビジネスから開発までフルスタックに近い多様な経験を通じて学んだことも多く、大きな後悔はありません。それでも、もし過去の新卒時代の私に戻れるとしたら、いくつかの助言を伝えたいと思っています。
周囲からのアドバイス要請
休日には、開発に興味を持つ学生たちとSpringや機械学習の勉強会を進めながら、いくつかアドバイスも提供していました。先日、ある学生から、彼らの周りの新卒開発者たちにどんなアドバイスをすれば良いかという質問を受けました。簡単に答えるつもりでしたが、私自身の未熟だった新卒時代を振り返る良い機会でもあり、ブログ記事として残しておけば、他の勉強会でもこの記事を推薦できるだろうと思い、こうして文章を書き記すことにしました。多種多様なスタックを持つ新卒開発者の方々が多いので、各分野に合わせて学習するのが良いと考え、本稿では技術的な内容はあえて除外しました。
開発者という道を、もう一度考えてみてください

最近の産業構造の変化により、開発職種の需要が爆発的に増加し始め、現在の就職難の中で開発者が魅力的な選択肢として映るようになり、周囲では職種を開発者に変えて転職する方々や、学生が専攻を変えるケースが度々見られるようになりました。有能な開発者はお金を多く稼ぎ、会社からの待遇も良く、創造的な職種であるため、いわゆる「老害(꼰대)」が生き残れない分野として開発者文化が先進的であるかのように見えるかもしれません。しかし、これら開発者として得られる利点は、自分自身が有能な開発者である場合にのみ享受できるメリットです。他のどんな分野と同じように、その間には数え切れないほどの忍耐と苦難の時間が存在します。
代替可能な人材
開発者は、有能でなければ、実はその人材を代替することが非常に容易な職種でもあります。 私の周りのシニア開発者の方々は皆、SI企業で厳しい開発経験を積んでこられた方々で、関連する話をたくさん聞いてきました。開発者の実力分布は、勝者総取り(winner-take-all)だと考えてください。上位のわずかな割合の有能な開発者だけが主体的にプロジェクトを運営でき、それ以外の開発者は受動的に割り当てられた開発しかできません。この能動性と受動性の違いが、自分が所属する企業、自分が受け取る年俸、周囲に有能な開発者がいるかどうかに大きく影響すると考えてください。 私の尊敬する全てのシニアの方々は、SIで絶え間ない学習と努力の末に昇りつめてこられた方々です。このことは、私がどこに属するかが重要なのではなく、私の「態度」が重要である、ということを意味します。
有能な開発者の特性
有能な開発者とそうでない開発者の分布が非常に偏っているのは、それだけ有能になることが難しいと考えるべきだからです。競争は相対的であり、努力する開発者も多いため、少しでも不足すると長期的には取り残される可能性があります。では、どのような人が開発者として優れていると言えるでしょうか?
- 業務時間外にもコーディングや学習を純粋に楽しめること。
職場での業務を終え、家に帰って一人で過ごす時間にも、職場で発生した様々な課題や交わされたコードレビューをもう一度復習し、その理由と原因を分析できるべきです。 例えば、今日初めてDockerを使ったデプロイプロセスを経験したなら、Dockerに関する疑問点を学ぶ、といった具合です。個人プロジェクトを持っているのは良いことです。そうでなくても、他のオープンソースを一つ、二つ改善してみたり、うまく書かれたオープンソースコードを紐解いてみたり、デバッグを通じて一行ずつ実行してみることも、コードの能力を高める良い方法です。
- 生涯にわたって学習し続けられること。
楽しむことも必要ですが、開発者は引退するまでずっと勉強し続けなければならない職種です。 Spring一つにしても、以前は.xmlベースでBeanインジェクションを処理していましたが、今では@Annotationベースで処理します。React.jsも、以前はクラスベースのコンポーネントを使用していましたが、今は関数型Hooksを使用します。JVMとESの標準は常に変化し続け、毎回の開発カンファレンスでは新しい概念が発表されます。世界を高速で動かしているのは技術であり、最近その技術の先頭にいるのは開発者です。この速い流れに遅れをとらないためには、「過去の強固な開発知識を基盤として」新しい概念を吸収し、その次を準備できる人材であるべきです。
開発とは、あるユーザーがウェブ/アプリ上で行ったクリックが、フロントUI → ネットワーク → セキュリティ → バックエンドサーバー → サーバーインフラ → DBという全ての技術スタックのサイクルを一周し、望む結果を見られるようにすることです。各分野は、医者で言えば専門医がいるほどの深い知識が求められます。自分がどのような分野の専門医になるにせよ、全てのサイクルについて適切な深さの理解があってこそ、
- 開発において多様な状況を同時に考慮し、信頼性の高い結果を生み出す/助言できる。
- 問題が発生した際に、迅速な原因究明と対処ができる。
開発者は、実は分析家です。
開発者を夢見る時に一般的に思い描く姿は、キーボードを叩き続けてコードを生成し、新しいものを生み出すことでしょう。しかし、開発の半分は、セキュリティ、性能、安定性、拡張性を考慮して新しいコードを生成することであり、それすらも、自分が作成したものや他者、あるいはStack Overflowのコードの多くを参照して再生産することになります。残りの半分はテスティングとデバッグです。
会社で業務を遂行する際、一つのプロジェクトを一人の人間が全ての役割と責任を持って作り上げることはありません。たとえそうであったとしても、そのコードは次の世代の新しい開発者に引き継がれます。開発は、多数の開発者との協業です。つまり、多数の開発者たちのコードの山の中に、自分の小さなコードを投入する過程の繰り返しです。それは、非対面・非同期的な協業と言えます。だからこそ、一つの機能開発であっても、他開発者が開発したコードを完全に理解できなければ、意図しないエラーを生み出すことになります。 テストを進める中で、明らかに意図した結果が導き出されない時がありますが、その際には自分が作成したコードだけでなく、他開発者のコードも一緒にデバッグできるべきです。行ごとに意図を把握し、コードの流れを把握することは、直接的な開発能力よりも重要です。どんなに良い鍼を使っても、鍼灸師が脈を正確に診なければ意味がないのと同じです。
コードの保守性については、かつて非常に大きな問題となり、これを解決するためにSpringのIoCや責任分離の概念などが登場しました。誰でもドキュメントなしでコードを理解できるようにするのが最善ですが、ドキュメントとコメントは開発者と協業においてそれに劣らず重要です。開発は協業であるということを忘れてはなりません。
良いシニア開発者になるために
一般的な開発者の能力とは少し異なる側面について見てきました。それでも開発者になりたいという気持ちが強いなら、今度は新卒の頃からどうすれば数年後に同僚たちが一緒に働きたいと思うシニアとして成長できるかについて話しましょう。簡単に要約すると、自分が書いたコードに対する根拠/理由を誰に対しても明確に説明できなければならず、主力とする言語やフレームワークについて深い理解を持っている必要があります。
課題とレビューは必ずメモ・復習
開発中に発生する課題やコードレビューは、必ず「なぜ」について細かくメモを取り、復習することが必要です。前述したように、開発者は生涯学習が必要な職種であるほど、習得すべき情報が多いため、別途メモや復習がなければ、毎回同じ過ちを繰り返すことになります。記憶を定着させるためには、勉強会などを通じて誰かに教えるのが良い方法です。
コード作成理由の説明
自分がどのような作業をなぜこのように行ったのか、誰かにきちんと説明できる必要があります。新卒や経験者採用の際に、面接で注意深く見る部分でもあります。「誰かがこうしろと言いました」「Stack Overflowにこう書いてありました」という根拠は、当然ながら良くありません。理由なく、ただ動くから使用するというコードは、ほとんどないべきです。 もちろん時間の制約上、全ての理由を知ることはできませんが、少なくとも自分の主力分野については説得できるべきです。
言語・フレームワークの選択と集中
新卒の頃は、主力とする言語、フレームワーク、DBが少なく、深いほど良いです。特に、最新技術を使用し、各チームごとに開発スタックが多様な(良い)会社に初めて入社した場合、まるでビュッフェに来たかのように目を輝かせ、あれこれ全て試してみたいという気持ちは百も承知です。しかし、ジュニアであれば、自分の主力技術が一つでもあってこそ、それを通じて他の技術との違いを知り、特徴をよりよく理解できます。 他の技術を理解する上でだけでなく、キャリア的にも3年~5年という長い時間が流れた時、その主力技術が自分の強みとなり、後輩たちを導けるようになります。
全てを習得したいという気持ちは、今のところは残念ですが情報量が本当に膨大であるため、一つでもきちんとできるようになるための「選択と集中」の知恵が必要です。 フルスタックとは、自分の分野に対する適切な理解がしっかり確立されてこそ、その上に横線を引いてT字型人材になることができるのです。縦棒「|」をきちんと立てることができれば、その後の横棒「—」はより広く、広範に伸びていけるので、目先の欲求を抑え、自分の分野に集中しましょう。
言語/フレームワークの選択は、自分が行きたい分野で多く好まれ、普遍的に使用されているものを選ぶべきです。 Webサービス開発であれば、Java、Spring、そしてSQLはMySQLだけをきちんと勉強しておけば、NoSQLの概念やMVCCなどを理解するのに大いに役立ちます。ゲーム開発であれば、UnityのためにC#を学ぶことや、機械学習のためにはTensorFlowのためのPythonを勉強することが考えられます。
隙間時間に勉強
新卒の方々は、新しい会社で主に三つのことを学ぶでしょう。社内外のチーム構成と自身のチーム内のメンバー、ビジネス、そして開発技術スタックです。Coupangのようにビジネスが広大な会社に入社した場合、それらを理解するだけで1年近く費やすこともあるかもしれませんが、隙間時間に個人の主力言語やフレームワークを粘り強く勉強し続けることで、良い機会が訪れた際にそれをより良く掴み、成果を上げることができるでしょう。
ある人は、2〜3年間世の中に自分はいないものと考え、粘り強く勉強に全力を注げば、より短期間でシニアになれると言いますが、人間的にはそこまで推薦するのは難しいと思います。このような理由から、オタク気質の人や、コーディングや勉強を狂ったように愛する人が天才開発者になるのだと考えます。結局のところ、勉強の総量が決定するわけです。
コードレビューは必須
コードレビューが非常に活発な会社に行くことをお勧めします。少なくとも一人のメンターが継続的にコードレビューをしてくれる企業で働くのが良いでしょう。メンター・メンティー制度が確立されているなら、本当に最高です。 一行のコードには、そのように書かれた数多くの理由があります。ジュニア開発者は、なぜこのように開発されたのかを知るために数ヶ月勉強しなければなりませんが、適切なメンターがいれば、一週間で全ての理由を学ぶことができます。もちろん、その知識は必ずメモしておく必要があります。そのような文化がない場合は、同期たちと、あるいは勉強会を通じてお互いのコードと知識を共有し、レビューする会を作るのが良いでしょう。なぜなら、ビジネスへの対応により、コードレビューを毎回きちんと行うのが難しいのが現実だからです。 会社の同期は、対外秘である会社内部のコードをレビューしてくれるという利点があり、勉強会を通じては、指定した言語/フレームワークを多様な視点から議論できるという利点があります。似たような理由で、開発者コミュニティのような対外活動を増やすことも、シニアの方々から多く推薦されています。
コミュニケーション能力
私は、人々と直接対面しないという非対面の特徴から開発者を選びましたが、一般的に「陰キャ」のイメージを持たれがちな開発者像とは異なり、結局のところ開発者は人と接する仕事です。 実際にメディアで目にするような非社会的な「ナード」たちは、本人の能力は非常に優れているかもしれませんが、会社はチームごとに設定された目標を持って共に進む場所であるため、協業とコミュニケーション能力がなければ、活用不可能な資源に過ぎません。新卒開発者として二つの分野の人々と接することになるでしょう。ビジネス分野とデザイン分野です。彼らとは(1)要求事項と(2)開発上の限界について話すことが多くなるでしょう。また、同じ分野の開発者たちとも、(1)コードに対するレビュー/理由の説明と(2)情報交換のために、コミュニケーションは必須です。他者の意見には常に傾聴し、尊重する姿勢が必要であり、自分の根拠についても論理的に説明できるべきです。
実は最初、フルスタック開発者になるために知っておくべき基本的なフロントエンド、バックエンド、セキュリティ、ネットワーク、インフラに関する技術的な内容について話したいと思っていました。しかし、あまりにも情報量が膨大であるため、これについては今後ブログ記事やオフラインの勉強会を通じて伝える必要があるようです。
もう3年半という月日が経ちましたが、私自身も常に不足を感じながら勉強しているため、このようなアドバイス記事を書くのが適切なのかと時々思います。しかし、新卒の頃の私に足りなかった点について書いたこの記事が、今まさに新卒として入社する後輩や、開発職を準備している方々のお役に立てれば幸いです。短い時間で作成したため、至らない点も多いかもしれませんが、最後までお読みいただきありがとうございました。:) 全ての開発者の方々を応援しています。いつか、良い場所でお会いできることを願っています。