Quali linguaggi di programmazione dovrebbe conoscere ogni ingegnere del software?

Ovviamente non pratico, ma se non altro per essere "utile", la maggior parte delle università dovrebbe insegnare entrambi: linguaggio assembly e Java ... ecco perché.

Assembly - Saresti costretto a imparare e capire l'architettura hardware sottostante. Farebbe apprezzare alla maggior parte dei programmatori quanto sia preziosa la memoria (sì, anche oggi), il costo delle operazioni di I/O, IRQ, IPC, compiti e thread, commutazione di contesto, stack, registri e come pensare e organizzare il proprio codice.

Vedo sviluppatori junior in questi giorni uscire dalla scuola e fare cose stupide ... eccone solo alcune:

  1. Generano un thread su richiesta per lavori. Non essendo consapevoli dell'overhead e delle complessità che introducono quando si fa IPC. Quando chiedo loro dei pool di thread (e del riutilizzo dei thread), ottengo uno sguardo vuoto come "Conosco il concetto, ma dove, come, perché????".
  2. Fanno costantemente I/O in modo bloccante (sync). Nessuna reale comprensione dell'I/O non bloccato (async) e di come gestirlo e degli eventi futuri.
  3. Cercare di leggere un file in memoria in una volta sola piuttosto che progressivamente. Ho anche visto qualcuno provare a leggere/manipolare un file da 1 GB in memoria. Quando chiedo loro dei file in memoria mappata, non hanno la minima idea di cosa stessi parlando.

Con un corso di linguaggio assembly e la pratica pratica pratica, imparerebbero praticamente tutto quanto sopra e molto di più. In particolare, cercherei di fargli imparare l'assembly per un Kernel/OS, che coprirebbe gli argomenti che ho elencato sopra.

Java - Allora perché Java? Ecco il mio punto di vista su Java (e ho dei dati per sostenerlo, ma non ci entrerò perché non è lo scopo qui).

Se leggete la storia di Java, è stato fondamentalmente detto che i suoi creatori/progettisti (che erano estremamente esperti in altri linguaggi OO) volevano creare un linguaggio OO con tutte le migliori caratteristiche e benefici di altri (alcuni obsoleti) linguaggi di programmazione OO, mentre rimuovevano (o almeno provavano, con altri mezzi) tutte le cose che di solito creano grandi problemi e problemi.

Per esempio, penso che C++ sia un linguaggio incredibile... MA, è MOLTO troppo potente. Più e più volte ho visto persone darsi la zappa sui piedi per questo motivo. Quindi, dato che è incredibile, quando lo usavo nei miei progetti, NON permettevo ai miei programmatori di fare un sacco di cose che creavano caos, confusione o problemi lungo la linea. Per me, questo ha avuto successo.

Java è stato progettato esattamente con questo in mente. Rimuove molte delle stronzate che altri linguaggi permettono di fare. Per esempio, Java sarà criticato per essere autorizzato ad avere una sola ereditarietà. Questo è per costringervi e pensare effettivamente alla vostra architettura. Devo ammettere che il più delle volte è difficile. Ma se tu facessi lo stesso progetto in C++, i tuoi programmatori erediterebbero da una dozzina di altre classi (così semplice, problema risolto). Ma questo è un problema ENORME. Architettonicamente, è più che probabile che tu NON debba ereditare da quelle 12 altre classi, ma piuttosto solo da alcune. Quindi Java ti costringe a pensare.

Molte delle cose che Java non ha è per progettazione. Anche alcune delle limitazioni sono dovute al design. Credo che i creatori di Java abbiano avuto molto successo nella loro intenzione. Alcune persone si lamenteranno, ma di solito è perché vogliono solo il modo più facile e non "pensare" nel modo giusto.

Per questo motivo penso che Java sia uno dei migliori linguaggi di programmazione là fuori e non ha rivali. E per questo motivo, i programmatori dovrebbero impararlo. Usandolo, di solito saranno costretti a programmare nel modo giusto. Non solo avere il potere di fare assolutamente qualsiasi cosa come permette il C++.