avatar
公開

ソフトウェアエンジニアになってからの最初の3年間の振り返り

ソフトウェアエンジニアになってからの最初の3年間の振り返り
目錄

注: この記事は AI によって翻訳されています。もし不自然な表現や誤りがありましたら、メールやその他の手段でお知らせいただけると幸いです。フィードバックをいただけると助かります!

この記事は 1 ヶ月ほどかけて少しずつ書いたり削ったりしたものです。実際、後になって思いついたことを少し書き足しただけなので、少し長くなっています。大部分は自分のために書いたものですが、非情報系文系出身者がソフトウェアエンジニアに転職して 3 年間の感想に興味がある方は、適当に見ていってください。

(この後はもっと定期的に、1 年に 1 回振り返るようにして、こんなに長くならないようにしたいです笑)

なぜ振り返るのか?実は、この 3 年間自分が一体何をしていたのかを総括するためです。 ソフトウェアエンジニア(あるいは現代人)として、知識への不安は非常によくあることです。しかし、定期的に自分のしたことを振り返り、自分がどれだけ遠くまで来たか、どこに満足していないか、次のステップは何か、そしてどう調整できるかを知ることで、現在に対する不安感を大幅に軽減できます。 まとめの重要性 | by Denny

ソフトウェアエンジニアになる前は何をしていたか

私は大学で哲学を専攻していました。1 年生から 4 年生までは経営管理、心理学、社会学、情報管理の授業を履修していました。3 年生の時に富邦(Fubon)で 1 年半保険の営業をしていました。営業の仕事は、人と接するのは好きだけれど、仕事で人と接するのは嫌だと気づかせてくれました。

保険業界を離れた後、社会学の研究に積極的に取り組み、4 年生の後期に科学技術部の大学生研究計画に投稿しました。5 年生の前期に計画が通過した後、IG(Instagram)を分析する文化研究論文を書きました。この期間に学術の道の困難さを理解し、学術の道には進まないことを決めました。

ソフトウェアキャリアの振り返り

要約 (TL;DR)

  • 大学時代、一人目の恩人:私がプログラミングをするきっかけ
  • 仕事中、二人目の恩人:私は「プログラミング」がどういうことかわかり始めた
  • 退職前、三人目の恩人:穏やかに私をメンタリングし、いくつかのクールなものを開発するように段階的に導き、自信をつけるのを助けてくれた。
  • 現状:以下で触れます。

2018.10 友人が主催した勉強会に参加し、私のソフトウェアキャリアの起点となる

  • 営業をしていた時、ソフトウェアエンジニアの顧客にソフトウェア業界への好奇心を刺激されました。そしてちょうどダンスで知り合った友人が Web フロントエンドの勉強会を開きたいと思っていたのを見て、当時はあまり深く考えずに参加しました。友人は私が学べなければ自分で辞めるだろうと思っていましたが、なんと——私のソフトウェアキャリアはこうして偶然にも始まりました。
  • この頃のレベルを思い返すと、HTML、CSS、JS という言葉さえ聞いたことがないほどでした。「HTML はウェブサイトの骨組み、CSS はウェブサイトのスタイル、JS はインタラクションロジックを書くもの」という基本的な概念を知るだけで長い時間がかかりました。

2019.04 インターンシップ開始

  • 実はこのインターンシップも突然のことでした。
  • 当時、私はまだプログラミングで食べていけるとは思っていませんでした(事実そうでした)。そこでまず Dcard のコミュニティマーケティングのインターンに応募し、落ちた後はカフェでバイトしようか考えていました。
  • しかし、勉強会を主催していたその友人の会社がちょうど未経験のインターンを募集しており、私は JS さえ書けない状態で Web 開発のインターンになりました。
  • インターン期間中は実はとても辛かったです。友人は私がもっと基礎を固めてから入るべきだと考えており、私も入ってからそれに強く同意しましたが、同時に、この試練が私をより早くソフトウェア業界に踏み出させてくれたことに非常に感謝しています。
  • 総じて言えば、この時期は「まだ歩けないのに、飛ぼうとしていた」時期のようでした。JS も書けないのに React を書き始め、しかも書いたものが直接製品に入るのです。

2020.02 正社員登用

  • 正社員になる前、私は 1 週間半かけて台湾一周し、1 週間日本に行き、そして正式にソフトウェアキャリアをスタートさせる準備をしました。
  • 正社員になった後は、正式にサラリーマンになり、給料が少し増えた以外は、全体的な感覚は前の段階とほぼ同じでした。
  • 私は依然としてあがいており、自分でデバッグする能力さえ不足していました。よく数行の Web ページを書くだけでクラッシュし、コンソールを開くと真っ赤なエラーだらけで、隣の同僚に助けを求めていました。
  • 7 月頃、非常にベテランのフロントエンドエンジニアが入社してきました。彼は非常に優秀で、共有することを惜しまない人でした。当時社内の勉強会で彼の共有を聞いて多くの利益を得たので、私は彼につきまとって質問し始め、後に彼についてプロジェクトを書くようにもなりました —— これを分水嶺として、私は「プログラミング」がどういうことかわかり始めました。
  • 彼は私のキャリアにおける二人目の大きな恩人です。(一人目は勉強会を開いた友人です)

2020.09 兵役

2021.09 退職

  • インターンと正社員合わせて 2 年半、私は最初に働いた会社を去りました。理由は「給料、成長性、そして自社製品作りたい」からです。
  • まず、上で述べたベテランエンジニアが退職し、私を連れてきた恩人の友人も退職しました。途中で別のベテランエンジニアが入ってきて、彼はキャリアにおける三人目の恩人でした。彼は非常に穏やかな方法で私をメンタリングしてくれました(退職した方は教え方が素晴らしかったですが、よく自分が馬鹿だと感じさせられました)。しかし、彼も 1 年以内に退職してしまったので、ここでこれ以上続けても成長性は非常に限定的だと判断しました。
  • 次に、この会社は受託開発の会社だったので、多くのものは開発が終われば丸ごと納品して終わりで、その後の継続的なメンテナンスや統合に触れることは難しかったです。また開発時も、顧客の奇抜な要望やスケジュールのせいで開発が滞ることが多く、スクラムなどの開発プロセスもうまく回りませんでした。動くものを作って顧客にパッケージとして売るのではなく、SaaS(Software as a Service)が市場でどのように動くのかをより実際的に知りたいと思いました。
  • 最後に、給料です。数字は一目瞭然なので、何も言うことはありません。

2021.10.18 現職の会社に入社

  • 退職後 18 日間休み、現在の会社に入社しました。これについては以下の現状セクションで触れます。

なぜこのタイミングで振り返るのか?なぜ 3 年なのか?

3 年、それは私が偽物(インポスター)から脱却し、本物になった時間です。

私はプログラミングを始めて 1 年ほどでようやくプログラミングとは何かを理解し始め、最近になってようやく自分がソフトウェアエンジニアであると真に認められるようになりました。やっと自分には資格があると感じ、自らを「ソフトウェアエンジニア」と称する時に、少しの後ろめたさも感じなくなりました。だからこそ、敢えてこの記事を投稿できるのです。

私はついに「インポスター症候群」から抜け出しました。

なぜ自分を肯定するのに 3 年もかかったのか?

私自身が自信に欠ける人間であること以外に、3 つの理由があります。

  1. 可能性

    この 3 年間、私は常に可能性を模索していました。他のキャリア発展の可能性であれ、ソフトウェアエンジニアリングにおける自分自身の可能性であれ。 簡単に言えば、自分にその能力があるのかずっと確信が持てず、ソフトウェアエンジニアになりたいかどうかもわかりませんでした。

  2. 逃げることは恥ではないが、私はずっと逃げ続けていた

    私のメンタルは十分に強くありませんでした。書けないという不安や不快感に直面したとき、私は問題を解決するのではなく、よく逃げることを選びました。実は、これは自分を十分に信じていないこと、そして自分に書くことを急かしすぎていたことの裏返しでもあります。 最終的に、自分が逃げることに慣れすぎていると気づいた後は、自分に直面することを強制しました。その後、ソフトウェア開発においては、時間をかけ、積極的に方法を探せば必ず問題を解決できることに気づきました。なぜなら、あなたがやりたいことはほぼ誰かがすでにやっており、Google で必ず答えが見つかるからです。時には、自分の能力を超えすぎているか、奇抜すぎて処理が難しい問題を割り当てられただけということもあります。

  3. 2 社目のソフトウェアエンジニアの仕事を見つけることに成功した

    実は、私のソフトウェアエンジニアとしてのキャリアはただの一時的なものに終わるのではないかとずっと恐れていました。結局のところ、勉強会に参加する前は、私はプログラミングとは全く無縁でした。パソコンにも詳しくなく、数学も苦手でした(数乙が悪くて商学部に入れなかったくらいです)。そして 1 社目での私のイメージもある程度固まっており、社長は私にあまり期待しておらず、重要な仕事も振ってくれませんでした。 しかし、2、3 ヶ月の集中的な準備を経て、JS の多くの典型的な面接問題を補い、Leetcode も解き始め、いくつかの会社と面接をして、最終的に 2 つのオファーを得ました。そしてそのうちの 1 つを断った後、主管から引き留められ、給料もワンランク上がりました。これは私の自信を大いに強めてくれました。

以下では、私がどのように自分を肯定したかのいくつかの方法論について述べます。

どうやって自分を肯定したのか?

これは私が新人の時に直面した問題から出発します。

  1. 自分が愚かな質問をしているかどうかわからない
  2. 自分の進歩をどう測ればいいか、努力の方向が正しいかどうかわからない
  3. 自分に十分な資格があるかどうかわからない

自分が愚かな質問をしているかどうかわからない

  • 正しく質問する限り、愚かな質問などありません
  • 正しく質問する方法:「少なくともまず資料を調べ、ロジックを整理した後、できるだけ詳細に問題を記述し、相手に自分の理解のどこに問題があってバグが出たのかを確認する。」
  • 要するに、クレクレ君にならないこと
  • 推奨読書:初日から学ぶべき的確な質問術

自分の進歩をどう測ればいいか、努力の方向が正しいかどうかわからない

  • 最もシンプルで暴力的な方法は「面接に行くこと」です。結局のところ、あれこれ学ぶのは応用するため、仕事で実戦するためです。だから自分の現在のレベルや学習状況が不確かでも、面接時に相手のシニアが教えてくれます。
  • それ以外では、以下の方法で判断します:
    1. 志望企業の JD(ジョブディスクリプション)を見て、まだできない Technology Stack がないか確認する。
    2. もし Stack がすべてできるなら、「XXX 面接 / Interview」で直接検索すれば、多くの問題が見つかります。もちろん質の悪い問題もありますが、大まかな方向性は掴めると思います。
      • 例: React Interview
    3. 着実にやりたいなら、Developers Roadmap に沿って学ぶのがいいですが、ツールの選択に関してはやはり行きたい会社が何を使っているかを見ることをお勧めします。

自分に十分な資格があるかどうかわからない

最初の一社目にいた時は、そこを離れたら仕事が見つからないのではないかとずっと心配していました。

私たちが恐れるのは、未知だからです。

面接を始めてから、徐々にその心配はなくなりました。面接のプロセスがどう進むのかわかり始めたからです。最初は間違いなく何社か落ちますが、それらの失敗経験から検討すれば、面接の問題は大同小異であることがわかります(少なくともジュニアレベルでは典型的な問題ばかりです)。その後はひたすら**「面接、検討、知識の補足」**というサイクルを繰り返すだけです。

そして現在の会社に入ってから、私は実はキャッチアップのスピードが遅くない(同僚談)ことに気づきました。異なるフレームワーク(Vue)を使うプロジェクトでも、すぐにデバッグを手伝い、価値を貢献できるようになり、これが自信を大きく高めました。

次は少しクリシェ(決まり文句)な部分ですが、面接の前、つまり自分の内心で深く「まだ準備ができていない」と感じていた時に、どうやって準備完了だと思えたかについて話します。

まず、とても努力すること。 プログラミング学習は「プラトー現象」に非常によく当てはまります。図を直接見てください。

プラトー現象

次は Learn, Practice, Balance です

Learn

  • 学ぶこと。先輩、友人、動画、記事などから知識を吸収します。
  • そして学習過程で自分の学習方法を絶えずイテレーション(反復改善)すること。自分はやりながら学ぶのが合っているか、学んでからやるのが合っているか?動画を見る?記事を読む?メモを取るか?どうメモるか?表現力を鍛えるためにブログにアウトプットするか?などなど。

Practice

  • 「学びて思わざれば則ち罔し(くらし)、思いて学ばざれば則ち殆し(あやうし)」(儒教は嫌いですが、この言葉は本当に素晴らしいと言わざるを得ません)
  • 学んだ後の次のステップは「手を動かすこと」です。ずっと机上の空論を戦わせていても、手応えがありません。
  • それに Web 開発の道のりには、ローカル設定、コードのバージョン、パッケージのバージョン、ブラウザなど、問題が起こる方法が何千通りもあり、句読点を打ち忘れたり誤字があったりするだけでエラーになります。
  • だから学んだことが、現在のプロジェクトに応用できない可能性は極めて、極めて、極めて高いです。
  • この時、もし以前に一度手を動かしたことがあれば、少なくともずっと手応えがあり、この方法が確かに実行可能であることを知っています。ただ現行プロジェクトの環境に合わせるために、いくつかの設定を追加する必要があるだけです。これによって問題の範囲を初期段階で縮小でき、完全に手掛かりがない状態にはなりません。
  • 初学者の時には完全に手掛かりがない状態が非常に起こりやすく、一つのエラーに対して全く手が出せなくなります。
  • ソフトウェアエンジニアリングの最高な点は、キーボードを叩くだけで 0 と 1 の間に自分だけの世界を構築できることです。

Balance

  • 生活はプログラミングだけではありません。

Burnout 101 source

  • ソフトウェアエンジニアは一般的に深刻な知識不安を持っていますが、現代では多くの業界で同様の問題があります。
  • バランスが必要だと気づいたのは、フィットネスと日本語学習を始めてからです。
    • フィットネスは、自分の体力や体型が良い方向に向かっていると感じさせてくれます。運動によって生成されるドーパミンのおかげで、不安にもなりにくくなりました。体力がつき、健康的な食事をした後は、日中にぼんやりすることもあまりなくなり、よく眠れるようになりました。
    • 日本語は、私が日本を大好きだからです。好きな文化に近づけることがとても幸せです。そして言語はプログラミングに比べてずっと単純で、覚えれば、練習すれば身につきます。このシンプルで直接的なフィードバックも私に自信を与えてくれ、その自信はプログラミングをする自分にも広げることができます。

フィットネスは、自分の体力や体型が良い方向に向かっていると感じさせてくれます。運動によって生成されるドーパミンのおかげで、不安にもなりにくくなりました。体力がつき、健康的な食事をした後は、日中にぼんやりすることもあまりなくなり、よく眠れるようになりました。

日本語は私が日本を大好きだからです。好きな文化に近づけることがとても幸せです。そして言語はプログラミングに比べてずっと単純で、覚えれば、練習すれば身につきます。このシンプルで直接的なフィードバックも私に自信を与えてくれ、その自信はプログラミングをする自分にも広げることができます。

最後に、もっと人と話す & Twitter を見る & Leetcode の感想

この 3 つのことによって、私には問題がないこと、プログラミングで直面する挫折は普遍的な経験であることを理解しました。 まるで [Leetcode - Coin Change] のある解答コメント欄のように

leetcode comment

  • 解けなくてパソコンの前で崩れ落ち、解答を見てもわからなくて絶望するのは私だけじゃなかったんだ!

  • 書けないのは自分の問題ではなく、一般の人と同じように、できない状態からできる状態へのプロセスを経験する必要があるだけです。

  • 難しいものは難しいのです。数日、数週間、あるいは半年、一年かけて学ぶこともあり得ます。そして誰もがそうやって一歩一歩歩んできたのです。私の情報工学科出身の友人が Leetcode を解いている時、私よりずっと楽というわけではないのを見て、みんな私と同じ段階を経験してきたんだと気づかされました!

  • 崩壊し終わり、感情が過ぎ去ったら、学習を始めるべきです。

  • フロー:「直接コードを見る -> Google で記事や解答を探す -> Youtube で動画のコマ送り詳細解説を見る -> 直接人に聞く。」

  • コードがわからなければ文字を読みます。問題を直接ググって誰かが解説していないか見ます。解説もわからなければ動画を見ます。Youtube には詳細な解説を撮っている人がたくさんいて、一行ずつ解説しフローチャートもつけてくれます。一時停止しながら時間をかけて見れば必ずわかります。

  • 私は自分があまり賢い人間だとは思っていませんが、このフローに従い、時間をかけることを惜しまなければ、本当に学べないものにはほぼ出会ったことがありません。ただ多くの時間を費やし、多くの周辺知識を補う必要があるかもしれませんが、必ず習得できます。

私の現状

キャリア

私は今スタートアップ企業にいます。エンジニアは私と上司の二人だけです。二つのフロントエンド(一つに統合予定)、一つのバックエンド管理画面、一つの統一バックエンド、そして提携企業のために開発した広告配信管理画面を扱います。 3 年目の給料はすでに 1 年目の約 2 倍になりましたが、周りの多くの人と比べるとまだ普通レベルです。

当初ここに来た時はフルスタックを期待されていましたが、バックエンドの概念があまりなく、たまに API 作成を手伝うくらいで、主にはやはりフロントエンドを担当しています。 また会社が小さすぎていくつかの変革を経験し、実際コードを書くことに集中できない時期も多かったです。入社してもうすぐ 1 年ですが、足踏みしている感覚が大半です。最近安定してきてようやく充実し始め、一人ですべてのフロントエンドを書く準備をしており、二人のシニアフルスタックがコードレビューを手伝ってくれるので、成長できることを期待しています!

Technical Stack

今のところ自分の持ち札は多くなく、ある程度のレベルにはありますが、あまり盤石とも言えません。しかし、何を学ぶべきか、何を学びたいか、そしてどうやってものをしっかり学ぶかについては、より方法論を持てるようになりました。

基本的にフロントエンド関連の基本的な要件は作れますが、作れるのは第一歩に過ぎず、継続的な統合・最適化、システム設計などはまだ強化が必要です。

私が参加したプロジェクト

  1. 劇場施設管理 ERP(既存の紙ベースのプロセスの全面オンライン化)
  2. 劇場施設公式サイト
  3. ジム ERP(従業員、レッスンスケジュール、契約、商品などの管理画面を含む)
  4. Custom React UI Library (Open Source)
  5. ある製品のランディングページ
  6. 企業とインフルエンサーのマッチング ERP
  7. ブログ広告配信プラットフォーム (Side Project としてずっと叫んでいますが未着手)

中で比較的挑戦的だったのは React UI Library でしょう。他の ERP の経験は大同小異で、主にシニアが構造を作ってくれ、私は中に入って実装するだけでした。

次のステップ?

キャリア

エンジニアのキャリア開発には Engineer Manager と Individual Contributor があります。 将来は Engineer Manager の方向に進みたいですが、それもまずそのような制度と規模のある会社に転職しなければなりませんね! 推奨読書:ソフトウェアエンジニアの修練と成長Podcast

Technical Stack

技術的負債を返し、手掛けたプロジェクトの技術、対処した問題、そして当時書いている時に理解していなかったものを整理します。面接時にプロジェクト関連で答えられないことがないようにします。 次は「深める」と「広げる」です。

深める

  • 主に JS、TS、そして React / Vue にもっと精通すること。React はやはり最大勢力ですし、Vue は現在の会社の主要開発フレームワークです。

広げる

  • Web ライフサイクルの各役割(FE、BE、SRE、DevOps、DBA)の基本機能は少なくともできるようになること。後ろの方に行くと多少なりとも触れることになるからです。Google の SRE は私よりフロントエンドを書けるという概念と同じです。とはいえ基本的なことだけで、おそらく Side Project をいくつか作って一通り触ってみるくらいでしょう。
  • Internet
  • Security
  • できれば、Rust、Golang、Java / Kotlin など他の言語も触ってみる。

深さと広さ以外に、Leetcode、データ構造、各種アルゴリズムも継続的に積み上げます。今は毎日少なくとも 1 問解き、暇があればもう少し多く解き、まずは基本問題の [Blind 75] を終わらせます。

これらをリストアップしましたが、どれも小さなテーマではありません。 自分を押し潰さないペースでゆっくり学び、来年の振り返りでどれだけ学べたか見てみましょう!

結び

私がソフトウェアエンジニアになった初心を振り返ります:

「職人精神」への憧れ、自由な働き方、そしてソフトウェア業界に含まれる可能性。 十年一剣を磨くような職人をずっと心の中で崇拝しており、ソフトウェアを書くことはまさに様々なクールな Web ページやシステムを作ることができます。(でも 3 年書いてみて自分は何も Side Projects をやっていないことに気づきました。本当に初心を忘れるべからずですね)

もし 3 年前の私と話せるなら、彼にこう言います:

  1. 転職の初期段階について、基礎を固めることと正しい会社を選ぶことはとても重要。 最良の状況は、制度が比較的整っていて、メンターがいるか、少なくとも指導してくれる人がいるところを見つけること。 私のキャリア選択は今のところつまずきながら進んでいると感じます。もう一度やるなら、私は間違いなくある程度規模のある会社に先に入ります。でも実は当時も多くの現実的な要素のトレードオフがあったのですが。
  2. ソフトウェアエンジニアは愛がなければあまりできない職業だ。 愛がなければ、あなたは非常に苦痛を感じるでしょう。 なぜなら私たちが学ぶべきことはあまりにも多いからです。もしソフトウェアが好きでなければ、これほど多くの時間とエネルギーを投入できるとは想像しにくいです。
  3. エンジニアは確かにかなり快適な職業だ。 規則があまりなく、通勤は自由でリモートも可能、パソコンさえあればどこでも仕事ができます。 給料も一般的に中〜高水準です。台湾でのソフトウェアの天井は比較的低いですが、海外や外資系に行けば非常に良い発展が見込めます。(やはり努力より選択が重要、会社は慎重に選びましょう。)
  4. 非専門学部からの転職は本当に楽ではない。目にする成功例の背後には、途中で船を降りた人たちがもっといる。(生存者バイアス) 船を降りるのは能力不足とは限らず、単に興味がないだけかもしれない。 転職には努力とチャンスが必要です(一般人の場合)。何をやっても成功するような非常に賢い人たちは別ですが、私はそうではないので、道のりは運の要素が本当に多すぎました。
  5. ソフトウェア業界で真面目に耕しても、可能性は縮小しない 私が一番やりたいことはソフトウェアを書くことではないと結構確信しています。しかし「仕事」として言えば、今の私の最良の選択はソフトウェアを書くことです。余裕ができたら自分の興味のある分野をもっと耕し、できるだけ夢と現実を両立させましょう。 (私が一番やりたいのは創作や共有でしょう。作家、ブロガー、講師などの方向性がありますが、どれもまだ生計を立てるには至らないので、本業をしっかりこなしつつ時間を見つけて自分を充実させます!)

全編を通して特に要点はないようで、ただの心路歴程の記録です。大部分は自分との対話ですが、ここまで読んでくださった読者の皆様、ありがとうございます、そしてお疲れ様でした!

最後に、この 3 年間に出会った恩人たちに感謝します:小白、Steven、Bob、Jay Chen、Jay Chou、Boogie Yan、Kyle Mo。

あなたたち一人一人が私に前に進み続ける原動力と方向を与えてくれたおかげで、途中で船を降りずに済みました。 今、私は偉大なる航路(グランドライン)へと出航し、新世界で一暴れし続ける準備ができています。