つまりどういうことだってばよ
ついに大学院を卒業し、社会人となってしまいました。
やったことの振り返り
けんきう
バチクソ辛かった。
しかしながら3年間の研究生活は有益だった。闇雲にシミュレーションを回し続ける経験を通して「なぜこれがダメなのか」「なぜこう方式を変更するのか」「なぜこの作業をするのか」と考える大切さを知ったし、先行研究と提案方式が酷似しかけてインプットの大切さを理解した*1。
文章の書き方やスライドの作り方もコンマ1フィート理解した。以前もこれらを作成したことはあるが、他の人と一緒に長期間掛けて修正する作業でかなり自分の身になった。
出来の悪い学生に対しても辛抱強く付き合っていただいた教授には深く感謝している。
しうかつ
インタソ
これも辛かった。「インターンの選考に通るのは就活本番の選考よりも難しい」という噂は聞いていたが、事実だった。その上で不採用通知を幾度となく貰うのはキツかった。
また、この時は面接を何も知らなかったため、準備不足が判る回答をしては面接官が呆れ、不合格を確信することが何回もあったし、実際面接が課された選考はすべて落ちた。正直すぐにでもZoomから退室したかった。
結局7か8の企業のインターンの選考を受けて、受かったのは2つ。共に選考がプログラム提出のみのところ。
選考はクソみたいなものだったが、実際のインターンは有意義だった。あまり使うことのなかったサーバサイドやGoやElixerやAWSなどに触れることができて良かった.
本番
実のところこっちはあまり辛くはなかった。インターンの選考における面接の経験が生きたのと、最初の内定をM1の10月とかいうクソ早い時期に貰ったというのが効いた。何遍もESを書くのは面倒だったし、面接直前はやっぱり心拍数が上がったけど、インタソみたいに自己嫌悪に陥ることは多分なかった。
4つ企業を受けて3つ受かった。1つ落ちたのはちょっと残念だが、その理由が会社から丁寧に送られてきて且つ納得できるものだったので、後味は悪くなかった。熟考の末*2、2月末に会社を選択した。
趣味プロとかOSS活動とか
在学中に一番頑張ったのがこれ。全部を挙げるとキリがないので一部だけ。
HIndent
HaskellのフォーマッタはOrmoluが最大手だが、入力ソースコードの改行や空白の位置によってフォーマット後のコードが変化する性質を嫌ってHIndentに固執した。
しかしながらHIndentは元来haskell-src-exts
という、unmaintainedなHaskellソースコードパーサを用いていたため、新しい拡張機能*3に対応していなかった。これを使いたいが、けれどもOrmoluには慣れなかったためGHCのASTを使用するよう自分でコードを書き換えた。結果+6,066 −2,961とかいうクソデカDiffを作成してしまいレビュワーの方には申し訳なかったが、これでHaskellの更新に追いつけるようになった。あとこれやったらCollaboratorとして追加してもらえた。これは非常に嬉しかった。
ただし現在のコードも、フォーマット用の関数がGHCのASTの型を直に使用しているという問題がある。GHCの更新によってASTはほぼ毎回変化する。これにより、複数のバージョンのGHCに対応するため大量のCPPプラグマを用意し、コードのコピペをしなければならない。そしてフォーマットの方法を変更するためにコピペしたすべてのコードを修正しなければならない。そもそもGHCのASTはフォーマット用には作られていない。
これらを解決するために、現在HIndent独自のASTを定義し、それを元にフォーマット用の関数を定義している途中である。
Coqfmt
Coqのフォーマッタはvstyle-toolsという前例があるが、ASTベースではなく、さらに更新が止まっているので、自分で作っている。
しかし意外と大変だった。まずOCamlを学習し、Duneの仕様に困惑し、ASTを取得するのに数日掛け、LtacのASTを取得するのにさらに苦労した。HIndentの時とは大違いだった。
Coqはプラグインシステムを備えているため、完璧なフォーマッタは実装不可能であるが、できるところまでやってみたい。*4
Krita関係
某鳥でみんな絵を描いているので僕も始めたが、宗教上あるいはクリスタがLinuxサポート外なのでKritaを使っている。
んで、Pythonでプラグインが書けるのでGitを動かせるようにしてみたり*5、全レイヤをロックするツールを追加したり*6,どのレイヤが選択範囲の色彩に関わっているか調べるツールを作ったり*7、あと翻訳もやった。
結局スタイラスではなくキーボードとお友達になっているが、気ままにやりたい。
所感
人生
ないなら作れ、あるなら使え。パッチは送れ、バグは直せ。
これに尽きる。フォーマッタにせよなんにせよ、ないなら自分で作るしかないし、あるなら使う。不具合があったり機能に不満があるならばそれを修正なり追加なりして提案する。
寄り道は自分を強くする
上に関連するが、本来の目的から脱線したとしても結局は自分の身になるし、むしろ状況が許すならばそのようにどんどん脱線していくべきだと思った。
実際HIndentをいじくり始めたのも元々はHaskellでゲームを作りたかったからという別の目的があって、それでHIndentを使っていたからだが、ASTやHaskellの知識がかなり増えたし、脱線して正解だった。
時間と金を掛けないと進展は出ない
もちろん時間と金を掛けても進展が出ないこともあるが、そもそも掛けないと全く出ない。
ただし最初からドカンと金を突き出すと事故りやすい。最初は小出しにして、それからドバって出す。
夢は大きく、歩幅は小さく
大きな夢は持つべきだ、それはそれとして「まずはこのプログラムを直す」「この本を読んで学習する」といったように歩幅を小さくしないと夢物語でしかなくなる。
アウトプットよりもインプット
事あるごとに何かプログラムを書いたりPRを送ったりとアウトプットを繰り返す傾向があるので、進んでインプットをしないと知識が陳腐化していきそう。
時短しないといけなくなったと感じたらその時点で詰んでいる
ところでこの記事は卒業式の日に公開しようと思っていたが、その卒業式に向かう電車の中で書いている。
他人が持っていないものを持つよりも、みんなが持っているものを先に入手すべき
逆張りはやめたほうがいい
同上。でもやめる方法がわからんのよなあ。
「自分だけは大丈夫」とは思わないこと
同上。
興味が尽きるのが怖い
つまり、そのうちプログラミング自体に飽きるのではという恐怖がある。11年習ってきたピアノも最近は一ヶ月に何回ピアノに触れるかどうか*8。プログラミングにおいても、自作OSやら競プロやらHaskellやらCoqやらWeb系やらと触れてきたが、一度興味が移ればそれまで熱中していた分野に対する情熱を失ってきた*9。
もしプログラミング自体に興味をなくしてしまったらどうしようか。たんぽぽに刺身を乗せる仕事でも始めようか。
節目を自分で作らなければならない恐ろしさ
幼稚園入園から大学院卒業まで、卒[園業]と入学によって勝手に人生の中で節目がついていたが、これからはそういったものが存在しないので少し恐怖がある。
身体の不具合 and/or 老化にどう対処するか
特に目。今も酷使しているが、将来老眼という悲愴もある。
プログラミング
テストはなるべく書いたほうがいい
テストを書いておけば、放置したプロジェクトにPRが来たり、深夜テンションでコードを弄くり回していても多少は事故を減らせる。
ただ正直テストを十分理解できていない。
- (単体|結合|E2E)テストの違いがわからない
- どの程度の塊のコードからテストすればいいのか理解できていない*10
- モックを使ったテストと実際のDBを使ったテストって重複じゃないか?
- なぜカバレッジ100%を目指してはいけないのか分からない
- そもそも自動テストやTDDだけがテストじゃないよね
んなことを考えたのでテストの本を買ったが、そのあとTDD本の第三部に有益な内容が書かれていたことを思い出し、今読んでいる。
ライブラリとかフレームワークとかと必要以上に結婚しない
これはClean Architecture本が詳しい。HIndentの開発中に実感した。
ただし場合によっては結婚しても良いらしい。プロダクトの寿命が短かったらわざわざラッパを書く必要もなく、逆に長い時はライブラリが寿命を迎えたりフレームワークが離婚を申し立てるかもしれないので、クッションとなるラッパを用意したほうが良いということをどこかで聞いたが、これは妙に納得した。それからGHCのASTのようにライブラリなどが更新の際にバンバン自己変異するようだったら距離を取ったほうが良い。
まとめ
なんだか当たり前のことを書き連ねたけど、結局当たり前の繰り返しということなんだなと思った(小並感)。
将来の展望
仕事はもちろん不安だし、自分で人生を切り拓けるかもわからない。ただ、あまり深く考えすぎても気が重くなるだけだし、ちょっとは楽観的に生きたい。
謝辞
まずは研究室の方々に感謝します。出来の良い人間ではありませんでしたが、皆さんのおかげでなんとかやってこれたと思っています。
研究室以外の方々だと、特に同じ専攻のS.T君、高校同期のI.D君、中高同期のN.K君、小学校以来の付き合いになるN.T君には特に感謝します。それから家族にも感謝します。
これ以外にも2年間という短い期間の中で様々な方にお世話になりました。ありがとうございました。
*1:もっと早く理解すべきだったけど
*2:内定を貰ったあとに「この企業に本当に就職して良いのだろうか」と目黒会に訊いたのが大きかった
*3:例えばOverloadedRecordDot
*4:ところで、現在の証明状態を一緒にAIに食わせれば結構良いフォーマッタができるのではないかという話は興味深いなと思った。
*5:これはあまり出来が良くない
*6:これは結局使っていない
*7:これは重宝している
*8:これで事あるごとにピアノが趣味だと宣言しているのは自分でもどうかと思う
*9:興味が再燃することもあるが
*10:Privateなインターフェースをテストするのではなく、それを使用しているPublicなインターフェースをテストせよというのは理解できるが、ではライブラリではなく単一のアプリケーションを開発している場合はどうなのか?