100万行の不正なコード

古代東洋の知恵が言うように、「痛みも利益もない」。 そして、知恵が古くも東洋的でなくても、私にとって個人的に最も価値のある人生経験は最も苦痛でした。 プリンストン大学プログラミングの大学院生であるコードレビューに関するデビッドロビンソンの最近の投稿は、自分の経験を他人に伝えなければならない(または伝えない)人々の日常生活の重要な問題を提起しただけではありません。 元のテキストは比較的「歯のない」ものでしたが、ジョン・カーマックがコメントに登場した後、投稿はだらしないようになりました。



これは、謙虚な僕がかつて書いた悪いコードに関する話です。



最初の大学のコースの1つで、1行あたり6 MBのファイルを読み取ることになっているJavaプログラムを作成しました(このファイルはFASTA形式の細菌遺伝子でした)。 私のコードは次のようになりました:



BufferedReader reader = new BufferedReader(new FileReader (file)); String line = null; String text = ""; while( ( line = reader.readLine() ) != null ) { text = text + line; }
      
      





この方法で一連の連結を使用して文字列を構築するのは非常に非効率的です-誇張せずに、ファイルを読み取るのに約40分かかりました( それ以来、いくつかのより良い方法を学びました )。 最も重要なことは、ファイルを読み取った後、プログラムの残りのアルゴリズム全体が10秒間機能したことです。2日間、次のように動作しました。コードを変更し、プログラムを実行し、プログラムの実行が完了する前にLOSTエピソード全体を見ることができました。 「くそ、12行目は間違いです! 繰り返しますが、すべて新しい方法で...」



何度も再起動した後、最終的に「これを行うにはもっと良い方法が必要だ」と思いました。 1秒未満で遺伝子を取得できるループをPerlで作成できることがわかりました(同時に、JavaよりもPerlでプログラミングすることはできませんでした-幸運でした)。 そこで、私は座って、ファイルを読み取り、1行で収集して出力するPerlスクリプトを作成しました。 それから、JavaプログラムにコマンドラインからPerlスクリプトを呼び出させ、出力をキャプチャして文字列に保存しました。



このプログラムがあれば、そのソースコードを印刷し、壁のフレームに掛けて、彼が書いた「悪い」コードで誰も決してscらないことを思い起こさせるでしょう。



私の人生からこの事例を伝えるために、「コード品質」に関するXKCDの新鮮な漫画に触発されました。



画像






漫画本を「悪」と呼ぶことはできません-経験豊富なプログラマーは有用なアドバイスを与えず、双曲線のアナロジーを描くだけです。 しかし、何よりも私の目を引いたのは、患者の反応でした-「まあ、コーディングスタイルガイドを読んで」。 誰かが彼に失礼な場合、生きている人はそのように反応しますか? 答えは「わかりました、これで最後にコードを見せました」、あるいは「わかりました、プログラミングに入るべきだと思います」のように見えませんか?



問題は科学研究にあります。 科学者がコードを添付せずに記事を公開する(そして理解できる)理由は数多くありますが、リストの最初の項目は通常「恥ずかしい」です。 このコードで他人を恥じようとする人は、この問題であまり助けになりません!



新進作家のための有名なアドバイスには、次のように書かれています。 この数百万が流出する前に、何か良いものを書こうとしても無駄です。 だから書きに行こう!」 上記のXKCDについて爆発した議論を読んだとき、私は彼を思い出しました。



経験豊富なプログラマーが次に自分のコードを恥ずかしくしたいときは、自分の数百万行のコードに精神的に戻ってみてください。 上記の私と同じように誰かがあなたを非難したと想像してください。 引き続き助けを求めますか? 100万行になりますか?



ジョン・カーマックによるコメント



「このコードを書いたバカ」と「このたわごとコード」という言葉を混同しないでください。両者には大きな違いがあります。 コミックは最後についてです。 これは意識的に行われたと思います。 作者への攻撃が利益をもたらすことはまずありませんが、コード自体を厳密に批判する能力があるはずです。 実際には、多くの著者は自分の作品から自分自身を分離することはできませんが、これを行う能力は貴重なスキルです。



自分のデバイスに任せて、ほとんどの人は自分の欠陥を無視する不可解な能力を実証し、これは彼らの専門的な成長を損ないます。 少し恥ずかしいことが、しばしば前向きな動機になります。 過去1年間に書いた膨大な量のコードを恥ずかしく思います。 私は頭の中で、すべてが判明した理由について考えています-それらのいくつかは言い訳ですが、それらのいくつかは純粋です「私はこれを書いたときに私も考えましたか?」 そして、最近の仕事に少し罪悪感を感じないなら、誰かがあなたの問題を指摘すれば、この人があなたの「防衛メカニズム」を突破できるという意味で、あなたにとって有益になる可能性は十分にあります。



Oculus Mobile SDK用に書いたすべてのコードを誰かが「埋めて」くれたら嬉しいです。 私は大部分が遅かれ早かれこの読者になるだろうと確信しており、大部分は頭をうなずき、書かれていることに同意するだけです。 しかし、私はこれから何か有用なことを学ぶことができると確信しており、これは私の将来の仕事に有益な効果をもたらすでしょう。



>> Oculusでコミットごとにレビューコードを実行していますか?



いや この方向でいくつかの進歩があります。 何が起こるか興味があります。 スタートアップの仕事のペースのプレッシャーは依然として私たちに大きな影響を与えています。



>>記事に対するあなたの解説は、キーボードに転がされたマカクのように見えます。そして、あなたは自動修正を見てみました...まあ、それはあまり役に立たなかったですね? 過度の硬直と深刻な批判を混同していると思います。 私の最後のフレーズはそれほど不快ではなく、同時に最初のフレーズよりも意味がありました。



通常、巧妙で有用なコメントが最も効果的ですが、コメントがその人に影響を与えるために特定の最小の「活性化エネルギー」が必要な場合があります。



>>過去に他の開発者がidで書いたコードレビューを行ったことがありますか?



非公式に、それで十分でした。 コードレビューを行うのは好きではありません。 おそらくこの理由で、私は批判に感謝しています。



ジョンは部分的に厳しいコメントを避けないことを認めていますが、彼は手紙に個人的なletters辱を寛大に振りかけ、スピーチには「あなたは私に興味がありません、私は技術と核心を心配しています-それは私のためです」本当に重要です」と主張します。「あなたが穏やかになろうとするなら、誰もあなたの言うことを聞かないでしょう。」



All Articles