『コーディングを支える技術』を読み終わった。
表紙はこんな本だ。
これは一般教養的な面白さがあるな pic.twitter.com/THKU10zZww
— 忽滑谷 聡太郎 (@glorificatio) 2015, 1月 27
プログラミング言語には複雑な文法がある。
プログラミング言語自体を習い始めの時は、文法については
『おまじない』とか『こういう決まり』だということで深くは追求せずに
まるで中学生が数学で『公式』を暗記するようにまずは覚えるだろう。
最初の頃はそれでいいし、まずはどのように動くかを覚えることも大切だけれども、
最初に習った言語の文法を常識としてしまうと、それが逆に次の言語の習得の妨げになってしまうことも多々ある。
もちろん、最初に習った言語で得られた経験は次の言語の習得にかなり役になっているが、
一部のパターンでは最初に習った言語の癖が抜けずに変な書き方をして失敗をしたり、頑なに変えないばかりにまわりにに迷枠をかけたりすることも起きる。
例えば僕はJava出身者なのだけれども、Javaはクラスという概念があるがJavaScripには存在しないし、
Pythonにはあるけれどもクラスは必須ではない。
Javaにおいて最初に実行されるメソッドであるpublic void mainは外の言語ではどのようにするのか
JavaScriptにおいてどのようにオブジェクトを継承するのかなど、
他の言語ではアプローチが違うためかなり迷った。
迷うならばそれはそれでいいが、
迷わずにJavaScriptでJavaのフィールド風にグローバル領域を汚す変数を書いたり、
PythonやJavaScriptにある強力なクロージャや関数オブジェクト等の機能を使わずに、調べもせずにそのまま突き進むという人もいる。
C言語出身者がJavaを書いたらクラスの意味がまったくないstaticばかりのソースになったりしたこともあった。
これらは言ってしまえば個人の資質というか、単なる怠惰だと言ってしまえばそれまでだけれども
時間がなかったりそれぞれ事情があって最初に習得した言語ほど第二の言語に勉強時間を割けない人も居るでしょう。
文法の何を見るべきか
この本は一冊で、様々な言語の文法で何を注目すべきかを示してくれる。
この本を読んだからと言っても、他の言語の文法を網羅的に分かるというわけではない。
ただ効率よく学習できる基礎はできる。
二番目に習得する言語でも、最初に習った言語と違う部分は再び写経したりしてここの経験からそれぞれの特徴のメリットにたどり着くことになるだろうが、
この本は、プログラミング言語の歴史からどのようにしてそれらの文法が必要とされ生まれ、そしてどうして別の言語では違うのかを説明してくれているので、
二番目に習得する言語がどのような思想やターゲットを持っているかが分かりやすくなると思う。
最初に習った言語では、『そういうものだ』と思っていた文法も
過去のプログラマたちが何かに悩み問題を解決するために導入したものだ。
Javaではクラスを継承するときに多重継承を禁止にした。
じゃあ外の言語ではどうだ?
それが、外の言語(例えばPython)ではサポートされているのだ。
なぜJavaは禁止にして、Pythonではそれを禁止にしなかったのか?
Javaではクラスというものを基礎においているオブジェクト指向だが、JavaScriptにはクラスは存在しないオブジェクト指向だ。
どのようにオブジェクトを表現するのか?そもそもオブジェクトとはそれぞれの言語で同じ意味なのだろうか?
Javaには変数宣言をするときに型を指定するが、そもそも型とはなんなのか?なぜ型があるのか?
Javaでは例外処理にthrowsで発生する可能性のある例外をメソッドに付け加えるが、
他の言語ではどのように例外処理をするのか?
例外処理とはそもそもどのように考えてデザインすべきなのか?
それら答えられた時に『おまじない』や『こういう決まり』はちゃんと理解されるようになるし、
別のアプローチで設計された言語の全く別の文法も習得しやすくなる。
Javaには無い機能は他の言語では沢山ある。
多重継承の問題を解決した他の継承に似た機能にトレイトやMix-inなども登場している。
なぜそのようなアプローチが存在するのかを説明してくれている。
読んで欲しい人
1つめの言語を習得した人以外にも、
もう二、三個習得している人でも読んで欲しいし、
例えば大分ベテランになった人でも、ずっと同じ言語をやっている人ならばこれを読んで欲しい。
言語のリプレースはあるかも知れないし、同じプログラミング言語でも新しい文法の風を入れてくる。
Javaにラムダ式やデフォルトメソッドが実装されたようにね。
言語を一つ習得して基礎が完了したと思われている人に、今一度この本で本当の基礎とは何かを知ってほしい。