Grokking Functional Programming

2014年にManningのEarly Access Programで購入したもののずっと未完成のままだったので電子積読されていたのですが、昨年ようやく完結したようで、さらに今年になって日本語版も発売されたとのことで9年の歳月を経て読んでみました。

モナドという単語が一度も登場しないあたりからも本書の方向性がわかるのではないかと思いますが、関数型プログラミングのエッセンスを、実践的なプログラミングにおけるメリットと共に丁寧に解説されています。サンプルコードはScalaで書かれているのですが、特にScalaのことを知らなくても読めると思います(というかScalaを知っているのであればこの本の半分以上は読む必要ないかもしれません)。もちろんScalaについても本書を読み進めるのに必要な範囲で解説はされているのですが、通常であれば早い段階で説明するようなことがかなり後半で出てきたりと、あくまで関数型プログラミングを学ぶことに主眼が置かれています。

参照透過性や不変値、代数データ型からIO、再帰、ストリーム、非同期処理と進んでいき、分量もかなりあるのですが、節が細かく区切られており、テンポよく読み進められますし、参照透過性、不変値などのメリットはプログラミングにおける一般的なベストプラクティスとしてすでに広く認識されていると思いますのでこのあたりは読み飛ばしてしまってもよいかもしれません。また、図や吹き出しが多用されていたり、一段落するごとに振り返りやコーヒーブレイクが入ったりと、読みやすくなるよう工夫されており、これが分量が多い理由の1つでもあります。ですので分量があるといっても読んでいて実際のページ数ほどの負担感はありません。関数型プログラミングのメリットの1つであるテスタビリティにもちゃんと触れられているのも良いですね。

日本語版は読んでいないのですが、実践的な関数型プログラミングの入門書としておすすめできる一冊なのではないかと思います。非関数型のプログラミング言語を使う場合でも活かせる内容だと思いますので普段関数型プログラミング言語をお使いでない方にも是非読んでいただきたいです。

ScalatraのJakarta版をリリースしました

地道にメンテしているScala用のWebフレームワークScalatraですが、Scalatraベースで開発しているGitBucketで使用しているJGitのJGitServletはいまだにServlet 4.0という超個人的な事情でScalatraの対応Servletバージョンも上げられなかったのですが、さすがにそろそろ必要かというのとユーザさんからの要望もあったのでJakartaServlet 5.0)版を別でリリースすることにしました。

github.com

Scalatraのバージョンと対応するScalaServletのバージョンは以下の通りです。

Scalatra Version Status Scala versions Servlet version
3.0.0-M4-jakarta Milestone 2.12, 2.13, 3.3 5.0.0
3.0.0-M4 Milestone 2.12, 2.13, 3.3 4.0.1
2.8.4 Stable 2.12, 2.13 3.1
2.7.1 Stable 2.11, 2.12, 2.13 3.1

Scalatra 3.0はM1から1年近く経つもののいまだに正式版をリリースできていないのですが、これは依存ライブラリの1つであるTwirlScala 3.0対応版がまだ正式版になっていないからなんですよね…。ScalatraのTwirl連携は今のところフォーム生成用のビューヘルパーだけなので、連携機能なしでリリースしてしまってもいいかなと思ったりも…。

追記:今回はブランチ切ってjakartaに書き換えたものをpublishしたのですが、xuwei-kさんがクロスビルドするようにしてくださっていました。

github.com

System Design Interview – An insider's guide

Amazonで見かけて評判が良さそうだったのとKindle版が安かったので読んでみていました。

ソフトウェアエンジニアの面接でのシステムデザイン課題に関する書籍で、様々なシステムを題材に設計例を紹介する、というものです。要件の確認や、まずシンプルな設計から始めて詳細を詰めていくなど面接に沿った流れになっているのですが、この流れは普通に読み物としても読みやすいです。図も多く、英語も簡単でかなりサクサク読むことができました。

2020年に出た書籍ということで題材に若干時代を感じるものがあったり、後半に進むにつれシステムの題材が大規模なものになるせいか設計例にエアプ感が出てくるような気がしなくもないですが、面接の限られた時間でできる範囲ですのでこのくらいで丁度いいのかもしれません。

コーディング面接と比べるとシステムデザイン面接は実践的と言われますが、題材がふわっとしていて自由度も高いので面接官側はかなり難しいんですよね。コーディング面接よりもよりコミュニケーションが重要になりますし、ナビゲーションを一歩間違えるとあらぬ方向に行ってしまったり…。実際に自社で開発・運用しているシステムを題材にするのも勘所があまり一般的ではなかったりで実は結構難しかったりします。本書は受験側だけでなく出題側にも参考になるのではないかと思います。

なお、後から知ったのですが、最近日本語版も出ていたようです。Amazonのレビューを見ると翻訳がイマイチなようですね。

また、2022年には原著の続編が出ているようで、さらに様々なシステムが題材として取り上げられています。こちらはKindle版はないみたいで、ペーパーバックだとなかなかいいお値段なのでちょっと気軽に読んでみるというのは躊躇してしまいそうです…。

スタッフエンジニア マネジメントを超えるリーダーシップ

先日原著の感想文を書きましたが、日経BPさんから増井雄一郎さんの監修・解説で日本語版が発売されました。実物を見るまで半信半疑でしたが私のインタビューも掲載いただいています。

オンラインでも書籍に連動した記事が掲載されています。

bookplus.nikkei.com

type.jp

また、原著の紹介でも書いた通り、本書の後半部分は各社のエンジニアのインタビューになっているのですが、一部のインタビューの内容を抜粋したものが日経クロステックさんに掲載されています。どんな内容か気になっている方はまずはこちらを参照されるとよいのではないかと思います。

xtech.nikkei.com

このような素晴らしい書籍に私のインタビューを掲載いただくなど恐れ多いことですが、少しでもどなたかの参考になりましたら幸いです。自分自身もこれまでのキャリアの振り返りと今後の身の振り方について改めて考える良い機会になりました。大変貴重な機会をいただきありがとうございました。

Staff Engineer: Leadership beyond the management track

近々日本語版も発売されるこちらの書籍ですが、現職での自分のタイトルが(今年の3月までは)スタッフエンジニアだったということもあり、以下の記事にも出ている通り、本書の日本語版に収録するためのインタビューをしていただいたのですが、インタビューを受けるにあたって原著の内容を把握しておいた方がいいだろうということでざっと目を通してみていました。

bookplus.nikkei.com

前半はスタッフエンジニアについての解説、後半は海外の有名テック企業のスタッフエンジニアたちのインタビューという構成になっています。日本だとスタッフエンジニアという呼称はあまり一般的ではないと思いますが、要はソフトウェアエンジニアの上級職で、本書でも言及されているように一言でスタッフエンジニアと言ってもいくつかのタイプに分類されます。アーキテクトやテックリードはもちろんですが、チームリーダーやプロジェクトリーダーといった役割で働いているソフトウェアエンジニアの方もこの書籍で扱っているスタッフエンジニアの範囲に含まれるのではないかと思います。

前半部分は割とあっさりめではあるのですが、そもそもスタッフエンジニアとは何なのか、スタッフエンジニアとして働く際のアドバイス、スタッフエンジニアになるにはどうすればよいのか?といった内容で、自分自身もスタッフエンジニアの役割について認識を整理することができましたし、現実的な(身も蓋もない)アドバイスもあったりで面白かったです。

後半のインタビュー部分に関しては、当然のことながら会社やその方の状況によって言っていることは様々なのですが(同じような立場の方は同じようなことを言っていたりもします)、多くのインタビューが掲載されておりインタビュイーのバリエーションも豊富なので、特定の意見に偏らずバランスが取れているのではないかと思います。自分の立場に重なるインタビューもあれば、自分とは全く状況が異なる方のインタビューを読むのも参考になるでしょう。

結局のところ、スタッフエンジニアとして働くということは「一定以上に成長した企業のエンジニア組織の中で働く選択をする」ということを意味するわけですが、ソフトウェアエンジニアとしての将来のキャリアパスについて考えている方、すでにスタッフエンジニアもしくはタイトルは違えど同等の役割で働いている方にとっては何らかのヒントが得られる書籍なのではないかと思います。また、逆にある程度以上の規模のエンジニア組織を運用する側の立場の方も上級エンジニアの必要性や使い所を学ぶことができるのではないかと思います。

日本語版は5月発売だそうです。こちらには日本人の原著の内容に加えて日本人スタッフエンジニアのインタビューも収録されているとのことですが、まだ実物を見ていないので本当に私のインタビューが収録されているのかどうかはわかりません!

GitBucket 4.39.0をリリースしました

Scalaで実装されたオープンソースのGitサーバ、GitBucket 4.39.0をリリースしました。

https://github.com/takezoe/gitbucket/releases/tag/4.39.0

カスタムフィールドでenum型をサポート

イシュー、プルリクエストのカスタムフィールドで複数の選択肢から値を選択可能なenum型をサポートしました。

カンマ区切りで選択肢を登録しておくとイシュー、プルリクエストの作成、編集時にプルダウンリストから値を選択できます。

巨大なdiffはデフォルトでは非表示に

差分が巨大な場合、画面表示に時間がかかるという問題を解消するため、1000行以上の差分があるファイルはデフォルトではdiffを表示しないようにしました。必要に応じてShow diffリンクをクリックすることでdiffを表示できます。

複数台構成で動作させるためのオプションを追加

GitBucketを複数台構成で動作させる場合に必要な以下のオプションを実験的に追加しました。

  • --disable_news_feed
  • --disable_cache

詳細については以下の記事も参照してください。

takezoe.hatenablog.com

ただし、これらのオプションは実験的なものであり、GitBucketが正式に複数台構成での動作をサポートしたわけではないという点にご注意ください。

今回のバージョンではこの他にもWeb APIを中心に様々なバグフィックスを行っています。詳細についてはIssueの一覧をご覧ください。

AirSpecのテストケースをIntelliJ上で実行するプラグインを作った

仕事でAirSpecというScala用のテスティングフレームワークを使っているのですが、特定のテストケースをIntelliJ上で実行できないのが不便だなーと前々から思っていたのでプラグインを作ってみました。IntelliJScalaプラグインやZIOプラグインのテストサポートを参考にしました。

github.com

JetBrainsのプラグインリポジトリにはpublishしていませんが、GitHubのリリースページからアーカイブをダウンロードしてインストールできます。

github.com

インストールするとこんな感じでテストケースにマーカーが表示されるようになり…

クリックすると実行できます。

テスト結果のビューからテストケースにジャンプする機能は実装できていません。テストケースのソースコード上の位置を取得する必要があるのですが、良い方法が思いつかず…。

IntelliJ上でテストを実行するとテストランナー上でテストが実行されるのですが、IntelliJはテストランナーが標準出力に出力したTeamCityのサービスメッセージ形式のテキストから情報を取得しているようです。今回作成したプラグインでは若干アドホックな方法でAirSpec自体に含まれているテストランナーを流用しつつメッセージを出力する機能を追加しています。

www.jetbrains.com

いくつか細かい問題はあるものの、ひとまず自分で使うには十分なものができたので満足です。