2019年の段階で私が知らないこと
この記事を真似して書いてみた。
(2019年末に出すつもりだったけどいつの間にか2020年だった。)
2019年の段階で私が知らないこと
プログラミング言語
「少しでも知っている = AtCoderで簡単な問題を解くことができる」と乱暴に定義させてもらうと、少しでも知っている言語は以下の通り。
- Ruby
- PHP
- Python
- Java
- Kotlin
- Go
- Rust
- Haskell
- Javascript
いくつか挙げたけど正直これらの言語について「わかってる」という感覚はほとんどない。文法がわかる、くらい感覚。言語特有の機能が使えてる訳でもないし、エコシステムについてもほとんど知らない。
上記以外の言語については文字通り何もわからない。
オブジェクト指向
最初に触れた言語がJavaだったのでJavaでのオブジェクト指向には触れたことがある気がするけど、たぶんよくわかってない。意識的に勉強したことはない。
関数型言語
一応Haskellに触れたことがある。他の言語でも使われるような関数型っぽい機能や概念がなんとなくわかるようになった。例えばパターンマッチとか高階関数とかカリー化とか部分適用とか、もっと細かい部分だと畳み込みとかもそうかもしれない。
でもファンクタ、アプリカティブ、モナドなどの重要な概念はよくわからないので実質なにもわからない。
Ruby
AtCoderをやるために必要な知識しか知らない。ひととおりの文法や制御構文と、いくつかの便利なメソッドくらい。オブジェクト指向的な要素についてはほとんど知らないし、メタプロとかは何もわからない。
ついこの間、Rubyでもカリー化ができることを知った。
Rails
Railsでサービスをゼロから書いた経験は一回しかない。それもサンプルに毛が生えた程度のものだし、実質なにも知らないに等しい。
PHP
PHP5(マイナーが何だったかは忘れた)をPHP7にバージョンアップするプロジェクトに参加した時に得た知識以上のものはない。Laravelは使ったことがない。
Go
Go言語でつくるインタプリタを読んで、ミニ言語のインタープリタを実装した時に得た知識以上のものはない。 並行処理についてはよくわかってない。goroutineとかchannelを使ったコードを自分で書いたことはない。
Java
ある程度書ける自信はあるけどJava8までの知識で止まってる。オブジェクト指向をバリバリ駆使したコードはおそらく書けない。
JVMやGCについてもよくわかってない。
デザインパターン
言葉としては知ってるものがいくつかあるけど、意識せずともそうなっていたものを除けば、デザインパターンに則った実装をした経験はほぼない。
型システム
型を使ったプログラミングはできるし型があると便利なのはわかる。でも型システムについてはなにも知らない。
わかりたいと思って「型システム入門 プログラミング言語と型の理論」をウィッシュリストに入れてから1年が経とうとしてる。
言語処理系
Go言語でつくるインタプリタを読んだ以上の知識はほとんどない。
この本を通して原始的な字句解析器、構文解析器、評価器はひととおり実装して、その知識でMarkdownのパーサーを書いてみたりはした。でも各ステージの詳細な知識や発展的な内容はなにも知らない。
パーサジェネレータは使ったことがない。
セルフホストできるコンパイラをGo言語で書こうと思ったけど、まだ着手できていない。
Webフロントエンド
ReactとかVue.jsみたいなクールで流行ってそうなものはなにもわからない。触る機会もない(現時点ではそんなに興味もない)。
Javascript
たぶん前時代的で稚拙なJavascriptは書ける。ボタンをクリックしたら何かするとかそういうやつ。でもプロトタイプとかよくわからないし、ESなんとかみたいなのもよく知らない。
AltJSと呼ばれるようなものがいくつかあるのは知ってるけど書いたことはない。
CSS
セレクタを指定してスタイルを当てることはできる。でもたぶん正しい形では行えていないしレイアウトとかはテキトーにしかできない。Sassとかはなにも知らない。
アルゴリズム
競技プログラミングに頻出の初歩的なアルゴリズムしか知らない。グラフ系はなにも知らない。計算量はなんとなくわかる気でいる(時間計算量のほうは)。
データ構造
プログラミング言語に標準で用意されているような初歩的なデータ構造しか知らないし、たぶんそれもあまり多くは知らない。木構造は二分木くらいしか知らない。
Linux
使うことはあるけどなにもわからない。
サーバ/インフラ
避けて通ってきたのでなにもわからない。
Docker/k8s
業務で使っているけどただ使っているだけ以上の知識はない。特にKubernetesはなにもわからない。
サーバレス
なにもわからない。
マイクロサービス
小さいサービスに分割して協調させることでひとつの大きなサービスとして振舞わせる手法?みたいなことしか知らない。実質なにもわからない。
Webアプリケーションのアーキテクチャ
ほとんどなにもわからない。
モバイル開発
なにもわからない。
ネットワーク
OSI参照モデルとかがあるのは知ってる。具体的にどのようにネットワークが動いているのかなんで繋がるのかはよくわかってない。それ以外もたぶんなにもわかってない。
データベース
SQL ServerとMySQLとPostgreSQLは触ったことがある。触って使ったことがある、以上のことは言えない。
インデックスにB-treeが使われてるらしいことは聞いたことがあるけど、具体的にどう使われてるかぼんやりとしか想像できない。
クエリはある程度書けるつもりだったけど、冷静に考えたらwindow関数なんかは使ったことがない。正規化についてもふわっとしか知らない。
NoSQLは使ったことがない。
セキュリティ
パスワードは長いほうが強いとかそういうレベルの知識と、Webアプリケーションにおける典型的な脆弱性とそれの対策をいくつか知ってるだけであとはなにも知らない。
設計
ひとくくりにできるものじゃないけど、任意の設計についてまともな経験がない。
機械学習
なにもわからない。
デザイン
なにもわからない。
英語
できない。
リーディングはツールを駆使すればある程度は、スピーキングは相槌を打てるくらい、ライティングはたぶんできない。むかしOmegleというチャットで遊んでいた頃が一番英語を書けた。
ここに書いていないこと
ここに書いていないことは全部知っている。
嘘です。何がわからないのかもわかってない。
まとめ
「まったくわからない」と雑に書いたところも、実際にはほんの少しだけわかってる部分もあるだろうけど、自分の中では「まったくわからない」レベルと同じなのでそう書いた。
「知らないこと」を書いてると、いやでもここまでは知ってるんですよというエクスキューズを入れたくなってしまう。実際入れてる箇所もある。
「それについて知ってる/わかってる」と言えるレベルは人それぞれだと思うけど、自分の場合はどれくらいかなというのがだいたいわかった気がする。 その上で、まじでわからないことばかりだなあってことがわかった。自分の中で相対的にわかっていることでも絶対的な尺度だと雰囲気レベルでしかわかっていない。
2020年はちょっとずつわかっていきたい。