Serverlessconf Tokyo で Durable Functions にコントリビュートしました

この記事は Serverless2 Advent Calendar 2018 の 3日目の記事です。

先日、 Serverlessconf Tokyo 2018 Contributor Day に参加し、その活動の一環として Durable Functions へのコントリビュートにチャレンジしました。

ちなみに Durable Functionsは、OSSであるAzure Functionsの拡張です。Durable Functionsについては @sandayuu のスライド「”サーバーレス”を超越する。なぜ?から理解する Durable Functions」で理解するのがオススメです。

Serverlessconf Tokyo 2018 Contributor Day

@sandayuu のススメもあり、既存のIssueとしてあがっていた、Durable FunctionsのHTTP APIとして提供されている、ステータス取得APIにページング機能を拡張するというIssueの解決を担当しました。最初はページング機能の追加くらい大したことないだろうと考えていました。実際、実装もそれほど難しいことをしているわけではありませんが、Azure Functionsのように世の中で広く使われているプロダクトへのコントリビュートで得られるものは非常に幅広く、いろいろな意味で勉強になりました。

PR中はいろいろありつつもなんとか無事にマージされ、Durable Functions の v1.7.0 Release にコミットが含まれたことで、Durable Functionsのコントリビュータという称号を得ることはできましたが、それよりも大切なことを沢山得ることができました。

Publicなインタフェースを安易に追加しない

Durable Functionsは、世の中で幅広く使われている Azure Functions の拡張機能の一つです。Breaking Changeへの考慮はもちろん、Publicなインターフェースの追加も慎重に検討しなければなりません。このケースでも安易に拡張対象の元のインターフェースに合わせて public にして実装していたところ、メンテナである @cgillum から速攻ツッコミが。

publicインターフェースに対するツッコミ

しばらく悩んだ挙げ句、今回追加したオーバーロードのみ internal に設定するという判断をしてみました。拡張対象だったGetOrchestrationStateAsyncというメソッドが、もともと全てpublicだったので、統一性という点で多少違和感がありましたが、@cgillum もこの判断をあっさり受け入れてくれました。やはり、むやみにインターフェースは公開すべきではないということでしょう。

自分が正しいと思ったことは堂々と説明するべき

PRでのやりとりで、追加したHTTPヘッダーの値が特定のケースでEmptyになる点を突っ込まれました。しかし、このユースケースでは明示的にEmptyにすることに意味があったので、つたない英語でアピールしてみました。

インターフェースの仕様について必死にアピール

自分が強く思っているということが伝わったのか、これはあっさり受け入れられることに。英語は下手でもなんとなく情熱は伝わるようです。

その他、ユニットテストの実装でも、Moq関連で仕方がなくAssemblyInfo.csに手を入れなければならない事態になり、ここもすかさずツッコミを受けますが、Moq公式の出所を示すことで無事通過。公式は重要です。

公式の出典を猛烈にアピール

あたりまえですが、Durable Functionsには大量のユニットテストがあります。しかも、同じテストをV1とV2環境で実行しなければならないので、手元のVisual Studioでのテスト実行では非常に時間がかかります。Durable FunctionsではCIが動いてはくれますが、まず手元の環境で検証が必要なので仕方がないです。そういう意味でも早くV1は消滅してほしいところです。

公式ドキュメントへの反映も必須

Durable FunctionsはOSSですが、Microsoft Azureのプロダクトでもあるので、Azureの公式ドキュメントである docs.microsoft.com への貢献も必須となります。もちろん英語ドキュメントです。今回、実装の変更自体はそれほど大きくはなかったのですが、ドキュメントにするとそれなりのボリュームになり、思ったより苦労しました。しかし、ここでも @cgillum が申し訳ないくらいに細部まで添削してくれて、無事ドキュメントもマージされました。

docs.azure.comの該当部分

Durable Functionsはとても気に入っているプロダクトですが、それなりに仕組みが複雑なのでContributorになるのは敷居が高いだろうなと思っていましたが、 Serverlessconf Tokyo 2018 Contributor Day という機会があったからこそ実現できたのだと思います。Serverlessconf運営のみなさま、PRをサポートしてくれた @sandayuu@cgillum には感謝しかありません。今後も機会を作って貢献できるように精進します!