Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

2023年に読んでよかった本

記事にしたやつ

職場でオススメされた「両利きの経営」を読んで記事にしました。「知識創造企業」もオススメされているので来年読みたい。

blog.kengo-toda.jp

医療関係

医療関係エンジニアのはしくれとしてある程度の情報収集は心がけているのですが、今年読んだ中ではこの「再考・医療費適正化」がダントツで面白かったです。医療費問題は医療の持続可能性を考える上で避けて通れないのですが、実は地域性も色濃く出る問題なのだということがよくわかりました。

医療情報技術関係の雑誌もいくつか試していますが、現時点では新医療がダントツで読みやすいです。特集もセキュリティ寄りの医療情報技師である自分の関心に近いものが多く、また連載もけっこう楽しいです。多要素認証は大切だけど、医療現場でどう運用するんだ*1みたいな疑問もきちんと掘り下げた話を載せてくれていたりします。医療情報技師なら事業者側でも医療機関側でも読んで損はないんじゃないでしょうか?

エンジニアリング

大工に縁のある人生だしマイクラみたいなゲームも好きだしエンジニアリングでご飯を食べてもいるので、建物や設計についてはちょいちょいつまみ食いをしています。今年読んだ中では「一級建築士矩子の設計思考」が面白かった!図面を書くときのワクワク感がすごい伝わるし、設計や構築の裏側にある考察や気配り、法制度なども見えてきて知識欲が満たされます。

お酒や建築関係の知識がちょいちょい出てくるのも面白く、私はこのコミックスをきっかけに最寄りの蔦屋書店で商店建築を買うなどしました。都心の呑んべぇにはまた違った価値がある本なのだろうと思います。

こっちの「船の科学」も良かった。モジュールごとに開発して最後に組み上げるとか、納品前に性能試験をするがその際のやり方が国際的に決まっているとか、こちらもソフトウェア開発に通じるところがありそう。

ソフトウェアエンジニリングの現場感というか勝ちパターンのようなものが見えてくると、こうして外の分野におけるやり方から学ぶことで変な常識を頭から外せると思っているのですよね。そういう意味でシステム開発のワークフローを作っている人には参考になると思いますし、もちろんものづくりのプロセスやその背景にある科学について興味がある方もぜひ読んでみたら良いと思います。

その他

「結婚するって本当ですか」完結おめでとうございます!ラブコメで引き込みつつも、わかりやすくデフォルメされつつも丁寧な描写で家族や愛について考えさせてくれる名作です。この家族がこれからも幸せに生活できることを願っています。

「ダンジョン飯」完結おめでとうございます!モンスターを食うという奇天烈さをもって売り込まれた第一巻でしたが、完結まで追ったら普遍的かつ本質的なテーマを地盤に持っていたのだと再発見させる内容でした。また最初から読み直したら新たな発見がありそうです。

「誰も農業を知らない」子供に何を食べさせるかを日々考える立場として、とても考えさせてくれる内容でした。遺伝子組換え作物も農薬も、こうしてきちんと論じられると有り難みがわかりますね。どちらも(自分の中では)最初の印象でだいぶ損をしていたので、こうして実態を再整理して認識しておくことは今後の生活に役立つと感じました。

そして最後、今年読んだ一番面白かった本を聞かれて答えたのがこちらの「うんち学入門」です。対話を通じて掘り下げる書き方をしていて変わっているなぁというのが第一印象でしたが、その書き方が内容にマッチしていてすごく読みやすいんです。本としての起承転結に結びつくのもそうですが、すでに学んだ内容とのつながりの指摘や新たな疑問点の提示などがキャラクターによってなされることでここまで科学的な読み物が読みやすくなるのか!というのは感動的な発見でした。

この本には組成のようなうんちそのものについてももちろん書いてあるのですが、うんちを起点とすることで生物や進化、生態系まで幅広く学べるのが特徴的です。知識欲を満たすのに最適な一冊だと思います。

*1:手袋マスク装着とか、短期契約の働き手が多いとか、固有の問題が多い

2023年のOSS活動状況まとめ

昨年のに引き続きOSS活動状況をまとめます。2022年12月16日時点の情報です。

概要:OSS活動はもっと減った

GitHubのプロファイルページによると今年は8,153 contributions、過去最多でした。ただこれはprivate repoでの活動を含む値で、これを除くと514 contributionsと昨年や一昨年よりも少ない数値になりました。 昨年以上に減りましたね。ただ昨年7月に転職していることを考えると、昨年7月以降のContributionペースはあまり変わってはないのかも(昨年の方が多いのは1〜6月の影響が大きいか)。

図1 Private Repoの貢献を含まない値
図2 Private Repoの貢献を含む値

自分でメンテナンスしているもの

だいたい絞れてきている感じです。gradle-semantic-release-plugin470リポジトリで使われていて、代表作になりつつあります。

actions-setup-docker-composedocker compose コマンドの登場を受け、今後メンテナンスモードに入れていきます。 errorprone-slf4j はもう自分では使ってないので、当該コードをerrorproneあたりに寄贈するべきなのかもしれない。

あとはいくつかの実験的実装プロジェクトを走らせていますが、あまりコミット数は無いですね。

貢献しているもの

現時点ではほぼ一点のみです。これもやっぱり自分では使ってないですが、Gradleプラグインの新しい機能や実装を試すのにちょうどいいサイズだというのと、統合テスト自動化をしっかりやったので安心して開発できるのとでしばらく手を入れていくとは思います。

できれば自分が今使っているツールのプラグインを書きたいので、引き続きアンテナを立てていければと思います。

SLF4JとLogbackは2023年末現在で積極採用していいよ

2年前のブログが未だにブクマされるので、念のため掲題の件について書いておきます。 端的に書くと、あのブログで挙げた懸念事項が解消されたのでどんどん使うと良いと思います。

SLF4J v2の安定版がリリースされた

良かったですね。ちなみにv2.0.9から slf4j.provider プロパティでproviderを指定できるようになったので、Service Loaderによるprovider探索をガツッとスキップできます。多くのユースケースでは利用したほうがログの単純化や起動の高速化に有効のはずです。

SLF4Jの活動は最近活発

JIRAのデータを見れば一目瞭然。私もGitHub Issueで回答に回ったりしますが、著者の方も頻繁にコメントしてくれてます。最近のLogbackの脆弱性への対応も充分に早かったのではないでしょうか。

図1 2023年の活動状況。緑の線が6ヶ月近く右肩上がりなのに注目。
図2 比較用に前回のブログに貼ったやつ。緑の線がほぼ横ばい。

ということで、好きにすればいいと思います。もちろんLog4j2も適材適所でどんどん使っていきましょう。

おまけ:依存を小さくするためという誘惑に負けずにSLF4J使っとけ、という話

SLF4Jを使ったソフトウェアを配布される方、最近なかのひとがこちらの投稿をされていたのでご参考まで。

ChatGPTによる要約を掲載しておきます。なおここで言うoptional dependencyとはMavenで言う <optional>true</optional> な依存のことではなく、独自のログAPIを提供したうえでクラスパスにSLF4JがいるかどうかによってそのAPIの挙動を変える書き方を想定していると思われます。

このテキストでは、ソフトウェアプロジェクトがロギング戦略を考える際に、SLF4Jを任意の依存関係にすることについて議論しています。SLF4JをWombatというライブラリの依存関係に加えることは、新しい依存関係を生み出します。一部の開発者はSLF4Jのラッパーを作成して、SLF4Jを任意の依存関係にすることを検討するかもしれません。しかし、このラッパーは将来的な変更に対して複雑さを増すだけでなく、SLF4Jの内部インターフェースに依存するため、メジャーバージョンによる互換性の問題が生じる可能性があります。さらに、各ライブラリが独自のロギングラッパーを持つと、ユーザーは複数のロギングフレームワークを扱う必要があり、これは利用者にとって煩わしいことです。そのため、開発者は独自のロギングラッパーを書くことに抵抗すべきです。

私は最近gRPCを使うんですが、あれはJUL(java.util.logging)のロガーに依存しているので、jul-to-slf4j とかいうおまじないを強制されるんですよね。こんな感じのコードを main() 直後に埋めて回る必要があるわけです:

// io.grpc がJULを使っているため、JULがSLF4Jを経由してLogbackに送るようにする
SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

Java標準APIでさえこれなのに、配布ソフトウェアが独自のログAPIを提供していたらもっとめんどくさいだろうなというのは想像できます。JVM世界でコードを書くなら難しいことを考えずにSLF4Jに乗っとくくらいがちょうどよいのは実際そうでしょう*1

*1:NodeJS書いてるとまともなロギングファサードのあるJVM世界がすごい羨ましくなるやつ

プログラマのフルリモートワークにダジャレが向いている理由とその功罪

株式会社ヘンリーでSREなどをやっている id:eller です。 この記事は株式会社ヘンリーAdvent Calendar 2023の4日めの記事です。一昨日の記事はkobayangさんのアラートを早く上げる・早く拾うでした。

さて、以下は筆者の日頃の業務を切り取った図です。みなさんはこちらを見て、どのように思われますでしょうか?

図1 ひろく協力を呼びかける図
図2 社内規定の浸透を試みる図
図3 新入社員の皆様に対して規定の確認をリマインドする図

なんだコイツ偉そうだなとか、真面目そうとか、厳しそうとか、そういう印象をお持ちの方が多いのではないでしょうか。実際は柔らかく優しい人格かもしれないし、いつもニコニコして話しやすい人かもしれないし、背後で体調悪くて学校を休んだはずの小学生が飛び跳ねてるかもしれないですが、そういう個性や雰囲気はチャットに頼りがちなフルリモートではなかなか伝える機会がないものです。

書かなければ伝わらないが、書いてるものは個人のイチ側面しか反映していない

本日お伝えしたい最大のトピックは「フルリモートワーク環境においては、書かなければ伝わらない」です。大切なのでもう1回くらい書いておきましょう、人間「書かなければ伝わらない」のです。そしてそれは「書いたものから伝わっていく」ことと同義です。

私の今のロールはSREやセキュリティで、社内規定策定とか認証取得とか開発手順策定とかのウェイトが大きく、どうしても依頼・強制に関する書き物が増えます。これが続くと「社内の自由を狩り尽くし、総てをコントロール下におきたい管理者」像が確立される可能性すら否定できません。そしてセキュリティは従業員の日頃の意識や協力体制に強く立脚するもので、この像は目標達成の障害にはなれど強みにはならないと言えるでしょう。

他の側面を露出することがフルリモートワークを円滑に進めるためには重要

そしてこの実体と印象の乖離問題はほかのエンジニアにも常につきまとう問題だと感じています。例えばプログラマにつきものの「PRレビューを個人攻撃として受けとられてしまう」問題も、PRレビューの内容やその言葉遣いから受ける印象をその筆者そのもののイメージと混同してしまうことに起因します。PRレビューで使う言葉を優しく簡潔なものにしたとしても、この問題は完全に解決することにはなりません。PRレビュー以外のコミュニケーションを増やしてその人の他の側面に光を当てることで、はじめて解決されます。

ちょっと前に弱みを見せることが重要なコミュニケーションであるという議論が活発になされていたように思います。それと同じで、仕事を円滑に回してお客様に価値を届けるためには、ドライなプロフェッショナリズムだけではない人間としてのウェットなコミュニケーションも重要ということですね。

cybozushiki.cybozu.co.jp

この問題の解決としてよく知られているのは分報でしょうか。またSlackではソーシャルチャンネルという、仕事に関係のない話をする場を設けることも提案しているようです。業務だけの関係では見せられない側面を開示する機会を作ることが色々と模索されている時代だと言えるでしょう。

プログラマという言葉のプロフェッショナルにはダジャレが適している

さて前置きが長くなりました。いよいよ本題であるダジャレについて触れていきましょう。

私のようなプログラマという生物は、常に言葉に対する高いアンテナを張っています。一見同じような言葉、例えば「作る」「創る」「造る」「つくる」のうちどれが最も文章に当てはまるものなのかと悩んだり、いやこの行為は何かを作るのではなく別世界から召喚しているのでは、あるいは既に存在するものを空間に投影しているだけなのでは、そもそもこれを作っている人はなぜそれを作っているのだろうか……などと際限なく考えることを生業としています。

そんなはずはと思われた方、隣のプログラマを捕まえてみて「名付けに悩んだことある?」と聞いてみてください。まず間違いなく、ほろ苦い体験をひとつやふたつ持っているはずです。

プログラマとは作家のようだ、と思われた方は本質をついています。プログラムとは人間にもコンピュータにも読んで理解できる文章であることが求められるため、プログラムとは文芸であると言っても過言ではないのです。よって良いプログラマは良い作家のように、語彙や類義語や対義語といった表現のストックが増えていき、言葉に対する「深み」が自然と醸成されます。

それと同時に物事をシンプルに伝えるための比喩・抽象・近似という道具も扱うようになり、全く異なるものから似た概念を見出すことすらできるようになるのです。画面の中のナニカに対してプログラマが「生きてる」「死んでる」などと表現するのは、非生物に対して生物的な特徴(ライフサイクル)を見出しているからにほかなりません。そしてプログラマが非生物の中に生物らしさを見出すにとどまらず、生物らしさを生み出しうる存在であることは、以下に挙げる著作や最近の生成AIのトレンドを見ても明らかでしょう。

techbookfest.org honeshabri.hatenablog.com

そして言葉に対する深みと抽象を扱う能力、これら2つが融合する総合芸術こそがダジャレなのです。ダジャレこそがフルリモートワークにおいて自らの側面を見せ、業務上関係の薄い人へもアプローチでき、プログラマにとっては主たる能力と関心を発揮する類まれなるソリューションであることは疑いの余地がありません。

いやいやそんなまさか、とお考えの方、無理もありません。しかし例えば以下の投稿で紹介したGoogleの事例は、7年前から今日というこの日まで認められ、親しまれ、愛されてきているわけです。業界をリードする企業がメンテナンスする著名OSSプロダクトでこれなのです。フルリモートワークにおいてもプログラマにとって有効なソリューションとなるであろうことは疑いの余地はありません。

最後にもうひとつ実例として、私の事例とその効果を見てみましょう:

図4 大型会場で登壇する同僚を励ます図
図5 真面目な話の腰を折ってしまったかもしれない図
図6 モラル以前の何かが足りない図
図7 たまには笑ってもらえる図

こんな自由奔放なやつが「社内の自由を狩り尽くし、総てをコントロール下におきたい」人のはずがない、ということは容易に伝わるかと思います。むしろ自由さを今後も維持できるのか、と心配されています。

図8 CEOに心配される図

いいですね。なんか他のことを気にしたほうがいいような気もしますが、当初に挙げた懸念は払拭されたのでヨシということにしましょう。

まとめ

フルリモートワークでは書いたことだけが相手に伝わります。依頼・強制に関する書き物が多い立ち位置にいるプログラマは、その能力を活かしてダジャレを投稿することで自由を束縛する機械的なヤツであるという印象を打ち破ることができます。ウェットなコミュニケーションのきっかけにもなりますし、同僚を勇気づける・クスッとさせることもできますし、一石三鳥です。あなたもぜひ。

株式会社ヘンリーAdvent Calendar 2023、明日はgiiitaさんの「全ての台所へ贈る浸透圧」を予定しています。お楽しみに〜。

補足

spotbugs-gradle-plugin v6の安定版をリリースしました

spotbugs-gradle-plugin v6のリリース候補版(RC版)をお試しください で紹介したバージョン6の安定版が出ました。

今回の大きな目的はGroovyとJavaの混成で書かれていたプロジェクトをKotlinで書き直すこと、最新のAndroid開発環境でのテストに対応することにありました。ユーザから見た違いとしてはJava 8が使えなくなったことと、effortreportLevel 周りで書き直しが必要になったことが特筆すべき点で、その他は大きな変更はありません。詳しくはリリースノートをご覧ください。

github.com

今回のリリースは特にコミュニティで求められたものではなく、GradleがKotlinを推していく姿勢が明確になったことと私がGroovyでの開発に限界を感じたことを原動力として、ほぼ私個人で行いました。このつらみについては以前集まれKotlin好き!Kotlin愛好会 vol.47で話した資料にまとめています:

speakerdeck.com

それでもレビューをしてくれたチームと、メジャーリリース向けの変更をIssueの山から拾ってくれた・適したIssueを切ってくれたユーザには、大変ありがたいと思っています。ありがとうございました。

AccelerateとState of DevOpsをもとにした、DevOps問題意識の移り変わり

Accelerate 第1版(以下単にAccelerateと呼ぶ)はDevOpsに関するトレンドを抑えるうえで基本となる本なのですが、もはや古く最新の知見が書いてあるとは言えません。State of DevOpsは毎年アップデートされているのですがコンテキストを丁寧には抑えてくれず、背景を含めて読み解くのが難しいという印象があります。どうもAccelerate 第2版がそろそろ出るらしいんですが、とりあえず現時点での自分の理解をまとめておきます。

端的に言うと、これらは安定したソフトウェアを高速に顧客に提供できる良い開発チームの特徴を踏まえ、皆さんの組織で再現可能にするための研究であり指針です。当然「良い開発チームがあれば常に良い問題解決ができる」というわけでも「ここで定義された良さが組織問わず普遍的である」というわけでもありませんが、顧客の課題に立ち向かうための組織設計において良い仮説を提供してくれるはずです。

「こんにちのソフトウェア開発組織はどうあるべきか」を示す研究

Accelerateでは24個のケイパビリティ(組織全体やグループとして保持する機能や能力)を提唱しており、それらの実践を推奨しています。これらのケイパビリティは以下のカテゴリに分類されます:

  1. 継続的デリバリ
  2. アーキテクチャ
  3. 製品とプロセス
  4. リーン思考に基づく管理と監視
  5. 組織文化

State of DevOps Reportはこの流れを汲み、ハイパフォーマーは何をして、結果として何を得ているのか?ハイパフォーマーに近づくために何をすべきなのか?を明確にしています。Exective Summaryをざっとまとめると以下のような要素を深堀りしています:

  • 2018: クラウド、OSS、組織文化、アウトソーシングなどの組織戦略など
  • 2019: 人材育成によるハイパフォーマーの増大が可能であること、デリバリ速度や安定性が組織目標達成率に影響すること、レガシーな変更承認プロセスの問題など
  • 2020: 組織内プラットフォームの重要性、変更管理プロセスのあり方など
  • 2021: SREの重要性、中間層からの脱出、ドキュメントのDevOpsケイパビリティへの貢献
  • 2022: ソフトウェアサプライチェーン、組織パフォーマンスの要因

こうした深堀りにより、目指すべき理想のソフトウェア開発組織が高い解像度で抽象化されます。各組織が自己を見つめ直し変更点を見出すための道標として活用できる、鏡のような研究になっていると言えるでしょう。キモはこの研究が実際の数万もの組織を調査した結果を踏まえており、「ぼくのかんがえたさいきょうのそしき」でも「専門家が提唱する10年後の働き方」でもない「既に実現されている未来」が書かれている点です。書かれている内容には一定の信頼性と普遍性を期待できます。

またSoftware Delivery Performanceを示す指標であるFour Keys Metricsに、Operational Performanceを示すFifth MetricsであるReliabilityを加えて、Software Delivery and Operational (SDO) Performanceを継続的に評価し改善することが重要であると述べています。これもまた自組織をどう変えていくかを議論するための良い道標となるでしょう。

図1 2019年レポートより。第5のメトリックはAvailabilityと書かれているが、2021年レポートではReliabilityに変わっている

アウトソーシングや組織パフォーマンスなど、経営や組織設計に向けた研究内容も多いので、DevOps=デプロイ自動化と思っていると少し面食らう内容かもしれません。この研究は「組織としてパフォーマンスを高めたければ組織設計に向き合うことが必要で、そのためには古い慣習を疑い継続的デリバリやアーキテクチャなどの技術を理解することが必要」だということを繰り返しデータを用いて述べるものです。もちろんDevOpsに関心のあるエンジニアにも役に立つのですが、どちらかといえば「なぜ組織のパフォーマンスが上がらないのか」に悩む経営にこそ役に立つ内容となっています。

DevOps現場における問題意識の移り変わり

継続的デリバリは本当に必要なのか

研究はまず「ソフトウェアのデリバリは組織のパフォーマンスを左右するのか」を疑うところから始まっています。結果的にこの仮説は証明され、例えば2016年のレポートには「ハイパフォーマーがソフトウェアのデリバリを高頻度に行っていて、結果として低い障害発生率と安い障害対応コストを実現している」という例が示されています。ここに相関関係が認められるのだから、高頻度デリバリが行えていない理由を見つけて潰していきましょうという話になります。

図2 2016年レポートより。組織によるデプロイあたりダウンタイムコスト試算

ここで面白いのが、Total cost of downtime per yearはローパフォーマーが最も安いという点です。ということは障害由来の損失を減らしたいなら、デリバリ回数を減らして慎重に評価するべきということでしょうか?もちろんそうではなくて、2021年のPuppetのState of DevOps Reportでは以下のように強調されています:

The result of all this is that those organizations that claim to be discouraging risk are actually following practices that increase risk, and many of their existing practices around risk management of infrequent deployments are simply risk management theater, when repeatedly, the data has shown that the use of continuous delivery practices predicts higher IT performance, and highly evolved respondents have higher levels of throughput and stability. In 2021, there’s virtually no rational argument for not adopting continuous delivery practices.

リスクを回避するためにデプロイを減らすアプローチは、むしろリスクを増やす結果に終わっている。今日において継続的デリバリをしない理由はない……という主張です。こうした傾向を数値で説明できるようになったのは、開発チームがあるべき姿を模索する人にとってとても重要な変化だと思います。

古典的な組織管理にテクノロジーで立ち向かう

リスクを減らすための工夫がむしろリスクを増やしている、というのはこのState of DevOps Reportで繰り返し指摘されています。のでマネジメントを長くやってきた人もけっこう興味深く読めるレポートになっていると思います。

例えば2019年にはフォーマルな変更管理システムについて掘り下げています。heavyweight change approval process(重量変更承認プロセス)とも呼ばれているこれは、承認委員会とかそんな感じの存在にお伺いを立ててソフトウェアに変更を加えていくというアプローチです。segregation of duties(職務分掌)を普通に実装しようとすると、実装する人と適用・運用する人との間でソフトウェアを受け渡す際に承認プロセスが入るのは自然なことだと思われます。

対してClear change process(軽量変更承認プロセス)というのはPull Requestのことです。変更内容に対してレビューをして承認しマージ(適用)するのですから、これもれっきとした変更管理だということですね。PRをマージした結果がいつどのように本番環境に適用されるのかを明確にする、すなわちデプロイパイプラインを自動化したり関連する監査ログを残したりする必要はありますが、日々の運用負担はかなり軽減されます。

この研究ではこの2つを比較して、Clear change processのほうが望ましいとしています。もちろん「簡単な方が楽だからこっちにしようぜ!」という単純な比較ではありません。Accelerate §7.2には4パターンの変更管理ポリシーを比較して、フォーマルなやり方ではFour Keysのうち変更失敗率には相関関係になく、残りの3つのメトリックには負の相関があることなどが示されています。フォーマルなやり方では目的を達成できず、むしろ承認プロセスが無いところにすらパフォーマンスで劣っているということが如実に示されているわけです。

承認プロセスとか運開分離とか、特に気にせずそういうものだとして入れてしまうところもあるとは思うんですが、こうした研究を踏まえて「同じ目標をより望ましい手段で達成できないか」考えてみるのはとても重要です。本研究は組織文化や技術プラクティスについても研究されており、様々はヒントを得られると思います。

注意するところ

本研究は「組織としてパフォーマンスを上げたければ、ソフトウェアのデリバリを改善する必要がある」という立場に立っています。自組織に本研究の知見を適用する場合、この前提がどこまで正しいのかは考えておいたほうが良いと思います。例えばUIの変更がエンドユーザーに混乱をきたしたりその教育にコストがかかったりする場合、デリバリ頻度を上げることでかえってエンドユーザーとのコミュニケーションコストが上がり、組織としてのパフォーマンスが低下することも考えられます。

ハイパフォーマーが必ずしも不具合やトラブルのないチームを意味しているわけではないことにも注意が必要です。前述の通り、Total cost of downtime per yearなどいくつかの指標ではローパフォーマーが(局所的とはいえ)優れていることもあります。ハイパフォーマーを目指しますと錦の御旗を立てたあとで「前よりUI変更や障害に起因する対応が増えた、パフォーマンスが落ちているのでは?」という疑問が提起されるシナリオは回避したいところですし、人命に影響するシステムなどでは特に何をどこまで変えられるか・何が譲れないのかをしっかり見つける必要があるでしょう。

もちろんこうした場合でも、Feature ToggleKeystone Interfaceによって高頻度デプロイと安定したUIの実現は可能です。また「対応が増えた」のは「今まではまとめて起こっていた問題が散発的に出るようになっただけで、個々の解決はむしろ楽になっている」可能性もあります。ここで言いたいのはこうした仕組みを用意する必要性に先んじて気づきたいですねという話、関係者の期待値調整をあらかじめしておきたいですねという話です。

またこの研究ではソフトウェアと言いつつもアプリケーションやウェブサービス開発を前提にしている節があります。例えばFour Key Metricsの定義ではFor the primary application or service you work onという表現が使われています。ミドルウェア、デーモン、組み込みなどこの定義から外れるかもしれないソフトウェアに適用する場合は、各研究の前提に注意を払う必要があると思います。 個人的にはアプリケーションやウェブサービス開発においても、歴史ある資産の運用保守には直接適用できないことがあると思います。そうしたプロジェクトでは組織パフォーマンスではない「別のもの」を大切にすることがしばしばあるからです。それでも法対応や脆弱性対応を考えると高速高頻度なデリバリは必要になることも多いはずですが、結局のところビジネス要件しだいというやつです。

まとめ

AccelerateとState of DevOpsレポートを基にすることで、一定の信頼性と普遍性が担保されたプラクティスを学ぶことができます。 そしてDevOpsの問題意識として、運開分離や承認プロセスを重んじてきた慣習を見直し、高頻度のデリバリー、リスク管理のアプローチの変化、そして軽量プロセスへの移行こそが大切だという変遷を見ることができます。 自組織への適用には注意を要するところもありますが、どのようなベストプラクティスでもそのようなものなので、少しずつでも取り入れてみてはいかがでしょうか。

新しくチームを持ったときに伝える、開発体制に求めること 2021

2021年に書いた下書きが出てきたので整理して供養します。今見るとチームが十分に大きいことを前提にしていますね(レビュアーを2人確保するとか)。


ぶっちゃけIndividual Contributor各位が快適に開発できれば何でもいいんですが、一応ビルドやリリース周りを長年囓ってきているため伝えられることもあるはずということで、新しくチームを持ったときには今のやり方の課題や改善方法、OSSプロジェクトや他社における事例など共有しています。だいたい毎回似たようなことを話している気がしてきたので、一旦ここにまとめてみます。

JavaあるいはTypeScriptのウェブアプリケーション開発プロジェクトを前提としています。チームリーダーに対して支援する立場で書いています。

大方針

チームの成果として何を評価するか

  • サービスや社内向けツール、プラットフォームを手掛けるチームの場合「そのユーザがどれだけの利益を得られたか」を基本的な指標にします。
    • 何がユーザに求められているかは状況により、また実際に作ってみないとわからないことも多いため、ScrumやLean Software Developmentのような経験主義に基づくチーム運営を目指します。
    • 「ユーザの利益を増やす」ためのアプローチとして「試行錯誤の回数を増やし効率を高める」ことを採用します。Continuous Deliveryを重視するのはこのためです。
  • コードの量や解決したチケットの数、ストーリーポイントなどは評価の対象ではありません。
    • チケットの数を評価しないというのは「トラブル対応や不具合修正は評価しない」という意味ではなく、「早期に低コストに行える体制をつくる必要性がある」という意味です。
    • その他にも「ユーザの利益を増やす」ことに直結しない手続きは極力低コスト化、あるいは省くことを目指します。

計画、朝会、振り返り

ある程度の規模のチームでは、タイムボックスを固定して定期的にイベントを作ることで、効率良く働くために改善する機会を見つけやすくなります。 ここでは2週間スプリントを回していくことを念頭に話します。

  • スプリントのはじめに計画の機会をチームで設けてください。
    • "sprint planning" と呼ばれるものです。やるべきことリスト(プロダクトバックログ)から扱うものを選び出し、細分化してタスク化します。
    • 各タスクの「完了」の定義を明確にしてください。主に対象環境へのデプロイと動作確認になるはずです。
  • スプリントのおわりに振り返りの機会をチームで設けてください。
    • "sprint retrospective" と呼ばれるものです。期待通りのパフォーマンスが出たのか、何がブロッカーになったのか、誰のどんな動きが良かったかなど、今後の改善に活かせる情報を共有し議論します。
    • チームでデータや意見をひとつのテーブルに乗せて議論することが大事なので、しっかりめに時間を確保します。
  • 毎日「昨日何をやったか」「どんな障害があったか」「今日は何をするのか」を共有する機会を設けてください。
    • ミーティングの体制を取るならば、 “daily scrum” などと呼ばれるものになります。
    • 準備をしてこないと意味がないのと、一人ひとりが発言すると時間がかかるので、チケットに最新の情報が上がるように・チケットを見れば次にすべきことがわかるようにします。

開発技術

branch運用

  • default branchからtopic branchを作成してPull Request(PR)を作成、ふたり以上のチームメンバーからLGTMをもらってからマージします。
    • チームリーダーやテックリードだけレビューする体制はSPOFだし単純に負荷だけ見ても早々に崩壊するので、ベテランはもちろん新人も早いうちからレビュアーにします。
    • レビュアー同士のコミュニケーションを通じて、暗黙知を形式知にする機会と捉えることもできます。
  • default branch以外のすべてのブランチは生存期間が短いほうが好ましい
    • 3日以上長生きするtopic branchにいいヤツはいない、くらいの理解でだいたいあってる
    • チケットが大きすぎるか、互換を保ったままマージする方法がないか、いずれにせよContinuous Deploymentをする条件が整ってない

パイプラインと自動テスト

https://leanpub.com/agiletesting-condensed-japanese-edition

継続的デプロイのパイプライン(Agile Testing Condensed Japanese Edition第4版、37Pより引用)

関連記事