「Mythical Man Month」の「開発者1人あたり1日10行」を超えることができると誰もがいつも言います。プロジェクトを開始すると、通常1日で数百行を取得できます。
しかし、私の以前の雇用者では、すべての開発者は非常に鋭いものでしたが、それは非常に面倒な認証要件を持ち、他の数百万行のプロジェクトとインターフェイスする、100万行を超えるコードの大きなプロジェクトでした。ある時点で、好奇心の練習として、私たちのグループの出荷製品にコード行をプロットしました(開発したツールはカウントしません)。変更、テストコード、または開発者が毎日実際のプロジェクトコードで作業していなかったという事実をカウントしません。
他の人はどうですか?また、どのような要件に直面していますか(その要因を想像します)?
追加される行の数はプロジェクトの状態に大きく依存すると思います。新しいプロジェクトに追加する割合は、開始プロジェクトの割合よりもはるかに高くなります。
2つの作業は異なります。大規模なプロジェクトでは、通常、ほとんどの時間をパーツ間の関係の把握に費やし、実際に変更/追加するのはごくわずかです。一方、新しいプロジェクトでは、ほとんど書きます...十分に大きくなり、レートが低下するまで。
私の現在のプロジェクトの1つでは、いくつかのモジュールで、コードベースにマイナスの行数を与えたことを誇りに思っています。コードのどの領域が成長しているかを特定する不要複雑さ、およびより簡潔で明確な設計で簡素化できることは有用なスキルです。
もちろん、いくつかの問題は本質的に複雑で複雑なソリューションを必要としますが、要件が不十分に定義または変更されているほとんどの大規模なプロジェクト領域では、行ごとの問題の数が非常に複雑なソリューションになる傾向があります。
解決すべき問題を考えると、私は行数を減らす解決策を大いに好みます。もちろん、小さなプロジェクトの開始時には、1日に10行以上のコードを生成できますが、私が書いたコードの量は、何をするのか、どれだけうまくいくのかを考えない傾向があります。確かに、1日10行を超えることや、それを達成することを目指しているわけではありません。
私はこの引用が好きです:
コードの行をカウントしたい場合、それらを「生成された行」ではなく「消費された行」と見なすべきです。 -エドガー・ダイクストラ
コードを削除することで、追加するよりも貢献したことがある場合があります
このメトリックの使用を停止する必要があります。ほとんどの場合、意味がありません。結合、結合、複雑さは、コード行よりも重要な指標です。
他の人はどうですか?
私は 当社 で唯一のフルタイム開発者であり、過去7年間に500,000行のOCamlおよびF#コードを記述しました。これは1日あたり約200行のコードに相当します。ただし、そのコードの大部分は、それぞれ数百行の数百の個別のプロジェクトで構成されるチュートリアルの例です。また、OCamlとF#の間には多くの重複があります。 50kLOCを超える社内コードベースは維持していません。
独自のソフトウェアの開発と保守に加えて、私は過去7年間にわたって業界の多くのクライアントと相談してきました。 最初のクライアント の場合、3か月で2,000行のOCamlを記述しました。これは1日あたり20行のコードです。 次のクライアント の場合、4人でコンパイラを作成し、C/C++/Python/Java/OCamlコードの数百万行と、6か月で1日あたり2,000行のコードを生成するドキュメントを作成しました。開発者。別のクライアントの場合、6か月でC++の50kLOCをF#の6kLOCに置き換えました。これは1日あたり-352行のコードです。 まだ別のクライアント の場合、OCamlの15kLOCをF#で書き換えています。これは同じサイズになるため、1日あたり0行のコードになります。
現在のクライアント の場合、1年間で1,600,000行のC++およびMathematicaコードを〜160kLOCのF#に置き換えます(カスタムコンパイラを作成することにより)。1日あたり-6,000行のコードになります。これはこれまでで最も成功したプロジェクトであり、顧客の継続的なコストを年間数百万ドル節約します。誰もが1日あたり-6,000行のコードを書くことを目指すべきだと思います。
「The Mythical Man-Month」のコピーを実際にチェックせずに(これを読んでいる人なら誰でもすぐに入手できるはずです)、Brooksが書かれた行で生産性を見る章がありました。彼にとって興味深い点は、実際に1日あたりに書かれた行数ではなく、アセンブラーとPL/Iでほぼ同じように見えたという事実です(使用された高水準言語だと思います)。
ブルックスは、生産性のある種のfigure意的な数字を捨てようとしていませんでしたが、実際のプロジェクトのデータから作業していたので、平均して1日あたり12行だったかもしれません。
彼は生産性が変わると予想されることを指摘しました。彼は、コンパイラはアプリケーションプログラムの3倍、オペレーティングシステムはコンパイラの3倍難しいと言いました。 (彼はカテゴリーを分けるために3の乗数を使用するのが好きだったようです。)
彼がプログラマーの生産性の個人差を理解していたかどうかはわかりません(ただし、桁違いの議論では7倍の差があると仮定していました)が、優れた生産性は単に書くだけの問題ではありませんコードだけでなく、ジョブを実行するための適切なコードを記述します。
環境の問題もあります。ブルックスは、開発者を高速化または低速化する要因について少し推測しました。多くの人々と同様に、彼は現在の流行(タイムシェアリングシステムを使用した対話型デバッグ)が古い方法(マシン全体を使用した2時間のショットの注意深い事前計画)よりも優れているかどうかを疑問視しました。
それを考えると、役に立たないものとして彼が思いついた実際の生産性の数値は無視するでしょう。本の継続的な価値は、人々が学習しないことに固執する原則とより一般的な教訓にあります。 (ねえ、もし誰もがそれらを学んだなら、潜在意識のようなものがあるというフロイトの議論のすべてと同じように、この本は歴史的な興味だけになります。)
1日に数百行のコードを取得するのは簡単です。しかし、1日に数百の高品質のコード行を取得しようとすると、それほど簡単ではありません。それに加えて、デバッグを行い、1日あたり新しい行をほとんどまたはまったく使用せずに数日を経過すると、平均がかなり早く低下します。難しい問題のデバッグに何週間も費やしましたが、その答えは1行または2行のコードです。
物理的なコード行の話はかなり無意味であることを理解する方がはるかに良いでしょう。物理的なコードの行(LoC)の数はコーディングスタイルに非常に依存しているため、開発者ごとに桁違いに変化する可能性があります。
.NETの世界では、LoCをカウントする便利な方法があります。 シーケンスポイント。シーケンスポイントはデバッグの単位であり、ブレークポイントを配置するときに暗赤色で強調表示されたコード部分です。シーケンスポイントを使用すると、logical LoCについて話すことができ、このメトリックはさまざまな.NET言語間で比較できます。論理的なLoCコードメトリックは、VisualStudioコードメトリック、NDepend、NCoverなど、ほとんどの.NETツールでサポートされています。
たとえば、8 LoCメソッドは次のとおりです(開始および終了ブラケットシーケンスポイントは考慮されません)。
LoCの生産は、長期的に数えなければなりません。 200を超えるLoCを吐き出す日もあれば、1つのLoCを追加しなくてもバグを修正するのに8時間を費やす日もあります。デッドコードをクリーンアップしてLoCを削除する日もあれば、既存のコードをリファクタリングして合計に新しいLoCを追加しない時間を費やす日もあります。
個人的には、次の場合にのみ、自分の生産性スコアで単一のLoCをカウントします。
この状態で、.NET開発者向けにNDependツールをコーディングした過去5年間の私の個人的なスコアは、平均コード品質をまったく犠牲にすることなく1日あたり80物理LoCです。リズムは維持されており、すぐに減少することはありません。全体として、NDependは現在約115Kの物理LoCに重み付けされているC#コードベースです。
LoCのカウントを嫌う人(ここでコメントでそれらの多くを見た)については、適切に較正されたら、LoCのカウントは優れた推定ツールですであることを証明します。開発の特定のコンテキストで達成された多数の機能をコーディングおよび測定した後、LoCのTODO機能のサイズを正確に見積もることができるようになりました。
特効薬のようなものはありません。
そのような単一のメトリックは、それ自体では役に立ちません。
たとえば、独自のクラスライブラリがあります。現在、次の統計が当てはまります。
総行数:252.682
コード行:127.323
コメント:99.538
空の行:25.821
コメントをまったく書いていない、つまり127.323行のコードだとしましょう。あなたの比率では、そのコードライブラリを書くのに約10610日かかります。それは29年です。
すべてのC#であり、C#はそれほど長くないので、私は確かにそのコードを書くのに29年を費やしませんでした。
今、あなたはコードがそれほど良くないことを主張することができます、明らかに私はあなたの1日12行のメトリックを超えていなければならないので、はい、私はそれに同意しますが、 1.0がリリースされたとき(そして2.0がリリースされるまで実際に作り始めなかった)、2002年2月13日、約2600日で、平均は1日48行のコードです。
これらのコード行はすべて良いですか?嫌です。しかし、1日12行のコードまでですか?
嫌です。
すべては依存します。
一流のプログラマーが1日に数千行のオーダーでコードを駆逐し、中規模のプログラマーが1日に数百行のオーダーでコードを駆逐することができ、品質は同じです。
そして、はい、バグがあります。
必要な合計は残高です。変更されたコードの量、見つかったバグの数、コードの複雑さ、それらのバグを修正する難しさ。
Steve McConnellは、彼の著書「ソフトウェア推定」(p62表5.2)で興味深い統計を示しています。彼は、プロジェクトタイプ(Avionic、Business、Telcoなど)とプロジェクトサイズを区別します。番号は、LOC/StaffMonthの各組み合わせに対して与えられます。例えば。アビオニクス:200、50、40イントラネットシステム(内部):4000、800、600組み込みシステム:300、70、60
つまり:例えば。アビオニック250-kLOCプロジェクトの場合、40(LOC /月)/ 22(日/月)== <2LOC /日です!
これは waterfall development 日から来ていると思います。プロジェクトの実際の開発フェーズは、プロジェクトの総時間の20〜30%に過ぎません。コードの合計行を取得し、プロジェクト全体の時間で割ると、1日あたり約10行になります。コーディング期間だけで割ると、人々が引用しているものに近づきます。
コードベースは、約150人年の労力で約2.2MLoCです。これは、プロジェクトの全期間にわたって、開発者ごとに1日あたり75 c ++またはc#の行数になります。
これには、プロジェクトの規模と開発者の数が大きな要因だと思います。私はこれまでのキャリアでこれをはるかに上回っていますが、私はずっと一人で働いてきたので、他のプログラマーと働くことに損失はありません。
優れた計画、優れた設計、優れたプログラマー。あなたはそのすべてを手に入れ、1行を書くのに30分を費やすことはありません。はい、すべてのプロジェクトでは、停止して計画し、検討し、議論し、テストし、デバッグする必要がありますが、テトリスを機能させるには、1日2行ですべての企業が軍隊を必要とします...
要するに、あなたが私のために1時間あたり2行で働いていたなら、あなたは解雇されないようにたくさんのコーヒーをもらい、私の足をマッサージする方が良いでしょう。
すべてがCで書かれたsysアプリであったときに、この不変のマネージャーキャンディーが造られたのではないかと疑われます。そして、コメントと属性を割り引く必要があります。そして、最終的に誰が書いたコードの行数を気にしますか? 10K回線に到達したら終了することになっていますか? 10万?とてもarbitrary意的です。
無駄だ。