この記事は、「fukuoka.ex Elixir/Phoenix Advent Calendar 2020」の13日目です
昨日は、@koyo-miyamura さんの「Elixir の OSS を読んでみよう ~ Plug.CSRFProtection を例に ~」でした
Elixir Digitalization Implementors/fukuoka.ex/kokura.exのpiacereです
ご覧いただいて、ありがとうございます
今月頭、4年4ヶ月ぶりの改定となる「プログラミングElixir 第2版」が発売されました
下記の「Programming Elixir ≥ 1.6: Functional |> Concurrent |> Pragmatic |> Fun」をベースとしながら、日本語版にしか無いコンテンツも追加されており、今回コラムでは、そこも含めたアップデートを解説したいと思います
はじめに:「プログラミングElixir 第1版」との出会いとアルケミスト人生
「プログラミングElixir 第1版」を初めて読んだのは、私がElixirをはじめた2015年5月頃から、1年半くらい経った後の2016年後半でした
20代前半の頃、私のプログラマ人生を大幅に変えた「達人プログラマー(The Pragmatic Programmer)」のDave Thomasが目を付けた言語ということで、周りにElixirを知る人がゼロだった私にとって、「プログラミングElixir」は、自分の選択が間違っていないことを強く後押ししてくれた、希望の1冊でした
(ちなみに達人プログラマーは、新版よりも、旧版の方がパワフルなので、両方読まれることをオススメしたいので、上記リンクは全て旧版 改訂版にしています)
実際に「プログラミングElixir 第1版」を入手して読んでみると、「赤いカプセルをとれ」と、これまた大ファンである映画「マトリックス」のフレーズから始まり、続く第2/3章はプログラミング言語の入門本セオリーはまるっと無視の、序盤からDave Thomas節全開でワクワクしました
第Ⅱ部「並行プログラミング」からは初心者おいてけぼりだけど、プロセス間通信とか大好きな、私みたいな人間にはゾクゾクする、堪らない展開でした
その読書体験は「雷に打たれる程の衝撃」で、すぐさま社内ツールでElixirを試し始め、その3ヶ月後には一部プロダクションをElixir化し、更に3ヶ月経った半年後には、Elixirコミュニティ「fukuoka.ex」を発足してしまった程です
それをきっかけに、tokyo.exやサッポロビーム等、各地Elixirコミュニティとの親交が生まれ、全国23ヶ所にまでElixirコミュニティが増え続け、毎月17本ものElixirイベントが定期開催されている現在まで、アグレッシブな活動を続けています
最近は、コミュニティ活動の軸足に加え、Elixirの雇用を増やすための事業および他社事業支援を行い、投資家としてElixir採用企業への出資をし、ElixirConfはじめとする海外のElixirコミュニティとのリレーションに関わったりしています
①見た目のアップデート
外観
まず外観ですが、本のサイズと装丁、ページ数が、けっこう変わりました
第2版のサイズは、第1版よりも入門者向け/技術書っぽいサイズに変わっています
装丁は、メインモチーフである「Elixir色の液体が入ったガラスボトル」は続投(微妙に違うスペックですが)で、背景は、第1版が木の切り株なのに対し、第2版は緑のシダ植物が生える地面に埋まった感じになっていて、何となくDave Thomasが本書巻末の「日本語版に寄せて(第1版はP304、第2版は387)」で書いている「わびさび」を感じさせます
裏面は、どちらもシンプルですが、第2版は原著のようなガラスボトルが追加されています
厚さ/重量共に、けっこうボリュームアップされていて、ページ数も、第1版の全328ページに対し、第2版は全412ページと、84ページも増えています(持ち歩き勢には、ちょっと大変になったかも)
内観
扉絵が、フルカラーになっていて、パッと見のとっつきやすさが段違いです
中の説明も、マーカー色がふんだんに使われ、入門者にとって入りやすい印象に改善されてて、とても好感が持てます(あと、ファイル名とコードがマーカーで区切られてたり、リストの範囲が異なるマーカー色で塗り分けられてて、全般的に見やすくなっています)
第1版は、良くも悪くも、ストイックと言うか、渋い印象で、これだけでも初心者にハードルを感じさせ、しかも中身はDave節によってマニアックさを更にマシマシされてたので、Elixir入門者に「プログラミングElixir」を読んでもらう前に、Enum数種+PhoenixでElixirらしさをサクッと知ってもらうコラムを使っていましたが、今後は「プログラミングElixir 第2版」から読み始めてもらえるかも … というファーストインプレッションを感じさせます
細かい変更点ですが、大見出しが、ゴシック体ベースから明朝体ベースに変わっていて、何となく今風の技術書っぽいテイストになっているのもいいですね
②構成のアップデート
想定Elixirバージョン
- 第1版:Elixir 1.2
- 第2版:Elixir 1.6+α
言語仕様自体は、この間で、まぁまぁ変更はあったものの、「プログラミングElixir」で扱われている内容的には、そこまで大きな変化が無いであろうバージョン差です(そのため第1版でも、わりかし最新バージョンで本の範囲の習得に困ることは無かった)
1.2までの間は、わりかしコレクション周りでアッチコッチ迷走してた感はありましたけどね
ビルトインライブラリ周りだと、1.2から1.6の間で、GenEvent/Dict/HashDict/Set/HashSet/Behaviourモジュールがdeprecatedされたり、Calendar変更やDynamic Supervisor追加など、コチラも色々あった訳ですが、そもそも「プログラミングElixir」はリファレンス的な網羅性が無い本のため、公式リファレンスを見ることがセットで使われる感じで、それさえ知っていれば、あまり困ることは無い印象です
mix関連も、コードフォーマッタ追加などありますが、このあたりはDave節なら、たぶん追加されてるんじゃ無いかと思います
一方で、1.6以降のフィーチャについては、mix release追加や、:simple_one_for_oneのdeprecatedはじめとするSupervisor周りが変わっていますが、コチラもそこまで頻発するものではありません
ということなので、バージョン差に関して、第1版と第2版の違いは、さほど気にならない範疇かな、と思っています … が、これからElixirをはじめる入門者にとっては、第2版の見た目の印象は、明らかに入門のハードルを下げるものになっているので、「プログラミングElixir 第2版」で学び始めることをオススメします
目次構成
第1版と比べた第2版のアップデートは、以下の通りです(漢字/かなの差異や、異音同義は割愛)
- 第4章
- 「4.6 日付と時間」が追加
- 第7章
- 「7.5 リストを単一の値にまとめる」に変更(第1版は「再帰中の値の保持」)
- 第8章
- 「8.4 マップのパターンマッチと更新」に変更(第1版は「マップのパターンマッチ」)
- 第13章
- 「タスク:」が「ステップn:」に変更
- 「13.5 リファクタリング:大きな関数注意報」が追加
- 「13.13 コメントのテスト」が14章に移動
- 第14章「ツールの利用」が章ごと追加
- 第17章
- 「17.6 サーバをコンポーネントにする」が追加
- 第18章
- 「18.2 ワーカの再起動オプション」が追加
- 第19章「さらに複雑な例」が章ごと追加
- 第20章
- 「20.6 Distillery - Elixirのリリースマネージャ」に変更(第1版は「EXRM - Elixirのリリースマネージャ」)
- 付録D「Elixir 1.6以降の状況と開発運用の実際」が章ごと追加
- 付録E
- 「E.2 Elixir作者より(第2版発行に寄せて)」が追加
目次自体は、質的な変更がそこまで多くは無く、幾つかの章/節の追加・変更がある感じです
あと、どうでも良いですが、「付録A 例外:rais、try、catch、throw」と、「rais」が誤字ってました
③中身のアップデート(基礎ツアー部分)
注意点として、以降は、第1版を読んだことがある方に向けた解説になるので、アップデートの無い部分は、解説しません
純粋に、どんな内容かを知りたい方は、@MzRyuKa さんの下記コラムをご参考ください
書評:プログラミングElixir第2版
https://qiita.com/MzRyuKa/items/ed5c16c3ee1c7a102fba
全体的なアップデート
- 「iex」を「IEx」、「mix」を「Mix」のような感じで、Elixirの命名規則に合わせている
第1章「赤いカプセルを取れ」
第1版と内容はほぼ変わっていないけど、「1.5 演習問題」の内容が、入門者に易しい感じにアップデートされてて嬉しいですね
第2章「パターンマッチ」
内容およびコードサンプルは、第1版とほぼ変わっていないです
まぁ、この付近は、Elixirのコアなので、変わりようが無いところでしょうね
第3章「不変性」
文章末の言い回しや、異音同義語の違いはあるものの、内容およびコードサンプルは、第1版とほぼ変わっていないです
この付近も、Elixirのコアなので、変わりようが無いのでしょう
第4章「Elixirの基礎」
4.2 値型
- P26
- 数字桁について、中国や日本の例が補足されています
- P27
- 正規表現のオプションから「g(名前付きグループ)」削除
- 正規表現のオプションの「r(控えめなマッチ)」が「U」に変更
4.4 コレクション型
- P29
- サンプルにしているファイルが「Rakefile」から「mix.exs」に変更 ※第1版の頃はRails的だったのかしら?
- 「リストの定義」が枠囲みで切り出された
4.6 日付と時間 ※節の追加
P33~34、Elixir 1.3および1.5で追加されたCalendarモジュールと日時型の説明が追加されました
Timexで昔、イイ感じになった私は、未だにこの付近をキャッチアップしていません
4.7 名前、ソースファイル、習慣、演算子など
- P34
- 「文字」がUTF-8文字のいずれか、「数字」がUTF-8の10進数の数字、といった定義が追加
- 有効な変数/無効な変数のサンプルが追加
- キャメルケースのサンプルが削除
- P35
- Elixir 1.6で追加されたコードフォーマッターの解説が追加 ※予想通り、追加されてましたね
- 比較の優先順位が、妙なところで改行されなくなった、見やすい ※本のサイズが大きくなったことで、こういうみやすさの改善が他にも見られます
- P36
- 「in演算子」の解説にマップの説明が追加
4.8 変数のスコープ
- P36
- 「Doブロックスコープ」が追加 ※第1版がwith式始まりでトリッキーだったので良い改善
- forへのリンクが削除 ※ここも第1版はややストレートで無い展開だったので良い改善
- P38
- withコード例に対する補記として「コードフォーマット比較」が追加
第5章「無名関数」
5.4 関数を引数として渡す
- P49
- 「&補足演算子」を文字列やリテラルに適用した場合の例が追加
第6章「モジュールと名前付き関数」
6.4 ガード節
- P59
- 「型チェック関数」と「その他の関数」がインデントが揃って見やすくなった
- P60
- 「ガード節 vs 条件分岐」が追加 ※達人プログラマーで言うDBC的内容で個人的にエモい
6.5 デフォルトパラメータ
- P61
- コンパイル時のエラーメッセージがErrorからWarningに変更
6.7 素晴らしきパイプ演算子 |>
- P63/64
- salex_tax()の引数が2016から2018に変更
6.10 モジュールの名前:Elixir、Erlang、そしてアトム
- P69
- IOモジュールを変数my_io経由で使えるサンプルの追加
第7章「リストと再帰」
7.5 リストを単一の値にまとめる
P76~78、第1版の「再帰中の値の保持」から大幅に変更されています
第1版では、sum関数を解説しながら、計算途中の値保持について解説した後、sumをreduceへと抽象化する展開でしたが、第2版では、その前節のmap関数との比較として、集約の必要性を解説して、最初からreduce関数でsum関数と同等のものを作っていて、展開がクイックかつシンプル化されています
7.6 より複雑なリストのパターン
P78~81、内容的には第1版と変わっていなかったのですが、第1版では4ページに渡って白黒でコードがガリガリ書かれた脱落ポイントだった訳ですが、フルカラー化されたことで、第1版にあった読みにくさは、だいぶ解消され、順を追って進められる感が高まっています
第8章「マップ、キーワードリスト、セット、構造体」
序文
- P83
- 構造体や、ネストしたマップについて追記
- 辞書型のパターンマッチやKeywordモジュール、MapSetモジュールについての記載が削除
8.1 マップとキーワードリスト、どちらを使うべきか
- P83
- 構造体を使うケースが追加
- P93/94
- 「Accessモジュール」が追加(all/at/elem/key/key!関数)
8.9 大いなる力には大いなる誘惑が伴う
エモいパートの言い回しが、第1版と第2版で微妙に違っているので、ぜひ見比べてください
第9章「寄り道:型とは何か?」
内容およびコードサンプルは、第1版とほぼ変わっていないです
第10章「コレクションの処理 - EnumとStream」
10.2 ストリーム - 遅延列挙
- P109
- コメントが日本語化されている
第11章「文字列とバイナリ」
11.1 文字列リテラル
- P119
- シジルのタイプに「~D(日付)」が追加(サンプルも)
- シジルのタイプに「~N(ネイティブデートタイム)」が追加(サンプルも)
- シジルのタイプに「~T(時刻)」が追加(サンプルも)
11.5 ダブルクォート文字列はバイナリ
- P126~130
- jaro_distanceが追加
- ljustが削除
- lstrip(2つ)が削除
- myers_differenceが追加
- pad_leadingが追加
- pad_trailingが追加
- rjustが削除
- rstrip(2つ)が削除
- strip(2つ)が削除
- trimが追加
- trim_leading(2つ)が追加
- trim_trailing(2つ)が追加
- valid_characters?がvalid?に変更
第12章「制御フロー」
序文
- P133
- 「ifやcase」が「caseやcond」に変更 ※ifを避けた模様w
④中身のアップデート(基礎ツアー以降部分)
ここから先は、基礎ツアー部分ほど、細かくdiffを出さず、大雑把な違いのみ触れます(触れていない章は、あまり変わっていない)
第13章「プロジェクトを構成する」
第1版では、文字の連続で読みにくかったですが、カラー化により、だいぶ読みやすくなってます
第14章「ツールの利用」
pryやExUnitProperties、excoveralls等のデバッグ/テスト機能や、mix xrefによるコード依存関係の確認、:observer.startサーバモニタ、mix formatをキャッチアップしたい方は読んでください
第16章「ノート - 分散システムの要」
MacOS Xで複数ノードを扱うテクニックについて補足されています
第17章「OTP:サーバ」
「17.6 サーバをコンポーネントにする」は、副作用の分離についての話題で、最近のElixir Digitalization Implementorsでもホットな話題でした
第18章「OTP:スーパーバイザ」
P250~255が、「18.2 ワーカの再起動オプション」の新設も含め、アップデートされています
第19章「さらに複雑な例」
Supervisorの実用的な例があります
あと地味に、P272のコラムに、ループ関数を実装せず、メッセージで自己呼出をすることの重要性について解説あります
第20章「OTP:アプリケーション」
実用的なリリースマネージャであるDistilleryについてキャッチアップしたい方は読んでください
第24章「プロトコル - ポリモーフィック関数」
P334以降のサンプルが、だいぶ変わっていて、MIDIファイルの処理にすげ替えられています
付録D「Elixir 1.6以降の状況と開発運用の実際」
ここは、日本語版だけの特典です
@ohr486 さんによる追加章で、主にリリース周りと、本番環境(PaaS/サーバ/コンテナ)について、実践的な解説がされています
付録E「日本語版に寄せて」
ここは、日本語版だけの特典です
José さん、日本で桜、見れて良かったですね
長期的な互換性を重視している点は、このコラムで前半に書いたことに似た内容で、同じテイストを共有できていることが嬉しかったです
最後に
トータルとして、「プログラミングElixir 第2版」は、第1版よりも読みやすく改善されているので、これからElixirをはじめる入門者や、第1版で脱落してしまった方には、とてもオススメです
また、新人さんや他言語プレイヤーにElixirをキャッチアップしてもらう立場の方にも、「プログラミングElixir 第2版」は、手渡しやすい1冊にアップグレードされていますので、ぜひ目を通してみてください
p.s.このコラムが、面白かったり、役に立ったら…
明日の記事は、エリジョ(Elixir女子部)のオーガナイザー、@gkumi5638 さんの「Elixirでバリデーションを実装してみた」です