世界を動かす技術を、日本語で。

開発者のブロック

概要

  • ソフトウェア開発者 にも「Writer’s block」に似た 開発者ブロック が発生
  • 新規プロジェクトや既存プロジェクトで異なる 原因 と対処法
  • 学習・休息・小さな成果 でブロックを解消
  • プロトタイプ作成やドキュメントの下書き 活用
  • 早期リリース・最適化の先送り も有効な戦略

ソフトウェア開発者のブロック:原因と乗り越え方

  • Writer’s block のように、ソフトウェア開発者も 開発者ブロック に悩む現象
  • 車輪が空転 し前進できない状態の比喩
  • ブロックの種類、原因、解決策を整理

新規プロジェクトでのブロック

  • 最高傑作 を目指す意識による 過剰な理想追求
  • テスト導入 (ユニット・統合・fuzzテスト)による作業量増加
  • ドキュメント充実 (README、ユーザーガイド、コミュニティ標準など)の負担
  • コーディング規範 (命名・モジュール化・再利用性)厳守への固執
  • 言語・ツール選定 にこだわりすぎて作業が進まない状態
  • バージョン管理・CI・クロスコンパイル などの初期設定過多
  • エラーハンドリング・診断・並行処理対策 の徹底により着手困難
  • これらのベストプラクティスが積み重なり 手が止まる現象

既存プロジェクトでのブロック

  • 新規参加者の圧倒感 :コードベースや慣習、言語への不慣れ
  • 長期関与者のモチベーション低下 や疲弊
  • 理解を急ぎすぎる ことによる混乱
  • 実装言語・独自規約 への戸惑い
  • オーバーワークやる気喪失 による停滞

ブロック解消の具体策

学習に時間をかける

  • ユーザー目線で動作確認 し全体像を把握
  • ドキュメント・テスト を読んで外部仕様を理解
  • ソースコード閲覧 で内部構造のモデル化
  • 質問を恐れず 他の開発者に相談
  • 新しい言語の基礎学習 を怠らない
  • 分からない機能は都度調査 し理解を深める

疲労の自覚と休息

  • 定期的な休憩や休暇 の重要性
  • 大型機能実装後は 小規模な作業(chore) でリフレッシュ
  • 技術的負債の返済 も気分転換に有効

小さな成果の積み重ね

  • 小さな機能やバグ修正 から着手
  • テストやドキュメントの改善 は後回しでもOK
  • 全てのベストプラクティスを一度に実践しない 柔軟性

プロトタイプ(スパイク)の活用

  • 短期間で動くものを作る ことに集中
  • ハッピーパス重視 で最低限のテストだけ追加
  • プロトタイプは別ブランチ管理 し、実装時は参考程度に留める
  • 依存関係の調査 にもプロトタイプは有効

ドキュメントは下書きから

  • フォーマットや完成度にこだわらず コードと一緒に管理
  • 設計理由や基本的な使い方 のみ記載
  • ユーザー増加後に本格的な整備

最適化は後回し

  • Michael A. Jacksonの最適化ルール :「やるな」「まだやるな」
  • 本当に問題が発生した時のみ最適化 を検討
  • プロファイリングでボトルネック特定 し、段階的に対応

早期リリースと頻繁な公開

  • 未完成・既知の課題があってもリリース
  • 進捗実感とユーザー・開発者からの早期フィードバック 獲得

優先順位の見極め(Yak shaving回避)

  • 依存ライブラリのドキュメント不足 に深入りしない
  • 最小限の個人メモ で済ませ、後で余裕ができたら貢献を検討
  • ツールの不具合対応も最小限 に留める

まとめと問いかけ

  • あなたも開発者ブロックに悩むことがあるか?
  • 解消法や工夫があればぜひ共有を
  • Hacker Newsの議論や便利ツール(git worktree)も参考

関連ツール・TIPS

  • git worktree :プロトタイプ用ブランチを別ディレクトリで同時に編集可能
  • 質問はスマートに :効率的な問題解決のためのスキル
  • 技術ブログやコミュニティでの情報交換 も有効

参考

  • Michael A. Jackson の最適化ルール
  • Hacker News での議論や関連ポスト
  • git worktree 活用例

Hackerたちの意見

この記事にはすごくいいアドバイスがたくさんあるね。私が20年のソフトウェア開発で学んだ一番のポイントは、体が休めと言ったら休むこと。やることリストにタスクがあったり、GitHubに新しい問題があったりしても、無理にプロジェクトを進めるのは絶対にダメ。気が乗らないなら、作業をやめちゃいな。

これは自分のサイドプロジェクトに取り組んでいる人にはいいアドバイスだと思う。でも…私は雇われてるんだけど?つまり、「休暇を取れ」ってことにはなるけど、単に働かなきゃいけない日にはあまり役に立たないアドバイスだよね。

ゴールデンルールなんてないよ。俺にとって、仕事も好奇心からの学びもストレスになる活動なんだ。爪を噛んだり、バルサルバ呼吸したり、肌荒れしたり…それを乗り越えて日々を繰り返すしかない。感情に頼ってたら、無目的な活動しかできないし。このネガティブな感情投資が、俺の能力を向上させる唯一の方法みたい。Ankiで学んだり、ピアノで曲を弾いたりしてると、習慣は6ヶ月の定期的な練習で止まることもある。でも、ストレスや怒りの境界にいると、なぜかそれが続くんだよね。

記事にはいいアドバイスがたくさんあって、ほとんどの開発者はある程度直感的に知ってると思う。ただ、問題なのは、企業文化がこれを無視しがちで、経験上とても厳しいってこと。常に期限通りにすべてを納品しなきゃいけないと、こういうアドバイスを実際に活用することができないんだ。たとえば、学ぶための時間を取るのは、マネージャーが許可してくれないとできないし、同僚(技術系も非技術系も)がそれを問題視しないことも必要だし、時間を取ることの代償がネガティブなパフォーマンスレビューにならないことが前提なんだ。

全体的に素晴らしいアドバイスだね。 > 学ぶには時間をかける でも、特にこれが目立つ。私たちはどんどん早くコードを出すように追い立てられている。AIがそのプロセスをさらに加速させている。新しいことを学びたいなら、スピードを落として、もっとやれ、もっと出せ、もっと稼げと迫る力に逆らわないといけない。AIツールを使っているなら、みんながやっていることとは逆のことをしてみて。生成されたコードを受け入れるたびに、すべての行をじっくり見て、明確な質問をして、代替の実装を求めて、トレードオフについて尋ねてみて。好奇心を持つことが大事だよ。これには時間がかかるけど、それがポイントなんだ。

早くリリースし、頻繁にリリースする これには賛成だな。できるだけ早く統合されたプロダクトを持つのが効果的だと思う、たとえそれがスタブの集まりでも。どんなに前もって計画を立てても、最終的なプロダクトがどうなるかはほとんど分からないから、できるだけ早く全体のシステムをテストして反復できることがすごく重要だよ。これが、私がテストハーネスをよく使う理由の一つでもあるんだ。[0] [0] https://littlegreenviper.com/testing-harness-vs-unit/

テストハーネスについてのリンク先の投稿、素晴らしいね!シェアしてくれてありがとう!

睡眠。脳にとって最高のサイドタスクだね。これ、何回経験したことか。機能やバグに悩んで、考え続けて、何時間も長所と短所を天秤にかける…後戻りするようなことは始めたくないから。疲れてるのに、明日のために決断を下すまでは寝たくない。今すぐ寝て。そうしたら、起きたときにはすぐに何をすべきか分かる。信じられないくらい、寝る前は見つけるのが難しかったのに。そしてそれを実行する。うまくいく。そして、睡眠が鍵だったって分かる。

あと、運動もね。睡眠はあなたを回復させる。運動はその火花だよ。

その通り。私ももう遅くまでコードを書くことはないよ。休息は必須だね。

睡眠と運動が大事だってのは同意だね。痛みや不眠で夜中に目が覚めて、すぐに寝られない人もいるし、運動が楽しくないほどの痛みや怪我を抱えてる人もいる。寝て運動しろって言うのは、ホームレスや飢えてる人に「街を出て、仕事を見つけて、いい夕食を食べて、家を買え」って言うようなもんだよ。聞こえはいいけど、頑張るけど、君のいる世界とは違うし、理解してないよね。

子供たちがもう少し協力してくれたらなぁ…。

俺はただお風呂に入るだけ…お風呂の中で最高のアイデアが浮かぶんだよね。

気づいたことなんだけど、睡眠や休息がくれるのは新しい洞察というより、決断する勇気や、やるべきことを進めるための根気なんだよね。

ほんとそれ。年を取るにつれて、難しい問題に半夜働く代わりに、終わりにその問題を置いておくようにしてる。朝に再開すると、解決策が見えてくることが多い。そういう問題が後で解決されるかって言うと、時々はそうだけど、しばしばそうじゃない。そしてもっと大事なのは、持続可能なペースを保ってること。難しい問題にほぼ常に取り組めるけど、燃え尽きないようにスペースを残してる。

これ、ほんとにイライラするくらい正確だね。最近、ずっと16時間以上働いてたんだ。強制的にやってたわけじゃなくて、純粋に obsession から来てたんだけど。作業時間は確かに目立ったけど、前の晩に難しいと思ってたタスクが、次の日にはあっさりできちゃったのが恥ずかしかった。

これ前にもシェアしたことあるけど、ここで関係あると思うから書くね。数年前、Facebookのリクルーターに面接に招待されたんだ。ほとんどうまくいったけど、leetcodeのアルゴリズムクイズで大失敗しちゃった。次の日、予想通り、面接のお礼の丁寧なメッセージが来て、他の候補者に進むことになったって。次の朝、目を開ける前に、まぶたの裏に完全な解答が見えたんだ。約20行のコードがね。頭の中でコードを追って、「よし!これでいける!」って思ったから、急いでコンピュータに駆け寄ってコードを打ち込んでテストしたんだ。バグが一つあったけど、それは古いJavaScriptで、var文を一つ忘れてたから、意図しないグローバル変数ができちゃった。でも、完璧に動いたよ。

Oxide and Friendsのポッドキャスト[1]がこれについてのエピソードをやったよ:Coder's Block (2021年10月25日)[2]。中には良い内容があって、私にとって一番良かったのは、詰まったときはデバッグインフラを書くことだね。[1] https://oxide-and-friends.transistor.fm [2] https://oxide-and-friends.transistor.fm/episodes/coders-bloc... 編集:句読点

いいね、ありがとう。

LLMの使い方の中で、これが一番役立ってる。ちょっとしたドラフトを強制的に作って、開発やライティングのブロックを乗り越えるために調整を始められるのがいいね。

同意する。最近、ずっとやりたかったサイドプロジェクトがあったんだけど、開発者のブロックを越えられなかった。LLMを使うことでそれを乗り越えて、進化させられるMVPを作ることができたよ。 https://www.awise.us/2025/07/27/source-generator.html

新しいプロジェクトがあって、これまでで最高のものになるよ。 これに対抗するための良い防御策は、過去のプロジェクトからの借り物を使うことだね。最終的には、最も一般的なもののテンプレートを作ることも。例えば、新しいサイドプロジェクトを始めるとき、以前のプロジェクトからウェブサーバー(イングレス)の設定を借りたり、CIパイプラインや以前のDockerfileの大部分を流用したりすることができる。時には、面倒な設定や構成がすでに終わっているサービス全体を借りることもある。これで、ある程度動くベースラインができて、あとは自分次第。もし改善したいなら、次回のテンプレートはもっと良くなって、他のプロジェクトにも必要なものをバックポートできるようになる。シンプルな解決策を選ぶのも助けになるよ:ビルドをトリガーするためのBashスクリプト、CI設定はそれを呼び出すだけ、環境やビルドにはDockerや似たようなコンテナを使う、イングレスはNginx/Caddy/Apache2/...、PostgreSQLやSQLite、Redis/Valkey、RabbitMQ、MinIOなどの専門的なものを使って、車輪を再発明しないようにする。時には、プロジェクトを助けるためのユーティリティスクリプトや小さなツールを書くのも役立つよ。何十年もやってる開発者たちは、俺よりずっと上手いから、そういうのをたくさん持ってるだろうし、開発作業をするためのdotfilesもたくさんあるだろうね。YAGNIのアプローチを取って、できるだけカスタマイズを少なくするのも役立つことがある。ストックのIDEインストールみたいに、色テーマやキーバインド、プラグインを気にせずに、ただインストールして始めるだけ。

確かにその通り。俺もよくプロジェクト間でコードをコピーしたりする。でも、特に別の言語を初めて使う時は、前のベストプラクティスを無理に当てはめようとしちゃうことが多い。例えば、昔はクラッシュした時にアドレス空間をディスクにダンプするメインフレームの製品を扱ってたんだけど、そのダンプを分析するためのいろんなツールを作ることができたんだ。別のプラットフォームに移った時、そのダンプがないから、全部を再発明しようとする誘惑があったけど、それは時間の無駄だったし、結局失敗してたと思う。

5、10年前にこれを試したことがあるけど、あんまりうまくいかなかったな。大きなグリーンフィールドのプロジェクトを始めることはめったにないし、3年ごとくらいかな。そうなると、ベストプラクティスが完全に変わってて、設定したものが古くなっちゃう。バックエンドでもそうだけど、フロントエンドはもっとひどくて、6ヶ月後には「完璧」なテンプレートが古くなってる。

休憩を取ったり、散歩に行ったり、一晩置いたり、他の簡単なことに取り組んだり、いつもの「修正策」を試してもまだ行き詰まってるときは、「とにかくやってみる」ってのが本当に助けになる。目標に少しでも関連するコードを書いてみると、たとえそれが後で消される完全なゴミでも、行き詰まりが解消されるんだ。ただ、その段階に達するまでに数日かかることもあるけどね。いつでも即座にパフォーマンスを発揮できるわけじゃないから。

これめっちゃ共感できる。書いてみたり、いろいろ試したりするところまで行くのがちょっと大変な時もあるけど、俺のベストな作品は二回目にやった時にできたことが多いんだよね。最初は適当にハック的なコードを書いて、全体の感じを掴むためにやって、二回目はちゃんとやるって感じ。

インターバルで家事をするのはいいと思う。実際の家事をすることで、リラックスしながら生産的になれて、他のメインのタスクから気を紛らわせることができるから。ソロ作業では、4つの学習モードのフレームワークが効果的だと思ってる。新しいことを探る時は読む、目指す詳細レベルに応じてスケッチや仕様を書く、忘れそうなことだけコードを書く、そしてリラックスはバックアップ状態として。大事なのは、一度に一つのモードだけにいることと、どれか一つにハマらないこと。作業の性質によっては、一日に2、3回切り替えることもあるし、次の2つのステップを常に把握しておくことが大事。それが分からなければ、切り替えのサインだよ。繰り返していこう。

いい記事だね、ありがとう!俺はエクストリームサイクリングが好きで、開発に関するいろんな問題を解決するのに役立ったよ。自転車に乗りながら音楽を聴いてると、特に頭の中で自由に製品をイメージしたりデザインしたりしてると、めっちゃリラックスできる。自転車に乗ってるときに、製品のいろんな面をデザインしたことがあるんだ。サイクリングは素晴らしい運動だよね。体を鍛えるだけじゃなく、景色を楽しんだり、心をリラックスさせたり、ストレスを解消したり、自分を整えたりするのにも役立つし、たくさんのインスピレーションも得られる。もしプレッシャーがかかってたり、製品に取り組んでるなら、定期的にサイクリングすることを強くおすすめするよ。

どうやって景色を楽しみながら、頭の中でデザインを同時にできるの?矛盾してる気がするんだけど。