In che modo la mancanza di tipizzazione statica di Python influisce manutenibilità ed estendibilità in progetti di grandi dimensioni?

StackOverflow https://stackoverflow.com/questions/3671827

Domanda

Dopo aver letto questo molto informativo (anche se un po 'polemico) domanda mi piacerebbe conoscere la vostra esperienza con la programmazione di grandi progetti con Python. Fare le cose diventano un gestibile in quanto il progetto diventa più grande? Questa preoccupazione è una cosa che mi tiene legato a Java. Vorrei quindi particolarmente interessati in informato confronti di manutenibilità e l'estensibilità di Java e Python per i grandi progetti.

È stato utile?

Soluzione

Io lavoro su un prodotto commerciale su larga scala fatta in Python. Io do una stima molto approssimativa di 5000 file x 500 righe ciascuna. Si tratta di circa 2,5 milioni di linee di codice Python. Intendiamoci la complessità di questo progetto è probabilmente equivalente a 10 mil + linee di codice in altre lingue. Non ho sentito da un solo tecnico / architettura / manager che si lamentano di codice Python essere impossibile da mantenere. Da quello che ho visto dal nostro bug tracker, non vedo alcun problema sistemico che potrebbe essere evitata con controlli di tipo statico. In realtà c'è molto pochi bug deporre le uova da un uso non corretto del tipo di oggetto a tutti.

Credo che questo sia un ottimo soggetto accademico per studiare empiricamente perché il linguaggio basato classe statica non sembra essere così critica come si potrebbe pensare.

E di estensibilità. Abbiamo appena aggiunto un database 2 sulla parte superiore del database 1 nel nostro prodotto, entrambi non-SQL. Non v'è alcun problema relativo al tipo di controllo. Innanzitutto abbiamo progettato un abbastanza flessibile API per anticipare diversa implementazione sottostante. Credo che il linguaggio dinamico è un aiuta invece di ostacolo in questo senso. Quando siamo andati a testare e bug fixing frase, stavamo lavorando sul tipo di bug persone che lavorano su qualsiasi lingua avrebbero dovuto affrontare. Ad esempio, i problemi di utilizzo della memoria, la consistenza e le questioni di integrità referenziale, problemi di gestione degli errori. Non vedo controllo di tipo statico ha molto aiuto su una qualsiasi di queste sfide. D'altra parte noi abbiamo tratto grandi benefici dalla lingua dinamica da essere in grado di iniettare il codice in volo o dopo una semplice patch. E siamo in grado di testare la nostra ipotesi e dimostrare le nostre correzioni rapidamente.

E 'sicuro di dire la maggior parte dei nostri oltre 100 ingegneri sono felice e produttiva utilizzando Python. Probabilmente è impensabile per noi per costruire lo stesso prodotto utilizzando una statica digitato lingua nello stesso lasso di tempo con la stessa qualità.

Altri suggerimenti

Dalla mia esperienza lingue staticamente tipizzati può essere difficile da mantenere. Per esempio supponiamo di avere una funzione di utilità che accetta una classe personalizzata come parametro. Se lungo la strada che si adotti una nuova convenzione di denominazione che il nome di questa classe dovrà cambiare, e quindi poi tutte le funzioni di utilità dovrà cambiare pure. In un linguaggio come Python non importa quanto a lungo agli attrezzi di classe gli stessi metodi.

Personalmente disprezzano un linguaggio che ottiene a modo mio. Velocità di esprimere le proprie idee è un valore, e questo è il vantaggio Python ha più di Java.

Una grande base di codice in Python senza una buona copertura di test potrebbe essere un problema. Ma questo è solo una parte dell'immagine. E 'tutta una questione di persone e approcci adeguati per fare il lavoro.

Senza

  • controllo del codice sorgente
  • Bug Tracking
  • Unità Test
  • Committed squadra

si potrebbe non riuscire con qualsiasi tipo di linguaggio.

Mi ricordo i giorni prima e dopo l'innovazione dei IntelliJ IDEA. Ci sono enormi differenze. Prima, tipizzazione statica è stato solo per la compilazione, lo sviluppo tratta fondamentalmente di codice sorgente come file di testo. Dopo le informazioni, il codice sorgente è strutturato, molte attività di sviluppo sono mosto più facile, grazie alla tipizzazione statica.

Tuttavia, non è come ai vecchi tempi erano inferno. Abbiamo preso come è, fare tutto ciò che necessario, usare gli strumenti a disposizione fino ad oggi, ottenere il sistema integrato, la soddisfazione. Non c'erano troppi ricordi infelici. Questo è probabilmente ciò che i programmatori di battitura dinamica sentono ora. Non è poi così male.

Naturalmente, non sarò mai tornare ai vecchi tempi. Se sto divieto di utilizzare tale IDE, credo che darò noi programmare tutti insieme.

Prova risalire l'origine di un oggetto apparentemente non valido in un grande quadro, in modo dinamico tipizzato con un sacco di CIO o altri modelli di progettazione in cui l'oggetto non può essere seguita direttamente nello stack.

Ora provate a fare questo in un linguaggio staticamente tipizzato.

A meno che il tipo di oggetto è documentata vicino per l'utilizzo in loco (ad esempio tramite le annotazioni di tipo, a-la biblioteca typesafe di Python) o da qualche parte in pila, dedurre da dove proviene può essere praticamente impossibile. Parlo per esperienza, dopo aver tentato di parti di debug del quadro BuildBot. Si trattava di una quantità immensa di ricerca di testo prima attraverso il quadro, anche utilizzando IDE fantasia, come PyDev, Komodo e Wingware.

Non ho dubbi che sia possibile imporre dei vincoli di tipo su linguaggi dinamici, ma la mancanza di qualsiasi standardizzazione su questo sembra essere un ostacolo per chiunque tenti di eseguire il debug parte di un grande quadro, esistente.

EDIT: dal 2014, Guido ha aggiunto PEP484, MyPy e il modulo di battitura. Questo ha reso la mia esperienza molto, molto meglio in termini di mantenimento di grandi progetti.

Nella mia esperienza, la manutenibilità dipende accoppiamento basso, buona documentazione, buon processo di sviluppo e test eccellente. tipizzazione statica ha ben poco a che fare con tutto questo.

Gli errori che Java prenderà al momento della compilazione, sono solo un piccolo sottoinsieme degli errori che possono verificarsi. Sono anche quasi sempre il più banale da individuare con i test; non c'è modo si può perdere chiamare un metodo su un oggetto della classe male se si sta testando che il codice produce la risposta giusta! A questo proposito si potrebbe sostenere che Python in realtà è migliore per garantire la qualità; da costringendo di provare almeno un po 'per assicurare il codice è libero di semplici errori di battitura, assicura che in realtà do di prova, almeno un po'.

In realtà Java non è nemmeno un ottimo esempio di una lingua con verifiche statiche forti per la cattura di un sacco di bug. Prova la programmazione in Haskell o Mercurio per vedere quello che voglio dire, o meglio ancora provare a programmare in Scala e l'interfacciamento con le librerie Java; la differenza in quanto "correttezza" il compilatore è in grado di garantire per voi è sorprendente quando si confronta il codice di idiomatica Scala normale utilizzando le librerie Scala al codice che deve fare i conti con le librerie Java (ho effettivamente fatto questo, dal momento che il programma ho una bit a Scala su Android).

La tua capacità di scrivere buon codice mantenibile in grandi code-basi lavorato da molti sviluppatori per lunghi periodi di tempo, nonostante le carenze di rilevamento degli errori statici di Java rispetto a linguaggi come Scala, dipende da esattamente le stesse tecniche programmatori Python usano per fare la stessa cosa nei loro grandi code-basi, nonostante le carenze di rilevamento degli errori statici di Python rispetto a Java.

Ho usato Python per molti progetti, da poche centinaia di righe a diverse migliaia di righe. tipizzazione dinamica è un grande risparmio di tempo e rende concetti OO come modo il polimorfismo più facile da usare. Il sistema di tipo non fa progetti impossibile da mantenere. Se avete difficoltà a immaginare che, provare a scrivere un paio di cose in Python e vedere come vanno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top