こんにちは、Habr! Dan Abramovによる記事「2018年時点でわからないこと」の翻訳を紹介します。
人々は通常私が多くを知っていると思いますが、これは実際にはそうではありません。 これはそれほど悪くなく、私はまったく文句を言っていません。 (人々の一部は、より多くの価値があるという事実にもかかわらず、しばしば偏見の信念に苦しんでいます。これはひどいです)。
この投稿では、私が知っていると誤って想定しているプログラミングトピックの不完全なリストを示します。 私はあなたがそれらを勉強する必要がない、または私が他の有用なことを知らないと言っているのではありません。 しかし、私は自分自身を脆弱な立場に置いていないので、これについて正直に言うことができます。
なぜそれが重要だと思うのか
まず、経験豊富なエンジニアが彼の分野のすべての技術を知っているという非現実的な期待がしばしばあります。 何百ものライブラリとツールで構成される「学習マップ」を見ましたか? これは便利ですが、怖いです。
さらに、あなたがどれほど経験があっても、あなたはまだ能力感覚、不十分さ(「インポスター症候群」)および自信(「督促–クルーガー効果」)の間で切り替わることに気付くことができます。 それはあなたの環境、仕事、性格、同僚、精神状態、時刻などに依存します。
経験豊富な開発者は、初心者を元気づけるために自分の不安について話すことがあります。 しかし、まだ緊張している経験豊富な外科医と、初めてメスを保持する学生との間には大きな違いがあります!
「私たちはすべて初心者デベロッパーです」と聞くと、実際の知識のギャップに直面している学生との空っぽの会話のように落胆し、聞こえるかもしれません。 これを克服できない私のような慈悲深い開業医からの告白。
ただし、経験豊富なエンジニアでさえ多くの知識のギャップがあります。 この投稿は私のものであり、このような弱点を買う余裕のある人は、自分自身を共有することをお勧めします。 しかし、この時点で私たちの経験を軽視しないでください。
私たちは知識のギャップを認識することができます。詐欺師のように感じるかもしれないし、そうでないかもしれません。
これにより、私は責任を負いません。ここでは、私が知らないことをいくつか紹介します。
- UnixおよびBashコマンド 私はlsとcdを実行できますが、他のすべてをスパイすることもできます。 配管の概念は理解しましたが、単純な場合にのみ使用しました。 xargsを使用して複雑なチェーンを作成する方法や、さまざまな出力ストリームを作成およびリダイレクトする方法がわかりません。 私はBashを適切に研究したことがないため、非常に単純な(そしてしばしばバグのある)シェルスクリプトしか書くことができません。
- 低レベル言語。 Assemblyを使用すると、物事をメモリに保存してコード内を移動できることを理解していますが、それだけです。 Cで数行書き、ポインターとは何かを理解していますが、 mallocまたは他の手動メモリ管理方法の使用方法がわかりません。 Rustを台無しにしないでください。
- ネットワークスタック。 コンピューターにはIPアドレスがあり、DNSがホスト名を処理する方法を知っています。 パケット交換用のTCP / IPなどの低レベルプロトコルが(おそらく?)整合性を保証していることを知っています。 それだけです-詳細がわかりません。
- コンテナ DockerやKubernetesの使い方がわかりません。 (それらは関連していますか?)別の仮想マシンを展開できるという漠然とした考えがあります。 クールに聞こえますが、試したことはありません。
- サーバーレス。 かっこいいですね。 試したことがありません。 このモデルがバックエンドプログラミングをどのように変更するかについて、明確な考えがありません(まったく変更されている場合)。
- マイクロサービス 正しく理解できれば、これは単に「多くのAPIエンドポイントが相互に通信する」ことを意味します。 このアプローチの実際の長所と短所が何であるかはわかりません。
- Python これを思い出すのは常に悪いことです。私は数年前からPythonを使ってきましたが、Pythonを習得することは決してありませんでした。 インポート動作など、私にとっては暗い森のようなものがたくさんあります。
- ノードJS。 Nodeの起動方法を理解し、fsなどのAPIを使用してツールを構築し、Expressを構成できます。 しかし、Nodeを介してデータベースと通信したことはなく、その中にバックエンドを記述する方法がわかりません。 また、Next、さらに「hello world」などのReactフレームワークにも精通していません。
- ネイティブプラットフォーム。 私はある時点でObjective-Cを学ぼうとしましたが、それは私を助けませんでした。 私も迅速に教えませんでした。 Javaでも同じです。 (C#で作業したので、おそらくそれらを習得できたでしょう。)
- アルゴリズム あなたが私から得る最大のものは、バブルソートであり、せいぜいクイックソートです。 特定の実用的な問題に関連している場合、おそらく単純なグラフトラバーサルタスクを実行できます。 私はO(n)表記を理解していますが、私の理解は「ループをループに入れない」ほど深くはありません。
- 関数型言語。 JavaScriptをカウントしない場合、私は伝統的に機能する言語を話しません。 (私はC#とJavaScriptでのみ自由です-すでに忘れられていたC#。)Lispに触発された(Clojureのような)、Haskellに触発された(Elmのような)、またはMLに触発された(OCamlのような)コードはほとんど読むことができません。
- 機能用語。 マップして削減する必要な量はわかっています。 モノイド、ファンクターなどは知りません...モナドとは何か知っていますが、これは単なる幻想です。
- 最新のCSS。 FlexboxやGridを知りません。 フロートは私のすべてです。
- CSS方法論。 BEM(元のBEMではなくCSSの一部として使用)を使用しましたが、それは私が知っているすべてです。 OOCSSや他の方法論を試したことはありません。
- SCSS / Sass。 私はそれらを研究し始めたことはありません。
- CORS。 これらの間違いが怖い! ヘッダーを調整して修正する必要があることは知っていますが、過去にはこれに多くの時間を費やしていました。
- HTTPS / SSL。 設定しないでください。 秘密鍵と公開鍵のアイデアを除いて、これがどのように機能するのかわかりません。
- GraphQL。 クエリを読むことはできますが、ノードとエッジを使用して物事を表現する方法、フラグメントを使用するタイミング、そこでページネーションがどのように機能するかは本当にわかりません。
- ソケット 私の理解では、要求/応答モデルの外部でコンピューターが相互に通信できるようになっていますが、それは私が知っているすべてです。
- ストリーム。 Rx Observablesを除き、私はスレッドとそれほど密接に連携していません。 古いノードスレッドを1回または2回使用しましたが、処理中に常にエラーが発生しました。
- 電子 試したことがありません。
- TypeScript 私は型の概念を理解しており、注釈を読むことができますが、それを書いたことはありません。 私は何度か試しましたが、困難に遭遇しました。
- 展開とdevops。 FTP経由で複数のファイルを送信したり、一部のプロセスを強制終了したりできますが、これはdevopsのスキルの限界です。
- グラフィックス キャンバス、SVG、WebGL、または低レベルのグラフィックスのいずれであっても、私は賢くありません。 一般的な考えは理解しましたが、簡単なことを学ぶ必要はありません。
もちろん、これは完全なリストではありません。 知らないことがたくさんあります
これについて議論するのは奇妙に思えるかもしれません。 これについて書く価値はありません。 私の無知を誇示していますか? この投稿に対する私の結論は次のとおりです。
- お気に入りの開発者でさえ、あなたが知っている多くのことを知らないかもしれません。
- 知識のレベルに関係なく、自信は大きく異なります。
- 知識のギャップにもかかわらず、経験豊富な開発者は非常に有能です。
私は知識のギャップについて知っています(少なくともそれらのいくつか)。 興味がある場合やプロジェクトに必要な場合は、後で記入できます。
これは私の知識と経験を軽視するものではありません。 私ができることはたくさんあります。 たとえば、必要なときにテクノロジーを勉強する。