それが僕には楽しかったんです。

ミドルウェアとかやってます

私のコード履歴書

satoru-takeuchi.hatenablog.com
↑この記事が Twitter の TL に流れてたから読んでみたら面白かったのでコードを書き始めた7年前*1から振り返りながら書いてみる。
コードが残っていたりするものは載せていきたい。思い出せる限りなるべく時系列順で書いていく。多少前後する。

  1. 「独学でプログラミングを始めるなら C 言語から」という文言に載せられ Windowsコマンドプロンプト*2で動く簡単のプログラムをいくつか作った。ほとんど入門書の写経 + αだった。例によってポインタがわからず、もっと酷いことに return もわからなくて*3一旦距離を置く。return がわからなかったので関数を使うことを割けていたので全部 main 関数に書いていた気がする。初めて黒い画面にバババーっと文字が出てきたときはめちゃくちゃ楽しかった。
  2. Java とかいう言語を使い始める。クラスとかオブジェクト指向とかよくわからずに GUI アプリケーションを作りまくってた。一番頑張って作ったやつは Java で Swing + awt を使って作ったオセロだと思う。クラスとメソッドの簡単な使い方はここで学んだがインスタンスがわからなかった。何か new したら使えるという認識だった気がする。メソッドはわかったくせにまだ return がわからなかった。Javaによるパスワード自動生成ソフト【サンプル】 - Qiita こんなのも作ってた。この辺であまりに作るものがしょぼすぎてまた飽きてくる。
  3. Twitter で Web デザイナーの人のツイートに触発されてここで急に Web デザインを学び始める。コンパイルとかしてなくてもブラウザ更新すればプログラムが動く!!とめちゃくちゃハマる。 Javascript + Ajax を気合い入れて学ぶ。オライリーの象本とかに手を出しそこでついに(!!) return を理解する。簡単なゲーム、日経ソフトウェアに掲載されていたスネークゲームとかを javascript で書いたりしていた。ザ・ソーシャルネットワークに触発されチャットを作ってみようとして Websocket に手を出すがわからなさ過ぎてまた飽きる。*4 この辺で自作 PC により Ubuntu をインストールした。これからずっと Ubuntu を使っていく。
  4. 動的 Web ページとかいうやつをやろうとして xammp と PHP5.6 で何か作ろうとするが Windows に入れるのに苦戦し、HTTP サーバがわけわからなさすぎて挫折する。
  5. Ruby とかいう簡単な*5言語で TCP を使ったチャットみたいなやつを作ってみるがマルチスレッドで詰んで諦める。
  6. 競プロを始める。レートが導入される前の AtcoderTopcoder, Yukicoder をひたすら Java で解いていた。ここで 2 年ぐらい使う。特にアルゴリズムやデータ構造を勉強しなくても(したくなかった)当時は数学が好きで勉強しまくってたのでなんとか青ぐらいにはなれたけどレートが横ばいになりアルゴリズムの勉強が嫌いすぎてまた飽きる。
  7. 志望していた今の大学に医用画像処理の研究室があると知り Python + OpenCV で画像処理の勉強を始める。モザイクの作り方(指定した範囲のサイズを小さくしてから元の大きさに拡大する)に感動した。OpenCV では簡単にできることが多くてモヤモヤしていたので、競プロのときの経験を活かしてフィルターとかを Python で自作してた。
  8. 画像処理に平行して競プロを再開する。Java8 を使い始めたのでラムダとかで苦戦していた。そのころ JVM 系の言語しかまともに使えなかったので、単一障害点*6みたいで嫌だったので Scala を書き始める。(?) Scala でも画像処理したいなと思って簡単なライブラリを自作した。GitHub - lrf141/ip4s: Image processing simple wrapper for Scala.It is based on Java's ImageIO class.
  9. 大学に入学したが医用画像処理の先生が退官するとのことで目標を失い画像処理に飽きる。なんとなく TwitterAPI 叩きたいなと思って ScalaJava の標準ライブラリのみ*7を駆使して Twitter API ラッパーを書く。GitHub - lrf141/Twitter4S: Twitter4S is a Scala wrapper for the Twitter API. ここで抽象クラスやインターフェースの重要性を理解する。
  10. リーナス・トーヴァルズの自著で OS 自作に興味を持ち 30 日の OS 本や Unix OSコードリーディングを読むが、開発環境が Windows だったり、絶対フロッピーディスクの話から入り USB に触れられていない当時のあるあるが原因で挫折する。
  11. 友達に「インターン紹介してよー」って言ったらプロトコルスタックを作るインターンに叩き落とされ*8で面談時に「ネットワークプログラミングの一貫で、Echoサーバをカーネルモジュールに出来たら面白いよね」と言われたので課題と認識して、Linux カーネルモジュールとして作り始めるGitHub - lrf141/fastest_echo: The fastest echo server to include as a Linux Kernel module kthread だったり kernel_hoge 系、Linux カーネルのコードと格闘しながらなんとか作る。(この時点ではバグあり。)この経験が元で C 言語への苦手意識が薄くなる。
  12. インターン本番で、お師匠(YAMAMOTO Masaya (@pandax381) | Twitter)にしごかれながら DHCP パケットを構築し、プロトコルスタックに組み込む。DHCPクライアント機能を追加 by lrf141 · Pull Request #1 · pandax381/microps · GitHub ここで完全に C やメモリ、アドレス、ポインタに対する苦手意識がなくなり、インターン後に png のヘッダーを解析したりしていた。
  13. フルリモートで Web バックエンドのバイトを始める。このときに Web バックエンドというか PHP が全くわからなかったので、ひたすら簡単な OSS を作りながら勉強していた。GitHub - lrf141/oauth2-mastodon: Mastodon OAuth 2.0 support for the PHP League's OAuth 2.0 Client 開発環境の docker に感動する。docker によってバックエンドに関連するインフラがめちゃくちゃ作りやすくなったので Web バックエンドを勉強しやすくなり サーバクライアントな something に関連する苦手意識が無くなる。 また oauth 周りが特に好きだった。
  14. 別のインターンで、AWS を使ってインフラを構築する。バックエンドがある程度出来るようになったので簡単なアプリケーションを作ってインフラをゴニョゴニョすることにここでハマる。インフラって意外とどうにかなるなと楽しくなる。
  15. バイトでミドルウェアについてしり、camo という画像プロキシの Golang 実装を作る。ここでミドルウェアに興味を持ち Go にハマり、並列並行処理を使ったコードを書きまくる。
  16. 大学のゼミでオンラインジャッジっぽいアプリケーションを Laravel と nodejs で作る。 docker remote api を使った自前 docker コンテナ制御プログラムや、Redis によるクエリキャッシュ, Pub/Sub が楽しくて仕方なかった。
  17. 卒研で Go を使った分散システムに取り組む。 基盤として k8s や OpenStack, OpenNebula の技術検証をしてネットワークが苦手すぎることに気がつく。特にオンプレで HA 構成の k8s を構築するのがつらすぎた。学内ネットワークの仕様が特殊過ぎた。同時にこのへんで Web バックエンドに飽きてくる。
  18. Builderscon 2019でそーだいさんのセッションを聞いて DB って面白いなと思って MySQLオプティマイザについて調べて完全に刺さる。*9そのあとに DBMS を自作することに挑戦したり、MySQL の簡単なストレージエンジンを自作し、MySQL の実装を読みはじめて完全にハマる。ここから DBMS 全般に極振りし始める。MySQL はフェチ。
  19. 卒研でイベント・ドリブンな分散システムを構築する。 Redis の Pub/Sub を使い JobQueue を Golang で作る。ここでミドルウェアに完堕ちする。Redis はフェチ。そして今に至る。


こう見てみると分野が安定せずかなり飽き性なのがわかる。レイヤーもパケットや OS から Web デザインまで総舐めにしてミドルウェアという好きなレイヤーを見つけた。
Web バックエンドにここ二年ぐらいハマっていたけど、基本的なことを学んでアーキテクチャに差し掛かってきたときに退屈になってきてしまった。対象的に Linux Kernel や MySQL の実装を読む、理解するのはかなり大変だけどわからないことがわかることが楽しくて良い。
おわり。

*1:期間としては高校1年から大学4年(現在)まで

*2:この辺実行環境が何だったか怪しい

*3:何が戻るの。これ上から下に流れていると思うんだけど何が上に戻るの?と思っていた。

*4:サーバクライアントという概念がわからなかった

*5:return やポインタで躓いた身として当時恐ろしく簡単に見えた

*6:この単語は今だからこそ出てくる。このときは依存しているぐらいの認識

*7:途中までは外部ライブラリを使っていなかった。縛りプレイで勉強していた。

*8:もちろんいい意味

*9:そーだいさんのセッションで相関サブクエリのスロークエリについての話を実際にやってみたらめちゃ面白かった