ユユユユユ

webエンジニアです

CS:APP を読みはじめる

 Computer Systems: A Programmer's Perspective の日本語訳、『コンピュータ・システム — プログラマの視点から』を購入した。通称は CS:APP というらしい。

 値段、重量、厚みすべてにおいてヘビー級の一冊である。16000円だった。消費税で本が一冊買える。

f:id:jnsato:20210508093302j:plain

 しかしこうやって専門書を買う選択肢を持てるのが社会人のいいところであるよ、と感慨をもつ。しょっちゅうこんな買い物をしたいとはさすがに思わないが、必要を吟味していよいよ心を決めたときには、資本主義的自由の味がした。

 情報処理学会の監修というから内容には全幅の信頼がおける。丸善出版というのもいい。この出版社の専門書を買うのは Effective C++ を読んだとき以来となるが、これもいい本であったのを懐かしく思い出している。

 英語版にトライすることも検討した。しかしいずれ値段は大きく変わらないこと、加えてその厚み(日本語ですら800ページ超!)をおもうと、いよいよ英語では一年かけてなお通読できるかどうか自信がなかった。とはいえ結局のところ、学会の監修がついているという信頼がここでも効いてくる。翻訳のクオリティが最低であるということはまずないだろう、と安心して訳書を選ぶことができた。

 これも teachyourselfcs.com の推薦である。職業プログラマがコンピュータ・アーキテクチャを学びはじめるのにうってつけの一冊とのことである。

 これだけのボリュームを読み通して、やっとスタート地点に立てるようになる、というような紹介のされ方であった。「これさえ読めば」式の宣伝文よりはよほど誠実な推薦だとおもう。真実を言っているな、という確信がある。これを推薦してくれる人たちと、これを訳してくれたアカデミズムの人たちの助力のもとに、僕はまだまだ進歩できるという前向きな気持ちで取り組んでいこうとおもう。

Designing Data-Intensive Applications を読み終わった

 昨年末に着手して、足掛け5ヶ月で読了した。

f:id:jnsato:20210505085518j:plain

 5ヶ月というとあまりに時間がかかりすぎているように聞こえる。実際には年末年始とこの GW で集中的に読んだ。しかも、後者の連休ではメモを取りながら読み進めることをやめて、読み終えることそのものを目標化して無理やり終わらせたきらいさえあるので、時間を尺度とすることには(そうでなくても意味はないが)ここではあまり意味はない。

 分散システムにおけるデータの流れにフォーカスした著作である。どの章をとっても含蓄ある文章しかないので、要約するには僕の手に余る。無理に一般化して語るよりも、序説を概観した5ヶ月前のエントリをみてもらうほうが話は早そうである。

 それから、いくつかのチャプターについては個別のエントリとして要約をポストしている。

12の章立てのうち3章のみかいつまんだ形である。もちろんこれらのほかの章もとても興味深い話のオンパレードである。本当はすべてを紹介したい、なんなら理解を含める目的で私家版の翻訳すら作成してもよい、というくらいに全編にわたって秀でた情報量をほこっているが、そうまではしなかった。

「なんとなく聞いたことがあるようで、実はよくわかっていない」というあたりの知識領域を包括的に扱って、体系的な知識としてまとめてくれている稀有な本である。僕にとってはデータベースのインデックスアルゴリズムがそうで、ここで B-tree が何者であるのかわかったし、 LSM-tree という新しいデータ構造も知ることができた。

 第二部 "Distributed Data" では分散データベースの設計・運用上のプロ・コンおよび落とし穴がこれでもかとカタログ化されていて、大規模分散データベースなんて人類には早すぎるのではないか...と暗澹たる気分になかばされつつも、これを読んだおかげでどれだけの新しい視点を得られたかとおもうとずいぶん成長した気がしている。

 末尾を飾る第三部も、つい先ほどまで読んでいたこともあるものの、忘れがたい視点であることは疑いない。とりわけ、非同期のイベントによって派生データを適切に制御するという案件をちょうど業務で扱っているところであったので、示唆を与えられるパッセージはあまりにも多かった。それがいかに難しいトピックであるかを痛いほど知ることになり、これらの知見を持たないまま進めてしまっていたらどうなってしまっていたかをおもうとゾッとする。もっとも、これらを知った上でなお難しい問題であることには変わりがないのだが、学んだことをただちに活かせるかもしれないというのは幸せなことである。

 読み始めたときのエントリで、本書が teachyourselfcs.com で強く推薦されていたことを紹介した。それに加えて、ハッカーニュースで見かけた フェイスブックの面接対策の記事 でもやっぱり本書が紹介されていた。いわく、上級エンジニア面接ではコーディング試験と同じくらいかそれ以上にシステム設計の知識が求められ、それの足掛かりとするのにちょうどいい本であるそう。僕自身はいまのところビックテック企業の規模のプロジェクトを遂行するような経験はまだないけれど、そうしたレベルを求める人々にとってさえもこの本が有用なリソースであるというのは心強く感じる。つまり、それだけ信頼のおける本であるということ。

 反省点としては、ノートのとり方が非常に乱暴だったところか。重要そうな箇所を適当にピックアップして入念に整理することができず、「やたらにひたすらメモをとる」か「ほとんどメモもとらずに読みすすむ」のいずれかに陥りがちであった。これは仕方のないところもあるとおもう。というのは、前提知識の弱さから、書かれてあることすべてが真新しいパースペクティブと映りがちであったため、「重要でないところを読み飛ばす」ということが原理上不可能であったためである。いちどザッと通読してから、重要なところをインデックスしていく戦略で読んでおけば、より効率的にインプットできたかもしれないが、その読み方ではいま受けているほどの感銘は受けなかったかもしれない。いずれにせよ、高い確率で向こう数年中に再読する予感はあるため、なにも悲観すべきことはない。

 英語で通読することができたことも誇らしくおもう。日本語と同等の速度で読み進めることはできないが、そのぶんだけ丁寧に読み進められた。スルスルと読んでいるつもりが、ある箇所で突然読めなくなることがあった。そういうときは、それまでスルスルと読んできた前提を正しく読めていなかったというだけにすぎない。実際、すこし前に戻って読みなおすだけで、たいていの難所は突破できる。この点、日本語で読んでいると、わからないことを翻訳のせいにして放置してしまうところがある。まあ、実際に翻訳が悪いこともあるとはおもうが、せっかくいいことが書いてあっても正しく読めないのは申し訳がない。結局のところ、原典にあたるというのはどこまでいっても有効であるという思いを深めている。

放送大学に入学してみよう

 連休の終わりに、大学にいこうかな? とカジュアルに思いついたのが昨日のこと。それからいちにち考えてみて、基礎的なことを体系的に「お勉強」するのなら放送大学教養学部に入るのがうってつけという結論にいきついた。教養学部というから、学部1-2年生の気分で自由に学問ができるイメージでいる。

 モチベーションの管理が厳しいという独学特有の問題も放送大学にはつきまとうようだが、まあいままでもそうやって独学してきたのだから、これはなんとでもなる自信はある。仕事を辞めて4年生大学に編入するくらいの覚悟さえ持つほど思いつめかねなかったところ、二足のわらじになるとはいえ仕事と両立させられるパスがあるのは嬉しいことこの上ない。

 ここで微積線形代数、解析なんかを1年かけてじっくりお勉強しようという気持ちが育っている。そのさきでなにをしたいかはわからない。なぜならまだ知らないことが多すぎて、自分にどんな可能性があるのかすらわかっていないのだ。ただ、少なくともここでの学びの先に新しいパースペクティブが広がっているだろうという昂揚感はたしかにある。導入科目群をきちんと追えられたら、物理ほか自然科学の世界にもそのままアクセスできそうだったり、はたまた芸術と哲学の方面に趣味の勉強の食指を伸ばしてもいいわけだ。まさに新大学生のようにワクワクしている。そしてこうしてワクワクできる対象があることこそ、暗い世界にあって何より幸せなことだとおもう。

 大学であるので、入学時期は4月と10月に限られている。そしていまちょうど5月がはじまったところである。10月入学が許可されるという新しい文化に感謝しつつも、あと半年弱は手も足もでない。ただ入学の準備をするだけである。まあとりあえずということで、資料は請求してある。そしてもう数ヶ月はいままで通りの独学に集中しよう。厚めの専門書をもう一冊読むくらいの時間はあがなえる。

 以下は補足として、「放送大学とはこういうものか」という見取り図を与えてくれたのはこちらの記事。とりわけ後者の講義レビューは履修イメージも含めてなんとなくの手触りをえた。これだけのことができるなら十分満足できるだろうとおもうことができた。

 それから、「社会人の学び直し」という観点ではこれらのエントリも拝見させていただいた。年齢がひとまわり離れていたり、子供も配偶者もいない気楽さもこちらにはあるけれど、だからこそいまいっそう頑張るぞと熱い気持ちは与えられている。

 上のエントリはいずれも学位取得をゴールにおいていたが、僕はあくまで学位は追いかけない。別にすぐに学士が欲しいわけでないし、必要になれば取りにいけばいいというだけの単純な皮算用である。海外の修士コースで勉強するという選択肢もあるようだし、いろんな選択肢があることをありがたく思う。あくまでこの先の僕自身が自分から何を引き出せるかによって道は変わるはずだから、まずは地に足をつけて知るべきことを知るべしというスタンスでいる。

大学にいこうかな?

 世界がいまより平和になったらやりたいことがある。それはそうとして、いますべきことはなにか?

 大学にはいりなおすということを考えたことがある。ベルリンから帰国して、途方にくれながら次になにをしようか考えていた頃のことである。直接的な刺激になったのはこの記事だったかとおもう。

僕の会社のとあるプロジェクトで、スケジュール管理を扱う新サービスの検討が始まったとき、CTOを含む複数のエンジニアが即座にホワイトボードでアルゴリズムの議論を始めました。スケジュール管理は複雑な組み合わせ問題になることが多く、また我々が考えていたシステムが少し特殊な制約を持っていたので、計算結果の単純なキャッシュがしづらい難問であることは明白でした。 複雑な現実課題を解決するソリューションには、ありもののライブラリやフレームワークなどというものは存在しません。それぞれが自分の中に持った基礎的な道具を持ち寄って、その場でしか使えない「特別な鍵」を作り出す必要があります。基礎力のない応用はありえないのです。

「ありもののライブラリやフレームワーク」を使うのが仕事であると言わざるをえない自分自身の無力と向き合っていた時期であったので、とかく深く心に刺さったのだとおもう。

 その後、 Nand2Tetris とか DDIA を読んだり、競技プログラミングもたしなむようになり、いくらか視野は広がった。しかし一年でこれしか進歩していないとおもうと、もっと頑張れるはずとも思っている。

 仕事では「ありもののライブラリやフレームワーク」を使った仕事をあいかわらずやっているわけで、そこに物足りなさを感じる瞬間がないとはいえない。とはいえ霞を食べながら勉強するだけの覚悟はなかったわけで、そこを嘆いても仕方がない。

 こうして言い訳めいた言葉が出てくるということ自体からして、勉強がしたいという熱情は否定しがたいのだとおもう。知識に投資するのであれば早いに越したことがないのは真理である。

 もう少しお金がたまったら...とか、先延ばしにする理由づけには事欠かないのだが、それではいけないだろうと自分を戒める。大学に再入学するプランを立ててみよう。実際に入学に漕ぎつけられるかどうかは別として(入試をパスできるかどうかすらもわからないのだし!)、どうやって学校選びをして、どうやってその後の進路をデザインするか、まで考えてみよう。考えるだけなら無料であるわけだし、それによってやることがはっきりすれば、いまなにを勉強すべきなのかもよりクリアにみえ始めるはず。

世界に

 世界中を見てまわりたい。一年とすこし前まで、事実そういう生活をしていたことがすっかり遠い過去のことに思える。

f:id:jnsato:20210504171742j:plain
部屋からちょっと歩くだけでこんな名跡を眺められるなんて夢のようだった

 ベルリンにいた僕は COVID-19 がヤバイと聞いて早めに撤退したのだった。あとになってこれは英断だったとよく褒められるし、事実これ以外ありえない決断だったと評価している。とはいえ、ここまでひどいことになるとは思っていなかった。しばらく落ち着いたらふたたび繰り出そうと思っていたところ、国外どころか狭い狭い家の外にすら出られない生活で息がつまりそうだ。

 世界のほんの片隅しか知らない。そうと知りながら、その片隅でぼんやり暮らすのは苦しい。広い世界があると知っているのに、そんなものなどないというふりをして生きていきたくはないし、もっとアクティブに世界を飛び回りたい。それができる職業についているのは幸運である。世界が安全といえるようになったら、いつでもその生活に舵を切れるように準備だけはしておきたい。

 そういう熱い気持ちのことを、このエッセイを読んで思い出したので、忘れないように書いておく。

プログラマが変わっていると思うのは、遠隔地や旅行中でも容易にできる仕事でありながらみんなそうしないということだ。もちろん例外はあるだろうけど、この旅行中に同じようなことをしているプログラマには一度も出会わなかった。残念なことだと思う。プログラマ仲間への僕のメッセージは、言い訳するのをやめて実行しようよ、ということだ。人生一度しかないんだから。素晴らしい体験になるだろうことだけは請け合える。

会社員は会議がおおい

 新入社員になってきょうで丸3ヶ月となる。入社の折に書いたエントリを読み返すと、かなり肩に力がはいってしまっていたことがわかる。よほど自己肯定感が低かったとみえるが、実際働きはじめてみると、まったく問題なく戦力となれている実感があるし、自信を折られて萎縮することなどはまったくない。尊敬に値するチームメイトと一緒にいても、自分には自分の強みと特性があるからと、力強く振る舞えているように思う。

 手を動かして開発をする時間は以前よりもすこし減っている。「すこし」とぼんやりと書いたところで、そういえば rescuetime で活動時間のログをとっていたのだと思い出し、集計してみた。

 それがこれである。ざっくりいうとエディタとか GitHub を触っている時間が development で、ビデオ会議とか Slack をしている時間が communication である。開発時間が減少傾向にあるのは事実のようだが、それよりも目を引くのはコミュニケーションに割かれるようになった時間の急激な増加である。

f:id:jnsato:20210430102714p:plain

 すべての会議がただちに無駄とは言わない。以前の職場においてコミュニケーションが少なすぎた、ということも言えるだろう。設計を議論するなどの健全で生産的な会話は前の職場よりも増えているし、それは嬉しく思う。

 ただ、一日の半分がミーティングで埋め尽くされているカレンダーを眺めたりすると「本当にこれがあるべき姿なのか?」とうなだれてしまうのもまた事実である。それが求められる職務であるといえばそれまでなのだが、さみしい気持ちにはなる。

 この3ヶ月は手探りの期間だったので、よくわからない会議にとりあえず呼ばれて置き物になる、みたいなムーブもあったように思う。そしてそのために集中力が散漫になっている直感があったが、この直感は正しかったようだ。

 会議に出るか出ないかは自分で決める、という線で振るまってみよう。それが波風をたてる職場であるとは思わないし、それによって仕事が進まなくなるというのなら、それはおかしくないか? と問題提起しよう。実際、3ヶ月前まではいまの半分未満のコミュニケーション時間で済んでいたのだから、できないことはないはず。

AtCoder のレートが緑色になった

 週末の ABC199 で緑コーダーになれた。29回目のコンテストでの昇格である。

 茶色に昇級したときのエントリを読み返した。これが去年の9月半ばのことであるから、緑色に到達するまでに要したのは7ヶ月ということになる。

 正直に告白すると、この期間アルゴリズムの学習はほとんどしていない。過去問を解くこともほとんどできていない。それに割くだけの時間が作れないのである。ただコンテストにだけは愚直に参加し続けている。毎週末の2時間に集中して解く。解けなかったものはその場で復習して寝る。そういうルーティン化された毎週を送っていただけであるので、昇級したという感慨は思いのほか小さい。

 週末のコンテストにしても、解ける問題を速解きした結果、たまたま高いパフォーマンスが出てしまっただけであって、どうも棚ぼた感はある。たまたま転がり込んできた結果でしかないので、またすぐに陥落するのではないかと思うと無邪気に喜ぶことはできない。

 まあ、およそこのあたりのレーティング帯で長く推移しているので、これが正しく自分の実力というものを表しているのだろう。きちんと勉強と精進を積めばもうすこし成長できると思いつつ、緑色並の実力という自画像に納得してしまっているところもある。もっと高いレベルに立つとなにが見えてくるのかに興味はあるが、あいにくもっと興味のあることが他にある、ともいえる。

 よって、次の目標として水色を目指すと言うことはできない。レーティング1000を目指すともあまり表明する気にならない。いま持てる実力より高い目標を立てても、それに邁進するだけのリソースがないのである。できない目標を掲げることになってしまえば、 atcoder と言うゲームそのものがつまらなくなってしまう。

 そこで僕は目標として、次回からも変わらずコンテストに参加し続けることを目標にしたい。あるいはふたたび茶色に陥落することも十分にありえるが、それでもめげずに毎週2時間だけはこれに集中しきりたい。運動の習慣と同じようなもので、週に1度だけでもしっかり集中してセットをこなすことで、すこしずつ成長できるはず。すくなくとも衰微を遅らせることだけはできるだろう。

 自分が特別な才能の持ち主ではないということを教えてくれたことについて、 AtCoder には感謝しきれない。正直にいって、もっとチョロいゲームだと思っていた。しかし茶色レーティングではやくも足踏みを食らわされたことで、自分がいかに凡庸であるかを知ることができた。もちろんその事実と向き合い、受け入れることには痛みを伴ったし、おおきな時間もかかった。でも最終的にはこの試練を通して、僕はつまらない自尊心を克服して、小さな人間として一皮むけることができたと思っている。そしてそれはプログラミングスキルよりもずっとおおきな収穫だ。

 いまからトップティアを目指すわけでもあるまいし、競争的結果に一喜一憂するよりも、生涯のアマチュアとして、楽しく参加すること。そうして人生を豊かにすること。それくらいの気持ちで細々と付き合っていくことができればじゅうぶん幸せといえるだろう。将棋や囲碁の愛好者がいるように、僕は競技プログラミングの愛好者として楽しむ。いまはそれでいいと思っている。