211service.com
Il problema con la programmazione
Negli anni '80 e '90, Bjarne Stroustrup progettato e implementato il linguaggio di programmazione C++, che ha reso popolare la programmazione orientata agli oggetti e ha influenzato numerosi altri linguaggi di programmazione, incluso Java.
Il C++ rimane l'archetipo del linguaggio informatico di alto livello (cioè quello che preserva le caratteristiche del linguaggio naturale, umano), ed è ancora utilizzato da milioni di programmatori. Molti dei sistemi e delle applicazioni dell'era dei PC e di Internet erano scritti in C++. Nonostante tutto, il linguaggio rimane controverso, soprattutto perché è notoriamente difficile da imparare e da usare, e anche perché il design di Stroustrup consente agli sviluppatori di commettere gravi errori di programmazione nell'interesse di preservare la loro libertà.
Stroustrup, per molti anni ricercatore presso AT&T Bell Labs, è ora professore di informatica presso il Dipartimento di Ingegneria, presso la Texas A&M University, vicino a Houston.
Revisione della tecnologia : Perché la maggior parte dei software è così scadente?
Bjarne Stroustrup : Alcuni software sono in realtà piuttosto buoni secondo qualsiasi standard. Pensa ai Mars Rovers, a Google e al Progetto Genoma Umano. Questo è un software di qualità! Quindici anni fa, la maggior parte delle persone, e soprattutto la maggior parte degli esperti, avrebbe detto che ciascuno di quegli esempi era impossibile. La nostra civiltà tecnologica dipende dal software, quindi se il software fosse stato così dannoso come la sua peggior reputazione, la maggior parte di noi sarebbe già morta.
D'altra parte, guardare pezzi di codice medi può farmi piangere. La struttura è spaventosa e i programmatori chiaramente non hanno riflettuto a fondo sulla correttezza, sugli algoritmi, sulle strutture dei dati o sulla manutenibilità. La maggior parte delle persone in realtà non legge il codice; vedono solo Internet Explorer bloccarsi.
Penso che il vero problema sia che noi (cioè noi sviluppatori di software) siamo in uno stato di emergenza permanente, aggrappandoci alle cannucce per portare a termine il nostro lavoro. Eseguiamo molti piccoli miracoli attraverso tentativi ed errori, uso eccessivo della forza bruta e molti, molti test, ma, così spesso, non è sufficiente.
Gli sviluppatori di software sono diventati esperti nella difficile arte di costruire sistemi ragionevolmente affidabili da parti inaffidabili. Il problema è che spesso non sappiamo esattamente come abbiamo fatto: un sistema si è semplicemente evoluto in qualcosa di minimamente accettabile. Personalmente, preferisco sapere quando un sistema funzionerà e perché funzionerà.
BAMBINI : Come possiamo risolvere il pasticcio in cui siamo?
BS : In teoria, la risposta è semplice: educare meglio i nostri sviluppatori di software, utilizzare metodi di progettazione più appropriati e progettare per la flessibilità e per il lungo periodo. Premia i sistemi corretti, solidi e sicuri. Punisci la sciatteria.
In realtà, è impossibile. Le persone premiano gli sviluppatori che forniscono software a buon mercato, difettoso e primo. Questo perché le persone vogliono nuovi gadget fantasiosi ora. Essi non farlo vogliono inconvenienti, non vogliono imparare nuovi modi di interagire con i loro computer, non vogliono ritardi nella consegna e non vogliono pagare un extra per la qualità (a meno che non sia ovvio in anticipo e spesso nemmeno allora). E senza cambiamenti reali nel comportamento degli utenti, è improbabile che i fornitori di software cambino.
Non possiamo semplicemente fermare il mondo per un decennio mentre riprogrammiamo tutto, dalle nostre macchine da caffè ai nostri sistemi finanziari. D'altra parte, anche solo cavarsela è costoso, pericoloso e deprimente. Sono necessari miglioramenti significativi e possono avvenire solo gradualmente. Devono venire su un ampio fronte; nessun singolo cambiamento è sufficiente.
Un problema è che le ciminiere accademiche si mettono in mezzo: troppe persone spingono alcune aree come panacea. Migliori metodi di progettazione possono aiutare, migliori tecniche di specifica possono aiutare, migliori linguaggi di programmazione possono aiutare, migliori tecnologie di test possono aiutare, migliori sistemi operativi possono aiutare, migliori infrastrutture middleware possono aiutare, una migliore comprensione dei domini applicativi può aiutare, una migliore comprensione dei dati strutture e algoritmi possono aiutare, e così via. Ad esempio, la teoria dei tipi, lo sviluppo basato su modelli e i metodi formali possono senza dubbio fornire un aiuto significativo in alcune aree, ma spinti come il soluzione ad esclusione di altri approcci, ciascuno garantisce il fallimento in progetti su larga scala. Le persone spingono ciò che sanno e ciò che hanno visto funzionare; come potrebbero fare altrimenti? Ma pochi hanno la maturità tecnica per bilanciare le esigenze e le risorse.
BAMBINI : L'idea alla base del C++ era che i programmatori avrebbero lavorato di più in cambio di un codice più efficiente. I Bell Labs volevano un linguaggio che poche persone davvero intelligenti avrebbero usato per scrivere codice che potesse essere eseguito su computer come Electronic Switching Systems (ESS) che non erano molto veloci. Oggi ci sono molti sviluppatori di software e i computer sono molto veloci. Questo vizia il punto del C++?
BS : C++ non è stato progettato specificamente per le grandi macchine di commutazione, ma per una vasta gamma di applicazioni. Bell Labs è stata la sede di un'incredibile gamma di progetti interessanti che abbracciano ogni scala e utilizzano essenzialmente ogni tipo di computer e sistema operativo. Ma sì, il programmatore medio dei Bell Labs era significativamente più abile della nozione di programmatore medio della maggior parte delle persone, e l'affidabilità e le prestazioni (in quest'ordine) erano considerate significativamente più importanti che nella maggior parte degli altri luoghi.
Le prestazioni sono ancora un problema in molte delle applicazioni che mi interessano: reattività delle interfacce, tempi di avvio e chiusura delle applicazioni. Gli sviluppatori di software hanno neutralizzato le incredibili prestazioni dell'hardware dei computer moderni aggiungendo strati su strati di astrazioni [software] eccessivamente elaborate. Sembra che abbiamo raggiunto i limiti dell'accelerazione lineare per l'hardware, ma in molti casi potremmo recuperare un paio di ordini di grandezza dal software.
Detto questo, il C++ è diventato davvero troppo amichevole per gli esperti in un momento in cui il grado di effettiva educazione formale dello sviluppatore di software medio è diminuito. Tuttavia, la soluzione non è quella di sminuire i linguaggi di programmazione, ma di utilizzare una varietà di linguaggi di programmazione ed educare più esperti. Devono esserci linguaggi da usare per quegli esperti, e C++ è uno di quei linguaggi.
BAMBINI : Col senno di poi, nel progettare il C++, la tua decisione di rinunciare all'efficienza del programmatore, alla sicurezza e all'affidabilità del software con le prestazioni in fase di esecuzione non è stata un errore fondamentale?
BS : Beh, non credo di aver fatto un simile compromesso. voglio elegante e codice efficiente. A volte lo capisco. Queste dicotomie (tra efficienza contro correttezza, efficienza contro tempo del programmatore, efficienza contro alto livello, eccetera) sono fasulle.
Quello che ho fatto è stato progettare C++ come prima di tutto un linguaggio di programmazione di sistema: volevo essere in grado di scrivere driver di dispositivo, sistemi embedded e altro codice che necessitava di utilizzare direttamente l'hardware. Successivamente, volevo che il C++ fosse un buon linguaggio per la progettazione di strumenti. Ciò richiedeva flessibilità e prestazioni, ma anche la capacità di esprimere interfacce eleganti. La mia opinione era che per fare cose di livello superiore, per costruire applicazioni complete, dovevi prima acquistare, costruire o prendere in prestito librerie che fornissero astrazioni appropriate. Spesso, quando le persone hanno problemi con il C++, il vero problema è che non hanno librerie appropriate o che non riescono a trovare le librerie disponibili.
Altri linguaggi hanno cercato di supportare più direttamente le applicazioni di alto livello.
Funziona, ma spesso questo supporto va a scapito della specializzazione. Personalmente, non progetterei uno strumento che potesse fare solo ciò che volevo: miro alla generalità.
BAMBINI : Come spieghi il fatto che il C++ è sia ampiamente criticato che risentito da molti programmatori, ma allo stesso tempo molto utilizzato? Perché ha così tanto successo?
BS : La risposta glib è, ci sono solo due tipi di linguaggi: quelli di cui tutti si lamentano e quelli che nessuno usa.
Ci sono sistemi più utili sviluppati in lingue ritenute orribili che in lingue elogiate per essere belle, molti di più. Lo scopo di un linguaggio di programmazione è aiutare a costruire buoni sistemi, dove il bene può essere definito in molti modi. La mia breve definizione è corretta, mantenibile e adeguatamente veloce. L'estetica conta, ma prima di tutto un linguaggio deve essere utile; deve consentire ai programmatori del mondo reale di esprimere idee del mondo reale in modo succinto e conveniente.
La ragione principale del successo del C++ è semplicemente che soddisfa i suoi limitati obiettivi di progettazione: può esprimere una vasta gamma di idee in modo diretto ed efficiente. Il C++ non è stato progettato per fare solo una cosa veramente bene o per impedire alle persone di fare cose considerate cattive. Invece, mi sono concentrato sulla generalità e sulle prestazioni.
Sono sicuro che per ogni programmatore a cui non piace il C++, ce n'è uno a cui piace. Tuttavia, un mio amico è andato a una conferenza in cui il relatore principale ha chiesto al pubblico di indicare per alzata di mano, uno, quante persone non amavano il C++ e due, quante persone avevano scritto un programma C++. C'erano il doppio delle persone nel primo gruppo rispetto al secondo. Esprimere antipatia per qualcosa che non conosci è generalmente noto come pregiudizio. Inoltre, chi si lamenta è sempre più forte e più sicuro dei sostenitori: le persone ragionevoli riconoscono i difetti. Penso di saperne di più sui problemi con il C++ di chiunque altro, ma so anche come evitarli e come utilizzare i punti di forza del C++.
E poi, ovviamente, non ti aspetti che i sostenitori di linguaggi che hanno perso in competizione con il C++ siano educati al riguardo. Lo sviluppo del software non ha quel grado di professionalità, anche se spero che alla fine lo farà. La scienza è diversa da questo punto di vista: quando vince un nuovo strumento, tecnica o teoria, le persone lo vedono come un progresso. Nel software, i contributi dei concorrenti e dei predecessori non sono ampiamente riconosciuti, apprezzati o addirittura compresi.
BAMBINI : In Il design e l'evoluzione del C++ , affermi che Kierkegaard abbia influenzato la tua concezione della lingua. È uno scherzo?
BS : Un po' pretenzioso, forse, ma non uno scherzo. Molte riflessioni sullo sviluppo del software si concentrano sul gruppo, sul team, sull'azienda. Questo viene spesso fatto al punto in cui l'individuo è completamente immerso nella cultura aziendale senza sbocchi per talenti e abilità unici. Le pratiche aziendali possono essere direttamente ostili a individui con capacità e iniziativa eccezionali in materia tecnica. Considero crudele e dispendiosa una simile gestione dei tecnici. Kierkegaard era un forte sostenitore dell'individuo contro la folla e ha discusso seriamente dell'importanza dell'estetica e del comportamento etico. Non potrei indicare una caratteristica specifica del linguaggio e dire: Vedi, c'è l'influenza del filosofo del diciannovesimo secolo, ma è una delle radici della mia riluttanza a eliminare le caratteristiche di livello esperto, ad abolire gli abusi e a limitare le caratteristiche a supporto utilizza solo gli usi che so essere utili. Tuttavia, non sono particolarmente affezionato alla filosofia religiosa di Kierkegaard.
BAMBINI : Cosa rimpiangi di più?
BS : Nessun rimpianto! Beh, ovviamente sogno quello che avrei potuto fare in modo diverso e migliore, ma seriamente, chi sono io per indovinare, diciamo, 1984 vintage Bjarne? Forse aveva meno esperienza di me, ma non era meno intelligente, probabilmente più intelligente, e aveva una migliore comprensione della parola del 1984 di me. Il C++ è stato utilizzato per costruire molti sistemi che migliorano le nostre vite ed ha avuto un'influenza positiva significativa su linguaggi e sistemi successivi. È qualcosa di cui essere orgogliosi.
Clic qui per leggere la nostra seconda intervista con Stroustrup.