書くことが思い浮かばず、「Qiitaだしポエムでもいいか」と開き直ったらこんな内容になってました。
「なぜGoを使うのか?」
3年ほど前、私は「新しい言語に触れてみたい」という単純な理由からGoを書き始めました。私の周りには優秀な人が多く、そういった人々がRustやHaskellといった言語にのめり込んでいく中で私は一人Goの沼へと足を踏み入れました。実際に書き始めてみると周囲から「なんでGo?」と聞かれる機会がそれなりにありました。そして私はその質問に満足な回答を持ち合わせていませんでした。
Goは面白い言語ではない
Goについて話をする上で避けて通れない話題が仕様の小ささです。Goが採用している言語機能の数は非常に少ないです。このことはGoの言語仕様がペライチのWebページに収まっていることからも明らかです。印刷してもA4 110ページに収まります。比較対象としてC++17のWorking Draftは1440ページにも渡ります。プログラミング言語の中でも特に複雑な部類に当てはまるC++と比較するのはフェアではないかもしれませんが、スケール感の違いはおわかりいただけるかと思います。
仕様が小さいが故にそれが「不十分である」例としてよく槍玉に挙げられるのは「比較的新しい静的型付き言語なのにジェネリクスがない」ことでしょうか。ジェネリクスがないので他の言語には当たり前に実装されているような map
や filter
のような機能は標準的に用意されていません。Goではそういった処理は全て for
文で行うことになります。重複する機能がほとんどないので仕様の適切な取捨選択による創意工夫をすることができず、学べることも少ないです。正直に言ってしまえばGoは「味のない、面白みのない言語」です。
人によってはそれだけでGoは学ぶに値しない言語として映るかもしれません。しかし、私はこの味気なさはむしろいいことだと捉えています。その理由は私がなぜGoを書くのかという問いに対する答えに直結しています。
Simplicity is Complicated
「単純さは複雑だ」
これはGoの開発者の一人であるRob Pike氏の言葉で、dotGo 2015での同氏の発表のタイトルでもあります。私がGoを書き続ける理由を一言で表すとすればこの言葉を選ぶでしょう。Goに興味がある人やGoを書いている人でこの発表を見たことがないという方はぜひ一度見てみることを強くおすすめします。
dotGo 2015 - Rob Pike - Simplicity is Complicated https://youtu.be/rFejpH_tAHM @YouTubeより
Goの小さな仕様はしばしば「シンプル」と評されますが、それは他の現代的な言語と比較して「シンプル」なのであり必ずしもGoがシンプルさに特化しているわけではありません。仕様を究極的にシンプルにしたければそれこそBrainf*ckのような言語になってしまいます。発表中にRob Pikeが言っているように、Goは「シンプル」なのではなく、「シンプルに感じる」だけなのです。
なぜ「シンプルに感じる」のか。それは「書きやすさ」と「読みやすさ」のバランスを絶妙に取っているからです。直交する必要十分な仕様のみを採用しているので書くときにどの言語機能を使うかで迷うことはなく、見慣れない仕様を採用していないので読み方がわからないこともありません。Goを扱う時、書き手としても読み手としても脳にかかる認知的負荷が小さいと感じることが多いです。
Goはメモリ管理モデルもガベージコレクションという、ユーザにとっては非常にシンプルな(認知的負荷の小さい)手法を採用しています。その一方で、実用に耐えるレベルのガベージコレクションを実現するためにその実装は非常に複雑になっています。これもタイトルである「単純さは複雑である」ことの例として発表の中で取り上げられています。
こういった「シンプルに見える」言語デザインを追求した結果、Goは「書く」あるいは「読む」時に知らなくてはならないことが少なく、また考えることも少ないと言えます。それは一方で「書く面白さ」や「学ぶ面白さ」を削いでしまうという側面もありますが、逆に「書くことよりも、作ることに集中させてくれる」とも言えます。Goに「書く楽しさ」ではなく「作る楽しさ」を見出した時、私はGoという言語の真価を自分の内に発見しました。
書くことと作ること
そうは言っても「書くことが楽しく」かつ「作ることが楽しい」と思える言語が一番であることは間違いありません。ですが、「書くことが楽しい言語」を駆使して「作ることが楽しい」という領域に至るのはとても大変です。私は今からC++の規格書に目を通して「正しい」C++を書けるようになる労力を割きたいとは思えません。それなら勉強に必要な時間を使ってGoでなにかを作っていたほうが楽しい、というのが私の考えです。そういう意味でもGoの「一度ある機能を覚えたらそれさえ使えればいい」という割り切り方に非常にシンパシーを感じています。
私は昔から制限のある環境下で創作する時に最も創造力が働く傾向があり、そういった側面からもGo言語ととても性格的にマッチしているというのもあるのだとは思います。少ない言語機能セットの中でいかに創造的にソフトウェアを作り上げるか。明瞭でわかりやすく読みやすく使いやすいソフトウェアを作るためにどうしたらいいか。複雑な言語に関する細かな仕様をちまちまと勉強するよりも、単純な言語でどんどんモノを作っている方が性に合っていました。
最後に
こういった「モノづくり」的なプログラミングへのアプローチを持っている方にはぜひGo言語をおすすめしたいです。これからGoに触れてみようと思っている方や、なんとなくGoを敬遠していたけど興味がないわけではないという方にこの記事を通じて「そういう捉え方もあるのか」と思っていただけたのなら幸いです。