Kapan kita harus berhenti bekerja dan membuat alat?

25

Sebagai seorang insinyur perangkat lunak, kami selalu ingin mendapatkan alat yang efektif untuk meningkatkan produktivitas kami. Dan dalam pekerjaan kita sehari-hari, kita sering tidak puas dengan alat yang ada dan ingin memiliki cara yang lebih baik seperti konfigurasi skrip GDB yang lebih baik, skrip Vim dan beberapa skrip Python untuk membuat hal-hal membosankan menjadi otomatis.

Namun, ini sebenarnya merupakan pertukaran karena pembuatan alat juga membutuhkan waktu dan energi. Itu tidak segera meningkatkan produktivitas. Karena itu, bagaimana Anda menilai apakah sekarang saatnya untuk berhenti bekerja dan membuat beberapa alat untuk meringankan rasa sakit Anda di masa depan?

xiao
sumber
30
ObXKCD - Is It Worth the Time
1
mungkin refactor ke arah alat dan terus bekerja
Ray Tayek
1
XKCD itu cukup berhasil kecuali untuk satu hal: apakah waktu yang dihemat oleh alat itu hanya milik Anda, atau apakah itu dikalikan dengan basis pengguna yang besar di seluruh organisasi Anda atau di luar.
Kaz

Jawaban:

27

Saya "membuat alat" ketika salah satunya benar:

  1. Tugas itu mengganggu saya
  2. Risiko kesalahan manusia dalam tugas terlalu besar

"Risiko" untuk opsi ke-2 tidak harus besar - biaya membangun satu alat kecil biasanya kecil, jadi jika yang Anda hemat adalah risiko menjalankan pembangunan 10 menit sekali lagi seminggu sekali, biasanya membayar sendiri dengan sangat cepat.

Saya mencoba membuat alat sekecil mungkin - hanya membuat tugas sedikit lebih mudah sekarang, dan mungkin meningkatkan lagi lain kali.

Ini berarti Anda hanya memperbaiki rasa sakit terbesar setiap kali, dan tidak membuat perbaikan untuk masalah yang tidak benar-benar menyakiti Anda.

aviv
sumber
2
+1 untuk menghindari kesalahan karena ini lebih dari waktu yang dihabiskan dibandingkan dengan waktu yang dihemat saat menjalankan.
k3b
1
Saya akan menambahkan "ketika Anda mendapati diri Anda mengulangi tugas yang sama sangat sering". Saya, cukup mengejutkan, mendapati diri saya perlu cukup sering membuat serangkaian karakter acak. Jadi alih-alih menulis blip kode untuk melakukannya, saya membuat formulir sederhana dengan tombol untuk melakukannya untuk saya
bsara
9

Dengan pengalaman saya telah menemukan bahwa hanya mendorong keras pada pekerjaan kasar biasanya yang paling efisien waktu. Membuat alat sering menggoda. Saya menyerah saat:

  • Alat ini memiliki lebih dari satu tujuan. Seorang pemain catur yang baik menyelesaikan dua hal dengan setiap gerakan: memblokir bagian lawan dan membebaskan seorang uskup. Seorang pemula mungkin perlu dua putaran untuk melakukan itu. Demikian juga, saya mempertimbangkan jika alat hanya akan melakukan satu hal, atau dengan sedikit usaha ekstra melakukan dua, misalnya membantu memperbaiki beberapa file data mentah, dan juga membuat data uji buatan.
  • Kegunaan masa depan. Mungkin menghemat waktu untuk pekerjaan minggu ini, tetapi apakah mungkin menghemat waktu saya atau seseorang untuk proyek baru minggu depan?
  • Ini adalah saat yang tepat untuk belajar bahasa baru, perpustakaan, teknik desain atau apa pun, dan saya punya waktu untuk melakukannya. Alat ini adalah efek samping yang menguntungkan dari melakukan sesuatu pendidikan, menggunakan waktu yang sudah diberikan untuk pendidikan.
  • Ketika kita mengalami masalah serius dalam menyelesaikan sesuatu. Seperti terjun payung tanpa parasut, Anda benar-benar harus meluangkan waktu untuk membuat atau membeli parasut. Jika Anda tidak bisa mendapatkan hasil eksperimen yang berarti, atau aplikasi web yang baru tidak akan berfungsi sama sekali, Anda hanya perlu berhenti dan membuat atau membeli alat untuk mengukur apa yang tidak dapat Anda lihat, mendorong komponen, atau mengganti bagian dari sistem. Ketika pekerjaan benar-benar terputus karena membutuhkan alat, saya tidak peduli tentang penggunaan di masa depan atau beberapa penggunaan. Kebutuhan cukup berat.
DarW
sumber
3
"Alat ini memiliki lebih dari satu tujuan" Kecuali mereka sebenarnya tujuan yang sama diterapkan dalam dua cara berbeda, menurut pengalaman saya lebih baik hanya membuat dua alat.
AJMansfield
5

Aturan praktis saya adalah bahwa ketika saya harus melakukan sesuatu untuk ketiga kalinya, saatnya untuk menulis naskah kecil untuk mengotomatiskannya, atau memikirkan kembali pendekatan saya.

Saya tidak membuat "alat" penuh pada saat ini, hanya sedikit skrip (biasanya bash atau python; perl akan bekerja juga, atau bahkan PHP) yang mengotomatiskan apa yang saya lakukan secara manual sebelumnya. Ini pada dasarnya merupakan penerapan prinsip KERING (atau prinsip Sumber Tunggal Kebenaran, yang pada dasarnya adalah hal yang sama) - jika Anda harus mengubah dua file sumber secara bersamaan, harus ada beberapa kebenaran umum yang mereka bagikan, dan bahwa kebenaran harus diperhitungkan dan disimpan di satu tempat utama. Sangat bagus jika Anda dapat menyelesaikan ini secara internal dengan refactoring, tetapi kadang-kadang, ini tidak layak, dan di situlah skrip kustom masuk.

Kemudian nanti, skrip mungkin berkembang atau tidak menjadi alat yang lengkap, tetapi saya biasanya memulai dengan skrip yang sangat spesifik dengan banyak hal yang dikodekan ke dalamnya.

Saya benci pekerjaan kasar dengan hasrat, tetapi saya juga sangat percaya bahwa itu adalah tanda desain yang buruk atau salah. Menjadi malas adalah kualitas penting dalam seorang programmer, dan lebih baik menjadi jenis di mana Anda berusaha keras untuk menghindari pekerjaan yang berulang.

Tentu, kadang-kadang saldo negatif - Anda menghabiskan tiga jam refactoring kode Anda atau menulis skrip untuk menghemat satu jam pekerjaan berulang; tetapi biasanya, keseimbangannya positif, apalagi jika Anda mempertimbangkan biaya yang tidak langsung terlihat: kegagalan manusia (manusia benar-benar buruk dalam pekerjaan yang berulang), basis kode yang lebih kecil, pemeliharaan yang lebih baik karena pengurangan yang berlebihan, dokumentasi mandiri yang lebih baik, masa depan yang lebih cepat pengembangan, kode bersih. Jadi, bahkan jika saldo tampak negatif sekarang, basis kode akan tumbuh lebih lanjut, dan alat yang Anda tulis untuk menghasilkan formulir web untuk tiga objek data akan tetap berfungsi saat Anda memiliki tiga puluh objek data. Dalam pengalaman saya, keseimbangan biasanya diestimasi mendukung pekerjaan kasar, mungkin karena tugas berulang lebih mudah untuk diperkirakan dan dengan demikian di bawah perkiraan, sementara refactoring, automating dan abstrak dianggap kurang dapat diprediksi dan lebih berbahaya, dan dengan demikian di atas perkiraan. Biasanya ternyata otomatisasi tidak terlalu sulit.

Dan kemudian ada risiko melakukannya terlambat: mudah untuk memperbaiki tiga kelas objek data baru menjadi bentuk dan menulis skrip yang menghasilkan formulir web untuk mereka, dan setelah Anda melakukannya, mudah untuk menambahkan 27 kelas lagi yang juga bekerja dengan skrip Anda. Tetapi hampir tidak mungkin untuk menulis skrip itu ketika Anda telah mencapai titik di mana ada 30 kelas objek data, masing-masing dengan formulir web tulisan tangan, dan tanpa konsistensi di antara mereka (alias "pertumbuhan organik"). Mempertahankan 30 kelas dengan bentuk mereka adalah mimpi buruk pengodean berulang dan pencarian semi-manual, mengganti aspek umum membutuhkan waktu tiga puluh kali lebih lama dari yang seharusnya, tetapi menulis skrip untuk menyelesaikan masalah, yang akan menjadi istirahat makan siang ketika proyek dimulai sekarang adalah proyek dua minggu yang menakutkan dengan prospek yang menakutkan setelah sebulan yang terdiri dari memperbaiki bug, mendidik pengguna, dan bahkan mungkin menyerah dan kembali ke basis kode lama. Ironisnya, menulis kekacauan 30-kelas membutuhkan waktu lebih lama daripada solusi bersih, karena Anda bisa menggunakan skrip yang nyaman sepanjang waktu itu. Dalam pengalaman saya, mengotomatiskan pekerjaan berulang sangat terlambat adalah salah satu masalah utama dalam proyek perangkat lunak besar yang sudah berjalan lama. karena Anda bisa saja mengendarai skrip yang nyaman sepanjang waktu itu. Dalam pengalaman saya, mengotomatiskan pekerjaan berulang sangat terlambat adalah salah satu masalah utama dalam proyek perangkat lunak besar yang sudah berjalan lama. karena Anda bisa saja mengendarai skrip yang nyaman sepanjang waktu itu. Dalam pengalaman saya, mengotomatiskan pekerjaan berulang sangat terlambat adalah salah satu masalah utama dalam proyek perangkat lunak besar yang sudah berjalan lama.

tammmer
sumber
4

Saya baru ingat ini:

xkcd - Is It Worth the Time?

Masalah dengan ini tentu saja adalah bahwa dalam situasi kehidupan nyata Anda tidak dapat dengan mudah mengukur data tersebut untuk memilih sel yang tepat dalam tabel. Dan seperti yang disebutkan dalam jawaban lain, ada variabel lain (risiko kesalahan, tugas terlalu membosankan untuk melakukannya bahkan sekali, ...) Anda perlu menambahkan persamaan.

Jadi jawaban saya adalah itu benar-benar tergantung pada situasi dan Anda tidak dapat berharap untuk mendapatkan jawaban yang "benar" untuk semua situasi. Bagaimanapun, hidup akan membosankan jika kita memiliki buku masak untuk semuanya.

Honza Brabec
sumber
1
Yang bagus! :-) Tetapi waktu yang dihemat mungkin juga untuk tugas-tugas lain - baik karena alat dapat digunakan untuk lebih dari satu tujuan, atau karena pengetahuan yang Anda dapatkan saat menulis alat.
Hans-Peter Störr
3

Ini adalah masalah besar dalam pengalaman saya. Pembuatan alat biasanya diserahkan kepada pengembang termotivasi yang berhenti bekerja untuk membangun alat. Ini sering mengganggu perkembangan bahkan jika itu memberikan nilai. Pembuatan alat perlu dilihat sebagai bagian terpadu dari "Proses" pengembangan.

Saya ingat menghadiri ulasan kode di mana kesalahan header akan mengakibatkan penjadwalan review lain. Banyak dari ini bisa dideteksi oleh alat. mis. jumlah sloc salah, persyaratan hilang, kesalahan format. Alat saya yang ditulis dalam perl menghasilkan header dari kode yang dikirimkan dan persyaratan yang divalidasi dari database Oracle. Itu bukan bagian dari "Proses" kami sehingga dalam jangka pendek alat ini dianggap menunda pengiriman.

Seluruh tim perlu berhenti secara berkala dan melihat di mana ada upaya manual yang dapat diotomatisasi dengan pembuatan alat.

donleslie
sumber
2

Semua jawaban lain baik, tetapi saya akan menambahkan satu alasan lagi mengapa berharga menghabiskan waktu untuk membangun alat kecil (dan menyesuaikan .vimrc, .emacs dll.):

Kadang-kadang Anda secara kreatif atau motivasi "terjebak dalam kebiasaan" dan melakukan sesuatu, apa saja, akan "membuat jus mengalir" lagi (untuk mencampur metafora). Idealnya itu adalah sesuatu yang secara produktif mendorong proyek ke depan, tetapi jika itu agak singgung dan itu menginspirasi Anda, maka itu bagus juga.

Anda mungkin tidak menatap layar kosong, tetapi justru mengalami kesulitan melihat kemajuan yang Anda buat pada tugas besar. Dalam situasi itu, menandai sesuatu yang nyata dapat menghentikan Anda merasa seperti Anda tidak pergi ke mana pun.

Variasi dalam hal ini adalah ketika Anda terus memikirkan sesuatu yang seharusnya ada di "back burner" - hanya mengambil waktu sebentar dan melakukannya akan membuat Anda lupa dan membebaskan Anda untuk memasukkan energi penuh Anda ke tugas utama lagi.

Tom
sumber
1

Itu tergantung pada apa yang Anda anggap sebagai alat. Bisa dibilang saya membuat banyak dari mereka dengan cara yang dianggap devs lain remeh ... Karena saya membuat mereka untuk hampir semua hal kecuali perintah sistem file yang paling dasar.

Saya menggunakan 2 alasan untuk mendukungnya.

  • Ini merupakan perpanjangan dari prinsip KERING. Jika kita ingin mengulangi sesuatu, upaya manual adalah penggunaan sumber daya manusia yang paling tidak efektif.
  • Ini cara yang efektif untuk mencatat apa yang saya lakukan, jadi jika saya membangun sesuatu maka saya (atau orang lain) mungkin ingin merujuk kembali ke bagaimana saya melakukannya minggu atau bulan kemudian dan itu membuat catatan pekerjaan dengan proyek.

Kadang-kadang mereka tumbuh menjadi alat yang lebih besar dan mendapatkan fungsi interaktif, tetapi jika tidak, mereka masih memiliki nilai sebagai catatan.

James Snell
sumber