『プログラミングElixir 第2版』を読んでいまこそElixirに入門しよう

この記事は#NervesJP Advent Calendar 2020の14日目です。

13日目はわたくしの「mix upload.hotswap (kentaro/mix_tasks_upload_hotswap)の裏側」でした。2日連続の登場です。


プログラミングElixir 第2版』をご恵贈いただきました。ありがとうございます。ちょうどElixirについて学び始めたタイミングでの刊行で個人的にとてもタイムリーなこの本について、本記事で簡単に紹介します。結論だけ先にいうと、プログラミング言語についての本としても読み物としてもとても面白いので、ぜひ広く読まれたいと思います。

Dave Thomas・著、笹田 耕一+鳥井 雪・訳『プログラミングElixir 第2版』

Elixirとわたくし

前述の通り、この記事は#NervesJP Advent Calendar 2020向けに書かれるものです。Elixir本の紹介記事なのでNervesのカレンダーに書くのはカテゴリエラーのようですが、自分自身にとってはElixirとNervesとは切っても切り離せないものなので、こちらに書いています。

Elixirの存在自体は(わたくしはRubyistでもあるので)2012年のリリースの頃から知ってはいたものの、それ以上深入りすることなく2020年秋まできてしまいました。2020年11月13日に行われた「第7回WebSystemArchitecture研究会」でNervesというものについて語られており、それはわたくしの関心に近いものである旨を、参加した研究所の同僚から教えてもらいました。それを見た瞬間「求めていたのはこれじゃん!」とピンときて、その週末は連日明け方まで調べたりコードを書いたりデバイスをいじったりしました。公開されたその時のお話のスライド(@zacky1972先生による「Nerves on Cloud (Japanese edition) 」と、@kikuzokikuzoさんによる「Elixir/NervesHubによるエッジコンピューティング環境実現に関する検討」)も素晴らしく、それからはすっかりElixir漬けの毎日で、急速に夢中になりました。何がそこまでわたくしを夢中にさせたのでしょうか?

Elixirとこれからの世界

インターネットサービスのエンジニアをやってきた中で、わたくしが関心を持ってきたことのひとつに、いかにシステムを更新し続ければいいのかということがあります。特にOSSに強く依存する昨今のシステム開発においては、エコシステムと歩調を合わせていくことが求められます。さらには、IoTのようにシステムが現実世界にはみ出していくようになると、エコシステムとの共存にはまた別の難しさが現れてくるでしょう(そもそもアップデート自体が大変だし、一様なサーバ群とは異なる多様なデバイスが存在することになるから等の理由)。4月から通っている大学院では、そのあたりを研究したいと思っているところです。

そういう関心からしても、ElixirやNervesには興味深いことがたくさんあります。NervesHubという仕組みによるOTA(Over The Air)アップデートを可能にする仕組みがあります。また、Elixir(とErlang)という言語のあり方そのものに対して、温故知新的に(?)まさにいま求められているものじゃないかという気づきを得たりもしました。すなわち、@takasehideki先生による以下の図の通りです。

ElixirでIoT!?ナウでヤングでcoolなNervesフレームワーク」p.21

昨今は、microservicesだとかなんとかで、ひとつのホストという制約を超えたコンピューティングが、これまでとはまた別のあり方で発展しつつあるように思われます。上図などはまさにそういうことを表しているのでしょうし、自分の関心的にも取り組んでいきたい領域です。そういう関連もあって「mix upload.hotswap (kentaro/mix_tasks_upload_hotswap)の裏側」という記事にも書いた通り、デバイスの開発効率向上という観点からのHot Code Swappingの応用についてもやってみたりしているところです。

そんなわけで、自らの関心に基づくやりたいことに対しての助けになりそうなNervesからElixirに入ったのですが、Elixir(とErlang)そのものにももちろん強い関心を持っています。それで各種ドキュメントを読んでいたところ、本書がちょうど刊行され、しかもいただけるという光栄に浴すことになったわけです。みなさま、本当にありがとうございます。ご縁ですね。

著者について

著者のデイブ・トーマスさんはThe Pragmatic Programmers, LLC.(PragProg)の共同創業者。これまで刊行された著名の書籍をあげるだけでも、綺羅星のような名著ぞろいというすごい人です。多くのプログラマが「この1冊」に挙げる『達人プログラマー』、原著第1版は1999年に刊行された浩瀚な『プログラミングRuby』、いまも版を重ねるAgile Web Development with Rails(邦訳はもはや追いついてないので原著へのリンク)といった書籍や、アジャイルソフトウェア開発宣言への署名者としてアジャイル開発プロセスの推進者としての活動を通じて、この20年以上の我々の業界でいまや当たり前になったプラクティスを作ってきたひとりです。その彼が2014年に刊行したのが本書の第1版で、それを著者が2018年にアップデートしたのが本書の原著です。

そういうひとが書いた本ですので、一筋縄ではいきません。著者も「はじめに」で書いている通り、あの巨大な『プログラミングRuby』とは明確に異なるアプローチで、Elixirという言語の良さが、時には著者の個人的な好みも色濃く織り交ぜながら書かれています。そんなわけで、本書はプログラミングそのものが初めてのひとよりは、なんらかの言語による経験がそれなりにあるひとの方が楽しめるだろうと思います。そういうひとにとっては、達意のプログラマによる目を開かされるような創見が豊富な本書のような本を、他の言語との比較において楽しめるだろうからです。

赤いカプセルをとれ

「純粋で正確」な関数型言語を検討はしたものの魅力を感じなかったという著者は、Elixirに「不完全な世界」を容れる包容力がありながら純粋な関数型言語とは異なる「実用的なクオリティ」を見出し(本書386〜387ページ)、この本をのっけからこんな感じで始めます。

赤いカプセルをとれ

本書1ページ

これは、もちろん映画「マトリックス」を踏まえたフレーズです。つまり、Elixirを学ぶというのは「世界に対する見かた」を根本的に変えるということなのです。オブジェクトの持つ状態を更新することが眼目となるオブジェクト指向言語の前提とする世界に対して以下のように宣言します。

でも、これは現実の世界ではない。現実の世界では、抽象的な階層構造をモデル化したいわけではない(なぜなら、実際には、真の階層構造なんてそう多くはないからだ)。私たちは仕事を済ませてしまいたいのであって、状態を維持したいわけではない。

(中略)

あなたの世界へのまなざしも、オブジェクト指向におけるクラスの責任について考えるのをやめて、仕事を終らせる、という観点で考え始めるように、変化していくだろう。そして、たいていみんな、それは面白いって認めてくれるはずだ。

本書1ページ、3ページ

こうしてレッドピルを選び取った我々は、「ネオ」のように世界の実相(?)をデイブ・トーマス御大の語り口に導かれて、次々に見ていくことになります。

本書の特色

本書の文法事項の説明を開始する第2章は、こんな文章でまとめられます。

ErlangのクリエータであるJoe Armstrongは、Erlangでの等号記号を、代数での等号記号の使われ方にたとえる。

(中略)

彼のいいたいことはこうだ。はじめに手続き型プログラミング言語の代入と出会ったとき、代数的な = の意味を忘れなければならなかった。今はそれをさらに忘れるときだ。

本書20ページ

よくあるプログラミング言語が文法解説が変数や代入文のような基本的な事柄から始まるのに対して、本書はパターンマッチから始まります。Elixirの=はその見かけに反して代入文ではなく、関数型言語では広く見られるパターンマッチを意味します。それは、x = 1みたいなよくある代入に見えるようなパターンマッチにもなりますし、タプルやリストのようなより複雑な構造をマッチさせたり、さらには関数の引数をパターンマッチさせることで、引数に応じた同名の関数宣言を複数書くことだってできます。

ただまあ、そこまでだとオブエジェクト指向言語ではなく関数型言語がいいよという話に過ぎないようにも思えます。そういう話ならもう聞き飽きたというひともおおいでしょう(とはいえ、それはそれで面白い話題がたくさんあるのですが)。やっぱりElixirが面白いのは、そういう話はもとより、Erlang由来のプロセスやOTPだろうと思います。というわけで、文法事項の説明は400ページほどあるこの本の半分で早々にまとめられ、その後はErlang VMのパワーを存分に活用するためのあれこれに話題が移ります。

Elixir(もちろんErlangでも)では、とにかくいろんなことにプロセスが使われます。本書では、フィボナッチ数列を計算するプログラムだって、プロセスを使って実装します。この、「プロセスで考える」ということこそが、本書がわたくしたちの世界への見かたに対して大きく変更を迫る本質的なポイントであるように思えます。

ほとんどのまともなElixirプログラムは、本当にたくさんのプロセスを使う。そして、だいたいにおいて、プロセスの生成と管理を、オブジェクト指向プログラミングでオブジェクトを生成・管理するのと同じ具あり気楽に行う。でも、この考え方を学ぶには、もうしばらくかかるだろう。粘り強く行こう。

本書216〜217ページ

このように幅広く、気軽に使われる大量のプロセスを用いて、いかにして現実の要求を満たす堅牢なシステムを構成していくのかという話題について、しばらく話が進みます。すなわち、GenServerによるOTPサーバ、スーパーバイザ、OTPアプリケーションなどです。それらが何なのかについてはここでは説明しないので、ぜひ本書を買って読んでみてください。これらこそが、先に書いた通り、これからのインターネットのシステムアーキテクチャにとって「これじゃん!」となっていくポイントなんじゃないかと思います(そこではNervesが大きな役割を果たすことになるでしょう)。Erlangって1986年に作られた言語なんですよね。そんな歴史のある言語が、いまこそ未来を指し示しているように見えて、ドキドキします。

本書の記述はさらに続いていくわけですが、個人的に特によかったのはプロトコルや型仕様についての説明です。ドキュメントを一読しただけだと全然理解できなかったのが、スッと入ってきました。また、付録Dの日本語版の特典「Elixir 1.6以降の状況と開発運用の実際」も素晴らしいです。本書はElixirがバージョン1.6の時の本なのですが、そこからキャッチアップできる情報が簡潔にまとめられています。とはいえ、かといって本文の方が古いかというとまったくそんなことはないので、ご心配なく。

翻訳もとても練られており、考え尽くされた様子が目に見えるようで、非常に素晴らしいです。第25章の原題はMore Cool Stuffというのですが、それが「かっこいい機能いろいろ」とそれこそCoolに端的に訳されていることに象徴される通り、読みやすさと理解しやすさに繊細に気を配っていることが察せられます。よい翻訳者を得た幸せな本ですね。

おわりに

最初に書いた通り、最近はとにかくElixirにハマりきっているのであれこれと書きたいことはあるのですが、既にこの記事もだいぶ長くなってしまっているので、このへんで終わりにしようと思います。

デイブ・トーマスさんについて「この20年以上の我々の業界でいまや当たり前になったプラクティスを作ってきたひとりです」と紹介しましたが、ことElixirについては、まだそこまでの事態になっているようには思われません。いずれそういうときも来るのでしょうか。みなさんもこの機会にElixirを始め、「赤いカプセル」を選択して、世界の真相を探す旅にでましょう。

Dave Thomas・著、笹田 耕一+鳥井 雪・訳『プログラミングElixir 第2版』

#NervesJP Advent Calendar 2020の15日目は、@torifukukaiouさんの「グラフうねうね (動かし方 編) (Elixir/Phoenix) 」です。続けてお楽しみください。

『みんなのGo言語 – 現場で使える実践テクニック』の紹介

著者のおひとり、 @songmu さんより『みんなのGo言語 – 現場で使える実践テクニック』をいただきました。ありがとうございます。

みんなのGo言語[現場で使える実践テクニック]

みんなのGo言語[現場で使える実践テクニック]

  • 作者: 松木雅幸,mattn,藤原俊一郎,中島大一,牧大輔,鈴木健太
  • 出版社/メーカー: 技術評論社
  • 発売日: 2016/09/09
  • メディア: Kindle版
  • この商品を含むブログを見る

今年に入って『プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)』が翻訳されたように、日本語で読めるGo言語についての書籍もずいぶん充実してきたようです。Go言語の良さとは、「早い人ならば1日、遅くとも数日で言語仕様の全容を理解できる」*1ほどにシンプルな仕様にもあることは、『みんなのGo言語 – 現場で使える実践テクニック』(以下、本書)でも「はじめに」において述べられるところです。実際、他の言語にある程度通暁していれば、すぐにでもなにかしら使い始めることができるでしょう。

一方で、どの言語でも事情は似たようなものであると思われますが、Goにおいても例にもれず、言語そのものの仕様について知ること以上に、効率的な開発環境を使いこなしたり、言語特有のプラクティスやイディオムを身につけたり、あるいは、言語によらない共通のプログラミングそのものの知見を得、使いこなしていくことが重要であったりします。文法をひととおりみにつけたその先に、本書を通底して流れている、「チーム開発」(第1章)にフィットし、「どの環境でも同じように動作」(第2章)する、「実用的なアプリケーション」(第3章)が作れるのでしょう。

僕自身は、1.0が出るか出ないかぐらいの頃(?)だったかにひととおり文法を勉強してみて、その後、簡単なツールを書いてみたり、なにかあれば積極的にGoを使って小さなプログラムを書いたりはしてきましたが、腰を据えて、継続的に大きなアプリケーションに取り組むということがなかなかできてなかったため、上記したような、日々新しいものが追加されていく「実用的な」知見に疎くなっていました。そんなこともあって、著者陣の日々の経験から生まれた、実践的なTipsがつまったこの本は、とても勉強になりました。

go xxx のような便利ツール群などにも、発見がありました。たとえば、第1章で紹介されているgo lintgo vetなど、「そういえば使ってなかったな……、使うようにしよう」と反省したり、第6章「Goのテストに関するツールセット」で紹介されている go test -run TestXXX としてTestXXX だけ実行できることを教えてもらったり。第4章「コマンドラインツールを作る」では、採用候補のライブラリを紹介した上で、自分でとりまわしよく、かつ、しっかりとCLIアプリケーションを書く方法が丁寧に紹介されていて、今後、また参照することになるでしょう。

第3章「実用的なアプリケーションを作るために」と第5章「The Dark Art Of Reflection」は、個人的に、本書の白眉というべき面白い章でした。前者は、著者が実際に作ったプロダクトでの経験から、I/Oのバッファリング、タイムアウト、シグナルハンドリングのような、システムプログラミングをする上で大事な内容について述べられています。後者は、GoのReflectionってこんなこともできるんだーとひたすら驚きながら読みました(パフォーマンス上の懸念もしっかり述べられています)。

そんなわけで、Goについてひととおりの文法的事項はおぼえた(つもりだ)けど、実用的なツールやアプリケーションを書いていくにはどうしたら?という方が読むと、得るところがとても多いんじゃないかと思いました。オススメ。

みんなのGo言語[現場で使える実践テクニック]

みんなのGo言語[現場で使える実践テクニック]

  • 作者: 松木雅幸,mattn,藤原俊一郎,中島大一,牧大輔,鈴木健太
  • 出版社/メーカー: 技術評論社
  • 発売日: 2016/09/09
  • メディア: Kindle版
  • この商品を含むブログを見る

*1:『みんなのGo言語 – 現場で使える実践テクニック』p.3

深町秋生・著『果てしなき渇き』

果てしなき渇き (宝島社文庫)

果てしなき渇き (宝島社文庫)

その著者の名前が気になってはいたものの(はてなダイアリユーザでもあるし「深町秋生の新人日記」)、タイミングが合わなくてなんとなく読み逃していたのだったが、『果てしなき渇き』が文庫化されているのを書店で見つけ、ちょうど本を読む流れに穴が空いてもいた折り、うまいことすっぽり読み始めることができたのだが、読み始めたら最後、ひたすら主人公および物語のハイテンションな暴走ぶりにあてられて、一気に読了してしまった。
元刑事の、いまは警備員をやっているいわくありげな中年男が、冒頭、いきなりぶち当たる殺人事件の凄惨ぶりが放つインパクトにのっけから心をつかまれるのだが、離婚した元妻からかかってきた電話により始まる、失踪した娘探しの道程は、若い女の子と白い結晶というからみの、それはそれでまぁアリなのかな的展開をみせるのかと思いきや、街のギャング、ヤクザ、県警、警察の内偵、フィクサー的実業家が入り乱れる盛り上がりぶり、そして、追跡の過程で明らかになっていく、娘の知られざる真の姿がかなりと迫真的で、先に述べた通り、巻を置くこと能わざる展開となる。
また、主人公の魅力的とは到底いい難いキャラクタ造形も、異彩を放ちまくって、読む者の心を離さない。親とあれば多かれ少なかれそうであるのかもしれないけれど、元刑事という性質に輪をかけて、ほとんど気が違っているような偏執狂ぶり(刑事を辞職した原因が、妻の浮気相手を半殺しにしたことだとか、娘の友人に対する聴取が、話をうまく訊きだそうという配慮とはまるで無縁の、悪魔じみたやりくちであること等)が、睡眠不足と加えられた暴力とで朦朧とした身体に白いものをぶちこんで元気溌剌、それまで死にそうになっていたのが一転、通りがかった小学生に対してにこやかに手を振っちゃったりするコミカルな一面も見せつつ、一段とパワーアップしてあたり構わず突入していくブッコミ野郎ぶりに、思わず熱いものがわき上がるのを禁じ得ない。
大人数が入り乱れての情報戦、凄惨な描写、絶望的な物語という点で、かつて同じように熱中した馳星周の『不夜城』を始めとする初期ノワール群を思い出すのだが、そのようなジャンルには全くもって通じていないのだから、勝手な類推はやめにしよう。それぞれに一途な思いが、一方では過剰なまでの熱さで、また一方では非情な冷酷さでもって暴走した結果、このようなひたすら熱中的な物語が産み出されたそのことに、ただただ呆然とするばかりだ。同著者による『ヒステリック・サバイバー』も、「筋肉バカvsオタク」との帯文の煽りがやや不穏な印象をもたらすものの、是非読んでみたいと思った。というか、いま、注文した。

ヒステリック・サバイバー

ヒステリック・サバイバー

猪瀬直樹・著『作家の誕生』

作家の誕生 (朝日新書48)

作家の誕生 (朝日新書48)

次期東京都副都知事に就任することになった猪瀬直樹氏による『作家の誕生』を読んだ。同名タイトルのNHK人間講座のテキストを加筆訂正したものということもあり平明な記述で、また、著者の文芸三部作(『ペルソナ 三島由紀夫伝』『ピカレスク 太宰治伝』『マガジン青春譜 川端康成大宅壮一』)を機会がなくて読んでいなかったので、初見のエピソードがたくさんあり、非常に楽しめた。
タイトルにある「誕生」は、現代思想的な文脈でいう「作家の死」などという言葉とは全く関係なく、端的に、「作家」が経済的に職業として成り立つようになった過程を踏まえて語られている。明治の終わり頃には、そもそもマーケットが非常に狭かったため、作家専業では食えなかった。それが、雑誌や新聞の隆盛によるマーケットの拡大や、また、そのことがもたらした、本書では現在のネット文化と対比して語られる雑誌への投稿文化に見られる受容層の多様化により、作家が職業として経済的に成り立ちうるようになったわけだ。
本書は、作家が「誕生」する過程において起きた諸現象、つまり、醜聞の社会現象化、夏目漱石朝日新聞社員としての作家活動、淡い恋に憧れを抱く一介の投稿少年としての川端康成、瀧田樗陰ら名物編集者が作っていった雑誌文化、菊池寛の生活者としての視点と商才溢れる活動ぶり、島田清次郎賀川豊彦といった作家による大ベストセラー小説の出現、円本による多くの作家たちのいまでは信じがたいほどの経済的成功等、できるだけ文学的な伝記性を廃しつつ、徹底して、経済的な面から作家という職業の歴史を綴っている。もちろん、他の著者に見られるような文学コミュニケーションの歴史を追う記述も面白いのだけど、個人的には、美しいことばかり書いてたって、それでどうやって生活するんだよ?という気分が強いので、本書のようなアプローチは願ったりかなったりだ。
しかしだからこそ、太宰治三島由紀夫をそれぞれ扱った最終3章はやや退屈に感じた。太宰については、それぞれのエピソードは面白くはあるが、作家と経済という点では、彼は津軽の富豪の息子だったのであまり切実さは感じられないのだし、三島の章にいたっては、大蔵省を辞める辞めないのあたりは面白かったものの、かなり文学論の趣が強く、個人的にはいま読みたい文章ではなかった。
本書のようなアプローチを取る本としては、日垣隆・著『売文生活』も面白い本だった。是非、合わせて読まれたい。

売文生活 (ちくま新書)

売文生活 (ちくま新書)