Pourquoi la programmation alphabétisée n'est-elle pas dominante? [fermé]

32

La programmation alphabétisée a de bons idéaux. Pourquoi pensez-vous que ce n'est pas courant? C'est parce qu'il n'a pas réussi à livrer?

Casebash
la source
2
Parce que les outils qui ont été développés pour cela sont encore assez faibles. Microsoft a probablement une chance de mener à cet égard.
Job
3
Lorsque j'aborde un nouveau problème, j'utilise souvent ma propre sténographie «Programmation littéraire» en utilisant un crayon et du papier. Cela me permet d'ignorer la sémantique du langage et de mélanger dans le langage humain pour décrire ces choses qui seront appelées fonctions, etc.
oosterwal
1
Même Knuth n'est plus convaincu de ce concept: "Et nous abandonnons la vieille notion de" programmation lettrée "que j'utilisais lors du développement de TEX82, car la documentation s'est avérée trop pénible." tug.org/TUGboat/tb31-2/tb98knut.pdf .
h0b0
6
Pour ceux qui ne connaissent pas TeX et sa philosophie, il convient de mentionner que la citation de Knuth est très probablement signifiée ironiquement.
3
@ h0b0 & user1249: Tout l'article de Knuth est ironique, comme vous pouvez le constater en le lisant simplement. Il se moque également de Steve Jobs, du Web, d'Agile, de la refactorisation, de la POO, de l'AOP et bien d'autres choses. C'est une blague!
Andres F.

Réponses:

35

Je l'ai vu pour la première fois dans un livre des écrits de Knuth, et j'ai pensé qu'il avait l'air soigné. Ensuite, j'ai essayé d'utiliser l'affichage de programmation littéraire pour comprendre ce qui se passait dans le programme et je l'ai trouvé plus difficile qu'il n'y paraissait. Il se peut que je sois trop habitué à parcourir les listes de programmes, mais cela m'a semblé déroutant.

Ensuite, j'ai regardé le code source, et cela m'a mis hors tension de temps en temps. Je devrais apprendre à écrire des programmes d'une manière entièrement nouvelle, avec moins de correspondance entre le texte du programme et ce que le compilateur a vu, et n'a vu aucun avantage correspondant.

De plus, les gens peuvent écrire des arguments longs et convaincants selon lesquels le code fait X alors qu'il fait réellement Y, et j'ai rencontré ma part de commentaires trompeurs. J'ai développé un penchant pour la lecture du code pour voir ce qu'il fait assez tôt. La programmation alphabétisée est l'antithèse de cela.

David Thornley
la source
4
La programmation alphabétisée, ainsi que les commentaires en général, ne concernent pas ce que fait votre code. Vous pouvez le lire dans le code lui-même. Il s'agit de savoir pourquoi et comment , et ces informations essentielles sont presque toujours manquantes sans une programmation appropriée. Inutile de mentionner que la partie « pourquoi? » Impliquerait assez souvent des mathématiques élaborées et compliquées, parfois des graphiques et des tableaux, parfois des diagrammes. Des outils de programmation alphabétisés sont nécessaires pour conserver ces commentaires de manière lisible.
SK-logic
1
@ SK-logic fair, mais l'argument de David Thornley est que même le POURQUOI peut s'avérer être un mensonge trompeur (celui qui est en fait encore plus difficile à comprendre).
MrFox
1
+1 Knuth réécrivait à l'époque (thématique) du Far West de la programmation lorsque travailler dans un langage "avancé" signifiait écrire "C" presque au-dessus du métal à la place en utilisant du code machine. La mémoire était des variables si étroites et les autres noms n'étaient généralement que des lettres simples, souvent réutilisées de portée en portée. La grande majorité des programmes où des plans clés en main ont été écrits et maintenus par une personne chacun avec son propre style excentrique. Devoir reprendre une base de code était plus un déchiffrement qu'une lecture. Il n'y avait aucun contrôle de source, etc. pour aider.
TechZen
1
Knuth regardait la route il y a 30 ans aujourd'hui. Il savait que les programmes deviendraient plus gros, plus compliqués, seraient écrits par des équipes avec des membres changeants, dureraient des années ou des décennies et nécessiteraient des contributions, une évaluation et éventuellement l'acceptation de non-programmeurs. La programmation alphabétisée était une idée pour aborder tout cela. Il ébauchait ce que nous appelons aujourd'hui la logique métier et le BDD. L'idée centrale étant que les programmeurs sauraient quoi faire et que les non-programmeurs pourraient suivre. Comme indiqué, l'idée a échoué car il n'existe aucun mécanisme pour imposer le lien entre le texte "alphabétisé" et le code.
TechZen
BTW: C'est pourquoi j'aime les langages "auto-documentés" comme Objective-C. Au début, le code semble être encombré de noms de méthodes absurdement longs, mais même un programmeur qui ne connaît pas le langage ou l'API peut rapidement comprendre ce que fait le code. Mieux encore, changez le code et les «commentaires» changent automatiquement en synchronisation. Bien sûr, c'est pourquoi Objective-C a été écrit avec la saisie semi-automatique intégrée. Sans cela, écrire Objective-C est assez infernal.
TechZen
13

Je blâmerais l' effet réseau . Pour que d'autres personnes puissent modifier votre code et votre documentation, elles doivent être en mesure de le comprendre.

Cela éloigne les gens de quelque chose comme cweb / noweb, car leur utilisation vous obligerait à apprendre TeX et la syntaxe spécifique au programme en plus du langage de programmation que vous utilisez pour le projet. Cela peut être considéré comme une énorme perte de temps, surtout s'ils n'ont pas besoin de la composition mathématique qui est un gros tirage pour TeX en premier lieu. (Et pour de nombreux programmeurs d'applications, ils n'en auront vraiment pas besoin.) Au lieu de cela, ils préfèrent quelque chose comme les commentaires XML de Visual Studio, car c'est déjà populaire et bien établi.

Les endroits où j'ai vu la programmation alphabétisée décoller sont dans l'informatique scientifique / statistique, où la plupart des programmeurs ont une formation importante (aka PhDs) en mathématiques, CS ou statistiques, et sont donc déjà familiers avec LaTeX. La documentation qu'ils écrivent est plus susceptible d'inclure un grand nombre de formules compliquées qui sont mieux écrites dans TeX, et ils sont plus susceptibles de programmer en R. La proportion de programmeurs R qui connaissent SWeave est certainement beaucoup plus élevée que, disons, la proportion de programmeurs C qui connaissent cweb.

Larry Wang
la source
2
Cette réponse semble supposer que tous les outils de programmation alphabétisés utilisent LaTeX. Est-ce vrai? Il ne semble rien y avoir dans le concept qui l'exige.
AShelly
@AShelly: Ce n'est pas obligatoire - je sais que noweb, au moins, vous permet d'utiliser HTML. Mais dans la pratique, les personnes qui écrivent de la documentation HTML utiliseront javadoc et similaires au lieu d'outils de programmation alphabétisés.
Larry Wang
1
@AShelly, pour que la programmation lettrée fonctionne, vous devez être capable de générer le document à imprimer. C'est beaucoup, beaucoup plus facile lorsque le format est basé sur du texte, et à ma connaissance, le formateur de document texte le plus puissant est TeX, et la façon la plus simple de travailler avec TeX est d'utiliser LaTeX.
@AShelly vous voudrez peut-être jeter un œil au org-modesupport de la programmation alphabétisée . C'est assez pratique, et je trouve cela beaucoup plus facile à comprendre (sans parler de gérer ) que WEB ou NOWEB seul. Un aspect important du code est la lisibilité, ce qui est lisible. (cf github.com/vermiculus/stack-mode )
Sean Allred
12

J'ai été fasciné par le concept de programmation alphabétisée à la fin des années 90 pendant mes études, et je suis toujours intrigué par l'approche de Knuth en matière de programmation et de composition. Rien que le meilleur fera l'affaire.

Le système de programmation littéraire conçu par Knuth a fait beaucoup, beaucoup plus que ce qui est immédiatement visible, à savoir qu'il a surmonté de nombreuses lacunes dans le langage de programmation sous-jacent que l'outil de génération de code a généré à partir du document source de Knuth, à savoir Pascal standard.

Pour ceux qui ont la chance de ne pas avoir essayé Standard Pascal, voici quelques points saillants.

  • Pour rendre plus facile d'avoir un compilateur en un seul passage, la spécification du langage a dit que toutes les déclarations devaient venir dans un certain ordre. De la page wikipedia: "Chaque procédure ou fonction peut avoir ses propres déclarations d'étiquettes goto, constantes, types, variables et autres procédures et fonctions, qui doivent toutes être dans cet ordre." Cela signifiait que vous ne pouviez pas regrouper vos objets de manière logique dans le fichier source.
  • La manipulation des cordes était plus fastidieuse qu'en C. simple.
  • Les identificateurs ne pouvaient pas avoir une longueur arbitraire.
  • Beaucoup d'autres choses dont je ne me souviens plus.

Toutes ces choses signifiaient que Knuth avait besoin d'un meilleur langage de programmation (il en a donc inventé un) et il utilisait Pascal comme langage d'assemblage.

La plupart des langages modernes peuvent faire ces choses sans trop d'efforts, supprimant ainsi une GRANDE partie du travail que la programmation alphabétisée devait résoudre.

Les langages modernes sont également plus expressifs, ce qui permet de réfléchir davantage au code lui-même.

Alors, que reste-t-il? La possibilité de générer une forme de documentation composée à partir du code source, et CELA existe aujourd'hui.

Pensez simplement à JavaDoc - l'API d'exécution Java est peut-être le plus gros morceau de programmation littéraire disponible aujourd'hui (sauf que le code n'est pas réellement présenté, mais il POURRAIT l'être si Java était open source depuis le début). Voir par exemple la présentation du framework de collections sur http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

Je crois que des systèmes similaires existent pour .NET et d'autres programmes grand public.


la source
To make it possible to have a single-pass compiler, all declarations had to come in a certain order. Un ordre de déclaration comme celui-ci simplifie certainement la conception du compilateur, mais il n'active / n'empêche pas la compilation en un seul passage. Delphi, par exemple, n'a pas cette restriction d'ordre, mais c'est toujours un compilateur Pascal à passage unique.
Mason Wheeler
D'accord. Turbo Pascal n'avait pas non plus cette restriction. Notez cependant que cette restriction était dans la définition de Pascal depuis le début.
1
Non, Knuth est passé à CWEB depuis longtemps, il ne s'agit pas de corriger les déficiences Pascal. Non, JavaDoc n'a rien à voir avec la "programmation lettrée" de Knuth - il parle de changer fondamentalement la façon dont il crée du code, et de prétendre que cela lui permet de s'attaquer à la complexité qu'il affirme ne serait autrement pas possible pour lui ou pour quiconque d'autre.
Ron Burk
@RonBurk CWEB se compile simplement en un meilleur "langage d'assemblage". Cela n'invalide pas les décisions de conception d'origine.
Thorbjørn Ravn Andersen
5

Une chose que j'ai découverte lorsque j'ai eu mon aventure avec la programmation alphabétisée dans les années 90, c'est qu'elle a attiré des gens très passionnés qui voulaient faire exactement la bonne chose - et cela impliquait d'écrire leur propre système de programmation alphabétisé parce qu'aucun système existant n'était assez bon pour eux. noweb a été une bonne tentative de couper cela en fournissant un dénominateur le moins commun assez bon pour tout le monde, bien que même alors, j'ai passé la plupart de mon temps LP à développer une jolie imprimante pour cela ...

Un autre problème est qu'il est vraiment anti-agile. À certains égards, être ralenti est une bonne chose, car il vous oblige à réfléchir davantage et à bien faire les choses la première fois. D'un autre côté, documenter méticuleusement au fur et à mesure signifie qu'il existe un grand obstacle à la refactorisation de votre code. Et si vous attendez que votre code soit durci avant de le LP-ify, vous vous retrouvez avec une tâche de documentation de plusieurs jours, qui peut vraiment vous arrêter dans vos traces.

Dfan
la source
Après avoir expérimenté, j'ai découvert que le point fort de LP pour le reste d'entre nous pourrait être de documenter les décisions de conception et les détails de l'architecture juste à côté du code réel. Je suis d'accord avec LP étant plus difficile à refactoriser. Je crois comprendre que Knuth a fait la conception initiale sur papier et seulement lorsqu'il a été satisfait de la mise en œuvre effective. C'est probablement la même situation que je trouve qui fonctionne pour moi.
Thorbjørn Ravn Andersen
3

À mon humble avis, de nombreuses entreprises ont une culture contraire aux objectifs de la programmation littéraire: elles veulent des résultats plus rapides (elles ne pleurent sur la qualité que lorsque l'application est en production). Dans ma propre expérience, mes patrons avaient refusé de comprendre que des résultats plus rapides ne signifient pas "un programme exécutable le lendemain de ma demande". Pour eux, si un développeur n'est pas occupé à taper sur son clavier, il ne travaille pas, c'est "perdre son temps dans un design insensé". Oui, je sais, mon patron est un trou du cul.

Nisanio
la source
Ensuite, avec Literate Programming, ils pourraient penser que vous êtes occupé à écrire Sci-Fi Book au lieu d'un autre logiciel! : D
Mahdi
De telles entreprises ne comprennent pas que les bons logiciels vivent très longtemps et que la meilleure documentation vaut la source.
Thorbjørn Ravn Andersen
2

Les codeurs écrivent du code non anglais.

Les codeurs n'aiment pas écrire de la documentation car cela n'aide pas l'exécution du code.

Les codeurs ne sont pas bons pour rédiger de la documentation car c'est un moyen médiocre pour exprimer leurs idées.

La programmation alphabétisée semble être l'idée de faire passer la documentation au niveau supérieur où le code est plutôt une réflexion après coup. Peut-être que cela fonctionnerait, mais pour la plupart des codeurs, cela ressemble à une documentation désagréable.

Winston Ewert
la source
29
Les codeurs qui adhèrent aux points que vous décrivez ne sont pas des codeurs que je veux travailler avec moi.
Paul Nathan
1
@ Paul, d'accord. Mais c'est vraiment là-bas. Mais il me semble que plus de documentation n'est pas nécessairement meilleure.
Winston Ewert
1
c'est peut-être mieux
mlvljr
6
les programmeurs expérimentés savent qu'ils ont besoin d'écrire de la documentation parce que c'est là que va "POURQUOI je l'ai fait comme ça".
1
@ Thorbjørn Ravn Andersen, oui c'est vrai. Mais la programmation lettrée, (si je comprends bien) suggère que vous écriviez du code avec votre documentation au lieu de la documentation avec votre code. Cette documentation est-elle vraiment utile?
Winston Ewert
2

Principalement parce que les gens sont TRÈS STUPIDES. Un témoignage évident dont est un flot incessant de suppositions et de malentendus exprimés par les jeunes sur la nature de cette technique simple.

Les gens considèrent LP comme: (a) une méthode de documentation (b) une méthode d'écriture d'essais raffinés qui nécessite des compétences ou des talents spéciaux (c) n'ont tout simplement aucune idée - en tant que créateur de l'éditeur de programmation Leo, de son propre aveu etc. etc. etc.

LP est cependant simplement: (1) écrire des programmes dans un mélange de code et de phrases dans un (= n'importe quel) langage humain, où ce dernier représente d'autres morceaux de code et / ou des phrases incluses. C'est précisément ce que font les auteurs d'innombrables manuels de programmation .. et (2) c'est un simple préprocesseur qui étend ces phrases chez l'homme (qui est devenu comme si les noms des sous-programmes inclus) pour démêler le résultat DANS L'ORDRE REQUIS PAR LE COMPILATEUR (ou interprète). Sinon, on peut développer le texte écrit avec un autre petit utilitaire pour inclure des symboles de mise en forme pour transformer la "source alphabétisée" en un joli texte lisible bien formaté.

Les jeunes n'essaient jamais cette idée extrêmement simple - et fantasment ou imaginent de fausses raisons pour lesquelles ils n'essaieront jamais ou ne le feront jamais.

Fondamentalement, l'idée principale de programmer "en pseudocode" écrit dans un langage humain et de l'étendre ensuite avec un simple utilitaire de préprocesseur AIDE À GÉRER L'ATTENTION (limité, une difficulté principale pour tout programme long), un peu comme le pliage de code ou la division de votre flux de programme en fonctions / sous-programmes, nécessaires pour que vous ne vous perdiez pas dans les détails, mais totalement inutiles pour l'exécution de la machine.


la source
3
Il vous manque un élément important: (3) un moyen de réorganiser un code dans n'importe quelle langue dans la séquence la plus lisible et naturelle, qui n'est pas nécessairement le même ordre qu'un compilateur doit gérer. Cela inclut le masquage des détails d'implémentation dans les notes de bas de page ou ailleurs loin du plan du code.
SK-logic
1

Il y a 2 aspects de la programmation littéraire que je ne souhaite ont été intégrés dans la programmation grand public - l' imagerie embarquée (par exemple, des schémas de conception) et des pointeurs vers des tentatives antérieures et alternatives (par exemple, « La raison pour laquelle il est comme ça parce que j'essayé cette autre façon et cela n'a pas fonctionné parce que ... "). Ces deux aspects peuvent être traités avec doc-comments et URI.

Larry OBrien
la source
1

Parce que la logique des programmes ne fonctionne pas de la même manière que nous parlons. Un programme a un flux, des conditions et des boucles bien spécifiés.

Après avoir beaucoup codé, je pense en ces termes. Mon cerveau transforme les problèmes dans le domaine cible du code exécutable. Et il est beaucoup plus efficace pour moi d'écrire cela dans un langage de programmation habituel, que d'avoir à faire l'étape de transformation supplémentaire pour faire lire mes programmes.

En fait, je crois que mes programmes sont déjà alphabétisés ... identifiants parlants, bons noms de fonction, commentaires où j'ai fait du piratage que je ne comprendrais pas moi-même immédiatement après quelques mois.

Pour conclure: Mon code Java est plus lettré par lui-même que toute programmation "lettrée" veut l'être.

Daniel
la source
2
Un code Java ne peut pas être alphabétisé. Vos "identifiants parlants" n'expliqueront jamais pourquoi vous choisissez cet algorithme particulier plutôt qu'un autre, quelles sont les limites, quelle était votre attente de profil de performance, etc. Mes programmes alphabétisés sont principalement composés de formules, de diagrammes et de graphiques, et pas tant texte en anglais. Mais tout cela ne peut pas être exprimé dans un code et regarder laid dans de simples commentaires.
SK-logic
1

J'en suis venu à lire la programmation dans l'autre sens - j'ai rêvé d'avoir le code organisé comme il me convient, pas comme le compilateur l'exige. J'ai trouvé Leo presque idéal pour cela. Il prend également en charge le suivi des fichiers modifiés à l'extérieur. Ces fichiers ne doivent pas contenir de balisage spécial, je peux donc utiliser Leo pour moi-même sans que les autres membres de l'équipe le sachent. Cette fonctionnalité - "@shadow trees" - est très prometteuse, bien que toujours un peu boguée, a besoin de plus de globes oculaires. Et il résout également le problème «oh non, tout dans un gros fichier» à la fois en organisant tout en arborescence et en prenant en charge les fichiers externes.

Pour moi, contrairement à son nom, la "programmation lettrée" ne concerne pas du tout la documentation. Je n'ai pas plus de documentation qu'auparavant. Il s'agit d'avoir une structure qui m'aide à ne pas me perdre . Je le jure surtout lors de la gestion de fichiers JSP géants (et que malgré Leo était initialement destiné principalement à Python et qu'il ne prend pas en charge le langage JSP - je dois diviser le fichier en arbre Leo manuellement!).

Juraj
la source
0

Je le vois comme un outil pédagogique précieux, où une dissertation sur le code peut être écrite, puis des extraits de code de travail entrelacés pour informer les lecteurs sur les façons, quoi et pourquoi du code.

En dehors d'un environnement purement éducatif, je pense que seul Knuth comprend vraiment la meilleure façon de l'utiliser.

gris-fondu
la source
-4

C'est le pire de tous les mondes - vous devez écrire un programme informatique très correct et très spécifique dans une langue très non spécifique = anglais. Vous devez donc l'écrire soigneusement en utilisant exactement les phrases correctes - vous pourriez donc aussi bien écrire du code.

Martin Beckett
la source
3
Vous ne devez pas répéter votre code en anglais. Les commentaires doivent expliquer la raison pour laquelle le code est là, pas ce qu'il fait. Je fourre souvent des graphiques, des diagrammes et des tracés dans mes commentaires lettrés, et cela aide vraiment à comprendre le code.
SK-logic
Si les commentaires ne disent pas ce que fait le code, alors comment est-il une programmation alphabétisée - c'est juste une programmation régulière avec des commentaires. Je pensais que le but de la programmation alphabétisée était de décrire le programme dans les documents et que le système génère du code à partir de la documentation?
Martin Beckett
3
essayez de lire "TeX, le programme". Le code n'est jamais répété dans les commentaires. Commentaires explique pourquoi le code est écrit de cette façon et explique l'architecture.
SK-logic
3
@MartinBeckett Ce que vous décrivez n'est pas LP.
Andres F.