11月に読んだ本

OSSのコードを読む時間を増やしたつもりだったけれど意外と3冊くらいは読んでいた。

 

 

Goインタプリタ本の影響で言語処理系への興味が出てきたので、コンパイラについても勉強していきたいと思い読んだ。証明の部分だったりをしっかり追っていたら割と読むのに時間がかかったが、本自体の説明はあっさりしていてコードを追わないと理解は進まない感じがした。コードはPL/0'というPL/0言語を少し変更したもので、これもどこかで別の言語にリプレースしてみたいなと思う。

 

会社に置いてあったので読んだ。「新人に読ませる本!」みたいな感じなのかなと思う。流石にこの辺りの本だとおおよそわかっていることが多くて、多少安心した。

 

低レイヤに降りていくにあたってOSの勉強を進めていきたいと考えていて、OSの軽めの本として読んだ。大まかな内容は基本情報や応用情報でやるような情報と変わらなくて軽く読めた。次はここらへんを読んでいきたいと考えている。

 

 

10月に読んだ本

10月前半は応用情報技術者試験があって、後半は https://github.com/ryo-imai-bit/Writing-An-Interpreter-In-Go-In-OCaml をやっていたので本はあまり読んでいない。

この頃から本を読むより、コードを書いたりコードを読むのが良いのでは?と思い始めてきた。本自体は新しい刺激があるし面白いが、受取り手のレベルによって受け取れるものが限られてしまうので、コードを書き、読むことで実力そのものを上げていきたい。脳に汗を書いていかなければ!

 

一応応用情報の本を読んだ。割と勉強したのに落ちていたら笑う。。。

 

 

 

9月に読んだ本

10月初めに応用情報技術者試験を受けることもあって後半はその勉強をしていて、4冊は読めなかった。

 

 

ソースコードを実行するまでの一つのやり方を学ぶことができた。lexer=>parser=>evaluatorという流れ自体は知っていたが、それがより意味として理解できたと思う。実際のところインタプリタを書くにあたってもバリエーションはもっとあるはずなので、この本でやっていることを再度0から自分で再現できるようになるところまでやりしっかり理解したいなと思った。のでOCamlで実装をしたりもしてみた。 

r-imii.hatenablog.com

この本は、マクロも扱っていてその実装なんかもとても勉強になった。この本きっかけに言語処理系に興味を持つ様になってきた。

 

先にGoインタプリタ本を読んでいたおかげで、多少理解しやすいところがあった。PHPではいろんな型のデータが最終的に同じ構造体で扱われている話などはとても面白かった。またGCなども参照カウントで判断しているのも興味深かった。本自体はPHPがどのように動くのかという話がメインというよりは拡張などを作ってその中で学ぼうという向きが強かった

PHP内部の勉強として、PHP Internal Bookなどを読んでいきたいなと思った。

www.phpinternalsbook.com

8月に読んだ本

 

 

たまたま図書館にあったので読んでみた。業務でPythonは書くけれどPythonの細かい言語の機能みたいなところは全く把握していなかったので勉強になった。デコレーターとかFlaskで出てきた時に雰囲気でしか理解していなかったけれど面白い機能だなと思った。Pythonは構文レベルでの機能が多い割にごちゃごちゃしたコードにならないのは個人的に好きな部分である。

 

この本が今年読んだ本の中でベストだったと思う。

抽象度の高いベストプラクティスを扱っていながらも、内容が古びていないように思った。取り扱っている内容が、よりプログラミングにおける中心的、本質的なことがらをあつかっていて勉強になった。また基本C言語でプログラムが記述されているのでC言語の勉強にもなった。全体として理解しきれないとこもあり、特に9章の「記法」についてはこちらの息切れもあってコードと中身が理解しきれていないのでどこかで再読したい(コードはほとんど終えていない)。9章の内容としては、なにか問題を解決するプログラムを書く際の「記法」に注目して、問題に適した「記法」をもつ言語を選ぶ、もしくはない場合には自分で実装する方法について述べられている。そのなかでコンパイラインタプリタJITなどの話もある。コードをしっかり追っていくと理解がかなり違ったので、他の本でも手元でコードを動かすことを心がけたい。

何か、課題解決であったりコードを書くときにこう考えるといいのだなと言うことが感じ取れたように思う。

 

 

学びが多い本だった。会社での実際の業務、ビジネス側とのコミュニケーションであったりといった部分や他のエンジニアとの関わりの中で活かせそうなことが学べた。ステークホルダーに共感したり、ステークホルダーの目的にそったソフトウェアをつくることがプログラムをつくるうえでの目的であることを割と自分は忘れがちだと思う。もちろん自分もステークホルダーで良いプログラムを書きたいといった目的はあっていいが、それより大きいものがあるはず。

 

 

エンジニアになる前にチラッと読んだことがあったが再読。色々なことをアルゴリズムで説明していくのが面白い。

 

 

 

 

7月に読んだ本

 

この月ぐらいから、重めの、技術について書いている本と、設計哲学だったりノウハウ本みたいな比較的読みやすい本を交互に読むようになった。

 

 

とても良かった。コンピューターという計算機が二進法の計算をしていて、それが積み上がっていくと実際に使っているような応用プログラムになるということ自体は知識としては持っていたが、そこのブラックボックスであった部分が少し理解できるようになった。特に、理論上の計算のモデルというよりも、電子回路で実際の物理世界の法則の中でどのように動かすのかという話が多くて新鮮に感じた。

この本を読んで、一番下の低レイヤの簡易的な構造を見たことで、それ以外のレイヤーのブラックボックスになっている部分の仕組みに興味が出るようになった。

 

 

いくつか哲学が書かれていたが、巷でよく言われているベストプラクティスみたいなものはここから来ているんだなと思った。早く試作品をつくることだったりは実際に意識したい部分である。特に考えすぎて手が動かない時とかは、作って失敗するサイクルを回す方が最終的に良いものができる感覚がある。

 

 

とても良かった。この本を読んで、一言にソフトウェアの文脈で「テスト」としてコードを書いたとしてもいろいろな種類があるんだということを初めて認識した。種類と言っても一般的によく言う開発段階でのテストの種類といったものではなくて、テストを書くとしても意図を意識してテストを書くべきだと思った。テスト駆動開発で書く種類のテストは基本的に「動作チェック」や「振る舞いのチェック」といった「自分の意図しているように動いているか」の確認の意味合いが大きいと思う。また、テストを書くにあたって自分の書くコードの第一の利用者になることから、コードのインターフェイスをまず考えるようになるのも良い習慣につながるのではないかと感じた。

実際に業務でのコードをTDDで書いて見たが、ミスも発見しやすく、良いものができた。TDDのプラクティスを実践する中で得られる習慣みたいなものは個人的にとても役に立っている。

 

一度読んだことがあったが、中身を忘れてしまったのでもう一度読んだ。何か、学習においておおよそのベストプラクティスは決まっている、そして世の中に出回っている気がしていて、自分としては受験勉強等で身につけたやり方でおおよそことがことが足りている様に感じている。書いていることはすごく良くて考え方として勉強にはなるが、特に新鮮なことは書いていないなと感じた。本自体はすごく考え方として勉強にはなるんだけど。

 

本当は「はじめて読む486」の方を読みたかったが、いきなり読むと難しい場合もあるそうなので、こちらを先に読んだ。

とても良かった。「CPUのつくりかた」でCPUが電子回路上でビット列を使い、データ、命令としてどのように実行しているかを理解することができたが、それより高いレベルの話として、実際にCPUでどのような命令が用意されていて、実際にレジスタやメモリへの命令を通してプログラムをどのように動作させるのかがより具体的に理解できたと思う。またCPUのアーキテクチャによって用意されている命令が違い、それが性能の差につながるといったことも理解しやすかった。

 

 

低レイヤについて学ぶと、ブラックボックスがなくなっていく感覚がありとても楽しいのでシステムプログラミングであったり、ネットワークプログラミングにも興味が出てきた。

 

 

OCamlでインタプリタを書いた

成果物

github.com

 

なぜ書いたか

読書記録にはまだ載せていないが10月ごろにGo言語でつくるインタプリタを読んで、使いたくてなかなか使えていないOCamlの練習がてらにOCamlで実装した。

 

書いてみてOCamlの勉強にもなったけれど、どちらかというと本の内容を再咀嚼するのにとても役立った。本のGoのコード自体を一応写経していたけれどOCamlに書き直すタイミングで、「あれ、これなんでこうなってるんだっけ?」というような部分が多々見つかったのでわかったようでわかっていなかった部分が潰せたと思う。特にEvaluatorについては処理のフローがあまり理解できていなかったし、マクロは書き直すまで何もわかっていなかったなと振り返ると思う。

 

github.com

 

OCamlに関しては、OCaml自体が書きやすく、Goの手続的なコードを割とそのまま書けてしまうためか、OCamlらしさのあるコードにはあまりなっていない。特にEvaluatorのところで相互再帰関数が長々と続いているところはかなり読みづらくなっていて、どうにかしたい。パフォーマンス的なこともあまり気にせず書いたこともあり、どこかで大きなリファクタリングはしたい。

OCaml自体は書いていてとても楽しい言語だった。型推論がしっかりしているので、固いコードの割に必要なコード量は少なくて良いし、コンパイラのチェックで全ての型のパターンを処理しなければいけないのもコーディング中に意図がまとまって良い。処理を細かい関数に閉じ込めて責務を分担させるとコード自体も読みやすくなるというのは、他の言語でコードを書いているときにも意識したい発見だった。本当に書きやすいのでちょっとしたCLIとか書くのにも良さそうだと思う。

 

実装を終えた後に、今回のインタプリタで動くMonkey言語の他言語実装を紹介している著者の方のサイトがあり、載せてもらった。

monkeylang.org

 

 

エンジニアを始めてから、社外の人が見るような形でコードのアウトプットをするのがほぼ初めてだったが、コードを書く際の意識も変わってくるので、どんどん外向きのアウトプットをしていきたい。

 

 

6月に読んだ本

半年くらいまた書いてなかったんですが、本自体は読んでいたので書きます。6月は4冊読みました。

 

リーダブルコード

エンジニアを始めたての頃に、一度先輩に勧められて読んだが「何当たり前のことを言ってるんだろう?」と思いピンときていなかったので再読。再読したところ、かなり良かった。当然、当たり前のことが書いてあるけれど、ある程度コードを書いてきたことでその当たり前のことが特に大事だとわかるようになったということだろう。

 

ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本

Twitterなどで議論になっているたびに、概要だけでもDDD理解した方がいいのかなと、内容を軽くさらうために読んだ。本自体はコードも多くて理解しやすかった。ただ、DDDの入門というよりは、モデリングに入門したように感じた。つまり、DDDが結局なんなのかはわからなかった。まあここら辺は元の本を読んだほうがいいんだろうなと。ただモデリング自体の手法も、実際のところよくわかっていなかったので読んだことで学びは多かった。

改訂2版 みんなのGo言語

正直、この本に関してはGoをそれまでに書く量が少なすぎて全く内容が引っ掛からなかった。リファレンス的に今後読み直したりしたい。

 

プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発

TypeScriptの基本的な文法だったり書き方について書かれている部分はすぐ馴染めたけれど、5章、6章以降の発展的な内容が結構難しかった。全体的にリファレンス的な性格があるように思うので、わからないところはサクサク飛ばした。

業務で生のJavaScriptコードを書くことがあるので、早くTypeScriptに乗り換えたい。。ただここら辺のセットアップがめんどくさい。。

 

あとこの本と関連して、TypeScript + Nodeですごく簡易的なCLIも作ってみた。

github.com

ここら辺は、NodeじゃなくてDenoが主流になっていくんだろうなあ。

 

 

ほぼ半年後の今から見ると、かなり雑食的に本を読んでいるなと思った。まあこの辺りはある程度意識的にやっていて、「何がわからないかわからない」状態だと感じていたので多方位に少しずつ入門して、わからないことを増やすのが先決だと考えていた。

学んだこと自体は無駄にはなってないと思うが、実際この方法がベストだったのかは今考えると微妙だなと思う。もう少し一分野を深掘りした方がそこから有機的に知識が広がっていくように今は考えている。