문맹 프로그래밍이 주류가 아닌 이유는 무엇입니까? [닫은]


32

라이트 레이트 프로그래밍 에는 좋은 이상이 있습니다. 이것이 주류가 아니라고 생각하는 이유는 무엇입니까? 배송에 실패했기 때문입니까?


2
이를 위해 개발 된 도구는 여전히 약하기 때문입니다. 마이크로 소프트는 아마도 이와 관련하여 주도 할 가능성이있다.
Job

3
새로운 문제에 접근 할 때 나는 종종 연필과 종이를 사용하여 나만의 'Literate Programming'속기를 사용합니다. 이를 통해 언어 의미를 무시하고 함수 등으로 불리는 것들을 설명하기 위해 인간 언어로 혼합 할 수 있습니다.
oosterwal

1
Knuth조차도 더 이상이 개념에 대해 유죄 판결을받지 않았습니다. "그리고 우리는 문서가 너무 고통 스러웠 기 때문에 TEX82를 개발할 때 사용한"literate programming "이라는 오래된 개념을 버리고 있습니다." tug.org/TUGboat/tb31-2/tb98knut.pdf .
h0b0

6
TeX와 그 철학에 익숙하지 않은 사람들에게는 Knuth 인용문이 아이러니하게 의미가 있다고 언급해야합니다.

3
@ h0b0 & user1249 : Knuth의 전체 기사는 어리 석습니다. 단순히 읽는 것으로 알 수 있습니다. 또한 Steve Jobs, 웹, Agile, 리팩토링, OOP, AOP 및 기타 여러 가지를 조롱합니다. 그것은 농담!
Andres F.

답변:


35

나는 처음 Knuth의 저서에서 그것을 보았고 그것이 깔끔하게 보인다고 생각했습니다. 그런 다음 문학적 프로그래밍 디스플레이를 사용하여 프로그램에서 무슨 일이 일어나고 있는지 이해하려고 시도했는데,보기보다 힘들었습니다. 프로그램 목록을 살펴 보는 데 너무 익숙했을지 모르지만 혼란스러워 보였습니다.

그런 다음 소스 코드를 살펴본 결과 저를 끌었습니다. 프로그램 텍스트와 컴파일러가 보았던 것과의 관련성이 적어 완전히 새로운 방식으로 프로그램을 작성하는 법을 배워야하며 해당 이점이 없습니다.

또한 사람들은 실제로 Y를 수행 할 때 코드가 X를 수행한다는 길고 설득력있는 주장을 쓸 수 있으며 오해의 소지가있는 의견에 부딪 쳤습니다. 나는 코드를 읽는 것에 대한 애정을 개발하여 코드가 상당히 일찍 수행되는 것을 보았습니다. Literate Programming은 그 반대의 견해입니다.


4
일반적으로 주석뿐만 아니라 Literate Programming은 코드가하는 일에 관한 것이 아닙니다 . 코드 자체에서 읽을 수 있습니다. 이유방법 에 관한 모든 것입니다. 이 필수 정보는 적절한 문맹 프로그래밍없이 거의 항상 누락되어 있습니다. 말할 필요도없이 " 왜? "부분은 정교하고 복잡한 수학, 때로는 도표와 표, 때로는 도표와 관련이 있습니다. 이러한 주석을 읽을 수있는 방식으로 유지하려면 Literate 프로그래밍 도구가 필요합니다.
SK-logic

1
@ SK-logic fair, 그러나 David Thornley가하고있는 요점은 WHY조차도 오해의 소지가있는 거짓말로 판명 될 수 있다는 것입니다 (실제로는 이해하기 더 어려운 것).
MrFox

1
+1 Knuth는 "고급"언어로 작업 할 때 기계 코드를 사용하는 대신 금속 위에 "C"를 쓰는 것을 의미 할 때 (주제) 와일드 웨스트 프로그래밍으로 다시 작성했습니다. 메모리는 매우 타이트한 변수였으며 다른 이름은 대개 단일 문자였으며 종종 범위에서 범위로 재사용되었습니다. 턴키 원 샷이 각자의 편심 스타일로 각각 한 사람이 작성하고 유지 관리하는 대부분의 프로그램. 코드베이스를 인계받는 것은 읽는 것보다 해독하는 것이 더 낫습니다. 도움이되는 소스 제어 등이 없었습니다.
TechZen

1
크 누스는 오늘 30 년 전에 길을 내려다보고있었습니다. 그는 프로그램이 더 커지고 더 복잡해지고 교대하는 멤버가있는 팀에 의해 작성 될 것이며 수십 년에서 수십 년 동안 운영 될 것이며 입력, 평가 및 비 프로그래머로부터의 수용이 필요하다는 것을 알고있었습니다. 라이트 레이트 프로그래밍은이 모든 것을 해결하기위한 아이디어였습니다. 그는 오늘날 우리가 비즈니스 로직과 BDD라고 부르는 것을 거칠게 만들고있었습니다. 프로그래머가해야 할 일을 알고 프로그래머가 아닌 사람도 따라갈 수 있다는 핵심 아이디어. 언급 한 바와 같이, "리터 레이트"텍스트와 코드 사이의 연결을 강제하는 메커니즘이 없기 때문에 아이디어가 실패했습니다.
TechZen

BTW : 이것이 Objective-C와 같은 "자체 문서화"언어를 좋아하는 이유입니다. 처음에는 코드가 길다란 메서드 이름으로 어수선 해 보이지만 언어 나 API를 모르는 프로그래머조차도 코드가 수행하는 작업을 신속하게 해결할 수 있습니다. 무엇보다도 코드를 변경하면 "설명"이 자동으로 동기화됩니다. 물론, Objective-C는 자동 완성 기능이 내장 된 상태로 작성되었습니다. Objective-C를 작성하지 않으면 상당히 어색합니다.
TechZen

13

나는 네트워크 효과를 비난 할 것 입니다. 다른 사람들이 귀하의 코드와 문서를 편집하려면이를 이해할 수 있어야합니다.

cweb / noweb과 같은 사람들로부터 멀어지게합니다. 프로젝트를 사용하고있는 프로그래밍 언어 위에서 TeX와 프로그램 고유의 구문을 배울 필요가 있기 때문입니다. 이것은 특히 TeX가 처음에 그렇게 큰 수학 조판을 필요로하지 않는 경우에 엄청난 시간 낭비로 볼 수 있습니다. (그리고 많은 응용 프로그램 프로그래머에게는 실제로 필요하지 않습니다.) 대신 Visual Studio의 XML 주석과 같은 것을 선호합니다. 왜냐하면 이미 유명하고 잘 정립되어 있기 때문입니다.

문해력있는 프로그래밍이 시작된 곳은 과학 / 통계 컴퓨팅에 있으며 대부분의 프로그래머는 수학, CS 또는 통계학에서 상당한 교육 (일명 PhD)을 받았기 때문에 이미 LaTeX에 익숙합니다. 그들이 작성한 문서에는 TeX로 가장 잘 쓰여진 복잡한 공식이 많을 가능성이 높고 R로 프로그래밍 할 가능성이 높습니다. SWeave에 대해 알고있는 R 프로그래머의 비율은 확실히 cweb에 대해 알고있는 C 프로그래머의 비율


2
이 답변은 모든 문맹 프로그래밍 도구가 LaTeX를 사용하고 있다고 가정하는 것 같습니다. 이것이 사실입니까? 그것을 필요로하는 개념에 대해서는 아무것도없는 것 같습니다.
AShelly

@ AShelly : 필요하지 않습니다. 최소한 noweb을 사용하면 HTML을 사용할 수 있습니다. 그러나 실제로 HTML 문서를 작성하는 사람들은 문맹 프로그래밍 도구 대신 javadoc 등을 사용합니다.
Larry Wang

1
@AShelly, 문맹 프로그래밍이 작동하려면 인쇄 할 문서를 생성 할 수 있어야합니다 . 이것은 형식이 텍스트 기반 일 때 훨씬 더 쉽고, 내 지식으로는 가장 강력한 텍스트 기반 문서 포맷터 TeX이고 TeX를 사용하는 가장 쉬운 방법은 LaTeX를 사용하는 것입니다.

@AShelly org-mode문맹 프로그래밍에 대한 지원을 살펴볼 수 있습니다 . 그것은 아주 편리합니다, 나는 그것을 찾을 수 많은 (안 말할 것도 이해하기 쉽게 관리 ) 단독 WEB 또는 NOWEB보다. 코드의 중요한 측면은 가독성이며 읽을 수 있습니다. (cf github.com/vermiculus/stack-mode )
Sean Allred

12

나는 공부하는 동안 90 년대 후반에 Literate Programming의 개념에 매료되었고, 여전히 프로그래밍과 조판에 대한 Knuths의 접근 방식에 흥미가 있습니다. 최선의 것 외에는 아무것도 할 수 없습니다.

Knuth가 설계 한 Literate Programming 시스템은 즉각적으로 눈에 띄는 것 이상을 수행했습니다. 즉 Knuths 소스 문서에서 생성 된 코드 생성 도구, 즉 표준 Pascal에서 생성 된 기본 프로그래밍 언어의 많은 단점을 극복했습니다.

표준 파스칼을 사용해 보지 못한 운이 좋은 사람들을 위해 여기 몇 가지 주요 특징이 있습니다.

  • 단일 패스 컴파일러를 쉽게 사용할 수 있도록 언어 사양에 따르면 모든 선언은 특정 순서로 이루어져야한다고합니다. wikipedia 페이지에서 : "각 프로 시저 또는 함수는 고유 한 goto 레이블, 상수, 유형, 변수 및 기타 프로 시저 및 함수의 선언을 가질 수 있으며 모두 순서대로되어 있어야합니다." 즉, 소스 파일에서 사물을 논리적으로 그룹화 할 수 없습니다 .
  • 일반 C보다 문자열 처리가 더 지루했습니다.
  • 식별자는 임의의 길이를 가질 수 없습니다.
  • 더 이상 기억할 수없는 더 많은 것들.

이 모든 것들은 기본적으로 Knuth가 더 나은 프로그래밍 언어가 필요하다는 것을 의미했으며 (따라서 발명했습니다) 파스칼을 어셈블리 언어로 사용했습니다.

대부분의 현대 언어는 많은 노력없이 이러한 작업을 수행 할 수 있으므로 Literate Programming이 해결해야하는 작업의 대부분을 제거합니다.

또한 현대 언어는 코드 자체에 더 많은 생각을 할 수 있도록 표현력이 뛰어납니다.

그래서 무엇이 남았습니까? 다음은 소스 코드에서 문서의 조판 양식을 생성 할 수있는 능력, 그리고 오늘날 존재한다.

Java 런타임 API는 아마도 현재 사용 가능한 가장 큰 Literate Programming 중 하나 일 것입니다 (코드가 실제로 표시되지는 않지만 Java가 처음부터 오픈 소스 인 경우에는 가능할 것임). 예를 들어 http://download.oracle.com/javase/6/docs/api/java/util/Collection.html 의 컬렉션 프레임 워크 프레젠테이션을 참조하십시오.

.NET 및 기타 주류 프로그램에도 비슷한 시스템이 있다고 생각합니다.


To make it possible to have a single-pass compiler, all declarations had to come in a certain order. 이와 같은 선언 순서는 확실히 컴파일러 디자인을 단순화 하지만 단일 패스 컴파일을 활성화 / 방지하지는 않습니다. 예를 들어 델파이는 그 순서 제한이 없지만 여전히 단일 패스 파스칼 컴파일러입니다.
메이슨 휠러

동의했다. Turbo Pascal에는이 제한이 없었습니다. 그러나이 제한은 처음부터 파스칼의 정의에있었습니다.

1
Knuth는 오래 전에 CWEB로 전환했지만 파스칼 부족 문제를 해결하는 것이 아닙니다. JavaDoc은 Knuth의 "literate programming"과 아무런 관련이 없습니다. 그는 코드 작성 방식 을 근본적으로 변경 하는 것에 대해 이야기 하고 있으며,이를 통해 다른 사람이 취할 수없는 복잡성을 해결할 수 있다고 주장하고 있습니다.
Ron Burk

@RonBurk CWEB는 더 나은 "어셈블리 언어"로 컴파일합니다. 원래 디자인 결정이 무효화되지는 않습니다.
Thorbjørn Ravn Andersen

5

내가 90 년대에 문맹 프로그래밍을했을 때 내가 발견 한 한 가지는 정확히 옳은 일을하고 싶었던 매우 열정적 인 사람들을 끌어 들이고 있다는 것입니다. noweb은 모든 사람들에게 충분히 공통된 최소 분모를 제공함으로써 그 문제를 해결하기위한 좋은 시도였습니다. 그럼에도 불구하고 저는 LP 프린터를 개발하기 위해 대부분의 LP 프린터를 개발했습니다.

또 다른 문제는 실제로 민첩하지 않다는 것입니다. 어떤면에서는 속도를 늦추는 것이 좋은데,이를 통해 더 먼저 선입견을 취하고 물건을 올바르게 얻을 수 있기 때문입니다. 반면, 세 심하게 문서를 작성하면 코드를 리팩토링하는 데 큰 장벽이 생깁니다. LP 코드를 작성하기 전에 코드가 강화 될 때까지 기다리면 여러 날의 문서 작업이 생겨 실제로 트랙에서 멈추게됩니다.


실험 한 결과, 나머지 사용자를위한 LP의 장점 은 실제 코드 바로 옆에 디자인 결정 및 아키텍처 세부 정보 를 문서화하는 데있을 수 있음을 발견 했습니다. LP를 리팩토링하기가 더 어렵다는 데 동의합니다. Knuth는 종이에 초기 디자인을 수행했으며 만족할 때만 실제 구현을 시작한 것으로 알고 있습니다. 이것은 아마도 내가 찾은 것과 같은 상황 일 것입니다.
Thorbjørn Ravn Andersen

3

겸손한 견해로는 많은 회사들이 Literate Programming의 목표와 반대되는 문화를 가지고 있습니다. 더 빠른 결과를 원합니다 (앱 제작시 품질에 대해서만 울림). 내 경험상, 상사는 빠른 결과가 "요청한 다음날 실행할 수있는 프로그램"을 의미하지 않는다는 것을 이해하지 않았다. 그들에게 개발자가 키보드를 사용하여 바쁘지 않다면, 그는 일하지 않고있다. "비 감각적 인 디자인으로 시간을 낭비하고있다". 그렇습니다. 제 상사는 피고인입니다.


그런 다음 Literate Programming을 사용하면 아직 다른 소프트웨어 대신 Sci-Fi Book을 작성 하느라 바쁩니다! : D
Mahdi

이와 같은 회사는 좋은 소프트웨어가 매우 오래 산다는 것을 이해하지 못하고 문서가 많을수록 소스의 가치가 더 높습니다.
Thorbjørn Ravn Andersen

2

코더는 영어가 아닌 코드를 작성합니다.

코더는 코드 실행에 도움이되지 않기 때문에 문서 작성을 좋아하지 않습니다.

코더는 아이디어를 표현할 수있는 매체가 좋지 않기 때문에 문서 작성에 능숙하지 않습니다.

Literate Programming은 코드가 나중에 생각할 수있는 다음 단계로 문서를 가져 오는 아이디어입니다. 어쩌면 작동하지만 대부분의 코더에게는 눈에 띄지 않는 문서처럼 보입니다.


29
당신이 묘사 한 요점을 지키는 코더는 나와 함께 일하고 싶은 코더가 아닙니다.
Paul Nathan

1
@Paul, 당연합니다. 그러나 저것은 정말로 거기에 있습니다. 그러나 더 많은 문서가 반드시 더 나은 것은 아닙니다.
Winston Ewert

1
충분할 것입니다
mlvljr

6
숙련 된 프로그래머들은 문서를 작성해야 할 필요가 있다는 것을 알고 있습니다.

1
@ Thorbjørn Ravn Andersen, 그렇습니다. 그러나 글을 읽고 쓸 줄 아는 프로그래밍 (내가 이해하는 것처럼)은 코드가있는 문서 대신 문서로 코드를 작성하는 것이 좋습니다. 그렇게 많은 문서가 정말 도움이 되나요?
Winston Ewert

2

사람들이 매우 견고하기 때문에 주로. 이 간단한 기술의 본질에 대해 젊은이들이 표현한 끝없는 추측과 오해의 흐름 인 명백한 간증.

사람들은 LP를 다음과 같이 생각합니다 : (a) 문서화 방법 (b) 특별한 기술이나 재능을 필요로하는 세련된 에세이를 작성하는 방법 (c) 레오 프로그래밍 에디터의 창시자로서 자신의 입장을 통해 전혀 단서가 없습니다. 등

그러나 LP는 단순히 다음과 같습니다. (1) 코드와 구를 (= 임의의) 인간 언어로 혼합하여 프로그램을 작성하는 경우, 후자는 다른 코드 덩어리 및 / 또는 포함 된 구를 나타냅니다. 이것은 수많은 프로그래밍 교과서의 저자가하는 일입니다. 그리고 (2) 인간의 구절을 포함 시켜서 (포함 된 서브 루틴의 이름처럼 된) 확장 된 간단한 전 처리기입니다. 통역사). 그렇지 않으면 다른 작은 유틸리티를 사용하여 작성된 텍스트를 확장하여 "리터 레이트 소스"를 형식이 잘 지정된 읽기 쉬운 텍스트로 변환하는 서식 기호를 포함 할 수 있습니다.

젊은이들은이 단순한 아이디어를 시도하지 않으며, 절대 시도하지 않거나 시도하지 않는 가짜 이유를 상상하거나 상상합니다.

기본적으로 인간 언어로 작성된 "의사 코드"로 프로그래밍 한 다음 간단한 전 처리기 유틸리티 인 HELPS MANAGE ATTENTION (제한된 프로그램의 주요 어려움)을 사용하여이를 확장하는 기본 아이디어는 코드 폴딩 또는 프로그램 흐름의 분할과 매우 유사합니다. 세부 사항을 잃지 않고 기계 실행에 전적으로 필요하지 않은 기능 / 서브 루틴으로.


3
중요한 한 가지가 빠졌습니다. (3) 어떤 언어로 된 코드를 가장 읽기 쉽고 자연스러운 순서로 다시 정렬하는 방법은 컴파일러가 반드시 처리해야하는 순서와 같지는 않습니다. 여기에는 각주 또는 코드 개요에서 멀리 떨어진 곳에서 구현 세부 사항을 숨기는 것이 포함됩니다.
SK-logic

1

나는 그 글을 읽고 프로그래밍의 두 측면이있다 않는 소원이 주류 프로그램에 포함 된이 - 임베디드 이미지 (예를 들어, 디자인 다이어그램) 이전과 다른 시도 (및 포인터 예를 들면, "나는이 다른 방법을 시도하기 때문에이처럼 이유이며, ... ") 때문에 작동하지 않았습니다. 이 두 가지 측면 모두 doc-comments와 URI로 처리 할 수 ​​있습니다.


1

프로그램의 논리는 우리가 말하는 것과 동일하게 작동하지 않기 때문입니다. 프로그램에는 흐름, 조건 및 루프가 잘 지정되어 있습니다.

코딩을 많이 한 후에, 나는이 용어로 생각합니다. 내 뇌는 문제를 실행 가능한 코드의 대상 도메인으로 변환합니다. 그리고 프로그램을 읽기 위해 추가 변환 단계를 수행하는 것보다 일반적으로 프로그래밍 언어로 작성하는 것이 훨씬 효율적입니다.

사실, 나는 내 프로그램이 이미 문맹이라고 생각합니다. 말하기 식별자, 좋은 기능 이름, 몇 달 후 즉시 이해하지 못하는 해커를 한 의견.

결론 : 모든 "리터 레이트"프로그래밍이 원하는대로 내 Java 코드 자체가 더 읽기 쉽다.


2
Java 코드는 글을 읽을 수 없습니다. "말하는 식별자"는 왜 다른 알고리즘보다이 특정 알고리즘을 선택하는지, 한계, 성능 프로파일 기대치 등을 설명하지 않습니다. 영어 텍스트. 그러나이 모든 것이 코드로 표현 될 수 없으며 간단한 주석 안에서는보기 흉하게 보입니다.
SK-logic

1

나는 다른 방법으로 프로그래밍을 배우게되었습니다. 컴파일러가 필요로하는 것이 아니라 내 마음에 맞는 코드를 구성하는 것이 꿈이었습니다. 레오 는이 목적에 거의 이상적이라는 것을 알았습니다 . 또한 외부에서 변경된 파일을 추적 할 수 있습니다. 이 파일에는 특별한 마크 업이 포함되어 있지 않아도되므로 팀의 다른 사람들이 알 필요없이 Leo를 직접 사용할 수 있습니다. "@shadow trees"라는이 기능은 매우 유망하지만, 여전히 약간 버그가 있지만 더 많은 안구가 필요합니다. 또한 모든 것을 트리 개요로 구성하고 외부 파일을 지원하여 "아, 하나의 큰 파일의 모든 것"문제를 해결합니다.

저에게 이름과는 달리 "리터 레이트 프로그래밍"은 문서화에 관한 것이 아닙니다. 이전보다 더 많은 문서가 없습니다. 내가 길을 잃지 않도록 도와주는 구조를 갖는 입니다. 나는 거대한 JSP 파일을 관리 할 때 특히 맹세합니다 (Leo는 원래 Python을 대상으로하고 JSP 언어를 지원하지 않습니다-파일을 Leo 트리로 수동으로 분할해야합니다!)


0

나는 코드에 대한 논문을 작성할 수있는 유용한 교육 도구로 본 다음, 코드의 작동 방식, 목적 및 이유에 대해 독자들에게 지시하기 위해 작업 코드 스 니펫을 인터리브했습니다.

순전히 교육적인 환경 밖에서는, Knuth만이 그 환경을 가장 잘 사용하는 방법을 이해한다고 생각합니다.


-4

그것은 모든 세계에서 최악입니다. 매우 비 특정 언어 = 영어로 매우 정확하고 매우 구체적인 컴퓨터 프로그램을 작성해야합니다. 따라서 정확한 문구를 사용하여 신중하게 작성해야하므로 코드를 작성할 수도 있습니다.


3
영어로 코드를 반복해서는 안됩니다. 주석은 코드가 수행되는 것이 아니라 코드가 존재하는 이유를 설명해야합니다. 나는 종종 글을 읽고 쓸 줄 아는 주석에 그래프, 다이어그램 및 플롯을 넣으며 코드를 이해하는 데 실제로 도움이됩니다.
SK-logic

주석이 코드가하는 일을 말하지 않으면 프로그래밍을 어떻게 읽고 쓸 수 있습니까? 주석을 사용한 일반적인 프로그래밍 일뿐입니다. 문맹 프로그래밍의 핵심은 문서의 프로그램을 설명하고 시스템이 문서에서 코드를 생성하도록하는 것이라고 생각했습니다.
Martin Beckett

3
"TeX, 프로그램"을 읽으십시오. 주석은 코드에서 반복되지 않습니다. 주석은 코드가 그런 식으로 작성된 이유를 설명하고 아키텍처를 설명합니다.
SK-logic

3
@MartinBeckett 당신이 묘사하는 것은 LP가 아닙니다.
Andres F.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.