cara terbaik untuk "memperkenalkan" OOP / OOD ke tim insinyur C ++ yang berpengalaman

17

Saya mencari cara yang efisien, yang juga tidak datang sebagai penghinaan, untuk memperkenalkan konsep OOP kepada anggota tim yang ada? Rekan satu tim saya bukan orang baru dalam bahasa OO. Kami telah melakukan C ++ / C # untuk waktu yang lama sehingga teknologi itu sendiri sudah tidak asing lagi.

Namun, saya melihat-lihat dan tanpa upaya besar-besaran (kebanyakan dalam bentuk ulasan kode), sepertinya yang kami produksi adalah kode C yang kebetulan berada di dalam kelas. Hampir tidak ada penggunaan prinsip tanggung jawab tunggal, abstraksi atau upaya untuk meminimalkan sambungan, hanya untuk beberapa nama. Saya telah melihat kelas yang tidak memiliki konstruktor tetapi mendapatkan memset ke 0 setiap kali mereka dipakai.

Tetapi setiap kali saya membuka OOP, semua orang selalu mengangguk dan membuatnya tampak seperti mereka tahu persis apa yang saya bicarakan. Mengetahui konsep itu baik, tetapi kami (beberapa lebih dari yang lain) tampaknya memiliki waktu yang sangat sulit menerapkannya dalam hal memberikan pekerjaan yang sebenarnya.

Ulasan kode telah sangat membantu tetapi masalah dengan ulasan kode adalah bahwa mereka hanya terjadi setelah fakta sehingga untuk beberapa tampaknya kita akhirnya menulis ulang (kebanyakan refactoring, tetapi masih membutuhkan banyak waktu) kode yang baru saja ditulis. Juga ulasan kode hanya memberikan umpan balik ke insinyur individu, bukan seluruh tim.

Saya bermain-main dengan ide melakukan presentasi (atau seri) dan mencoba untuk memunculkan OOP lagi bersama dengan beberapa contoh kode yang ada yang bisa ditulis lebih baik dan dapat di refactored. Saya bisa menggunakan beberapa proyek yang benar-benar tua yang tidak ada yang memiliki lagi jadi setidaknya bagian itu tidak boleh menjadi masalah sensitif. Namun, apakah ini akan berhasil? Seperti yang saya katakan kebanyakan orang telah melakukan C ++ untuk waktu yang lama jadi dugaan saya adalah a) mereka akan duduk di sana berpikir mengapa saya memberi tahu mereka hal-hal yang sudah mereka ketahui atau b) mereka mungkin menganggapnya sebagai penghinaan karena saya mengatakan kepada mereka bahwa mereka tidak tahu bagaimana melakukan pekerjaan yang telah mereka lakukan selama bertahun-tahun jika tidak beberapa dekade.

Apakah ada pendekatan lain yang akan menjangkau khalayak yang lebih luas daripada tinjauan kode, tetapi pada saat yang sama tidak akan terasa seperti kuliah hukuman?

Saya bukan anak baru keluar dari perguruan tinggi yang memiliki cita-cita utopis kode yang dirancang dengan sempurna dan saya tidak mengharapkan itu dari siapa pun. Alasan saya menulis ini adalah karena saya baru saja mengulas seseorang yang sebenarnya memiliki desain tingkat tinggi yang layak di atas kertas. Namun, jika Anda menggambarkan kelas: A -> B -> C -> D, dalam kode B, C dan D semuanya mengimplementasikan antarmuka publik yang hampir sama dan B / C memiliki fungsi satu liner sehingga kelas A paling top melakukan hal yang mutlak semua pekerjaan (hingga manajemen memori, penguraian string, pengaturan negosiasi ...) terutama dalam 4 metode mongo dan, untuk semua maksud dan tujuan, panggilan hampir secara langsung ke D.

Pembaruan: Saya seorang pemimpin teknologi (6 bulan dalam peran ini) dan memiliki dukungan penuh dari manajer grup. Kami sedang mengerjakan produk yang sangat matang dan biaya perawatan pasti membuat mereka diketahui.

DXM
sumber
Kemungkinan rangkap - programmers.stackexchange.com/questions/67579
ChrisF
3
Apakah Anda penyelia atau bos mereka? Jika tidak, apakah Anda mendapat dukungan dari direktur teknis yang merupakan bos bagi Anda semua? Jika Anda hanya salah satu dari orang-orang dan pengembangan telah stabil dan produktif selama bertahun-tahun tanpa menggunakan desain OOP yang mendalam maka Anda berada dalam perjuangan berat untuk meyakinkan programmer bahwa kode kerja tidak bekerja dan manajemen yang tidak Anda buang-buang uang lebih baik dihabiskan menghasilkan kode.
Patrick Hughes
Setelah saya membuat posting ini, tautan terkait muncul yang terdengar sangat mirip dengan situasi saya: programmers.stackexchange.com/questions/43214/… . Saya khawatir tentang hal yang persis sama. Masalahnya adalah bahwa tim mereka memiliki 2 pengembang dan saya pasti bisa mengelolanya dengan ulasan kode. Saya mencari pendekatan yang sesuai dengan ukuran tim kami (10+). Saya hanya tidak bisa berkomunikasi dengan setiap pengembang satu per satu sebanyak yang saya inginkan.
DXM

Jawaban:

5

Mengapa Anda tidak mengembangkan pelatihan singkat dalam prinsip-prinsip SOLID dan memberi mereka pelatihan ini? Tampaknya telah bekerja cukup baik bagi saya di organisasi saya saat ini dan saya merasa memberikan pelatihan singkat sebenarnya menyenangkan (untuk semua orang yang terlibat).

Ketika saya memberikan pelatihan saya, saya mengambil waktu untuk mencari contoh "buruk" patologis dalam kode yang ada (dari berbagai proyek), dan refactored mereka dalam presentasi, langkah demi langkah, menggunakan prinsip-prinsip. Ini menunjukkan hal itu

  1. Tidak sulit melakukan refactoring ini
  2. Tidak butuh waktu lama
  3. Hasil akhirnya (dipilih dengan cermat ;-)) jelas lebih baik daripada kode aslinya.
Joris Timmermans
sumber
5

Ulasan kode sangat membantu tetapi masalah dengan ulasan kode adalah bahwa mereka hanya terjadi setelah fakta.

Pada satu proyek, kami melakukan tinjauan desain.

15 menit. Di papan tulis. Bicara melalui desain sebelum pengkodean.

Bagian yang paling penting adalah menjadwalkan tinjauan desain sebelum pekerjaan implementasi.

Kami juga memiliki "Ulasan Desain Kritis" yang merupakan kesepakatan besar, berkeringat. Mereka melibatkan banyak dokumen dan presentasi yang panjang. Mereka sulit untuk menjadwalkan dan hampir selalu terdorong keluar sampai setelah pengkodean dimulai, mengurangi nilainya menjadi nol.

Tinjauan desain informal - sebelum pengkodean - tanpa tekanan - tanpa dokumentasi - memungkinkan diskusi yang lebih baik tentang bagaimana tanggung jawab diberikan dan bagaimana benda akan berkolaborasi.

S.Lott
sumber
ya, kami sudah melakukan tinjauan desain persis seperti yang Anda gambarkan. Masalahnya adalah tugas menengah. Jika tugasnya cukup besar, saya biasanya meluangkan waktu untuk membuat diagram kelas awal yang kemudian disempurnakan oleh tim. Jika tugasnya kecil, maka desain tingkat tinggi yang ada sudah cukup baik. Namun, untuk tugas-tugas berukuran sedang, saya tidak memiliki kapasitas untuk memikirkan desain sehingga aturan dasarnya adalah "gunakan penilaian terbaik dan ikuti OOP". Jika saya melakukan tugas-tugas ini sendiri, saya akan mulai dengan coding dan mencampurkannya dengan refactoring terus menerus dan ...
DXM
... biarkan kodenya memutuskan seperti apa desain akhir nantinya. Namun, ketika saya menyerahkan tugas-tugas ini kepada beberapa anggota tim, apa yang kadang-kadang saya temukan dalam ulasan kode adalah hal-hal seperti yang saya jelaskan di posting awal saya.
DXM
1
@DXM: Apa? Anda melakukannya? Atau tidak melakukannya? Jika besar, maka Anda tidak melakukan tinjauan desain - Anda melakukan desain untuk orang lain - siapa yang belajar ketika Anda mendesain? Jika kecil, maka Anda tidak melakukan tinjauan desain - "desain yang ada cukup baik" - siapa yang condong ketika Anda mengabaikan desain? Jika sedang, Anda tidak melakukan desain, dan Anda juga tidak meninjau desainnya? Itu tidak terdengar seperti Anda benar-benar melakukan tinjauan desain yang sebenarnya. Mengapa Anda mengatakan Anda berada dan kemudian memberikan tiga contoh di mana Anda tidak berada?
S.Lott
@ Lott: setelah merefleksikan respons Anda, satu-satunya kesimpulan saya adalah Anda benar. Saya kira apa yang seharusnya saya katakan adalah bahwa saya telah mengemukakan ide yang tepat ini setidaknya 8 kali dan semua orang selalu setuju, tapi ya, jika saya melihat kembali irama yang kita selesaikan, kita tidak benar-benar melakukan semua itu. Saya ingin membahas ini lebih lanjut, tetapi saya sudah mendapatkan disiplin oleh para mod karena berdiskusi di situs yang benar-benar tanya jawab. Bisakah kita pindah ke obrolan? Saya ingin menjelaskan situasinya lebih dan mungkin memilih otak Anda (atau siapa pun yang ingin bergabung) sedikit. Belum pernah melakukan obrolan, Anda tahu cara kerjanya?
DXM
@DXM: Obrolan sepele. Dan tidak terlalu membantu. Jika Anda memiliki pertanyaan lebih lanjut - lebih rinci dari pertanyaan awal ini - Anda harus mengajukan pertanyaan yang lebih rinci. Itulah intinya. Dalam beberapa kasus "diskusi lebih lanjut" sama dengan "Saya tidak suka jawaban Anda atas pertanyaan saya karena alasan berikut ..." yang agak konyol. Tidak menyukai jawaban sama sekali tidak menyukai jawaban dan tidak memerlukan diskusi apa pun. Dalam beberapa kasus, diskusi berjumlah "pertanyaan saya tidak kabur, Anda tidak bisa membaca." Tidak membantu, sungguh. Ajukan pertanyaan Anda. Sebagai pertanyaan.
S.Lott
4

Saya berasumsi Anda lebih muda dari beberapa pengembang, tetapi lebih tinggi dalam rantai makanan.

Dengan risiko terkurung dalam downvotes, bisa jadi 'insinyur berpengalaman' sebenarnya melakukan hal yang benar - atau karena ini adalah produk matang yang mungkin telah ada selama beberapa dekade, apa yang pernah menjadi hal yang benar.

Kode lama cenderung telah dioptimalkan untuk berjalan dengan cepat pada perangkat keras saat itu; antara lain hal ini berarti mengurangi tingkat warisan dan menghindari panggilan fungsi / metode untuk operasi sepele.

Kompiler telah menjadi jauh lebih pintar selama bertahun-tahun, jadi tidak semua yang dulu benar sekarang adalah - misalnya, kompiler dapat memilih untuk menjalankan fungsi kecil.

Mungkin rute ke depan adalah mengadopsi pendekatan yang berbeda - minta pengembang untuk menjelaskan bagaimana / mengapa metode mereka lebih baik daripada teori yang Anda ajarkan - dan jujurlah tentang hal itu.

Phil Lello
sumber
0

Akan mendorong untuk unit test dengan cakupan cabang 100% dari setiap metode baru / yang diubah tidak mengarah untuk meminimalkan kopling antar metode.

Ian
sumber
UT adalah ide yang bagus, tapi saya tidak yakin ini akan mencapai hasil yang diinginkan. Selain itu, salah satu prinsip dasar OO adalah bahwa kopling antar fungsi tidak dapat dihindari, jadi Anda lebih baik membuatnya secara eksplisit dan kelompokkan fungsi kopling tersebut dalam satu kelas.
MSalters
Saya setuju bahwa "menggabungkan setiap fungsi tidak dapat dihindari". Namun desain yang baik mengurangi jumlah fungsi lain yang masing-masing fungsi digabungkan juga. (Kelas hanyalah sarana untuk tujuan ini)
Ian
0

Anda mungkin ingin mengambil buku "Pola Desain" dari Gang of Four. Ini tidak spesifik untuk C ++, jadi Anda tidak secara terbuka mengkritik pengetahuan C ++ rekan Anda saat Anda merujuknya. Namun pada saat yang sama itu membahas topik yang Anda anggap relevan. Selain itu, buku ini diterima secara luas sebagai relevan, sehingga mereka tidak dapat dengan mudah menganggapnya sebagai teori atau tidak praktis.

Di sisi lain, pertimbangkan bahwa C ++ bukan bahasa OO murni, baik dalam desain maupun dalam praktik. Keseluruhan cerita konstruktor / memset kedengarannya Anda harus memperkenalkan RAII, yang sama sekali bukan teknik OO tetapi khusus untuk C ++ (sayangnya - .Net IDispose menunjukkan apa yang terjadi ketika RAII adalah renungan). Buku-buku yang relevan di sini adalah (Lebih Banyak) Efektif C ++ dan (Lebih Banyak) Luar Biasa C ++.

MSalters
sumber
2
Tetapi penulis dengan jelas menyatakan bahwa pola desain bukanlah pengantar untuk OOP / OOD secara umum! Penonton harus terbiasa dengan teknik-teknik yang ditawarkan OOP sebelum masuk ke katalog pola desain hardcode! "Pola Desain Kepala Pertama" akan menjadi pengantar yang bagus.
Falcon
2
Tampaknya dari deskripsi OP bahwa mereka tahu OOP / OOD, mereka hanya tidak menggunakannya (mungkin karena takut itu akan terlalu rumit), dalam hal ini sebuah buku yang menjelaskan mengapa itu berguna dapat memotivasi lebih baik daripada contoh kode.
wildpeaks
@wildpeaks: OP mengatakan sebaliknya. Mereka tidak tahu OOP / OOD. Mereka memprogram OOP secara prosedural. Mereka membutuhkan sesuatu untuk memperkenalkan mereka pada teknik desain dan buku GoF tidak sesuai dengan skenario ini.
Falcon
Saya mengacu pada kalimat But every time I bring up OOP, everyone always nods and makes it seem like they know exactly what I'm talking aboutdan My teammates are not new to OO languages, tapi saya bisa melihat bagaimana itu memang agak kabur karena mereka mungkin berbohong tentang mengetahui OOP ketika OP berbicara kepada mereka tentang hal itu.
wildpeaks
1
@MSalters - Pendahuluan Pola Desain: "Buku ini bukan pengantar teknologi atau desain berorientasi objek. Banyak buku sudah melakukan pekerjaan itu dengan baik. Buku-buku ini mengasumsikan Anda cukup mahir dalam setidaknya satu bahasa pemrograman berorientasi objek dan Anda harus memiliki pengalaman dalam desain berorientasi objek juga. " Buku ini tidak sesuai dengan persyaratan. Mereka harus membaca beberapa hal entry level OOD.
Falcon