あんまりこういう内容のポエム的なものは広まってほしくないなあ・・と思うのでこっちにひっそり書くことにする。
今年は僕にとってはGoの存在がとても大きい年だった。 5年前、僕が書くのはWebアプリケーションが中心で、PHPをメインで触っていた。それが気がつけばエンジニアリングのレイヤが広がったなあという所感があって、ここ最近Goがそれを加速してくれた。第二の言語としてのGoはとても良くできていて、小回りが聴くし、ミドルウェアをちょろっと書くにも心地よい。やっぱり最近の言語ならではの良さがある。たとえば、
* テストが標準ライブラリに組み込まれている
* net/httpがとても良くできている。フレームワークを必要としない場面も多い。
* concurrencyを堅牢に扱える(うまい言葉が見当たらない)
* そしてそれなりに速い
というのがあげられる。特にgo toolの充実はすごい。Race conditionをあんなに簡単にテストできる言語があるのだろうか(Erlang使いの人たちはそもそも反論するかもしれないけど。)他の言語のことはあんまり詳しくないのだけど、ツール郡の充実はGoの最大の特徴だ。言語仕様はシンプルだけど、ツールはどんどん充実させていくというのは言語のエコシステムとして面白いと思う。もちろんGoのためのツールはGoで実装されているというのも面白い。そしてgo toolのすべてのツールは挙動を読み解きやすい。読みやすさがこれほどまでに自分のプログラミング観を変えるとは思ってもいなかった。どんな実装でもGoなら、どんどん読んでいけるというのは本当にすごい。これは説明できない衝撃があった。
SimpleとEasyの違い、というのを最近まわりでも話していた。GoはSimpleよりで、PHPはEasyより。どういうことかというと、Easyは使い始めがわかりやすいが、難しいことをしようとすると大変。Simpleは機能が少ないように見えて、使いこなすのが大変。とはいえSimpleの良さは、使えば使うほど組み合わせのちからを発揮しやすいこと。Easyはある一定のことはしやすいけど、範囲を超えると大変になる、ということ。PHPは使いやすい歯ブラシだという話をよくする。あれだけ配列(というかハッシュテーブル)を扱う便利関数を持っている言語をあまり知らない(ScalaとかはCollection操作多いけど)。たしかに同じことをするにはPHPなりスクリプト言語のほうがGoより短く書ける。でもちょっと工夫の必要なことになると、僕はGoのほうがわかりやすく書ける。この差はなんとも言い難いんだけど、そういうことが実際にある。
言語仕様のこと。Goは1.x系については仕様がフリーズしている。これは面白いことだなと思っている。プログラミング言語が対処すべき問題は複雑だ。それでも表から見えるAPIを便利にするというのを一番の選択肢にはしない。非常に慎重にこれを変更する文化を作ろうという試みの真っ最中とも言える。最初はなんて窮屈なんだろうと思ったけれど、あるときGoはなんて引き算の徹底されている言語なのだろうと後から思い始めた。循環インポート一つとってもそうだ。むしろあえて制約をつける言語ともいえる。それが長期的にはコードの読みやすさになっている。言語仕様が小さいことは読みやすさにつながるということをこれほど実感したことはない。
学びについて。rscの https://talks.golang.org/2014/c2go.slide を読んだときは本当に衝撃だった。GoのコンパイラがCからGoに切り替わった。私がGoを触り始めたときにはすでにGoはGoで書かれていた。こんなソフトウェアエンジニアリングがあることに衝撃を受けた。それでもruntimeは十分に速く、むしろ改善を続けている。GoがGoで書かれているから、僕はGoからGoを学ぶことができた。Goを学ぶ一番の方法はGo本体を読むことだ。言語の標準ライブラリは、なんというかコンピュータサイエンスの面白い部分がたくさんつまっているので、データ構造とアルゴリズムを実際に動いているコードから学べる。それも自分が書いている言語で実現する方法を知れるというのはいちエンジニアとして学びが大きい。Go自身が僕にもたらしてくれた学びというのは、この部分でとてつもなく大きい。読みやすいGoのコードが、もたらしてくれた学びとも言える。
つれづれ書いてしまったけど、Goは本当におっさん向け言語だと思う。いや、なんかいい言葉が思い浮かばないんだけどそう思う。かっこよく書きたいとか、まあそういうのはあるんだけど、まず「これを実現したいんだ」が一番最初にあって、そのためにコードを書くということに徹している言語がGoだ。実現したいことがなくて汎用的に書くGoのコードは(不慣れなうちは特に)不思議と失敗するようになっている。これが未だに不思議なところで、なぜか汎用的なコードは失敗するが、問題領域をちゃんと絞ると良いコードになっていく。だから結果的にすごくやりたいことに対して愚直なコードになる。もちろんその愚直なコードにはわかりやすいテストをかけるし、ベンチマークもしやすいし、なんだったらmemory leakの可能性も気づきやすい。本当に実用的な言語だなあというのをこの一年でまた改めて感じた。
まとまりのない文章になったけど、とにかく今新しい言語を学ぼうと思っているのならGoは第二言語としてもすごくおすすめできる。何ていう話をふと思いついたので殴り書いたのでした。みなさま良いお年を。