Que doivent savoir les ingénieurs logiciels ?


Les langages ne sont que des outils pour exprimer les choses plus importantes qui se trouvent en dessous de tout cela : les algorithmes.

Donc, vous apprenez toujours des algorithmes et ceux-ci sont des moyens indépendants du langage pour résoudre les problèmes.


Il existe trois niveaux de langages

  1. niveau machine ("Assembly", "GPU/OpenCL", "FPGA/Verilog")
  2. niveau implémentation portable, langages compilés ("C")
  3. langages de haut niveau "HLL" langages de script ("Python", "Java", "Haskell", "Lisp", "Basic", ....)

Tout le travail est fait au niveau 2, alors que beaucoup de choses ne peuvent être faites efficacement qu'au niveau machine et chaque boucle primitive devrait être vérifiée si elle ne serait pas mieux implémentée à ce niveau.


Il y a deux mèmes (mensonges) nuisibles qui circulent : "les compilateurs font un meilleur code que l'humain" et "HLL doit être fait en HLL".

Les deux sont simples à prouver faux et étant des mensonges nuisibles. Le niveau machine est toujours plus rapide que ce qu'un compilateur fait pour nous. Parce que

a) nous pouvons en tant qu'humains regarder la sortie du compilateur et l'optimiser.

b) le compilateur n'utilise qu'environ 20% du jeu d'instructions de nos processeurs, le reste n'est pas utilisé du tout mais fournit des solutions très très rapides, au niveau matériel, à des problèmes courants. Exemple simple : aucun langage HLL ou compilateur ne connaît le drapeau "carry". Additionner des nombres sur plusieurs colonnes en Assembleur est une chose très simple avec ce drapeau, en C vous devriez jeter un coup d'œil à l'incroyable athlétisme que le langage doit faire pour obtenir l'information si un débordement ("carry") s'est produit ou non.

Dire à un ingénieur qu'il n'est pas important pour lui de connaître sa machine est considéré comme nuisible. Vous ne mettrez pas un pied dans une voiture qui a été construite par de tels ingénieurs, n'est-ce pas ? Je ne le ferai pas. Et je ne veux pas d'un ordinateur qui a été construit par le même genre d'ignorants nuisibles.

Ingénieur, connaissez votre moteur.

Donc, toute la mise en œuvre se fera au niveau 1 et 2. Et donc vous devez connaître ces deux langages, qui est généralement l'Assemblée de votre machine et C. Il n'y a tout simplement pas d'autre langage qui peut faire ce que C fait.

Le troisième niveau de HLL est un langage de script d'appel. Vous utilisez ce niveau pour la configuration et le flux de données, de sorte que si vous avez des changements mineurs sur votre projet, vous n'avez pas besoin de tout recompiler et vous pouvez expédier votre produit compilé à un client, sans qu'il ait besoin de tout l'environnement de développement.

Des exemples typiques sont par exemple une feuille de calcul. Cette chose a un langage de niveau application (API) pour programmer vos feuilles, mais le programme lui-même est fait en C et si vous regardez LibreOffice, ils vont mettre le calcul sur votre GPU à travers OpenCL et utiliseront efficacement votre matériel.

Prolog est un tel langage, aussi. Prolog est le langage d'interface pour un solveur logique. Et avec cela, toutes les HLL ne sont que des scripts de niveau API. Vous ne devez pas implémenter de vrais trucs à ce niveau, mais vous l'utilisez bien sûr quotidiennement.

Et ces langages changent rapidement et il y en a pléthore autour. Parce que chaque application, chaque problème autour d'un noyau d'algorithmes vont évoluer leurs propres langages. Lisp évolue autour d'un moteur de manipulation de listes et ainsi de suite.

Et puis il y a les décadents, les langages de script "universels", qui proclament pouvoir implémenter des trucs en soi. Toute cette idée est malsaine, de mon point de vue, et je n'en vois pas le sens. Mais Pascal était un tel langage, Modula-2 l'était, Python, Ruby, Java, C# sont des langages comme ça.

Avec Java et C# qui gravissent une autre montagne de stupidité, encore plus haute, pour produire du code complètement virtualisé. Qui finit par être plus dépendant de la plateforme qu'autre chose, sans en récolter les bénéfices.

Plus ces langages sont élevés, plus il devient difficile d'étendre leur syntaxe, leur corps de routines de bibliothèque dans de vrais langages comme le C. Lua est l'exemple parfait d'un bon langage de script. Vous n'implémentez rien dans Lua, vous utilisez le corps de bibliothèque de là et vous pouvez facilement, très facilement l'étendre et il est très petit, avec seulement 100 kb et presque pas de surcharge.

Basic était là autrefois, très petit, très rapide, simple. Mais son but était de fournir une interface de programmation facile pour les débutants. Et cela, il le fait encore aujourd'hui, parfaitement. Basic est toujours là pour vous. (Recherchez Gambas Almost Means Basic). Deux minutes à partir de rien pour obtenir un chronomètre graphique sur votre écran, une pression sur un bouton pour le partager avec la communauté. C'est ce que j'appelle la convivialité pour les débutants.

Alors, quels langages sont importants pour vous ?

ASM, C, Lua. Je considère ces trois-là comme l'épine dorsale.

Basic, le langage de débutant pour beaucoup. Vous devriez juste une fois l'avoir appris, car tout le monde peut comprendre le Basic.

Python, un bon langage prototype dans votre portefeuille. Vous pouvez hacker très rapidement un problème en Python. C'est ass-slow et va monopoliser votre mémoire, mais il n'est pas là pour être un langage d'implémentation. Vous devriez être capable de lire cela, car beaucoup de gens l'utilisent en ce moment. Et vous voulez pouvoir récupérer leurs solutions à la casse et lire leurs exemples pour débutants.

Vous devriez connaître les langages de mise en forme de texte typiques, en premier lieu le HTML. Mais n'oubliez pas LaTeX, qui est destiné à l'écriture de la documentation et vous ne regardez plus jamais un Word ou autre après cela, puis pour écrire des manuels, vous devez connaître Roff, Groff ou autre. C'est vraiment important si vous écrivez des manuels, même si vous les écrivez pour vous-même.

Je tape juste "man serial" ou "man compiling" ou "man firewall" et j'obtiens toutes les notes que j'ai collectées et les petites astuces. Et avec ce processus universel, vous pouvez documenter tout ce que vous faites sur votre ordinateur et trouvé et le sauvegarder pour votre futur moi. Ou pour le partager avec une communauté. Si vous vous intéressez aux langages de traitement de texte, jetez un coup d'œil à Postscript. C'est juste méga-cool.

Sagesse vivante, connaissance vivante. Les langages rendent la connaissance vivante.

La prochaine chose que vous devez savoir, si vous écrivez des applications web, c'est le langage browser-API JavaScript. Vous en avez besoin pour HTML5. Pas un langage important en soi, très spécifique dans son utilisation et qui va très probablement disparaître ou changer radicalement quelque part bientôt.

Webassembly fait déjà pression sur ce front. Oui, je sais, langage à croissance rapide, yadda, yadda. C'est l'API du navigateur. Si vous êtes un programmeur web, alors "connaître sa machine" signifie connaître JavaScript et Webasm. Mais vous ne faites rien de réel là-dedans.

Si vous n'êtes pas un programmeur web, vous pouvez ignorer cette chose. Aucune importance en dehors de la programmation frontale web.

Le prochain langage important dans votre portefeuille devrait être SQL. Si vous apprenez Postgres SQL ou MySql SQL ou SQLite, n'est pas important. Pour la programmation d'applications, SQLite sera votre compagnon. La plupart des serveurs web ont MySQL en cours d'exécution et si vous travaillez avec Python/Django et faites cela vous-même, ce serait très probablement Postgres.

Postgres est la base de données la plus avancée (et la plus gratuite) que vous pouvez choisir. SQLite est de loin le plus rapide. Donc si vous n'avez pas besoin d'une connexion de données par pile IP, optez pour SQLite. Mais quoi que vous fassiez : SQL est le langage que vous devez apprendre. C'est LE langage de base de données. Il y en a d'autres autour, mais si vous devez les faire, vous serez payé pour cela, même pour votre éducation pour cela.

Mais connaissez SQL. Vraiment. Vous ne pouvez pas éviter cela aujourd'hui.

Et avec les nombreuses applications, il y aura un grand nombre de langages que vous devrez apprendre. J'ai toujours trouvé bon de connaître Maxima / wxMaxima parce que les mathématiques symboliques sont quelque chose, un informaticien a besoin sur une base régulière. Et avec cela vient un autre langage, bien sûr.

Et ensuite : le shell et les langages de ligne de commande typiques.

Connaissez Bash, mais visez Zsh pour cela, connaissez Awk, Perl, Bison, Flex, si vous êtes dans la construction de compilateurs ou écrivez des parsers d'une manière ou d'une autre, Grep, Ack, et bien sûr les commandes mathématiques Bc, Dc, le tableur orienté texte Sc.

Pour le travail de développement, vous devez connaître le langage de linker de Ld, Nm, Radare2, et les nombreux outils de build-essential qui viennent souvent avec leur propre ensemble de langage, comme bien sûr Make comme le plus important.

Tous ces projets ont leurs propres langages et leur propre syntaxe avec eux, si vous allez sur un niveau de compréhension plus profond. Il suffit de lire sur les linker-scripts si vous voulez.

Conclusion

Donc après avoir fait les langages de base, vous devrez vous orienter vers la résolution de problèmes. Et sur ce chemin, il est naturel d'apprendre les langages d'interface dont vous avez besoin pour cette tâche. Et ce sera un grand nombre.

Vous cesserez de les compter à un moment donné et verrez la nature de ce qu'ils sont : Des bidules de niveau API qui viennent avec le corps de l'application. Ils changeront et grandiront et vous vous amuserez à les apprendre

Sinon : changez de domaine. Il n'y a aucun moyen de contourner cela en informatique. Vous devez apprendre beaucoup, vraiment beaucoup de langages et si vous y arrivez, vous avez de la chance. Si vous ne le faites pas, vous avez un travail ennuyeux et vous faites toute la journée les mêmes choses dans un seul langage. C'est comme travailler à une chaîne de montage du début des années 20. Cela va nuire à votre esprit.

Et si c'est vraiment mauvais, vous grandissez pour devenir un fanboï de HLL, qui n'est pas capable de regarder au-delà de l'horizon de son petit langage de niveau API et de voir que le monde est tellement plus grand que cela, tellement plus grand que le petit ensemble de routines de corps d'application dont il est le roi. Et tellement plus riche et plus beau.

Sautez autant de niveaux de script que vous le souhaitez. Passez-les ou faites-les un temps, mais ne vous arrêtez pas là, passez à autre chose si vous avez appris quelque chose de leurs concepts. Mais connaissez toujours votre machine, connaissez toujours les bases. Déplacez ce que vous faites au niveau du script vers le niveau 2, lorsque cela devient intéressant. Ne faites pas les choses intéressantes au niveau 3.

Et c'est ASM, C, et un script de votre choix, mon préféré du jour serait Lua. Chaque étape d'un niveau à l'autre rend votre programme plus lent de L1 à L2 de 50% à un facteur 5. De L2 à L3 par un facteur 5 à un facteur 10k, s'il va dans une base de données ou quelque chose comme ça. Et c'est pourquoi vous ne faites pas quelque chose pour de vrai sur L3.

Et essayez Gambas. Écrivez à vos amis une jolie petite carte de vacances avec ça ! Il vous reste encore quelques heures et c'est suffisant pour Gambas.

Oh, et je n'ai pas mentionné Java et C#. Parce que ces deux concepts sont juste malades. Ne touchez pas à cette merde. Ne vous en approchez pas, c'est toxique.