Overreacted

2018年の段階で私が知らないこと

2018 M12 28 • ☕️ 2 min read

多くの人は、私が実際に持っている知識量より遥かに多くのことを知っていると思い込んでいる。それは悪い事ではないので文句を言っているわけではない。(世の少数派の人達は、努力して資格を得ているにもかかわらず、逆の偏見に苦しめられている。それはイケてない。)

この記事では、私がよく知っていると思われているが実は知らない技術について列挙する。 これは、あなたがこれらの技術を習う必要がないと言っているわけではなく、私が他の膨大な知識を持っていると言っているわけでもない。しかし、私は脆弱な立場にいるわけではないので、正直に言うことができる。

なぜこれが大事と思うかというと、


まず最初に、良い技術者は全ての技術について知っていないといけないと思われている節がある。非現実的だ。数十個のライブラリが列挙されている「技術を取得する為のロードマップ」を見たことがあるか?便利な記事ではあるが、おじけづいてしまうよな。

さらに、どんなに経験を経ても、自分に自信がある時があれば、自信が持てなかったり(インポスター症候群)、自信過剰になってしまったり(ダニング=クルーガー効果)を行ったり来たりしてしまうものだ。これらは環境、仕事、人柄、同僚、精神状態、時間等、様々な要因に左右されてしまう。

経験のある技術者はそういった自身の不安をおおっぴらにすることで、初心者を勇気づけたりする。しかし、熟達しても不安を感じる外科医とメスを初めて触る人には天と地との差がある。

明らかに知識の差がある状態で「我々はみんな初心者だよ」と聞くのは時に空っぽに聞こえたりしてしまう。私が善意をもって励まそうとしても逆効果になったりするものだ。

それでもなお、経験者でさえ知識の差は多く存在する。この記事は私が持っている知識についてだ。そして、似たような立場にいる他の人もぜひ公開してみてほしい。しかし、自身の経験を軽んじるのはやめよう。

我々は知識の差を公表することができる。偽物と感じたり感じなかったりするかもしれない。それでも数年かけて得た知識や経験を活かすことができる。


前置きが終わったところで、これらが今、私が知らないことだ。

  • Unix コマンドと Bash lscd は知ってる。 でも他のコマンドは毎回調べる。Pipe がどういうものかはわかるが、簡単なケースにしか使ったことない。 xargs を使った複雑な連携のしかたは知らないし、それを使ってoutput streamを分ける方法もわからない。 Bashもまともに習ったことはないから単純(かつバグがある)シェルスクリプトしか書けない。

  • 低レベル言語 アセンブリによってメモリにいろいろ保存したり別の行にジャンプしたりできるのは知ってる。そのくらいだ。C言語は少し触ったからポインタがなにかは知っているが、 malloc の使い方はわからない。 Rustは触ったことがない。

  • ネットワーク知識 パソコンにIPアドレスが配られることや、DNSによってホスト名を解決してることはしってる。TCP/IPの様な低レベルプロトコルによって(たぶん)整合性の取れたパケット交換が行えることはしってる。それだけ - 詳細については曖昧だ。

  • コンテナ Docker も Kubernetes も全くわからない。(この2つって関係してる?) なんとなく、別のVMを立ち上げて決められた様に起動してるものだと思っている。響きは良いが使ったことはない。

  • サーバレス これも響きがクールだ。使ったことはない。サーバレスによってバックエンド開発がどう変わっていくかも良くわからない(変わっていくのだとしたら)。

  • マイクロサービス 私の理解が正しいのなら、これは「複数のAPIエンドポイントが連携しあっている」ということ。それがどういった利点や欠点を持つのかまでは使ったことがないので知らない。

  • Python これについては申し訳なく感じる — 数年間 Python を使っていた時期はあるがまともに習ったことはない。importの動作など、知らないことはたくさんある。

  • Node を使ったバックエンド開発 Node の起動方法はしってる。ビルドツールの作成にfsを使ったことはある。Expressの設定もできる。しかし、NodeからDBを触ったことはないし、バックエンド開発をしたこともない。Next の様な React をつかったフレームワークも “Hello world” 以上のことは知らない。

  • ネイティブ開発 一時期 Objective C を習おうとしたことはあるが、うまく行かなかった。 Swift も触ったことない。Java も同じだ。(C# の経験はあるのでこっちはやろうと思えばできそう)

  • アルゴリズム 調子がいい日ならバブルソート、もしかしたらクイックソートも書けるかもしれない。何か現実的な問題に繋がっていたらグラフ遷移もできるだろう。O(n) 記法についてはわかるが、私の理解は「ループの中でループするな」くらいだ。

  • 関数型言語 JavaScript をカウントして良いならそれなら書ける。 従来の関数型言語はどれも知らない。 (私が書ける言語は C# と JavaScript くらい。 C# もほとんど忘れた。) LISPライクな言語 (Clojureとか)、 Haskellライクな言語 (Elmとか), MLライクな言語 (OCamlとか) で書かれたコードはどれも読むのが難しい.

  • 関数型の用語 Map と reduce くらいしかしらない。 monoids も functors もしらない。 monad が何かは知っているつもりだが幻想かもしれない。

  • モダンCSS Flexbox も Grid も知らない。 Float最高。

  • CSS設計 BEMメソッドは使ったことがある (CSSの部分だけ。元のBEMではない)。それくらいしかしらない。OOCSS や他の設計メソッドは使ったことがない。

  • SCSS / Sass. 習う機会がなかった。

  • CORS CORSのエラーは大の苦手だ! ヘッダーを設けて直すことは知ってるが、これの対応に何時間も時間を無駄にした。

  • HTTPS / SSL. セットアップしたことがない。秘密鍵と公開鍵が存在する以上の仕組みは知らない。

  • GraphQL. Query の読み方は知ってるが node や edge を使って何かを表す方法は知らないし、 fragment をいつ使えばいいかも知らない。paginationがどういった仕組みなのかもわからない。

  • Sockets 私の中では Socket は request/response モデルの外で連携を行っているもの、ということくらいしか知らない。

  • Streams Rx Observables 以外では streams を深く活用したことがない。昔の Node streams を1,2回触ったことはあるが、毎回エラーハンドリングが狂う。

  • Electron 使ったことない。

  • TypeScript 型の概念は理解しているし、読み方もわかるが、実際に書いたことはない。何回か試したが、その度壁にぶち当たった。

  • デプロイ と devops. FTP を通してファイルを送ったり、プロセスを kill することはできるが、私の devops スキルはそのくらいだ。

  • グラフィクス canvas も SVG も WebGL も low-level graphics も、どれも効率的に使ったことはない。概念はわかるが基礎から知らないといけない。

もちろん、これで全部ではない。私が知らないことはまだまだたくさんある。


変な議題だったかもしれない。書くことに違和感すら感じた。無知を自慢しているのか? 私が読者にこの記事から受け取ってほしいことはこれだ。

  • あなたが尊敬している技術者でも知らないことはたくさんある。あなたが知っていることでも。

  • どれだけ知識がある人でも自信の幅は揺れ動く

  • 技術者は知識の差があってもその人の価値がある

私は私が知らないことを知っている(少なくとも、一部はね)。プロジェクトで必要になったり、個人的に気になったりしたら取得することはできる。

これは私の知識や経験の価値を下げたりしない。私は他にいろんなことができる。例えば、必要なときに新しい技術を習えるとか。

追記: 私が知っていることの一部も記事にした