Apple

Désenchantement logiciel @ tonsky.me

Par Maximus , le 9 juin 2019 - 19 minutes de lecture

Traductions: Français Italien Portugais Russe Espagnol

Je programme depuis 15 ans maintenant. Récemment, le manque d’attention portée par notre industrie à l’efficacité, à la simplicité et à l’excellence a commencé à me prendre vraiment au sérieux, au point de devenir déprimé par ma propre carrière et par l’informatique en général.

Pour l’argumentation, les voitures modernes fonctionnent à 98% de ce qui est physiquement possible avec la conception actuelle du moteur. Les bâtiments modernes utilisent juste assez de matériaux pour remplir leur fonction et rester en sécurité dans les conditions données. Tous les plans ont convergé vers la taille / forme / charge optimale et se ressemblent en gros.

Uniquement dans le logiciel, tout va bien si un programme tourne à 1%, voire à 0,01% des performances possibles. Tout le monde semble être d'accord avec ça. Les gens sont souvent même fiers de son inefficacité, comme dans «Pourquoi devrions-nous nous inquiéter, les ordinateurs sont assez rapides»:

@tveastman: J'ai un programme Python que je lance tous les jours, cela prend 1,5 seconde. J'ai passé six heures à le réécrire avec la rouille. Cela prend maintenant 0,06 seconde. Cette amélioration de l’efficacité signifie que je gagnerai du temps dans 41 ans et 24 jours 🙂

Vous avez probablement entendu ce mantra: "le temps du programmeur coûte plus cher que le temps de l’ordinateur". Cela signifie essentiellement que nous gaspillons des ordinateurs à une échelle sans précédent. Achèteriez-vous une voiture si elle mange 100 litres par 100 kilomètres? Que diriez-vous de 1000 litres? Avec les ordinateurs, nous le faisons tout le temps.

Tout est insupportablement lent

Regardez autour de vous: nos ordinateurs portables sont des milliers de fois plus puissants que ceux qui ont amené l'homme sur la lune. Pourtant, toutes les autres pages Web ont du mal à maintenir un défilement régulier à 60 ips sur le dernier MacBook Pro haut de gamme. Je peux jouer confortablement à des jeux, regarder des vidéos 4K mais pas faire défiler des pages Web? Comment ça va?

Google Inbox, une application Web créée par Google et s'exécutant dans un navigateur Chrome également par Google, prend 13 secondes pour ouvrir des emails de taille moyenne:

Il anime également les zones blanches vides au lieu d’afficher leur contenu car c’est le seul moyen d’animer tout sur une page Web avec des performances décentes. Non, décent ne veut pas dire 60 images par seconde, c’est plutôt «aussi vite que cette page Web pourrait éventuellement aller». Je meurs d'envie de voir la communauté Web réagir lorsque les écrans 120Hz deviennent courants. La merde atteint à peine 60Hz déjà.

Windows 10 prend 30 minutes pour mettre à jour. Que pourrait-il être en train de faire pendant si longtemps? Ce temps est suffisant pour formater complètement mon lecteur SSD, télécharger une nouvelle version et l’installer 5 fois de suite.

Pavel Fatin: La frappe dans l’éditeur est un processus relativement simple, de sorte que même 286 PC ont été en mesure de fournir une expérience de frappe relativement fluide.

Les éditeurs de texte modernes ont une latence supérieure à celle d'Emacs, âgé de 42 ans. Editeurs de texte! Qu'est-ce qui peut être plus simple? À chaque frappe, il vous suffit de mettre à jour une petite région rectangulaire. Les éditeurs de texte modernes ne peuvent pas le faire en 16 ms. C’est beaucoup de temps. BEAUCOUP. Un jeu en 3D peut remplir tout l'écran avec des centaines de milliers (!!!) de polygones dans les mêmes 16 ms et également traiter les entrées, recalculer le monde et charger / décharger dynamiquement les ressources. Comment venir?

En règle générale, nous n’avons pas de logiciel plus rapide avec plus de fonctionnalités. Nous obtenons un matériel plus rapide qui exécute un logiciel plus lent avec les mêmes fonctionnalités. Tout fonctionne bien en dessous de la vitesse possible. Vous êtes-vous déjà demandé pourquoi votre téléphone a besoin de 30 à 60 secondes pour démarrer? Pourquoi ne peut-il pas démarrer, disons, en une seconde? Il n'y a pas de limite physique à cela. J'aimerais voir ça. J'adorerais voir les limites atteintes et explorées, en utilisant toutes les dernières performances possibles pour obtenir quelque chose de significatif et significatif.

Tout est HUUUUGE

Et puis il y a le ballonnement. Les applications Web peuvent s'ouvrir jusqu'à 10 × plus rapidement si vous bloquez simplement toutes les annonces. Google prie tout le monde de cesser de se prendre dans les pieds avec l'initiative AMP, une solution technologique à un problème qui ne nécessite aucune technologie, mais un peu de bon sens. Si vous supprimez bloat, le web devient vite fou. À quel point devez-vous être intelligent pour comprendre cela?

Système Android sans applications prend presque 6 Go. Imaginez une seconde à quel point ce chiffre est énormément ÉNORMES. Qu'y a-t-il dedans, les films HD? Je suppose qu’il s’agit essentiellement de code: noyau, pilotes. Quelques chaînes et ressources aussi, bien sûr, mais celles-ci ne peuvent pas être grandes. Alors, combien de pilotes avez-vous besoin pour un téléphone?

Windows 95 faisait 30 Mo. Aujourd'hui, nous avons des pages Web plus lourdes que cela! Windows 10 est 4 Go, ce qui est 133 fois plus grand. Mais est-il 133 fois supérieur? Je veux dire, fonctionnellement, ils sont fondamentalement les mêmes. Oui, nous avons Cortana, mais je doute que cela prenne 3970 Mo. Mais quel que soit Windows 10, Android est-il vraiment à 150%?

L'application clavier Google mange régulièrement 150 Mo. Une application qui dessine 30 touches sur un écran est-elle vraiment cinq fois plus complexe que l'ensemble de Windows 95? L’application Google, qui n’est fondamentalement qu’un package pour la recherche sur le Web Google, représente 350 Mo! Services Google Play, que je n'utilise pas (je n'achète pas de livres, de musique ou de vidéos sur place) – 300 Mo restés inutilisés et que je ne parviens pas à supprimer.

Tout cela me laisse environ 1 Go pour mes photos après avoir installé toutes les applications essentielles (réseaux sociaux, chats, cartes, taxi, banques, etc.). Et c’est sans jeux ni musique du tout! Vous souvenez-vous des moments où un système d'exploitation, des applications et toutes vos données tiennent sur une disquette?

Votre application de bureau est probablement écrite en Electron et contient donc un pilote d’utilisateur pour le contrôleur Xbox 360, elle peut restituer des graphiques en 3D, lire de l’audio et prendre des photos avec votre caméra Web.

Une simple conversation par texte est réputée pour sa vitesse de chargement et sa consommation de mémoire. Oui, vous devez vraiment compter Slack dans les applications gourmandes en ressources. Je veux dire, chatroom et éditeur de texte barebones, ceux-ci sont censés être deux des applications les moins exigeantes du monde entier. Bienvenue en 2018.

Au moins ça marche, pourrait-on dire. Eh bien, plus gros ne veut pas dire mieux. Plus gros signifie que quelqu'un a perdu le contrôle. Plus gros signifie que nous ne savons pas ce qui se passe. Plus gros signifie taxe de complexité, taxe de performance, taxe de fiabilité. Ce n'est pas la norme et ne devrait pas devenir la norme. Les applications en surpoids devraient signifier un drapeau rouge. Ils devraient vouloir dire fuir effrayé.

Tout pourrit

Le téléphone Android de 16 Go fonctionnait parfaitement bien il y a 3 ans. Aujourd'hui, avec Android 8.1, il est à peine utilisable, car chaque application est devenue au moins deux fois plus grande. sans raison apparente. Il n'y a pas de fonctions supplémentaires. Ils ne sont pas plus rapides ni plus optimisés. Ils ne semblent pas différents. Ils ont juste… grandi?

iPhone 4s est sorti avec iOS 5, mais peut à peine fonctionner avec iOS 9. Et ce n’est pas parce qu’iOS 9 est vraiment supérieur, c’est fondamentalement le même. Mais leur nouveau matériel est plus rapide, ils ont donc rendu le logiciel plus lent. Ne vous inquiétez pas, vous disposez de nouvelles fonctionnalités intéressantes telles que… exécuter les mêmes applications à la même vitesse! Je ne sais pas.

iOS 11 a abandonné la prise en charge des applications 32 bits. Cela signifie que si le développeur n’est pas présent au moment de la sortie de la version iOS 11 ou ne souhaite pas revenir en arrière et mettre à jour une application à la perfection, il est fort probable que vous ne la verrez plus jamais.

@jckarter: Un programme DOS peut être conçu pour fonctionner sans modification sur pratiquement tous les ordinateurs fabriqués depuis les années 80. Une application JavaScript pourrait rompre avec la mise à jour Chrome de demain

Les pages Web fonctionnant aujourd'hui ne seraient compatibles avec aucun navigateur dans 10 ans (probablement plus tôt).

«Il faut tout ce que vous pouvez faire pour rester au même endroit». Mais à quoi ça sert? J'apprécie peut-être à l'occasion d'acheter un nouveau téléphone et un nouveau MacBook autant que le prochain, mais le faire simplement pour pouvoir exécuter les mêmes applications qui sont devenues plus lentes?

Je pense que nous pouvons et devrions faire mieux que cela. Tout le monde est occupé à construire des choses pour le moment, aujourd'hui, rarement pour demain. Mais ce serait bien d’avoir aussi des choses qui durent un peu plus longtemps que ça.

Pire c'est mieux

Personne ne comprend rien à ce stade. Ils ne veulent pas non plus. Nous jetons juste de la merde à peine cuite là-bas, espérons le meilleur et appelons cela «sagesse de démarrage».

Les pages Web vous demandent d'actualiser si quelque chose ne va pas. Qui a le temps de comprendre ce qui s'est passé?

Toute application Web génère un flux constant d’erreurs JS «aléatoires» dans la nature, même sur des navigateurs compatibles.

L’ensemble de l’architecture de la page Web / base de données SQL repose sur la prémisse (espoir, même) que personne ne touchera vos données lorsque vous consulterez la page Web affichée.

La plupart des implémentations collaboratives sont «au mieux» et comportent de nombreux scénarios de vie commune dans lesquels elles perdent des données. Vous avez déjà vu ce dialogue "quelle version garder?" Je veux dire, la barre aujourd'hui est si basse que vos utilisateurs seraient heureux d'avoir au moins une fenêtre comme celle-là.

Et non, dans mon application mondiale qui dit "Je vais détruire une partie de votre travail, mais vous devez choisir lequel" n'est pas acceptable.

Linux tue les processus aléatoires intentionnellement. Et pourtant, c’est le système d’exploitation côté serveur le plus populaire.

Chaque appareil que je possède échoue régulièrement, d’une manière ou d’une autre. Mon moniteur Dell doit être redémarré de temps en temps car il contient un logiciel. Airdrop? Vous avez de la chance si votre appareil est détecté, sinon, que dois-je faire? Bluetooth? La spécification est si complexe que les appareils ne se parlent pas et des réinitialisations périodiques sont la meilleure solution.

Et je ne touche même pas Internet des objets. C’est tellement loin du rire que je ne sais même pas quoi ajouter.

Je veux être fier de mon travail. Je veux livrer des choses qui fonctionnent et qui sont stables. Pour ce faire, nous devons comprendre ce que nous construisons et ce qu’il est en train de construire, et c’est impossible à faire avec des systèmes surélevés et surdimensionnés.

La programmation est le même désordre

Il semble simplement que personne ne s'intéresse plus à la qualité de la construction, à la rapidité, à l'efficacité, à la durabilité et aux fondements. Même lorsque des solutions efficaces sont connues depuis des siècles, nous sommes toujours aux prises avec les mêmes problèmes: gestion de paquets, systèmes de compilation, compilateurs, conception de langage, IDE.

Les systèmes de compilation sont intrinsèquement peu fiables et nécessitent périodiquement un nettoyage complet, même si toutes les informations relatives à l'invalidation sont présentes. Rien ne nous empêche de rendre le processus de construction fiable, prévisible et reproductible à 100%. Personne ne pense que c'est important. NPM est resté dans l’état «parfois fonctionne» pendant des années.

@przemyslawdabek: Il me semble que rm -rf node_modules est un élément indispensable du flux de travail lors du développement de projets Node.js / JavaScript.

Et des temps de construction? Personne ne pense que le compilateur qui travaille minutes ou même heures est un problème. Qu'est-il arrivé à «le temps du programmeur est plus important»? Presque tous les compilateurs, pré et post-processeurs, ajoutent une taxe de temps significative, parfois désastreuse, à votre construction sans fournir d’avantages proportionnellement substantiels.

Vous vous attendriez à ce que les programmeurs prennent des décisions généralement rationnelles, mais parfois, ils font exactement le contraire. Par exemple. choisir Hadoop même s’il est plus lent que d’exécuter la même tâche sur un seul poste de travail.

L'apprentissage automatique et l '«IA» ont poussé les logiciels à deviner à l'époque où la plupart des ordinateurs n'étaient même pas assez fiables.

@rakhim: Quand une application ou un service est décrit comme «alimenté par l'IA» ou «basé sur ML», je le lis comme «peu fiable, imprévisible et impossible à raisonner à propos du comportement». J'essaie d'éviter l'IA parce que je veux que les ordinateurs soient le contraire: fiable, prévisible, raisonnable.

Nous plaçons les machines virtuelles dans Linux, puis Docker dans des machines virtuelles, tout simplement parce que personne n'a été en mesure de nettoyer les dégâts causés par la plupart des programmes, des langages et de leur environnement. Nous couvrons la merde de couvertures pour ne pas nous en occuper. «Single binary» est toujours un argument de vente énorme pour Go, par exemple. Pas de gâchis == succès.

Et des dépendances? Les gens ajoutent facilement des «solutions globales» surdimensionnées pour résoudre les problèmes les plus simples sans prendre en compte leurs coûts. Et ces dépendances apportent d'autres dépendances. Vous vous retrouvez avec un arbre qui est quelque chose entre l’histoire d’horreur (OMG si grand et plein de conflits) et la comédie (il n’ya aucune raison de les inclure, mais les voici):

Les programmes ne peuvent plus fonctionner pendant des années sans redémarrage. Parfois, même les jours sont trop demander. Il se passe des choses au hasard et personne ne sait pourquoi.

Pire encore, personne n’a le temps de s’arrêter pour comprendre ce qui s’est passé. Pourquoi se donner la peine si vous pouvez toujours vous en sortir? Faites tourner une autre instance AWS. Processus de redémarrage. Déposer et restaurer la base de données entière. Écrivez un chien de garde qui redémarrera votre application endommagée toutes les 20 minutes. Inclure les mêmes ressources plusieurs fois, zip et expédier. Déplacez-vous vite, ne corrigez pas.

Ce n'est pas de l'ingénierie. C’est juste une programmation paresseuse. L'ingénierie, c'est comprendre la performance, la structure, les limites de ce que vous construisez, profondément. Combiner des choses mal écrites avec des choses plus mal écrites va strictement à l'encontre de cela. Pour progresser, nous devons comprendre ce que nous faisons et pourquoi.

Nous sommes coincés avec

Donc, tout n’est qu’un tas de code à peine fonctionnel ajouté au code à peine écrit précédemment. Il continue de croître en taille et en complexité, diminuant toute chance de changement.

Pour avoir un écosystème sain, vous avoir besoin revenir en arrière et revenir. Vous avoir besoin jeter de temps en temps des choses et les remplacer par de meilleures choses.

Mais qui a le temps pour ça? Nous n’avons pas vu de nouveaux noyaux OS depuis 25 ans? C’est trop compliqué d’écrire simplement maintenant. Les navigateurs sont tellement remplis de cas extrêmes et de précédents historiques que personne n’ose plus écrire le moteur de présentation à partir de rien.

La définition actuelle du progrès est soit de jeter plus de carburant au feu:

@sahrizv: 2014 – Nous devons adopter #microservices pour résoudre tous les problèmes liés aux monolithes.
2016 – Nous devons adopter #docker pour résoudre tous les problèmes de microservices.
2018 – Nous devons adopter #kubernetes pour résoudre tous les problèmes avec docker

ou réinventer la roue:

@ dr_c0d3: 2000: écrivez des centaines de lignes de code XML pour configurer «de manière déclarative» vos servlets et vos EJB.
2018: écrivez des centaines de lignes de YAML pour configurer «de manière déclarative» vos microservices.
Au moins XML avait des schémas…

Nous sommes coincés avec ce que nous avons et personne ne nous sauvera jamais.

Les entreprises s'en moquent

Les utilisateurs non plus. Ils sont seulement appris à attendre de ce que nous pouvons fournir. Nous (ingénieurs) disons que chaque application Android prend 350 Mo? Ok, ils vont vivre avec ça. Nous disons que nous ne pouvons pas leur donner un défilement régulier? Ok, ils vivront avec un téléphone qui bégaie. Nous disons «si cela ne fonctionne pas, redémarrez»? Ils vont redémarrer. Après tout, ils n'ont pas le choix.

Il n’ya pas de concurrence non plus. Tout le monde construit les mêmes produits lents, gonflés et peu fiables. Des sauts occasionnels dans la qualité apportent un avantage concurrentiel (iPhone / iOS par rapport aux autres smartphones, Chrome par rapport aux autres navigateurs) et obligent tout le monde à se regrouper, mais pas pour longtemps.

En tant qu’ingénieurs, nous avons donc pour mission de montrer au monde ce qui est possible avec les ordinateurs d’aujourd’hui en termes de performances, de fiabilité, de qualité et de convivialité. Si nous nous en soucions, les gens vont apprendre. Et il n’ya personne d’autre que nous pour leur montrer que c’est vraiment possible. Si seulement nous nous en soucions.

Ce n’est pas tout mauvais

Certains points lumineux indiquent qu'il n'est pas impossible d'améliorer les technologies les plus avancées.

Travail Martin Thompson a être en train de faire (LMAX Disruptor, SBE, Aeron) est impressionnant, simple et efficace.

Xi editor de Raph Levien semble avoir été construit avec les bons principes à l’esprit.

Pour son jeu, Jonathan Blow a développé un langage qu'il est le seul à pouvoir compiler 500 000 lignes par seconde sur son ordinateur portable. C’est une compilation à froid, pas de cache intermédiaire, pas de builds incrémentiels.

Il n’est pas nécessaire d’être un génie pour écrire des programmes rapides. Il n’ya pas de tour de magie. La seule chose requise est de ne pas construire sur une énorme pile de merde qu'est la chaîne d'outils moderne.

Meilleur monde manifeste

Je veux voir des progrès. Je veux changer. Je souhaite améliorer les technologies de pointe en matière de génie logiciel, pas seulement rester immobile. Je ne veux pas réinventer la même chose encore et encore, moins performante et plus gonflée à chaque fois. Je veux quelque chose en quoi croire, un objectif louable, un avenir meilleur que celui d’aujourd’hui, et une communauté d’ingénieurs partageant cette vision.

Ce que nous avons aujourd'hui n'est pas un progrès. Nous atteignons à peine les objectifs de l’entreprise avec des outils de qualité médiocre. Nous sommes coincés dans les optima locaux et personne ne veut sortir. Ce n’est même pas un bon endroit, il est gonflé et inefficace. Nous nous sommes simplement habitués.

Donc, je veux l'appeler: où nous en sommes aujourd'hui, c'est des conneries. En tant qu’ingénieurs, nous pouvons, nous devrions et nous ferons mieux. Nous pouvons avoir de meilleurs outils, nous pouvons créer de meilleures applications, plus rapides, plus prévisibles, plus fiables, en utilisant moins de ressources (moins de ordres de grandeur!). Nous devons comprendre profondément ce que nous faisons et pourquoi. Nous devons livrer de manière fiable, prévisible et de la plus haute qualité. Nous pouvons – et devrions – être fiers de notre travail. Pas seulement “étant donné ce que nous avions…” – pas de mais!

J'espère que je ne suis pas seul à ça. J'espère qu'il y a des gens qui veulent faire la même chose. J'apprécierais que nous commencions au moins à parler de l'absurdité de notre situation actuelle dans l'industrie du logiciel. Et ensuite, nous trouverons peut-être un moyen de sortir.

Salut!

Je suis Nikita. Ici, j'écris sur la programmation et la conception d'interface utilisateur Souscrire

Je crée aussi du matériel open-source: Fira Code, AnyBar, DataScript et Rum. Si vous aimez ce que je fais et souhaitez accéder rapidement à mes articles (ainsi qu'à d'autres avantages), vous devez me soutenir sur Patreon.

Click to rate this post!
[Total: 0 Average: 0]

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.