Perché non è mainstream la programmazione alfabetizzata? [chiuso]


32

La programmazione alfabetica ha buoni ideali. Perché pensi che questo non sia mainstream? È perché non è riuscito a consegnare?


2
Perché gli strumenti che sono stati sviluppati per questo sono ancora piuttosto deboli. Microsoft probabilmente ha la possibilità di essere leader in questo senso.
Giobbe

3
Quando mi rivolgo a un nuovo problema, utilizzo spesso la mia stenografia "Literate Programming" usando carta e matita. Mi permette di ignorare la semantica del linguaggio e mescolarmi nel linguaggio umano per descrivere quelle cose che saranno chiamate funzioni, ecc.
Oosterwal

1
Persino Knuth non è più convinto di questo concetto: "E stiamo abbandonando la vecchia nozione di" programmazione alfabetica "che ho usato durante lo sviluppo di TEX82, perché la documentazione si è rivelata troppo dolorosa". tug.org/TUGboat/tb31-2/tb98knut.pdf .
h0b0,

6
Per coloro che non hanno familiarità con TeX e la sua filosofia, va detto che la citazione di Knuth è molto probabilmente intesa ironicamente.

3
@ h0b0 & user1249: L'intero articolo di Knuth è ironico, come puoi scoprire leggendolo. Inoltre prende in giro Steve Jobs, il web, Agile, refactoring, OOP, AOP e molte altre cose. È uno scherzo!
Andres F.

Risposte:


35

L'ho visto per la prima volta in un libro degli scritti di Knuth e ho pensato che fosse pulito. Quindi ho provato a usare il display di programmazione letteraria per comprendere cosa stava succedendo nel programma e l'ho trovato più difficile di quanto sembrasse. Potrebbe essere stato che ero troppo abituato a consultare gli elenchi dei programmi, ma sembrava confuso.

Poi ho guardato il codice sorgente e quello mi ha spento e poi lì. Dovrei imparare a scrivere programmi in un modo completamente nuovo, con meno corrispondenza tra il testo del programma e ciò che il compilatore ha visto, e non ho visto alcun beneficio corrispondente.

Inoltre, le persone possono scrivere argomenti lunghi e convincenti sul fatto che il codice stia facendo X quando in realtà sta facendo Y, e ho incontrato la mia parte di commenti fuorvianti. Ho sviluppato una passione per la lettura del codice per vedere cosa sta facendo abbastanza presto. La programmazione alfabetica ne è l'antitesi.


4
La programmazione alfabetica, così come i commenti in generale, non riguarda ciò che il codice sta facendo. Puoi leggerlo dal codice stesso. Riguarda il perché e il come e queste informazioni essenziali mancano quasi sempre senza un'adeguata programmazione alfabetica. Inutile dire che la parte " perché? " Abbastanza spesso coinvolgerebbe matematica elaborata e complicata, a volte grafici e tabelle, a volte diagrammi. Sono necessari strumenti di programmazione per mantenere tali commenti in modo leggibile.
SK-logic,

1
@ SK-logic fair, ma il punto che David Thornley sta facendo è che anche il PERCHÉ può rivelarsi una bugia fuorviante (una che in realtà è ancora più difficile da capire).
MrFox,

1
+1 Knuth stava scrivendo nei giorni (tematici) del selvaggio west della programmazione quando lavorare in un linguaggio "avanzato" significava scrivere "C" quasi sopra il metallo invece di usare il codice macchina. La memoria era una variabile così stretta e altri nomi erano generalmente solo lettere singole, spesso riutilizzati da un ambito all'altro. La stragrande maggioranza dei programmi in cui uno scatto chiavi in ​​mano scritto e mantenuto da una persona ciascuno con il suo stile eccentrico. Dover assumere una base di codice era più decifrante che leggere. Non c'era controllo del codice sorgente ecc. Per dare una mano.
TechZen,

1
Knuth stava guardando in fondo alla strada, 30 anni fa oggi. Sapeva che i programmi sarebbero diventati più grandi, più complicati, sarebbero stati scritti da team con membri in movimento, avrebbero funzionato per anni o decenni e avrebbero richiesto input, valutazione e infine accettazione da parte di non programmatori. La programmazione alfabetica è stata un'idea per affrontare tutto ciò. Stava analizzando ciò che oggi chiamiamo business logic e BDD. L'idea di base è che i programmatori saprebbero cosa fare e che i non programmatori potrebbero seguire. Come notato, l'idea è fallita perché non esiste alcun meccanismo per imporre il collegamento tra il testo "letterato" e il codice.
TechZen,

A proposito: questo è il motivo per cui mi piacciono i linguaggi di "auto-documentazione" come Objective-C. Inizialmente il codice sembra ingombra di nomi di metodi assurdamente lunghi, ma anche un programmatore che non conosce la lingua o l'API può rapidamente capire cosa sta facendo il codice. Ma soprattutto, cambia il codice e i "commenti" cambiano automaticamente in sincronia. Naturalmente, ecco perché Objective-C è stato scritto con il completamento automatico incorporato. Senza di esso, scrivere Objective-C è piuttosto infernale.
TechZen,

13

Darei la colpa all'effetto rete . Per consentire ad altre persone di modificare il codice e la documentazione, devono essere in grado di capirlo.

Questo allontana le persone da qualcosa come cweb / noweb, perché usarli richiederebbe di imparare TeX e la sintassi specifica del programma in aggiunta al linguaggio di programmazione che stai usando per il progetto. Questo può essere visto come un'enorme perdita di tempo, soprattutto se non hanno bisogno di alcun tipo di composizione matematica che è un grande richiamo per TeX in primo luogo. (E per molti programmatori di applicazioni, non ne avranno davvero bisogno.) Invece preferiscono qualcosa come i commenti XML di Visual Studio, perché è già popolare e consolidato.

I posti in cui ho visto decollare la programmazione letteraria sono nel calcolo scientifico / statistico, dove la maggior parte dei programmatori ha una formazione significativa (alias PhD) in matematica, CS o statistica, e quindi ha già familiarità con LaTeX. La documentazione che scrivono è più probabile che includa molte formule complicate che sono meglio scritte in TeX e che hanno maggiori probabilità di programmare in R. La percentuale di programmatori R che conoscono SWeave è decisamente molto più alta di, diciamo, proporzione di programmatori C che conoscono cweb.


2
Questa risposta sembra presumere che tutti gli strumenti di programmazione alfabetica stiano utilizzando LaTeX. È vero? Non sembra esserci nulla nel concetto che lo richiede.
AShelly,

@AShelly: non è necessario - so che ora noweb ti consente di usare HTML. Ma in pratica, le persone che scrivono documentazione HTML useranno javadoc e simili invece di strumenti di programmazione letterati.
Larry Wang,

1
@Shelly, per far funzionare la programmazione alfabetica, devi essere in grado di generare il documento da stampare. Questo è molto, molto più semplice quando il formato è basato su testo e, per quanto ne so, il più potente formattatore di documenti basato su testo è TeX, e il modo più semplice di lavorare con TeX è usare LaTeX.

@Shelly potresti dare un'occhiata al org-modesupporto per la programmazione alfabetica . È abbastanza utile e trovo molto più facile da comprendere (per non parlare della gestione ) del solo WEB o NOWEB. Un aspetto importante del codice è la leggibilità, e questo è leggibile. (cf github.com/vermiculus/stack-mode )
Sean Allred

12

Sono rimasto affascinato dal concetto di programmazione letteraria alla fine degli anni '90 mentre studiavo e sono ancora incuriosito dall'approccio di Knuths alla programmazione e alla composizione. Nient'altro che il meglio farà.

Il sistema di programmazione letteraria progettato da Knuth ha fatto molto, molto di più di quanto non sembri immediatamente, superando molte carenze nel linguaggio di programmazione sottostante che lo strumento di generazione del codice ha generato dal documento sorgente di Knuths, ovvero lo standard Pascal.

Per quelli abbastanza fortunati da non aver provato lo Standard Pascal, ecco alcuni dei punti salienti.

  • Per rendere più semplice avere un compilatore single-pass, le specifiche del linguaggio dicevano che tutte le dichiarazioni dovevano arrivare in un certo ordine. Dalla pagina di Wikipedia: "Ogni procedura o funzione può avere le proprie dichiarazioni di goto etichette, costanti, tipi, variabili e altre procedure e funzioni, che devono essere tutte in questo ordine." Questo significava che non potevi raggruppare le tue cose logicamente insieme nel file sorgente.
  • La gestione delle stringhe era più noiosa che nella pianura C.
  • Gli identificatori non potevano avere una lunghezza arbitraria.
  • Molte altre cose che non ricordo più.

Tutte queste cose sostanzialmente significavano che Knuth aveva bisogno di un linguaggio di programmazione migliore (così ne inventò uno) e usava Pascal come linguaggio di assemblaggio.

La maggior parte dei linguaggi moderni può fare queste cose senza troppi sforzi, quindi rimuovendo una GRANDE parte del lavoro che la Programmazione Letterata avrebbe dovuto risolvere.

Anche i linguaggi moderni sono più espressivi e consentono di inserire più codice nel codice stesso.

Quindi, cosa rimane? La capacità di generare una forma composta di documentazione dal codice sorgente e CHE esiste oggi.

Basti pensare a JavaDoc: l'API Java runtime è forse il più grande pezzo di Literate Programming disponibile oggi (tranne per il fatto che il codice non è effettivamente presentato, ma POTREBBE essere stato se Java fosse open source dall'inizio). Vedi ad esempio la presentazione del framework delle collezioni su http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

Credo che esistano sistemi simili per .NET e altri programmi tradizionali.


To make it possible to have a single-pass compiler, all declarations had to come in a certain order. Un ordine di dichiarazione del genere semplifica sicuramente la progettazione del compilatore, ma non abilita / impedisce la compilazione a passaggio singolo. Delphi, ad esempio, non ha questa restrizione all'ordine, ma è comunque un compilatore Pascal rigorosamente single-pass.
Mason Wheeler,

Concordato. Anche Turbo Pascal non aveva questa limitazione. Si noti, tuttavia, che questa limitazione era nella definizione di Pascal sin dall'inizio.

1
No, Knuth è passato a CWEB molto tempo fa, non si tratta di correggere le carenze di Pascal. No, JavaDoc non ha nulla a che fare con la "programmazione letterata" di Knuth - sta parlando di cambiare radicalmente il modo in cui crea il codice, e affermando che gli permette di affrontare la complessità che afferma non sarebbe altrimenti possibile per lui o per chiunque.
Ron Burk,

@RonBurk CWEB si compila semplicemente in un "linguaggio assembly" migliore. Ciò non invalida le decisioni di progettazione originali.
Thorbjørn Ravn Andersen,

5

Una cosa che ho scoperto quando ho avuto la mia avventura con la programmazione letterata negli anni '90 è che ha attratto persone molto appassionate che volevano fare esattamente The Right Thing - e ciò ha comportato la scrittura del proprio sistema di programmazione letterato perché nessuno esistente era abbastanza buono per loro. noweb è stato un buon tentativo di interromperlo fornendo un minimo comune denominatore abbastanza buono per tutti, anche se anche allora ho trascorso la maggior parte del mio tempo LP a sviluppare una bella stampante per questo ...

Un altro problema è che è davvero anti-agile. In un certo senso, essere rallentati è positivo perché ti costringe a pensare più in anticipo e fare le cose bene la prima volta. D'altra parte, documentare meticolosamente mentre procedi significa che c'è un grande ostacolo al refactoring del tuo codice. E se aspetti fino a quando il tuo codice non sarà indurito prima di LP-ify, finirai con un'attività di documentazione di più giorni, che può davvero fermarti nelle tue tracce.


Dopo aver sperimentato, ho scoperto che il punto debole di LP per il resto di noi, potrebbe essere nel documentare le decisioni di progettazione e i dettagli dell'architettura proprio accanto al codice reale. Sono d'accordo con LP che è più difficile da refactoring. Comprendo che Knuth ha realizzato il progetto iniziale su carta e solo quando soddisfatto ha iniziato la realizzazione effettiva. Questa è probabilmente la stessa situazione in cui trovo che funzioni per me.
Thorbjørn Ravn Andersen,

3

Secondo le mie modeste opinioni, molte aziende hanno una cultura che è l'opposto degli obiettivi della programmazione alfabetica: vogliono risultati più rapidi (piangono solo sulla qualità quando l'app è in produzione). Nella mia esperienza, i miei capi si sono rifiutati di capire che risultati più rapidi non significano "un programma eseguibile il giorno dopo averlo chiesto". Per loro, se uno sviluppatore non è impegnato a digitare sulla tastiera, non sta lavorando, "sta sprecando il suo tempo nel design senza senso". Sì, lo so, il mio capo è un buco del culo.


Quindi con Literate Programming potrebbero pensare che sei impegnato a scrivere un libro di fantascienza invece di un altro software! : D
Mahdi,

Aziende del genere non capiscono che un buon software vive a lungo e che migliore è la documentazione e più vale la fonte.
Thorbjørn Ravn Andersen,

2

I programmatori scrivono codice non in inglese.

Ai programmatori non piace scrivere la documentazione perché non aiuta l'esecuzione del codice.

I programmatori non sono bravi a scrivere documentazione perché è un mezzo mediocre per esprimere le loro idee.

La programmazione alfabetica sembra essere l'idea di portare la documentazione al livello successivo in cui il codice è più un ripensamento. Forse funzionerebbe, ma per la maggior parte dei programmatori sembra una documentazione odiosa.


29
I programmatori che aderiscono ai punti che descrivi non sono programmatori che voglio lavorare con me.
Paul Nathan,

1
@Paul, garantito. Ma è quello che c'è davvero là fuori. Ma mi sembra che una maggiore documentazione non sia necessariamente migliore.
Winston Ewert,

1
abbastanza è forse il migliore
mlvljr

6
programmatori esperti sanno che DEVONO scrivere documentazione perché è lì che va "PERCHÉ l'ho fatto così".

1
@ Thorbjørn Ravn Andersen, sì, è vero. Ma la programmazione alfabetica, (per quanto ho capito) suggerisce che tu scriva il codice con la tua documentazione anziché la documentazione con il tuo codice. Quanta documentazione è davvero utile?
Winston Ewert,

2

Principalmente perché le persone sono MOLTO stupide. Un'evidente testimonianza a cui è un flusso infinito di ipotesi e incomprensioni espresse dai giovani sulla natura di questa semplice tecnica.

La gente considera LP come: (a) un metodo di documentazione (b) un metodo per scrivere alcuni saggi raffinati che richiedono alcune abilità o talenti speciali (c) semplicemente non hanno idea - come il creatore dell'editor di programmazione Leo, per sua stessa ammissione ecc. ecc. ecc.

LP è semplicemente: (1) scrivere programmi in una combinazione di codice e frasi in un (= qualsiasi) linguaggio umano, dove quest'ultimo rappresenta altri pezzi di codice e / o frasi incluse. Questo è esattamente ciò che fanno gli autori di innumerevoli libri di programmazione. interprete). Altrimenti si può espandere il testo scritto con un'altra piccola utility per includere simboli di formattazione per trasformare la "fonte letterata" in un bel testo ben formattato.

I giovani non provano mai questa idea estremamente semplice - e nemmeno fantasticare o immaginare falsi motivi per cui non proveranno mai a farlo.

Fondamentalmente l'idea principale di programmare "in pseudocodice" scritto in un linguaggio umano e poi di espanderlo con una semplice utility di preprocessore AIUTA GESTIONE ATTENZIONE (limitata, una difficoltà principale per qualsiasi programma longish), praticamente come la piegatura del codice o la divisione del flusso del programma in funzioni / subroutine, necessarie per non perdersi nei dettagli, ma del tutto inutili per l'esecuzione della macchina.


3
Ti manca un bit importante: (3) un modo per riordinare un codice in qualsiasi lingua nella sequenza più leggibile e naturale, che non è necessariamente lo stesso ordine che deve avere un compilatore. Include nascondere i dettagli dell'implementazione nelle note a piè di pagina o in qualsiasi altro posto lontano dalla struttura del codice.
Logica SK

1

Ci sono 2 aspetti di programmazione letterata che io faccio desiderio sono stati inseriti nella programmazione principale - immagini incorporato (ad esempio, schemi di progettazione) e puntatori ai tentativi precedenti e alternativi (ad esempio, "La ragione è che questo è perché ho provato questo altro modo e non ha funzionato perché ... "). Entrambi questi aspetti possono essere gestiti con commenti doc e URI.


1

Perché la logica dei programmi non funziona allo stesso modo in cui parliamo. Un programma ha un flusso ben specificato, condizioni e loop.

Dopo aver programmato molto, PENSO in questi termini. Il mio cervello trasforma i problemi nel dominio target del codice eseguibile. Ed è molto più efficiente per me scrivere questo in un linguaggio di programmazione solitamente, piuttosto che dover fare il passo di trasformazione extra per rendere i miei programmi letterati.

In effetti, credo che i miei programmi siano già alfabetizzati ... parlando di identificatori, nomi di buone funzioni, commenti in cui ho fatto un po 'di hacker che non avrei capito immediatamente dopo alcuni mesi.

Per concludere: il mio codice Java è più alfabetizzato da solo come ogni programmazione "alfabetizzata" vuole essere.


2
Un codice Java non può essere alfabetizzato. I tuoi "identificatori parlanti" non spiegheranno mai perché hai scelto questo particolare algoritmo piuttosto che un altro, quali sono i limiti, quali erano le aspettative del tuo profilo prestazionale, ecc. I miei programmi alfabetici sono fatti principalmente di formule, diagrammi e grafici e non molto testo inglese. Ma tutto ciò non può essere espresso in un codice e apparire brutto all'interno di semplici commenti.
Logica SK

1

Ho imparato a programmare al contrario: ho sognato di organizzare il codice secondo le mie esigenze, non come il compilatore lo richiede. Ho trovato Leo quasi ideale per questo scopo. Supporta anche il monitoraggio dei file modificati all'esterno. Questi file non devono contenere alcun markup speciale, quindi posso usare Leo per me stesso senza che gli altri membri del team lo sappiano. Questa funzione - "@shadow trees" - è molto promettente, anche se ancora buggy, ha bisogno di più bulbi oculari. E risolve anche il problema "oh no, tutto in un unico grande file" sia organizzando tutto in struttura ad albero che supportando i file esterni.

Per me, contrariamente al nome, la "programmazione alfabetica" non riguarda affatto la documentazione. Non ho più documentazione di prima. Si tratta di avere una struttura che mi aiuta a non perdersi . Lo giuro soprattutto quando gestisco i file JSP di behemoth (e che nonostante Leo fosse originariamente destinato principalmente a Python e non abbia il supporto per il linguaggio JSP, devo dividere il file nell'albero di Leo manualmente!).


0

Lo vedo come un prezioso strumento di insegnamento, in cui è possibile scrivere una tesi sul codice, e quindi frammenti di codice funzionante interlacciati in esso per istruire i lettori su come, cosa e perché del codice.

Al di fuori di un ambiente puramente educativo, penso che solo Knuth capisca davvero come utilizzarlo al meglio.


-4

È il peggiore di tutti i mondi: devi scrivere un programma per computer altamente corretto e altamente specifico in una lingua non specifica = inglese. Quindi devi scriverlo con cura usando esattamente le frasi corrette, quindi potresti anche semplicemente scrivere codice.


3
Non dovresti ripetere il codice in inglese. I commenti devono spiegare il motivo per cui il codice è presente, non quello che sta facendo. Spesso inserisco grafici, diagrammi e grafici nei miei commenti letterati e mi aiuta davvero a capire il codice.
Logica SK

Se i commenti non dicono che cosa sta facendo il codice, allora come è la programmazione alfabetica - è solo una programmazione regolare con commenti. Pensavo che il punto centrale della programmazione alfabetica fosse descrivere il programma nei documenti e far sì che il sistema generasse codice dalla documentazione?
Martin Beckett,

3
prova a leggere "TeX, il programma". Il codice non viene mai ripetuto nei commenti lì. Commenti spiega perché il codice è scritto in questo modo e spiega l'architettura.
SK-logic

3
@MartinBeckett Quello che descrivi non è LP.
Andres F.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.