Differenze tra programmazione a scuola e programmazione nell'industria? [chiuso]


50

Molti studenti quando si laureano e ottengono il loro primo lavoro, sentono di non sapere davvero come programmare, anche se potrebbero essere stati dei bravi programmatori al college.

Quali sono alcune delle differenze tra la programmazione in un ambiente accademico e la programmazione nel "mondo reale"?



4
Direi che nel mondo accademico impari in modo approfondito: impari concetti, poni domande, migliora il pensiero astratto. Nell'industria impari approfonditamente: impari a usare molte tecnologie diverse senza fare troppe domande, devi fare le cose. Attraverso l'esperienza nel settore impari anche a gestire progetti complessi e di grandi dimensioni: si tratta di una questione molto pratica che non puoi imparare all'università per mancanza di tempo.
Giorgio,

9
Questa domanda sta ponendo domande sul mondo accademico a livello di dottorato di ricerca, o dopo il conseguimento del titolo di laurea, o semplicemente in un contesto generale di "classe contro il mondo reale"?
Bob,

@Bob. Questo riguardava più il mondo accademico generale. Classi / ricerche / letture dirette / compiti contro la programmazione del "mondo reale" nell'industria.
rdasxy,

Ok. Questo non era molto chiaro, perché esiste una cosa come la "programmazione accademica" che viene fatta da persone che vogliono dire, aiutare i biologi a capire le simulazioni cellulari.
Bob,

Risposte:


72

In un tradizionale programma di informatica non impari solo la programmazione. Ma il mondo reale non vuole persone che sono solo programmatori. Il mondo reale vuole veri ingegneri del software. So che molte descrizioni di lavoro non sembrano esprimere questa distinzione, che confonde solo la questione. Nel mondo reale devi essere in grado di:

  • Raccogli e analizza i requisiti quando non ti vengono dati direttamente
  • Progetta e analizza l'architettura con possibilità pressoché infinite
  • Creare piani di test e agire su di essi per valutare e migliorare la qualità di un sistema
  • Lavora in collaborazione con un team di persone con background e livelli di esperienza diversi
  • Stima e pianifica il lavoro anche se non sai esattamente cosa costruire
  • Comunicare efficacemente con le parti interessate che hanno esigenze diverse che non si allineano necessariamente
  • Negozia programma, budget, qualità e funzionalità senza deludere le parti interessate

Oh sì, e devi anche essere in grado di scrivere codice, anche se ciò richiede, in media, solo il 40 - 60% del tempo di un ingegnere del software.

Quindi, non è che gli studenti di informatica appena coniati non sappiano programmare (molti sono in realtà programmatori molto bravi). È che molti di loro non sanno come fare nient'altro.


18
Oh yeah, and you also have to be able to write code too, but that's, on average, only 40 - 60% of a software engineer's time.- O anche lo 0-20% in negozi aziendali davvero cattivi e di grandi dimensioni.
Ritch Melton,

1
+1 per un'ottima risposta e +1 (dovrebbe essere più) per Ritch. Se come ingegnere / o sta spendendo oltre il 20% del ciclo di vita di un progetto in programmazione, allora qualcosa è molto, molto sbagliato. Design al 50%, test al 30%,% 20 per il resto ... tutto il resto, compresa la codifica, sembra giusto. Con un design adeguato, la codifica dovrebbe essere banale. Senza di essa, ciò che la gente chiama "codifica" è in realtà infinite riscritture, cercando di incidere un disegno di un qualche tipo mentre vanno avanti </rant>
Mawg

36

All'università...

Il tuo insegnante ti offre:

  • Un problema ben definito e isolato, la cui soluzione può essere fornita in un arco di tempo breve e ben definito (e verrà scartata in seguito)
  • Un set di strumenti ben definito a cui è stata introdotta prima dell'assegnazione
  • Una misura ben definita per la qualità della tua soluzione, con la quale puoi facilmente determinare se la tua soluzione è abbastanza buona o no

Nel mondo reale"...

  • Il problema è sfocato, complesso e integrato nel contesto. È un insieme di requisiti contraddittori che cambiano nel tempo e la tua soluzione deve essere abbastanza flessibile e robusta per poter reagire a tali cambiamenti in un tempo accettabile.
  • Gli strumenti devono essere scelti da te. Forse c'è già qualcosa di utilizzabile nella base di codice di 10 anni del tuo team, forse c'è qualche progetto open source, o forse una biblioteca commerciale o forse dovrai scriverlo da solo.
  • Per determinare se l'attuale iterazione del tuo software è un miglioramento (perché non hai quasi mai effettivamente fatto un progetto software), devi fare test di regressione e test di usabilità, quest'ultimo dei quali di solito significa che lo sfocato, il complesso, il contraddittorio , i requisiti integrati nel contesto cambiano ancora una volta.

Conclusione

La programmazione a scuola e la programmazione nel mondo reale sono così intrinsecamente diverse dal punto in cui in realtà vi è davvero poca sovrapposizione. CS ti preparerà per lo sviluppo del software "mondo reale" come l'allenamento di atletica preparerebbe un esercito per la battaglia.


11
Questo è sostanzialmente ciò a cui avrei risposto. A scuola conosci il problema e conosci la soluzione. Nel "mondo reale" raramente conosci la soluzione e spesso non conosci nemmeno il vero problema.
Bob,

20

Si trovano ad affrontare un aspetto diverso del problema:

Il mondo accademico si concentra principalmente sulla "scienza della programmazione", studiando in tal modo il modo di rendere efficiente un algoritmo particolare o sviluppando linguaggi su misura per rendere più espressivi alcuni paradigmi. L'industria si concentra principalmente nella produzione di oggetti che devono essere venduti. Deve fare affidamento su "strumenti" che non sono solo i linguaggi e gli algoritmi, ma anche le librerie, i framework ecc.

Questa differenza di "focus" è ciò che rende un master accademico in C praticamente incapace di scrivere un'applicazione Windows (poiché noi API di Windows non siamo nello standard C99!), Sentendosi così "incapace di programmare". Ma, in effetti, ha tutte le capacità per imparare da solo ciò che gli manca. Qualcosa che - senza studi accademici adeguati (non necessariamente realizzati in Academia) - è piuttosto difficile da trovare.


10

Buone risposte. Consentitemi di aggiungere che la programmazione accademica tende ad essere quasi simile a quella di un giocattolo. Questo è buono per insegnare. Come insegnante, stai cercando di trasmettere idee in modo più efficiente. L'aspetto negativo è che la programmazione realistica è così qualitativamente diversa, che è difficile colmare il divario.

Un'area di differenza è nell'analisi delle prestazioni. Ho scritto molti post cercando di evidenziarlo. L'analisi delle prestazioni riguarda solo superficialmente algoritmi e misurazioni. Per farlo davvero in modo efficace, devi affrontarlo come un processo di debug.

Un'altra area di differenza è la manutenibilità. Questo comprende tutto, dallo stile al design del linguaggio specifico del dominio. Non puoi farlo in modo efficace se non sai davvero cosa stai cercando di minimizzare.

Queste cose non vengono insegnate e fanno un'enorme differenza nella produttività.


1
Mi chiedo come si possano insegnare queste cose, dal momento che richiedono molto tempo ed esperienza sul campo per acquisire. Stavo assistendo a un corso di ingegneria del software in cui squadre di 10 studenti dovevano sviluppare un piccolo prodotto software in pochi mesi (due semestri, da ottobre ad aprile). Ciò ha permesso loro di avere un'idea di programmazione, pianificazione, definizione delle priorità di requisiti e compiti, comunicazione e così via. Ma, naturalmente, questo è poco rispetto a quello che dovranno affrontare nel mondo reale. Ma non puoi passare 4 anni a studiare solo su questo.
Giorgio,

@Giorgio: Per quanto riguarda le prestazioni, ho una base di codice preesistente (non molto grande) che mostro come ottimizzare attraverso una serie di iterazioni, ottenendo grandi fattori di accelerazione. È un'abilità facile da insegnare. Per DSL e manutenibilità ho anche alcuni esempi preferiti che potrebbero essere usati per insegnare. Entrambi potrebbero facilmente inserirsi in un corso di semestre, con spazio libero. Quindi penso che potrebbe essere fatto.
Mike Dunlavey,

1
Ok, ho capito: usa grandi esempi del mondo reale e lascia che gli studenti lavorino su di essi. Ottima idea.
Giorgio,

@Giorgio: 30 anni fa ero un professore, quindi ricordo ancora come farlo. Ho anche inserito queste idee in un libro che ha venduto male, il che significa solo che ho avuto il tempo di pensare e spiegare come tutto si adatta.
Mike Dunlavey,

Non ho molta esperienza, sono stato un assistente di insegnamento per alcuni anni durante il mio periodo di dottorato. Ora lavoro in un'azienda. Per quanto riguarda la programmazione all'Università, IMHO la verità è da qualche parte nel mezzo: c'è un insegnamento molto utile all'Università, ma è difficile coprire tutte le questioni importanti che un ingegnere del software dovrà affrontare durante la sua carriera. Con un certo sforzo, puoi davvero insegnare alcune cose del mondo reale, come hai sottolineato. Naturalmente non tutti i professori universitari sono disposti a farlo.
Giorgio,

8

Nel mondo accademico, la maggior parte delle persone studia informatica o corsi correlati. Dijkstra una volta osservò che "L'informatica non riguarda più i computer di quanto l'astronomia riguardi i telescopi". Una persona che studia informatica sta innanzitutto imparando a diventare uno scienziato e non un programmatore. Come programmatore, rimarrà un dilettante e il passaggio a un programmatore professionista è di conseguenza difficile.


8

Aggiornamento: come se qualcuno mi stesse leggendo nella mente: aspettative laureate contro realtà ...

La mia opinione, altri due fattori:

Dimensione del problema : in ambito accademico, dovevo principalmente sviluppare software "da zero", il che significava che il più grande programma che avevo incontrato era il più grande che ho scritto. Ciò sottolinea la capacità necessaria per gestire e far fronte alla complessità che emerge da diversi software che interagiscono insieme. Se fossi consapevole dello sforzo necessario per comprendere con complessità, avrei potuto scegliere di non essere affatto nel settore.

Lettura VS Scrittura : Un altro effetto collaterale della dimensione del problema è che spesso, nel "mondo reale" siamo esposti al lavoro che è stato scritto da altri, sia per scopi di manutenzione (non ho fatto manutenzione in ambito accademico da nessuna parte), estensione o semplicemente divisione del lavoro. Pertanto la lettura del codice diventa molte volte più importante della scrittura.

Una proposta per migliorare l'educazione alla programmazione : il mondo accademico dovrebbe esporci maggiormente alle situazioni del mondo reale senza regredire alla formazione professionale. I dottori devono affrontare un cadavere a un certo punto per vedere se sono "fatti per questo" (ho sentito storie di persone che abbandonano il corso dopo questa esperienza). Se avessi visto nei miei vent'anni un progetto LOC di 20K composto da diversi stili di programmazione, che avrei dovuto capire in un giorno e correggere un bug in tre, avrei potuto prendere in considerazione altre opzioni di carriera - anche se probabilmente no.


Per estendere la tua metafora e dalla mia esperienza in medicina: il dottore impara concetti generali a scuola di medicina, ma tutti noi apprendiamo le nozioni di base e le scorciatoie del mondo reale nella formazione sul lavoro come stagisti e residenti.
Hovercraft Full Of Eels,

2
Questo! La prima volta che ti immergi in un database di 1 milione di LOC, ti rendi conto che questo non sarà niente come tutto ciò che hai fatto all'università. È chiaro molto rapidamente che non comprenderete mai interamente quella base di codice, e qualunque cosa comprendiate deve venire dalla lettura e dalla comprensione del codice di altre persone, piuttosto che dall'architettura e dalla scrittura del vostro.
Roman Starkov,

4

La più grande differenza che ho riscontrato tra la programmazione accademica e quella industriale riguarda la robustezza. Quasi tutti hanno sperimentato il paradosso "Funziona per me" nella loro carriera, e questa è un'estensione di questa condizione. In ambito accademico, l'attenzione è rivolta agli algoritmi e alle funzioni e poca attenzione viene posta sull'usabilità e la stabilità del software in condizioni quotidiane.

Ad esempio, nel mio ufficio abbiamo un ingegnere che prenderà il software ed è un maestro nel causare incidenti da condizioni angolari. Farebbe clic su un pulsante il più velocemente possibile fino a quando qualcosa non si blocca ... se un'operazione richiede troppo tempo, inizierà semplicemente a fare clic in modo casuale sullo schermo (per frustrazione? IDK ....)

Cambiare le nostre filosofie di programmazione in modo da rendere le cose "a prova di Steve" ha in generale migliorato la stabilità della nostra applicazione.


3

Non ho esperienza personale con la formazione di programmazione a scuola - ero un inglese maggiore. Chiedimi di Keats e Byron! - ma ho ricevuto diversi nuovi laureati, li ho cresciuti e li ho seguiti nel mondo dello sviluppo di software professionale. Quindi posso parlare da quella prospettiva.

La mia esperienza è che TUTTO quello che hanno ottenuto dalla loro scuola era un interesse per la programmazione. Le loro abilità variavano da zero a trascurabili. La loro capacità di auto-dirigere era inesistente anche nelle persone più esperte. Il loro pensiero non era solo su piccola scala; pensavano davvero in miniatura. Un sistema che comprende più di una dozzina di righe di codice le ha fatte cadere completamente a pezzi.

Ma sai una cosa? Hanno acquisito un interesse , e questo è un grosso problema. Un interesse è abbondante . Posso lavorare con qualcuno che è interessato. Posso trasformarli in uno sviluppatore, a condizione che vengano da me interessati a esserlo. Inferno, è tutto con cui ho iniziato. Questo e un apprezzamento per i romanzieri americani post-moderni.


2

Nel mondo accademico,

INCONVENIENTI

  • Abbiamo scadenze che sono principalmente per segnare punti.
  • I bug non causano davvero problemi, poiché la maggior parte dei progetti non viene mai utilizzata nelle applicazioni del mondo reale.

plus

  • Abbiamo tempo a sufficienza per la ricerca.
  • Ondeggiare dagli obiettivi iniziali non causa molti problemi.

Nell'industria,

  • Lavoriamo su progetti che verranno effettivamente utilizzati dalle aziende.
  • Lavoriamo sotto stress per le mutevoli esigenze dei clienti.
  • Le scadenze sono raramente flessibili, poiché ciò potrebbe comportare enormi perdite finanziarie sia per la società di software che per i clienti.

Controllalo:

http://www.dodgycoder.net/2011/10/how-to-become-better-programmer.html


Non dovrò essere d'accordo sulla parte "effettivamente utilizzata". All'inizio della metà degli anni '90, ho trascorso 5 anni in 3 diverse aziende, grandi, piccole e medie, e nulla di ciò che ho scritto è andato in produzione. Non penso che questa sia un'esperienza fuori dal comune.
Bruce Ediger,

2

La programmazione accademica riguarda di più la codifica da soli. Questo è importante per imparare come funziona. La qualità del codice e il controllo di revisione non contano molto. Con notevoli eccezioni, il codice non ha una durata oltre l'assegnazione. La portata dei progetti tende ad essere piuttosto limitata e difficilmente si insinua.

Nel mondo reale, dovresti avere il minor codice originale possibile. Un sacco di codice è sviluppato dai team. È meglio usare le routine di libreria piuttosto che codificarlo da soli. La qualità del codice e il controllo di revisione diventano più importanti. Il codice tende ad avere una vita molto al di là di quanto inizialmente previsto. L'ambito del progetto è generalmente piuttosto ampio e tende a insinuarsi in modo significativo se non gestito.


1

In realtà,

è impossibile distinguere completamente tra programmazione a livello accademico e programmazione nel mondo reale.

Direi che la differenza più grande potrebbe essere questa: nella programmazione del mondo reale - devi sapere più della programmazione e dovresti essere in grado di adattarsi rapidamente.

A seconda del settore in cui lavori, devi essere conforme alle sue leggi.

Michael ha toccato la punta dell'iceberg solo dichiarando compiti relativi alla programmazione, che classificherei come roba facile (se valga l'impasto che ti viene pagato).

In generale, dovrai affrontare almeno un paio di sfide per argomento in un settore:

  • Leggi applicabili (es. Riservatezza del cliente per i medici)
  • Know-how soggetto (es. Sistema fiscale di fatturazione, inventario, gestione delle risorse, schemi medici, standard di settore)
  • Requisiti del cliente mancanti o inesistenti o diversi dagli standard di settore / dalle leggi in vigore

Se si confronta un progetto di programmazione a livello di dottorato di ricerca con uno del mondo reale, è probabile che siano molto simili in difficoltà, know-how di livello di ingresso e simili.

L'unica vera differenza è che il progetto del mondo reale

  • ha un cliente
  • ha budget (tempo, denaro, risorse umane)

È un gioco con la palla diverso quando qualcun altro stabilisce le regole :)


0

Se guardi le materie studiate in IT in ambito accademico, troverai circa la metà del tempo sprecato in matematica, scienze, elettivi, ecc. E l'altra metà in materie accademiche come: progettazione di compilatori, teoria degli algoritmi, architettura del computer, Ottimizzazione, sistemi operativi, elettronica digitale e pochi altri corsi relativi all'industria come la programmazione C e la programmazione Web.

La maggior parte delle materie sopra menzionate sono utili da conoscere, ma non forniranno direttamente una solida base in ciò che è richiesto nell'IT corrente.

Soddisfa i requisiti di programmazione Web Microsoft (ovvero, le aree richieste da qualcuno per essere un membro del team produttivo in un'organizzazione):

1- C #. NET o VB.NET

2- ASP.NET

3- HTML e CSS

4- SQL Server (o un altro database)

5- Programmazione e progettazione di applicazioni OO

6- Script Java

7- Quadro MVC

8- Alcune esposizioni agli strumenti di controllo del codice sorgente

9- Alcune esposizioni a strumenti di test automatizzati

Strumento di tracciamento a 10 bug

11 concetti di e-commerce (opzionale)

12-ORM

13-Alcune abilità di analisi aziendale

14-Alcune abilità comunicative

15-Probabilmente, alcuni fondamentali del cloud computing

Come puoi vedere, la maggior parte dei requisiti di cui sopra sono raramente focalizzati (puoi ottenere 1 corso in alcuni al massimo) durante il college / università.

Non si può incolpare completamente le istituzioni poiché ci sono molte pile di tecnologia e continuano a cambiare.

La maggior parte di quanto sopra di Microsoft non aiuterà qualcuno che vuole sviluppare applicazioni in Java.

Il vero problema è che nessuna delle pile tecnologiche che oggi sono necessarie all'azienda viene mai completamente coperta.

Quanto sopra copre la questione dell'idoneità dei laureati a lavori aziendali come la programmazione in ambiente aziendale. Questa esigenza non copre le esigenze di ricerca nei laboratori, ecc. Anche altre aree richiedono più competenze di quanto sopra, come lo sviluppo di giochi, lo sviluppo integrato, lo sviluppo di sistemi in tempo reale, ecc.


12
Hai 15 articoli nella tua lista. Immagino di poterne aggiungere altri 30. Non è compito del mondo accademico insegnarti tutta quella roba ma, piuttosto, insegnarti come trovare la tua strada attraverso tutta quella roba. E anche, di avere conoscenza che saranno ancora utilizzabili quando tutte le attuali tecnologie saranno obsolete (in 10 anni?) Questo è ciò che tutta la teoria è buona per e non una perdita di tempo !
Giorgio,

2
@Giorgio, grazie per il tuo commento, il tuo punto è valido. Ho esplicitamente dichiarato che "Non si può incolpare completamente le istituzioni". Mentre la domanda originale non riguarda la natura dell'educazione accademica, la mia opinione personale è che esiste un enorme divario tra ciò che gli accademici insegnano e ciò che l'azienda si aspetta. Il conto per colmare il divario era pagato dall'azienda in una costosa formazione sul posto di lavoro. Con la grande concorrenza e i tempi duri che attraversano tutte le economie, mi chiedo chi pagherà il prezzo per colmare questo divario oggi?
NoChance,

@Emmad Kareem: Sì, c'è un grande divario, sono d'accordo. Spesso i professori universitari non hanno idea di cosa stia succedendo nel "mondo reale" perché sono focalizzati sulla ricerca astratta. Tuttavia, sono queste abilità di pensiero astratto che ora mi permettono di imparare una nuova lingua in poche settimane (imparando Scala in questo momento). Capisco anche che forse per te la questione del denaro si fa sentire più fortemente. Sono cresciuto in Italia e quando ho studiato tasse universitarie dove circa 200 $ all'anno (in più abbiamo dovuto comprare noi stessi i libri). Immagino che questo sia molto poco rispetto a quello che paghi negli Stati Uniti.
Giorgio,

3
Allo stesso modo, se studiassi ingegneria e imparassi a costruire un'auto, nessuno ti insegnerebbe come guidare un'auto specifica: questo è solo qualcosa che si aspettano che tu sappia o impari da solo.
Giorgio,

1
Sprecato? Se hai i titoli che pretendi di avere, dovresti conoscerlo meglio. Anche se non sei seduto lì a programmare la matematica avanzata, le lezioni apprese nello studio si traducono direttamente nel "vedere" una soluzione pulita ed elegante.
Rig

0

Scale & Focus
Dalle mie esperienze, in un ambiente accademico, generalmente la scala dell'applicazione su cui stai lavorando è molto più piccola, qualcosa che può essere completato in un giorno o settimana, o forse fino a quando il semestre di uno o due programmatori- - tipicamente tutto ciò che scrivi sarà un codice usa e getta che verrà scartato dopo il termine. Nel mondo reale, potresti trovarti a lavorare su un'applicazione che un team più grande ha impiegato mesi, se non anni, per svilupparsi completamente. Trascorri molto più tempo e esegui il debug del codice di altre persone e cerchi di capire l'infrastruttura di una base di codice, destreggiandoti senza rompere le parti esistenti per aggiungere alcuni requisiti nuovi o modificati.

Requisiti, integrazione, clienti
Inoltre, ci sono aspetti nello sviluppo del codice, come l'analisi dei requisiti, i test di integrazione, ecc. Che tendono ad essere meno rappresentati nei progetti accademici. Per motivi di equa valutazione, in genere i requisiti sono già stati stabiliti dall'istruttore e non vengono decisi in modo collaborativo durante le riunioni. Non si tende a dover "vendere il cliente" con un approccio particolare che non è proprio quello che volevano, ma a differenza dei loro desideri è in realtà fattibile dal punto di vista tecnico. In un ambiente accademico il tuo cliente (il selezionatore o l'istruttore) tende ad avere un'idea abbastanza concreta di ciò che vuole, nel mondo reale, potresti incontrare clienti che non sanno davvero cosa vogliono e devono scegliere il cervello per capire cosa dovrebbe essere costruito.


0

Manutenzione e manutenibilità

Nel mondo accademico (almeno a livello universitario), il software è costruito tenendo conto degli obiettivi a breve termine, di solito per completare alcuni compiti a casa o progetti a termine. Una volta completato il compito, il codice viene gettato via e mai più visto.

In un ambiente professionale, la maggior parte dei software è stata scritta pensando all'uso a lungo termine; il software deve essere utilizzato per almeno alcuni anni e deve essere costruito per essere facilmente mantenuto e aggiornato nel tempo.

A questo si collega il lavoro di manutenzione. La maggior parte del lavoro di programmazione professionale prevede l'aggiornamento o la manutenzione di software esistente. I cosiddetti progetti "green-field" sono l'eccezione, piuttosto che la norma.

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.