Saya seorang diri refactored 15 ribu garis warisan. Itu adalah dua minggu terburuk dalam hidupku



Beberapa bulan yang lalu saya bekerja di sebuah outstaff. Ini bukan tempat di mana Anda membutuhkan antusiasme dan kepercayaan pada tujuan besar proyek. Bersama dengan tim, mereka hanya menjual saya kepada pelanggan, dan pada pertemuan itu penting berapa banyak tiket yang saya tutup. Serangan perfeksionisme agak buruk untuk tempat seperti itu, tetapi saya tidak bisa melakukan apa-apa dengan mereka. Saya membayar banyak untuk salah satu dari mereka, masuk ke krisis neraka dan menghabiskan dua minggu terburuk dalam hidup saya.

Perusahaan saya meminta saya untuk datang ke Moskow selama dua minggu, ke kantor utama, untuk bekerja dengan tim. Permintaan itu masuk akal, saya setuju. Beberapa hari sebelum keberangkatan, saya mengambil tiket lain. Itu perlu untuk menambahkan fitur ke SDK untuk selusin proyek yang sedang kami kerjakan. SDK ini adalah warisan yang tidak dapat dilewati yang tidak disentuh oleh siapa pun yang waras. Ada rawa-rawa yang bahkan para insinyur yang susah payah dibaptis dengan takhayul - jika semuanya bekerja, bagaimana cara kerjanya. Ketika kita perlu memperbaiki sesuatu atau menambahkan fitur, kita dengan hati-hati mengembalikan kode dengan tongkat penyangga lain, dan tanpa bernapas kirim ke tangan CI dan QA.

Saya berencana melakukan hal yang sama. Inti dari tugas itu sederhana. SDK itu sendiri adalah pembungkus sistem biner yang sangat pintar yang dapat mengangkat VPN. Dia berkomunikasi dengan back-end kami, menerima segala macam konfigurasi, mengesahkan pengguna, mengambil daftar negara untuk VPN, dan sebagainya.

Saya hanya perlu menambahkan permintaan lain ke backend, yang menerima daftar server. Itu terlihat sangat sederhana - menambahkan metode ke API publik, memasukkan permintaan untuk URL yang diinginkan di dalamnya, menampar model, mengurai, memberikannya. Lalu ia mengajar aplikasi klien untuk menggunakan permintaan ini, dan Anda selesai. Saya melakukan tugas dalam dua hari.

Kesalahan yang sangat besar. Tidak ada tugas sederhana. Dengan satu mata saya sudah memilah-milah bar Moskow, di mana saya perlu minum semua bir, dengan yang lain saya melihat masalah pertama. Kami tidak hanya mendapatkan daftar server, kami juga menggunakan salah satunya untuk meningkatkan terowongan VPN. Sebelumnya, kami hanya menggunakan negara untuk ini. Tetapi beberapa jenius memutuskan akan menjadi ide bagus untuk menyimpan negara sebagai daftar string. Tentu saja, esensi dari simpul VPN terlalu luas untuk ditampung dalam satu baris.

Akibatnya, banyak metode muncul di SDK yang mengambil string (kode negara) dan melakukan sesuatu di sana, dan sekarang semua metode ini harus mengambil kode negara, atau objek server - dan melakukan sesuatu di sana. Semua yang kami lakukan dalam kode SDK dan aplikasi dengan negara, sekarang kami harus melakukan keduanya dengan negara dan dengan server.

Ketika saya memahami hal ini, untuk beberapa alasan saya senang. Lingkup tugas sekarang memungkinkan saya untuk sedikit memperbaiki rawa, penuh dengan kotoran di mana saya berenang sepanjang waktu. Saya menyatakan keinginan saya, dan sekarang saya tahu pasti - mereka memberi saya lampu hijau dengan ekspresi, seolah-olah mereka telah melemahkan seorang wanita cacat dengan harga Maserati. Saya menyetujui anggaran mingguan dan mulai bekerja.



Ada beberapa hari sebelum keberangkatan. Minggu itu tampak seperti tak terhingga. Saya memutuskan, sampai saya menulis kode, saya hanya mengguncang keputusan di kepala saya, dan segera setelah saya tiba, saya akan dengan cepat menyebarkan semuanya.

Ketika orang normal melakukan perjalanan bisnis, ia membeli tiket di muka, menyelesaikan masalah perumahan, memperingatkan istrinya, dan umumnya melakukan segalanya dengan benar. Saya seorang idiot berpandangan pendek yang menginjak-injak ke Moskow dengan istri dan dua anaknya. Saya harus mengambil istri saya karena saya memberi tahu dia tentang perjalanan tiga jam sebelum keberangkatan. Dalam dua jam - saya baru saja mulai mencari sopir dengan minivan, karena mobil saya mogok. Saya menyewa sebuah apartemen pada saat yang sama. Enam jam perjalanan dengan anak-anak yang berteriak dan seorang istri yang tidak puas berakhir sebagaimana mestinya - apartemen itu persis dua ribu kali lebih kecil daripada yang terlihat dalam gambar. Bau terburuk adalah bau rumput. Pelayan yang menjamu kami mengatakan bahwa mereka meracuni kecoak (kecoak !!!). Istri saya mempercayainya, dan mengatakan kepada istri saya bahwa saya membedakan bau rumput dari racun kecoa tidak sesuai dengan minat saya.

Saya datang ke kantor, mereka memberi saya laptop. Selama setengah hari saya menginstal lingkungan, saya mengenal semua orang. Ketika semuanya diunduh dan diinstal, semuanya mulai berfungsi. Kemarahan dari langkah mengerikan belum mendingin. Saya membuka proyek dengan SDK, sekali lagi mengutuk diri saya sendiri, dan berpikir: “Apa-apaan ini? Ya, di sini segalanya dengan anjing harus dibuang dan diperbaiki. ”

Saya memberi tahu pemimpinnya tentang hal ini, dan dia, tentu saja, menjawab: "Saya setuju, bung." Sebuah proyek 15 ribu baris, yang masing-masing merupakan kejahatan terhadap kemanusiaan. Saya akan memperbaikinya dalam dua minggu. Dan jika saya memiliki sepuluh jam perjalanan dan tiga anak, apa yang akan saya sarankan sebagai petunjuk? Temukan dalam satu minggu PL baru khusus untuk proyek?

Tetapi bagi saya, jika saya menertibkan setidaknya sesuatu - itu akan menjadi lebih mudah bagi saya. Sekarang aku menyalibkan govnokod ini, aku akan melakukan segalanya sebagaimana mestinya, kita akan hidup. Saya pernah membaca buku tentang cara melakukan refactoring mendalam. Ada banyak pemikiran cerdas tentang bagaimana Anda melukis langkah-langkah, menulis tes, memikirkan tindakan Anda sehingga Anda memiliki kepercayaan diri pada setiap langkah - proyek bekerja, tidak ada yang rusak. Buku dan praktik terbaik, itu sangat keren, tapi saya tidak pernah belajar dari kesalahan orang lain. Pada awal karir saya, saya banyak membaca tentang segala hal dasar, tetapi tidak percaya sampai saya perlu memperluas fungsionalitas proyek pertama saya.

Tugas menyapu apa pun adalah memberi Anda dahi. Sampai keputusan tidak berhasil Anda peduli tentang Anda secara pribadi, Anda tidak akan menganggapnya tidak berhasil.

Saya mulai melakukan refactoring tanpa mengandalkan latihan. Saya secara mental membagi proyek menjadi potongan-potongan logis besar. Ini tidak tercermin dalam struktur file-nya, jadi saya mengambil struktur file ini ke neraka. Saya membuat ayah dari tingkat atas: di sini kami bekerja dengan punggung, di sini kami bekerja dengan VPN, di sini pembantu, ada pengecualian. Tes unit yang ada, saya juga menolak. Kemudian bagiku tampaknya govnokod tidak punya hak untuk hidup, dan sekarang aku mengerti bahwa aku melompat keluar dari pesawat dan tidak menggunakan parasut, karena itu melanggar instruksi.

Saya mulai memindahkan govnokod dari ayah lama ke ayah baru, sekaligus mengaturnya. Tidak ada yang istimewa, cukup ikuti praktik yang baik. Ada kelas yang menggambarkan model pengguna, ia memiliki semua properti opsional, semua dengan setter. Mengubahnya menjadi hierarki warisan anak-anak. Semua ridonly, semua melalui konstruktor. Sehingga pengguna kelas ini selalu tahu persis apa yang mereka miliki di tangan mereka. Ada govnomethod pada empat ratus baris - Anda menekan sub-metode. Anda melihat file dengan seribu tanggung jawab - Anda mengubahnya menjadi seribu file dengan satu tugas. Ada kelas yang memiliki metode Inisialisasi, yang harus selalu dipanggil segera setelah membuat kelas - Anda menerapkan pola "status"

Konsep kode baik dan buruk sangat kabur. Sepanjang hidup saya, saya akan belajar untuk membedakan di antara mereka. Tapi terus terang kode menyebalkan yang bisa saya lihat sekarang. Lihat dan perbaiki. Saya mencoba untuk tidak terlalu banyak mencungkil arsitektur tingkat atas dan mengubah SDK API sesedikit mungkin.



Merupakan keputusan yang buruk untuk tetap bekerja selama beberapa jam ketika istri Anda menunggu Anda di kota yang aneh, di gubuk terburuk di dunia, dan ia memiliki dua anak kecil yang mengaum karena stres tanpa berhenti. Saya bertahan selama tujuh jam. Pada hari pertama kerja, saya duduk di kantor sampai pukul satu pagi dan menyalin dua persen dari kekuatan.

"Di rumah" skandal yang pantas ditunggu saya, di pagi hari - kopi instan yang menyebalkan. Saya menyewa sebuah apartemen lima menit dari kantor, tetapi saya sangat aneh dan takut di kota yang mengerikan ini sehingga tiga hari pertama saya pergi bekerja dengan taksi.

Semua orang di kantor sangat gembira - orang-orang akan minum di malam hari. Moskow ini melakukan ini setiap hari. Mereka memanggil saya juga. Saya berjanji untuk mencoba, meskipun saya sendiri tahu pasti - tidak ada pilihan. Dia mulai bekerja lagi.

Kemudian saya merasa bahwa saya sendiri yang harus disalahkan atas semua urusan rumah tangga, karena saya mengambil barang sendiri. Lebih baik mencari apartemen, menyiapkan lebih baik, meramalkan semua masalah dengan keluarga dan kehidupan. Banyak masalah yang tidak mungkin terjadi. Melihat kode, saya pikir - inilah yang menyebabkan setengah tindakan.

Dia dengan cepat memutuskan bahwa pendekatan saya kemarin terlalu kompromistis. Jika Anda mengulanginya, maka itu saja. Saya tidak lagi terbatas pada penggantian nama dan pemisahan. Setiap file yang akan saya proses dianalisis dengan cermat. Saya sudah berada di proyek ini selama beberapa waktu, saya mengerti betul apa yang diinginkan bisnis di sini dan apa yang harus dilakukan kode kami.

Tapi di sini saya mulai terus-menerus bertemu kode yang saya tidak mengerti - masalah apa yang dipecahkan dan mengapa itu ditulis sama sekali. Dan saya membuat keputusan - jika saya tidak mengerti mengapa kode itu diperlukan, maka kode itu tidak diperlukan. Saya dengan senang hati mulai mengirim sampah digital ini ke neraka.

Pendekatan ini memunculkan masalah baru. API publik proyek salah. Ada banyak metode dengan tanda tangan yang tidak masuk akal (misalnya, metode mengambil string dan objek yang berisi string yang sama). Banyak metode memiliki nama idiot. Dan secara umum, jika Anda menggunakan SDK ini dengan API yang dimilikinya, Anda dapat memecah aplikasi dalam sepuluh ribu cara.

Pada saat ini, saya sudah cukup jauh. Proyek itu tidak akan berjalan, dan tidak ada kemungkinan proyek itu akan berjalan dalam beberapa hari ke depan. Semua yang saya ubah di dalamnya, saya hanya bisa mengecek di akhir pekerjaan. Dan karena saya sudah banyak berubah, mengapa tidak mengubah API publik? Yah, saya cukup pintar untuk membuat salinan repositori dari SDK dan aplikasi, jadi saya bisa menduplikasi perubahan API dalam salinan ini dan menemukan kesalahan. Lagi pula, saya bahkan tidak bisa mengkompilasi versi utama SDK.

Masalahnya segera dimulai. Mengubah tanda tangan dari satu metode? Tangkap ditambah dua ratus kesalahan waktu kompilasi dalam aplikasi. Karena tanda tangan yang salah, parameter yang salah diteruskan ke metode, dan aplikasi berfungsi. Pada saat yang sama, Anda bekerja di empat jendela IDE. Setelah saya mengubah ketiga metode, dan menyembuhkan semua kesalahan dengan mereka, saya pikir - karena pekerjaan telah dilakukan, akan bodoh untuk mengubah hanya bagian dari API bodoh - kita perlu mengulanginya lebih lanjut. Dan dia masuk ke proses lebih dalam lagi.



Saya terus-menerus harus membuat keputusan, sebagian besar beretika. Jadi saya tahu bagaimana sesuatu harus bekerja, dan sekarang saya melihat kode yang seharusnya melakukannya. Saya membacanya dan mengerti bahwa dia tidak. Tapi kode ini ada di prod, melewati QA. Dan siapa yang bodoh? Bagaimana saya bisa mengambil tanggung jawab ini? Pada awalnya, saya berpikir lama tentang setiap kasus seperti itu, berkonsultasi dengan seorang pemimpin dan sebuah tim. Tetapi butuh terlalu banyak waktu.

Saya menyadari bahwa saya bekerja lambat karena saya takut untuk memecahkan sesuatu, mencoba untuk mencari tahu di suatu tempat, untuk berhati-hati. Kemudian saya berkata pada diri saya sendiri: "Saya lebih pintar daripada orang yang menulis omong kosong ini, saya tahu apa yang harus dilakukan, saya punya tugas dan anggaran untuk refactoring, dan saya punya hak untuk semuanya." Orang-orang yang lemah mengerti dan khawatir, seorang pria tahu apa yang diinginkannya, dan melakukannya tanpa banyak bertanya.

Pada titik tertentu, saya memasuki keadaan aneh robot yang secara metodis memproses satu file dengan kode setelah yang lain. Tanpa memeriksa apa pun, tanpa meragukan apa pun. Saya melihat kode yang buruk - ubah. Rantai ini memunculkan area masalah baru, memperbaikinya. Di masing-masing saya mengganti govnokod dengan sesuatu yang bisa ditoleransi.

Itu terlihat seperti blitz dalam catur. Anda memainkan permainan di mana hal yang paling penting adalah memikirkan semua opsi yang mungkin, tetapi Anda memiliki sedikit waktu sehingga Anda bahkan tidak bisa memikirkan opsi apa yang layak untuk dipikirkan. Saya selalu kehilangan blitz. Untuk hari kedua saya melakukan banyak hal. Berikut ini hanya kode yang tidak dapat Anda verifikasi - ini bukan kode. Dan saya tahu tentang itu.



Suatu malam, saya ingat bahwa saya telah berjanji kepada istri saya untuk pergi ke Ikea. Apartemen tempat kami tinggal sangat buruk, dan istri saya ingin membeli sampah yang nyaman. Saya menulis kode sepanjang hari, otak saya kelelahan, tetapi saya harus pergi. Masukkan berbagi mobil, mobil terdekat berjarak dua puluh menit. Saya memanggil taksi untuk sampai ke mobil. Bayangkan jalan buntu khas Moskow macet dengan mobil ke bola mata. Di akhir ini, Renault Kaptur menungguku. Setelah mengalahkan UI yang tertinggal dari Delimobile, saya dapat membuka bucket ini. Ada kejutan yang menunggu saya - gearbox otomatis. Saya tidak pernah mengendarai mesin, tetapi saya pikir saya bisa mengatasinya. Jika Anda ingin maju, Anda harus menggerakkan pegangan ke depan, jika mundur - mundur. Tidak. Saya menyadari bahwa mobil itu tidak berjalan tepat pada saat masih memungkinkan untuk menyelamatkan situasi.

Rem tertekan. Tentu saja, kaki yang salah, karena dalam mesin bodoh hanya dua pedal, dan otak saya salah mengerti segalanya. Brengsek liar, mobil bangkit. Dua milimeter ke Mercedes S-Class.

Entah bagaimana aku merangkak keluar dari jalan buntu dan menyadari bahwa semua mobil di dunia ada di sekitarku, tetapi aku tidak tahu ke mana atau bagaimana pergi. Saya berkendara ke "rumah", mengambil istri saya, tengah malam melaju melalui kota paling mengerikan di bumi, melewatkan belasan belokan, meninggalkan kekayaan di ikea.

Kami kembali pada pukul empat pagi, otak saya mati begitu mata saya melihat tempat tidur.



Pada jam delapan pagi saya kembali bekerja. Di sana semua orang senang lagi, mendiskusikan urusan dan bar Moskow mereka yang tidak bisa saya jangkau. Saya memiliki SDK lagi. Dengan kepala yang berat, saya membaca sekilas perubahan yang telah saya buat. Semuanya sangat buruk. Besok rapat umum berlangsung, dan saya perlu tiga ratus tahun lagi untuk menyelesaikannya.

Saya memiliki keterampilan yang baik - ketika saya mendapatkan tiket besar, saya selalu menguraikannya menjadi beberapa yang kecil. Karena itu alur kerja saya. Satu tiket, satu atau dua komit, satu permintaan tarik. Oleh karena itu, pada prinsipnya, saya tidak dapat membagi tugas menjadi beberapa komitmen dalam proses pengkodean - saya biasanya tidak memerlukan ini. Tapi stres menghabisiku, dan skill itu gagal. Dalam prosesnya, saya mengubah tugas kecil menjadi tugas besar, tetapi saya mulai mengerjakannya dengan cara yang sama seperti mengerjakan tugas kecil. Tanpa sistem, bodoh di mana saya melihat masalah, saya memperbaikinya di sana. Dia tidak membagi proses menjadi langkah-langkah logis, tetapi hanya sebagai Juni lalu meraih sekaligus.

Anda tidak dapat mengubahnya kembali. Masalah utama tetap - saya tidak bisa membangun dan menjalankan seluruh solusi, dan tidak tahu bagaimana cara kerjanya. Itu sangat menakutkan, pada hari terakhir saya melihat perbedaan dan menyadari bahwa saya telah menulis ulang hampir seluruh proyek. Sangat menakutkan.



Semuanya selalu meluncur pada hari terakhir. Perjalanan bisnis berakhir, perpanjangan waktu saya untuk refactoring juga. Istri saya menelepon dan mengatakan bahwa kami diusir pada pukul satu siang, meskipun saya setuju pada larut malam. Secara alami, ini berarti bahwa saya tidak dapat menyelesaikan hari terakhir hingga akhir.

Bersama dengan tiga galon keringat dingin, apa yang datang kepada saya ketika saya melakukan tugas ini, merencanakan refactoring, menyetujui perjalanan bisnis, membawa anak-anak, melepas simpanan selama dua minggu - saya adalah idiot paling penting di seluruh dunia. Sebaiknya para psikiater memilah motif saya, tetapi saya memutuskan untuk melakukan semuanya. Entah untuk menghukum diriku sendiri, atau untuk keyakinan irasional bahwa aku melakukan semuanya dengan benar.

Dengan pantat terbakar, saya membekukan semuanya dalam satu jam, meluncurkan CI dan pulang. Semua cara saya menggulir kode saya di kepala saya dan saya benar-benar yakin tidak ada yang akan berhasil. Terlalu banyak perubahan, akan ada seratus bug, dan kami akan menolak refactoring ini.

Ketika saya kembali ke rumah, berita itu menunggu saya - proyek ini berhasil. Timbal dikoreksi beberapa hal kecil, perubahan saya lulus uji otomatis dan sekarang mereka berhasil menjalani pengujian manual. Saya tidak percaya itu. Saya merusak kode untuk gerobak rumah, mengumpulkan dan memeriksa secara manual semua skrip yang tidak saya percayai. Itu berhasil. Berhasil !!!

Saya sangat bangga pada diri saya sendiri. Kualitas basis kode telah berkembang berkali-kali, beberapa fitur telah muncul, saya memotong banyak bug yang belum berhasil dilakukan penguji. Liba dapat digunakan dengan nyaman, dan saya membuktikan diri saya bugar secara profesional.



Semangat antusiasme dan kerja keras yang rela berkorban - banyak orang bodoh yang naif. Saya akan senang membuktikan kebalikan dari diri saya dengan cerita ini. Tetapi beberapa hari setelah kembali, lebih banyak berita menunggu saya.

Pelanggan memutuskan untuk meninggalkan proyek. Hampir seratus orang di outstaff (setengah dari seluruh perusahaan) ternyata "menunggu proyek baru." Pertimbangkan - menganggur secara hukum. Dan remoters dalam hal-hal seperti itu dipotong di tempat pertama. Saya disuruh pindah ke Moskow secara permanen dan beralih ke proyek lain. Atau kami akan memecatmu.

Saya bertanya apa yang akan terjadi pada proyek lama.

Pada saat-saat seperti itu, orang menjadi sangat jujur. Sanjungan, hiasan, dan etika perusahaan tidak lagi dibutuhkan. Saya diberitahu bahwa kode ini tidak lagi dibutuhkan oleh siapa pun di seluruh dunia, dikirim ke tempat sampah sejarah. Produk itu sendiri akan digunakan untuk waktu yang sangat lama, tetapi tidak ada yang akan mendukung basis kode. Semua ini adalah kualitas dan keterbacaan kode, skalabilitas, kemudahan penggunaan, perilaku yang tidak ambigu - semuanya dilakukan dengan sia-sia.

Saya mendengarkan dan memahami bahwa saya bisa membuat fitur dan berjalan melewati jeruji. Tapi saya duduk di malam hari, tidak tidur, mengalami skandal demi basis kode yang baik yang tidak diperlukan orang lain. Antusiasme adalah kebohongan. Anda mengatakan bahwa Anda siap bekerja, bahkan jika tidak ada untungnya. Tetapi ketika mereka memberi tahu Anda bahwa persenan Anda yang tertinggi benar-benar tidak membawa manfaat - untuk beberapa alasan itu membunuh. Anda berharap untuk berubah dengan dorongan hati Anda semua kesalahan universal.

Saya pikir saya mengerti semuanya dengan sempurna dari awal. Saya hanya tidak ingin menjadi pria pragmatis.

Karena itu, saya katakan bahwa mereka dapat memecat saya ke neraka, dan membiarkan ibu mereka diangkut ke Moskow yang menyengsarakan sehingga lemak mereka akan merobek non-karet menjadi satu miliar keping kecil. Dia dengan sopan menulis tentang ini, dan tinggal di rumah. Ada cukup banyak tasas di dunia yang hanya perlu dibuat.

Source: https://habr.com/ru/post/id471628/


All Articles