44 ポイント 投稿者 GN⁺ 2024-08-20 | 5件のコメント | WhatsAppで共有
  • 最近、著名な技術系CEOとエンジニアとの会話で、興味深いソフトウェア開発手法を聞いた。この手法を通じて、別のヒューリスティックや一般化について考えるようになった。

彼の方法

  • 一日の始めに機能開発に着手する。一日の終わりまでに完了できなければ、すべて削除して翌日にまた最初から始める。作成した単体テストは保持してよい。
  • 数日たってもその機能を実装できないなら、その機能を可能にする基盤、インフラ、またはリファクタリングを考え、それを実装してから機能に戻る。
  • この方法は、90年代後半から2000年代初頭のエクストリーム・プログラミング運動に似ている。

方法についての考え

「すべてを二度書く」

  • ジュニアエンジニアに与える助言: 問題を解決し、コードをブランチに保存したあと、もう一度書き直す。
  • ノートPCが故障したあと、この方法を偶然発見した。書き直しには最初の実装の25%の時間しかかからず、結果ははるかによくなった。
  • 1.25倍の時間で、2倍高品質なコードを得られる。長期保守が必要なプロジェクトに有用。
  • 「毎日やり直す」方法はこれよりさらに極端だ。書き直すたびに、より洗練された解決策を見つけるようになる。

「量は質を持つ」

  • スターリンの引用はソフトウェアエンジニアにも当てはまる。ジュニアエンジニアには、最初の10万行のコードが不可欠だ。
  • 「毎日やり直す」方法は、その10万行をより速く書く助けになる。
  • 同じ問題を繰り返し解くことは、パターンを記憶するのに有益だ。
  • 5,000行の完璧なコードで主要なパターンはすべて見えてくる。残りの9万5,000行は、反復を通じてニューロンを再配置する。

「頭に銃を突きつけられたら」ヒューリスティックとの比較

  • 問題の解決策を提示した人に、「24時間以内に終わらせなければならないとしたら、どうするか?」と尋ねる。
  • この方法はフレーミングとアンカリングのバイアスを壊す。しばしば数分で、1日で終えられる計画へと導ける。
  • 実際には1日で終えられる計画ではないが、新しい解決策はしばしば数日で完了できる。
  • この思考実験の目的は、実際の解決策を生み出すことではなく、解決策の下限を設定することだ。

経路探索

  • 問題空間で経路を見つけることが核心だ。各経路が解決策であり、エンジニアの役割は最良の経路を見つけることだ。
  • こうしたヒューリスティックと、さまざまな経路探索アルゴリズムのあいだの類似性を考えてみる価値がある。
  • エンジニアリングのヒューリスティックも同様で、より優れたエンジニアになるとは、問題空間でより良い経路を見つけることだ。

GN⁺の要約

  • この記事は、ソフトウェア開発における効率的な方法論とヒューリスティックを探っている。
  • 「毎日やり直す」方法と「すべてを二度書く」方法は、コード品質を高めるのに有用だ。
  • 反復的な問題解決は、パターン認識とニューロンの再配置に役立つ。
  • 「頭に銃を突きつけられたら」ヒューリスティックは、解決策の下限を設定するのに有用だ。
  • 問題空間で最良の経路を見つけることが、エンジニアの中核的な役割だ。

5件のコメント

 
ahwjdekf 2024-08-21

正気ですか? こんなこと、時間が有り余っている人間にしかできないでしょう。これが現実的に成り立つ行為だとでもいうんですか?

 
dlehals2 2024-08-22

韓国のSI環境では無理でしょうね..(笑) 個人プロジェクトでなら

 
kaistj 2024-08-20

このアプローチはまったく思いつかなかった方法ですね。
一度試してみようと思います(笑)

 
eususu 2024-08-20

書き直しについてはとても共感します。
以前、作業していたコードをうっかり消してしまい、書き直しているうちに
途中で設計を変えるのが面倒で無視していたことも考慮して作るようになって、
結果的にはむしろ良くなりました。

 
GN⁺ 2024-08-20
Hacker Newsの意見
  • 新しい機能を2回書くのは良い戦略だ。ただし、ビジネス開発者やプロジェクトマネージャーには不要な遅延に見えることがある

    • 機能を最初から最後まで書くことで、ロジックを整理しリファクタリングする助けになる
    • 書き直しによってロジックの流れが明確になり、より直線的に計画に従えるようになる
    • 後になって大規模なリファクタリングが必要になる可能性を減らす傾向がある
  • 「24時間以内に終わらせなければならないとしたら?」という質問は、プロジェクトマネージャーがするようなものではない

    • これは個人的な学習のための練習であって、仕事をより早く終わらせる方法ではない
  • 良いコードは、適切な抽象化を選んで書かれる

    • 適切な抽象化を選ぶには、全体を理解している必要がある
    • 他の工学分野では、CADレイアウトのような優れた設計図のパラダイムが使われている
    • ソフトウェアにはそのような設計図が不足している
    • 経験が重要なのは、そのバランスを取るためだ
  • 有能な同僚がいれば、短時間で何ができるかを示せる

    • 素早く作業することが重要な理由は多い
    • 自動車修理と同じで、時間がかかるほど再組み立てを忘れる可能性が高くなる
    • 1日で機能を実装できればリスクは減る
    • ツールに対する確かな理解と、信頼できるCI/CDプロセスが必要だ
  • ソフトウェアを2回書くのが良いという意見には共感する

    • 一度書いたコードを失ったあと、もう一度書く意欲を失う
    • 書き直そうとしても集中できず、どういうアプローチだったか思い出せない
  • 数日たっても機能を実装できないなら、必要なインフラやリファクタリングを先に行うべきだ

    • ツールの「語彙」を構築し維持することが重要だ
  • 「24時間以内に」と「すべてを2回書く」は互いに関連している

    • コードを雑に書けば、結局は書き直すことになる
  • この投稿は最高の「プログラミングの助言」の1つだ

    • grug brained developerの助言に似ている
  • ときには問題を解決するためにバックグラウンドスレッドを回しておく必要がある

    • 経験のある人ほど、こうした問題をより早く特定できる
    • 問題をしばらく放置して別のことをしたほうがよい場合もある
  • 次のアプローチが有用だ

    • まず問題を解決するための複数のアイデアを書き出す
    • 作業を「1セッションの中で完了できる」形に分割する
    • セッションの終わりごとに、コードが常に「動作する」状態になるよう実装する
    • セッションの終わりごとに、コメントやREADMEへブレインダンプを書く