非常にひどく記述されたコードを扱うとき、どのように生産性を維持しますか?


63

私はソフトウェア業界での仕事、独学、就職する前にオープンソースに参加した経験はあまりありません。お金のために働いている今、私はまた、いくつかの不快なものに対処する必要がありますが、これは当然のことです。

最近、私は明らかに仕事でコーディングすることを学んでいたプログラマーによって書かれた大規模なSharePointプロジェクトにロギングを追加するように割り当てられました。2年間の共同作業の後、クライアントは当社に切り替えましたが、損害は発生しました。そして今、どういうわけかこのコードを保守する必要があります。

コードはありませんでしたことをあまりにも読みにくいです。問題にもかかわらず、各プロジェクトにはコピーペーストされたメソッド、巨大なifネスト、Systems Hungarian、無秩序な接続を含む1つのクラスがあります。

しかし、ロギングを追加するような簡単な作業を行っていたにもかかわらず、私は完全に非生産的でした。基本的に、ステップごとにコードを調べて、トレース呼び出しを追加するだけです。ただし、コードの愚かさは非常に迷惑なので、開始から10分以内に疲れてしまいます。最初は、usingコンストラクトを追加し、を逆にしてネストを減らしif、変数の名前を読み取り可能な名前に変更しましたが、プロジェクトは大きく、最終的にはgaveめました。これは私がやるべきタスクではないことはわかっていますが、少なくとも混乱を減らすことで、続けることができるように何らかの心理的な報酬を得ることができました。トリックが機能しなくなり、仕事の60%がまだ残っています。

仕事の後に頭痛がし始め、今までの満足感が得られなくなりました。通常は、10時間ストレートでコーディングしても新鮮に感じることができます。

これは単なる大騒ぎではありません。実際に質問があります。

生産性を維持し、風車と戦わない方法はありますか?

代わりに思考の、タスクに集中するために心理的なトリックのいくつかの種類があり、「どのように愚かであることは?」私は以前、プログラマが別の巧妙なトリックを見るたびに?ロギングを追加する際の問題は、実際にコードが何をするのかを理解しなければならないことであり、そうすることは不快な形で脳を傷つけます。


ハンガリー語の表記は悪くありません。元の論文を読んで、彼が何について話していたかを確認してください:)
Woot4Moo

14
ハンガリー人は悪くないことを知っています。これがまさに、Apps Hungarian(元のもの)ではなく、Systems Hungarian を書いた理由です。C#でSystems Hungarianを使用する意味はありません。素晴らしい型システムとIDEを備えているからです。すべてが最初から同じスコープ内に10個の変数を持つことは、基本的に読み取り不可能であるため困難です。obj
ダン

2
この質問に複数票を投じることができたらと思います!
o6tech


9
スタックについて不機嫌な質問をすることで蒸気を吹き飛ばし、それが私を落胆させる。
エリックReppen

回答:


32

申し訳ありませんが、すべての仕事が太陽と魅力に満ちているわけではありません。開発タスクの大部分は、このような手間のかかる作業です。悲しいですが本当。

塗料が乾くのを見るほど退屈だとしても、あなたには重要な仕事が課せられます。次の2つの理由で重要です。2.コードベースに慣れるので、何か問題が発生した場合に飛び込んで修正できます。

ここでは、基本的に独自のセーフティネットを作成しています。グラマー、いや、しかし重要なはい!

それで、それはあなたがどのようにあなた自身を動機づけるべきかと言われていますか?仕事で心を麻痺させる仕事があるとき、私は自分自身に目標を設定します。週の終わりまでにタスクxを完了します。目標を達成したら、自分に報酬を与えます。やってみたい新しいレストランは?終わったら金曜日の夜に行きます。新しい映画が出ましたか?終わったら週末に見てください。

私はスーパーバイザーと話し、自分がどこにいて、どのように進歩しているかを彼/彼女に知らせて、私に説明責任を持たせています。金曜日までに完了すると伝えたら、金曜日までにそれを成し遂げたいと思います。

このタスクを完了し、時間と予算を守って人々が気付くようにし、その輝かしい新しいプロジェクトがやって来たら、あなたの名前がそれを得る人として提案されるかもしれないと信じてください。:)


私は特に金曜日の動機についてのポイントが好きです。現在のリリースも金曜日に予定されているのは面白いです。感謝の動機は感動的なものであることを付け加える価値があると思います。誰かがあなたの仕事に感謝することを保証するか、そうでなければあなたが取り組んでいるものを変える必要があります。心からの「ありがとう」はしばしば落ち着きのない時間を巻き戻します。
ダン

1
@gaearon-提案があなたの役に立つことを嬉しく思います。良いレベルのモチベーションでつまらない仕事をやり遂げることは、最終的には報われるでしょう。昨年の私の現在の仕事では、あなたがやっていることと似たようなことをしなければなりませんでした。今年、ゼロから書くためのまったく新しいアプリが与えられました。人々はあなたが何をしていて、どれだけうまく働いているかに気付くでしょう。
ティアナ

3
-1なぜあなたの仕事と私生活を結びつけるのですか?これは、一貫して残業滞在に似て聞こえる-I didn't finish my under-estimated task by Friday - so I need to stay at home and feel bad.
Vorac

@Vorac〜私は自分のやる気を引き出すためにそれをやると言った。誰もが違う。そして、私はあなたを保証することができます、私はOTに一貫して働きません。あなたをやる気にさせる何かを見つけて、それを使用してください。やりたくない仕事があるとき、物質的な報酬が最もうまくいくと思います。
ティアナ14年

1
@IntegrityFirst〜私にとっては、はい。Todoリストを終わらせるために遅くなります。私はそれを打つことを確認するために私の時間を予算化します。私がそれを完了すると言うときに何かを完了することは、自分自身と私の同僚に対する私の誠実さです。しかし、私が言った時間内に何かできないことがわかった場合は、計画を変更して上司に知らせます。そして、私が少し遅れて終わったら、映画/レストランは来週そこにあります。:)
ティアナ

30

thedailywtf.comに提出するための候補コードスニペットのファイルを保管してください。本当にそれらを送信するつもりはない場合でも、平均よりもさらに悪いコードを見つけることには明るい面があります。


もう一度賛成できたらいいなと思います。実際に設定する直前に、変更ログをアプリケーション構成ファイルに保存していることがわかりました。
ダン

24

私も同様の状況にあり、大量の不完全に書かれた大量のコピーアンドペーストされたコードのクリーンアップを担当していました。

私のモチベーションと正気を維持するためcurrent_scoreに、プロジェクトのLOCをカウントするスクリプトを作成し(重複を排除し、より良いアルゴリズムに切り替えたため、着実に減少しました)、開始時にLOCと比較しました。私が直面している山のようなコードにがっかりしたりイライラしたりするたびに、走るcurrent_scoreことは具体的な進歩の感覚を与え、すでに達成したことを思い出させます。そして、コードの特に悪い部分に取り組むとき、どれだけ高いスコアを獲得できるかを見るのは楽しかったです。

簡単にスクリプトを作成して、自分に進歩の感覚を与え、それを一種のゲームに変えることができる同様のメトリックを探します。コードの行(実行するだけwc -l)、循環的な複雑さ(これらの厄介なネストされた「if」をクリーンアップすると下がるはずです)、前任者の代わりにあなたが触れたコードの行(FishEyeがこれを伝えることができると思います$ 10)など。ログステートメントがまだないコードブロックの数を数えるために、問題なくPerlスクリプト作成することもできます。


SourceMonitorを使用しています-UmNyobe 16
1

13

私はこの本が推奨されているのを見ました:Legacy Code効果的に働くが、幸運にもそれを読む必要がありませんでした。

あなたがやっているように、必要なものをリファクタリングして、コードを理解し、システムを蘇生させていることを覚えておいてください。
うまくいけば、帰り道の一歩を踏み出すことになります。


2
この本は、既存のコードをリファクタリングしてテスト可能にすることを目的としています。私はそれが動機付けの方法で大いに役立つとは思わない。
ビリーONeal

2
良い点は@Billy ONealですが、テスト可能なコードと関連するメトリックがあることは、やる気を起こさせる可能性のある進捗状況を示すことができます。
StuperUser

1
私はこの本を読みました。間違いなく読む価値があります。私が実際に抱えていた不満の正確な種類を理解し、それらの不満を緩和するための効果的な方法を考案した誰かがそこにいたことを知ってうれしかったので、私は実際にWEWLCをやる気にさせました。
ジェイソンスウェット

1
その本はちょっと古くて時代遅れです。読んでいないのなら、なぜそれをお勧めしますか?
ブジェリシュ

1
@StuperUserこれを読んだとき、私はそれが時代遅れであると言うことができ、初心者ユーザーにいくつかの有用なアドバイスを提供することができます。
ブジェリシュ

6

プロジェクトをチャンクに分割してみてください。特定のチャンクがどのように機能するかを毎日学びます。一度にすべてを理解しようとすることは、おそらくあなたにストレスを与えているものです。

プロジェクトを改善することに誇りを持ってください。他に話せるコーダーはいますか?あなたが見つけた最新の論理について議論/笑うウォータークーラーの周りに立つのに役立ちます。仕事で陽気な雰囲気を保つためにこれをやろうとしています。


はい、私はチャンクで作業しており、すでにしばらくの間作業しているので、各コンポーネントについて大まかな考えがあります。それでも、通常は理解するのに時間がかかる小さなロジックであるため、あまり役に立ちません。10分かかった30行のメソッドは、実際には2行で書き直すことができることに気がつくと怒ります。会社については、残念ながら、私はこのプロジェクトの唯一の開発者であり、現在クライアントのオフィスで働いているので、本当に話せる人はいません。
ダン

@gaearon-2ラインソリューションの実装を妨げるものは何ですか?あなたがやるべき仕事をどうするかを理解する必要があります。コードの問題は、クライアントのオフィスにいなくても後で解決できます。コードのレビューと統合テストが行​​えるように、後で戻って変更を実装できるように、何をしたか、どのように機能するかをメモしておく必要があります。
ラムハウンド

@gaearon ah-ha!あなたが唯一のコーダーです。あなたの前の男が唯一のコーダーでした。あなたが唯一のコーダーであるとき、あなたは多くのことで逃げることができます(前任者から気づいたように)。次の仕事を探すときは、このことに留意してください。;)
davidhaskins

@Ramhoundコードレビューは一切行わないでしょう。正式な統合テストは行われないと思います。私はこれらの役職で数回働いてきました。一般に、人々は十分に機能するコードのみを望み、できるだけ早くそれを望みます。「ベストプラクティス」を説明することは、私見である壁に話しかけるようなものです。
davidhaskins

@Ramhound、このプロジェクトのテストはありません。また、よりクリーンなコードのためにシステムを破壊する責任を負いたくありません。現在のコードが例外の飲み込みを暗示している場合や、明らかでない他の種類の悪い動作に依存している場合が多くあります。ちなみに、これがロギングを追加する理由の1つです。
ダン

6

広範なメモ取り、質問、考え、システムの理解を整理します。大規模なレガシーシステムを扱う場合、これは私にとって驚くほどうまくいきました。それはあなたの理解を明確にし、未解決の質問を言葉にまとめるのを助け、あなたの思考がすでにまとめられているので、問題/質問/アイデア/などについて他の人と自然にコミュニケーションをとることがより容易になります。

例として、コードの一部を説明している間、私は常に自分自身にメモをとっています。これは自分との会話です。書くだけの行為は、より多くの考えが浮かび上がり、物事をよりよく理解するのに役立ちます。しばらくして、私はユーレカを持っているかもしれず、紙の上に「大きな絵」と一緒に小さな図を描く必要があります。私は常に紙の上でこれを行い、コンピューターの邪魔をすべて取り除きます。これにより、私は自分がやっていることについてより系統的で思慮深くなります。

これは基本的に、ドメインエキスパートとの永続的な会話を行う便利な方法です。


3

実際にはログを追加して多くのリファクタリングを行っているのに、「ログを追加しているだけです」という観点から見て非生産的だと感じるかもしれません。あなたのスーパーバイザーはおそらくコードの状況を知っています。誰もが今それを評価していないかもしれませんが、本当に面白くてやりがいのある機能を追加するリクエストを受け取ったら、コードをクリーンアップしたことをうれしく思います。


私はプロジェクトを書き直すことになるのではないかと心配しています。それについてはすでに話しました。私はこのオプションのほうが好きですが、使い捨てコードの作業に生産性を追加するものではありません。次のリリースではロギングが必要であることがわかっているので、自分のものを使用できますが、このコードを実行するだけで頭がおかしくなります。私はそれを理解した後にぼんやりしているように感じます:
ダン

1
「それは使い捨てのコードに取り組んで生産性を追加しません」 Suuureそれはありません。低リスクのタスク(ログ)を実行しながら、コードの大部分を理解して作業を進めることができます。あなたが得ているこの知識は、書き換えに関しては非常に役立ちます。大量のアプリをクリーンアップしたときに感じる報酬を楽しみにして、書き直していない場合は、一貫した継続的な努力によってコードベースがどれだけ改善されるかを考えてください。
クエンティン・スターリン

2

これらのケースでは、コードのセクションを書き直す傾向があります。1つのエリアの吸い込みを少なくするために、他の場所でログを記録するだけです。次に、さらにコードをクリーンアップします。悪いコードは、そこに置いた場合にのみ悪いです。


システムは悪い習慣に大きく依存しているため、メソッドを適切に書き直すには、プロジェクト全体を書き直す必要があります(おそらく最終的には書き直しますが、現在のリリースには期限があります)。
ダン

私は私を信じて理解しています。私は自分の人生を痛みを伴うことなくクリーンアップできるセクションを選んで、それから次のエリアをクリーンアップします。コードを修正することは決して時間をとらないプロセスですが、常に時間を稼ぐ必要があります。
エリン

2

仕事をゲーミファイします。たとえば、コードについて良い質問をするたびに5ポイント、答えるたびに10ポイントを与えます。メソッドをリファクタリングしたり、新しい機能を追加したりするたびに、バッジを付けてください。十分なポイントを獲得すると、コーヒーブレイクやビスケットなどの特典が得られます。プロジェクト全体を完了すると、本当に欲しいものを自分で扱う特権が得られます。


0

生産性を維持するために退屈したり怒ったりしないための秘Theは、コードの設計が不十分であることを受け入れることです。コードを理解し、更新しなければならないというあなたの立場を受け入れることで、「それがいかに愚かであるか」についてコメントし続けることなく、静かにそれを受け入れて先に進むことができます。

別のトリックは、一日の終わりに楽しみにして良いホームライフを持​​つことです。ガールフレンド、友達、ゲームは何でも動作します。一日を乗り越えて、悪いコードをずっとやりがいのあるものにするという目標をあなたに与えます。


0

マイケルフェザーズによる「レガシーコードの効果的な使用」が役立つ場合があります。

変更時に問題が発生することが心配な場合は、最初にいくつかのテストを作成し、変更を行う前後にテストが成功することを確認してください。テストを作成すると、特定のコードが何をするのかをまとめて理解するのに役立ち、自信を持って編集できるようになります。


残念ながら、それはSharePointプロジェクトです。つまり、ほとんどテストできません。過去にMicrosoft Molesを使用してSharePoint用のクールなサンドボックスを作成しましたが、多くの追加作業が必要です。
ダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.