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

113

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

Da studente, trovo che usando un codice scritto da altri per risolvere il mio problema non posso imparare quanto mi piacerebbe, e ottengo meno informazioni. E a volte penso che questa frase sia principalmente per i programmatori che lavorano alle scadenze e non per gli studenti come me.

È così brutto "reinventare la ruota"? Forse sto pensando che sia sbagliato? Forse c'è un modo per evitare di reinventare la ruota e allo stesso tempo imparare molto?

    
posta Gnijuohz 11.04.2012 - 05:43
fonte

20 risposte

125

Penso che tu faccia un buon punto. La maggior parte dei programmatori di questo sito sono probabilmente dei professionisti che hanno l'obiettivo di creare software di qualità il più rapidamente possibile. Reinventare la ruota fallisce questo obiettivo su due fronti.

  1. Il codice di riscrittura che esiste è uno sforzo inutile che potrebbe essere utilizzato sulle parti univoche del sistema e rende il progetto più lungo del necessario.
  2. È più probabile che la prima versione di qualsiasi codice abbia problemi di bug / unforseen. La maggior parte delle librerie e dei componenti riutilizzabili sono stati testati in battaglia e rattoppati più volte. Se reinventi un algoritmo di hash o provi a creare il tuo RDBMS (a meno che non si tratti del progetto) molto spesso finirai con risultati inferiori.

Detto questo, in un ambiente accademico l'obiettivo è imparare , non fornire software con un budget. Re-inventare una ruota per capire come funzionano i raggi o l'asse è un ottimo modo per raggiungere questo obiettivo. Ecco perché molti programmi di programmazione includono una lezione sulla compilazione di compilatori quando pochissimi programmatori che lavorano hanno mai avuto bisogno di farlo.

    
risposta data 11.04.2012 - 05:25
fonte
19

La risposta dipende molto dal contesto. Se desideri acquisire una comprensione più approfondita delle strutture 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 dei simboli, implementare la tua mappa hash invece di riutilizzarne uno dalla libreria standard è una perdita totale del tuo tempo.

    
risposta data 11.04.2012 - 05:02
fonte
17

Da studente, mi aspetto che tu inizi la tua formazione di programmazione copiando prima una ruota o due per iniziare, poi imparando a modificare ruote per vedere come lavorare e comprendere eventuali limitazioni. In seguito potresti addirittura creare una 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 di lavoro, tuttavia, mi aspetto che tu abbia imparato quale ruota usare per risolvere un dato problema e quando potrebbe essere opportuno modificare una ruota se risolve solo parzialmente il tuo problema. Se non riesci a trovare una ruota ovunque, allora forse hai identificato una nicchia di mercato, o non hai esplorato abbastanza lontano, e avresti bisogno di essere abbastanza esperto per sapere quando sarebbe opportuno creare una ruota nuova di zecca.

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 prima. Quando hai sviluppato solo per poco tempo, è meglio usare semplicemente una soluzione esistente e chiedere ai tuoi mentori di suggerire delle opzioni. Quando hai scadenze strette e molta incertezza in un progetto, usare qualcosa di esistente può essere un enorme risparmio di tempo, ed è sempre la tua prima scelta. Puoi sempre refactoring utilizzare altre soluzioni in un secondo momento se è opportuno farlo, anche se questo significa eventualmente tornare a reinventare la tua wheel .

    
risposta data 11.04.2012 - 05:56
fonte
11

Essendo un insegnante o un programmatore, 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 su funzionalità data, e chiedo un calendario.

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

Ora prendi quest'altra: imposto un'attività per scrivere una semplice applicazione per, per esempio, pianificare appuntamenti. È probabile che sia necessario l'ordinamento, un calendario e altro. Questa volta "non reinventare la ruota" vale: non voglio che gli studenti abbiano problemi con i problemi risolti, ma invece assemblino le funzionalità esistenti per ottenere un risultato.

La mia difficoltà è, quanto ti chiedo di ricreare l'esistente, che ti porta a imparare, e ha il vantaggio di avere problemi ben battuti con le difficoltà che conosco che posso usare per farti praticare il mestiere, e quanto Dovrei metterti in un ambiente reale, dove le ruote non vengono reinventate?

Per rispondere alla tua domanda più direttamente, due suggerimenti:

  • se un insegnante ti dice di "non reinventare la ruota", probabilmente lo diranno perché hanno progettato il loro problema in quel modo. Forse vogliono che provi una biblioteca, lotti con l'implementazione dell'algoritmo di qualcun altro, piuttosto che scriverne una tua - c'è anche l'apprendimento in questo, e ricreare è interessante ma manca il punto.
  • se hai troppi esercizi per assemblare le chiamate alle librerie, 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 es. ordinare e unire. La comunicazione non andrà mai male.
risposta data 11.04.2012 - 13:42
fonte
6

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

Espandi il tuo set di strumenti L'uso di un framework ha più benefici quando capisci cosa sta facendo (Alost al punto che potresti farlo tu stesso.) quindi sai come applicarlo.

Comprendi le "Ruote" Utilizzare una ruota mal costruita e usurata o una che non si adatta, non è una scusa per aderire ciecamente a questa regola empirica. Potresti avere poco tempo, fondi, esperienza, quindi aggiusti e termina il viaggio.

Ci sono alcuni assoluti .

    
risposta data 11.04.2012 - 13:59
fonte
3

Gli studenti non hanno budget in denaro per completare i compiti, ma ci sono date da prendere in considerazione.

Come qualcuno che era uno studente fino a poco tempo fa, penso che la quantità di ruota che reinventa sia appropriata dipende da che classe stai facendo il compito. Non vuoi scrivere la tua biblioteca di socket per uno sviluppo web e una classe di progettazione (se riesci a fare in modo che e trasformino il compito in tempo, cosa stai facendo prendendo una lezione così facile?) , ma ti mancherebbe molto se fosse un compito per una classe di reti. Ovviamente, i professori di solito tengono conto di queste cose quando creano incarichi, quindi per lo più svolgete un lavoro correlato alla classe, ma a volte, sapere che cosa non dovresti scrivere da solo è importante pure.

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

Se ottieni il brush-off "Usa libreria X / framework Y" su SO, fai una domanda con "Sto scrivendo X da solo per saperne di più"

    
risposta data 11.04.2012 - 07:57
fonte
2

Se non hai una scadenza prefissata per il tuo progetto, IMO, è meglio reinventare la ruota. Se non hai un lavoro, o stai solo cercando di imparare per programmare, non per fare soldi con la programmazione, che senso ha usare scorciatoie che non ti rendono un programmatore migliore, quelle che lo faranno semplicemente fare il tuo progetto fatto più velocemente? Anche se questo è vero, è sicuramente una buona abilità sapere come usare librerie, framework e il codice di altre persone.

    
risposta data 11.04.2012 - 17:21
fonte
2

Nella vita reale, la ruota viene reinventata più e più volte. Se cerchiamo le ragioni, potremmo trovare qualche intuizione come quando abbiamo bisogno di reinventare la ruota nella programmazione.

Dall'epoca sumera, molte cose sono cambiate:

  • Il materiale utilizzato per costruire ruote: da pietra, legno, metallo, carbonio, ...
  • la dimensione degli oggetti che necessitano di ruote - delle dimensioni di nanometri per strumenti medici e ruote per guadagnare carbone marrone, 100 metri di dimensioni
  • l'ambiente di produzione - fatto a mano o produzione industriale
  • la precisione delle ruote necessarie
  • La giusta situazione intorno alla tua ruota. Potrebbe esserci una ruota perfetta per il tuo lavoro, ma potrebbe essere brevettata.
  • Lo splendore e la lucidatura della tua ruota. Una Cadillac potrebbe meritare un'altra ruota di una Golf VW.
  • La ruota ottimale per un passeggino dipende da molti parametri: dimensioni e peso del passeggino (più bambino / i), condizioni climatiche, prezzi delle risorse per olio o gomma naturale, macchine per costruire ruote e artigiani, disponibili per la produzione. Poco parlato: 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 fluente
  • 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 è a sua volta generata dal secondo programma
  • la precisione è più spesso una domanda digitale nel software land, se un algoritmo ordina un elenco è 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 grafico è una costante ragione per reinventare qualcosa - pensa dropDownList (ComboBox).
  • La situazione economica globale può influenzare la ruota del tuo software: sarà una ruota del cloud, una ruota Open Source, una rotellina del browser o una rotellina app?
  • E naturalmente il motivo più famoso per costruire la tua ruota: ti piace imparare.
risposta data 12.04.2012 - 03:25
fonte
2

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

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

Il resto della gente è perso. Perché non abbiamo mai "reinventato la ruota". Non abbiamo mai saputo come funziona 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 a un certo punto, in realtà ha sprecato 2 anni, senza imparare nulla. - Vorrei che gli insegnanti di tutto il mondo dicessero: Sì, sappiamo che esistono dei quadri, dove esiste il codice, puoi usarli nella vita reale .. Ma su questa educazione imparerai come programmare ...

Molte formazioni di programmazione sono molto brevi, quindi gli educations devono coprire un sacco di cose entro quel tempo. Penso che sarebbe meglio che l'elenco delle cose fosse dimezzato e impiegare più tempo nella programmazione. Le persone possono 'inventare un nuovo tipo di ruota' se sanno come costruire una normale 'ruota'. Le persone non sono stupide se hanno un po 'di conoscenza, ma non puoi chiedere a un uomo che non sa nulla di macchine, di costruire un'auto .. Ma chiedere ad un uomo che sappia come costruire una bicicletta, sarebbe molto più facile con la costruzione effettiva della macchina.

    
risposta data 13.04.2012 - 08:59
fonte
1

Dipende davvero da cosa stai facendo. Se stai cercando di capire le ruote, è una buona idea reinventarle da soli. Se tuttavia stai cercando di capire le auto, reinventare le ruote oi motori a combustione interna è generalmente uno spreco e fonte di distrazione.

Quindi, ad esempio, quando sei interessato a capire come potrebbe funzionare un indice di ricerca full text, è una buona idea provare a fare il rollover. Se stai cercando di creare un'applicazione per la gestione dei documenti, è meglio riutilizzare una libreria esistente, perché la maggior parte del tuo lavoro sta ottenendo l'architettura dell'applicazione e l'esperienza utente proprio allo stesso tempo.

    
risposta data 11.04.2012 - 09:19
fonte
1

Sì, è opportuno dire agli studenti di non reinventare la ruota. Ma deve esserci una chiara comprensione di cosa significhi per uno studente: scrivere ciò che è pertinente al compito. Ciò non significa se il compito è scrivere un bubblesort, copiarlo su Wikipedia, né usare array.sort o equivalenti se il tuo framework o linguaggio lo fornisce. Ma dopo aver coperto i vari algoritmi di ordinamento, hai scritto le tue bolle e quicksort, non preoccuparti di riscriverlo per ogni nuovo compito, usa l'ordinamento incorporato o quello che hai scritto, non ripetere la stessa vecchia cosa .

Reinventare la ruota significa non perdere tempo, il che è tanto applicabile agli studenti quanto ai professionisti: la differenza sta nel determinare quali sono gli obiettivi. Gli studenti dovrebbero imparare, quindi qualcosa che non facilita la loro comprensione, è una perdita di tempo - dopo aver scritto una sola volta che sai cosa fa, sai perché non vuoi usarlo su un grande set, 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 gli altri hanno scritto, significa non ripetere ciò che hai già imparato - quel tempo che potrebbe essere meglio speso per ciò che non hai padroneggiato.

    
risposta data 11.04.2012 - 09:29
fonte
1

Molti pensieri e sforzi sono andati alla creazione di una ruota. Il consiglio è "non reinventare la ruota", ma puoi andare avanti e decodificare la ruota e capire perché certe cose sono fatte nel modo in cui è fatta. Dopo di ciò, 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 decodificarlo e ampli; capire le implicazioni.

    
risposta data 11.04.2012 - 10:58
fonte
1

Direi che dipende dal fatto che stai 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 almeno una volta da sole. Devi sapere come funzionano alcune strutture e algoritmi di dati elementari per capire come influenzeranno le prestazioni del tuo codice o scegliere quali utilizzare in varie circostanze.

Pile, cumuli, elenchi concatenati, alberi ecc. valgono sicuramente l'investimento in termini di tempo da implementare una volta; poi sempre dopo usare quelli forniti dal framework. Chiunque usi un plugin jQuery dovrebbe scriverne almeno uno, ma non è necessario scrivere ogni tipo diverso di quello che si userà mai. Direi che è utile, ma non necessario, scrivere un piccolo programmatore di processi o mini-OS in modo da poter capire cosa succede sotto il cofano di un computer. Devi però capire come funzionano i processi, i thread, ecc.

Una volta che hai una buona conoscenza pratica, 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 sei davvero bravo a farlo, mi limiterei a usare quelli esistenti nel tuo codice.

    
risposta data 11.04.2012 - 14:16
fonte
1

La risposta dipende dal fatto che desideri imparare o creare

Se l'apprendimento è lo scopo, "reinventare la ruota" può darti una visione più ampia e una comprensione migliore rispetto all'uso delle ruote esistenti (funzioni della biblioteca).

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

Tuttavia, se l'obiettivo dell'anima è l'apprendimento fornito con abbastanza tempo e resistenza, "reinventare la ruota" è l'opzione migliore, in quanto aiuta a personalizzare ogni singola funzione.

    
risposta data 11.04.2012 - 18:34
fonte
1

Bene, ci sono due aspetti a 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 stai imparando: se vuoi conoscere il protocollo HTTP, non devi fare da solo la programmazione del socket. 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 è selezionare, conoscere e utilizzare software preesistente. Questo è qualcosa che devi anche imparare. Un'enorme proporzione delle domande su SO sembra provenire da persone che non sono in grado di leggere la documentazione.

Infine, la programmazione poggia su una sostanziale base teorica. Avrai bisogno di usare entrambi gli esercizi pratici, insieme alla lettura, per imparare la teoria.

    
risposta data 13.04.2012 - 15:25
fonte
0

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

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

Mentre in un settore l'obiettivo è far emergere un prodotto in meno tempo e sforzi.

Personalmente, mi piace andare giù nella tana del coniglio e detesto la filosofia del settore ma questo è il modo in cui le aziende hanno finito e non puoi lamentarti.

    
risposta data 11.04.2012 - 08:20
fonte
0

Il Hacker Jargon Lexikon ha un ottimo commento su reinventing the wheel :

To design or implement a tool equivalent to an existing one or part of one, with the implication that doing so is silly or a waste of time. This is often a valid criticism. On the other hand, automobiles don't use wooden rollers, and some kinds of wheel have to be reinvented many times before you get them right. On the third hand, people reinventing the wheel do tend to come up with the moral equivalent of a trapezoid with an offset axle.

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

    
risposta data 16.04.2012 - 21:16
fonte
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 ha detto 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 piccole persone ti limitino. Risposta B: Se un istruttore ti dice cosa fare, dagli ciò che vuole, o solo un po 'di più anche se sembra stupido. Se vuoi anche diventare pazzo, crea una soluzione sorprendente e dagli un link per farlo andare avanti. In primo luogo, però, soddisfare i requisiti indicati come dati così è felice.

    
risposta data 17.04.2012 - 15:26
fonte
-1

Se sei uno studente e quindi non hai una scadenza prefissata per il tuo progetto, è meglio "reinventare la ruota". Se stai programmando ora solo per imparare come 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 funzionante, le persone saranno scettiche se non sai come usare framework o librerie ...

    
risposta data 11.04.2012 - 05:36
fonte
-2

Fai ciò che il compito / domanda / esame ti chiede di fare.

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

Ciò che gli abbiamo chiesto era "Il tuo programma copierà il file?"

La domanda d'esame chiedeva loro di scrivere codice per copiare un file. Se la risposta non ha il codice C che copia il file (ad esempio, apri input, apri output, un loop per leggere / scrivere byte, chiudi input, chiudi output) quindi non copia il file.

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

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

    
risposta data 12.04.2012 - 04:13
fonte

Leggi altre domande sui tag