Steven
Steven1 分で読める

バージョン2に本当に必要なもの: 206コミット分の正直な状態

GeekBye v2は機能リリースではありませんでした。それは、たった一つの考えに向けられた206のコミットでした — アプリは自分自身の状態について決して嘘をつくべきではない、と。それが何を要求するのか、ここに記します — 私たちがそれを一切出荷できなくなりかけた、あの一行のロックファイルの間違いも含めて。

信頼性
エンジニアリング
リリース
GeekByeリリース
バージョン2に本当に必要なもの: 206コミット分の正直な状態

たいていの「バージョン2」リリースは、より大きな番号が付いた新機能の山です。GeekBye v2はその逆でした。ユーザーに見える新しい能力をほとんど何も出荷しませんでした。その206のコミットは、たった一つの、地味な考えに向けられていました:

アプリは、真実でない状態をあなたに見せるべきではない。

これは当たり前に聞こえます — デスクトップアプリが静かに嘘をつく方法が何通りあるかを数えるまでは。まだ飛行中のアップロードにチェックマークを表示する。一分前に死んだソケットの上で「接続済み」と言う。あなたの文字起こしが床に落とされている間、黙り込む。どれもクラッシュではありません。クラッシュより悪いのです。なぜなら、アプリは間違っているのに正常に見えるから — そしてあなたは後で気づくのです、必要だった録音がそこに無いときに。

v2は、私たちがその小さな嘘の一つ一つを狩りに出たリリースでした。

私たちが最も憎んだ嘘: 「成功した」アップロード

GeekByeはあなたの録音をGoogle Driveへバックアップできます。v1では、Driveへの接続は背景の細部として扱われていました — うまくいけば結構、いかなくても、その失敗はほとんど見えませんでした。アプリは接続済みに見えたままです。あなたは録音が安全だと思い込みます。時にはそうではありませんでした。

v2はこれを正直な接続状態を軸に作り直しました。Driveは今や常に、いくつかの明示的で真実な状態のいずれか — 接続済み、再接続中、切断 — にあり、アプリはその状態が変わった瞬間に、その変化をインターフェース全体へ放送します。接続が切れているとき、グローバルな再接続バナーが、どこでも、はっきりと、あなたに知らせます。アプリはもう、アップロードが成功していないのに成功したふりをしません。バックアップが今できないなら、あなたは今それを知る — ファイルを探しに行く来週ではなく。

その下にあるのは、スローガンではなく小さなアーキテクチャです: 接続に関する唯一の真実の源、それが変わったときにUIの全部分へ広がるイベント、そしてその状態から直接読むバナー。接続が切れているのにUIが繋がって見える経路は存在しません。なぜなら、両者は同じ事実から読むからです。

失われた録音という嘘

二つ目の大きな正直さの修正は録音復元でした。リアルタイム文字起こしには、生きた接続が必要です。v1では、その接続がセッションの途中で途切れると — Wi-Fiの瞬断、トンネル、VPNの再接続 — その切れ目の間の音声は単純に消え去ることがありました。文字起こしには穴が空き、何もそれを告げませんでした。

v2は契約を変えました: 音声は**接続の切れ目の間、ローカルに保持され、後で照合される。**リンクが落ちると、GeekByeは音声をあなたのマシン上で安全に保ちます。戻ってくると、そのバッファされた音声が送られ、正しい位置で文字起こしに縫い合わされます。悪い30秒のネットワークが、もう30秒の会議を奪うことはありません。これは、後の信頼性リリースが直接その上に築いた土台です — AIノートテイカーはなぜ悪いWi-Fiで止まるのかにある再接続とバッファの仕組みは、同じ考えを、より堅牢にしたものです。

ポップアップの嵐という嘘

アプリが不調を報告する方法には、より微妙な不誠実があります: 過剰に報告するのです。一度の不安定なネットワークの瞬間が、同じエラーを五回発火させることがあり、気づけば同一の赤いトーストの山が、本当に大事な一つのメッセージを埋めてしまう。それも正直ではありません — それは情報のふりをしたノイズです。

そこでv2はカテゴリキー付きトーストのスロットリングとエラー振り分けを追加しました。エラーは実際に何であるかによってグループ化され、各カテゴリはレート制限されるので、一つの根本的な問題が、集中砲火ではなく一つの明確なメッセージを生みます。レート制限の問題はレート制限のメッセージへ、接続の問題は接続のメッセージへ振り分けられます。アプリは真実を、一度だけ告げます — アプリが自分自身にDDoSを仕掛けた日で、後に429がログアウトになりすますのを防いだのと同じ規律です。

206という数字こそが要点

正直な状態、再接続バナー、録音復元、トースト振り分け — これで四つのアイデアです。リリースは206のコミットでした。残りはどこへ消えたのでしょう?

「決して偽の状態を見せない」が実際に要求する、地味なロングテールへです。古いUIが現実とずれ得たあらゆる場所を見つけ出し、古いコピーではなく真実から読むように配線し直さなければなりませんでした。あらゆる再接続経路を、ローカルに推測するのではなく共有状態を更新するようにしなければなりませんでした。録音、文字起こし、アップロードにまたがる数十の小さな信頼性の修正 — その一つ一つが、アプリが正しく見えながら間違っていられる特定の隙間を塞ぎました。

これが、目標が機能ではなく信頼であるとき、本物の「バージョン2」が要求するものです。単一の見出しコミットはありません。206の小さなコミットがあり、そしてリリースがただ一つのこと — 穏やかさ — のように感じられるのは、その206すべてが同じ方向へ引いているからです。

リリースは出荷されかけませんでした

ここが武勇伝で、しかも良いやつです。なぜなら、それは私たち自身のアプリが私たちに嘘をついた話だからです。

リリースを切るとき、バージョン更新スクリプトが新しい番号をプロジェクト全体に刻印します。v2.0.0では、それはアプリのバージョンを更新しました — が、npmの正確な依存関係の台帳であるpackage-lock.jsonは、バージョン、1.9.0を指したまま残されました。ローカルでは何もかも問題ありませんでした。ビルドのためだけに依存関係を入れ直す人はいません。しかしCIはnpm ciを実行し、npm ciの仕事は丸ごと、ロックファイルがマニフェストと食い違うなら進行を拒否することです。それは厳格さの機能であり — そしてそれは、まさにすべきことをしました。私たちが切った最大のリリースのビルドを、失敗させることによって。

それから、その下により陰湿な二つ目が浮上しました。より新しいnpmが、オプションの推移的依存関係を刈り込んでいたのです — node-fetchが引き込むencodingパッケージを — 不要だとして、ロックファイルから。ところが私たちのCIのクリーンインストールはそれを必要としていたので、インストールは、私たちのコードとは何の関係もなく、台帳が微妙に間違っていることに全ての原因がある形で壊れました。

どちらも一行の修正でした: ロックファイルを本物のバージョンに再同期し、刈り込まれたエントリを復元する。どちらもまた、v2が扱っていた、まさにそのことの完璧で、謙虚にさせる例です — **真実だと主張しながら、そうでなかった状態。**ロックファイルは、アプリが依存するものの正直な記録であるはずです。それが現実からずれたとき、ビルドは、私たちのアプリが今ユーザーのためにするのと寸分違わぬことをしました: 何もかも大丈夫だというふりを拒否したのです。信頼性のリリースを出荷することは、結局、どこまでも信頼性の問題なのだと分かります。

v2が私たちに教えた三つのこと

  1. **危険な失敗は、静かなものだ。**クラッシュは自らを告げます。偽の「接続済み」、幻のアップロード成功、見えない穴の空いた文字起こし — それらがあなたの信頼を奪うのは、まさに何も間違って見えないからです。静かな嘘を狩りましょう。
  2. 正直さはアーキテクチャであって、メッセージではない。「真実を告げよ」をバナーとしてUIに後付けすることはできません。バナーは、他の全部と同じ唯一の真実の源から読まなければ、それ自身が間違い得るものの一つになってしまいます。一つの事実を、広げる — 食い違い得る二つのコピーを決して作らない。
  3. **番号に値するバージョン2は、ほとんど目に見えない。**あなたのv2が機能リストなら、それはマーケティング付きのv1.5です。本物のv2は、誰も個別には指し示せない206のコミットで、それらが合わさって、ただあなたに嘘をつくのをやめる製品になるのです。

GeekBye v2.0.0は、それ以降のすべてのリリースが築いてきた土台です。その土台が何を支えているかについては、AIノートテイカーはなぜ悪いWi-Fiで止まるのかアプリが自分自身にDDoSを仕掛けた日(v2.0.1)、そしてファイアウォールがWebSocketを塞ぐときのライブ文字起こし(v2.0.8)をご覧ください。それらすべてが奉仕した穏やかさについては、GeekBye v2の新機能をどうぞ。

関連記事

アプリが自分自身にDDoSを仕掛けた日
Steven
Steven1 分で読める

アプリが自分自身にDDoSを仕掛けた日

起動時に一気に放たれた保留中アップロードの滞留が、あらゆるGeekByeクライアントを、自社サーバーへの小さなサービス拒否攻撃へと変えました。その修正 — そしてそれが私たちに作らせた接続生存性のはしご — は、v2が教えてくれた最も役立つことの一つです。

信頼性
ネットワーク
エンジニアリング
AIノートテイカーはなぜ会議の途中で録音を止めるのか
Steven
Steven1 分で読める

AIノートテイカーはなぜ会議の途中で録音を止めるのか

私たち自身のアプリが、相手が話している最中に2つの会議を終了させました。フォレンジックの痕跡をたどると、善意で作られたのに「あなたの声しか聞こえない」アイドルタイマーに行き着き — さらにデスクトップ全体をロックしかねない2つ目のバグも見つかりました。どちらもGeekBye v2.0.9で修正済みです。

信頼性
会議
エンジニアリング
AI文字起こしはなぜ専門用語を聞き間違えるのか(そして私たちはどう直したか)
Steven
Steven1 分で読める

AI文字起こしはなぜ専門用語を聞き間違えるのか(そして私たちはどう直したか)

ライブセッションで「what is the pointer in C++」が「what is the point in life」と聞き取られました。そのトランスクリプトからGeekBye v2.0.11に至るまでの調査記録 — keytermバイアス、接続を切断していたタイミング競合、そして自分たちの修正が裏目に出た日の話です。

文字起こし
信頼性
エンジニアリング