web-dev-qa-db-ja.com

毎日の仕事において、「正しく行う」と「できるだけ早く」のバランスをどのように取っていますか?

私は時々何度も何度もこの質問について悩んでいます。私は正しい方法で物事をやりたいと思っています。メンテナンスが簡単で、わかりやすく、理解しやすく、正しいコードを書くことです。ただし、最終的には、パッチにパッチを書き込むことになります。時間がない、クライアントが待っている、バグを一晩で修正する、会社がこの問題で損失を出している、マネージャーが懸命にプレッシャーをかけている、などの理由だけで。

長期的には、これらのパッチにより多くの時間を費やしていることを私は完全に知っていますが、この時間は何ヶ月にも及ぶため、誰も気にしません。また、私のマネージャーの1人がよく言っていたように、「今すぐ修正しなければ、長期が続くかどうかわかりません。」

私はこれらの無限の現実/理想的な選択サイクルに閉じ込められた唯一のものではないと確信しています。では、私の仲間のプログラマーは、これにどのように対処しますか?

更新:この興味深い議論をありがとうございました。コードの量と質の間で毎日多くの人が選択しなければならないのは悲しいことです。それでも、意外にも多くの人がこの戦いに勝つことができると思っているので、この励ましに感謝します。

183
Flot2011

実は、これは絶対に正しい答えがないので、非常に難しい質問です。私たちの組織では、より良いコードを生成するために、より良いプロセスを導入しています。コーディング標準を更新して、グループとしてのコードの記述方法を反映し、非常に強力なテスト/リファクタリング/設計/コードループを導入しました。継続的にお届けするか、少なくともお試しください。少なくとも、2週間ごとにステークホルダーを表示するものがあります。私たちはソフト職人だと感じ、士気も高いです。しかし、これらすべてのチェックとバランスにもかかわらず、私たちはあなたと同じ問題に苦しんでいます。

結局、私たちは有料の顧客に製品を届けています。この顧客には、現実的かどうかにかかわらず、ニーズと期待があります。多くの場合、販売チームはコミッションを取得するためだけに私たちを困らせます。契約が結ばれていても、顧客は非現実的であるか、需要が変化する実際の期待を抱くことがあります。タイムラインが発生します。 PTOとスプリント中に失われた日が発生する可能性があります。あらゆる種類のささいなことは、「正しく実行する」または「できるだけ早く実行する」という難問に追い込まれている状況で頂点に達する可能性があります。ほとんどの場合、私たちは「できるだけ早く」を強いられます。

ソフトウェアの職人、開発者、プログラマー、仕事のためにコーディングする人々-「正しく行う」ことは私たちの自然な傾向です。 「Do it ASAP」は、私たちのほとんどがそうであるように、私たちが生き残るために働くときに起こることです。バランスが難しい。

私は常に経営陣にアプローチすることから始め(私はソフトウェア開発のディレクターであり、そのグループのアクティブな開発者です)、スケジュール、チーム、および行われている作業を守るようにしています。通常、その時点で、私は顧客が今それを持っている必要があり、それが機能する必要があると言われています。交渉やギブの余地がないことがわかったら、戻ってチームと協力して、どのコーナーを削減できるかを確認します。私は、顧客のニーズをできるだけ早く得るために動いている機能の品質を犠牲にしませんが、何かが起こり、別のスプリントにプッシュされます。ほとんどの場合、これで問題ありません。

非常に多くのバグがあり、コードの品質が悪く、悪化し、タイムラインが短くなっているために配信できない場合、私が説明している状況とは異なる状況になります。その場合、現在または過去の管理ミス、コード品質の低下につながる不適切な開発慣行、またはその他の要因により、死の行進が引き起こされる可能性があります。

ここでの私の意見は、良いコードとベストプラクティスを守るために最善を尽くし、会社を塹壕から引き離し始めることです。 1人の同僚がグループの経営陣に耳を傾けたり、打ち争ったりする意思がない場合は、新しい仕事を探し始める時期かもしれません。

結局のところ、現実はすべての問題を切り捨てます。あなたが開発しているものを販売する必要がある会社で働いているなら、あなたは毎日このトレードオフに遭遇するでしょう。優れた開発原則を早期に達成するために努力することによってのみ、私はコード品質曲線の先を行くことに成功しました。

開発者とセールスマンの間のプッシュアンドプルは、冗談を思い出させます。 「中古車のセールスマンとソフトウェアのセールスマンの違いは何ですか?少なくとも中古車のセールスマンは彼が嘘をついていることを知っています。」あごを上げたまま、「正しいことをする」ようにしてください。

106
Akira71

私のキャリアの中で私が気づいたことの1つは、それを正しく行うには常に時間があるということです。ええ、あなたのマネージャーは押しているかもしれません。クライアントは怒っています。しかし、彼らは物事がどのくらいの時間を要するかを知りません。あなた(開発チーム)がそれを行わない場合、それは完了していません。すべてのてこ比を保持します。

本当にマネージャーがあなたやあなたのクライアントを怒らせる何が起こるか知っているので? 品質が悪い

62
Telastyn

これは、私が「永遠の葛藤」(ビジネスとエンジニアリングの間)と考え始めたことに要約されます。解決できない問題なので解決策はありませんが、軽減するために何かをすることができます。

  • 通信値

多くの人が気づいていないのは、エンジニアとして「成功するビジネス」の問題を常に想定しているということです。新しい機能を追加したり、既存の機能をすばやく調整したりできるように、コードを適切に管理できるようにして、より優れたコードによって妨害されたと思われる奇妙なフリンジケースを発見することで、QAを行う顧客を最小限に抑えたいと考えています。顧客を維持し、他の誰も十分な速度で実現できない機能と巧妙さで競争力のあるEdgeを維持することは、優れたコードが直接貢献するビジネス上の成功であり、そもそも優れたコードが必要な理由の多くを通知します。

だからそれを綴る。 「コードベースでXを実行したいのは、そうしないと、Yが原因でビジネスに悪影響を与えるからです」または「...これは、新しい改善や機能をより速く提供する能力を向上させることにより、競争力を維持する能力を高めるからです。 」

そして、改善が機能しているという具体的な証拠を得るために最善を尽くしてください。アプリのサブセットを改善した結果、機能/改善が速くなった場合、その証拠として使用している可能性のあるバックログツールを確認し、適切な会議で指摘してください。

  • チームを同じくそったページに取得

自我はしばしば問題です。エンジニアリングチームが非常にひどく必要としていることの1つは、特定の種類の問題を解決するためのある種の合意された一貫したアプローチを持っていることの価値を確立することです。他の人の好みがあなたよりも悪いと信じても大丈夫ですが、彼のアプローチが実行可能であり、それがあなたが勝てない議論であるならば、より正しいことよりも一貫性を大切にします。一貫性のために妥協することが重要です。物事が一貫している場合、一貫した確立された方法も通常は最速の方法であるため、それらを間違って行うのはより困難です。

  • 適切なツールを選択

フレームワーク/ツールセット/ライブラリ/その他の2つの学校があります。 「私のために99%を設定して、私はほとんど知っている/ほとんどする必要がない」と「あなたがそこにいられないときは邪魔にならないが、実際に欲しいものを非常に迅速かつ一貫してDIYできるようにするスティックの原理ではなく、ニンジンに使用する」 2番目を優先します。柔軟性ときめ細かい制御は、急成長の祭壇で決して犠牲にされるべきではありません。ささいな/使い捨ての製品エンジニアリング。私の経験では、柔軟性のないツールは、ほとんどの場合、大きく開いてしまうか、またはエレガントに回避されて、巨大な巨大なメンテナンス不能な混乱を引き起こします。たいていの場合、ソリューションを変更するための柔軟で簡単な方法は、短期的には同じか非常に高速です。適切なツールを使用すると、高速で、柔軟で、保守が可能です。

  • FFS、エンジニアが決定しない場合、少なくともツールの選択時にエンジニアの入力を得る

これは開発者の視点からの質問であると感じますが、技術者の入力なしでテクノロジーの決定が下される状況が多すぎます。それは一体何なんだ?はい、最終的に誰かが最終的な電話をかけなければなりませんが、営業担当者やデモサイトが自社の製品について言っているのではなく、技術者以外のマネージャーである場合は、適格な意見を得てください。人々はそれほど賢くする必要がないため、または開発者を自分自身から保護するため、お金を節約することを約束するものは不潔で汚い嘘です。信頼できる人材を採用しましょう。スタックやその他の技術ソリューションから必要なものを詳しく説明し、どの技術分野に飛びつくかを決める前に、彼らの意見を真剣に受け止めます。

  • 実装よりも設計に重点を置く

ツールは実装用であり、そのために役立ちますが、アーキテクチャを構築するために持っているおもちゃのセットに関係なく、アーキテクチャを最優先にする必要があります。結局のところ、KISSとDRYと、それらから派生するすべての優れた哲学は、それが.NETにあるか、Javaまたはおそらく無料であり、吸わないもの。

  • 懸念事項を記録

ビジネス側があなたがそれを悪い方法で行うと主張するとき、その電子メール、特にそれがあなたに費用がかかる理由を言った部分を保存してください。すべての予測が実現し、ビジネスに深刻な問題が発生すると、エンジニアの懸念をより真剣に受け止めるための大きな山積みの議論が生まれます。しかし、慎重に時間をかけてください。燃えるような地獄の真ん中には、次の消防法の "私はあなたがそう言った"ための悪い時間があります。火を消し、以前に無視された懸念のリストを回想会議/会話に持ち込み、エンジニアリングの懸念が表明され無視されたこと、および実際の人々の名前ではなくそれらが無視された理由を理解した理由に焦点を合わせ続けるようにしてください無視する決定をする。あなたはエンジニアです。人々ではなく、問題に留まってください。 「私たちは、それがYの問題につながるのではないかと心配してXに懸念を表明しました。Zに対処することを延期するように言われました。」

21
Erik Reppen

解決策は1つだけです。リファクタリングのためにプロジェクト/作業時間の約10〜20%を予約します。それが正当なタスクであることを経営陣に納得させることが難しい場合は、彼らに唯一の真の議論を与えてください。マネージャーとのミーティング中にこの論文をバックアップするために、いくつかのメトリック/記事/研究結果を持っているのは良いことです:)

編集:このホワイトペーパーで言及されている「メンテナンスのリファクタリングとコストの上昇」に関するいくつかの優れたリソースがあります: http://www.omnext.net/downloads/Whitepaper_Omnext.pdf

19
Andrzej Bobak

何かを正しく行う時間があるときはいつでもそれを使用してください-できる限り最高のコードを書き、着実に改善してください。ずさんになりすぎて、必要がなければ技術的負債を導入することで、仕事を難しくしないでください。

深刻なバグを修正するための緊急の呼び出しは、自分で制御できるものではありません。発生した場合、できるだけ早く対応する必要があります。それが人生です。もちろん、あなたの仕事全体が緊急電話で構成されているという印象の下にあり、正しいことを行うのに十分な時間がない場合、あなたは燃え尽きる道を進んでおり、上司と話し合う必要があります。

それでも問題が解決しない場合でも、正しく実行するための十分な時間を確保するための「スコッティの戦略」があります。すべての見積もりに係数4を掛けます。

http://blogs.popart.com/2007/07/what-scotty-from-star-trek-can-teach-us-about-managing-expectations/

14
Doc Brown

私の仕事は、プロジェクトで許容される時間的制約の範囲内で可能な最高品質のソフトウェアを提供することだと考えています。品質レベルが低くなるのではないかと心配している場合は、プロジェクトオーナーに連絡します。私は私の懸念を説明し、その状態でソフトウェアを展開することの潜在的なリスクについて議論します。この時点で、次の3つのいずれかが発生します。

  1. プロジェクトオーナーはリスクを受け入れたくないため、スケジュールを元に戻して、ソフトウェアの品質により多くの時間を費やすことができるようにします。

  2. プロジェクトオーナーはリスクを受け入れたくありませんが、スケジュールを戻すことはできません。これが発生した場合、アプリケーションの主要部分のソフトウェア品質により多くの時間を費やすために、プロジェクトのスコープから削除する機能/機能について交渉する必要があります。

  3. プロジェクトオーナーはリスクを受け入れ、低品質のソフトウェアは予定通りに出荷されます。何もデプロイしない(または後でデプロイする)ビジネスリスクは、低品質のソフトウェアをデプロイするビジネスリスクよりもはるかに大きく、その決定を行えるのはプロジェクトオーナーだけです。

ソフトウェアを書くことは、似顔絵を描くことによく似ています。肖像画が「正しい」「完璧」であるとは言い難い。完璧は、やるの敵です。文字通り1か月で1つの方法に費やすこともできますが、それでも一部の人には「完璧」とは言えません。私の仕事は、お客様が満足している肖像画を描くことです。

11
Shane

最適なバランスは、正しく実行することで解消するバグの修正に無駄を費やすのと同じくらい多くの余分な時間を費やすことです。ソリューションの金メッキは避けてください。ほとんどの場合、正しく実行されたフォルクスワーゲンのソリューションは、キャデラックのソリューションと同じくらい優れています。通常、キャデラックが必要であることが証明されたら、後でアップグレードできます。

ベストプラクティスに従っていないコードの修正には、多くの場合より長い時間がかかります。呼び出しがa.b.c.d.e()のように見えるときに、nullがどこから来ているかを見つけようとすると、時間がかかる場合があります。

DRYを適用し、既存のコードを再利用することは、通常、別のソリューションをコーディングしてテストするよりもはるかに高速です。また、変更が発生したときに簡単に適用することができます。コードではなく、2、3、または20。

しっかりした基本的なコードを目指してください。完璧にするために多くの時間を無駄にすることができます。高速なコードにつながるベストプラクティスがありますが、必ずしも最速とは限りません。それ以上に、ボトルネックを予測し、コードの作成時にコードを最適化しようとすると、時間を無駄にする可能性があります。さらに悪いことに、最適化によってコードが遅くなる場合があります。

可能な限り、最小限の作業ソリューションを提供してください。金めっき液が何週間も無駄になっているのを見てきました。スコープには十分注意してください。

6か月かかるはずのプロジェクトに少し時間を費やしました。入社して一年半ほど経っていました。プロジェクトリーダーは、最初にプロジェクトマネージャーに1つの質問をしました:「私はそれを正しく実行しますか、それとも応答しますか?」 1週間で、月曜日、水曜日、金曜日に機能が実装されました。火曜日と木曜日、この機能は削除されました。

編集:コードが満足のいくレベルになったら、そのままにしておきます。あなたがそれを行うためのより良い方法を思いついた場合、それを修正するために戻ってはいけません。あなたが自分自身をメモにする必要がある場合。変更が必要な場合は、アイデアを確認して実装し、それでも意味がある場合は実装してください。

今後の機能の拡張機能を実装する場所がある場合は、拡張機能を実装しないでください。マーカーコメントを残して、変更箇所を思い出させることができます。

7
BillThor

これはすべてのケースで機能するわけではありませんが、問題が緊急に修正する必要がある壊れた本番環境の問題である場合は、この戦略を使用して運が良かったです。本番稼働のために迅速な修正を行う時間と、将来の品質修正を行う時間を見積もります。上司/クライアントに見積もりを提示し、両方の時間を承認してもらいます。次に、迅速な修正を行って本番稼働を行い、長期的な修正により、緊急時のプレッシャーがなくなったときにすぐにラフターを作成します。今回は仕事を正しく行うために必要なときにそれを提示すると、クライアントがそのアプローチを気に入っているように見えるまで、temporary修正を配置できることがわかります。製品が再び稼働し、長期的なニーズに対応します。

7
HLGEM

機能させてから完璧にする

私はこれのために多少の余裕を描くかもしれません-しかし、時間が本質的なものであるなら、あなたの主な優先事項はそれを機能させること、そのように単純にすることです。コードの欠点について広範囲にコメントし、使用しているプロジェクト/時間管理ソフトウェアで行ったことを書き留めます。

うまくいけば、これにより、これらの問題に戻ってそれらを完璧にするためにより多くの時間が与えられます。

明らかにこれに対する絶対的な正解はありませんが、それは私が試して固執する答えです。ただし、現在の作業スタイルに適していない場合があります。これは私を別の方法に導きます...

あなたのために働く方法を見つけるだけです;そしてそれにこだわる。誰もがプロジェクトに対処する独自の方法を持っており、「1つのサイズですべてに対応する」アプローチはありません。アプローチを見つけ、それをあなたのものにします。

6

「それを正しく行う」とは、特定の状況に対して適切なトレードオフを行うことを意味します。それらのいくつかは:

  1. 開発時間と費用
  2. 後でコードを読み取り、デバッグ、更新するのが簡単(変数名からアーキテクチャまですべて)
  3. ソリューションの完全性(エッジケース)
  4. 実行速度

明らかに、コードの一部が一度使用されて破棄される場合、#2は他のいずれかのために犠牲にされる可能性があります。 (ただし、注意してください考える捨てるつもりで、それを使い続けて維持しなければならないことがわかります。その時点で、人々に改善の時間を与えるよう説得するのは難しくなります。 「動く」何か。)

あなたやあなたのチームがいくつかのコードを使い続けたり更新したりするつもりなら、ショートカットを取ることは自分自身を遅くすることを意味します。

現在バグのあるコードを配信していて(#4で弱い)、それを実行するのに長い時間がかかっている(#1で弱い)場合、それは、#2で弱かったコードを更新しようとしているためです。あなたの実践を変えるための確かで実用的な議論を得ました。

5
Nathan Long

バグの場合はできるだけ早く、新しい機能の場合は時間をかけてください。

そして、あなたが開発者の仕事を尊重しない会社で働いているなら、あなたはそれを速くやって品質を犠牲にする以外に選択肢がないかもしれません。

私は、プロジェクト間を行き来し、すべてを迅速に行う多くの会社で働いてきました。結局のところ、プログラミングだけでなく実装も急いで行われたため、どのプロジェクトでもほとんど成功しませんでした。

最高の企業は、優れたソフトウェアには時間と職人の技が必要であることを理解しています。

4
Dimitry

ここに良い計画があります:

  1. Do-it-right計画にdo-it-asapとまったく同じ時間がかかるようにします。
  2. あなたの環境が満足するまでそれを行うためにあなたの時間を最適化してください;品質を保つ
  3. ???
  4. 成功
3
tp1

緊急時にパッチ適用ソリューションを作成します。これに言及して、バグ追跡で新しいバグを作成します。あなたが適切な時間を持っているときはいつでも、それを正しくしなさい。

3
Manoj R

私はこの業界で仕事に行き詰まっているすべての人がすることをやっていると思います。できる限り迅速にそれを実行します。将来の問題の防止に役立つ、または将来の問題解決を容易にするのに役立ついくつかの素晴らしいことを省く必要がある場合は、そうします。これは最適な状況ではありませんが、多くの未知の変数に基づく推定に基づいた推定に基づく締め切りに悩まされているとき、それはあなたができる最善のことです。

3
Matt

ソフトウェアは奇妙なものであり、ソフトウェア開発プロセスは奇妙です。

実生活のほとんどのこととは異なり、コンピュータで行うほとんどのことのように

高速の方が信頼性が高い

これは、これまでの人生で学んだすべての直観に反します。高度に調整された車は、標準的な車よりも頻繁に故障し、すばやく建てられた家はすぐにバラバラになり、スクールバスの後ろで行われた宿題は高得点になりません。

しかし、ゆっくりとした体系的な手順では、より優れたソフトウェアを生成できません。要件ドキュメントの作成に何週間も費やし、コードを書く前にクラス図に何日も費やす人は、より優れたソフトウェアを生み出しません。基本的な要件を取得し、いくつかの問題を明確にし、ホワイトボードにクラス図を書き、チームコーディングを取得する人は、ほとんどの場合、信頼性が高くより優れたソフトウェアを生成し、数か月ではなく数日でこれを行います。

1
James Anderson

私はほとんどのことを日常的な方法、最初に思い浮かぶ方法で行います。それは迅速であり、私はまともなプログラマーであり、ほとんどのことは最初の試行で大丈夫だと思います。

ときどき(1日2回と言いたいのですが、週2回の方が現実的です)、特に、日常的に行うのが非常に退屈なことを見つけたときは、と思います(= /// =) "これを行うには素晴らしい方法ですか?」と私はそれを行うより良い方法を見つけるか、発明するために余分な時間を費やしています。

それを頻繁に続ければ、私のルーチンコーディングは改善し続けると思います。

1
RemcoGerlich