HN 日本語サマリー

← 一覧へ戻る
プログラミング

GNOME開発者の愚かさと傲慢さ(2024年)

The stupidity and arrogance of GNOME developers (2024) (felipec.wordpress.com)

39 pointsby Muhammad52314 コメント

要約

この記事は、GNOMEプロジェクトのvteライブラリにおけるバグ修正の経緯を批判しています。筆者は3年前に提供した修正案が無視され、GNOME開発者が後に類似の修正を自ら実装したものの、その過程でユーザーを長期間不便な状態に置いたと主張しています。開発者の傲慢さと、問題解決における非効率性を指摘しています。

全文翻訳

2026年アップデート動画:GNOME vte開発者はまだ理解していない。彼らの無能さの要約を示す動画を作成しました。今日に至るまで、彼らはこれらのことを全く理解していません。 約1年前、GNOMEプロジェクトの人々のひどい開発手法が、私がGNOMEを使っていなくても悩まされていたvteのバグにつながった経緯を説明するブログ記事を書きました:GNOMEのひどいコーディング手法。 この記事は非常に技術的ですが、もしそれを読み通すことができれば、彼らが間違いを犯し、数人のユーザーが長年(私だけでなく)そのバグについて不満を述べていたにもかかわらず、その間違いを認めることを拒否したことは明らかです。 しかし、本当の問題は彼らがバグを修正することを拒否したことではなく、私が完璧に有効な修正を提供したにもかかわらず、彼らがエゴのためにその merits を検討することさえ拒否したことです。 今日、アップデートがあります:彼らは独自の修正を思いつきました。しかし、皮肉なことに、彼らの修正は私の修正を難読化し、より劣ったバージョンです。 では、問題は何でしょうか?多くの人が、これは私のエゴを高めるための「だから言っただろ」という報復だと推測するでしょう。いいえ、問題は私の修正が3年前に利用可能だったことです。 彼らが私を無視し、検閲したことで達成できたのは、彼ら自身のユーザーを傷つけることだけです。彼らは私の修正をずっと前に適用できたはずです。 複雑な詳細に入る前に、問題がイベントが発生したときにイベントのシグナルを送信していなかったために発生したことを明確にすることが役立つと思います。しかし、問題は複雑ですが、修正は非常に単純です:イベントが発生した直後にイベントのシグナルを送信することです。文字通りそれだけです。それが私の修正が行ったことであり、最終的に彼らが行ったことです。 彼らは3年間、シグナルを遅延させることが良いと主張していましたが、結局、私が最初に主張した通り、シグナルを遅延させないパッチを思いつきました。 もし彼らが間違いを犯し、数年後にそれに気づいたのであれば、それは理解できる人間的なことでしょうが、そうではありません。 私は彼らが間違いを犯したから愚かだと言っているのではありません。彼らがそうしたという事実をまだ理解していないからです。したがって、同じ間違いを再び犯す可能性が非常に高いです。 このリグレッションに対処する際に彼らが行った間違いの要約は以下の通りです。 リグレッションの導入を検出できなかった リグレッションを導入した変更を元に戻すことを拒否した リグレッションの回避策を講じた 完全に有効な修正を拒否した 有効な修正の merits を検討することを拒否した リグレッションを軽減するための他の選択肢を検討することを拒否した 問題をトラッカーでロックし、検閲した 複数の報告があったにもかかわらず、バグがあったことを認めることを拒否した 最終的に有効な修正を適用した 有効な修正がすでに利用可能であったことを決して認めなかった 問題 問題全体を理解するために仮想端末に関するすべてを理解する必要はありません。理解する必要があるのは2つのシグナルだけです:child-exited(子プロセス終了)とend-of-stream(ストリーム終了)。 child-exited 端末(gnome-terminalのようなもの)を実行すると、常にすべてを駆動するプロセスがあります。例えばbashです。これが「子」プロセスです。 子プロセスが終了すると、通常は端末も終了させたいと思うでしょう(開いたままに設定することもできますが)。最終的には、ユーザーが何をしたいかを決定することになりますが、端末ライブラリ(この場合はvte)の仕事は、ユーザーが望むことを実行するために、関連情報を端末(gnome-terminalなど)に提供することです。 これは、bashが終了したときに、その情報がgnome-terminalに伝えられ、99.9%のユーザーが望むようにすぐに終了できるようにする必要がある、ということを複雑に言っているだけです。 end-of-stream ほとんどの場合、ストリームは子プロセスが終了したときに終了します。「ストリーム」とは標準出力を考えることができます。したがって、bashが終了すると、それ以上の出力はなくなります。なぜなら、プログラムはそれ以上のコマンドを実行できないからです。完了です。 プログラムが完了すると、すべてのファイルディスクリプタ(stdoutを含む)が閉じられます。 bash -c 'echo "bye dad"' しかし、これは常にそうとは限りません。プロセスは常にサブプロセスを起動できます。そして、それらのサブプロセスのそれぞれは、標準ストリームを継承します。したがって、bashの子プロセスはすべて、bashの標準出力を継承します。 bash -c '(sleep 10; echo "bye grandpa") & exit' 上記の例では、bashはすぐに終了しますが、子プロセスを起動し、その子プロセスは10秒後に「bye grandpa」と表示します。 これは、bashが終了しても、stdoutファイルディスクリプタはまだ閉じられない可能性があることを意味します。言い換えれば、end-of-streamシグナルは、子プロセスが終了したときではなく、子孫プロセスが終了したときに送信されるということです。なぜなら、bashが終了してもstdoutファイルディスクリプタは開いたままになるからです。 それをストレートに教えて これは実際には何を意味するのでしょうか?実際には、bashが終了しても、stdoutファイルディスクリプタはまだ閉じられていない可能性があるということです。言い換えれば、end-of-streamシグナルはchild-exitedシグナルよりも後に来る可能性があるということです。 2019年に導入されたバグは、end-of-streamシグナルがまだ来ていない場合、child-exitedシグナルが遅延することでした。そして、この遅延は無限になる可能性がありました。 では、gnome-terminalのような端末は、いつ終了すべきかを知るために、どうすればよかったのでしょうか?それはできませんでした。そして、それがリグレッションでした。 すぐに終了するには、端末はchild-exitedシグナルをすぐに受信する必要がありました。そして、コミット7888602c(lib: child exit and EOF handlingのリワーク)の後、それはもはや起こらなくなりました。それは無限に遅延し、その後5秒に制限され、最終的には2秒に制限されました。しかし、遅延は存在し、それが問題でした。 https://i.imgur.com/4Efn9cr.mp4 修正 ユーザーが端末をすぐに終了させたい場合、child-exitedシグナルはすぐに送信される必要があります。それはそれくらい単純です。 ばかばかしく単純 上記の問題の説明の複雑さが、一部の人々を混乱させたかもしれませんが、修正を理解してもらいたいと思います。 修正とは、イベントが発生したときに、そのイベントのシグナルを送信することです。したがって、修正とは、子が終了したときに、child-exitedシグナルを送信することです。修正がこれ以上単純になりようがあるとは思いません。 あなたに考えるようには頼んでいません 誰か(アシスタントのような人)に、「NVDA株価を監視して、850ドルを下回ったら教えて」と言ったとします。そして、株価が825ドルであることを知った場合、この男に腹を立てるのは当然ですが、心配しないでください、あなたのアシスタントには説明があります。彼は落ち着いてあなたに説明するかもしれません。「あなたの目標はお金を稼ぐことだと知っているので、お金を稼ぐ最善の方法は株価が800ドルのときに株を買うことだと推測しました。株価はまだ825ドルなので、買う時間ではありません」。しかし、あなたは彼に「買う時だと思うときに通知して」とは言いませんでしたね?その決定を彼に委任したことはありません。 このバグは非常に似ています。 端末はvteに「子プロセスが終了したら通知してください」と言っています。そしてvteは「まだ端末を閉じる時間ではありません」と返してきます。しかし、端末が尋ねたのはそれではありません。 見てください、GNOME開発者がユーザーよりも自分たちの方がよく知っていると思っているだけでなく、これらのライブラリのユーザー(つまり、xfce4-terminalや数え切れないほどの他の開発者よりもvteの開発者)よりも、GNOMEライブラリの開発者の方がよく知っていると思っているのです。彼らは、子が終了したときではなく、端末が閉じられるべきだと彼らが信じるときにchild-exitedシグナルを送信することが望ましいと主張しました。 不正なライブラリ 私は彼らに、child-exitedシグナルは子が終了したときに送信されるべきだと説明しました。子が終了した瞬間にchild-exitedシグナルを発行することが有用ではないと主張するには、かなり高度な精神的体操を行う必要があります。 フェリペ・コントレラス 彼らは、端末がいつ閉じられるかを決定するのは自分たちだと主張しました。 これまでの経験を要約すると、元のバグでも、そのバグに対する(他の何かを壊した)「理想的とは言えない」修正でも、望ましい動作はこれらすべてを同時に組み合わせたものです。 直接の子からのすべての出力を処理します。その後、終了(または再起動、または何らかの処理)を行います。