Confrontando l'ingegneria del software con l'ingegneria civile, sono rimasto sorpreso osservare un modo di pensare diverso: qualsiasi ingegnere civile lo sa se vuoi costruire una piccola capanna nel giardino puoi semplicemente ottenere il materiali e andate a costruirlo mentre se volete costruire una casa di 10 piani (o, ad esempio, qualcosa come questo ) devi fare abbastanza un po 'di matematica per essere sicuro che non si sfaldi.
Al contrario, parlando con alcuni programmatori o leggendo blog o forum Spesso trovo un'opinione diffusa che può essere formulata più o meno come segue: teoria e metodi formali sono per matematici / scienziati mentre la programmazione è più che altro che fare le cose .
Ciò che è normalmente implicito qui è che la programmazione è qualcosa di molto pratico e che anche se i metodi formali, la matematica, la teoria degli algoritmi, linguaggi di programmazione puliti / coerenti, ecc. possono essere argomenti interessanti, spesso non sono necessari se tutto ciò che si desidera è fare le cose .
Secondo la mia esperienza, direi che mentre non hai bisogno di molto teoria per mettere insieme uno script di 100 righe (la capanna), al fine di sviluppare un'applicazione complessa (l'edificio di 10 piani) hai bisogno di una struttura design, metodi ben definiti, un buon linguaggio di programmazione, buon testo libri in cui è possibile cercare algoritmi, ecc.
Quindi IMO (la giusta quantità di) teoria è uno degli strumenti per fare le cose .
La mia domanda è perché alcuni programmatori pensano che ci sia un contrasto tra teoria (metodi formali) e pratica (fare le cose)?
L'ingegneria del software (software di costruzione) è percepita da molti come facile rispetto, ad esempio, all'ingegneria civile (costruzione di case)?
O queste due discipline sono davvero diverse (a parte la mission-critical software, l'errore del software è molto più accettabile di un errore di costruzione)?
Modifica
Grazie per tutte le risposte e l'interesse per questo argomento. Ti chiederei gentilmente di non pubblicare nuove risposte se non hai aggiungere alcune osservazioni che non sono ancora state coperte dalle risposte esistenti. Quindi, leggi attentamente tutte le risposte prima di pubblicarne di nuove.
Cerco di riassumere, ciò che ho capito dalle risposte fino ad ora.
- A differenza dell'ingegneria del software, nell'ingegneria civile è molto più chiaro che quantità di teoria (modellazione, progettazione) è necessaria per un determinato compito.
- Ciò è in parte dovuto al fatto che l'ingegneria civile è antica quanto l'umanità, mentre l'ingegneria del software è in circolazione solo da qualche decennio.
- Un altro motivo è il fatto che il software è un tipo di artefatto più volatile, con requisiti più flessibili (potrebbe essere consentito il crash), diverse strategie di marketing (un buon design può essere sacrificato per farlo rapidamente sul mercato) , ecc.
Di conseguenza, è molto più difficile determinare quale sia la giusta quantità di design / teoria è appropriato nell'ingegneria del software (troppo poco - > codice troppo disordinato, troppo - > non riesco mai a finire) perché non esiste una regola generale e solo (molta) esperienza può essere d'aiuto.
Quindi, se interpreto correttamente le tue risposte, questa incertezza su quanto la teoria è davvero necessaria contribuisce al misto di sentimenti di amore / odio alcuni programmatori hanno verso la teoria.