Apakah efektif untuk meninjau kode dalam bahasa yang saya tidak tahu?

108

Saya seorang pengembang yang berpengalaman, tetapi belum melakukan banyak tinjauan kode. Saya diminta untuk meninjau kode yang ditulis dengan Python tetapi saya tidak tahu Python.

Apakah masuk akal untuk meninjau kode dalam bahasa yang saya tidak tahu?

Heather Smith
sumber
62
Intinya, pertimbangkan untuk mengunjungi CodeReview.SE dan melirik tag python. Melihat hanya pada pertanyaan, pertimbangkan saran apa yang akan Anda berikan pada kode dan kemudian lihat apakah itu terwakili dalam jawaban.
14
Kedengarannya seperti cara yang bagus untuk mempelajari lebih lanjut tentang Python. Pertanyaan apa pun yang terlihat lucu - beberapa di antaranya adalah Anda tidak memahami bahasa, dan beberapa akan menjadi item ulasan kode yang sah.
Dan Pichelman
9
@RobbieDee Tentu Saja! Menjelaskan kode Anda kepada seseorang seringkali bermanfaat bahkan jika itu hanya boneka beruang .
Kilian Foth
34
Anda mengatakan Anda diminta melakukannya. Orang yang meminta Anda berpikir bahwa Anda melakukan tugas ini akan menambah nilai bagi organisasi Anda. Jika Anda ingin tahu apa sifat dari nilai itu tanyakan pada orang itu , bukan orang asing di internet! Kami tidak tahu apa yang terjadi di dalam kepala orang itu. Mungkin kodenya berkualitas rendah sehingga bahkan pemula dapat menemukan masalah. Mungkin kodenya berkualitas tinggi sehingga Anda akan belajar kebiasaan baik darinya. Siapa yang bisa bilang? Seseorang berpikir itu berharga; tanyakan pada orang itu berapa nilainya.
Eric Lippert

Jawaban:

120

Ada akal? Iya. Bahkan jika Anda tidak tahu apa pun tentang semantik bahasa pemrograman, Anda masih dapat membaca karakter dan melihat pemformatan yang tidak konsisten, komentar yang hilang, pengidentifikasi yang dipilih dengan buruk, duplikasi yang jelas, dll.

Banyak akal, atau cukup masuk akal untuk membayar biaya waktu Anda ? Saya tidak yakin. Ini tergantung pada posisi Anda, pentingnya ulasan kode dalam alur kerja tim Anda, dan beberapa faktor lain yang tidak dapat kami kuantifikasi dengan cukup baik.

Kilian Foth
sumber
50
Melakukan beberapa tinjauan kode adalah cara yang bagus untuk mengenal modul, kerangka kerja atau bahkan bahasa, jadi mungkin ada baiknya waktu Anda (dan mungkin Anda sedang mengisyaratkannya ...). Saya tidak akan menandatangani ulasan seperti itu, tidak tanpa meminta seseorang yang akrab dengan bahasa dan kode untuk melihatnya.
Ordous
8
Juga jika Anda memiliki pengetahuan domain yang baik dan kode tersebut dinamai / dikomentari dengan baik, Anda masih dapat melihat fungsi yang salah / salah paham / hilang pada tingkat tinggi (meskipun Anda mungkin tidak menemukan kesalahan karena masalah sintaksis)
Dan
4
Sebagai orang luar, Anda bahkan mungkin lebih cenderung menemukan kesalahan fencepost, atau kesalahan dalam menerapkan jumlah tanda yang sama dengan benar, dan hal-hal semacam itu.
KlaymenDK
2
@KlaymenDK Penugasan dalam konteks boolean adalah (setidaknya biasanya) kesalahan sintaksis dalam Python. Kesalahan Fencepost lebih kecil kemungkinannya karena Python yang ditulis dengan baik hampir tidak pernah membuat Anda bekerja secara langsung dengan indeks array / daftar. (Bahkan ketika Anda melakukannya, biasanya dengan enumerate.) Saya pikir komentar Anda adalah contoh yang bagus mengapa mencoba meninjau bahasa yang Anda tidak terbiasa harus paling mendidik untuk diri sendiri.
jpmc26
1
@ Mawg - Saya cenderung mengatakan bahwa untuk itulah pengujian otomatis dilakukan. Bahkan dengan pengetahuan ahli bahasa, sulit untuk mengatakan apakah kode benar-benar akan memenuhi spesifikasi desain dengan hanya melihatnya / tanpa menjalankannya dan mengamati hasilnya (kecuali jika spesifikasi desain Anda begitu terperinci sehingga pada dasarnya kode itu sendiri) . Aspek jawaban yang disebutkan mencakup banyak (meskipun tidak semua) alasan yang sah untuk melakukan tinjauan kode. Tinjauan kode umumnya tidak termasuk pelaksanaan kode yang sedang ditinjau.
Agustus
59

Sebagai kontributor tetap di Code Review Stack Exchange , saya menjumpai banyak pertanyaan yang menderita masalah Bahasa-agnostik, misalnya:

  • Pemformatan, lekukan
  • Cakupan
  • Loop
  • Ketik operasi

dan daftarnya berlanjut. Namun, sementara saya tidak perlu tahu bahasa, saya masih bisa meninjau masalah / poin tersebut.

Beberapa pengguna teratas kami memiliki jawaban teratas dalam bahasa yang tidak mereka gunakan secara aktif, atau tidak tahu. Bahkan dua dari sepuluh saya berada dalam bahasa yang saya tidak tahu atau tidak dapat mengkompilasi / menjalankan pada mesin saya.

Saya bahkan akan mengatakan itu sama dengan meninjau kode semu seseorang. Selama Anda dapat mengamati dan mengomentari hal-hal yang relevan dengan hal-hal yang Anda pahami, Anda akan baik-baik saja, dan itu akan relevan.

Bulu ayam
sumber
2
Saya bahkan menulis jawaban untuk program PHP. Itu bukan jawaban terbesar, tapi saya masih berpendapat bahwa deklarasi loop asli jelek.
Hosch250
4
Saya belajar C # melalui kombinasi meninjaunya, menulisnya, dan memeriksa apa yang saya tulis.
RubberDuck
5
Jika Anda tidak mengenal Python, Anda tidak akan menghargai pentingnya lekukan dalam bahasa ...
Floris
2
Sekitar 2/10 dari jawaban teratas Anda berada dalam bahasa yang Anda tidak tahu. Siapa bilang pemilih tahu tentang mereka juga?
Martin Smith
Meskipun saya tidak tahu bahasa, saya masih mengecek pernyataan saya, dan jika saya mengacaukan ... Percayalah, saya akan mendengarnya
Quill
44

Saran umum

Inilah intinya, menurut saya:

  • Jika Anda tidak tahu bahasa dengan cukup baik untuk mengetahui fitur dan idiom umum , Anda mungkin tidak akan berkontribusi banyak pada ulasan.
  • Jika Anda ingin mempelajari fitur dan idiom bahasa, Anda dapat berpartisipasi dalam ulasan. Fokus Anda harus mengamati idiom dan mengajukan pertanyaan tentang pola dan organisasi yang tidak masuk akal bagi Anda. Ini dapat membantu mengidentifikasi area masalah, tetapi hanya dalam arti bahwa Anda mungkin memaksa pengembang untuk mempertahankan apa yang telah mereka lakukan. Ajukan pertanyaan Anda dengan cara yang memberi ruang bagi celah Anda dalam pengetahuan. Perhatikan bahwa ini mungkin berakhir dengan biaya bersih dalam ulasan itu sendiri, tetapi biaya itu merupakan investasi dalam pengetahuan Anda.
  • Kemampuan Anda untuk berkontribusi sampai Anda membiasakan diri dengan fitur, idiom, dan standar bahasa akan terbatas. Saya tidak akan berharap ini berubah sampai Anda benar-benar menulis sejumlah besar kode dalam bahasa tersebut.

Pertimbangan dan contoh spesifik Python

Untuk situasi spesifik karena tidak mengetahui Python, saya akan sangat waspada terhadap hal ini. Python memiliki banyak idiom dan praktik standar yang akhirnya membuat Python yang baik terlihat sangat berbeda dari apa yang mungkin Anda harapkan dalam bahasa lain. (Memang, saya pikir hal-hal yang ditekankan Python telah membuat kode saya terlihat lebih baik dalam bahasa lain , dan bukan sebaliknya.) Di luar PEP8 memiliki contoh yang baik tentang bagaimana Anda mungkin benar-benar kehilangan pola pikir yang didorong Python.

Mari kita lihat contoh sederhana. Ambil kode ini:

f = open('/home/me/something.txt')
try:
    content = f.read()
finally:
    f.close()

Lihat masalah dengan kode ini? Jika Anda belum pernah bekerja dengan Python, Anda mungkin tidak. Masalahnya adalah bahwa ada banyak gaya disukai di Python yang melakukan persis hal yang sama:

with open('/home/me/something.txt') as f:
    content = f.read()

Ini adalah manajer konteks. Apakah Anda tahu apa gunanya? Apakah Anda tahu kapan akan tepat untuk menggunakannya? Apakah Anda tahu kapan waktu yang tepat untuk membuatnya sendiri? Tidak? Maka Anda mungkin belum siap untuk meninjau Python.

Mari kita lihat contoh lain.

def add_fifty(other_list):
   result = list()
   for i in other_list:
       result.append(i + 50)
   return result

x = range(10)
y = add_fifty(x)

Lihat masalahnya? Masalahnya adalah metode ini sama sekali tidak perlu . Anda mungkin harus menggunakan pemahaman saja, ketika operasi ini sesederhana ini:

x = range(10)
y = [i + 50 for i in x]

Jika Anda tidak melihat itu, Anda tidak terbiasa dengan fitur dan idiom Python.

jpmc26
sumber
1
Dalam contoh terakhir Anda, jika saya melihat kode final saya mungkin memiliki beberapa gagasan tentang apa yang mungkin dilakukan (tanpa mengetahui Python) dan saya mungkin mulai bertanya-tanya apakah saya dapat melakukan sesuatu yang serupa dalam bahasa favorit saya, yang tidak pernah saya pertimbangkan sebelumnya.
gnasher729
1
@ gnasher729 "Memang, saya pikir hal-hal yang ditekankan Python telah membuat kode saya terlihat lebih baik dalam bahasa lain, dan bukan sebaliknya." =) Satu-satunya hal yang saya ketahui dalam bahasa lain yang bahkan akan mirip adalah. LINQ .NET dan Java 8's Stream s. Ruby mungkin punya sesuatu, dan saya yakin bahasa fungsional mendekati sesuatu. Maksud saya dengan contohnya adalah Anda bahkan mungkin tidak tahu untuk melakukan itu jika Anda tidak terbiasa dengan Python, jadi Anda bahkan tidak akan tahu untuk menantang versi "buruk".
jpmc26
@x = 1 .. 10; @y = map {$ _ + 50} @x;
pipa
2
Tinjauan kode lebih banyak tentang kesalahan logika daripada mengimplementasikan beberapa (untuk programmer luar) sintaksis yang tidak jelas dalam bahasa tertentu. Ini tentang menemukan bug logika, seperti menerapkan algoritma yang sepenuhnya salah (seperti menggunakan pembagian ketika harus ditambahkan). Jadi kodenya tidak akan sesuai dengan spesifikasi. Itu tidak penting selama output yang dihasilkan benar. Paling tidak, jika Anda khawatir tentang optimasi tertentu seperti ini, tinjauan kode tim akan lebih baik.
phyrfox
3
@ phyrfox Itu tidak benar. Kesalahan logika dapat ditemukan, tetapi tinjauan kode juga (atau terutama) tentang praktik terbaik, keamanan, kinerja, keandalan, keterbacaan / pemeliharaan, dll. Sebelum sesuatu ditinjau, itu benar-benar harus diuji. Definisi ulasan kode StackExchange cukup tepat, imo. Dalam Python, contoh-contoh yang saya sebutkan bukanlah "optimasi kecil." Pengembang Python yang tidak menggunakan pola-pola ini sangat tidak berpengalaman, ketinggalan zaman, atau tidak kompeten. Ini adalah elemen dasar bahasa.
jpmc26
21

Mereka mungkin meminta Anda untuk meninjau kode Python secara tepat karena Anda tidak tahu Python . Ada teori manajemen yang berguna untuk memiliki "orang bodoh" dalam tim. Saya tidak menyebut Anda nama yang buruk :) Idenya adalah bahwa sebuah tim mungkin menderita pemikiran kelompok dan mengembangkan visi terowongan. Salah satu cara untuk keluar dari hal ini adalah dengan memasukkan seseorang dalam tim yang anggota tim lainnya akan anggap sebagai "orang bodoh", yaitu seseorang yang tidak mengetahui pokok permasalahannya. Anda akan mengajukan pertanyaan untuk memberi tahu diri Anda sendiri, dan pertanyaan itu akan datang dari sudut pandang yang mungkin tidak pernah dipertimbangkan oleh anggota tim lain.

Anda tidak tahu Python, jadi apa yang tampak biasa bagi para pembuat kode Python mungkin terasa aneh bagi Anda. Anda mungkin menyarankan peningkatan yang tidak pernah dipertimbangkan tim.

pengguna2023861
sumber
1
Ini adalah jawaban saya. Saya hanya akan menambahkan itu, pada hari tertentu dengan rutin Python apa pun dan grup guru Python tertentu ... kode itu adalah SAMPAH.
dwoz
Dan sering kali, sekadar tindakan menjelaskan sesuatu kepada "orang bodoh" akan mendatangkan "Doh!" saat dari "pakar" ketika mereka tiba-tiba menyadari bahwa kode tidak melakukan apa artinya, atau melewatkan beberapa kasus tepi kunci. Ini juga merupakan cara yang layak untuk memulai penyebaran pengetahuan.
TripeHound
21

Peninjauan kode bukan tentang mencari variabel dengan ejaan yang salah dan pemformatan yang salah. Jika Anda menggunakan peninjauan kode untuk menemukan hal-hal seperti itu, maka berhentilah membuang-buang waktu dan gunakan alat.

Tinjauan kode adalah tentang meningkatkan desain dan mendeteksi kesalahan umum oleh seorang programmer pemula.

Karena saya memprogram dalam C ++ , dan saya tidak tahu Python cukup baik, saya tidak akan berani untuk meninjau kode Python. Namun saya bisa membantu dengan tinjauan kode Java.

Anda tidak mengatakan dalam bahasa apa Anda memprogram, tetapi saya tidak melihat apa yang dapat Anda kontribusikan dalam tinjauan kode, jika Anda tidak tahu bahasa pemrogramannya.

BЈовић
sumber
23
Sungguh, Anda memiliki alat yang dapat membedakan variabel dengan nama buruk dari yang baik? Saya akan sangat tertarik untuk melihatnya.
Davor Ždralo
1
@ DavorŽdralo Keluar dari kelelawar Saya tahu Java memiliki Checkstyle. Alat analisis statis yang lebih formal adalah umum untuk banyak bahasa, dan meminta mereka menerapkan standar pengkodean biasanya merupakan tugas yang paling tidak.
Shaz
9
Saya merasa ada sedikit perbedaan antara definisi Code Review di sini, agak mengingatkan saya pada pertanyaan ini di CR Meta: Apa IS Code Review? . Saya tidak akan mengecualikan sesuatu yang spesifik dan mengatakan "Tinjauan Kode BUKAN tentang XYZ". Sepertinya Anda mengatakan bahwa programmer yang berpengalaman tidak perlu kode mereka ditinjau, sesuatu yang sangat tidak saya setujui.
Simon Forsberg
3
@SimonForsberg Bukan itu yang saya katakan. Bahkan programmer senior dapat mempelajari sesuatu dalam tinjauan kode yang baik. Tetapi jika satu-satunya komentar adalah "Anda salah mengeja variabel di sini" -jenis komentar, maka mereka membuang-buang waktu.
BЈовић
2
@ BЈовић Tidak, ini bukan yang terburuk yang dapat Anda temukan, tetapi cukup dekat dengan "hal terkecil yang ditemukan yang masih berharga".
Vatine
11

Ulasan kode (selain benar-benar mencari kekurangan) adalah pengantar yang baik dari satu anggota tim ke anggota lainnya untuk kode yang ditambahkan atau diubah. Jika Anda adalah pengembang yang berpengalaman , Anda harus dapat membaca cukup untuk memahami apa yang sedang terjadi.

Lihatlah ulasan kode dari sudut pandang pemimpin tim: ada seseorang di sana yang memahami apa yang harus dilakukan oleh aplikasi (logika bisnis), ada seseorang di sana yang memahami kode tersebut (logika implementasi), dan mungkin beberapa orang lainnya ada yang perlu memiliki gagasan tentang bagaimana semua itu cocok bersama.

Adam Zuckerman
sumber
7

Anda seharusnya tidak menjadi satu - satunya peninjau, tetapi ada banyak alasan bagus bagi Anda untuk menjadi salah satu peninjau. Tidak mengetahui bahasanya tidak banyak halangan untuk banyak pertanyaan yang perlu dijawab dalam ulasan kode. Sebagai contoh, saya adalah salah satu dari 20 penjawab teratas dalam tag C # di situs ini, dan saya tidak begitu banyak mengumpulkan hello world di dalam C #.

Beberapa keahlian yang dapat Anda bagikan tanpa tahu bahasa:

  • Pengetahuan domain.
  • Desain berorientasi objek umum.
  • Praktik pemrograman umum: penamaan, kejelasan, dan sebagainya.

Ini juga merupakan cara yang baik untuk mempercepat pada produk baru. Saya baru saja bergabung dengan tim baru, di mana saya tahu bahasa digunakan dengan cukup baik, tetapi tidak tahu domainnya. Berpartisipasi dalam ulasan kode telah membantu saya mempelajari sisi domain dengan lebih baik, meskipun saya belum dapat berkontribusi banyak di sepanjang garis tersebut.

Dalam kasus Anda, ini akan menjadi cara yang baik untuk mempelajari idiom bahasa baru, seperti yang Anda lihat di komentar oleh pengulas lain. Ini adalah hal-hal yang sangat sulit dipelajari dengan cara lain, karena penerjemah Anda tidak peduli apakah kode Anda pythonic atau tidak.

Karl Bielefeldt
sumber
5

Ini bisa menjadi situasi yang saling menguntungkan. Saya akan mengatakan bahwa Anda bisa menjadi pengulas yang sangat berharga karena Anda adalah seorang perawan Python yang belum ternoda oleh Kutukan Pengetahuan .

Pikirkan seperti ini: jika kode cukup jelas sehingga bahkan seorang perawan Python dapat memahaminya, maka itu harus kode yang baik. Bagian-bagian yang Anda sulit pahami mungkin kandidat untuk pengerjaan ulang atau komentar yang lebih baik.

Jelas, itu juga akan bermanfaat bagi Anda, karena Anda akan mengambil bahasa baru saat Anda pergi. (Mudah-mudahan, kode yang Anda berikan adalah contoh yang baik untuk dipelajari.) Pengaturan ini harus bekerja dengan baik untuk Python, bahasa yang memiliki reputasi sebagai "kodesemu yang dapat dieksekusi". Jika Anda adalah pengembang yang berpengalaman, maka Anda seharusnya tidak mengalami banyak kesulitan memahami inti dari program Python.

Peringatannya adalah Anda tidak diharapkan menemukan bug yang muncul dari gotcha khusus bahasa . Tetapi menemukan bug bukan satu-satunya tujuan ulasan kode. Jika tidak ada yang lain, Anda akan berpartisipasi dalam transfer pengetahuan hanya dengan mengetahui hal-hal seperti apa yang terjadi dalam kode rekan Anda.

200_sukses
sumber
2

Saya pernah diminta untuk mengaudit proyek yang dikerjakan oleh subkontraktor dan tampaknya memiliki masalah kinerja yang serius. Saya cukup cepat menetapkan bahwa faktor kritis adalah modul Perl tunggal. Saya belum pernah menemukan Perl sebelumnya dan kami tidak memiliki siapa pun di organisasi yang mengetahuinya, jadi saya mulai mencoba memahaminya sendiri. Saya tidak pernah sampai sejauh memahami detail, tetapi sangat jelas bahwa algoritma yang digunakan adalah kuadrat dalam ukuran data dan ini adalah penyebab semua masalah. Jadi ya, membaca kode dalam bahasa yang Anda tidak sepenuhnya mengerti pasti bisa produktif. Bonusnya adalah Anda mempelajari trik-trik baru saat Anda menggunakannya.

Michael Kay
sumber
1

Beberapa pengamatan:

1) Jika Anda adalah pengembang berpengalaman, Anda akan mengambil Python (atau setidaknya sebanyak yang perlu Anda ketahui), hanya dengan bekerja dengannya. Ini akan menjadi kasus "belajar dengan melakukan." Ini akan sulit pada awalnya, tetapi akan menjadi lebih mudah saat Anda mengambil bahasa. Anggap ini sebagai kesempatan untuk belajar bahasa lain (orang sering belajar bahasa "asing" melalui "pencelupan.")

2) Ada sejumlah orang berharga di situs SE yang "non-teknis," tetapi terampil dengan tata bahasa, komunikasi, dan logika. Orang-orang semacam itu membawa "mata segar" pada subjek, dan membuat sejumlah perbaikan "tanpa otak" yang dilewatkan oleh orang lain, karena mereka terlalu "terikat" pada materi. Anda sedang berkonsultasi mungkin untuk keterampilan non "teknis" (yaitu non Python) Anda seperti logika dan pengetahuan pemrograman secara keseluruhan.

Dan jika Anda belum melakukan banyak tinjauan kode, hampir semua pengalaman tinjauan kode akan membantu Anda sebagai pengembang. Ini terlihat seperti pertandingan yang baik antara keterampilan dan kebutuhan Anda dan kebutuhan tim.

Tom Au
sumber
1
Saya mempertanyakan apakah mengkaji kode merupakan "belajar sambil melakukan" pada tingkat yang berarti. Mungkin pengalaman peninjauan saya berbeda dengan pengalaman Anda, tetapi jarang ada penulisan kode yang bermakna atau substansial, dan hampir tidak pernah dilaksanakan.
Nama Layar Esoteris
@EsotericScreenName - Saya pikir itu tergantung pada seberapa banyak umpan balik yang Anda dapatkan dari seseorang yang menulis atau mengetahui kode. Ini juga lebih cenderung berada di area domain Anda bekerja dengan bahasa lain sehingga lebih relevan daripada contoh kode khas. Sebagian besar contoh pengkodean hanya menunjukkan cara melakukan cuplikan kecil dari taktik dan jarang ditampilkan sebagai bagian dari proyek besar.
JeffO
0

Itu tergantung pada apa tujuan dari tinjauan itu; yaitu apa yang Anda maksud dengan efektif .

Anda mungkin masih dapat mendeteksi beberapa masalah. Jika Anda hanya mereka yang harus ditinjau dan mereka hanya berharap bahwa Anda memeriksanya membantu beberapa dan mungkin menangkap sesuatu, maka tentu saja. Banyak konsep struktur mirip antara bahasa. Satu khususnya adalah mampu meninjau komentar. Harus dikomentari dengan cukup baik sehingga seorang programmer yang tidak menggunakan bahasa tertentu itu harus tetap dapat merasakan apa yang terjadi. Jika tidak ... maka Anda dapat memberi tahu mereka di mana komentar mereka kurang. Jika itu adalah komentar yang baik ... maka Anda harus dapat meninjau sedikit struktur mereka hanya melalui penjelasan tentang apa yang terjadi daripada benar-benar membaca kode dari apa yang terjadi.

Tetapi Anda tidak akan mungkin mendeteksi banyak masalah lain. Jadi, jika mereka berniat untuk meninjau Anda untuk menentukan apakah ini program yang dibuat dengan baik atau tidak, mereka akan kecewa.

Apakah hasil itu sepadan dengan waktu Anda melakukannya sebagian besar tergantung pada proyek.

Jimbo Jonny
sumber