Bagaimana Anda tetap produktif ketika berhadapan dengan kode yang ditulis dengan sangat buruk?

63

Saya tidak punya banyak pengalaman dalam bekerja di industri perangkat lunak, otodidak dan pernah berpartisipasi dalam open source sebelum memutuskan untuk mengambil pekerjaan. Sekarang saya bekerja untuk uang, saya juga harus berurusan dengan beberapa hal yang tidak menyenangkan, yang tentu saja normal.

Baru-baru ini saya ditugaskan untuk menambahkan logging ke proyek SharePoint besar yang ditulis oleh beberapa programmer yang jelas sedang belajar kode pada pekerjaan. Setelah 2 tahun berkolaborasi, klien beralih ke perusahaan kami, tetapi kerusakan telah terjadi, dan sekarang entah bagaimana saya perlu mempertahankan kode ini.

Bukan berarti kode itu terlalu sulit dibaca. Terlepas dari masalah-setiap proyek memiliki satu kelas dengan beberapa metode copy-paste, ifsarang besar , Sistem Hungaria, koneksi yang tidak diinginkan - itu masih dapat dibaca.

Namun, saya mendapati diri saya benar-benar tidak produktif meskipun mengerjakan sesuatu yang sederhana seperti menambahkan logging. Pada dasarnya, saya hanya perlu melalui kode langkah demi langkah dan menambahkan beberapa panggilan jejak. Namun, kebodohan kode ini sangat menjengkelkan sehingga saya lelah dalam 10 menit setelah mulai . Pada awalnya, saya biasa menambahkan usingkonstruk, mengurangi bersarang dengan membalikkan if, mengubah nama variabel menjadi nama yang dapat dibaca — tetapi proyek ini besar, dan akhirnya saya menyerah. Saya tahu ini bukan tugas yang harus saya lakukan, tetapi setidaknya mengurangi kekacauan memberi saya semacam penghargaan psikologis sehingga saya bisa terus berjalan. Sekarang triknya berhenti bekerja, dan saya masih memiliki 60% dari pekerjaan saya untuk dilakukan.

Saya mulai mengalami sakit kepala setelah bekerja, dan saya tidak lagi merasakan kepuasan yang biasa saya dapatkan — yang biasanya memungkinkan saya membuat kode selama 10 jam berturut-turut dan masih terasa segar.

Ini bukan hanya kata-kata kasar, karena saya benar-benar memiliki pertanyaan aktual:

Apakah ada cara untuk tetap produktif dan tidak melawan kincir angin?

Apakah ada semacam trik psikologis untuk tetap fokus pada tugas, alih-alih berpikir "Seberapa bodoh itu ?" Setiap kali saya melihat trik pintar lain oleh programmer sebelumnya? Masalah dengan menambahkan logging adalah bahwa saya benar-benar harus memahami apa yang dilakukan kode, dan hal itu menyakiti otak saya dengan cara yang tidak menyenangkan.

Dan
sumber
Notasi Hungaria tidak buruk, baca koran asli untuk melihat apa yang dia bicarakan :)
Woot4Moo
14
Saya tahu bahasa Hongaria tidak buruk. Inilah tepatnya mengapa saya menulis Systems Hungarian, bukan Apps Hungarian (yang asli). Saya melihat tidak masuk akal dalam menggunakan Sistem Hungaria di C # karena memiliki sistem tipe dan IDE yang bagus. Memiliki 10 variabel dalam lingkup yang sama yang semuanya mulai objmenakutkan karena pada dasarnya tidak dapat dibaca.
Dan
2
Saya berharap bisa memberikan pertanyaan ini lebih dari satu suara!
o6tech
9
Saya menghembuskan napas dengan mengajukan pertanyaan kasar pada tumpukan yang membuat saya downvoted.
Erik Reppen

Jawaban:

32

Maaf untuk memberitahu Anda, tetapi tidak semua pekerjaan penuh dengan sinar matahari dan glamor. Sebagian besar tugas pengembangan melibatkan pekerjaan membanting tulang seperti ini. Sedih, tapi benar.

Anda ditugasi dengan pekerjaan penting, meskipun membosankan sampai-sampai menonton cat kering. Ini penting karena dua alasan: 1. Ia menambahkan logging yang sangat dibutuhkan ke sistem besar sehingga ketika terjadi kesalahan Anda akan memiliki alat untuk membantu Anda menemukannya. dan 2. Ini membuat Anda terbiasa dengan basis kode sehingga jika dan ketika ada masalah Anda bisa melompat dan memperbaikinya.

Anda pada dasarnya membuat jaring pengaman Anda sendiri di sini. Glamour, tidak, tapi penting ya!

Jadi, itu dikatakan bagaimana Anda harus memotivasi diri sendiri? Ketika saya memiliki tugas yang mematikan pikiran di tempat kerja, saya menetapkan tujuan untuk diri saya sendiri. Selesai melakukan tugas x pada akhir minggu. Jika saya membuat tujuan saya, saya menghargai diri saya sendiri. Restoran baru yang ingin saya coba? Pergi Jumat malam jika saya selesai. Film baru saja keluar? Lihat di akhir pekan jika saya selesai.

Saya menemukan berbicara dengan penyelia saya dan membiarkan dia tahu di mana saya berada dan bagaimana saya maju membuat saya bertanggung jawab. Jika saya mengatakan kepada mereka bahwa saya akan selesai pada hari Jumat, saya merasa lebih cenderung untuk menyelesaikannya pada hari Jumat. Saya mengatakan kepada mereka bahwa saya akan menyelesaikannya.

Pertahankan keyakinan bahwa begitu Anda menyelesaikan tugas ini dan Anda telah melakukannya dengan baik, tepat waktu dan sesuai anggaran yang orang akan perhatikan dan ketika proyek baru yang menyolok itu datang, nama Anda mungkin hanya disarankan sebagai orang yang mendapatkannya. :)

Tyanna
sumber
Saya terutama suka tentang motivasi Jumat. Sangat lucu bahwa rilis saat ini juga dijadwalkan hingga hari Jumat. Saya pikir perlu menambahkan bahwa motivasi syukur adalah motivasi yang mengharukan. Anda perlu memastikan seseorang akan berterima kasih atas pekerjaan Anda, atau mengubah apa yang sedang Anda kerjakan. Tulus 'terima kasih' sering memutar kembali jam gelisah.
Dan
1
@gaearon - Saya senang saran ini membantu Anda. Melewati pekerjaan membanting tulang dengan tingkat motivasi yang baik akan terbayar pada akhirnya. Tahun lalu di pekerjaan saya saat ini, saya harus melakukan sesuatu yang mirip dengan apa yang Anda lakukan. Tahun ini saya diberi aplikasi baru untuk menulis dari awal. Orang-orang akan memperhatikan apa yang Anda lakukan dan seberapa baik Anda bekerja.
Tyanna
3
-1 Mengapa menghubungkan kehidupan kerja dan kehidupan pribadi Anda? Ini terdengar mirip dengan tetap lembur secara konsisten -I didn't finish my under-estimated task by Friday - so I need to stay at home and feel bad.
Vorac
@Vorac ~ Saya mengatakan itu yang saya lakukan untuk memotivasi diri sendiri. Setiap orang berbeda. Dan saya dapat meyakinkan Anda, saya tidak bekerja PL secara konsisten. Temukan sesuatu yang memotivasi Anda dan menggunakannya. Saya menemukan hadiah materi yang paling berhasil ketika saya memiliki tugas yang tidak ingin saya lakukan.
Tyanna
1
@IntegrityFirst ~ Bagi saya, ya. Saya akan tetap terlambat untuk menyelesaikan daftar todo saya. Saya akan menganggarkan waktu saya untuk memastikan saya berhasil. Integritas saya untuk diri sendiri dan rekan kerja untuk menyelesaikan sesuatu ketika saya mengatakan saya akan menyelesaikannya. Tetapi, jika saya menemukan sesuatu yang tidak dapat dilakukan pada waktu yang saya katakan, saya mengubah rencana dan memberi tahu atasan saya. Dan jika saya selesai agak terlambat, film / restoran akan ada di sana minggu depan. :)
Tyanna
30

Simpan file cuplikan kode kandidat untuk dikirim ke thedailywtf.com. Bahkan jika Anda tidak benar-benar bermaksud untuk mengirimkannya, itu memberi Anda sisi positif untuk menemukan beberapa kode yang bahkan lebih buruk daripada rata-rata.

Peter Taylor
sumber
Saya berharap saya bisa membenarkannya sekali lagi. Ternyata saran yang sangat bagus, sekarang saya menemukan bahwa orang-orang ini menyimpan changelog mereka dalam file konfigurasi aplikasi, tepat sebelum pengaturan yang sebenarnya.
Dan
24

Saya berada dalam situasi yang sama, bertugas membersihkan tubuh besar kode yang ditulis dengan buruk, disalin dan ditempel secara masif.

Untuk mempertahankan motivasi dan kewarasan saya, saya menulis sebuah skrip yang berjudul current_scoremenghitung LOC dalam proyek (yang terus menurun, ketika saya menghilangkan duplikasi dan beralih ke algoritma yang lebih baik) dan membandingkannya dengan LOC ketika saya mulai. Setiap kali saya berkecil hati atau frustrasi dengan tumpukan kode yang saya hadapi, berlari current_scoreakan memberi saya perasaan kemajuan yang nyata dan akan mengingatkan saya pada seberapa banyak yang telah saya capai. Dan sangat menyenangkan melihat seberapa tinggi skor yang bisa saya dapatkan ketika menangani bagian kode yang sangat buruk.

Saya akan mencari metrik serupa yang dapat Anda skrip dengan mudah untuk memberi Anda rasa kemajuan dan mengubahnya menjadi semacam permainan. Baris kode (jalankan wc -l), kompleksitas siklomatik (yang seharusnya turun saat Anda membersihkan "ifs" yang bersarang), baris kode yang telah Anda sentuh alih-alih oleh pendahulu Anda (saya pikir FishEye dapat memberi tahu Anda ini untuk $ 10), dll. Anda bahkan dapat menulis skrip Perl tanpa banyak kesulitan untuk menghitung jumlah blok kode yang belum memiliki pernyataan logging.

Josh Kelley
sumber
Saya menggunakan SourceMonitor
UmNyobe
13

Saya telah melihat buku ini direkomendasikan: Bekerja Efektif dengan Legacy Code , tetapi untungnya tidak perlu membacanya.

Seperti yang Anda lakukan, perbaiki apa yang perlu Anda lakukan sehingga Anda dapat memahami kode dan ingat bahwa Anda menghidupkan kembali suatu sistem, yang akan terbayar ketika Anda mempertahankannya.
Mudah-mudahan itu akan membuat langkah Anda dalam perjalanan pulang.

StuperUser
sumber
2
Buku ini adalah tentang refactoring kode yang ada untuk membuatnya dapat diuji; Saya tidak berpikir itu akan banyak membantu dalam hal motivasi.
Billy ONeal
2
Poin bagus @Billy ONeal, tetapi memiliki kode yang dapat diuji dan metrik terkait dapat menunjukkan kemajuan yang dapat memotivasi.
StuperUser
1
Saya sudah membaca buku ini. Pasti layak dibaca. Saya benar-benar menemukan WEWLC memotivasi hanya karena itu baik untuk mengetahui ada seseorang di luar sana yang mengerti persis jenis frustrasi yang saya alami dan telah menemukan cara yang efektif untuk mengurangi frustrasi tersebut.
Jason Swett
1
Buku itu agak tua dan ketinggalan jaman. Jika Anda tidak membacanya, mengapa Anda merekomendasikannya?
BЈовић
1
@StuperUser Saat saya membacanya, saya bisa mengatakan itu sudah ketinggalan zaman, dan dapat memberikan beberapa saran yang berguna untuk pengguna pemula.
BЈовић
6

Cobalah untuk memecah proyek menjadi potongan-potongan. Setiap hari pelajari cara kerja bongkahan tertentu. Mencoba memahaminya sekaligus mungkin adalah hal yang membuat Anda stres.

Banggalah dalam membuat proyek lebih baik. Adakah coders lain yang bisa Anda ajak bicara? Membantu berdiri di sekitar pendingin air mendiskusikan / menertawakan logika terbaru yang Anda temukan. Saya mencoba melakukan ini untuk menjaga suasana riang di tempat kerja.

davidhaskins
sumber
Ya, saya sedang mengerjakan potongan, dan saya sudah mengerjakannya untuk beberapa waktu, jadi saya punya ide kasar tentang masing-masing komponen. Namun, itu tidak banyak membantu karena potongan-potongan kecil logika yang biasanya membutuhkan waktu untuk dipahami — dan saya menjadi marah ketika saya menyadari bahwa metode 30 baris yang saya gunakan selama 10 menit sebenarnya dapat ditulis ulang dalam 2 baris. Adapun perusahaan, sayangnya, saya adalah satu-satunya pengembang di proyek ini, dan saya saat ini bekerja di kantor klien sehingga tidak ada orang yang bisa saya ajak bicara.
Dan
@gaearon - Apa yang mencegah Anda menerapkan solusi 2 baris Anda? Anda perlu mencari tahu bagaimana melakukan apa yang ditugaskan untuk Anda lakukan, masalah dengan kode dapat diselesaikan nanti, ketika Anda tidak berada di kantor klien. Anda harus menyimpan catatan tentang apa yang Anda lakukan, bagaimana sesuatu bekerja, sehingga Anda dapat kembali lagi nanti dan menerapkan perubahan Anda sehingga peninjauan kode dan pengujian integrasi dapat dilakukan.
Ramhound
@gaearon ah-ha! Anda satu-satunya pembuat kode. Jadi pria sebelum kamu adalah satu-satunya pembuat kode. Anda bisa lolos dengan banyak ketika Anda adalah satu-satunya pembuat kode (seperti yang Anda perhatikan dari pendahulunya). Ingatlah hal ini ketika Anda mencari pekerjaan berikutnya. ;)
davidhaskins
@Ramhound Saya bertaruh tidak akan ada ulasan kode. Saya yakin tidak akan ada pengujian integrasi formal. Saya telah bekerja di posisi ini beberapa kali. Umumnya orang hanya menginginkan kode yang berfungsi cukup baik, dan mereka menginginkannya secepat mungkin. Menjelaskan "praktik terbaik" seperti berbicara ke dinding, IMHO.
davidhaskins
@Ramhound, tidak ada tes untuk proyek ini, dan saya tidak ingin bertanggung jawab untuk merusak sistem demi kode pembersih. Ada banyak kasus ketika kode saat ini menyiratkan pengecualian ditelan, atau bergantung pada jenis perilaku buruk lainnya yang tidak jelas. Ini adalah salah satu alasan saya menambahkan logging.
Dan
6

Buat catatan luas untuk mengatur pertanyaan, pemikiran, dan pemahaman sistem Anda. Ini telah bekerja dengan baik bagi saya ketika berhadapan dengan sistem warisan yang besar. Ini membantu mengkristalisasi pemahaman Anda, membantu memasukkan pertanyaan terbuka menjadi kata-kata, dan karena pikiran Anda sudah disatukan, membuatnya lebih mudah untuk berkomunikasi secara spontan dengan orang lain tentang masalah / pertanyaan / ide / dll.

Sebagai contoh, saat saya membaca sepotong kode, saya akan terus membuat catatan untuk diri saya sendiri. Ini adalah percakapan saya dengan diri saya sendiri. Tindakan menulis semata membantu lebih banyak pikiran keluar dan membantu saya memahami hal-hal dengan lebih baik. Setelah beberapa saat saya mungkin memiliki Eureka dan perlu menggambar diagram kecil dengan "gambar lebih besar" di atas kertas untuk menggambarkan apa yang baru saja saya pikirkan atau potongan apa yang baru saja saya kumpulkan. Saya selalu melakukan ini di atas kertas saja, menyingkirkan semua gangguan komputer. Ini membuat saya menjadi lebih metodis dan bijaksana tentang apa yang saya lakukan.

Ini pada dasarnya adalah cara yang nyaman untuk melakukan percakapan abadi dengan pakar domain :)

Doug T.
sumber
3

Saya tahu Anda mungkin merasa tidak produktif karena Anda melihatnya dari perspektif 'Saya hanya menambahkan logging' padahal sebenarnya, Anda menambahkan logging dan melakukan banyak refactoring. Atasan Anda mungkin mengetahui situasi kode. Semua orang mungkin tidak menghargainya sekarang, tetapi ketika Anda mendapat permintaan untuk menambahkan fitur yang benar-benar menarik dan menantang, Anda akan senang membersihkan kode.

JeffO
sumber
Aku takut akhirnya akan menulis ulang proyek, kita sudah membicarakannya. Meskipun saya menyukai opsi ini dengan lebih baik, ini tidak menambah produktivitas dalam mengerjakan kode yang bisa dibuang. Saya tahu logging diperlukan di rilis berikutnya, dan kemudian saya bisa pergi dengan barang-barang saya, tetapi hanya memiliki-untuk-menjalankan-kode-ini-melalui-kepala saya yang membuat saya gila. Saya merasa seperti semakin bodoh setelah memahaminya :-)
Dan
1
"itu tidak menambah produktivitas dalam mengerjakan kode yang dibuang" Suuure melakukannya. Anda harus melalui sebagian besar kode yang bekerja pada pemahaman Anda tentang hal itu, sambil melakukan tugas berisiko rendah (masuk). Pengetahuan yang Anda peroleh ini akan sangat membantu jika harus menulis ulang. Jika tidak ada penulisan ulang cobalah menantikan hadiah yang akan Anda rasakan ketika Anda telah membersihkan sejumlah besar aplikasi, seberapa baik basis kode akan disebabkan oleh upaya Anda yang konsisten dan gigih.
quentin-starin
2

Dalam Kasus ini saya cenderung menulis ulang bagian kode. Untuk membuat satu area kurang menyedot dan kemudian saya hanya menambahkan logging beberapa tempat lain Kemudian bersihkan beberapa kode lagi. Kode buruk hanya buruk jika Anda membiarkannya di sana.

Erin
sumber
Sistem sangat bergantung pada praktik-praktik buruk sehingga untuk menulis ulang metode dengan benar, saya harus menulis ulang seluruh proyek (yang mungkin akan saya lakukan pada akhirnya, tetapi saya memiliki tenggat waktu untuk rilis saat ini).
Dan
Ya saya mengerti percayalah. Saya hanya memilih bagian yang bisa saya bersihkan tanpa membuat hidup saya menjadi menyakitkan dan membersihkannya dan kemudian ke area berikutnya. Memperbaiki kode adalah proses yang Anda tidak pernah mendapatkan waktu tetapi harus selalu menyediakan waktu untuk itu.
Erin
2

Gamify pekerjaan Anda. Misalnya, beri diri Anda 5 poin setiap kali Anda mengajukan pertanyaan yang bagus tentang kode, dan 10 poin setiap kali Anda menjawabnya. Beri diri Anda lencana setiap kali Anda melakukan refactor suatu metode atau menambahkan fitur baru. Setelah Anda mendapatkan poin yang cukup, Anda mendapatkan hak istimewa seperti rehat kopi atau biskuit. Setelah Anda menyelesaikan seluruh proyek, Anda mendapat hak istimewa untuk memperlakukan diri sendiri untuk sesuatu yang benar-benar Anda inginkan.

Richie Cotton
sumber
0

Trik untuk tidak bosan atau marah sehingga Anda tetap produktif adalah menerima bahwa kode tersebut dirancang dengan buruk. Menerima posisi Anda karena harus memahami dan memperbarui kode akan memungkinkan Anda untuk tidak terus mengomentari "betapa bodohnya itu" dan sebaliknya dengan diam-diam menerimanya dan melanjutkan.

Trik lain adalah memiliki kehidupan rumah tangga yang baik untuk dinanti pada akhir hari. Pacar, teman, permainan apa pun akan berhasil, untuk memberi Anda tujuan untuk melewati hari dan membuat kode susah payah meskipun buruk semua bernilai sementara.

Tim
sumber
0

"Bekerja Efektif dengan Kode Warisan" oleh Michael Feathers dapat membantu.

Jika Anda khawatir akan merusak sesuatu saat Anda mengubahnya, tulis beberapa tes terlebih dahulu, pastikan semuanya lulus sebelum dan setelah Anda melakukan perubahan. Menulis tes akan membantu Anda merangkum dan memahami apa yang dilakukan oleh sepotong kode dan akan memungkinkan Anda untuk mengedit dengan percaya diri.

Stephen Paulger
sumber
Sayangnya, ini adalah proyek SharePoint, artinya hampir tidak dapat diuji. Saya telah menulis beberapa kotak pasir keren untuk SharePoint di masa lalu menggunakan Microsoft Moles tetapi membutuhkan banyak pekerjaan tambahan.
Dan