La frase "non reinventare mai la ruota" è adatta agli studenti?


115

Mi trovo costantemente a imbattermi in questa espressione "non reinventare la ruota" o "non reinventare mai la ruota" quando faccio alcune domande su SO. Ti dicono di usare alcuni framework o pacchetti esistenti. So da dove viene questo atteggiamento poiché non è saggio perdere tempo con qualcosa che altri hanno già risolto. O così?

Come studente, trovo che usando alcuni codici che altri hanno scritto per risolvere il mio problema non riesco a imparare quanto vorrei e ottengo meno informazioni. E a volte penso che quella frase sia principalmente per i programmatori che lavorano con scadenze e non per gli studenti come me.

È così brutto "reinventare la ruota"? Forse sto pensando male? Forse c'è un modo in cui posso evitare di reinventare la ruota e allo stesso tempo imparare molto?


51
Non otterrai molti benefici dall'andare in palestra se ottieni altre persone a sollevare i pesi per te (a meno che tu non stia imparando a essere una mangiatoia).
Charles E. Grant,

82
Va bene reinventare la ruota quando costruirai le ruote. Quando costruisci case, è una buona idea presumere che i costruttori di ruote sappiano cosa stanno facendo meglio di te.
zzzzBov,

22
Devi almeno PROVARE a creare una ruota! Altrimenti non sai perché dovresti usarne uno prefabbricato.

59
Non è mai appropriato dichiarare un assoluto. :)
un CVn

2
Può essere giusto reinventare le ruote quando si crea un codice estremamente ottimizzato. Le librerie standard sono molto utili, ma spesso è possibile creare qualcosa di meno generale ma più veloce.
Leo,

Risposte:


126

Penso che tu abbia ragione. La maggior parte dei programmatori di questo sito sono probabilmente professionisti che lavorano con l'obiettivo di creare software di qualità il più rapidamente possibile. Reinventare la ruota fallisce questo obiettivo per due ragioni.

  1. Riscrivere il codice esistente è uno sforzo sprecato che potrebbe essere utilizzato su parti univoche del sistema e rende il progetto più lungo del necessario.
  2. La prima versione di qualsiasi codice ha più probabilità di avere bug / problemi non risolti. La maggior parte delle librerie e componenti riutilizzabili sono state testate in battaglia e patchate più volte. Se reinventi un algoritmo di hashing o provi a creare il tuo RDBMS (a meno che non sia questo il progetto) il più delle volte finirai con risultati inferiori.

Detto questo, in un ambiente accademico l'obiettivo è imparare , non fornire software con un budget limitato. Reinventare una ruota per capire come funzionano i raggi o l'asse è un ottimo modo per raggiungere questo obiettivo. Ecco perché molti curricula di programmazione includono una classe sulla costruzione di compilatori quando pochissimi programmatori che lavorano hanno mai avuto motivo di farlo.


37
Sono d'accordo con l'idea di capire come funzionano le cose, anche se desidero anche che le scuole di programmazione abbiano impiegato del tempo nel loro curriculum per imparare a usare librerie di terze parti e perché dovresti. Trovo costantemente programmatori e sviluppatori di capacità professionale che non possono farlo e finiscono per reinventare la ruota.
Spoike,

3
ottimo punto sui compilatori
Chani

1
Penso che imparare a non reinventare la ruota sia più importante. Ci sono molte cose che puoi fare che non implicano la creazione di qualcosa che è già stato creato.
Thomas Bonini,

@Krelp Mentre uno è uno studente, i concetti sono la parte più importante. Molti professori usano esempi di codice per consentire una teoria e un'applicazione ponte. Questi sono i tipi di programmi che reinventeranno la biblioteca, ma è per assicurarsi che gli studenti capiscano il materiale.
Jetti,

2
Come studente devi reinventare la ruota per capire perché va più veloce che mai, ma come professionista devi usare le ruote commerciali in modo da poter andare il più velocemente possibile. Sfortunatamente, a quanto pare, SO è principalmente un sito per professionisti, non per studenti (non hanno vietato [i compiti] per un po '?)
Tacroy,

19

La risposta dipende molto dal contesto. Se desideri ottenere una comprensione più approfondita delle strutture di dati provando a implementare una tabella hash, "reinventare la ruota" è la cosa migliore che puoi fare. Se stai imparando a scrivere compilatori e hai bisogno di una tabella di simboli, implementare la tua mappa hash invece di riutilizzarne una dalla libreria standard è una perdita completa del tuo tempo.


17

Come studente, mi aspetto che inizi la tua educazione alla programmazione copiando prima una ruota o due per iniziare, quindi imparando a modificare le ruote per vedere come funzionano e per comprendere eventuali limiti. In seguito potresti persino creare una tua ruota nuova di zecca per vedere se puoi migliorare il design o per mostrare al tuo supervisore del corso la tua comprensione dei concetti coinvolti.

Come professionista, tuttavia, mi aspetto che tu abbia appreso quale ruota utilizzare per risolvere un determinato problema e quando potrebbe essere appropriato modificare una ruota esistente se risolve solo parzialmente il tuo problema. Se non è possibile trovare una ruota da nessuna parte, nicchia di mercato allora forse avete individuato, o non hai esplorato abbastanza lontano, e si avrebbe bisogno di essere vissuto abbastanza per sapere quando sarebbe opportuno creare un nuovo volante della vostra proprio.

Il problema di quando è opportuno reinventare una soluzione è complesso e richiede tempo ed esperienza per imparare quando potrebbe essere meglio creare una nuova versione di qualcosa che è già stato fatto in precedenza. Quando ti stai sviluppando da poco tempo, è meglio semplicemente utilizzare una soluzione esistente e chiedere ai tuoi tutor di suggerire opzioni. Quando si hanno scadenze strette e molta incertezza in un progetto, l'utilizzo di qualcosa di esistente può far risparmiare molto tempo ed è sempre la prima scelta. Puoi sempre refactoring per utilizzare altre soluzioni in un secondo momento, se è appropriato farlo, anche se questo significa eventualmente tornare per reinventare la ruota .


12

Essendo un insegnante o programmando, combatto costantemente con il lato opposto del problema: quando chiedo agli studenti di reinventare la ruota?

Prendi queste semplici situazioni: stiamo studiando l'algoritmo di ordinamento e imposto compiti per scrivere un programma che ordina alcuni dati; o lavorando sulla funzionalità data e chiedo un calendario.

Per entrambi, sono disponibili innumerevoli librerie e funzionalità già pronte; ma voglio che gli studenti li evitino e sviluppino la propria versione di un algoritmo di ordinamento o di un calendario.

Ora prendi quest'altro: ho impostato un'attività per scrivere una semplice applicazione per, diciamo, programmare appuntamenti. È probabile che sia necessario un ordinamento, un calendario e altro ancora. Questa volta si applica "non reinventare la ruota": non voglio che gli studenti lottino con problemi risolti, ma invece assemblo le funzionalità esistenti per ottenere un risultato.

La mia difficoltà è, quanto ti chiedo di ricreare l'esistente, il che ti fa imparare, e ha il vantaggio di problemi ben calpestati con difficoltà conosciute che posso usare per farti praticare il mestiere, e quanto dovrei mettere in un ambiente del mondo reale, dove le ruote non vengono reinventate?

Per rispondere alla tua domanda in modo più diretto, due suggerimenti:

  • se un insegnante ti dice di "non reinventare la ruota", probabilmente lo dicono perché hanno progettato il loro problema in quel modo. Forse vogliono che tu provi una libreria, lottare con l'implementazione di un algoritmo di qualcun altro, piuttosto che scrivere il tuo - c'è anche l'apprendimento in questo, e ricreare è interessante ma manca il punto.
  • se hai troppi esercizi per assemblare chiamate in biblioteca, piuttosto che sviluppare algoritmi, potresti sollevare con i tuoi insegnanti la questione dell'equilibrio tra queste attività - evidenzia che non ti è mai stato chiesto di scrivere i tuoi algoritmi, ad esempio ordinamento e fusione. La comunicazione non andrà mai male.

6

Esercizio Dubito che le prime 1000 righe di codice scritte da chiunque siano davvero uniche.

Espandi il tuo set di strumenti L' utilizzo di un framework ha maggiori vantaggi quando capisci cosa sta facendo (Al punto che potresti farlo tu stesso.) In modo da sapere come applicarlo.

Comprendere le "ruote" Utilizzando una ruota mal costruita e usurata o non adatta, non è una scusa per attenersi ciecamente a questa regola empirica. Potresti avere poco tempo, finanziamenti, competenze, quindi devi solo rattoppare e finire il viaggio.

Ci sono pochi assoluti .


1
+ Soprattutto per l'ultimo punto.
Mike Dunlavey,

Le prime 1000 righe di codice scritte da chiunque tendono ad essere davvero uniche in termini di errori creativi.
leftaroundabout

@leftaroundabout - Immagino che dovrei limitare questa affermazione alle righe di codice che possono essere compilate.
JeffO,

3

Gli studenti non hanno budget per completare i compiti, ma ci sono date di scadenza da considerare.

Come qualcuno che era uno studente fino a poco tempo fa, penso che la quantità di reinventare la ruota che è appropriata dipende da quale classe stai facendo il compito. Non vuoi scrivere la tua libreria socket per uno sviluppo web e un corso di progettazione (se riesci a farlo e consegnare il compito in tempo, cosa stai facendo prendendo un corso così facilmente?), Ma ti mancheresti molto se fosse un compito per una classe di reti. Ovviamente, i professori di solito tengono conto di queste cose quando creano i compiti, quindi farai principalmente lavori legati alla classe, ma a volte è importante sapere anche cosa non dovresti scrivere.

Detto questo, una volta che lasci la scuola, è difficile trovare il tempo per costruire cose che già esistono. Cogli ogni opportunità che puoi quando puoi, mentre sei ancora a scuola.

Se ottieni il pennello "Usa libreria X / framework Y" su SO, prefiggi la tua domanda con "Sto scrivendo X da solo per saperne di più"


prefiggi la tua domanda con "Sto scrivendo X da solo per saperne di più". Questo. +1.
boisvert

2

Se non hai una scadenza prestabilita per il tuo progetto, IMO, è meglio reinventare la ruota. Se non hai un lavoro o stai solo cercando di imparare a programmare, non a fare soldi programmando, che senso ha usare le scorciatoie che non ti renderanno un programmatore migliore, quelle che faranno semplicemente realizzare il tuo progetto più velocemente? Sebbene ciò sia vero, è sicuramente una buona abilità sapere come utilizzare librerie, framework e codice di altre persone.


Questa è l'idea alla base del concetto di Code Katas, riscrivere il codice più volte per migliorare e imparare da esso. Direi che anche al lavoro riscrivere il tuo codice ripetutamente è buono, ed essere in grado di implementare molti schemi se è necessario è ancora meglio.
Bill K,

2

Nella vita reale, la ruota viene reinventata più e più volte. Se cerchiamo i motivi, potremmo trovare alcune intuizioni come quando dobbiamo reinventare la ruota nella programmazione.

Dai tempi dei Sumeri, molte cose sono cambiate:

  • Il materiale utilizzato per costruire ruote: da pietra, legno, metallo, carbonio, ...
  • le dimensioni degli oggetti che necessitano di ruote - delle dimensioni di nanometri per strumenti medici e ruote per guadagnare carbone marrone, 100 m di dimensione
  • l'ambiente di produzione - fatto a mano o produzione industriale
  • la precisione delle ruote necessarie
  • La giusta situazione al volante. Potrebbe esserci una ruota perfetta per il tuo lavoro, ma potrebbe essere brevettata.
  • Lo splendore e la lucentezza della tua ruota. Una Cadillac potrebbe meritare un'altra ruota rispetto a una VW Golf.
  • La ruota ottimale per un passeggino dipende da molti parametri: dimensioni e peso del passeggino (più bambino / i), circostanze climatiche, prezzi delle risorse per olio o gomma naturale, macchine per costruire ruote e artigiani, disponibili per la produzione. In breve: economia mondiale.

Come si traduce nel mondo del software? Bene,

  • potrebbe esserci un server web, ma sfortunatamente è scritto in PHP. Preferiresti averlo in una lingua in cui parli fluentemente
  • un algoritmo di ordinamento potrebbe essere sovradimensionato per 10 elementi, ma non scala fino a 1T di elementi
  • potresti aver bisogno di una soluzione che è essa stessa generata dal secondo programma
  • la precisione è spesso una domanda digitale nel campo del software, se un algoritmo ordina un elenco che viene ordinato, non per lo più ordinato. Ma oltre alle prestazioni, possono verificarsi dimensioni del codice, utilizzo della memoria o altre restrizioni
  • I brevetti non hanno bisogno di ulteriori spiegazioni, immagino.
  • L'aspetto è un motivo costante per reinventare qualcosa: pensate a dropDownList (ComboBox).
  • La situazione economica globale può influenzare la tua ruota software: sarà una ruota nuvola, una ruota Open Source, una ruota Browser o una ruota App?
  • E ovviamente il motivo più famoso per costruire la tua ruota: ti piace impararla.

2

Sono uno studente di nuova istruzione. Nella scuola stavamo "imparando" asp.net e C #, in quei 2 anni di istruzione, non abbiamo mai provato a creare il nostro sistema di posta elettronica, sistema di accesso o CMS. Tutto stava semplicemente trascinando e lasciando cadere il controllo nella vista del design .

Abbiamo iniziato 102 studenti, 23 hanno completato. 4 persone hanno un lavoro. Il motivo ?: Quelle 4 persone (incluso me) sapevano come programmare prima di iniziare l'istruzione.

Il resto del popolo è perso. Perché non abbiamo mai "reinventato la ruota". Non abbiamo mai saputo come funziona effettivamente il codice. È abbastanza semplice creare un sistema di accesso completo, con la gestione degli utenti - Ma gli studenti della mia formazione, non sanno come farlo. Perché non sanno come funziona effettivamente un sistema di accesso.

Mi sento triste, che ad un certo punto, in realtà ha perso 2 anni, senza imparare nulla. - Vorrei che gli insegnanti di tutto il mondo dicessero: Sì, sappiamo che esistono dei framework, dove esiste il codice, Puoi usarli nella vita reale .. Ma su questa educazione imparerai come fare la programmazione ..

Molte formazioni di programmazione sono molto brevi, quindi le educazioni devono coprire molte cose in quel periodo. Penso che sarebbe meglio che la lista delle cose fosse dimezzata e dedicare più tempo alla programmazione. Le persone possono "inventare un nuovo tipo di ruota" se sanno come costruire una "ruota" normale. Le persone non sono stupide se hanno un po 'di conoscenza, ma non puoi chiedere a un uomo che non sa nulla delle macchine, di costruire un'auto .. Ma chiedere a un uomo che sa come costruire una bici, sarebbe molto più facile con la costruzione della macchina.


1

Dipende davvero da cosa stai facendo. Se stai cercando di capire le ruote, è una buona idea reinventarle da solo. Se tuttavia stai cercando di capire le auto, reinventare la ruota o i motori a combustione interna è generalmente dispendioso e distratto.

Ad esempio, quando sei interessato a capire come potrebbe funzionare un indice di ricerca full-text, è una buona idea provare a creare il tuo. Se stai cercando di creare un'applicazione per la gestione dei documenti, è meglio riutilizzare una libreria esistente, poiché la maggior parte del tuo lavoro consiste nel realizzare contemporaneamente l'architettura dell'applicazione e l'esperienza utente.


1

Sì, è opportuno dire agli studenti di non reinventare la ruota. Ma deve esserci una chiara comprensione di ciò che significa per uno studente: scrivere ciò che è germano per il compito. Non significa se il compito è scrivere un bubbleort, copiarlo da Wikipedia, né usare array.sort o equivalenti se il framework o la lingua lo forniscono. Ma dopo aver coperto i vari algoritmi di ordinamento, aver scritto il tuo bolle d'aria e il tuo quicksort, non preoccuparti di riscriverlo per ogni nuovo incarico, usa l'ordinamento incorporato o ciò che hai scritto, non rifare la stessa cosa precedente .

Reinventare la ruota non significa perdere tempo, il che è applicabile tanto agli studenti quanto ai professionisti: la differenza sta in quali sono gli obiettivi. Gli studenti dovrebbero imparare, quindi qualcosa che non favorisce la loro comprensione, è una perdita di tempo: dopo aver scritto una bolla, sai cosa fa, sai perché non vuoi usarla su un set grande, e riscriverlo ancora e ancora è una perdita di tempo. Non imparerai nulla di nuovo sulla 25a riscrittura.

Per gli studenti, ciò non significa non scrivere ciò che altri hanno scritto, significa non ripetere ciò che hai già imparato - quel tempo che potrebbe essere meglio speso per ciò che non hai imparato.


Tranne se la 25a riscrittura è una pratica per alcuni linguaggi di programmazione che stai imparando di nuovo.
leftaroundabout

1

Molti pensieri e sforzi sono stati fatti per creare una ruota. Il consiglio è "non reinventare la ruota", ma puoi andare avanti e retroingegnerizzare la ruota e capire perché certe cose vengono fatte nel modo in cui è fatto. Successivamente, puoi provare a implementare la ruota a modo tuo, il che potrebbe comportare una delle tre estremità logiche.

  1. O capisci perché le cose sono come sono.
  2. Potresti ottimizzarlo e renderlo migliore
  3. Potresti rovinare tutto e imparare come non fare quella cosa.

Per me lo studente non dovrebbe reinventare la ruota, ma provare a decodificarla e comprendere le implicazioni.


1

Direi che dipende dal fatto che si stia reinventando per vedere come funziona la ruota o reinventare la ruota nel processo di realizzazione di qualche altro compito. Certamente ci sono ruote che ogni studente deve implementare da solo almeno una volta. Devi sapere come funzionano alcune strutture di dati elementari e algoritmi per capire come influenzeranno le prestazioni del tuo codice o scegliere quali utilizzare in varie circostanze.

Pile, cumuli, elenchi collegati, alberi, ecc. Valgono sicuramente la pena di investire in tempo per implementarli una volta; quindi mai dopo uso quelli forniti dal framework. Chiunque utilizzi un plug-in jQuery dovrebbe scriverne almeno uno, ma non è necessario scrivere tutti i diversi tipi di uno che userai mai. Direi che è utile, ma non necessario, scrivere un piccolo programmatore di processo o mini-OS in modo da poter capire cosa succede sotto il cofano su un computer. Tuttavia, è necessario comprendere come funzionano i processi, i thread, ecc.

Una volta che hai una buona conoscenza lavorativa, può anche essere importante (e divertente) tornare indietro e implementare nuove strutture / algoritmi per farti un'idea. A meno che non sia il tuo lavoro o che tu non sia davvero bravo, mi limiterei a usare quelli esistenti nel tuo codice.


1

La risposta dipende dal fatto che desideri imparare o creare.

Se l'obiettivo è l'apprendimento, "reinventare la ruota" può darti una visione più approfondita e una migliore comprensione rispetto all'utilizzo delle ruote esistenti (funzioni di libreria).

Ma se l'obiettivo è creare un prodotto complicato, "reinventare la ruota" può essere una pratica che richiede tempo e aiuterà poco la creazione del prodotto.

Tuttavia, se l'obiettivo dell'anima è l'apprendimento dotato di tempo e resistenza sufficienti, "reinventare la ruota" è l'opzione migliore, poiché aiuta a personalizzare ogni singola caratteristica.


1

Bene, ci sono due aspetti in questo.

In primo luogo, se stai cercando di imparare, può essere utile fare alcune cose da zero o utilizzare interfacce di livello inferiore del necessario. Tuttavia, è ancora necessario identificare ciò che si sta imparando: se si desidera conoscere il protocollo HTTP, non è necessario eseguire la programmazione del socket da soli. Reinventa solo le cose che stai imparando e fallo solo per esplorarle e comprenderle davvero.

Ma una delle abilità più importanti di un programmatore professionista è quella di selezionare, conoscere e utilizzare software preesistente. Questo è qualcosa che devi anche imparare. Una grande parte delle domande sulla SO sembra provenire da persone incapaci di leggere la documentazione.

Infine, la programmazione si basa su una base teorica sostanziale. Dovrai utilizzare entrambi gli esercizi pratici, insieme alla lettura, per apprendere la teoria.


Sono d'accordo. Ecco perché ci sono così tanti nuovi framework e librerie software preesistenti creati continuamente :)
gbjbaanb

0

Ho affrontato la stessa situazione. È a causa della differenza di percezione nell'industria e nel mondo accademico.

Se non "reinventi la ruota", non puoi assolutamente studiare nulla a scuola o capire come funziona qualcosa.

Considerando che in un settore l'obiettivo è quello di far emergere un prodotto in meno tempo e fatica.

Personalmente, mi piace andare nella tana del coniglio e detesto la filosofia del settore, ma è così che vengono fatte le imprese e non puoi lamentarti.


0

L' hacker Jargon Lexikon ha un ottimo commento sul reinventare la ruota :

Progettare o implementare uno strumento equivalente a uno esistente o parte di uno, con l'implicazione che farlo è sciocco o una perdita di tempo. Questa è spesso una critica valida. D'altra parte, le automobili non usano i rulli di legno e alcuni tipi di ruote devono essere reinventate molte volte prima di farle funzionare bene. D'altra parte, le persone che reinventano la ruota tendono a trovare l'equivalente morale di un trapezio con un asse sfalsato.

Quindi potrebbe essere utile reinventare la ruota, ma assicurati di guardare le soluzioni degli altri prima o dopo averlo fatto.


0

Risposta A: reinventare la ruota. Approfondisce la tua comprensione delle strutture dati e degli algoritmi e rende MOLTO più probabile che tu scriva cose buone. Sono sicuro che quando Guido van Rossum stava iniziando su Python, la gente gli disse di non reinventare la ruota. C'erano già molte lingue. Perché scrivere google quando c'era già Yahoo! Che ne dici di clang? Impara tutto. Sii un gigante. Non lasciare che le persone piccole ti limitino. Risposta B: Se un istruttore ti dice cosa fare, dagli quello che vuole, o solo un po 'di più anche se sembra sciocco. Se vuoi ANCHE impazzire facendo una soluzione sorprendente e dargli un link per andare avanti. In primo luogo, però, soddisfa i requisiti indicati, quindi è contento.


-1

Se sei uno studente, e quindi non hai una scadenza prestabilita per il tuo progetto, è meglio "reinventare la ruota". Se stai programmando ora semplicemente per imparare a programmare e non per fare soldi, perché prendere scorciatoie che non ti aiuteranno a imparare? Perché non farlo nel modo più duro? Ma quando diventerai un programmatore di lavoro, le persone saranno scettiche se non sai come usare i framework o le librerie ...


10
Non so quale scuola hai frequentato, ma dove sono andato, le scadenze per l'incarico erano all'ordine del giorno.
un CVn

-2

Fai ciò che l'incarico / domanda / esame ti chiede di fare.

Anni fa ero un TA per un corso di programmazione C. Una domanda d'esame era "Scrivi un programma per copiare un file". Diversi studenti hanno posto lo stesso tipo di domanda: possono generare un processo ed eseguire il comando cp del sistema operativo?

Ciò che abbiamo chiesto loro è stato "Il tuo programma copierà il file?"

La domanda d'esame ha chiesto loro di scrivere codice per copiare un file. Se la risposta non aveva il codice C che copiava il file (ad es. Input aperto, output aperto, un ciclo per leggere / scrivere byte, chiudere input, chiudere output), allora non ha copiato il file.

Se l'insegnante dice di usare un framework o una libreria (ad es. Una classe di grafica potrebbe dirti di usare una libreria 3D), usa quello che ti dicono di usare. Non inventare il tuo o usarne uno diverso. Qualunque cosa diversa renderà più difficile per l'insegnante valutare il tuo lavoro.

In un colloquio di lavoro una conoscenza dei quadri popolari ti aiuterà a rispondere alle domande. Crea i tuoi progetti per imparare. Buona fortuna con i tuoi studi.


Sì, ma se generassero il cploro programma in effetti copierebbe il file.
Marcin,
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.