私は、顧客向けの新しいソリューションを実装するコンサルタントチームの一員です。私は、クライアント側のコードベース(ReactとJavaScript)のコードレビューの大部分を担当しています。
一部のチームメンバーが独自のコーディングパターンを使用しているので、スタイルだけから誰が作者であるかをランダムにランダムに選択できることに気づきました。
例1(1回限りのインライン関数)
React.createClass({
render: function () {
var someFunc = function () {
...
return someValue;
};
return <div>{someFunc()}</div>
}
});
著者は、someFuncに意味のある名前を割り当てることにより、コードが読みやすくなると主張しています。関数をインライン化し、代わりにコメントを追加することで、同じ効果が得られると思います。
例2(バインドされていない関数)
function renderSomePart(props, state) {
return (
<div>
<p>{props.myProp}</p>
<p>{state.myState}</p>
</div>
);
}
React.createClass({
render: function () {
return <div>{renderSomePart(this.props, this.state)}</div>;
}
});
これが通常の方法です(状態と小道具を渡す必要がありません)。
React.createClass({
renderSomePart: function () {
return (
<div>
<p>{this.props.myProp}</p>
<p>{this.state.myState}</p>
</div>
);
},
render: function () {
return <div>{this.renderSomePart()}</div>;
}
});
これらのコーディングパターンは技術的には正しいものの、コードベースの他の部分や、Facebook(Reactの作者)がチュートリアルや例で示唆しているスタイルやパターンと一致していません。
時間どおりに納品するためには速いペースを保つ必要があり、チームに不必要に負担をかけたくない。同時に、合理的な品質レベルである必要があります。
私は、顧客のメンテナンス開発者がこれらのような不整合に直面していると想像しようとしています(すべてのコンポーネントmightは、同じことを行う別の方法を理解する必要があります)。
質問:
一貫性のあるコードベースと、このような不整合が残り、潜在的に広がることを許容することに対して、顧客とその保守開発者が認識している価値は何ですか?
コード転送の利点
ライブラリが提供するパターンに従っている場合、React
は、提供する製品が、Reactにも精通している他の開発者によって簡単にピックアップおよび保守されることを意味します。
潜在的な下位互換性の問題
一部のライブラリでは新しいメジャーバージョンがリリースされ、パターンが大幅に異なる場合は下位互換性が損なわれ、将来のアップグレードが遅くなる/停止する可能性があります。 React
が新しいリリースをどのように処理するかはわかりませんが、これが以前に発生するのを見てきました。
チームの新しいメンバーが生産的になり始めます
著者が提供するものに従うと、新しいパターンを教えるよりも、フレームワークを使用して才能のある開発者を雇い、システムですぐに始めることができます。
未発見の潜在的な問題
あなたのアプローチではまだ発見されていない将来の問題があるかもしれませんが、著者のアプローチによって解決されます。
とは言え、イノベーションは常にリスクです。アプローチが優れていると強く感じ、チームでうまく機能する場合は、是非行ってください!
矛盾があると、停止して考えるwhy、whichおよびwhere:
コードの一部を読んで、それがコードの他の部分とは異なるスタイルを使用していることがわかると、この特定の部分が異なる-whyと思いますか?知っておくべき特別な理由はありますか?これが危険なのは、その部分が異なる理由が本当にある場合は、それを認識しておく必要があるか、そうでなければ、厄介なバグを作成する可能性があるためです。そのため、そのコードに触れるようになった元の問題を考える代わりに、なぜそれが違うのかを考えるのに時間を浪費し、それを理解できないので、元の作者に尋ねて時間を浪費し、さらに悪いことに-その過程で、あなたは両方ともあなたが取り組んでいた問題のメンタルモデルを失います。
そのコードに触れたり読んだりする必要があるチームの他のすべての開発者を掛け合わせます。
複数のスタイルを使用するコードに追加する必要がある場合は、追加して使用するwhichスタイルを停止して決定する必要があります。重要な決定を十分に行う必要があります。重要ではない決定について考えることは時間の無駄です。
スタイルが一貫していると、コード内を簡単に移動できます。一貫性があると、whereの場所がすぐに見つかるからです。一貫性のないスタイルでは、探しているものがどのスタイルを使用しているかわからないため、greppingでさえ困難になります。
コードは適切に記述されていても、完全に一貫しているわけではないため、一部のクライアントは気にしません。物事がうまくいかなくなったとき、あなたは彼らにあなたに対してもう一つのノックを与えたいですか?複数の開発者のプロジェクトに取り組むために会社を雇ったが、彼らがコーディング標準を持っていることを私に知らせず、それに従った場合、私は懐疑的だろう。
時間どおりに納品するためには速いペースを保つ必要があり、チームに不必要に負担をかけたくない。
コーディング標準が狂っていない限り、誰もが参加するのはそれほど難しくありません。人々は、どのコードを書くべきか、または書かないべきかを知らず、タイプやフォーマットのために、プロジェクトが行き詰まっています。固執するのに不相応な時間がかかるとき、あなたはあなたが遠くまで行ったことがわかります。うまくいけば、これはあなたの最初のロデオではありません。
独自のテストを実施する必要なのは、割り当てをある開発者から別の開発者に途中で切り替えて、他の誰かのファイルを完成させることです。バージョンに完全に再フォーマットするのに時間を費やしていますか?フォローするのは難しすぎますか?クライアントのメンテナンスチームにとってはさらに悪化します。
ここで最も投票された回答は、コードベースがどのようになりたいかを詳しく説明する、簡単に同意できる理論的なベストプラクティスを繰り返します。しかし、実際のコードはどういうわけか決してそのようには見えません。その完璧なコードベースを作成しようとすると、ほぼ必然的に失敗します。だからといって、もっと上手くやろうとするべきではありませんが、現実的に達成可能な目標からどれだけ離れているかには限界があります。
細かいことに集中しすぎると、全体として最も効率的な方法で仕事を解決する方法など、より重要な問題に集中できなくなるリスクがあります。
私はあなたの最初の例をスタイルとは呼びません。スタイルは明確な正誤がまったくない選択です。この場合、追加の関数は上向きのないコード膨張です。あと2行で、読みやすく、修正も簡単なので、この例自体は大きな問題ではありません。
さらに大きな問題は、複雑なコードの膨張です。ラッパー関数、クラス階層、およびその他のあらゆる種類の構成要素。周囲のコードは非常に複雑であり、それらが実際の目的を果たしていないことは明らかではありません。コードに明らかな膨張がある場合、おそらくもっと明白でない膨張があります。何かをするのはかなり難しく、見つけるのも難しいだけでなく、はるかに大きな問題です。
顧客は自分のニーズを解決する実用的な製品を入手することに集中する傾向があります。コードの品質を心配する数少ない顧客の1人がいても、それは2番目の優先事項となり、コードの品質に関する彼らの考えは、あなたの顧客と完全に一致しない場合があります。顧客の会社には独自のプログラマーがいるかもしれませんが、それでも経営陣があなたが良い仕事をしたかどうかを判断し、経営陣はおそらくコードの品質が何を意味するかさえ知りません。
私は、自然な英語で書体を扱うように、コードスタイルを扱うのに幸運がありました。日常の会話で私たちが話す方法を模倣する会話型の英語から、その意味において常に非常に正確であることが多い重くて堅い形式の英語まで、幅広いスタイルがあります。
その意味で最終製品をどのように見せたいかを検討してください。状況によっては、その時点で最適な構造を使用するのに非常に役立ちます。その他は、一定のリズムと構造を必要とします。これは、正式な英語で記述されているかのように製品が最高の場合に特に当てはまります。その場合、口語表現は役立つかもしれませんが、製品の包括的な感覚を引き裂きます。
一般に、コーディング標準の一貫性が高いほど、興味深いことに注意を向けるのに開発者が費やす労力が少なくなります。コーディング標準の大きな多様性をサポートする場合、開発者は珍しいことやユニークなことをしていることを発表するとき、声を大きくする必要があります。開発者が重要であると考えるものを表現しようとするこの試みは、多くの場合、コード自体のダイナミックレンジを覆い隠す可能性があります。これが発生すると、単純にバグを見つけるのが非常に難しいため、バグがすり抜けるのは簡単です。
その反対に、コーディング標準が緩いほど、開発者は構文を問題に適応させる自由度が高くなります。プロコーディング標準の議論と皮肉なことに、標準化が多すぎると、コード構造が固まってしまう可能性があり、バグのすり抜けも容易になります。
あなたが探しているのはあなた自身のチームの幸せな媒体です。
他の何人かが指摘したように、メンテナンス開発者があなたの後ろに行かなければならないとき、異なるスタイルのコードのセクションが彼らを停止させ、そのセクションの何が特別であるかを理解しようとするでしょう。また、一貫性のないスタイルが他のセクションに反映されて、後で大きな混乱が生じるという非常に現実的なリスクもあります。
深いところで、あなたはすでにこの質問への答えを知っており、これがなければ、それに直面することさえないだろうという印象を受けます。
時間どおりに納品するためには速いペースを保つ必要があり、チームに不必要に負担をかけたくない。
これは常に普遍的なトレードオフのようです...迅速に実行するか、正しく実行するか。お客様のみが、顧客の締め切り変更に伴う適切なコーディング手法を犠牲にした結果を評価できます。ただし、JeffOが同意する必要があるのは、(おそらく通常とは異なる、直感に反する)コーディングスタイルに従うことでチームの速度が大幅に低下し、締め切りが大幅に遅れることはないということです。
私は何年もこの概念について知っていましたが、「 技術的負債 」という用語を最近知りました。規律あるスタイルに従わない場合、最終的に支払わなければならない技術的負債を本当に考慮する必要があります。
残念ながら、eビジネスが述べたように、顧客が特に技術に精通しているか、後でコードを自分で保守するつもりでない限り、一貫したコーディング標準の価値を認めるのは困難です。ただし、妥当なビジネスマンであれば、「今すぐ予防保守を少し」(適切なコーディングの形で)「後で大幅な修理コストを回避するのに役立つ」(開発者の無駄な時間の形で)の概念を理解できるはずです。混乱)。
それは、差分の読みやすさについてです。コードスタイルがうまく機能している場合、diffはプログラムにとって意味のない変更を隠し、マージを困難または不可能にする可能性があります。