하향식은 내가 아는 것을 설명하거나 이미 구축 한 것을 재건하는 좋은 방법입니다.
하향식 가장 큰 문제는 종종 단순히 "정상"이 없다는 것입니다. 시스템을 개발하거나 도메인을 탐색하는 동안 시스템이 수행해야하는 작업에 대한 생각이 바뀔 것입니다. 모르는 것 (즉, 시스템이 원하는 것)을 어떻게 시작점이 될 수 있습니까?
"로컬"하향식은 좋은 것입니다 ... 코딩에 앞서 생각하는 것은 분명히 좋습니다. 그러나 계획하고있는 것이 실제 시나리오가 아니기 때문에 (생각하지 않고 재건축하는 경우와 같이) 실제로 시나리오가 아니기 때문에 너무 많은 생각과 계획은 아닙니다. 새로운 것을 만들 때의 글로벌 하향식은 말도 안됩니다.
문제의 100 %를 알지 않는 한 상향식은 (전 세계적으로) 접근 방식이어야하며, 코딩 할 알려진 솔루션 만 있으면되고 가능한 대안 솔루션을 찾는 데 신경 쓰지 않아도됩니다.
리스프 방식은 증류 식 상향식입니다. 당신은 바닥을 쌓을뿐만 아니라 필요한 방식으로 벽돌을 만들 수도 있습니다. 아무것도 고정되어 있지 않으며 자유는 총체입니다. 물론 자유는 책임을지고이 힘을 잘못 사용함으로써 끔찍한 것을 만들 수 있습니다.
그러나 끔찍한 코드는 모든 언어로 작성할 수 있습니다. 마음의 새장 모양의 언어조차도 그 언어를 사용하면 원숭이조차도 좋은 프로그램을 실행할 수 있기를 희망합니다 (많은 수준에서 너무 잘못 생각하여 생각조차하지 않습니다).
귀하의 예는 웹 서버에 관한 것입니다. 이제 2012 년에 이것은 잘 정의 된 문제입니다. 스펙을 따라야합니다. 웹 서버는 구현 문제 일뿐입니다. 특히 웹 서버를 다른 웹 서버와 실질적으로 동일한 웹 서버를 작성하는 것을 목표로하고 있다면, 일부 미세한 점을 제외하고는 확실하지 않습니다. RSA에 대한 귀하의 의견조차도 공식적인 사양으로 명확하게 정의 된 문제에 대해 이야기하고 있습니다.
공식적인 사양과 이미 알려진 솔루션으로 잘 정의 된 문제로 코딩은 점으로 연결됩니다. 하향식은 괜찮습니다. 이것이 프로젝트 관리자 천국입니다.
그러나 많은 경우에 점을 연결하는 데 잘 알려진 입증 된 방법이 없습니다. 실제로 점들이 무엇인지 말하기조차 매우 어렵습니다.
예를 들어, 이론적 인 반복 로고와 완벽하게 일치하지 않는 인쇄물에 절단 할 부품을 정렬하도록 자동 절단기에 지시하도록 요청 받았다고 가정하십시오. 기계가 촬영 한 재료의 부품과 사진이 제공됩니다.
정렬 규칙은 무엇입니까? 당신은 결정합니다. 패턴은 무엇이며 어떻게 표현합니까? 당신은 결정합니다. 부품을 정렬하는 방법? 당신은 결정합니다. 부품이 "구부러 질"수 있습니까? 그것은 일부, 그렇지 않은 것도 있지만, 물론 너무 많지는 않습니다. 재료가 너무 잘 변형되어 부품을 수용 가능하게 절단 할 수없는 경우 어떻게해야합니까? 당신은 결정합니다. 모든 재료 롤이 동일합니까? 물론 그렇지는 않지만 사용자가 모든 롤에 대해 정렬 규칙을 적용하도록 버그를 줄 수는 없습니다. 그것은 비현실적입니다. 어떤 사진이 카메라를보고 있습니까? 그 의미는 무엇이든, 그것은 색일 수 있고, 빛의 반사가 패턴을 분명하게하는 검은 색 위에 검은 색일 수 있습니다. 패턴을 인식 한다는 것은 무엇을 의미 합니까? 당신은 결정합니다.
이제이 문제에 대한 솔루션의 일반적인 구조를 설계하고 돈과 시간으로 견적을 제공하십시오. 내 시스템은 심지어 당신의 시스템 아키텍처조차도 (예, 아키텍처) 틀릴 것이라는 점입니다. 비용 및 시간 추정은 임의의 숫자입니다.
우리는 그것을 구현했고 이제는 작동하는 시스템이지만 시스템의 모양에 대해 우리의 마음을 크게 바 꾸었습니다. 메뉴에서 접근 할 수없는 전체 하위 시스템을 추가했습니다. 프로토콜에서 마스터 / 슬레이브 역할을 두 번 이상 전환했습니다. 아마도 이제는 더 나은 재 구축을 시도하기에 충분한 지식이 있습니다.
물론 다른 회사들도 같은 문제를 해결했지만 ... 당신이이 회사들 중 하나에 속하지 않는다면 아마도 하향식 세부 프로젝트는 농담 일 것입니다. 하향식으로 디자인 할 수 있습니다. 전에 한 번도 해본 적이 없기 때문에 할 수 없습니다.
아마도 같은 문제를 해결할 수도 있습니다. 그러나 상향식 작업. 아는 것부터 시작하여 모르는 것을 배우고 추가하는 것.
새로운 복잡한 소프트웨어 시스템이 성장하지 않고 설계되었습니다. 때때로 누군가는 처음부터 완전히 새로운 복잡한 잘못 지정된 소프트웨어 시스템을 설계하기 시작합니다. 또는 c] 둘 다 ... 그리고 대부분의 경우 [c]가 그 경우이다).
이것들은 파워 포인트 슬라이드와 UML 다이어그램에만 수천 시간과 수천 시간을 투자 한 전형적인 대기업 프로젝트입니다. 창피한 양의 리소스를 태운 후에도 완전히 실패합니다. 또는 매우 예외적 인 경우에는 초기 사양의 작은 부분만을 구현하는 고가의 소프트웨어를 마침내 제공합니다. 그리고 그 소프트웨어는 사용자가 항상 싫어하는 것입니다. 구입하려는 소프트웨어의 종류가 아니라 강제로 사용하는 소프트웨어의 종류입니다.
이것은 내가 코딩하는 것만 생각해야한다는 것을 의미합니까? 당연히 아니지. 그러나 제 생각에는 건축은 바닥에서 시작해야하고 (벽돌, 콘크리트 코드) 올라 가야합니다 ... 그리고 세부 사항에 대한 관심과 집중은 당신이 가진 것에서 멀어 질수록 "페이드"되어야합니다. 하향식은 종종 전체 시스템에 동일한 수준의 세부 사항을 한 번에 배치해야하는 것처럼 종종 표시됩니다. 모든 것이 명확해질 때까지 모든 노드를 분할 상태로 유지하십시오. 실제 모듈에서 서브 시스템은 서브 루틴에서 "성장"합니다. 특정 문제에 대한 이전 경험이 없으면 서브 시스템, 모듈 또는 라이브러리의 하향식 설계가 끔찍할 것입니다. 다른 함수가 아닌 어떤 함수를 넣을지 알면 좋은 라이브러리를 디자인 할 수 있습니다.
Lisp 아이디어의 많은 부분이 인기를 얻고 있습니다 (일류 함수, 클로저, 동적 타이핑, 가비지 콜렉션, 메타 프로그래밍, 대화식 개발). Lisp는 여전히 코드를 작성하는 방법이 매우 독창적입니다. 필요한 것을 위해.
예를 들어 키워드 매개 변수는 이미 존재하지만 존재하지 않는 경우 추가 할 수 있습니다. 실험중인 장난감 Lisp 컴파일러에 대해 (컴파일 시간에 키워드 확인 포함) 수행했으며 많은 코드를 사용하지 않습니다.
대신 C ++을 사용하면 얻을 수있는 가장 많은 C ++ 전문가가 키워드 매개 변수가 유용하지 않거나 실제로는 그렇게 복잡하지 않고 매우 부적절하고 절반이 지원되는 템플릿 구현이 가능하다는 것을 알 수 있습니다. C ++ 클래스는 일류 객체입니까? 아니요, 할 수있는 일은 없습니다. 런타임 또는 컴파일 타임에 검사 할 수 있습니까? 아니요, 할 수있는 일은 없습니다.
Lisp의 이러한 언어 유연성은 상향식 건물에 적합합니다. 서브 루틴뿐만 아니라 언어의 구문과 의미도 작성할 수 있습니다. 그리고 어떤면에서 Lisp 자체는 상향식입니다.