コードを随時コンパイルすることには利点がありますか?

コードを随時コンパイルすることには利点がありますか?

ビジネスとIT

コンパイルすると、エラーをすぐに修正できます。

この Q&A は、テクノロジー愛好家が遭遇する一般的な質問を取り上げ、100 を超える Q&A サイトからなる無料のコミュニティ主導ネットワークである Stack Exchange のユーザーが回答する毎週の投稿シリーズの一部です。

CaptainCodeman は 質問します:

先日、就職面接を受けたのですが、1時間ほどで実際にコードを書けるように言われました。それほど長いコードではなく、おそらく100行にも満たない量でした。45分ほどでコンパイルして実行し、ようやく動くようになりました。コンパイルエラーやいくつかの小さなバグの修正に5~10分ほどかかったかもしれませんが、全体的には非常にスムーズに進みました。(ちなみに、採用は内定しました。)

しかし、完成したコードを提出した後、面接官が「私が間違えたのは、コンパイルを途中で止めたことだけだ」と言ったことに困惑しました。何が違っていたのか尋ねると、「もしコードを完成させたのに、時間内にコンパイルできなかったらどうしますか?」と聞かれました。

私の理解では、それは妥当な議論ではありません。なぜなら、与えられた長さのコードを「コンパイルできるようにする」には、通常、一定数のコンパイルエラーを修正する必要があり、ほぼ一定の時間がかかるからです。これは、コードを書き終えた後に行う場合でも、コーディング中に行う場合でも同じです。むしろ、コーディングを中断してセミコロンの抜けを探すのは、効率を著しく低下させるでしょう。派生クラスの仮想関数など、エッジケースに関する難解な問題を実験しているような極端な状況を除けば、経験豊富な開発者が書いたコードは、時折発生するタイプミスを除けばコンパイル可能であると期待するのは妥当でしょう。たとえコンパイルエラーが起こらなかったとしても、コンパイルエラーを修正するためにコードの一部を書き直す必要はないでしょう。

似たような別の事例で、面接で未完成のコードベースを渡され、それを完成させ、必要な修正を加えて動作させるように求められました。まず既存のコードに目を通したところ、数分後(コードを見終わる前に)、面接官は「もう十分だ」と言いました。面接官ならどうするだろうか(つまり「何が間違っていたのか」)と尋ねると、彼はすぐにコードをコンパイルするところから始めるだろうと言いました。

なぜそれが重要なのでしょうか?私の意見と経験から言うと、コードがコンパイルされるかどうかは基本的にランダムで、セミコロンが抜けているかどうかといった要素が関係し、基盤となるプログラムの正しさとはほとんど関係がありません。(私にとって、コンパイルに重点を置くことは、文法の校正をせずに記事をスペルチェックにかけるようなものです。)

不完全なコードを渡されたら、まずはそれを読みます。コードが何をしているのか、アルゴリズムが正しいのかが分かるまでは、コンパイルすらしません。

とにかく、これらは最近起こったほんの数件の出来事ですが、一般的に多くの開発者がコードを書きながらコンパイルすることについて話しているのを耳にしてきました。しかし、そのメリットを説明できる人は誰もいませんでした。コードを書きながら*テスト*することのメリットは理解できますが、なぜコンパイルする必要があるのでしょうか?

そこで質問なのですが、何か見落としている点があるのでしょうか? 実際に、コードをコンパイルしながら進めることにメリットはあるのでしょうか? それとも、コードを頻繁にコンパイルしなければならないというのは、ソフトウェアコミュニティによって広められた一種の神話なのでしょうか?

完全な元の質問とすべての回答は、こちらをご覧ください。

クイックフィックス

Oded♦の回答(188票):

実際に、作業を進めながらコンパイルすることにメリットはあるのでしょうか?

あります。フィードバックループが短くなるので、一般的には設計(UI、ソフトウェアの作成、ビジュアルデザインなど)をする際には良いことです。

フィードバック ループが短いということは、エラーの修正にかかるコストが高くなる前に、早い段階でエラーを素早く修正できることを意味します。

あなたの例を借りると、C のような言語でコーディングしていて、プログラムの途中のどこかで '}' を忘れたとします。

ステートメントの記述を終えた直後にコンパイルすると、コンパイル エラーが発生したことが確実にわかり、数秒以内にその場で修正できます。

しかし、そうしない場合は、コードを読み、「}」の正確な位置を探し、エラーを見つけた後、修正が本当に意図通りであるかどうかを確認するために、かなりの時間を費やす必要があります。これは、そのコードを書いた後しばらくしてから行うことになります。書いた瞬間ほど明確には理解できないでしょう。

さて、確かに最終結果は同じですが、コンパイラが解決してくれる構文上の問題にかなりの時間を費やしています。その時間は、作業を進めながらコンパイルすれば大幅に短縮できるはずです。

関連:「コンパイラはなぜそれほど信頼できるのか?」

テストの一部

pjc50の回答(94票):

コンパイルはテストの一種であり、特にHaskellやMLのように型を多用する言語ではそれが顕著です。他の言語では、コンパイルは構文スキャンであり、得られる情報はほとんどありません。

とはいえ、「臨機応変にコンパイルする」というのは、状況によってかなり異なる習慣のように思えます。面接官の個人的な偏見よりも頻繁にコンパイルすると、「神経質」と評価を下げられる可能性もあります。些細なことにこだわっているように聞こえますが、応募者がテストで満点を取ったことを認めたがる人はいません。給与交渉の行方を左右する要因にもなります。

すべてのビルドシステムが高速なわけではありません。私が関わった(C++)プロジェクトでは、Makeはビルドが必要かどうかを判断するためにすべての記述だけで30秒も費やし、変更を加えたファイルのほとんどはビルドに数分かかりました。私たちは、これを10~15分おきよりも頻繁に行うことに抵抗を感じていました。誰かがきっと、コンパイル時にパンチカードを何枚も持って別の建物に運ばなければならなかったという逸話を披露してくれるでしょう。

頭の中で概念単位が完全に完成し、検証する準備ができたと感じたら、ワークフローに応じて 1 分に 1 回または週に 1 回コンパイルします。

問題を早期に発見する

カール・ビーレフェルトは次のように答えます (12 票):

経験豊富な開発者にとって、コンパイラエラーは大した問題ではないという点には私も同意します。修正コストは時間の経過とともにそれほど大きく増加するとは思えません。もし全てのコンパイラエラーの修正をプッシュ直前まで延期できるなら、そうするでしょう。そうすれば、中断ははるかに小さく、より統合されたものになるでしょう。

残念ながら、コンパイラの役割はコンパイラエラーを見つけることだけではありません。当たり前のことを言ってしまいますが、プログラムを実行するにはコンパイルが必要です。そして、経験豊富な開発者でさえも作り出す、より複雑で、捉えどころがなく、興味深いランタイムバグを見つけるには、プログラムを実行する必要があります。そして、これらの種類のバグは、互いに影響し合ったり、隠蔽したりする可能性があるため、デバッグを遅らせるほど修正が困難になり、コストも高くなります。

しかし、面接でコンパイルを最後まで先延ばしにしたからといって、必ずしも減点するわけではありません。面接は往々にして非常に単純で、経験豊富な開発者は自分の限界をよく理解しています。自分が書いたものに自信があればあるほど、コンパイルの間隔は長くなります。それが人間の性なのです。

ただし、減点対象にならないためには、その自信が正当なものである必要があります。もし45分かけてコンパイルせずに何かを書き、さらに45分かけてデバッグしたとしたら、私はその点数をかなり不利に評価したでしょう。

元の投稿に、さらに多くの回答を探すか、ご自身の回答を残してください。ソフトウェア開発に関する概念的な質問に関心のあるプロのプログラマーのためのQ&Aサイト「Programmers」では、このようなQ&Aをもっと見ることができます。ご自身で解決が必要なプログラミング上の問題がある場合は、Programmersにログインして質問してください(無料です)。

66件のコメント

  1. 最も読まれている記事の最初の記事のリスト画像:イーロン・マスクは、アップルと携帯電話会社にスターリンクのライバルを選んだことを後悔させようとしている