2 ポイント 投稿者 GN⁺ 2024-05-27 | 1件のコメント | WhatsAppで共有

1件のコメント

 
GN⁺ 2024-05-27
Hacker News のコメント
  • 「悪いコード」に関する経験はいくつかある。1人で作業することが多かったが、チームで、動きはするものの最適とは言えないコードを書いたこともある。新しい作業とあわせて古いコードをリファクタリングしようとすると、しばしば却下され、必要なリファクタリングや修正をチケットに残しても、たいてい優先度を下げられるか無視された
    1人なら必要な作業を優先順位に入れられるが、チームでは次善の判断が永遠に残ったり、「システムダウン」の瞬間まで放置されたりする。その後のポストモーテムで、何カ月も前からその爆弾を直そうと依頼していたチケットを指すと、「非難」や「攻撃的」と受け取られ、結局のところ解決策は次善のコードを絶対に書かないことのようになってしまい、コーディング時のフラストレーションと不安が増した
    2017年に、2003/2004年に書いたコードを直してほしいと連絡を受けたこともあるが、そのコードはまだ本番で動いていた。壊れたコードや妥協した部分を見直し、その責任者がまさに自分だったと気づくのはかなり謙虚にさせられる経験で、その後、保守可能なコードとドキュメント化に対する見方が大きく変わった
    • チームや会社による。開発者がコード保守やリファクタリングに時間を使うよう奨励され、ときにはそれだけをやるよう強制され、行き当たりばったりのプロダクト要求よりもエンジニアリング中心の作業が優先され、きちんと終わらせるためにスケジュールも調整されるチームを多く経験した
      S&P 500 の大企業、1億〜10億ドル規模の企業、スタートアップまで含めて、こうした経験は普通だった。このような場合には、合理的な妥協をし、ビジネス上の必要も押さえられる熟練したソフトウェアエンジニアとマネージャーがいて、エンジニアが顧客と直接やり取りすることも多かった
      要はバランスであり、そのバランスはたいてい、バランスよく判断できる人によって作られる。「完璧」だけを追い求めると終わりのないリファクタリングと未リリースに向かい、技術的負債やゴミのような品質を無視すると、時間がたつにつれて事業が崩れることもある。どこに位置取るかは、プロダクト、業界、顧客、ビジネスによって変わる
    • 英雄として死ぬか、10年前の git blame に自分の名前を見るほど長く生き延びるかのどちらかだ
    • 「動くが最適ではない」は、時間が足りず、やることが多いときにはしばしば受け入れられる妥協だ。「完璧は善の敵」のような MBA 的な標語も、何かが欠けているときに使える表現ではある
    • 2017年に2003/2004年に書いたコードを直しに呼ばれたということは、私たちはみなタイムトラベラーだということでもある。過去の自分には寛大で、未来の自分には少し失礼だ
      過去の自分は若くて純真だったが生産的で、多くの山を越えた。コードを把握するのに2日かかったが、結局かなり賢かったし、今の自分が全部忘れているのは記憶力が悪いせいかもしれない
      未来の自分はすべての過ちを正すだろう。もっと年を取り、賢くなっていて、XXX と TBD を賢いコードに置き換え、良いアイデアは実装し、まあまあのアイデアは再実装する無限の時間があると信じている。もっと良いコメントがあれば、この3人は1つになれるかもしれない
  • この正義の「その1人」みたいな態度は有害だと思う。シニア開発者が、自分の犯したミスや失敗したことを語れるのは、とても解放的で健全だ
    単なる学習機会であるだけでなく、オープンな文化を示し、インポスター症候群にも対抗する効果がある。完璧主義的な態度はその逆で、「もっと努力してミスをするな」がすべてなので、学べることはなく、個人の努力だけをさらに求めることになる
    • 少なくとも2回は、「その1人」が大きなミスを認めず、良い顧客を失ってでも回避し、陰で悪口を言っていただろうと思う
      あるとき、ジュニアが報告書に誤ったソフトウェアバージョンを入れた小さなミスを私が引き受けた。顧客に「ミスがあり、修正済みの報告書はこちらです」と言えば済むことなのに、上司は「これを隠して、われわれが完璧だという体面を保てるか?」だけを考えていた。同じ人物が、他人のミスは値引き、補償、無償提供を要求する機会にしていた
    • たいていの人は自分の仕事をしながら良くなっていると思う。私たちの構成管理には、私が書いた、機能的にはよく動くものがかなりあるが、ツールを1〜2年扱ってみると、いろいろな理由で品質はかなり悪いと言うようになった
      それでも問題ない。変える理由ができたら整理すればよく、それまでは悪い慣行と、より良いアプローチを示す例として残っている
    • 自分自身の中に批判すべき点を見つけられないなら、成長していないということだ。そうした自己批判を共有すれば、ほかの人も私のミスから学び、自分のミスから学んでもよいのだと分かる
  • コードレビューで「なぜそのミスをしないだけで済まないのか」や「なぜただこうしないのか」といったことをよく聞く
    最近は「たぶんあなたの IQ が私より高いからでしょう。私は IQ が低いので、もっと愚かで単純なことをしなければなりません」と返している。すると相手が、自分がどれほど内省もなく人を見下す小さな変人のように振る舞っていたかに気づき、顔を赤らめることがある
    • 「なぜただ……しないのですか?」で始まる質問には、少しアレルギーがある。その3語を聞いただけで、たいてい後に続く提案を予想できるのだが、それはものすごく複雑だからではなく、たいてい最初に思いつく当たり前の方法で、すでに慎重に検討済みか試行済みだからだ
      質問自体が悪いわけではないが、「私のアイデアはとても簡単だ」と「あなたはこの明白で簡単な考えに気づかなかった」という前提が、いら立たしく、あるいは侮辱的に感じられる。逆に自分が他人に尋ねるときは「なぜただ」を避けるようにしていて、「X をしなかったのには何か理由がある、と理解してよいでしょうか?」のように聞くか、単に親切に理由だけを尋ねるほうがよい場合がある
      文脈不足から出る質問なら、自分のしたことを説明する前に、最も obvious な方法がなぜ駄目だったのか、あるいは厄介な要件や問題となる入力を先に明らかにしておくことで防げる。すでにコミットされたコードなら、コミットやマージリクエストのコメントで、後からの蒸し返しを減らすのが目標になる。ときには反論せず、その方法を試したがなぜ駄目だったのかを直接説明し、本当にほかのアイデアがあるか尋ねるのも有用だ
      本当に自分が考えていなかった提案で、問題を解けそうなら、良いアイデアだと言って実装を手伝ってもらう。そういうとき、相手の前提や言い方に反発したくなる誘惑はあるが、ただ受け入れて少し恥ずかしがるほうを選ぶようにしている
    • grug brain を非常によく適用した例だ https://grugbrain.dev/
      「複雑さとティラノサウルスのどちらかと1対1で戦えと言われたら、grug はティラノサウルスを選ぶ。少なくとも grug にはティラノサウルスは見えるからだ」
    • 冗談でないなら、最初の質問は役に立たず、ほとんど意地悪な行為だ。誰でもたまにはミスをする

2つ目の質問は、たいてい妥当なフィードバックになり得る。人々のスキルと知識は常に重なっているわけではない。Aにとってめちゃくちゃ複雑なものがBにとってはそうではないこともあり、その逆もあり得るし、必ずしもどちらかがより賢いからというわけでもない。AはSQLを知らないかもしれないし、Bはpandasを知らないかもしれない
すでに技術スタックにSQLとpandasの両方があると仮定すると、あるコードをSQLからpandasへ移したり、その逆に移したりするのが理にかなう場合がある。オブジェクト指向スタイルを簡単だと感じる人もいれば、関数型スタイルを簡単だと感じる人もいる。何がより妥当かは常に明白とは限らないので、その質問がよい質問である可能性はある。提案が悪ければなぜ悪いのかを説明し、よければ今やる価値があるかを考えればよい。中間だったり時間がなかったりするなら、それを認めて先へ進めばよい

  • 別の選択肢は、ただ明らかに同意することだ。「そうですね、愚かでしたよね?」や「そうですね、そうすべきではなかったかもしれません」、あるいは「考えてみます」と答えられる
    そうすると、相手は次善のことをしたという理由でこちらに恥をかかせたり罪悪感を抱かせたりしにくくなる。こうした発言の目的は、しばしば羞恥によるマウンティングだと思う。そのゲームに参加しないという選択であり、たいていそれが勝ち筋だ
  • 無知から出た発言なら、わざわざ攻撃として受け取り、相手に恥をかかせて代償を払わせる必要はない
  • 以前見たブログや記事を見つけられないのだが、メッセージは「コードの中に最適でないものを見たからといって無能だと決めつけるな」というものだった。そのコードを書いた人には、厳しい締め切り、別の優先事項、その他の要因のせいで、すぐに「正しいこと」をできなかった事情があったのかもしれない
    • 書かれた当時はコードが完璧だったとしても、コードベースの成長や要件の変化によって悪くなり得る
      たとえば保存する項目が10個なら単純なファイルが実用的な選択かもしれないが、10,000個になればデータベースが必要になるかもしれない。ところが最初から10個のためにデータベースを使っていたら、過剰設計だと文句を言われていただろう
      クラスが2つならif/elseで十分だが、20個になればFactoryパターンが必要になるかもしれず、最初からそうしていたらアーキテクチャ宇宙飛行のように見えただろう。こうした成長を予測しようとして外すと、複雑なコードを作ることになる。開発が続くプロジェクトは、構造的に自分自身より大きくなっていく
    • チェスタトンのフェンスというものもある。コード内のばかげたものが、以前は実際に重要だった可能性がある。さらに悪いことに、今でもまれな境界ケースでは重要なのに、まだその理由が見えていない可能性もある
    • 関連して、ここに書いたことがある: https://camhashemi.com/posts/building-through-uncertainty/
  • ブログ記事について、ここやredditで何度か悪意あるコメントを受けたことがある。そういうときは、判断を加えずにその悪意あるコメントへのリンクを記事に追加して光を当てるやり方を使う。たいてい何も起きないが、ときどき議論をより健全な方向へ戻すことがある
    • 私もかなり多く受けたことがある。一部はたぶん当然のものだっただろうが、大半はそうではなかった可能性が高い。いくつかはある程度正しかったが、役に立たなかったり、コミュニティに直接害を及ぼしたりした。正しいことを間違ったやり方で言えば、それでもなお間違ったことを言っているのだ
      悪意あるコメントを判断なしにリンクするのは悪い考えではない。コメントがdead扱いされると常にできるわけではないが、いずれにせよ同じやり方でやり返しはしない。自分にもできるが、ガソリンは効果的な消火剤ではないと学んだ
      自分が間違っていたなら、その間違いがあった同じ場所で、すぐに認めるようにしている。公の攻撃の後に非公開で謝罪するのは特に嫌いだ
      とはいえ線引きはある。私は自分がかなり良い仕事をしていると感じているし、40年ほど長くやってきて、その間に多くを学んだ。低品質な仕事を受け入れない厳しい環境でも働いたことがあるので、ちゃんとした仕事を習慣的にするようになった
      一般に、公の場で他人を裁くことは避けている。役に立たないし、自分が常に正しいわけでもないからだ。ただし、一緒に働く場合やその人のものを使う場合は別かもしれない。私がゴミを受け入れないという理由で荒っぽく攻撃されたこともあるが、Linus Torvaldsのようには振る舞わない。可能なら敬意ある形で、その仕事は自分には受け入れられないと伝える
      それでも常に改善し、新しく学ぶことはでき、ときにはまったく予想もしなかったところから学ぶこともある。こうした学びに開かれているのは、基本的に良い方針だ。私は間違い、学ぶことで正しくなる。「良い判断は経験から生まれ、経験は悪い判断から生まれる」
    • 私の好きなポッドキャストの1つであるYouTubeのwell there's your problemは、ポッドキャストに文句を言うコメントをほぼ必ず固定表示する。たいていは「このポッドキャストが気に入らないから別のポッドキャストになるべきだ」という程度の不満で、固定されるコメントは毎回、そのエピソードで可能な限り最も愚かな解釈に近い
      そういうコメントを減らす効果があるのかは分からないが、そういう形で言論に参加する人に比喩的なばか帽子をかぶせる意味はある
  • 一部のエンジニアに悪い態度があるという点には同意する。誰でも悪いコードを書くことがあり、すべてのコードは悪く、負債であるという論理にも一理ある
    この記事は「No more pink mustache」とあわせて読むと興味深い。その記事でLyftは「信じがたい規模で壊れている」と描写されているが、品質の原因はしばしば椅子に座っている人ではなく組織なのだ :-)
    [1] https://rachelbythebay.com/w/2020/02/29/poof/
  • 2018年にこの記事を読んで、また上がってきてうれしい。自分に問いを投げかけさせた記事の1つだった。絶対主義や極端さをなくせないなら、こうした会話や人に接するとき、どんなフィルターを作れるのかと考えるようになった。自分なりのモデルはあるが、他の人はどんな戦略を使っているのか気になる
    • こういう人たちは、自分のものではない感情的領域を占有しようとする。たいてい自分が「そうしてもよい」とあらかじめ計算しており、それは相手を弱いと見ているという意味だ
      選択肢は3つある。諦めてその領域を明け渡し、そのまま人生を続けること。不公平さのせいで眠れない夜が少なければ少ないほどよい。正面から対抗すること。彼らは戦う準備ができているが、立場自体が本質的に不合理なので、彼らの思考空間に引き込まれなければ引き込まれないほど「勝つ」。上から降りてくること、つまり彼らが間違っているという社会的証拠を彼らの空間へ持ち込むことだ。元の記事の場合なら、お互いの仕事を尊重し、揚げ足を取らずに生産的に働くプログラマーたちがそれに当たる
  • 誰かが「こうしたほうがよかったかもしれない」と助言するとき、それが常に自分への攻撃や能力への侮辱とは限らない

助言する人が対人関係の苦手な間抜けかもしれないし、単に完全な間抜けかもしれない。世の中の一部が自分に同意しなくても大丈夫。人々が反対意見を言ったり同意しなかったりするからといって、自分を脅かしているわけではない

  • 奇妙な文章。ツイートのように聞こえ、中身は少なく、タイトルは本文を反映していないのでクリックベイトのように見える
  • その要旨に反対するわけではないが、反対側の見方もある。フィードバックを受け入れる能力も必要
    • ほとんどの人はフィードバックを受け入れて適用できる。ただし、フィードバックの出し方がひどいのに、相手がフィードバックを受け入れられないのだと思い込む人もいる
      こういう人たちは、自分の好むフィードバックのやり方が最善で、誰もが同じように感じるべきであり、そうでなければ相手が変わるべきだと考える。もちろん間違っている。だがこれを指摘すると、なぜ最初の文で「ほとんど」と言ったのかを自ら示すことになる