私はソフトウェア業界で働いた経験がなく、独学でオープンソースに参加してから就職することにしました。今はお金のために働いているので、もちろん不快なことにも対処する必要がありますが、これは当然のことです。
最近私は、明らかに仕事のコーディングを学んでいるプログラマーによって書かれた大規模なSharePointプロジェクトにロギングを追加するよう割り当てられました。 2年間のコラボレーションの後、クライアントは私たちの会社に切り替えましたが、損害は発生しました。今、どういうわけか私はこのコードを維持する必要があります。
コードが読みづらかったも難しかったわけではありません。問題にもかかわらず、各プロジェクトには、コピー貼り付けされた複数のメソッド、巨大なif
ネスト、Systems Hungarian、未処理の接続を持つ1つのクラスがあり、それでも読み取り可能です。
ただし、ロギングを追加するだけの簡単な作業を行っていたにもかかわらず、私はまったく非生産的でした。基本的に、コードを1ステップずつ実行して、トレース呼び出しを追加するだけです。 ただし、コードの馬鹿さは非常に煩わしいので、開始後10分以内に疲れます。最初は、using
構成を追加し、if
を逆にすることでネストを減らし、変数の名前を読みやすい名前に変更していましたが、プロジェクトが大きく、結局あきらめました。これは私がすべきことではないことはわかっていますが、少なくとも混乱を減らすことで、何らかの心理的な報酬が得られたので、続けることができました。今ではトリックは機能しなくなり、私はまだやるべきことが60%あります。
仕事を終えて頭痛がし始めましたが、以前のように満足感を味わうことができなくなりました。通常、コーディングを10時間続けても新鮮な気分になれます。
これは大きな怒りだけではありません。私は実際に質問があります。
生産性を維持し、風車と戦わない方法はありますか?
「どれほど愚かであるかあの?」それぞれ考えずに、タスクに集中し続けるための何らかの心理的なトリックはありますか?前のプログラマーによる別の巧妙なトリックを見たときは?ロギングを追加することの問題は、コードが何をするか理解しなければならないことであり、そうすることは不愉快な方法で私の脳を傷つけます。
申し訳ありませんが、すべての仕事が日光と魅力に満ちているわけではありません。開発タスクの大部分は、このような泥沼な作業を伴います。悲しいですが本当。
あなたが重要な仕事を任されています。たとえペイントが乾くのを見るのは退屈なことです。これは2つの理由で重要です。1。大規模なシステムに必要なロギングを追加して、何か問題が発生したときに、それを見つけるのに役立つツールを用意します。および2.コードベースに慣れるので、何か問題が発生した場合にすぐに参加して修正できます。
ここでは基本的に独自のセーフティネットを作成しています。魅力、いいえ、しかし重要ですはい!
それで、あなたはどのようにあなた自身をやる気にさせるべきですか?私は仕事で麻痺する仕事をしているとき、私は自分のために目標を設定しました。週の終わりまでにタスクxの実行を終了します。目標を達成したら、自分に報いる。私が試したい新しいレストランは?終わったら金曜の夜に行きます。新しい映画が出てきたばかり?終わったら週末に見てください。
私は上司と話し、上司に私がどこにいるのか、そしてどのように進んでいるのかを知らせることで、説明責任を果たします。金曜日までに完了すると彼らに言った場合、私は金曜日までにそれをやりたいと思うようになりました。
このタスクを完了し、時間どおりに予算内で実行すると、人々はそれに気づき、その新しいプロジェクトがやってくると、あなたの名前がそれを手にした人として提案されるだけになる可能性があることを確信してください。 :)
Thedailywtf.comに送信するための候補コードスニペットのファイルを保管してください。実際に提出するつもりがない場合でも、平均よりもさらに悪いコードを見つける明るい面を提供します。
私も同様の状況にあり、不十分に記述され、大量にコピーおよび貼り付けられたコードの大部分をクリーンアップすることを任されていました。
動機と正気を維持するために、プロジェクトでLOCをカウントするスクリプト(current_score
)を作成し(重複を排除してより良いアルゴリズムに切り替えたため、着実に減少しました)、開始時にLOCと比較しました。直面しているコードの山にがっかりしたりイライラしたりするときはいつでも、current_score
を実行すると具体的な進歩の感覚が得られ、すでに達成したことを思い出させてくれます。そして、コードの特に悪いセクションに取り組むときに、どれだけ高いスコアを獲得できるかを見るのは楽しいものでした。
簡単にスクリプトを作成して、進行状況を把握し、それを一種のゲームに変えることができる同様のメトリックを探します。コード行( wc -l
を実行するだけ)、循環的複雑度(厄介なネストされた「ifs」をクリーンアップすると低下する)、代わりにユーザーが操作したコード行あなたの前任者(私は FishEye がこれを$ 10で教えてくれると思います)など。あなたは Perlスクリプトを書く まだログステートメントはありません。
私はこの本が推奨されるのを見てきました: レガシーコードで効果的に動作する ですが、幸いにもそれを読む必要はありませんでした。
あなたがしているように、コードを理解できるように必要なものをリファクタリングし、システムを蘇生していることを覚えておいてください。
それがうまくいけば、家に帰る途中にあなたの足元に春をもたらすでしょう。
プロジェクトをチャンクに分割してみてください。毎日、特定のチャンクがどのように機能するかを学びます。一度にそれを理解しようとすることは、おそらくあなたをストレスにさらしているものです。
プロジェクトをより良くすることに誇りを持ってください。あなたが話すことができる他のコーダーはいますか?それはあなたが見つけた最新のロジックを議論/笑って水クーラーの周りに立つのに役立ちます。私は仕事で陽気な雰囲気を保つためにこれをやろうとします。
詳細なメモを取る質問、考え、システムの理解を整理します。これは、大規模なレガシーシステムを扱うときに、私にとって不思議に働きました。それはあなたの理解を具体化し、未解決の質問を言葉にまとめるのに役立ちます、そしてあなたの考えはすでにまとめられているので、問題/質問/アイデア/その他について自発的に他の人とコミュニケーションするのを容易にします。
例として、コードの一部を実行している間、私は常に自分にメモをとっています。これは自分との会話です。書くという行為は、より多くの考えが浮かび、私が物事をよりよく理解するのに役立ちます。しばらくすると、私はユーレカを持っているかもしれません。紙の上に「大きな絵」を使って小さな図を描き、私が今考えたものや組み立てたものを説明する必要があります。私はいつもこれを紙だけで行い、コンピュータの気を散らすものをすべて取り除きます。これにより、自分がやっていることをより系統的に、そして思慮深くすることができます。
これは基本的に、ドメインエキスパートと永続的に会話するための便利な方法です。
実際、ロギングを追加して多くのリファクタリングを行っているときに、「ロギングを追加しているだけ」という観点から見ていると、生産性が低下すると感じるかもしれません。上司はおそらくコードの状況を認識しています。今は誰もがそれを理解していないかもしれませんが、本当に興味深く、やりがいのある機能を追加するリクエストを受け取ったら、コードをクリーンアップして喜んでいるでしょう。
あなたの仕事をゲーミファイします。たとえば、コードについて良い質問をするたびに5ポイント、解答するたびに10ポイントを獲得してください。メソッドをリファクタリングするか、新しい機能を追加するたびに、バッジを取得してください。十分なポイントが貯まると、コーヒーブレイクやビスケットなどの特典を獲得できます。プロジェクト全体を完了すると、本当に欲しいものに自分を扱う特権が与えられます。
これらのケースでは、コードのセクションを書き直す傾向があります。 1つのエリアの負担を軽減するには、他の場所にログを追加します。次に、さらにコードをクリーンアップします。悪いコードはそこに残しておけば悪いだけです。
Michael Feathersによる「レガシーコードの効果的な使用」が役立ちます。
変更するときに問題が発生するのではないかと心配している場合は、最初にいくつかのテストを記述し、変更前と変更後にテストがパスすることを確認してください。テストを作成すると、特定のコードの機能を要約して理解するのに役立ち、自信を持って編集できるようになります。
飽きたり怒ったりせずに生産性を維持するための秘訣は、コードの設計が不十分であることを受け入れることです。コードを理解して更新する必要があるという立場を受け入れると、「どれほど愚かか」についてコメントし続けるのではなく、静かに受け入れて次に進むことができます。
もう1つの秘訣は、一日の終わりに楽しみにできる良い家庭生活を送ることです。ガールフレンド、友達、ゲームは何でも機能します。1日を乗り越えて、悪いコードを試してみる価値はあります。