無意識に誰かを否定していないか

何か課題を解決する時、誰かが否定された気持ちになっていないか配慮できると良い場合がある。

今の課題は誰かの意思決定の結果かもしれない。それを解決するということは、その誰かが否定されていると感じる可能性を秘めている。

無意識に否定していた例

最近我が家では洗濯乾燥をした際に何故か乾かないことがたまに発生していた。

乾燥がうまくいかない原因の仮説として、「乾燥フィルターって毎回掃除してる?」と妻に聞いてみた。

すると、「仕事やりながらで忙しくてやってる暇ないし、できない時もある」と「やらなかった理由」がセットで返ってきた。そしてなんだか少し険悪なムードになった。

私は理由は聞いていなかった。ただ、相手が理由を話さないといけないと思ってしまったことにヒントがあると思う。

後で会話してみたら、妻は「否定されていると感じ、つい理由を答えてしまった気がする」と教えてくれた。

このように、伝える側にその意図がなくても、相手が否定されていると感じることはある。

言い方をデザインする

土台として信頼し合う関係性が既にある場合、工夫するとしたらやはり言い方をデザインすることだと考えている。

例えば、

「なんで乾燥うまくいかないんだろうね?そういえば乾燥機に毎回掃除してくださいって書いてあるけど関係あるのかな?あれいつもやるの普通に大変だよね。」

のように毎回掃除しているかを聞くのではなく、 まず共通の課題として一緒に考えようという姿勢を見せて、原因を共有するのが良かったと思う。

後で妻にも聞いたが、その聞き方であれば否定されているとは感じなかったと思うと言ってくれた。

丁寧なコミュニケーションは手間がかかる

冗長な会話だと思うかもしれない。面倒だと思うかもしれない。

丁寧なコミュニケーションってそういう手間をかけることだと思っているので、Q(品質)C(コスト)D(納期)のバランスで、丁寧さをどこまで発揮するかは状況次第。ただ、それを自然に出来るのがプロであるとも思う。

達人に学ぶDB設計徹底指南書

書籍概要

DB設計に関する基礎的な内容が体系的に網羅されており、データベース初学者には特におすすめの一冊です。 アプリケーション開発者、データベース管理者などが知っておきたいDB設計に関する基礎知識を身につけることができます。

本書で扱う設計の種類

本書では論理設計と物理設計を主に扱っています。以下は本書での用語の説明です。

  • 論理設計:正規化やER図といったデータのモデル設計
  • 物理設計:サーバやストレージといった物理的なハードウェアレベルの設計
  • 実装設計:特定のデータベース製品を前提に、具体的な構築の手順や方法論

特定製品に依存しない、汎用的な知識を得られることが本書の特徴です。

以降では各章を簡易的に説明しつつ、印象に残った箇所をご紹介します。

基礎編(第1章〜第4章)

  • 第1章:データベースの重要性や、データ中心アプローチ(Data Oriented Approach:DOA)について説明
  • 第2章:論理設計と物理設計の概要をそれぞれ解説
  • 第3章:正規化について詳細に説明
  • 第4章:ER図について深掘り

2012年が初版のため、第2版では物理設計においてクラウドの内容も追加されています。レプリケーションやバックアップ設計、リカバリ設計などについても詳しく記載されています。

クラウドを利用していると省力化されて意識することも少なくなりますが、知識として学んでおくことは重要です。

実践編(第5章〜第6章)

第5章:正規化とパフォーマンスのトレードオフ

正規化とパフォーマンスのトレードオフについて深掘りしています。正規化はデータの整合性を厳密に保つ方法論ですが、副作用もあります。正規化されたテーブルを結合するときに、システムとして実用に耐えないほどパフォーマンス劣化を招くことがあります。

特に印象的だった学び

正規化が唯一の正解ではなく、冗長性を持たせることでパフォーマンスとのバランスを取る方法について説明されています。正規化と非正規化がもたらすメリット・デメリットについて丁寧に解説されているので、実際に必要になった時の思考の土台ができます。

非正規化のリスク

- リスク1:検索のパフォーマンスは向上するが、更新のパフォーマンスを低下させる
- リスク2:データのリアルタイム性(鮮度)を低下させる
- リスク3:後続の工程で設計変更すると、手戻りが大きい

非正規化の基本テクニック

結合を減らすための代表的なパターン:

  • 結合しないと集計できないサマリーデータを事前計算してテーブルに保持
  • 結合しないと条件を絞れない場合に、条件で利用するデータをテーブルに保持

それぞれのパターンで正規形が崩れて非正規化されますが、結合が減ることで得られる効果が丁寧に説明されており理解しやすいです。

第6章:データベースとパフォーマンス

インデックスと統計情報について解説されています。どちらも開発者が常に意識する必要がある重要なトピックです。

インデックス作成の指針

- 指針1:大規模なテーブルに対して作成する
- 指針2:カーディナリティの高い列に作成する
- 指針3:SQL文でWHERE句の選択条件、または結合条件に使用されている列に作成する

応用編(第7章〜第9章)

第7章:アンチパターン

データベース設計で避けるべきアンチパターンが複数紹介されています。

印象的なアンチパターン:「ダブルミーニング

特定の列の意味が他の列の値によって変わり、2つ以上の意味を持つ列のことを指します。書籍内では、特定の列が2001年は体重の意味を持っているが、2002年からは年齢が保持されているテーブルが紹介されています。実際の開発で見かけたら恐ろしくなるテーブル設計です。

第8章:グレーノウハウ

違法すれすれのグレーノウハウが複数紹介されています。代理キー(サロゲートキー)などが挙げられています。

第9章:木構造の扱い

木構造をデータベースで扱う方法について紹介されています。

注目すべき内容:隣接リストモデルの再評価

隣接リストモデルは従来、木構造をデータベースで表現する際のアンチパターンとして扱われてきました。しかし、ここ10年のSQLの技術革新の中で再帰共通表式が登場することで状況が変わりました。これにより、隣接リストは現代ではアンチパターンとしては扱われなくなってきているようです。

まとめ

データベース設計は、システム開発の根幹を成す重要な技術領域です。その基礎を体系的に学習できる良い書籍でした。データベース初学者にはとても適した良い一冊だと思います。

特に正規化と非正規化のトレードオフについて、丁寧な解説をもとに思考を整理できたのはとても有用でした。

会話の目的は勝つことではない

「最強のエンジニアになるための話し方の教科書」を読み、過去の経験も踏まえてコミュニケーションについて改めて考える良い機会になりました。

本記事では、書籍の内容を引用しつつ、論理的な正しさだけでは仕事がうまく進まない場面で私が感じたことを整理してみます。

特に過去の私のように「論理的で正しいことが全て」と考えがちな方にとって、何かしらの気付きにつながれば幸いです。

はじめに

これからの時代、技術力だけでエンジニアは生きていけるのでしょうか。 いいえ、「技術の価値を伝える」ことができなければ、エンジニアは技術で収入を得て生きていくことはできません。

ソフトウェア業界でも生成AIの進化により、技術力が一部代替され始めています。今後もその流れは加速し、より技術力だけで生きていくのが難しい世の中に突入すると考えています。

そのような世界では組織的な動きや、他人との関わりがより重要になります。その際に論理的に正しいことを重視するあまり、相手の状況や気持ちを考慮せずに一方的に主張してしまうと良好な関係を築きづらいです。

本書籍では以下のように警鐘を鳴らしています。

多くのエンジニアは技術力ばかり向上させていますが、仮に技術力が200%(2倍)になっても、「伝える力」がゼロなら、 技術力(200%) × 伝える力(0) = 真のパフォーマンス(0) なのです。

1人ができる事は少なく、関係者と協力し、価値を生み出していくことが多くなります。このことはコミュニケーションの改善を考える大きな要因になります。

本書籍の特徴はその対象をエンジニアに焦点を当てていることです。確かにこういう傾向のエンジニアは多いような気がしています。

私もそのような時期がありましたし、日々改善を続けていたりもします。

この本ではそのような傾向がある人がまず自分の癖に気付けるような具体例などが多く挙げられています。またそれがなぜ悪影響を及ぼすことがあるのかや、改善の方法などを丁寧に説明しています。

会話の目的は「勝つこと」ではない

エンジニアの話し方は、正しい意見を認めてもらうための会話です。会話の目的は、相手の意見をおさえ、いかに自分の正しい主張を通すかにあります。 そのため、会話は相手との戦いであり、会話は最初から対立しています。...

会話は何かを達成したり、解決するのが目的であって、「何が正しいか」はほとんどの場合、必要ありません。

私がこの書籍の中で、一番好きな内容です。

上記ほど明確な対立は少ないかもしれませんが、似たような場面は多く見かけます。

例えば、チーム内で今後実施するタスクの認識を合わせる会議で、タスク名が説明口調で長かったとします。

「XXXリポジトリを実装し、YYYデータを保存できるようにして、ZZZで活用できるようにする」

そこでタスクを見たメンバAさんと作ったBさんが以下の会話を始めます。

  • A「このタスク名は長くてわかりづらいです。」
  • B「いや、明確にしておかないとわかりづらいと思います。」
  • A「長いと認知負荷も高いです。」
  • B「やることがわからない方が認知負荷が高くないですか?」
  • A「いや、長いほうが毎回読まなきゃいけなくて...」

はい、どーでもいいです。

その会議はタスク名を綺麗にすることが目的の会議だったのでしょうか。チームとして今後のタスクの認識を共有し、協力して価値を作り出すための会議だったはずです。

もちろん、チーム内の価値観を合わせるための会話として意味はあると思います。「ただ、今じゃない」みたいなことはよくあります。

エンジニアは仕様をコードで正確に表現する必要があったりするので、「正しさ」に敏感です。それがどうしても癖で出てしまう、特性のようなものだと感じています。

それを減らすために会議の目的を明確にしておくとか、気づいたタイミングで「あ、今じゃない気がしますね」みたいな感じで保留したりする技術が結構大切になります。

「正しさ」の主張を通すことが目的になってしまっている会話で、本当に解決したい問題がそれなのかを常に意識できるように工夫をすることが重要です。

「敵」から「仲間」へ - 共に解決を目指す姿勢

もちろん本当に解決したい問題に対して意見が対立することはあると思います。それは健全で、本書籍でも対立するなとは主張していません。

一方で気を付けたほうが良いこととして、以下のように述べています。

エンジニアに多い「どちらが正しいか」の論争では、話し相手は論破の対象「敵」です。 もし、話し相手があなたを攻撃してきたら……当然、自分を守り、相手の要求を拒否する行動に出ますよね。一方、人は自分に危害を及ぼさない相手には優しいのです。双方満足に合意ができれば、あなたを助けてあげたいと思う人が増えていきます。

攻撃されたら拒否したくなる。これは人間の性なのではないかと感じています。その場の正しさではなく、人間としての防衛反応に着目すると色々と行動が変わるような気がしています。

どのようにすると良いのかについては以下のように述べています。

攻撃をする話し方を止めて、 「共に解決を目指す話し方にすれば良い」が1つの答えです。

とてもざっくりしていますが、これが本質的な解だと思っています。具体的な実現方法の提案は本書籍に記載されているので読んでみてほしいです。

私の一つのおすすめは、主語を「私」ではなく「チーム」にすることです。それをしていると自然と課題に対して、自分だけの解決ではなく共に解決を目指す話し方になりやすいです。

例えば、あなたの設計をチーム内でレビューしている際により理想的だけど再設計の手間が大きい指摘があったとします。その際に以下の2つの回答を比べてみます。

  1. 再設計するのは時間がかかるので私が困ります
  2. 再設計するのは時間がかかるので納期に間に合わずチームが困ります

前者だとあくまでも困っているのは私だけで、困っていない相手とは対立関係になりやすいです。相手は困らないので、理想的な形を主張し続けるかもしれません。

後者であれば私も相手も共に納期という課題を元に協力する必要があり、「チームとして共にどう解決していきましょうか?」という流れになりやすいです。チームとして妥協した設計を受け入れる話になるかもしれませんし、相手が自分の他のタスクを巻き取り調整する案も自然と出てきます。

このように、対立があったとしても、戦いではなく協力関係になる工夫が非常に重要になります。

信頼を築く「自爆」の姿勢

またその上で、以下のような行動で信頼を積み重ねていくことが重要であると書籍では述べられています。

  • 話す側が完全に自分を守らない状態になる
  • エンジニアで嫌われる会話をしている人は、「話し相手より自分を守ろうとしている」のパターンが多い
  • 話し相手が安心を感じて心を開くには、自分を守らない「自爆」の姿勢が重要

攻撃されると拒否したくなるのと同様、自分を守ろうとするのは自然な反応です。

だからこそ、適度に自分を守らない姿勢でいることでよりコミュニケーションの障害が減り、信頼も生まれやすいと考えています。

私はまだまだ修行中です。特に強い命令口調に対しては、反発して熱くなる感覚を持っています。これは自然の反応です。

心理学用語では自由を制限された際に、それに抗おうとする性質を心理的リアクタンスと呼びます。勉強しようとしていたのに、母親から「勉強しなさい」と言われるとやる気がなくなる例が有名ですね。

私は熱くなる心を俯瞰して、それが無意味な反発や戦闘に繋がらないように処理しています。「それがプロだ」と自分に言い聞かせていますが、まれに目的外の議論で盛り上がってしまい、後から反省することもあります。

また、自分の間違いをみんなの前で認めるのはいまだに怖いです。意識的に頑張ってすぐに認めて、チームの改善に活かすという姿勢をとっていますが、まだまだビビっている感覚があります。もう少しスッと認められるようになれるとよりプロに近づけるでしょう。

幸いなことに自分を守らないで信頼を築くのが上手なメンバーが近くにいるので、日々の行動から色々学びを得ています。今後も修行を続けます。

まとめ

この本の中で、自分の経験も踏まえて本当に良かったところを紹介してきました。

「論理的で正しいことが全て」と考えがちな方にとって、何かしらの気付きにつながれば幸いです。

またそうでなくても、少なからず同様の行動をとっている人はいると思います。もし気になれば書籍も読んでみてください。

Kiroの良いところを伝えたい

KiroAmazonが提供する仕様駆動型開発をAIで支援するIDEです。

生成AIに適切なコンテキストを渡す仕組みを作りたいけど、あまり手を出せていない人は多いのではないでしょうか。私もその一人で、そんな私にとってKiroはかなり衝撃的なプロダクトでした。

色々学ばせてもらった感謝の気持ちを込めて、Kiroの良いところをお伝えしたいと思います。

Kiroが提供するコアソリューション

仕様駆動開発(spec-driven development)はKiroの重要なコンセプトです。

要件(requirements)、構造化された設計(design)、実装タスク(tasks)を生成AIを活用して作成、管理し、熟練の開発者が行っているプラクティスを多くの人が効率的に行えるようにします。

個人的には、Kiroの最大の価値は、仕様駆動開発のワークフローをフレームワークとして提供していることだと考えています。また、各工程をシームレスにサポートする機能はとても強力だと感じています。

構造化されたドキュメント管理

Kiroでは、以下の3つのファイルが中核となります:

  • 要件(requirements.md) - 構造化された EARS 記法でユーザーストーリーと受入基準を記述
  • 設計(design.md) - テクニカルアーキテクチャ、シーケンス図、実装に関する考慮事項を記述
  • タスク(tasks.md) - 個別の追跡可能なタスクによる詳細な実装計画を記述

これらは単なる独立したドキュメントではなく、相互に依存関係を持つ構造化された情報として管理され続けます。

例えば、以下はtasks.mdの例ですが、最後に要件(requirements.md)の何番に対応するかが記載されており、構造的なドキュメントの依存関係が管理されていることがわかります。

- [x] 1. Update GitHub summary module to remove arbitrary label feature
  - Remove `label` parameter from `SummaryOptions` interface in
    `src/github/summary.ts`
  - ...
  - _Requirements: 2.1, 3.1, 3.3_

作成もふんわりした機能の説明から要件ファイルが作成され、それをベースに詳細を詰めていきます。それをインプットに設計、またそれをインプットにタスクのファイルを作成します。

今回Kiroの検証で実際に作成したドキュメントのリンクを、参考までに以下に記載します。どんなものができるか興味があれば見てみてください。

高速な試行サイクルの実現

初期の要件や設計が完璧であることは稀です。むしろ、試行錯誤を通じて最適解を見つけていくプロセスが重要です。

Kiroにより要件、設計、タスクを頻繁に修正することができ、試行を高速に回すことができるのがメリットだと感じています。

個人的には、その体験をしっかり考え抜いた機能が多く実装されていると感じました。当社でも「体験を想像する」ことを重要視しているのですが、そのマインドを感じてプロダクトとしてはとても好印象です。

次に、そのマインドを感じた細かい体験、機能をいくつかご紹介します。

良かった体験

実装時の設計変更提案

実装の修正指示の内容から要件の変更に結びつきそうな場合はそれを提案してくれる機能がありました。それにより、要件や設計からまた練り直してタスクを再作成するというフローがシームレスにできます。

これにより実装レベルの気づきをドキュメントに反映でき、実装との乖離を防止できます。

専用タブによる効率的なドキュメント参照

仕様駆動開発では、要件、設計、タスクのファイルを頻繁に参照、編集します。Kiroでは、これらのファイル用の専用タブが用意されており、ワンクリックでアクセスできます。

このタブがあることで素早く確認できるのは、意外と大きなメリットだと思いました。こういう細かい機能の積み重ねが大きく効率を上げるように感じています。

タスク管理と変更履歴の追跡

完了したタスク実行における変更差分と、タスク実行時のセッションに飛べる機能があります。

これによりタスクがどのような経緯で変更されたかを追跡でき、実装時の判断根拠を後から確認できます。デバッグ時の原因調査が効率化されるなど、多くの利点があると感じました。

タスクは同時に1個しか実行できない仕様ですが、実行待ちが設定できるのも良いです。一気にここは作っちゃおうというタスクを一気に設定できます。

開発プロセスの可視化

開発の中で考えていることがドキュメントとして残るのは、やはりいいなぁと思いました。これにより、後から「なぜこの設計にしたのか」を振り返ることができ、チームメンバーとの知識共有が容易になり、類似プロジェクトでの参考資料として活用できるなど、多くのメリットがあると思います。

また、それをベースとして要件を変更したら設計が、設計を変更したらタスクが変わるという依存関係で常に管理し続けることに、とてもメリットを感じます。それがあることによって、各変更を記録しながら、今までの変更内容を加味した修正等が行えると感じました。

またリファクタリングなどの経緯も残せます。下記は実際に機能ができた後にリファクタリングした時のタスクです。

コンテキスト管理の最適化

Kiroは、大きなコンテキストを含まないように、毎回必要な情報だけを読み取ってセッションを実行する設計になっているようです。

細かいセッションが区切られる設計になっていて、例えば、タスクを実行するごとに新しいセッションが開かれ、今まで作成した要件、設計、タスクのファイルが読み込まれます。

生成AIはコンテキストが膨らむとバカになるというのは有名な話ですが、仕様駆動開発で実装に必要な情報を構造的に管理することで最低限のインプットにすることが可能となるため、実装の精度も上がるのではないかと感じました。

現時点での制約

現時点では足りていない機能も多いと感じました。例えば、Devcontainerが利用できないのと、Web検索機能をしてくれないのは開発中にかなり不便を感じました。

ただ、まだ新しいプロダクトなので、今後の機能追加ですぐ利用できるようになるでしょう。

雑感

料金モデル

Kiroのコアバリューは仕様駆動開発の効率化にあると感じています。この価値は確実に存在し、実際に体験してみると大きなメリットを感じます。

しかし、料金面はプロダクトとして心配です。以下が現在公開されている料金プランです。

vibeリクエストは作業時のプロンプト実行、specリクエストは要件、設計、タスクの更新時のプロンプト実行時に消費されます。

今回ボーナスで 150 vibe、100 specリクエストをもらいましたが、GitHub ActionsのTrace IDをサマリに表示するちょっとした機能を実装しただけで、vibeリクエストを使い切ってしまうくらいでした。

現状毎月$20払って225 vibe、125 specリクエストしか使えないので、全然開発するのに足りない印象です。他のプロダクトが安すぎるという面もありますが、ユーザーとしては抵抗を感じる価格帯です。

Kiroは内部で外部ベンダーのAI APIを利用するモデルです。このモデルで利益を出そうとするとAPI利用コストに加えてマージンが必要で、結果として他の直接利用サービスより高額になり、採算を取るのがかなり難しいのだろうなと推測しています。

素晴らしいプロダクトですが、このままの料金体系で大丈夫なのかという不安を感じました。

コアソリューションを他のサービスに実現される可能性

細かな体験はKiroが間違いなく優れています。プロダクトとしては大好きです。一方で、一番のコアソリューションがフレームワークであると感じる状況では、他のサービスに模倣されてしまうと差別性があまりなくなってしまうのではないかと感じます。

例えばClaude CodeでKiro互換の要件、設計、タスクを作成するclaude-code-specも出てきています。もちろん、システムプロンプトの品質や細かな管理機能ではKiroの方がプロダクトとして強化されやすい可能性はあります。一方でコアソリューション部分が模倣しやすいことも事実に感じています。

現時点ではプロダクトとして先行きが心配というのが初心者目線の所感です。

まとめ

Kiroの最大の価値は、多くの開発者が自分では構築できない仕様駆動開発のフレームワークを提供していることだと思います。

Kiroの良いところとして、やはりそれらのドキュメントを管理するのを効率的にするという思想が垣間見えるところです。

ドキュメントを管理しつつ開発をするということに関して、体験をよく考えて機能が追加されていることがとてもわかります。

現時点では制約もありますが、仕様駆動開発のワークフローを学び、体験するという観点で、多くの開発者にとって価値のあるプロダクトだと確信しています。

特に、自分で仕様駆動開発の体系を構築できていない開発者には、ぜひ一度試してみることをお勧めします。そこで得られる学びは、Kiroを使い続けるかどうかに関わらず、今後の開発プロセス改善に大きく役立つはずです。

Web API: The Good Parts

概要

Web APIの設計と構築に焦点を当てた書籍です。

Web APIの重要性、さまざまな利用パターン、そして「美しい」API設計がいかに開発者の生産性やサービスの信頼性を高めるかについて詳述しています。 特に、URIの設計原則、HTTPメソッドの適切な利用、およびクエリパラメータを用いた検索やデータ取得といった、API構築における具体的な手法と注意点が解説されています。

同僚に勧められたのと、オススメ本としてもよく見かけていた本なので読んでみました。 2014年発売で10年以上経っていますが、APIの基礎としては色褪せない内容がしっかりと体系化されており、非常に良い本でした。

一方で書いてあるツールや情報が古く、初心者としては間違った情報が入ってこないか心配になりました。 自身の知っているプラクティスなどはしっかりと書かれていたので、原理原則になるような箇所を主に読みました。 逆にツール名が出てきたところは生成AIの文章を読む感覚で、間違っているかも?くらいの感じで読んだりしました。

印象に残ったところ

理解しやすいURIにするための2つ目のポイントは、APIでよく使われている英単語を利用するということです。 たとえ英語を使っていても一般的にAPIでよく使われる語彙を使っているかどうかでわかりやすさは異なってくるでしょう。

ここでの気づきとしては、わかりやすい命名をするためには先人が積み上げてきた暗黙的なコンテキストを含んだ単語を利用することが重要ということです。

例えばgetとfetchは大元では「取得する」ですが、元々の英語のニュアンスの違いからさらに意味を持ち、以下のように解釈されることが多い気がします。

get → すぐ返る、キャッシュやDBのような近い場所から取る
fetch → 外部サービスやネットワーク越しで遅延がある場所から取る

意味がほぼ同じなら、同じ単語でもAPIのパスはわかりやすいものになると思います。 特定の単語がよりわかりやすいのは、元々単語が持つ以上の意味(暗黙的なコンテキスト)が付与されているからなんだろうなと思いました。

以下も良い例だと思っています。

InstagramTwitterFoursquareAPIは検索のためのエンドポイントにsearchという単語が入っていました。しかしそもそも「検索する」という行為は動詞であり、URIをリソースと表すものとするデザインでいえばやや王道を外れます。そうした意味においてsearchという単語を入れるべきかは大いに悩ましいところです。 しかしわかりやすさの観点で言うと、このエンドポイントは「検索」のためのものであり、全リストを取得するためのものではありませんよ、ということを示すためであればsearchという単語を入れるのはありではないかと思います。

後から見出された法則に違反する単語があったとしても、暗黙的コンテキストをすでに持った単語を使った方がわかりやすいという考えかと思います。

良い命名をするためには、業界にある暗黙的なコンテキストを持つ単語を学ぶことが重要なんだろうなぁと思いました.

Twitterでは2012年にバージョン1.1を公開し、それに伴い1.0の廃止を段階的に行いました。この作業はAPI廃止の手順として参考になる

この移行の話もとても面白かったです。以下に簡単にまとめます。

Twitterは、サービスの成熟に伴い、APIの利用を適切に管理するため、バージョン1.0のAPIを段階的に廃止し、バージョン1.1への移行を推進しました。

廃止プロセスの主なポイントは以下の通りです。

  • 2012年8月にバージョン1.1のリリースと6ヶ月以内の1.0廃止を発表
  • 2013年3月には「Blackout Test」という一時的なAPI停止テストを実施し、移行を促しました
  • 最終的に2013年6月11日にバージョン1.0は完全に廃止されました

ここまでやっている事例は今でも少ないのではないかと思ったりします。 ただ、本当に丁寧な廃止のプロセスとしてとても参考になるユースケースだと思いました。

まとめ

Web APIの設計と構築における基礎的な内容を体系的に学べるため当時においてはとても良書だったと思います。 また、APIがなぜ重要なのか改めて考えたり、命名についても気づきがあったのでよかったです。 一方で10年と時が経ち、情報が古い部分があるため注意が必要です。

GitHub Actions OpenTelemetry v0.7.0 リリース pushイベント対応で柔軟性向上

Claude Code最高ですね。。。。今まで対応できていなかった大型機能に着手してみました。また、それに伴い単体テストの拡充、および統合テストの追加を行いました。

github.com

pushイベントに対応

従来のworkflow_runイベントに加えて、pushイベントにも対応し、多様なユースケースに柔軟に対応できるようになりました。

以前は、workflow_runイベントでの監視のみに制限されていましたが、Issue #106でユーザから以下のフィードバックがありました。

  • ユーザは100以上のリポジトリで再利用可能ワークフローを使用している
  • 新しいworkflow_runワークフローを全リポジトリに導入するのは大きな作業負荷になる
  • 再利用可能ワークフローの最後のステップとしてOpenTelemetry GitHub Actionsを追加できるようにしてほしい

2つの監視アプローチを選択可能

v0.7.0では、用途に応じて2つの監視アプローチを選択できるようになりました。

Option 1: 他のワークフローを監視(従来の方法)

完了したワークフローをworkflow_runイベントで監視:

name: Send Telemetry after Other Workflow

on:
  workflow_run:
    # 監視対象のワークフローを指定
    workflows:
      - Check Transpiled JavaScript
      - Continuous Integration
      - CodeQL
      - Lint Codebase
    # 完了したワークフローからメトリクスとトレースを作成
    types:
      - completed

jobs:
  send-telemetry:
    name: Send CI Telemetry
    runs-on: ubuntu-latest
    steps:
      - name: Run
        id: run
        uses: paper2/github-actions-opentelemetry@v0.6.0
        ...

Option 2: 現在のワークフローを監視(新機能)

現在のワークフローを最後のステップとして監視:

name: CI with Built-in Telemetry

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  # 監視対象のジョブ
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm run build

  # 他のジョブ完了後にテレメトリジョブを実行
  telemetry:
    runs-on: ubuntu-latest
    needs: [build] # 他のジョブの完了を待つ
    if: always() # 他のジョブが失敗しても実行
    steps:
      # 同じジョブの中でテレメトリを送信できるようになった
      - name: Send Telemetry
        uses: paper2/github-actions-opentelemetry@v0.7.0
        ...

まとめ

GitHub Actions OpenTelemetry v0.7.0では従来のworkflow_runアプローチに加えて、pushベースの統合型アプローチを選択できるようになり、組織やプロジェクトの多様な要件に対応可能になりました。

ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本

概要

ドメイン駆動設計(DDD)の基本的な知識は網羅されており、DDDを学ぶための入門書としては非常に良い内容でした。特に既存のDDDベースのプロジェクトに参加する際の補助としては非常に強力な一冊だと感じました。

本書のアプローチについて

ドメイン駆動設計は大別すると以下の2つを学習することになります:

  1. ソフトウェアにとって重要なドメインを抽出し、モデリングすること
  2. モデリングと概念を実装に落とし込むためのパターン

本書ではあえて後者から入り、実装例と共にDDDの概念に慣れていき、ドメイン駆動設計を理解していくアプローチが取られています。C#で書かれていますが、説明としては理解できるレベルなので問題なく読めました。

開発者として抽象的な話よりも、実装例を見ながらDDDの概念を学んでいく方が理解しやすいという感覚はありました。この点で本書のアプローチは非常に実践的で良かったと思います。

実際の効果

本質的なドメイン駆動設計ができるようになるわけではありません。ただ、既存のDDDベースのプロジェクトに参加する際の強力な補助になるのは間違いありません。

これを理解するだけで、チーム内での会話には困らなくなりました。完全に理解できていなくても、質問もしやすくなりましたし、「このロジックはドメイン層にあるべきではないか」とか「インフラストラクチャ層にこれを置くべきではない」などの会話もできるようになりました。

一方で0からDDDで設計をできるかというと、ちょっと物足りないです。15章「ドメイン駆動設計のとびらを開こう」で本質的なことが書かれているので入門としては十分ですが、実践的な内容は少ないです。

印象に残った点

本質的な表現が多いため、汎用性が高いです。作者の綺麗な言葉づかいが非常に印象的でとても良かったです。一番印象に残ったのは以下の言葉です:

価値あるソフトウェアを構築するためには利用者の問題を見極め、解決するための最善手を常に考えていく必要があります。ドメイン駆動設計はそういった洞察をくりかしながら設計を行い、ソフトウェアの利用者を取り巻く世界と実装を結びつけることを目的としています。

あくまでもモデリングとそれを実装に紐づけるためのパターンであり、真の目的は価値あるソフトウェアを構築し、利用者の問題を継続的に解決し続けることにあります。DDDはそのための手段であり、目的ではありません。このことが冒頭で語られているのはとても好印象でした。

まとめ

DDD入門書として、既存プロジェクトへの参加を控えている人や、DDDの基礎概念を実装と共に学びたい人には非常におすすめできる一冊でした。完全にマスターするには追加の学習が必要ですが、チーム開発でのコミュニケーションを円滑にし、設計に関する議論に参加できるレベルまでは確実に引き上げてくれます。