『コーディングを支える技術――成り立ちから学ぶプログラミング作法』を読了しました
はじめに
先日7月1日から、プログラマーとして生を受けて、就業しているのですが、まだまだペーペーのペーなので、おすすめされた本を片っ端から読んでいきたいと思っております(そんなに読むのが早い方じゃないので、時間がかかってしまうと思いますが・・・)。
そこで、「どうしてこの構文が生まれたか、などの背景が分かるようになるので、おすすめです」とおすすめいただいたのが、本書でした。
読んだ感想・学んだことをまとめていきたいと思います。
本書の章立て
第1章 言語を深く効率的に学ぶには
第2章 プログラミング言語を俯瞰する
第3章 文法の誕生
第4章 処理の流れのコントロール
第5章 関数
第6章 エラー処理
第7章 名前とスコープ
第8章 型
第9章 コンテナと文字列
第10章 並行処理
第11章 オブジェクトとクラス
第12章 継承によるコードの再利用
章ごとの感想
第1章 言語を深く効率的に学ぶには
本書の導入部分です。
特に印象に残った部分が「言語に依存しない、普遍的な理解力を養う」という内容でした。
そのような理解力を養うためには
- 比較から学ぶ
- 歴史から学ぶ
- 作ることで学ぶ
ということが必要だと述べられています。
複数の言語を比較したり、その言語の設計思想や歴史を把握することで、新しく言語を習得するとき、その言語を理解するための素地が備わっている状態になり、結果として習得が早いということだと思います。
私はRubyとJavaScriptしか学んだことがないので、あまり実感はできないところなのですが、確かに、技術の背景を学ぶことで、その技術の理解がしやすくなるという経験があるので、上記の学び方は実践していきたいと思いました。
第2章 プログラミング言語を俯瞰する
プログラミングがなぜ生まれたのかというお話でした。
プログラミングは何かの作業などを楽にするために書くもの。その言語が何を楽にしたいかを把握することで、言語の概観も掴みやすくなるということでした。これにもとても納得です。
第3章 文法の誕生
文法の歴史のお話でした。
今まで、「構文木」という言葉を度々聞く機会があったのですが、「結局、構文木ってなんなのだろう?」という状態でした。
本書を読んで、構文木というものがなんなのかわかったような気がします。
つまり、プログラミング処理をそのまま木構造で表したもので、処理を最小単位に分けて、後に後に処理をはめ込んでいくことで、出来上がっていく木の根っこのような構造が構文木なのかなーと理解しました。
第4章 処理の流れのコントロール
なぜ、if...else
やwhile
などが生まれたのかというお話でした。
結論としては読みやすさのためだそうです。プログラムに頻出のパターンを読みやすい構文にすることで、より生産的にプログラミングができるということです。
自分はまだ経験がないので、「読みにくいなー」というコードにあまり出会ったことがないのですが、本書以外でも『リーダブルコード』などでもコードの読みやすさが重要視されていたため、改めて可読性は大事なことなのだと認識しました。
第5章 関数
そもそも関数とは?、なぜ関数が必要になったのか、技術的に実現に至った背景がまとめられていた章でした。
とても面白かったのは、「関数という機能が実装されるには、関数が呼び出された元の場所を記憶されていなければならない」というお話でした。
「言われてみれば、確かにそうだよなぁ」と思いましたが、本書を読むまで、そのようなことを意識したことがなかったので、新鮮でした。
その問題を解決するスタックという概念についても、少しだけ理解することができた気がしています。
第6章 エラー処理
プログラムの失敗をどのように伝えるのか、その方法や技術的背景についてまとめられた章でした。
ここで、興味深かったのは「どういう時に例外を投げるかの正解はない」というところでした。各言語ごとに、どのタイミングで何を投げるのかが違うみたいです。
エラー処理について、私はあまり書かずにきてしまったので、あまり考えたことはなかったのですが、正解がないとのことのなので、自分なりの理由を持ってエラー処理を記述していきたいと思いました。
第7章 名前とスコープ
名前やスコープの歴史についてまとめられていた章です。
名前とスコープについては、日頃から頭を悩ませたり、問題に直面する機会が多いので、実感を持って理解できる内容でしたが、その中でもスコープには動的スコープと静的スコープというものがあると初めて知りました。
どちらにも問題点があり、言語開発者の方は頭を悩ませたのではないかと想像するのですが、そのような開発者の方が直面した問題とその対応方法について知ることは、とても興味深かったです。
第8章 型
型についてのお話。
私はRubyを主に使っているため、Ruby3.0で型検査が導入されるというお話は聞いており、都度都度「型検査って何ですか?」と聞いていた記憶がありますが、結局自分の中に蓄積される情報が断片的になってしまっていて、あまり理解したとは言えない状態でした。
そのため、本書のように簡潔ながらも体系的にまとめてくださっていると、とても理解しやすかったです。
自分のなんとなくの理解が文章になって腑に落ちたという感覚がありました。
つまりは、型検査ができるようになると、プログラムを動かす前に型の不整合が分かり、問題が起きそうなコードをすぐに見つけられるようになるということなんですね。
第9章 コンテナと文字列
データを入れるためのコンテナと、文字列の歴史についてまとめられた内容でした。
木構造から、データを検索するのと、ハッシュからデータを検索するのは計算量的に大きな差があるというお話があり、これも納得という感じでした。
文字列についても、ASCIIやUnicodeって「なんとなくよく見るよなー」といった認識でしたが、それが本書を気にどういうものなのか知ることができて良かったです。
ASCIIは、アメリカ標準の符号化方式で、UnicodeはASCIIよりも後に登場して、国際標準となった符号化方式なんですね。
第10章 並行処理
並行処理の実装方法、競合状態をどのように防いでいくか、その解決策を実現したプログラムが紹介されている章でした。
並列処理の方法として、協調的マルチタスクとプリエンプティマルチタスクがあり、開発者にとっては時間で指定できる後者の方が良いけど、競合状態がおきやすくて・・・という感じで、順序立てて説明されており、分かりやすい印象でした。
複数の選択肢がある中で、どれにもメリット、デメリットがあり、全て解決できる手段はないのだと再認識しました。
その中で、自分なりに「どうしてその方法を選んだのか」という理由を持って、コードを書いていかなければならないのだと強く思いました。
第11章 オブジェクトとクラス・第12章 継承によるコードの再利用
私が受講していたFJORD BOOT CAMPで、最近オブジェクト指向について考える機会があり、このあたりの内容は比較的実感を伴って理解できていった感じです。
その中でも、特に曖昧だったプロトタイプの考え方が分かりやすく明文化されていたのが有り難かったです。
プロトタイプの考え方がないと、関数が関数を作り出すようなプログラムでは実行される度に新たな関数が生成されることとなってしまいますが、プロトタイプでは、そのオブジェクトのプロトタイプに問い合わされることにより、同じ関数が呼び出されることになり、新たな関数が何個も生まれることがなくメモリの節約ができるというメリットがあるようです。
全体を通しての感想
私はRubyとJavaScriptしか触ったことがありませんでしたが、本書を読んで、他のプログラミング言語を触ってみたいという気持ちが高まりました。
他のプログラミング言語を触ることでプログラム設計の幅が広がる(komagataさんからいただいたお言葉)ということもあるようです。
『達人プログラマー』にも年に一つは新しい言語を習得しようとありましたし、プログラマーとして生きていく上で複数の言語を学んでいくことがいかに大事なことなのかということを再認識しました。
ただ、私は複数の物事を一気に習得することが難しいタイプなので、Rubyがある程度書けるようになってからだとは思いますが・・・。
また、「ぼんやりと頭の中に入っていた情報が、本書によって体系化されたり、文書となって提示されることで腑に落ちた」という感覚が結構ありました。 そのような点でも、本書を読んで良かったと思いました。
最後に、本書で触れられている、
- 比較から学ぶ
- 歴史から学ぶ
- 作ることで学ぶ
という学び方を自分の中での方針にして、実践していきたいと思いました。