Haruskah kita mendorong gaya pengkodean yang mendukung otonomi pengembang, atau mencegahnya demi konsistensi?

15

Pengembang menulis if/elseblok dengan pernyataan kode satu baris seperti:

if (condition)
   // Do this one-line code
else
   // Do this one-line code

Lain menggunakan kurung kurawal untuk semuanya:

if (condition) 
{
   // Do this one-line code
}
else
{
   // Do this one-line code
}

Pengembang pertama instantiate objek, kemudian menggunakannya:

HelperClass helper = new HelperClass();
helper.DoSomething();

Pengembang lain membuat instantiate dan menggunakan objek dalam satu baris:

new HelperClass().DoSomething();

Pengembang lebih mudah dengan array, dan forloop:

string[] ordinals = new string[] {'First', 'Second', 'Third'};
for (i = 0; i < ordinals.Length; i++)
{
    // Do something
}

Yang lain menulis:

List<string> ordinals = new List<string>() {'First', 'Second', 'Third'};
foreach (string ordinal in ordinals)
{
    // Do something
}

Saya yakin Anda tahu apa yang saya bicarakan. Saya menyebutnya gaya pengkodean (karena saya tidak tahu apa namanya). Tapi apa pun namanya, apakah itu baik atau buruk? Apakah mendorong itu berdampak pada produktivitas pengembang yang lebih tinggi? Haruskah kita meminta pengembang untuk mencoba menulis kode seperti yang kita katakan kepada mereka, sehingga membuat keseluruhan sistem menjadi konsisten dengan gaya?

Saeed Neamati
sumber
1
Saya sebenarnya datang ke sini untuk mengajukan pertanyaan yang sangat mirip barusan - ketika alat pemformatan kode otomatis tersedia dan nyaman, apakah lebih penting bagi alat-alat itu untuk tidak dijalankan (dan menjaga gaya pribadi yang tidak konsisten) atau untuk memiliki gaya yang ditegakkan?
lembut
Gaya yang konsisten membuat kode membaca lebih mudah, oleh karena itu gunakan gaya yang konsisten. Dalam contoh Anda, yang paling mudah dibaca adalah 2, 1, 2. Meskipun huruf terakhir berbeda. Dalam aplikasi penting kinerja, loop for lebih cepat ketika mengulang daftar. Performanya identik dengan pengulangan array. Dan dalam semua kasus, gunakan varbukan nama jenis yang memenuhi syarat.
Stephen

Jawaban:

19

Dokumen standar pengkodean bermanfaat. Ini sangat berguna ketika itu cukup singkat sehingga siapa pun dapat mengingat semuanya tanpa terlalu banyak kesulitan dan ketika itu tidak menyebabkan orang terlalu sakit.

Bagaimana Anda memilih untuk indentasi kode di organisasi Anda, atau kapitalkan nama, atau laksanakan loop Anda, atau komentar kode Anda tidak terlalu penting; bagian yang membantu adalah membuat semua orang untuk menulis kode yang hampir sama dengan orang lain.

  • Ini menghindari harus menghabiskan satu menit mengkalibrasi ulang harapan Anda tentang di mana kawat gigi seharusnya dan setiap kali Anda melihat kode orang lain.
  • Itu menghindari beberapa gaya kode yang berbeda semua dalam file yang sama.
  • Mungkin yang paling penting, memiliki standar tertulis menghindari argumen tentang praktik pengkodean selama ulasan kode.

Sekali lagi, apa standarnya tidak masalah sebanyak memiliki standar sederhana dan langsung. Jadi, letakkan semua pengembang Anda di ruangan dan biarkan mereka berdebat tentang standar apa yang seharusnya. Pertemuan ini bisa berlangsung tanpa batas waktu, jadi aturannya adalah:

  • Apa pun yang tidak diputuskan pada akhir pertemuan akan diputuskan oleh manajer.
  • Pertemuan akan berakhir setelah dua jam, atau ketika seseorang mulai berteriak atau menangis, mana yang lebih dulu.
  • Seluruh standar akan pas (dalam ukuran tipe yang masuk akal!) Pada selembar atau dua kertas, hanya dua sisi jika benar-benar diperlukan.

Pertimbangkan mengadopsi seseorang | lagi | standar baik sebagai titik awal untuk pertemuan standar pengkodean Anda sendiri, atau sebagai cara untuk menghindari rapat sepenuhnya.

Setelah disepakati, pengembang harus dapat (dan diharapkan) mengawasi sendiri. Penyimpangan sesekali dari standar seharusnya tidak menjadi masalah besar (dan bahkan mungkin dapat dibenarkan), tetapi penolakan yang tegas untuk meninggalkan beberapa gaya pribadi favorit demi standar harus mengakibatkan relokasi langsung ke kantor dengan pipa air bocor, atau apa pun .

Demian Brecht menunjuk ke alat serat. Ini adalah pelengkap sempurna untuk dokumen standar pengkodean. Hanya baik untuk tetap berpegang pada standar gaya pengkodean ; sangat penting untuk tetap berpegang pada standar pengkodean yang terkait dengan praktik berbahaya. Tidak ada orang selain penulis yang akan memeriksa bahwa setiap baris kode memenuhi standar untuk gaya, tetapi Anda harus mempertimbangkan membangun alat serat ke dalam alur kerja tim Anda untuk secara otomatis menangkap kemungkinan bug. Selain itu, alat itu sendiri dapat mengodifikasi praktik yang diterima sehingga Anda tidak harus membuat daftar semuanya secara individu dalam standar pengkodean; cukup tentukan konfigurasi alat.

Catatan: Gagasan "standar pengkodean" tidak unik untuk pemrograman. "Standar pengkodean" digunakan di banyak bidang, kadang-kadang dalam suatu organisasi, lebih sering di seluruh industri atau profesi. Beberapa contoh:

Dalam setiap kasus (dan banyak lainnya) seorang praktisi yang kompeten dapat dengan mudah memahami "kode" yang tidak memenuhi standar yang diharapkan. Mengapa begitu banyak industri tetap menulis persyaratan terperinci untuk dokumen yang bahkan tidak perlu diuraikan oleh kompiler? Karena gaya itu penting . Menyajikan informasi dalam gaya standar memungkinkan pembaca fokus sepenuhnya pada konten, membuat membaca lebih cepat dan membantu pemahaman, dan mengurangi kesalahan.

Caleb
sumber
1
Jika Anda menambahkan penggunaan alat linting ke posting Anda, saya akan menghapus milik saya dan memberi +1 milik Anda :)
Demian Brecht
@ DemianBrecht, Saran bagus, terima kasih. Menambahkan alat serat untuk meningkatkan jawaban saya, tetapi saya pikir Anda harus meninggalkan jawaban Anda juga.
Caleb
Baiklah kalau begitu. +1 tetap :)
Demian Brecht
Dan juga untukmu!
Caleb
Memberi +1 untuk "... relokasi langsung ..." seperti dalam pengalaman saya perilaku seperti itu konsisten dengan kecenderungan sosiopat dan / atau narsis, tidak sesuai dengan tim pengembangan perangkat lunak.
mattnz
16

Gaya tidak masalah.

Di sana, saya mengatakannya.

Setelah 30 tahun, dan ratusan situs klien, dan kode dari (memperkirakan) 500 (atau lebih) anggota tim selama tahun-tahun itu, saya mendapati bahwa gaya tidak penting.

Mulai bekerja, pertama.

Dapatkan untuk menggunakan volume sumber daya yang optimal (yaitu, struktur data yang tepat, algoritma yang tepat).

Ribut-ribut soal "gaya" setelah semua yang lain telah dipecahkan. Repotnya "style" hanya dengan alat, tidak pernah secara manual.

S.Lott
sumber
2
Amin! Standar pengkodean perlu dibenarkan dalam hal manfaat nyata dan konsistensi bukan manfaat nyata, tetapi kemewahan.
JohnFx
12
Tetapi gaya jarang tentang gaya. Ini tentang menghindari kesalahan umum.
Martin York
6
Tapi itu membantu menghindari '=' bukannya '==' (jangan gunakan tugas di dalam kondisi). Ini membantu menghindari if (t) { x;y;}daripada if (t) x;y;(selalu menggunakan '{}' setelah jika). Lebih suka kode const benar (sangat sulit untuk menambahkan kebenaran const ke dalam kode setelah telah ditulis. Gunakan std :: cout / std :: cin bukan fprintf / scanf yang pertama lebih cenderung menyebabkan kesalahan. Gunakan vektor daripada array (untuk membantu mencegah meluap)
Martin York
5
Membuatnya berfungsi jelas sangat penting. Tetapi hanya karena itu bekerja tidak berarti itu dilakukan. Itu juga perlu diuji. Dan kemudian ditinjau. Itu semua mungkin memakan waktu beberapa hari. Kemudian, selama bertahun - tahun sesudahnya, itu harus dibaca dan dipahami serta dipelihara. Kode yang berguna (mengapa menulis jenis apa pun?) Akan dibaca lebih banyak daripada yang ditulisnya, sehingga membuatnya mudah dibaca dan dipahami meningkatkan produktivitas jauh di masa depan. Menggunakan gaya yang konsisten di seluruh organisasi adalah salah satu cara untuk membantu dalam hal itu.
Caleb
1
Bagaimana dengan menegakkan penggunaan alat pemformatan otomatis? Eclipse dan XCode membuatnya sangat mudah untuk menjaga kode diformat - tetapi salah satu insinyur saya bekerja dengan menjadi sangat marah jika seseorang autoformats kode "nya" (yaitu perusahaan) agar tetap konsisten dengan sisa basis kode. Memformat hanya sebagian kecil dari gaya tetapi juga penting, terutama untuk masalah seperti jika / jika bersarang dan alur kode keseluruhan (belum lagi keterbacaan).
lembut
4

Ada gaya pengkodean dan ada bau kode. Bukan sekali yang saya temukan:

    if(debugCondition)
//         printf("DEBUG: state:%s at debugCondition\n",dbg_state());

    for(i=0; i<MAX;i++)
    {
       //some essential business logic
    }

Majikan saya sebelumnya secara ketat melarang menggunakan multiline if()tanpa kawat gigi. Itu dianggap sebagai jenis kesalahan "lakukan lagi dan Anda dipecat". Konstruksi yang diizinkan adalah

     if(condition) break; 
     if(condition) continue; 
     if(condition) return; 
     if(condition) for()...; 

Ini dihasilkan dari kesalahan seperti yang saya tunjukkan di atas, yang memakan waktu beberapa jam untuk menemukan menghentikan halaman utama portal.

Ada hal-hal yang harus selalu Anda lakukan. Seperti switch():

     case 1:
         something();
     break;
     case 2:
         something();
     return;
     case 3:
         something();
     continue;
     case 4:
     case 5:
         something();
     break;
     case 6:
         something();
     //fallthrough;
     case 7:
     ...

Sementara itu, mengetik:

     case 1:
         something();
     case 2:
         something();
     break;

tanpa menutup casedengan //fallthroughdianggap sebagai bug.

Secara umum, ada standar pengkodean yang merupakan pedoman yang dapat diabaikan, ditafsirkan secara kreatif atau dimodifikasi untuk kebutuhan yang diberikan. Dan ada bagian tentang "bau" dan harus dipatuhi dengan ketat.

SF.
sumber
3

Ciptakan konsistensi dengan desain awal yang baik. Apa yang Anda uraikan dalam pertanyaan tidak lain adalah manajemen mikro. Saya melakukan banyak pengembangan web. Jadi saya mendukung pengembangan RESTful dan CRUD sebagai layanan. Ini memastikan entitas yang sederhana dan terdefinisi dengan baik yang dapat digunakan dalam berbagai cara.

Desain ini juga memungkinkan saya untuk mendelegasikan detail implementasi ke pengembang lain. Dengan cara ini mereka mengisi kekosongan daripada menciptakan desain sistem secara keseluruhan.

Kurangnya desain keseluruhan menciptakan inkonsistensi sistem. Kritik dari iterasi dasar dan konstruksi pengulangan tidak banyak memperbaiki desain sistem. Masalah seperti ini lebih baik diselesaikan dengan pendekatan langsung, StyleCop.

Bisakah Anda menggambar diagram yang relatif sederhana dari keseluruhan desain sistem Anda? Sebuah desain yang menggambarkan elemen / entitas yang terlibat dalam suatu tim pengembang baru. Jika Anda tidak bisa, atau sangat terlibat maka desainnya kurang.

P.Brian.Mackey
sumber
3

IMHO itu tergantung ...

Dua contoh pertama Anda bukan hanya masalah selera pribadi bagi saya.

if (condition)
   // Do this one-line code
else
   // Do this one-line code

(tanpa tanda kurung) = lebih banyak rawan bug, jika lebih banyak kode ditambahkan kemudian:

if (condition)
   // Do this one-line code
else
   // Do this one-line code
   // ...and this line as well... oops! this will actually execute either way

Dan ini kurang nyaman untuk di-debug:

new HelperClass().DoSomething(GetSomeData()); // etc.

Anda tidak bisa begitu saja menetapkan breakpoint di mana Anda membutuhkannya. Jika ini satu kali - cukup adil, tapi kami membahasnya sebagai masalah gaya, dan begitu Anda memiliki hal-hal seperti ini di semua tempat, debugging menjadi lebih tidak menyenangkan daripada yang seharusnya.

Adapun contoh ketiga Anda (untuk vs foreach), saya melihatnya sebagai masalah selera.

Konrad Morawski
sumber
2

Tidak juga. Saya akan menghindari aturan pengkodean yang keras untuk menghindari membosankan, nit-pilih-pilih, manajerial mikro dan terburuk dari semua membuang-buang waktu. Rasa otonomi Anda adalah masalah Anda sendiri. Jika saya ingin Anda merasa lebih baik tentang diri Anda, saya akan membelikan Anda minuman favorit Anda. Selain itu, selesaikan sesuatu.

JeffO
sumber
2

Penggunaan konvensi, nama variabel, nama kelas, dll. Adalah praktik yang baik. Tetapi gaya pengkodean seperti contoh yang Anda berikan agak sepele dan tidak berpengaruh pada keterbacaan atau efisiensi kode. Di sisi lain, overhead dari menegakkan gaya yang diberikan dikombinasikan dengan upaya pengembang untuk mengikutinya akan menyebabkan masalah.

AJC
sumber
2

Gunakan alat linting standar industri (tampaknya FxCop untuk C #). Meskipun ini bukanlah konsistensi akhir, semua-semua, adalah penting dalam proyek-proyek besar yang memiliki sejumlah orang yang mengerjakannya.

Jika Anda hanya mengerjakan proyek Anda sendiri atau tim kecil, banyak yang akan berpendapat bahwa itu berlebihan. Saya percaya sebaliknya (saya menggunakan PEP8 untuk Python, bahkan dalam proyek pengembang tunggal pribadi saya).

Akan tetapi, sebagian besar contoh yang Anda berikan kemungkinan besar tidak akan ditangkap oleh alat serabut karena tidak penting.

Demian Brecht
sumber
1

Menegakkan gaya pengkodean seragam selalu sulit. Idealnya tugas duniawi semacam itu harus diserahkan kepada alat untuk ditangani. Saya memuji komunitas bahasa Go untuk melakukan itu.

grokus
sumber
1

Ini campuran keduanya. Hanya karena standar tidak membuatnya dapat dibaca dan dipelihara. Jika belum ada standar yang ditanamkan, atau ada aspek yang salah dan tidak dapat dibaca, revisi sudah tepat.


sumber
1

Dalam analisis akhir, programmerlah yang mendorong pemrograman. Masalah gaya ada, tetapi mereka sekunder untuk mengeluarkan program.

Sangat membantu untuk memberikan beberapa panduan gaya kepada programmer. Ini bisa / harus dilakukan sebelum para programmer dipekerjakan, terutama jika mereka adalah pemula relatif terhadap lingkungan, atau untuk pemrograman itu sendiri. Diberi bimbingan, beberapa programmer akan sangat sadar gaya, yang lain kurang begitu. Bimbingan yang diberikan pada awal proyek akan membantu kelompok programmer pertama, sehingga membuat tugas keseluruhan lebih mudah. Ini mungkin sedikit bermanfaat bagi kelompok kedua, yang (semoga) akan menjadi kreatif, yang kurang sesuai.

Tom Au
sumber
1

Saya pikir itu turun ke ukuran proyek, dan berapa banyak orang yang mengerjakannya. Seorang programmer yang terampil dapat melihat kedua gaya format yang berbeda dan tahu apa yang terjadi pada keduanya tetapi perlu ada konsistensi sehingga mata dapat menangkapnya dengan mudah. Jika Anda akan melakukan satu baris ifstatments Anda dengan kurung kurawal maka proyek itu tidak boleh menggunakannya Siapa yang pernah memimpin proyek itu harus memiliki pilihan itu. Saya suka hal-hal yang terlihat jelas dan juga sangat kompak karena saya bisa mendapatkannya. Jika Anda akan membuat satu baris jika statmeents mereka lebih baik terlihat seperti ini

if() {}
else() {}

Atau bahkan:

if() {} else () {}

Tetapi satu baris jika tidak harus menggunakan spasi dari mulitiline jika. Itu hanya bagaimana saya melakukan sesuatu. Saya tidak keberatan dengan cara objek dipanggil dan itu tergantung pada berapa kali disebut. jika dipanggil beberapa kali maka saya lebih suka memulai objek dan tergantung apakah ia memiliki konstruktor dan apa yang tidak juga. Karena jika Anda memiliki konstruktor dan Anda memanggil:

Object.method();
Object.method2();

Kemudian Anda akhirnya memanggil metode objek konstruktor dua kali ketika itu bisa dihindari dengan menginstensikan objek sepenuhnya.

Ketika datang ke foreach dan untuk loop Ini juga tentang lanauge beberapa lanauges memberi Anda kontrol yang lebih baik ketika melihat array dalam loop foreach sehingga Anda memiliki kunci dan nilai dalam array temp. Dan saya tahu beberapa liga memiliki semacam optimasi karena mereka dapat melihat loop dan tahu persis berapa kali akan dipanggil.

WojonsTech
sumber
1

Meskipun contoh pertama Anda tidak terlalu bagus (argumen bahwa ini lebih rawan bug dalam modifikasi membawa beberapa bobot), secara umum saya sebenarnya sudah tumbuh untuk lebih suka bahwa pengembang menggunakan gaya pengkodean yang sedikit berbeda.

Setelah bekerja dengan kode anggota tim yang lain, kadang-kadang hanya untuk beberapa bulan, pada dasarnya mulai bekerja dengan garis sebaris git blame . Setelah berada di perusahaan saya selama 10+ tahun, saya mungkin dapat memberi tahu Anda dengan akurasi 80% + yang menulis kelas mana saja di baris kode 500k kami, hanya dengan melihatnya.

Walaupun ada sedikit "waktu ramp" ketika Anda mulai melihat kode yang menggunakan gaya yang tidak Anda setujui, apa yang sebenarnya Anda lakukan pada waktu itu adalah mengatakan "oh, ini terlihat seperti kode John Doe (karena dia menggunakan gaya X tetapi tidak gaya Y, dll) ". Dan itu membawa banyak sekali konteks. Untuk perkiraan pertama, Anda tahu apa yang diharapkan dari kode John - apa bagian lain dari basis kode yang ia pahami dengan baik dan bagian mana yang tidak ia pahami, apakah ia seorang guru SQL atau pemula GUI, dll.

Menjalankan kode semua orang melalui pemformat pada dasarnya menghapus informasi ini, menyembunyikannya di belakang git blame, yang mungkin tidak perlu Anda jalankan.

Matt McHenry
sumber
0

Ini sangat tergantung pada jenis organisasi.

Jika Anda adalah sekelompok kecil pahlawan super, maka jenis gaya apa pun tidak masalah. Jika setiap orang memiliki gaya mereka sendiri, dan itu baik dan konsisten secara internal, maka itu semua proses yang Anda butuhkan. Pahlawan Super akan mengatakan, "Jane memiliki tanda kurung, jadi ini yang ia maksudkan" atau "Jack menggunakan camelCase untuk variabel".

Standar universal cenderung menjadi yang terbaik untuk membuat semua orang menjadi pemain B +. Pahlawan super Anda akan ditarik ke bawah oleh ini. Tetapi jika Anda ingin satu pemain A dan setengah lusin pemain B dan setengah lusin pemain C rata-rata hingga B +, maka Anda menginginkan standar yang konsisten. Dalam hal ini, Anda ingin semua orang melakukan hal yang sama sehingga pemain A dapat berjalan melalui kode semua orang secepat mungkin.

Banyak dari Anda berkata, "Tapi tunggu, mengapa tidak menyingkirkan pemain B dan C?"

Kenyataannya adalah tidak ada banyak Superhero. Meskipun mungkin membayar untuk menemukan dan memelihara mereka di Google, menempatkan sistem penagihan baru untuk Ma Bell mungkin lebih hemat biaya dengan tim yang terakhir. (Dan jika Anda benar-benar memiliki Superheroes, 4 atau 5 dari mereka akan dua kali lebih mahal dari selusin junior)

MathAttack
sumber