Por que a programação alfabetizada não é mainstream? [fechadas]


32

A programação alfabetizada tem bons ideais. Por que você acha que isso não é popular? É porque não conseguiu entregar?


2
Porque as ferramentas que foram desenvolvidas para isso ainda são muito fracas. A Microsoft provavelmente tem uma chance de liderar nesse sentido.
Job

3
Ao abordar um novo problema, costumo usar meu próprio atalho de 'Programação alfabética' usando lápis e papel. Ele me permite ignorar semântica da linguagem e misture em linguagem humana para descrever aquelas coisas que serão chamados funções, etc.
Oosterwal

1
Até Knuth não está mais convencida desse conceito: "E estamos abandonando a velha noção de“ programação alfabetizada ”que eu usei ao desenvolver o TEX82, porque a documentação provou ser uma dor demais". tug.org/TUGboat/tb31-2/tb98knut.pdf .
H0b0

6
Para aqueles que não estão familiarizados com o TeX e sua filosofia, deve-se mencionar que a citação de Knuth provavelmente é significada ironicamente.

3
@ h0b0 & user1249: O artigo completo de Knuth é irônico, como você pode descobrir apenas lendo-o rapidamente. Ele também zomba de Steve Jobs, da web, Agile, refatoração, OOP, AOP e muitas outras coisas. É uma piada!
11133 Andres F.

Respostas:


35

Eu o vi pela primeira vez em um livro dos escritos de Knuth e achei que parecia arrumado. Depois, tentei usar a tela de programação literária para compreender o que estava acontecendo no programa e achei mais difícil do que parecia. Pode ter sido que eu estava muito acostumado a passar por listagens de programas, mas parecia confuso.

Então eu olhei para o código fonte, e isso me desligou de vez em quando. Eu teria que aprender a escrever programas de uma maneira totalmente nova, com menos correspondência entre o texto do programa e o que o compilador viu, e não viu nenhum benefício correspondente.

Além disso, as pessoas podem escrever argumentos longos e convincentes de que o código está fazendo X quando está realmente fazendo Y, e eu me deparei com minha parte de comentários enganosos. Eu desenvolvi uma predileção por ler o código para ver o que ele está fazendo bastante cedo. A programação alfabetizada é a antítese disso.


4
A programação alfabetizada, assim como os comentários em geral, não é sobre o que seu código está fazendo. Você pode ler isso no próprio código. É tudo sobre o porquê e como , e essas informações essenciais quase sempre estão ausentes sem uma programação alfabética adequada. Desnecessário mencionar que a parte " por quê? " Frequentemente envolve matemática elaborada e complicada, às vezes tramas e tabelas, às vezes diagramas. São necessárias ferramentas de programação letradas para manter esses comentários de maneira legível.
SK-logic

1
@ Feira da SK-logic, mas o ponto que David Thornley está fazendo é que até o POR QUE pode se tornar uma mentira enganosa (uma que é realmente ainda mais difícil de entender).
MrFox 11/11/12

1
+1 Knuth estava escrevendo nos dias selvagens (temáticos) do oeste da programação quando trabalhar em uma linguagem "avançada" significava escrever "C" quase em cima do metal, em vez de usar código de máquina. A memória era uma variável tão restrita e outros nomes eram geralmente apenas letras únicas, frequentemente reutilizadas de escopo para escopo. A grande maioria dos programas em que os turn-key one são escritos e mantidos por uma pessoa, cada um com seu próprio estilo excêntrico. Ter que assumir uma base de código era mais descriptografar do que ler. Não havia controle de origem, etc. para ajudar.
TechZen

1
Knuth estava olhando a estrada, 30 anos atrás hoje. Ele sabia que os programas se tornariam maiores, mais complicados, escritos por equipes com membros em turno, seriam executados por anos ou décadas e exigiriam contribuições, avaliação e, eventualmente, aceitação de não-programadores. A programação alfabetizada foi uma ideia para abordar tudo isso. Ele estava pesquisando o que hoje chamamos de lógica de negócios e BDD. A idéia principal é que os programadores saberiam o que fazer e os que não são programadores poderiam acompanhar. Como observado, a idéia falhou porque não existe nenhum mecanismo para impor a ligação entre o texto "alfabetizado" e o código.
TechZen

BTW: É por isso que eu gosto de linguagens de "auto-documentação" como o Objective-C. No início, o código parece muito confuso com nomes de métodos absurdamente longos, mas mesmo um programador que não conhece a linguagem ou a API pode rapidamente descobrir o que o código está fazendo. O melhor de tudo é que altere o código e os "comentários" serão automaticamente sincronizados. Obviamente, é por isso que o Objective-C foi escrito com o preenchimento automático incorporado. Sem ele, escrever o Objective-C é um inferno.
TechZen

13

Eu culparia o efeito de rede . Para que outras pessoas editem seu código e documentação, elas devem ser capazes de entendê-lo.

Isso afasta as pessoas de algo como cweb / noweb, porque usá-las exigiria que você aprendesse o TeX e a sintaxe específica do programa sobre a linguagem de programação que você está usando para o projeto. Isso pode ser visto como uma enorme perda de tempo, especialmente se eles não precisarem de nenhuma composição matemática que seja um grande atrativo para o TeX. (E para muitos programadores de aplicativos, eles realmente não precisam disso.) Em vez disso, preferem algo como os comentários XML do Visual Studio, porque isso já é popular e bem estabelecido.

Os lugares onde eu vi a programação alfabetizada decolar são na computação científica / estatística, onde a maioria dos programadores tem treinamento significativo (também conhecido como PhDs) em matemática, CS ou estatística e, portanto, já conhece o LaTeX. A documentação que eles escrevem tem mais probabilidade de incluir muitas fórmulas complicadas que são melhor escritas em TeX, e é mais provável que estejam programando em R. A proporção de programadores R que conhecem o SWeave é definitivamente muito maior do que, digamos, o proporção de programadores C que conhecem cweb.


2
Esta resposta parece assumir que todas as ferramentas de programação alfabetizadas estão usando o LaTeX. Isso é verdade? Não parece haver nada sobre o conceito que o exija.
ASHelly

@ AShelly: Não é necessário - eu sei que o noweb, pelo menos, permite que você use HTML. Mas, na prática, as pessoas que escrevem documentação em HTML usarão javadoc e similares em vez de ferramentas de programação alfabetizadas.
Larry Wang

1
@AShelly, para que a programação alfabetizada funcione, você precisa gerar o documento a ser impresso. Isso é muito, muito mais fácil quando o formato é baseado em texto, e que eu saiba, o formatador de documentos mais poderoso é o TeX, e a maneira mais fácil de trabalhar com o TeX é usando o LaTeX.

@AShelly, você pode dar uma olhada no org-modesuporte da programação alfabetizada . É bastante útil, e acho muito mais fácil compreender (para não mencionar gerenciar ) do que WEB ou NOWEB sozinho. Um aspecto importante do código é a legibilidade, e isso é legível. (cf github.com/vermiculus/stack-mode )
Sean Allred

12

Fiquei fascinado com o conceito de programação alfabetizada no final dos anos 90, enquanto estudava, e ainda estou intrigado com a abordagem de Knuths sobre programação e composição tipográfica. Nada além do melhor fará.

O sistema de programação alfabetizada que Knuth projetou fez muito, muito mais do que imediatamente aparece, ou seja, supera muitas deficiências na linguagem de programação subjacente que a ferramenta de geração de código gerada a partir do documento fonte de Knuths, o Pascal padrão.

Para quem teve a sorte de não ter experimentado o Standard Pascal, aqui estão alguns dos destaques.

  • Para tornar mais fácil ter um compilador de passagem única, a especificação da linguagem dizia que todas as declarações tinham que vir em uma determinada ordem. Na página da wikipedia: "Cada procedimento ou função pode ter suas próprias declarações de rótulos, constantes, tipos, variáveis ​​e outros procedimentos e funções, que devem estar nessa ordem". Isso significava que você não podia agrupar suas coisas logicamente no arquivo de origem.
  • O manuseio de cordas era mais tedioso do que o simples C.
  • Os identificadores não podem ter comprimento arbitrário.
  • Muitas outras coisas que não consigo mais lembrar.

Todas essas coisas basicamente significavam que Knuth precisava de uma linguagem de programação melhor (então ele inventou uma) e usou Pascal como sua linguagem assembly.

A maioria das linguagens modernas pode fazer essas coisas sem muito esforço, removendo, portanto, uma GRANDE parte do trabalho que a programação alfabetizada deveria resolver.

As linguagens modernas também são mais expressivas, permitindo que mais pensamento seja inserido no próprio código.

Então, o que resta? A capacidade de gerar uma forma de documentação tipográfica a partir do código-fonte, e ISSO existe hoje.

Pense no JavaDoc - a API de tempo de execução Java é talvez a maior parte da programação alfabética disponível atualmente (exceto que o código não é realmente apresentado, mas poderia ter sido se o Java fosse de código aberto desde o início). Veja, por exemplo, a apresentação da estrutura de coleções em http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

Acredito que existem sistemas semelhantes para .NET e outros programas convencionais.


To make it possible to have a single-pass compiler, all declarations had to come in a certain order. Uma ordem de declaração como essa certamente simplifica o design do compilador, mas não habilita / impede a compilação de passagem única. O Delphi, por exemplo, não possui essa restrição de ordem, mas ainda é um compilador Pascal estritamente de passagem única.
Mason Wheeler

Acordado. O Turbo Pascal também não tinha essa restrição. Observe, no entanto, que essa restrição estava na definição de Pascal desde o início.

1
Não, Knuth mudou para o CWEB há muito tempo, não se trata de corrigir deficiências de Pascal. Não, o JavaDoc não tem nada a ver com a "programação alfabetizada" de Knuth - ele está falando sobre mudar fundamentalmente como ele cria código, e alegando que isso permite que ele lide com a complexidade que ele afirma que de outra forma não seria possível para ele ou qualquer outra pessoa.
Ron Burk

O @RonBurk CWEB apenas compila para uma melhor "linguagem assembly". Isso não invalida as decisões de design originais.
Thorbjørn Ravn Andersen

5

Uma coisa que descobri quando me envolvi com programação letrada nos anos 90 foi que ela atraiu pessoas muito apaixonadas que queriam fazer exatamente a coisa certa - e isso envolveu escrever seu próprio sistema de programação letrado, porque nenhum existente era bom o suficiente para elas. noweb foi uma boa tentativa de reduzir isso, fornecendo um denominador menos comum o suficiente para todos, embora mesmo assim, eu passasse a maior parte do tempo do meu LP desenvolvendo uma impressora bonita para ele ...

Outra questão é que é realmente anti-ágil. De certa forma, diminuir a velocidade é bom porque obriga a pensar com mais antecedência e a acertar as coisas da primeira vez. Por outro lado, documentar meticulosamente à medida que você avança significa que há uma grande barreira para refatorar seu código. E se você esperar até que seu código seja fortalecido antes de liberá-lo, você terminará com uma tarefa de documentação de vários dias, que poderá realmente impedi-lo.


Depois de experimentar, descobri que o ponto ideal do LP para o resto de nós pode estar na documentação de decisões de design e detalhes da arquitetura, ao lado do código real. Eu concordo que o LP seja mais difícil de refatorar. Entendo que Knuth fez o design inicial no papel e somente quando satisfeito começou a implementação real. Esta é provavelmente a mesma situação que eu acho que funciona para mim.
Thorbjørn Ravn Andersen

3

Na minha humilde opinião, muitas empresas têm uma cultura oposta aos objetivos da programação alfabetizada: desejam resultados mais rápidos (só choram por qualidade quando o aplicativo está em produção). De acordo com minha própria experiência, meus chefes se recusaram a entender que resultados mais rápidos não significam "um programa executável no dia seguinte ao pedido". Para eles, se um desenvolvedor não está ocupado digitando no teclado, ele não está trabalhando, está "desperdiçando seu tempo no design, sem sentido". Sim, eu sei, meu chefe é um idiota.


Então, com a programação alfabética, eles podem pensar que você está ocupado escrevendo um livro de ficção científica, em vez de outro software! : D
Mahdi

Empresas como essa não entendem que um bom software dura muito tempo e quanto melhor a documentação, mais vale a fonte.
Thorbjørn Ravn Andersen

2

Codificadores escrevem código não em inglês.

Os codificadores não gostam de escrever documentação, porque isso não ajuda a execução do código.

Os codificadores não são bons em escrever documentação porque é um meio ruim para expressar suas idéias.

A programação alfabética parece ser a idéia de levar a documentação para o próximo nível, em que o código é mais uma reflexão tardia. Talvez funcionasse, mas para a maioria dos codificadores parece uma documentação desagradável.


29
Codificadores que aderem aos pontos que você descreve não são codificadores que eu quero trabalhar comigo.
Paul Nathan

1
@Paul, concedido. Mas isso é o que realmente está por aí. Mas parece-me que mais documentação não é necessariamente melhor.
Winston Ewert

1
é possivelmente o melhor
mlvljr 27/10/10

6
programadores experientes sabem que PRECISAM escrever documentação, porque é aí que o "POR QUE eu fiz assim?"

1
@ Thorbjørn Ravn Andersen, sim, isso é verdade. Mas a programação alfabética (como eu a entendo) sugere que você escreva código com sua documentação em vez de documentação com seu código. Essa documentação é realmente útil?
Winston Ewert

2

Principalmente porque as pessoas são MUITO ESTÚPIDAS. Um testemunho óbvio do qual é um fluxo interminável de suposições e mal-entendidos expressados ​​pelos jovens sobre a natureza dessa técnica simples.

As pessoas consideram o LP o seguinte: (a) um método de documentação (b) um método de redação de alguns ensaios polidos que exigem habilidades ou talentos especiais (c) simplesmente não têm idéia - como criador do editor de programação Leo, por sua própria admissão etc etc. etc.

O LP, no entanto, é simplesmente: (1) escrever programas em uma mistura de códigos e frases em uma (= qualquer) linguagem humana, onde estes representam outros trechos de código e / ou frases incluídas. É exatamente isso que os autores de inúmeros livros didáticos de programação fazem .. e (2) é um pré-processador simples que expande essas frases em humano (que se tornou como se fossem nomes de sub-rotinas incluídas) para desvendar o resultado NA ORDEM EXIGIDA PELO COMPILADOR (ou intérprete). Caso contrário, pode-se expandir o texto escrito com outro pequeno utilitário para incluir símbolos de formatação para transformar a "fonte alfabetizada" em um texto legível e bem formatado.

Os jovens nunca tentam essa idéia extremamente simples - e fantasiam ou imaginam razões falsas pelas quais nunca tentam ou fazem.

Basicamente, a idéia principal de programar "em pseudocódigo", escrita em uma linguagem humana, e depois expandi-la com um simples utilitário de pré-processador. em funções / sub-rotinas, necessárias para você não se perder nos detalhes, mas totalmente desnecessário para a execução da máquina.


3
Está faltando um pouco importante: (3) uma maneira de reordenar um código em qualquer idioma para a sequência mais legível e natural, que não é necessariamente a mesma ordem com a qual um compilador deve lidar. Isso inclui ocultar os detalhes da implementação nas notas de rodapé ou em qualquer outro local longe do esboço do código.
SK-logic

1

Há 2 aspectos da programação alfabetizada que eu não desejo foram incorporados na programação principal - imagery incorporado (por exemplo, diagramas de design) e ponteiros para as tentativas anteriores e alternativos (por exemplo, "A razão é como este é porque eu tentei este outro caminho e não funcionou porque ... "). Ambos os aspectos podem ser tratados com comentários de documentos e URIs.


1

Porque a lógica dos programas não funciona da mesma maneira que falamos. Um programa possui um fluxo, condições e loops bem especificados.

Depois de ter codificado no lote, EU PENSO nesses termos. Meu cérebro transforma problemas no domínio de destino do código executável. E é muito mais eficiente para mim escrever isso em uma linguagem geralmente de programação, do que ter que fazer a etapa extra de transformação para tornar meus programas alfabetizados.

Na verdade, eu acredito que meus programas já são alfabetizados ... identificadores falantes, bons nomes de funções, comentários onde eu fiz alguma invasão que eu não compreenderia imediatamente depois de alguns meses.

Para concluir: Meu código Java é mais alfabetizado por si só, como toda programação "alfabetizada" deseja.


2
Um código Java não pode ser alfabetizado. Seus "identificadores de fala" nunca explicam por que você escolhe esse algoritmo específico em detrimento de outro, quais são os limites, qual era a expectativa de seu perfil de desempenho etc. Meus programas alfabetizados são feitos principalmente de fórmulas, diagramas e gráficos, e não muito texto em inglês. Mas tudo isso não pode ser expresso em um código e parecer feio em comentários simples.
SK-logic

1

Eu vim para alfabetizar programação ao contrário - eu sonhava ter o código organizado conforme ele se encaixa na minha mente, não como o compilador exige. Achei Leo quase ideal para esse fim. Ele também suporta acompanhar os arquivos alterados fora. Esses arquivos não precisam conter nenhuma marcação especial, para que eu possa usar o Leo sozinho, sem a necessidade de outros membros da equipe. Esse recurso - "@shadow trees" - é muito promissor, embora ainda com um pouco de bugs, precisa de mais olhos. E também corrige o problema "oh não, tudo em um arquivo grande", organizando tudo no contorno da árvore e apoiando arquivos externos.

Para mim, ao contrário do nome, a "programação alfabetizada" não é sobre documentação. Não tenho mais documentação do que antes. É sobre ter uma estrutura que me ajuda a não me perder . Eu juro por ele especialmente ao gerenciar arquivos JSP gigantescos (e, apesar de o Leo ter sido originalmente destinado principalmente ao Python e não ter suporte para a linguagem JSP - eu tenho que dividir o arquivo na árvore do Leo manualmente!).


0

Eu vejo isso como uma valiosa ferramenta de ensino, onde uma dissertação sobre código pode ser escrita e, em seguida, trechos de código de trabalho intercalados nele para instruir os leitores sobre como, o que é e por que do código.

Fora de um ambiente puramente educacional, acho que apenas Knuth realmente entende a melhor maneira de usá-lo.


-4

É o pior de todos os mundos - você precisa escrever um programa de computador altamente correto e altamente específico em um idioma muito inespecífico = inglês. Portanto, você deve escrevê-lo cuidadosamente usando exatamente as frases corretas - para que você possa apenas escrever o código.


3
Você não deve repetir seu código em inglês. Os comentários devem explicar o motivo pelo qual o código está lá, não o que está fazendo. Costumo inserir gráficos, diagramas e gráficos nos meus comentários alfabéticos, e isso realmente ajuda a entender o código.
SK-logic

Se os comentários não dizem o que o código está fazendo, como é a programação alfabetizada - é apenas uma programação regular com comentários. Eu pensei que o objetivo principal da programação alfabetizada era descrever o programa nos documentos e fazer com que o sistema gere código a partir da documentação?
Martin Beckett

3
tente ler "TeX, o programa". O código nunca é repetido nos comentários lá. Comentários explica por que o código é escrito dessa maneira e explica a arquitetura.
SK-logic

3
@MartinBeckett O que você descreve não é LP.
11132 Andres F.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.