Jeffrey Snover raconte le développement de PowerShell
(corecursive.com)- Jeffrey Snover a porté PowerShell pour faire de Windows un OS serveur administrable en ligne de commande, et a dû surmonter la culture Microsoft centrée sur l’interface graphique ainsi que les résistances organisationnelles
- Les premiers portages d’outils UNIX n’ont pas résolu le problème de l’administration serveur, car Windows reposait sur des API comme le Registry, Active Directory et WMI plutôt que sur des fichiers
- Après avoir créé 70 commandes basées sur WMI dans WMIC, il a réorienté le projet vers un moteur de génération de commandes fondé sur des métadonnées afin de réduire les goulets d’étranglement et les coûts liés aux tests
- Monad, le prédécesseur de PowerShell, a démarré dans le sillage de .NET et Longhorn, mais a été écarté de Windows après la réinitialisation de Longhorn, avant d’être relancé grâce au soutien de l’équipe Exchange et de l’organisation Windows Server
- Snover a accepté une perte de rang et de rémunération pour se concentrer sur PowerShell 1 à 4, et cet outil est devenu la base de l’automatisation de l’administration Windows et de la transition d’Office vers le cloud
Un Windows centré sur l’interface graphique et le problème de l’administration des datacenters
- PowerShell a été un outil en ligne de commande qui a transformé l’administration des systèmes Windows, mais en interne chez Microsoft, le projet n’a pas été naturellement accepté dès le départ
- À l’époque, la culture Microsoft était centrée sur l’interface graphique, et l’interface en ligne de commande était considérée comme dépassée, au point qu’une anecdote raconte que Bill Gates aurait dit que
command.exeserait la dernière qu’il verrait - Le point de départ de Snover chez Microsoft était la conviction qu’il fallait adapter les OS basés sur Windows NT au marché des datacenters et des entreprises
- L’objectif était de concurrencer les fournisseurs UNIX comme Sun, IBM et HP
- Intel et l’écosystème matériel ouvert offraient un avantage en matière de coûts, mais les logiciels d’administration serveur n’étaient pas assez bons
Un modèle d’administrateur réduisant la dépendance aux intégrateurs système
- L’administration des serveurs Windows exigeait de configurer de nombreux serveurs à coups de clics, et comme chaque entreprise avait besoin de configurations différentes, la dépendance aux intégrateurs système pouvait fortement augmenter
- Snover estimait que si les coûts d’intégration système devenaient trop élevés, l’avantage prix de Windows disparaîtrait
- Il donnait l’exemple d’une structure de coûts avec 10 pour le matériel, 2 pour le logiciel et 40 pour l’intégrateur système
- Le fait que la relation client et la valeur passent aux intégrateurs posait aussi problème
- L’alternative était le modèle UNIX de l’administrateur programmeur
- Il s’agit de combiner de petits outils pour résoudre des problèmes spécifiques et automatiser les tâches
- Windows avait besoin non pas seulement “d’administrateurs qui cliquent sur Suivant”, mais d’une couche d’administrateurs professionnels capables de gérer scripts et automatisation
Pourquoi le portage des outils UNIX n’était pas adapté
- La première solution a consisté à apporter à Windows, via Windows Services for Unix, un shell UNIX et des outils comme AWK/GREP/SED
- Mais l’architecture d’administration de Windows différait de celle d’UNIX
- UNIX est un OS centré sur les fichiers : en manipulant des fichiers et en redémarrant des processus, on peut effectuer de nombreuses tâches d’administration
- Windows avait une architecture où les fonctionnalités se trouvaient derrière des API, comme le Registry, Active Directory et WMI
- AWK ne s’appliquait pas directement au Registry, SED à Active Directory, ni GREP à WMI
- WMI offrait des possibilités pour les tâches d’administration, mais il était peu utilisé, et l’équipe de Snover a voulu créer un outil en ligne de commande pour manipuler les objets WMI
WMIC et le moteur fondé sur les métadonnées
- À l’époque de Windows XP, il fallait créer une interface en ligne de commande basée sur WMI avec une fenêtre de développement limitée à seulement 10 semaines
- En faisant appel à des ingénieurs contractuels, l’équipe a implémenté 70 opérations, mais c’était très insuffisant par rapport au périmètre nécessaire pour administrer l’ensemble de Windows Server
- Chez Microsoft, une fonctionnalité ne sortait pas si l’organisation de test ne l’approuvait pas, et plus le nombre de commandes augmentait, plus le goulet d’étranglement des tests grossissait
- Snover a défendu une approche similaire à la relation entre HTML et le navigateur : considérer chaque commande non pas comme du code, mais comme des métadonnées, et ne tester que le moteur commun
- L’approche consistait à laisser le moteur générer les commandes, tandis que la configuration de chaque commande était exprimée sous forme de métadonnées, par exemple en XML
- Pendant les vacances de Noël, il a rédigé les métadonnées et créé 72 commandes
- Il se souvient que les 70 commandes existantes avaient coûté environ 4 millions de dollars, tandis que le moteur avait coûté environ 60 000 dollars
- Quand des fonctions comme le filtrage et le formatage ont été ajoutées au moteur, toutes les commandes se sont améliorées en même temps, ce qui a constitué un important précurseur de l’architecture de PowerShell
Longhorn, .NET et Monad
- Bill Gates, constatant que les utilisateurs de Windows 98 ne migraient pas facilement vers XP, voulait faire de Longhorn un tournant comparable à un nouveau Windows 95
- Longhorn devait intégrer un mode de développement basé sur .NET, WPF, WCF, un nouveau modèle de stockage, etc.
- Snover a estimé que .NET pouvait être un moyen d’élargir le périmètre de l’administration Windows
- L’écriture de fournisseurs WMI n’avait pas généré suffisamment d’élan, mais Bill Gates poussait fortement l’adoption de .NET
- En plaçant les utilitaires d’administration au-dessus de .NET, il pensait obtenir une couverture plus large
- Quand une autre organisation a voulu créer un shell en portant K-shell, Snover a expliqué une meilleure approche, sans parvenir à convaincre
- Il s’est enfermé dans une pièce et a construit un prototype d’environ 10 000 lignes, qui contenait les principes d’architecture centraux de PowerShell
- Après la démonstration, l’équipe concernée a adopté l’idée, et Snover a pensé que cela pourrait être sa meilleure idée
- Pour rejoindre ce projet, il a quitté son rôle de chief architect d’un produit/service comptant plusieurs centaines à un millier de personnes, acceptant de fait une rétrogradation
Le Monad Manifesto et la persuasion des équipes
- La nouvelle équipe a choisi Monad comme nom de projet et, faute d’effectifs, a externalisé une partie du travail en Inde
- Snover a rédigé le Monad Manifesto afin d’aligner la vision du projet et le chemin vers le succès
- Il y synthétisait le problème, les approches existantes, la nouvelle approche, la valeur et les éléments de différenciation
- Il clarifiait la valeur apportée à chaque partie prenante : administrateurs, fournisseurs, équipes de développement, etc.
- Les différentes équipes de Microsoft avaient beaucoup à faire, et elles n’étaient pas licenciées si elles ne créaient pas d’interface en ligne de commande ; en créer une ne menait pas non plus à une promotion
- La proposition de Monad était que chaque équipe produit n’écrive que le code manipulant ses propres objets, le reste étant fourni par PowerShell
- Le formatage, le tri, le filtrage, le parseur, l’exécution à distance, l’élévation de privilèges, etc. étaient fournis côté PowerShell
- Chaque équipe n’avait qu’à expliquer comment manipuler les objets de son propre domaine
- L’équipe Active Directory a investi quelques semaines pour créer plusieurs cmdlets, et la forte réaction des groupes d’utilisateurs l’a poussée à poursuivre davantage le travail
Le retour dans Windows après la réinitialisation de Longhorn
- Dans Longhorn, l’adoption de .NET a été poussée à l’excès, ce qui a amplifié les problèmes
- Par exemple, la boîte de dialogue
Save Asde Notepad mettait 1 minute 30 à apparaître à cause d’une boîte de dialogue commune basée sur .NET/WCF, et l’ensemble de travail passait de 15 KB à 15 MB - Il est aussi rapporté que les builds nocturnes n’ont pas fonctionné pendant environ 7 mois
- Par exemple, la boîte de dialogue
- L’organisation Windows a procédé à une réinitialisation, a retiré le code .NET de Windows, et PowerShell a lui aussi été repoussé hors de Windows
- Par la suite, PowerShell a subi à plusieurs reprises des pressions pour être annulé, au motif qu’il était à la fois une interface en ligne de commande et basé sur .NET
- Bill Gates en comprenait la valeur, mais cela n’aidait pas à le défendre au quotidien
- Le responsable de Windows Server l’a soutenu à des moments critiques
- L’équipe Exchange a joué un rôle dans l’arrêt des tentatives d’annulation, en mettant en avant une “activité de plusieurs milliards de dollars” qui dépendait de PowerShell
- Les exigences WinArch pour intégrer .NET dans Windows étaient très strictes, mais l’équipe PowerShell s’est préparée à satisfaire toutes les conditions
- Quand le responsable de Windows a demandé le retrait de la requête, le program manager a exigé un refus formel, ce qui a ouvert une procédure de revue
- L’organisation Windows Server détenait ce pouvoir de décision et a estimé que PowerShell satisfaisait aux exigences, ce qui lui a permis de réintégrer Windows
PowerShell 1 à 4 et son impact réel
- PowerShell 1 est sorti comme composant de Windows Vista
- Après la sortie, Snover a reçu des conseils l’incitant à faire autre chose et des avertissements sur les risques pour sa carrière, mais il est resté concentré sur la même vision jusqu’à PowerShell 2, 3 et 4
- Il se souvient que la version 1 a atteint une partie des objectifs, que les versions 2 et 3 ont comblé les fonctionnalités manquantes, et que la vision était presque achevée avec la version 4
- PowerShell a amené les administrateurs Windows à écrire des scripts et à automatiser des tâches complexes
- Des groupes d’utilisateurs, des questions-réponses en ligne, du partage de scripts et des présentations en conférence sont apparus
- Certains administrateurs sont devenus conférenciers professionnels grâce à leur expérience de PowerShell
- Environ cinq ans plus tard, Snover est devenu Distinguished Engineer, puis Technical Fellow
- Le responsable d’Office a déclaré que sans PowerShell, la transition d’Office vers le cloud aurait été difficile, et que cette transition d’Office vers le cloud avait également influencé celle d’Azure
- Auparavant, le provisionnement de serveurs se faisait par clics, ce qui rendait les répétitions et les corrections difficiles
- Grâce aux scripts, il était possible de passer à l’échelle et, en cas de problème, de modifier les scripts pour réagir
1 commentaires
Commentaires sur Hacker News
Du point de vue d’un animateur, PowerShell a rencontré une opposition farouche en interne chez Microsoft, et son créateur Jeffrey Snover a même été rétrogradé pour avoir insisté
Jeffrey avait été recruté à l’origine pour aider Microsoft à apprendre à rivaliser dans les datacenters, mais la culture de l’époque était tellement prisonnière d’une vision du monde centrée sur l’ordinateur personnel qu’il a rencontré de la résistance à chaque étape
Autre point intéressant : PowerShell est né parce que Windows n’était pas basé sur les fichiers. L’objectif de Jeffrey était l’administration des serveurs, mais sous Windows il n’était pas possible de tout gérer en modifiant simplement des fichiers de configuration ; il fallait appeler plusieurs API et échanger des données structurées, si bien qu’un modèle objet riche était en pratique la seule solution
La transcription a été produite en combinant une transcription intégrale, la ponctuation revue par Descript et GPT-4, puis une relecture manuelle, mais la qualité n’est peut-être pas aussi bonne qu’espéré
Ce que j’aime dans PowerShell, c’est que c’est un langage dynamique simple, avec des commandes faciles à chaîner, donc un nouvel ensemble de cmdlets pour créer des interfaces utilisateur simples et des graphiques serait bienvenu
Par exemple, une fonctionnalité comme
Create-Chart -Type "Bar" -XAxis $Cities -YAxis $GDP -OutputFile "C:/Documents/ProjectAnalysis/CitiesBarGraph.png"semblerait facile à intégrer dans un produit Microsoft, et pourrait supprimer une page de code boilerplate que l’on comprend malIl doit exister des millions d’utilisateurs qui savent faire un peu de programmation de base, mais pour qui des outils comme Java ou C# ne correspondent pas à leur travail. Python convient souvent bien, mais j’aimerais que Microsoft fasse davantage pour créer quelque chose que puissent utiliser non seulement les administrateurs système ou les équipes IT, mais aussi les utilisateurs métier ordinaires
Si Microsoft investissait davantage pour que PowerShell ne soit pas lent sur des tâches comme l’analyse de fichiers, et ajoutait les fonctionnalités mentionnées plus haut ainsi que des cmdlets de statistique et de calcul scientifique, cela pourrait devenir un outil assez formidable pour qu’un business analyst puisse rapidement créer des logiciels d’amélioration des processus ou des prototypes à transmettre à une équipe de développement
Microsoft semble considérer qu’il n’existe que trois options : les développeurs logiciels professionnels qui utilisent C#, les tâches IT qui utilisent PowerShell, et Excel pour les utilisateurs métier. Excel est excellent à bien des égards, mais reste assez limité, et VBA+Excel fait partie des écosystèmes les plus contraints que j’aie utilisés. Des langages tiers comme Python ou R constituent bien une quatrième option, mais j’aimerais que Microsoft consacre plus de temps à ce domaine
J’aimais PowerShell, y compris ses défauts bizarres, mais je suis passé à autre chose
Pendant la lecture, j’ai supposé qu’elle avait été générée par une machine, mais j’aurais du mal à dire précisément pourquoi ; elle aurait simplement besoin d’un peu d’édition pour être plus lisible
Cela dit, c’est quand même bien mieux que de ne pas avoir de transcription du tout
En tant que développeur ayant longtemps utilisé Bash, j’étais vraiment enthousiaste quand PowerShell est arrivé
Je pensais qu’on allait enfin avoir un shell sympa pour le développement aussi sur Windows, mais au final je n’ai jamais vraiment assimilé PowerShell, et je continue à utiliser le Bash que je connais bien, même sous Windows
Je me demande comment les développeurs à l’aise avec les deux les comparent. Est-ce que PowerShell a réellement tenu sa promesse d’être un shell plus efficace et plus moderne, ou bien est-il surtout utilisé parce qu’il est installé par défaut et meilleur que CMD ?
À partir d’environ 50 lignes, j’y vois une odeur de code, et j’ai gardé cette page de côté au cas où je doive convaincre quelqu’un : http://mywiki.wooledge.org/BashPitfalls
En essayant PowerShell récemment, j’ai trouvé bien plus simple, à la fois comme langage de script et comme langage en ligne de commande, le fait que les commandes renvoient des objets plutôt que du texte, ce qui évite de devoir bricoler du texte de force
C’est aussi excellent qu’il existe une manière officielle de gérer le parsing des arguments. Tout est cohérent, et dans la fenêtre de ligne de commande on peut pratiquement tout autocompléter parmi les options, à un niveau dont Bash ne peut même pas rêver, ce qui améliore énormément la productivité
En revanche, les conversions de types introduisent parfois de nouveaux bugs qu’on n’avait pas avec Bash. Aujourd’hui je préfère PWSH, mais j’ai quand même un certain rejet des deux et j’attends leur prochaine évolution naturelle
L’orientation objet est assez utile pour construire des pipelines
Par exemple, pour regrouper récursivement les fichiers d’un dossier par taille afin de trouver des doublons potentiels, on peut écrire
Get-ChildItem -File -Recurse | Group-Object -Property Length | Where-Object { $_.Count -gt 1 } | Sort-Object -Property CountPas besoin de mémoriser une obscure incantation
file, ni d’analyser une sortie texte. On reçoit de vrais objets avec des propriétés, et l’autocomplétion par tabulation permet d’en voir la structureSi on doit parser du JSON, on peut le faire directement avec
Get-Content -Raw whatever.json | ConvertFrom-Jsonsansjq. Pour convertir du XML en CSV, il suffit d’utiliserConvertFrom-XmlouSelect-Xml, de faire ensuite le traitement nécessaire, puis d’utiliserConvertTo-CsvSi
Get-ChildItemest trop long, on peut utilisergci,dirouls, et siWhere-Objectest trop long, on peut utiliserwhereou?. Par défaut, il ne distingue même pas la casseIl y a quelques années, j’ai dû écrire en PowerShell un système de transfert de données robuste, complexe et entièrement automatisé, et l’expérience a été si bonne que j’ai remplacé tous mes shells sur macOS et Linux par PWSH
Le meilleur aspect, c’était la puissance du passage d’objets dans le pipeline. Même après avoir extrait et manipulé certaines propriétés d’un objet dans le premier filtre, on pouvait continuer à accéder, dans les filtres plus loin dans le pipeline, aux autres propriétés ainsi qu’aux propriétés créées par le premier filtre
La cohérence des commandes, de la gestion des erreurs et des propriétés des objets était également excellente
Ensuite, la nature de mon travail a changé, mon ancienne mémoire musculaire est revenue, et j’ai remis Bash partout. Quand je travaillais et réfléchissais beaucoup dans cet univers, PWSH me paraissait naturel comme shell, mais une fois sorti de cet environnement, penser en PWSH est devenu plus difficile que revenir à Bash
Ça me manque parfois. Je ne vois rien d’aussi proche dans l’univers des shells, ou du moins aucune alternative assez proche pour justifier l’effort de migration
D’abord, il a voulu devenir un langage .NET. Je ne sais pas pourquoi la promesse de .NET — un runtime, plusieurs langages — s’est fanée là où l’écosystème Java a prospéré sans faire cette promesse, mais si je dois écrire du code .NET, autant utiliser C#
Ensuite, il n’a pas vraiment maîtrisé les bases du shell. Je ne me souviens plus des détails, relégués au passé, mais la gestion de la redirection était cassée, et des choses triviales en Bash étaient pratiquement impossibles dans PowerShell. J’avais l’impression que les développeurs, enthousiasmés par la création de quelque chose de nouveau et puissant, avaient ignoré ce que Bash et les autres faisaient bien
Enfin, il y a cette obsession d’imposer le format Verb-Object à tous les noms. C’est subjectif, et certains le défendront, mais à mon avis cela rend les scripts laids, la saisie maladroite, sans améliorer réellement la découvrabilité ni la mémorisation
Le fait d’utiliser la flèche droite au lieu de Tab me perturbe aussi, tout comme l’absence de commandes familières et les règles de nommage très strictes
Cela dit, PowerShell semble plus capable que Bash quand on le maîtrise bien. Il a un meilleur système de types et facilite la manipulation des arguments, alors que dans Bash les valeurs se rapprochent davantage de chaînes sans forme
https://github.com/bionicles/tree_plus/blob/main/tests/more_... est une version un peu ancienne de ce que j’utilise pour configurer un environnement de test sur une machine Windows, et cela montre dans une certaine mesure ce qui est possible
Quand j’utilisais PowerShell directement, ce n’était pas horrible, mais je ne comprenais pas pourquoi un tableau de longueur 1 était déballé et transformé en son type interne
À cause de ça, il fallait à chaque fois faire attention au nombre d’éléments pouvant arriver dans le tableau, et au lieu de traiter le cas général, il fallait vérifier à chaque modification, ce qui a provoqué énormément de bugs. Je me demande si quelqu’un sait pourquoi ils ont fait ça
Une seule fonction,
WriteObject, écrit une valeur donnée comme sortie de la cmdlet, et un seul appel produit cette sortie. Si on l’appelle plusieurs fois, le shell n’a d’autre choix que de regrouper toutes ces valeurs dans un tableau en sortieDonc si, dans une exécution de cmdlet,
WriteObjectest appelé une fois, et dans une autre deux fois, le shell ne peut pas savoir que, dans le premier cas, cette sortie unique aurait aussi dû être encapsulée dans un tableau. Mais envelopper systématiquement la sortie des cmdlets dans un tableau gênerait des cmdlets commeGet-Date, où il n’y a sémantiquement qu’un seul résultatPour une raison ou une autre, ils n’ont apparemment pas voulu complexifier l’API pour que les cmdlets puissent elles-mêmes exprimer si leur sortie est sémantiquement unique ou multiple, indépendamment du nombre réel d’appels à
WriteObject. Une telle API ne pourrait pas être une propriété statique de la cmdlet, puisque la sortie peut varier fortement selon les paramètres, et un overloadWriteObjectdu type(Object, bool iMightWriteMoreValues)poserait aussi problème, puisqu’il devrait fonctionner avec des tableaux vides. Il aurait sans doute fallu une fonction séparée du genreIWillWriteMultipleValues()C’est aussi expliqué ici : https://news.ycombinator.com/item?id=40874873
$Ary = @(, "value")Pour créer un tableau, surtout un grand tableau, c’est aussi plus performant que
+=, donc la possibilité d’assigner une boucleforà un tableau est plutôt sympa. Ce n’était pas intuitif comme façon de remplir un tableau, mais c’était clairement utile$Ary = foreach ($Obj in $Objs) { @{ foo = $Obj.foo } }Les développeurs de logiciels devraient toujours se méfier de la tentation de rendre leur logiciel trop intelligent
L’autre moitié manquante aurait été de convertir automatiquement une valeur unique en tableau de longueur 1 quand le récepteur attend un tableau
Alors qu’il existe déjà quelque chose comme Lua, au lieu de l’utiliser tel quel ou de le modifier légèrement pour obtenir un langage simple, petit, élégant et cohérent, les gens réinventent la roue et n’arrivent même pas à la rendre ronde, une sorte de tragédie sisyphéenne
Sauf si j’ai besoin d’une commande PowerShell précise parce qu’il faut interagir avec des sous-systèmes Windows, je me dis : « pourquoi je n’utilise pas Python ? »
C’est trop verbeux et trop lent pour 90 % de ce qu’on ferait en Bash, et pareil pour ce que, dans une autre vie, j’aurais fait en Perl
Je me demande souvent pourquoi Microsoft n’a pas construit ça au-dessus de Python, Node ou autre. Je ne me souviens plus de la date de sortie initiale de PowerShell, donc je ne sais pas vraiment ce qui aurait été idéal à l’époque
Et il n’a pas été conçu pour le travail en console, là où PowerShell est bon. Au lieu de pouvoir prendre le contenu d’un fichier et le passer à une autre commande, il faut gérer soi-même des choses comme les file handles
Si PowerShell est bon, c’est parce qu’il offre un excellent REPL avec autocomplétion, aucun comportement bizarre sur les espaces, readline[0], et un véritable couteau suisse capable de faire, si nécessaire, tout ce qu’on peut faire avec .NET
En plus, comme il est orienté objet, on peut se concentrer sur le vrai travail à accomplir au lieu de chercher comment parser la sortie texte d’un vieil utilitaire avec un autre vieil utilitaire
0 : https://learn.microsoft.com/en-us/powershell/module/psreadli...
Dans la première édition de “Powershell in Action” de Bruce Payette, il y a une remarque annexe expliquant que PowerShell ressemble à Perl parce qu’il utilise le symbole
@, la variable par défaut$_et l’opérateur d’appel de fonction&. Apparemment, Perl a réellement été utilisé comme langage racine à une époque, et ces éléments viennent de cette période. Plus tard, la syntaxe a été réorientée pour davantage correspondre à C#, mais ces éléments ont été conservés parce qu’ils fonctionnaient bien, et l’auteur explique qu’en termes perlien, ils contribuaient fortement au « whipupitude quotient » du langageIl dit aussi que le cœur du langage PowerShell repose sur la grammaire POSIX 1003.2 du Korn shell, et que, si au départ des idiomes Perl avaient été repris pour des concepts plus avancés comme les tables de hachage, il est devenu clair au fil du projet qu’il valait mieux aligner la syntaxe de PowerShell sur celle de C#
S’il n’a pas été construit au-dessus d’autre chose, c’est probablement parce que Microsoft contrôlait déjà .NET
Je ne pense pas que la lenteur vienne de .NET ; ça ressemble plutôt à un problème de conception ou à un manque d’investissement dans les performances
Cela dit, ça dépend aussi de la version de PS utilisée. Dans mon souvenir, les versions récentes sont plutôt rapides
Au travail, j’ai eu la bénédiction de gérer une base de code de procédures stockées SQL Server vieille de plus de 20 ans
Environ 300 000 lignes de code critique pour le métier, passées par des tests de singe, mais sans gestion de source, jamais vraiment optimisées côté performances, avec du SQL édité et exécuté dans SSMS puis déployé directement en environnement, et bien sûr sans aucun test automatisé
L’entreprise est centrée sur Windows, on développe sur Mac, et GitHub Actions tourne sur Linux
J’ai choisi des outils comme PowerShell Core,
sqlcmd, docker pour lancer une instance Windows de SQL Server, RedGate SQL Compare pour extraire le schéma et le code depuis les anciens serveurs legacy, tSQLt pour les tests unitaires, TSqlLint pour la conformité du code, SQLFluff pour le respect du style, et Flyway pour le déploiementJ’ai vite compris que lorsque Windows doit faire partie des plateformes cibles, PowerShell Core est le shell de scripting cross-platform le plus interopérable
Je n’ai pas trouvé ça agréable à coder. Le moteur regex vient de .NET et a de graves problèmes de backtracking, et le comportement des tableaux était aussi étrange. Lancer des exécutables comme on le souhaite et capturer les flux de sortie était également incohérent, au point qu’il fallait souvent exécuter le processus, rediriger sa sortie vers un fichier temporaire, puis lire ce fichier une fois le processus fils terminé. Même faire passer la sortie standard d’un processus fils dans une variable chaîne était inutilement pénible
Mais PowerShell Core s’exécute vite. S’il y a bien une chose que Microsoft sait faire, c’est la micro-optimisation. Les outils d’interaction utilisateur, comme les sélecteurs de listes en ASCII art ou les générateurs simples d’invites de saisie, sont aussi très bons. Et tant qu’on évite les dossiers contenant des fichiers verrouillés, la plupart des bizarreries du système de fichiers Windows restent masquées
En cherchant sérieusement, on peut en général arriver à faire ce qu’on veut. Je recommande
Chaque fois que ma carrière s’est rapprochée de l’administration Windows, j’ai vraiment détesté l’expérience, et je suis d’accord avec ces autres impressions
Mais contrairement à presque tout le reste sous Windows, qui est d’une lourdeur extrême, PowerShell lui-même était en fait plutôt excellent, et a toujours donné l’impression d’avoir été conçu avec soin
Linux est formidable et restera mon environnement de travail quotidien, mais utiliser Bash est vraiment atroce. Cela dit, comme il est toujours partout, tout le monde commence par y toucher, et on manipulera probablement encore en 2100 des scripts Bash pleins de défauts
PowerShell donne vraiment l’impression d’être un produit né de la confiance monopolistique de Microsoft
Créer un langage avec presque aucun pont syntaxique permettant de venir d’un autre langage, c’était audacieux. Il était impossible de deviner les commandes, paramètres ou drapeaux. Même vu l’ambition de Microsoft, ils auraient dû savoir que des armées d’administrateurs et de programmeurs devraient apprendre et maintenir à la fois PowerShell et des scripts Bash pendant au moins des décennies
Cette syntaxe extrêmement verbeuse a peut-être fière allure dans des présentations de comité, mais à l’usage fréquent elle se heurte aux limites bien étudiées du cerveau humain. Quand la taille de l’information ou la latence dépasse un certain seuil, l’état de flow se brise, et il faut de la concentration, de la mémorisation explicite et des vérifications répétées. Même avec de la pratique, il est difficile d’exécuter rapidement les incantations shell courantes qui transforment une pensée en réalité, et il faut déjà lutter avec la syntaxe rien qu’en attendant l’autocomplétion puis en décidant s’il faut accepter le mot suivant d’une commande en plusieurs parties
Quand on cherche
pow..dans le menu Démarrer, on obtient quatre magnifiques choix : PowerShell, PowerShell ISE, et pour chacun une version normale et une version x86. Dans tous les cas, il y a un chargement qui casse le flow. ISE affiche un petit écran de démarrage puis saute ailleurs. Une autre boîte de dialogue vous informe que la session précédente a été fermée sans enregistrer un fichier de script sans nom, mais le rouvre quand même, comme prévu. Alors je ne vois pas pourquoi il me sermonneOn peut saisir ou coller du texte et exécuter n’importe quel malware, mais dès qu’on veut enregistrer cela dans un fichier et l’exécuter comme script
.ps, l’absurde procédure de politique d’exécution se déclenche. C’est peut-être un traumatisme hérité de la mauvaise réputation de sécurité d’Internet Explorer et de Windows à leurs débutsJ’ai quand même essayé de l’aimer, jusqu’au jour où un script est tombé sur des noms de fichiers contenant des crochets, et PowerShell a interprété ces
[1],[2]comme une sorte d’itérateur implicite : https://stackoverflow.com/questions/21008180/copy-file-with-...L’une des tâches fondamentales d’un langage de script est de manipuler des fichiers, or les noms de fichiers ne sont pas sous le contrôle du script auteur, et il faut connaître l’espace des noms de fichiers valides sous Windows. Cet épisode a créé un problème de confiance durable envers ce langage
L’équipe Azure avait visiblement assez de poids au sein de Microsoft pour créer à part une syntaxe saine et lisible comme
az find vm,az account showL’autre aspect, c’est qu’ils voulaient de la cohérence. La connaissance *NIX s’acquiert en pratique souvent à coups de mémorisation brute.
-vveut généralement dire verbose et-hveut généralement dire help, mais en réalité on ne peut faire confiance à rien ni s’y reposerAvec le recul, il est étrange que Microsoft n’ait pas perçu la valeur de rendre toute la configuration de Windows et des applications d’entreprise importantes comme Active Directory et Exchange facile à composer et programmable
L’idée qu’ils aient proposé comme alternative de se connecter en Remote Desktop pour cliquer partout à la souris est absurde. Automatiser ce genre de tâches est, du moins d’après mon expérience avec AutoHotkey et Window Spy, horriblement difficile et fastidieux
Se connecter en Remote Desktop et cliquer à la souris génère beaucoup d’heures facturables
L’ironie, c’est qu’il est probablement vrai que le fait que ce soit horriblement difficile et fastidieux est l’une des principales raisons de l’existence de systèmes d’exploitation alternatifs
Il y a longtemps, pour être juste il y a environ 10 ans, un support technique m’a sérieusement proposé Selenium comme meilleure façon d’automatiser un certain paramétrage
J’utilise des ordinateurs depuis 1982, mais je n’ai vraiment jamais été utilisateur de Windows, pas une seule fois
Au début des années 1990, quand Wintel montait en puissance, j’ai suivi la croissance de Linux et de 386BSD, et à la fin des années 1990, quand Win95 et NT dominaient les postes de travail en entreprise, je me suis réfugié sur SPARCStation, Linux et du matériel NeXT abandonné. Après le changement de siècle, j’ai adopté Mac OS, qui venait de devenir conforme à POSIX
Pendant près d’un demi-siècle, éviter les produits Microsoft a été au cœur de ma politique informatique, avec comme exception notable Applesoft BASIC
Pourtant, PowerShell est bien
Mais le deuxième paragraphe esquive en partie ce que le premier laissait attendre ; j’aurais aimé qu’il explique pourquoi il considère PowerShell comme « bon »
Quand il faut écrire soi-même des outils en ligne de commande dans un langage de programmation approprié comme le C/C++, l’écart de productivité entre une version faite pour un shell traditionnel et une version faite pour PowerShell est sous-estimé
En général, je n’ai jamais créé d’outil CLI réellement utile sans accumuler des milliers de lignes de code brouillon. En pratique, il faut gérer l’entrée via pipeline, les paramètres optionnels, les paramètres avec valeur, les valeurs par défaut et leurs surcharges, un mode dry run, diverses exigences de format de sortie, etc. : 90 % de plomberie et seulement 10 % de vrai comportement
Avec PowerShell, un module C# n’a en gros qu’une vingtaine de lignes de surcharge, et tout le reste correspond au vrai comportement. La productivité est stupéfiante
On obtient gratuitement la validation des paramètres, l’autocomplétion par tabulation des noms de paramètres, l’entrée et la sortie via pipeline, le formatage, le typage fort, le globbing, etc.
Pour la maintenance et les tâches d’administration, je me détourne de plus en plus des outils CLI au profit de langages compilés ou interprétés