È efficace rivedere il codice in una lingua che non conosco?


108

Sono uno sviluppatore esperto, ma non ho fatto molte revisioni del codice. Mi viene chiesto di rivedere il codice scritto in Python ma non conosco Python.

Ha senso rivedere il codice in una lingua che non conosco?


62
Tangenzialmente, considera di andare su CodeReview.SE e dare un'occhiata al tag python. Osservando solo la domanda, considera quale consiglio daresti al codice e poi vedi se questo è rappresentato nelle risposte.


14
Sembra un modo eccellente per saperne di più su Python. Metti in discussione qualsiasi cosa sembri divertente - in parte non capirai la lingua e in parte saranno legittimi articoli per la revisione del codice.
Dan Pichelman,

9
@RobbieDee Assolutamente! Spiegare il tuo codice a qualcuno è spesso utile anche se è solo un orsacchiotto .
Kilian Foth,

34
Dici che ti viene chiesto di farlo. La persona che ti chiede pensa che stai eseguendo questa attività aggiungerà valore alla tua organizzazione. Se vuoi sapere qual è la natura di quel valore chiedi a quella persona , non a estranei su Internet! Non sappiamo cosa sta succedendo nella testa di quella persona. Forse il codice è di qualità così bassa che persino i principianti possono trovare problemi. Forse il codice è di così alta qualità che imparerai da esso buone abitudini. Chi puo 'dirlo? Qualcuno pensa che abbia valore; chiedi a quella persona qual è il valore.
Eric Lippert,

Risposte:


120

Qualche senso? Sì. Anche se non sai nulla della semantica di un linguaggio di programmazione, puoi comunque leggere caratteri e notare una formattazione incoerente, commenti mancanti, identificatori scelti male, duplicazioni evidenti ecc.

Molto senso o abbastanza senso per rimborsare il costo del tuo tempo ? Non ne sono sicuro. Questo dipende dalla tua posizione, dall'importanza delle revisioni del codice nel flusso di lavoro del tuo team e da molti altri fattori che non possiamo quantificare abbastanza bene.


50
Fare alcune revisioni del codice è un ottimo modo per conoscere un modulo, un framework o persino una lingua, quindi potrebbe valere la pena comunque (e forse ti viene accennato ...). Non vorrei rinunciare a una recensione del genere, non senza avere qualcuno che abbia familiarità con la lingua e il codice per guardarla.
Ordous,

8
Inoltre, se hai una buona conoscenza del dominio e il codice è ragionevolmente ben chiamato / commentato, puoi comunque individuare funzionalità errate / incomprese / mancanti ad un livello elevato (potresti non individuare errori a causa di problemi di sintassi)
Dan

4
Come outsider, potresti anche avere maggiori probabilità di individuare errori di fencepost o errori nell'applicazione della quantità corretta di segni di uguale e quel tipo di cose.
KlaymenDK,

2
@KlaymenDK Le assegnazioni in contesti booleani sono (almeno in genere) errori di sintassi in Python. Gli errori di Fencepost sono meno probabili poiché Python ben scritto praticamente non ti fa mai lavorare direttamente con gli indici array / list. (Anche quando lo fai, di solito è con enumerate.) Penso che il tuo commento sia un ottimo esempio del perché cercare di rivedere una lingua con cui non hai familiarità dovrebbe al massimo essere educativo per te stesso.
jpmc26,

1
@Mawg - Tendo a dire che è a questo che servono i test automatici. Anche con una conoscenza approfondita del linguaggio, è difficile dire se il codice soddisferà o meno le specifiche del progetto semplicemente osservandolo / senza eseguirlo e osservando il risultato (a meno che le specifiche del progetto non siano così dettagliate da essere essenzialmente codice in sé) . Gli aspetti enumerati nella risposta coprono molte (anche se non tutte) valide ragioni per fare revisioni del codice. Una revisione del codice generalmente non include l'esecuzione del codice in esame.
aroth

59

In qualità di collaboratore regolare presso Code Review Stack Exchange , incontro molte domande che soffrono di problemi di linguaggio indipendente, ad esempio:

  • Formattazione, rientro
  • Scopo
  • Loops
  • Digitare operazioni

E la lista continua. Tuttavia, mentre non ho bisogno di conoscere la lingua, posso ancora rivedere questi problemi / punti.

Alcuni dei nostri migliori utenti hanno le risposte migliori in lingue che non usano attivamente o che non conoscono. Anche due dei miei primi dieci sono in lingue che non conosco né posso compilare / eseguire sulla mia macchina.

Direi persino che sarebbe lo stesso di rivedere lo pseudo codice di qualcuno. Finché puoi osservare e commentare le cose rilevanti per le cose che capisci, starai bene e sarà rilevante.


2
Ho persino scritto una risposta a un programma PHP. Non è la risposta migliore, ma continuo a sostenere che la dichiarazione del ciclo originale è brutta.
Hosch250,

4
Ho imparato C # attraverso una combinazione di rivederlo, scriverlo e far rivedere ciò che ho scritto.
RubberDuck,

5
Se non conosci Python, difficilmente apprezzerai l'importanza dell'indentazione nella lingua ...
Floris,

2
Per quanto riguarda il 2/10 delle tue risposte migliori si trovano in lingue che non conosci. Chi può dire che anche gli elettori ne sanno qualcosa?
Martin Smith,

Anche se non conosco le lingue, continuo a controllare le mie dichiarazioni e, se avessi sbagliato ... Fidati di me, ne avrei sentito parlare
Quill

44

Consiglio generale

Ecco la linea di fondo, secondo me:

  • Se non conosci abbastanza bene la lingua per conoscere le caratteristiche e gli idiomi comuni , probabilmente non contribuirai molto alla recensione.
  • Se vuoi imparare le caratteristiche e gli idiomi della lingua, puoi partecipare alla recensione. Il tuo obiettivo dovrebbe essere quello di osservare i modi di dire e porre domande su modelli e organizzazione che non hanno senso per te. Ciò può aiutare a identificare le aree problematiche, ma solo nel senso che potresti costringere lo sviluppatore a difendere ciò che ha fatto. Poni le tue domande in modo da lasciare spazio alla tua lacuna nella conoscenza. Si noti che questo può finire per essere un costo netto nella revisione stessa, ma tale costo è un investimento nelle tue conoscenze.
  • La tua capacità di contribuire fino a quando non ti sarai familiarizzato con le caratteristiche, i modi di dire e gli standard del linguaggio sarà limitata. Non mi aspetto che questo cambi fino a quando non avrai effettivamente scritto una quantità significativa di codice nella lingua.

Considerazioni ed esempi specifici di Python

Per la situazione specifica di non conoscere Python, sarei particolarmente attento a questo. Python ha molti idiomi e pratiche standard che finiscono per rendere il buon Python molto diverso da quello che ci si potrebbe aspettare in altre lingue. (In effetti, penso che le cose che Python enfatizzi abbiano migliorato il mio codice in altre lingue, e non viceversa.) Beyond PEP8 ha un buon esempio di come potresti perdere completamente la mentalità che Python incoraggia.

Diamo un'occhiata a un semplice esempio. Prendi questo codice:

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

Vedi il problema con questo codice? Se non hai lavorato con Python, probabilmente non lo fai. Il problema è che esiste uno stile molto preferito in Python che fa esattamente la stessa cosa:

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

Questo è un gestore di contesto. Sai a cosa servono? Sai quando sarebbe appropriato usarne uno? Sai quando sarebbe appropriato crearne uno tuo? No? Quindi probabilmente non sei pronto a recensire Python.

Diamo un'occhiata a un altro esempio.

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)

Vedi il problema? Il problema è che questo metodo è completamente inutile . Probabilmente dovresti semplicemente usare una comprensione in atto, quando l'operazione è così semplice:

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

Se non l'hai visto, non hai familiarità con le funzionalità e gli idiomi di Python.


1
Nel tuo ultimo esempio, se vedessi il codice finale probabilmente avrei qualche idea di cosa potrebbe fare (senza conoscere Python) e potrei iniziare a chiedermi se posso fare qualcosa di simile nella mia lingua preferita, che non avevo mai considerato prima.
gnasher729,

1
@ gnasher729 "In effetti, penso che le cose che Python enfatizzi abbiano migliorato il mio codice in altre lingue e non viceversa." =) L'unica cosa che so di in altre lingue che sarebbero anche lontanamente simile è LINQ di .NET e Java 8 stream s. Ruby potrebbe avere qualcosa e sono sicuro che i linguaggi funzionali si avvicinano a qualcosa. Il mio punto con l'esempio è che potresti non sapere nemmeno di farlo se non hai familiarità con Python, quindi non sapresti nemmeno sfidare la versione "cattiva".
jpmc26,

@x = 1 .. 10; @y = mappa {$ _ + 50} @x;
pipe

2
La revisione del codice riguarda più gli errori logici che l'implementazione di sintassi oscura (per programmatori esterni) in un particolare linguaggio. Si tratta di trovare bug logici, come implementare un algoritmo in modo completamente errato (come usare la divisione quando dovrebbe essere aggiunta). Quindi il codice non sarà esattamente all'altezza delle specifiche. Questo non è importante finché l'output risultante è corretto. Almeno, se sei preoccupato per particolari ottimizzazioni come questa, una revisione del codice del team sarebbe ancora migliore.
phyrfox,

3
@phyrfox Questo semplicemente non è vero. Si possono riscontrare errori logici, ma la revisione del codice riguarda anche (o principalmente) le migliori pratiche, la sicurezza, le prestazioni, l'affidabilità, la leggibilità / manutenibilità, ecc. Prima che qualcosa venga rivisto, dovrebbe davvero essere stato testato. La definizione di StackExchange di revisione del codice è abbastanza precisa , imo. In Python, gli esempi che ho citato non sono "piccole ottimizzazioni". Uno sviluppatore Python che non usa questi schemi è molto inesperto, indietro nel tempo o incompetente. Questi sono elementi di base della lingua.
jpmc26,

21

Potrebbe averti chiesto di rivedere il codice Python proprio perché non conosci Python . C'è una teoria di gestione secondo cui è utile avere uno "sciocco" in una squadra. Non ti sto chiamando un brutto nome :) L'idea è che una squadra possa soffrire di pensieri di gruppo e sviluppare una visione a tunnel. Un modo per uscire da questo è includere qualcuno nella squadra che gli altri membri della squadra considererebbero uno "sciocco", cioè qualcuno che non conosce l'argomento. Porrai domande per informarti e le domande verranno da un punto di vista che gli altri membri del team probabilmente non hanno mai preso in considerazione.

Non conosci Python, quindi ciò che può sembrare normale ai programmatori Python può sembrare strano per te. Potresti suggerire un miglioramento che il team non ha mai preso in considerazione.


1
Questa doveva essere la mia risposta. Vorrei solo aggiungere che, in un dato giorno con una data routine Python e un dato gruppo di guru Python ... quel codice è GARBAGE.
Due

E spesso, il semplice atto di spiegare qualcosa a "uno sciocco" susciterà il "Doh!" momento da un "esperto" quando improvvisamente si rendono conto che il codice non sta facendo ciò che è destinato, o manca un caso chiave. È anche un modo decente per iniziare la diffusione della conoscenza.
TripeHound,

21

La revisione del codice non riguarda la ricerca di variabili con ortografia non valida e formattazione errata. Se usi la revisione del codice per trovare tali cose, smetti di perdere tempo e usa uno strumento.

La revisione del codice riguarda il miglioramento della progettazione e il rilevamento di errori comuni da parte di programmatori alle prime armi.

Dal momento che programma in C ++ e non conosco abbastanza bene Python, non oserei rivedere il codice Python. Tuttavia, potrei aiutare con una revisione del codice Java.

Non hai detto in quale lingua programmi, ma non vedo a cosa potresti contribuire in una revisione del codice, se non conosci la lingua in cui è programmato.


23
Davvero, hai uno strumento in grado di distinguere le variabili mal nominate da quelle buone? Sarei davvero interessato a vederne uno.
Assapora Ždralo il

1
@ DavorŽdralo Fuori dal pipistrello, so che Java ha Checkstyle. Strumenti più formali di analisi statica sono comuni per molte lingue e farli applicare uno standard di codifica è in genere il loro compito minore.
Shaz,

9
Ho la sensazione che ci sia un po 'di differenza tra le definizioni di Code Review qui, un po' mi ricorda questa domanda su CR Meta: Cos'è una recensione di codice? . Non escluderei qualcosa di specifico e direi "La revisione del codice NON riguarda XYZ". Sembra anche che tu stia dicendo che i programmatori esperti non hanno bisogno di rivedere il loro codice, qualcosa con cui non sono molto d'accordo.
Simon Forsberg,

3
@SimonForsberg Non è quello che sto dicendo. Anche i programmatori senior possono imparare qualcosa in una buona recensione del codice. Ma se i soli commenti sono "hai scritto male una variabile qui", tipo di commenti, allora stanno perdendo tempo.
BЈовић,

2
@ BЈовић No, non è il peggiore che puoi trovare, ma è abbastanza vicino a "la cosa più piccola trovata che vale ancora la pena".
Vatine,

11

Le revisioni del codice (oltre a cercare effettivamente i difetti) sono una buona introduzione da parte di un membro del team ad altri per il codice che viene aggiunto o modificato. Se sei uno sviluppatore esperto , dovresti essere in grado di leggere abbastanza per capire principalmente cosa sta succedendo.

Guarda una revisione del codice dal punto di vista di un caposquadra: c'è qualcuno che capisce cosa dovrebbe fare l'applicazione (logica aziendale), c'è qualcuno che capisce che cosa sta facendo il codice (logica di implementazione), e probabilmente molte altre persone lì che hanno bisogno di avere un'idea di come tutto ciò si adatta.


7

Non dovresti assolutamente essere l' unico recensore, ma ci sono molte buone ragioni per essere uno dei revisori. Non conoscere la lingua non è un grosso ostacolo per molte domande che richiedono una risposta in una revisione del codice. Ad esempio, sono uno dei primi 20 risponditori nel tag C # su questo sito e non ho nemmeno compilato il mondo ciao in C #.

Alcune competenze che puoi condividere senza conoscere la lingua:

  • Conoscenza del dominio.
  • Design generale orientato agli oggetti.
  • Pratiche generali di programmazione: denominazione, chiarezza e così via.

È anche un buon modo per accelerare un nuovo prodotto. Mi sono appena unito a un nuovo team, dove conosco abbastanza bene le lingue, ma non conosco il dominio. La partecipazione alle revisioni del codice mi ha aiutato a imparare meglio il lato del dominio, anche se non sono stato ancora in grado di contribuire molto in tal senso.

Nel tuo caso, sarà un buon modo per imparare i modi di dire di una nuova lingua, come vedi i commenti lasciati dagli altri recensori. Questi sono i tipi di cose che sono molto difficili da imparare in qualsiasi altro modo, perché al tuo interprete non importa se il tuo codice è pitonico o meno.


5

Questa potrebbe essere una situazione vantaggiosa per tutti. Vorrei dire che potresti essere un recensore particolarmente prezioso perché sei una vergine Python che non è stata contaminata dalla Maledizione della Conoscenza .

Pensala in questo modo: se il codice è abbastanza chiaro da poter essere compreso anche da un vergine Python, allora deve essere un buon codice. Le parti che hai difficoltà a comprendere potrebbero essere candidate per una rielaborazione o un commento migliore.

Ovviamente, sarebbe anche vantaggioso per te, perché acquisiresti una nuova lingua mentre procedi. (Si spera, il codice che ti viene dato è un buon esempio da cui imparare.) Questa disposizione dovrebbe funzionare particolarmente bene per Python, un linguaggio che ha la reputazione di essere "pseudocodice eseguibile". Se sei uno sviluppatore esperto, non dovresti avere molte difficoltà a capire l'essenza di un programma Python.

L'avvertenza sarebbe che non ci si aspetterebbe di individuare bug derivanti da gotcha specifici della lingua . Ma la ricerca di bug non è l'unico scopo delle revisioni del codice. Se non altro, parteciperesti al trasferimento delle conoscenze semplicemente conoscendo il tipo di cose che accadono nel codice del tuo collega.


2

Una volta mi è stato chiesto di controllare un progetto che era stato intrapreso da un subappaltatore e sembrava avere seri problemi di prestazioni. Ho rapidamente stabilito che il fattore critico era un singolo modulo Perl. Non avevo mai incontrato Perl prima e nell'organizzazione non c'era nessuno che lo sapesse, quindi ho iniziato a cercare di capirlo da solo. Non sono mai riuscito a capire i dettagli, ma era molto chiaro che l'algoritmo che stava usando era quadratico nella dimensione dei dati e questa era la causa di tutti i problemi. Quindi sì, leggere il codice in una lingua che non capisci completamente può sicuramente essere produttivo. Il vantaggio è che impari nuovi trucchi mentre ci sei.


1

Alcune osservazioni:

1) Se sei uno sviluppatore esperto, prenderai Python (o almeno quanto devi sapere), semplicemente lavorando con esso. Sarà un caso di "imparare facendo". All'inizio sarà difficile, ma diventerà più facile man mano che acquisirai la lingua. Pensa a questa come un'opportunità per imparare un'altra lingua (le persone spesso imparano le lingue "straniere" attraverso "l'immersione").

2) Ci sono un certo numero di persone preziose sui siti SE che sono "non tecniche", ma che hanno abilità grammaticali, comunicative e logiche. Queste persone danno un "nuovo sguardo" ai soggetti e apportano una serie di soluzioni "semplicissime" che altri mancano, perché troppo "legate" nel materiale. Sarai consultato presumibilmente per le tue abilità non "tecniche" (cioè non Python) come la logica e la capacità di programmazione generale.

E se non hai fatto molte revisioni del codice, quasi tutte le esperienze di revisione del codice ti aiuteranno come sviluppatore. Sembra una buona corrispondenza tra le tue abilità e le tue esigenze e quelle della squadra.


1
Mi chiedo se rivedere il codice costituisca "apprendere facendo" in misura significativa. Forse la mia esperienza di recensione è diversa dalla tua, ma raramente c'è una scrittura significativa o sostanziale di codice e quasi mai un'esecuzione.
Nome esoterico dello schermo

@EsotericScreenName - Penso che dipenda da quanto feedback ricevi da qualcuno che ha scritto o conosce il codice. È anche più probabile che ti trovi in ​​un'area di dominio in cui stai lavorando con un'altra lingua, rendendolo più rilevante rispetto al tipico esempio di codice. La maggior parte degli esempi di codifica mostra solo come eseguire piccoli frammenti di virata e raramente vengono mostrati come parte di un grande progetto.
JeffO,

0

Dipende dall'obiettivo della recensione; cioè cosa intendi per efficace .

Probabilmente sarai ancora in grado di rilevare alcuni problemi. Se sei tutto ciò con cui riescono a rivedere e sperano solo che darti un'occhiata aiuti e possibilmente catturi qualcosa, allora certo. Molti concetti di struttura sono simili tra le lingue. Uno in particolare è la possibilità di rivedere i commenti. Dovrebbe essere commentato abbastanza bene che un programmatore non di quella particolare lingua dovrebbe essere ancora in grado di avere una buona idea di ciò che sta accadendo. Se no ... allora puoi dire loro dove manca il loro commento. Se è così ben commentato ... allora dovresti essere in grado di rivedere un bel po 'della loro struttura solo attraverso le annotazioni di ciò che sta succedendo piuttosto che leggere effettivamente il codice di ciò che sta succedendo.

Ma probabilmente non rileverai molti altri problemi. Quindi, se intendono che la tua recensione sia una determinazione esaustiva del fatto che si tratti di un programma ben fatto / realizzabile, rimarranno delusi.

Il fatto che valga la pena o meno il risultato di farlo dipende in gran parte dal progetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.