ソフトウェアエンジニアリングサバイバルガイド

キャリアの始めに役立つリソース

UnsplashのFabian Grohsによる「ラップトップコンピューターの電源を入れた」

私のキャリアの最初の数年は、集中的な学習の時間でした。

私はソフトウェアエンジニアであるという現実に出会い、必要とは知らなかった多くのスキルを習得しなければなりませんでした。振り返ってみると、私が今知っていることを知って良かったはずです。

そこで、私はこのガイドを、プロとして最初の数年間にメンターした開発者の経験、および私自身と同僚の一部の経験に基づいて、他の人を助けるために書きました。

私がカバーします:

  • インタビューを最大限に活用する方法、
  • ソフトウェアエンジニアとしての仕事で生き残る(そして繁栄する)方法、
  • そして、継続的な改善を検討する際に検討すべきリソース。

インタビュー

ソフトウェアエンジニアリングでのキャリアを開始するとき、1つの紛れもない事実に直面する必要があります。インタビューは吸う。

それらは関係するすべての人にとってひどいものになり得ます。面接者であり面接者でもあったので、私は面接が大きな時間の流れであり、非常にストレスが多く、将来の仕事のパフォーマンスの非常に悪い指標であることを証明できます。それにもかかわらず、それらはあなたとあなたの履歴書がよりよく準備される必要な悪です。

戦いの準備

ソフトウェアエンジニアリングでのキャリアを検討している場合は、「FizzBu​​zz」など、最もよく聞かれるプログラミングインタビューの質問をいくつか確認してください。

「1から100までの数字を印刷するプログラムを作成します。ただし、数字の代わりに3の倍数の場合は「Fizz」、5の倍数の場合は「Buzz」を印刷します。 3つと5つの両方の倍数である数字の場合は「FizzBu​​zz」と印刷します。」
(コーディングホラー)

簡単そうですね。

さて、インタビュー対象者の大多数は、この単純なテストに失敗しました。より複雑なバリアントは言うまでもありません。

私は個人的に、上級職の候補者の多くがインターネットに完全にアクセスしている間にこのテストに失敗するのを見てきました。したがって、履歴書にプログラミング言語がリストされている場合は、少なくともFizzBu​​zzでそれを行う方法を知っていることを確認してください。それ以外の場合は、あなたも含めて、みんなの時間を無駄にしているだけです。

もちろん、インタビューを生き抜くには、FizzBu​​zz以外のことも知っておく必要があります。また、次のことを確認する必要があります。

  • 基本的なデータ構造とアルゴリズム:リンクリスト、配列、ツリー、並べ替えなど。
  • 文字列が不変かどうか、メモリの管理方法など、選択した言語の一般的な「落とし穴」。
  • クラス対オブジェクト、継承などのオブジェクト指向プログラミングの概念。

キャリアの始めには、この種の質問に目を向ける必要があります。仕事に上手であることを証明する経験がないからです。インタビューの準備をする際に私がいつもお勧めする2つのリソースがあります。

  • 「Cracking the Coding Interview」、多くのコーディングの問題とその解決策、およびそれらを解決するために知っておくべきことの要約を含む素晴らしい本
  • CodeWarsは、幅広い言語の選択を使用してブラウザで解決できるコーディング問題の大規模なコレクションを備えたWebサイトです。最も有用な部分は、他のユーザーが同じ問題をどのように解決したかを見ることです。同じ問題に対するさまざまなアプローチを見て、選択した言語で新しいツールを学ぶことができます。

自分にその余分なエッジを与えます

あなたがすることができるいくつかのことがあります。

まず、あなたの経験を伝えることを学びます。履歴書をまとまりのある魅力的な物語にまとめたエレベーターピッチが必要です。

さらに、あなた自身の履歴書を知ってください!馬鹿げているように聞こえますが、履歴書の特定の項目を説明するのに苦労している多くのインタビュイーを見てきました。履歴書に記載されている経験についての質問に答え、それがどのようにあなたが仕事のより良い候補になったかを説明できるはずです。

次に、GitHub(または別のパブリックリポジトリ)に表示するコードサンプルを用意します。

見ることは信じられており、インタビュアーがあなたのコードを見ることができるのは驚くべきことです。さらに、バージョン管理システムを理解していることを示しています。

コードサンプルは複雑すぎる必要はありませんが、クリーンで優れたコーディングプラクティスを示す必要があります。これは、コーディングインタビューの時間的プレッシャーなしに、コーディング方法を示すチャンスです。

上記のすべてを完了したら、オープンソースプロジェクトへの参加を検討します。既存のコードベースで作業し、他のプログラマと共同作業できることを示します。

これは、実際に業界環境にいなくても、業界環境でのプログラミングに最も近いものになります。これはこれまでで最も困難で時間のかかるアイテムなので、上で説明した下にぶら下がっている果物を完了するまで予約してください。

インタビュアーへのインタビュー

就職活動のラッシュとストレスの中で、多くの候補者は面接が双方向の道であることを忘れています。会社はあなたがその仕事にふさわしい人物であるかどうかを把握しようとしているので、その会社があなたにふさわしいかどうかを判断する必要があります。

フォローアップメールであっても、以下の質問のいくつかを尋ねるようにしてください。多くの場合、企業はベストエンジニアリングプラクティスに従わずにスピンしようとする可能性があることに注意してください。

以下に質問の例を示します。

「私にとって典型的な就業日はどのようなものですか?」

ソフトウェアエンジニアリングの仕事はかなり異なるため、特定のポジションに何を期待するかを知ることは重要です。たとえば、サーバーを維持したり、クライアントと直接対話したりすることが期待される場合があります。

赤旗:「わかりません。」→あなたにインタビューする人があなたのチームにいないか、彼らがあなたを雇っている理由が明確にわからないことを意味します。

「ソフトウェアをどのようにテストしますか?」

理想的には、単体テスト、手動テスト、自動テストの組み合わせを使用して、コードの品質を検証する必要があります。

赤旗:「私たちはバグを書いていない、ハハ。」→それらの人々はまさにバグを書いている人です。

「どのバージョン管理システムを使用していますか?」

バージョン管理システムはコラボレーションに非常に役立ち、プロの環境でバージョン管理システムを使用しない理由はありません。

赤旗#1:「あ、バージョン管理システム?」→遠く、遠くに走ります。

常にバージョン管理を使用してください。

レッドフラグ#2:「<あいまいなまたはカスタムVCSを挿入>」→時間が遅れており、インフラストラクチャを長期間更新していない可能性が高いことを示します。

「ピアレビューをしますか?」

ピアレビュー、またはコードベースに入る前に他の人にコードを見てもらうことは、愚かな間違いを見つけるための素晴らしい方法であり、キャリアを始める際の重要なトレーニングの機会です。

赤旗:「私たちはお互いを信頼しているだけです!」→上級開発者はコードを非常に保護しており、フィードバックを受け取るのが得意ではない可能性が非常に高いです。

「継続教育のためにどのようなプログラムがありますか?」

ソフトウェアエンジニアであるということは、テクノロジーが出現し、成熟し、めまいがするほど時代遅れになるにつれて絶えず学習することを意味します。そのため、多くの企業には、大学やオンラインのクラス、会議、社内講演の費用に使用するトレーニング予算があります。

赤旗:「空き時間にオンラインで資料を読むということですか?」→同社は現金に縛られているか、開発者を長期投資ではなく交換可能だと考えている。

「使用しているソフトウェア開発プロセスは何ですか?」

プロセスは、実際の詳細に関係なく、ソフトウェアエンジニアリングに不可欠です。最適なプロセスを構成する要素の詳細については激しい議論が行われますが、プロジェクトに取り組む合意された方法が存在するだけで混乱が最小限に抑えられ、全員が同じページにいることが保証されます。

赤旗:「私たちのプロセスはフリーフォームジャズに触発されています。」→部門全体が消防モードになっており、明確な目標なしに緊急事態から緊急事態にジャンプしている可能性があります。

「技術的な負債にどのように取り組んでいますか?」

技術的負債とは、コードベースに古くなったテクノロジーと迅速だが汚いソリューションが蓄積されていることです。これに対処することは、コードの長期的な健全性にとって重要であり、継続的に行う必要があります。

赤旗:「私たちは新機能に専念しています。」→彼らのコードベースは混乱しているか、まもなくそうなるでしょう。

「あなたの会社の文化はどのようなものですか?」

企業文化は非常に曖昧な概念かもしれませんが、オープンオフィスとキュービクルのような小さなものでさえ、同僚との日々のやり取りを大きく変えます。一般的な危険信号はありませんが、その答えが何年もの間週40時間以上生きられるものであることを確認してください。

ソフトウェアエンジニアとして働く

この段階で、インタビューの成績が良く、インタビュアーが質問にどのように回答したかが気に入った場合、雇用される可能性が高くなります。

おめでとうございます、あなたは正式にエンジニアです!

それで?それでは、コーディングと作業について多くのことを再学習するときです。そして、私たちはプログラマなので、コードについて議論することから始めましょう。

グッドインダストリーコード

適切な業界コードには、次のプロパティがこの順序であります。

  • コードは記述されているよりも頻繁に読み取られて維持されるため、読み取り可能です。コードの意図は、あなたがそれを書いてから数年後に他の開発者に明確でなければなりません。
  • 防御的コーディングのベストプラクティスに従う場合のように、防御的。防御的なコーディングはそれ自体がトピックですが、その要点は次のとおりです。記述したクラスとメソッドの不適切な使用が、コードがソフトウェアをクラッシュさせないようにする必要があります。
  • このリストの最後にある最適化は、ほとんどの場合、実際に心配する必要がないためです。それは、線形解が存在するときにO(n³)で何かをする悪いコードを書く必要があるという意味ではありません。しかし、開発者は一般的に、コードの可読性と防御性を犠牲にして、必要のないときに最適化しようとすることに熱心です。これらのプロパティを犠牲にする特定の最適化が実際に必要であることを常に証明できるはずです。

これで、優れた業界コードの作成方法を理解できました。

あなたは多くのコーディングをしません

驚くかもしれませんが、ほとんどの場合、新しいコードを書くことはありませんが、代わりに次のようになります。

  • デバッグ
  • 既存のコードを読む
  • 会議中またはメールの作成中
  • あなたがコードを書かないように何をすべきかを研究する

したがって、コーディング以外のスキルもあなたのキャリアにとって重要です。

コードのデバッグと読み取り

  • printステートメントを使用したデバッグ以上のことが必要になります。広く使用されているすべての言語と技術スタックには、さまざまな強力なツールがあります。デバッグが簡単になり、数え切れないほどの時間を節約できるので、それらの使い方を学びましょう。
  • コードベースを理解する。ほとんどの技術スタックには、コードベースの構造を理解するのに役立つ何らかのコードグラフ生成ツールがあります。通常、エンタープライズIDEにはその機能が組み込まれています。ReSharper、grep、Sourcegraphなどのツールを使用してコードを調べることもできます。
  • 製品を理解する。ソフトウェアを「修正」しようとする前に、ソフトウェアがどのように機能するかを知らない開発者が多いことに驚くでしょう。ドキュメントを読んでください。

考えを整理する

あなたの時間の多くはコミュニケーション、研究、マルチタスクに費やされるため、すべてを整理するためのツールが必要です。

  • TODOリスト/タスク:あなたの会社は既に何らかの種類のタスクソフトウェアを持っているはずですが、個人的なシステムも持っていると役立ちます。ポストイットノートまたはTrelloやTodoistなどのソフトウェアを使用します。
  • メモ:ミーティングでは常にメモを取り、既存のドキュメントを改善し、個人の知識ベースを作成します。昔のように、Evernote、OneNote、またはノートブックを使用します。やり過ぎのように思えるかもしれませんが、その1年後に、最初の把握に3日かかったあいまいなビルドプロセスを再検討することに感謝するでしょう。広範なメモを取らなかった優秀なソフトウェアエンジニアに会ったことはありません。
  • グラフ/視覚化:人間は視覚的な生き物であり、プロセスやアーキテクチャのグラフを作成すると、複雑なトピックを理解するのに役立ちます。ダイアグラムは、非技術的な同僚と通信するときに特に役立ちます。 Lucidchart、Visio、または無地のホワイトボードを使用します。

ライブラリを使用するタイミングを知る

簡単な答え:ほとんど常に。

長い答え:99%の時間、あなたは車輪を再発明するべきではありません。ほとんどのソフトウェアエンジニアリングポジションでは、特定の種類の並べ替えを実装することは完全に時間の無駄です。だからといって、使用するアルゴリズムとデータ構造がどのように機能するかを知ってはいけないというわけではありません。何をいつ使用するかを決めるのに役立ちます。

効率的なソフトウェアエンジニアになるためには、自由に使用できるライブラリを理解する必要があります。最も人気のある言語の標準ライブラリは非常に便利で、予想よりも大きくなっています。さらに、コードベースは追加の特殊なライブラリを利用する場合もあります。ドキュメントを読んで、いつ使用するかを知ってください。

また、時間を節約できる場合は、追加のライブラリを提案することを恐れないでください。ただし、業界での使用に適したライブラリを選択する必要があります。優れたライブラリは次のとおりです。

  • オープンソース。コードの品質を自分で検証し、アプリケーションにとって重要なバグを潜在的に修正できます。
  • MITやBSDなどの寛容なライセンスの下でライセンスされているため、あなたの会社はそれを使用しても問題に直面しません。誤ってコードベース全体をオープンソースにしないように、GPLに注意してください。
  • 成熟しています。つまり、しばらく前にリリースされており、豊富な機能があります。
  • 維持され、新しいリリースが頻繁にリリースされます。
  • 他の企業またはプロジェクトによって使用され、承認の印として機能し、継続的な保守に対する業界のサポートを確保します。

継続的改善

日々の仕事であなたを良くするスキルを学ぶことに加えて、あなた自身の新しいキャリアの機会を作るために、あなたのスキルを継続的に改善し、新しいスキルを学ぶ必要があります。

学ぶ機会はたくさんあり、それらの多くは非常に手頃な価格です:

  • オンラインコース:柔軟な形式で分野の優秀な教授から学ぶ機会を逃さないでください。既存のスキルを補うことができるコースについては、Coursera、Udacity、およびedX(多数あります)をご覧ください。
  • オンライン修士号:一流大学の最近の傾向であるオンライン修士号は、正式な教育を継続するための柔軟な方法です。また、一般的に学内の学位よりも安価であり、ほとんどのプログラムは学位全体で約$ 10,000かかります。ジョージア工科大学、UT、およびUCサンディエゴは、そのような学位を提供する大学の一部です。個人的には、今年卒業したジョージア工科大学のオンラインマスターをお勧めします。
  • ブログ:ブログはデベロッパーコミュニティの重要な部分です(今ここで読んでいるので、ここでは驚くことはありません)。 Coding Horror、Joel on Softwareなどのブログ、またはThe Daily WTFなどのユーモラスなWebサイトは、ソフトウェアエンジニアとして何をすべきか、何をすべきではないかについての良いアイデアを与えてくれます。ブラウジングメディア、r /プログラミング、HackerNews、またはその他のフィードも、優れた記事やブログにつながります。
  • 会議:最後になりましたが、重要なこととして、会議は素晴らしい学習の機会であり、間違いなく会社のトレーニング予算を活用する必要があります。チェックアウトすべき優れた会議の非常に不完全なリスト(トピックと共に):GOTO; (一般)、ストレンジループ(一般)、PyCon(Python)、CPPCon(C ++)、DEF CON(セキュリティ)、Fluent(Web開発)。これらすべてには、YouTubeでの(ほとんどの)講演のビデオもありますので、出席できなくても何かを学ぶことができます!

願わくば、この記事がソフトウェアエンジニアとしてのキャリアの最初に何を期待すべきかを理解し、このエキサイティングな旅でうまく機能するためのツールを提供してくれたことを願っています!読んでくれてありがとう!質問や提案がある場合は、コメントを残すか、@ AlexievValeriにツイートしてください。