Cosa devono sapere gli ingegneri del software?

I linguaggi sono solo gli strumenti per esprimere le cose più importanti al di sotto di tutto ciò: gli algoritmi.

Quindi, si imparano sempre gli algoritmi e quelli sono modi indipendenti dal linguaggio per risolvere i problemi.

Ci sono tre livelli di linguaggi

  1. livello macchina ("Assembly", "GPU/OpenCL", "FPGA/Verilog")
  2. livello implementazione portatile, linguaggi compilati ("C")
  3. linguaggi di script di alto livello "HLL" ("Python", "Java", "Haskell", "Lisp", "Basic", ...)

Tutto il lavoro viene fatto a livello 2, mentre molte cose possono essere fatte efficacemente solo a livello macchina e ogni ciclo primitivo dovrebbe essere controllato se non sarebbe meglio implementato a quel livello.

Ci sono due memi (bugie) dannosi in giro: "i compilatori fanno un codice migliore di quello umano" e "HLL deve essere fatto in HLL".

Entrambi sono semplici da dimostrare e sono bugie dannose. Il livello della macchina è sempre più veloce di quello che un compilatore fa per noi. Perché

a) come esseri umani possiamo guardare l'output del compilatore e ottimizzarlo.

b) il compilatore usa solo circa il 20% del set di istruzioni dei nostri processori, il resto non viene usato affatto ma fornisce soluzioni a livello hardware molto molto veloci a problemi comuni. Esempio semplice: nessun linguaggio HLL o compilatore conosce il flag "carry". Sommare numeri su più colonne in Assembly è una cosa molto semplice con quel flag, in C dovreste dare un'occhiata all'incredibile atletica che il linguaggio deve fare per ottenere l'informazione se un overflow ("carry") è avvenuto o meno.

Dire a un ingegnere che non è importante per lui conoscere la sua macchina è considerato dannoso. Non mettereste un piede in una macchina costruita da tali ingegneri, vero? Io no. E non voglio un computer costruito dallo stesso tipo di ignoranti dannosi.

Ingegnere, conosci il tuo motore.

Quindi, tutta l'implementazione avverrà al livello 1 e 2. E quindi devi conoscere questi due linguaggi, che di solito è l'Assembly della tua macchina e il C. Non c'è semplicemente un altro linguaggio che può fare quello che fa il C.

Il terzo livello di HLL è un linguaggio di script di chiamata. Si usa questo livello per la configurazione e il flusso dei dati, così se hai dei piccoli cambiamenti nel tuo progetto non hai bisogno di ricompilare il tutto e puoi spedire il tuo prodotto compilato ad un cliente, senza che lui abbia bisogno dell'intero ambiente di sviluppo.

Esempi tipici sono per esempio un foglio elettronico. Quella cosa ha un linguaggio a livello di applicazione (API) per programmare i vostri fogli, ma il programma stesso è fatto in C e se guardate LibreOffice, metteranno il calcolo sulla vostra GPU attraverso OpenCL e useranno effettivamente il vostro hardware.

Anche Prolog è un linguaggio del genere. Prolog è il linguaggio di interfaccia per un solutore logico. E con questo tutti gli HLL sono solo script di livello API. Non dovete implementare roba reale a quel livello, ma ovviamente lo usate quotidianamente.

E questi linguaggi cambiano rapidamente e ce n'è una pletora in giro. Perché ogni applicazione, ogni problema intorno ad un nucleo di algoritmi evolverà i propri linguaggi. Il Lisp si evolve intorno ad un motore di manipolazione di liste e così via.

E poi ci sono quelli decadenti, i linguaggi di script "universali", che proclamano di poter implementare cose in sé. L'intera idea è malata, dal mio punto di vista, e non ne vedo il senso. Ma Pascal era un linguaggio del genere, Modula-2 lo era, Python, Ruby, Java, C# sono linguaggi del genere.

Con Java e C# che scalano un'altra montagna di stupidità ancora più alta per produrre codice completamente virtualizzato. Il che finisce per essere più dipendente dalla piattaforma che da qualsiasi altra cosa, senza raccoglierne i benefici.

Più questi linguaggi sono alti, più diventa difficile espandere la loro sintassi, il loro corpo di routine di libreria in linguaggi reali come C. Lua è l'esempio perfetto di un buon linguaggio di script. Non si implementa nulla in Lua, si usa il corpo della libreria da lì e si può facilmente, molto facilmente espanderlo ed è molto piccolo, con soli 100 kb e quasi nessun overhead.

Basic era lì una volta, molto piccolo, molto veloce, semplice. Ma il suo obiettivo era quello di fornire un'interfaccia di programmazione facile per i principianti. E lo fa ancora oggi, perfettamente. Basic è sempre lì per voi. (Cerca Gambas Almost Means Basic). Due minuti da zero a un cronometro grafico in esecuzione sul vostro schermo, la pressione di un pulsante per condividerlo con la comunità. Questo è quello che io chiamo beginner-friendly.

Quindi, quali linguaggi sono importanti per te?

ASM, C, Lua. Considero questi tre la spina dorsale.

Basic, il linguaggio per principianti per molti. Basta averlo imparato una volta, perché tutti possono capire il Basic.

Python, un buon linguaggio prototipo nel tuo portafoglio. In Python si può hackerare molto rapidamente un problema. È lento come il culo e vi monopolizzerà la memoria, ma non è lì per essere un linguaggio di implementazione. Dovreste essere in grado di leggerlo, perché molte persone lo usano al momento. E vuoi essere in grado di recuperare le loro soluzioni e leggere i loro esempi per principianti.

Dovresti conoscere i tipici linguaggi di impostazione del testo, primo fra tutti HTML. Ma non dimenticare LaTeX, che serve per scrivere documentazione e dopo non guarderai mai più un Word o qualcosa del genere, poi per scrivere manuali devi conoscere Roff, Groff, o qualcosa del genere. Questo è davvero importante se stai scrivendo manuali, anche se li scrivi per te stesso.

Mi basta digitare "man serial" o "man compiling" o "man firewall" e ottengo tutte le note che ho raccolto e piccoli trucchi. E con questo processo universale si può documentare tutto ciò che si fa sul proprio computer e si è scoperto e salvarlo per il proprio futuro. O per condividerlo con una comunità. Se siete in linguaggi di elaborazione del testo, date un'occhiata a Postscript. È semplicemente mega-figo.

Saggezza vivente, conoscenza vivente. I linguaggi rendono viva la conoscenza.

La prossima cosa che dovete sapere, se state scrivendo applicazioni web, è il linguaggio browser-API JavaScript. Ne hai bisogno per HTML5. Non è un linguaggio importante in sé, molto specifico nel suo uso e molto probabilmente scomparirà o cambierà drasticamente da qualche parte presto.

Webassembly sta già premendo su questo fronte. Sì, lo so, linguaggio in rapida crescita, yadda, yadda. È l'API del browser. Se sei un programmatore web, allora "conosci la tua macchina" significa conoscere JavaScript e Webasm. Ma non fai nulla di reale in questo.

Se non sei un programmatore web puoi ignorare quella cosa. Nessuna importanza al di fuori della programmazione web frontend.

Il prossimo linguaggio importante nel tuo portfolio dovrebbe essere SQL. Se impari Postgres SQL o MySql SQL o SQLite, non è importante. Per la programmazione di applicazioni SQLite sarà il tuo amico. La maggior parte dei web-server hanno MySQL in esecuzione e se lavorate con Python/Django e lo fate da soli sarà molto probabilmente Postgres.

Postgres è il database più avanzato (e più gratuito) che potete scegliere. SQLite è di gran lunga il più veloce. Quindi se non avete bisogno di una connessione dati IP-stack, andate per SQLite. Ma qualunque cosa facciate: SQL è il linguaggio che dovete imparare. Questo è IL linguaggio di database. Ce ne sono altri in giro, ma se dovete farli, sarete pagati per questo, anche per la vostra istruzione per questo.

Ma conoscete SQL. Davvero. Non puoi evitarlo oggi.

E con le molte applicazioni ci saranno molti linguaggi che dovrai imparare. Ho sempre trovato buono conoscere Maxima / wxMaxima perché la matematica simbolica è qualcosa di cui un informatico ha bisogno regolarmente. E con questo viene un altro linguaggio, naturalmente.

E poi: la shell e i tipici linguaggi a riga di comando.

Conosci Bash, ma punta a Zsh per questo, conosci Awk, Perl, Bison, Flex, se sei nella costruzione di compilatori o scrivi parser in qualche modo, Grep, Ack, e naturalmente i comandi matematici Bc, Dc, il foglio elettronico orientato al testo Sc.

Per il lavoro di sviluppo è necessario conoscere il linguaggio linker di Ld, Nm, Radare2, e i molti strumenti di build-essential che spesso sono dotati di un proprio set di linguaggio, come naturalmente Make, il più importante.

Tutti questi progetti hanno i loro linguaggi e la loro sintassi, se si va ad un livello più profondo di comprensione. Leggete i linker-script se volete.

Conclusione

Quindi, dopo aver fatto i linguaggi di base, dovrete orientarvi verso il problem solving. E in questo percorso è naturale imparare i linguaggi di interfaccia di cui avete bisogno per quel compito. E saranno molti.

A un certo punto smetterete di contarli e vedrete la natura di ciò che sono: Cose a livello di API che vengono con il corpo-applicazione. Cambieranno e cresceranno e vi divertirete ad impararle

Se no: cambiate campo. Non c'è modo di evitarlo nell'informatica. Devi imparare molti, davvero molti linguaggi e se ci riesci, sei fortunato. Se non lo fai, hai un lavoro noioso e fai tutto il giorno le stesse cose in una sola lingua. È come lavorare in una catena di montaggio dei primi anni 20 del secolo.

E se è davvero brutto, si diventa un fanboy di HLL, che non è in grado di guardare oltre l'orizzonte del suo piccolo linguaggio di livello API e vedere che il mondo è molto più grande di quello, molto più grande del piccolo insieme di routine del corpo dell'applicazione di cui è il re. E molto più ricco e più bello.

Superate tutti i livelli di script che volete. Saltateli o fateli per un certo tempo, ma non fermatevi lì, andate avanti se avete imparato qualcosa dai loro concetti. Ma conosci sempre la tua macchina, conosci sempre le basi. Spostate quello che fate a livello di script al livello 2, quando diventa interessante. Non fate le cose interessanti al livello 3.

E questo è ASM, C, e uno script a vostra scelta, il mio preferito oggi sarebbe Lua. Ogni passo da uno al livello successivo rende il vostro programma più lento da L1 a L2 del 50% al fattore 5. Da L2 a L3 dal fattore 5 al fattore 10k, se sta andando in un database o qualcosa del genere. Ed è per questo che non si fa qualcosa di reale su L3.

E provate Gambas. Scrivi ai tuoi amici un bel biglietto d'auguri per le vacanze con quello! Hai ancora qualche ora a disposizione e questo è sufficiente per Gambas.

Oh, e non ho menzionato Java e C#. Perché entrambi i concetti sono semplicemente malati. Non toccate quella merda. Non avvicinatevi, è tossico.