Зверху вниз - це прекрасний спосіб описати речі, які ви знаєте, або відновити речі, які ви вже створили.
Найбільша проблема зверху вниз полягає в тому, що досить часто просто немає «верху». Ви передумаєте, що система повинна робити під час розробки системи та під час дослідження домену. Як може бути вашою відправною точкою щось, чого ви не знаєте (тобто, що ви хочете робити в системі)?
"Місцевий" зверху вниз - це гарна річ ... деякі думки перед кодуванням явно хороші. Але думати і планувати занадто багато немає, тому що те, що ти передбачаєш, не є реальним сценарієм (якщо тільки ти вже там не був, тобто якщо ти не будуєш, а відновлюєш). Глобальний згори вниз при будівництві нових речей - це просто нісенітниця.
Підсумковий підхід повинен бути (в усьому світі) підходом, якщо ви не знаєте 100% проблеми, вам потрібно зашифрувати лише відоме рішення, і вам не байдуже шукати можливі альтернативні рішення.
Ліспський підхід - це дистильована знизу вгору. Ви не тільки будуєте знизу вгору, але також можете формувати цеглини так, як вам потрібно. Нічого не фіксується, свобода тотальна. Звичайно, свобода бере на себе відповідальність, і ви можете зробити жахливі речі, зловживаючи цією владою.
Але жахливий код можна написати будь-якою мовою. Навіть у мовах, що мають форму кліток для розуму, розроблених з надією, що з цими мовами навіть мавпи можуть отримати хороші програми та працювати (ідея настільки неправильна на стільки рівнях, що шкодить навіть просто думати про це).
Ваш приклад стосується веб-сервера. Зараз у 2012 році це чітко визначена проблема, у вас є специфікації, яких потрібно дотримуватися. Веб-сервер - це лише проблема впровадження. Тим більше, якщо ви прагнете написати веб-сервер, істотно ідентичний іншим мільйонам веб-серверів, які знаходяться там, то нічого насправді незрозуміло, крім деяких дрібниць. Навіть ваш коментар про RSA все ще говорить про чітко визначену проблему з формальними специфікаціями.
З чітко визначеною проблемою, з формальними специфікаціями та вже відомими рішеннями, кодування просто з'єднується в точках. Зверху вниз для цього нормально. Це небесний менеджер.
Однак у багатьох випадках не існує перевіреного відомого підходу, який би використовувався для з'єднання крапок. Насправді дуже часто важко сказати навіть, які є точки.
Припустимо, наприклад, що вам запропонують доручити автоматичній машині різання вирівняти деталі, що підлягають розрізуванню, до друкованого матеріалу, який не ідеально відповідає теоретичному повторюваному логотипу. Вам надаються деталі та фотографії матеріалу, зроблені машиною.
Що таке правило вирівнювання? Тобі вирішувати. Що таке візерунок, як його зобразити? Тобі вирішувати. Як вирівняти деталі? Тобі вирішувати. Чи можна деталі «зігнути»? Це залежить, деякі ні, а деякі так, але, звичайно, не надто. Що робити, якщо матеріал просто занадто деформований для частини, щоб його прийнятно розрізати? Тобі вирішувати. Чи всі рулони матеріалу однакові? Звичайно, ні, але ви не можете перешкодити користувачеві адаптувати правила вирівнювання для кожного рулону ... це було б недоцільно. Які фотографії бачать камери? Матеріал, що б це не означало ... це може бути колір, він може бути чорним над чорним, де тільки світловий рефлекс робить шаблон очевидним. Що означає розпізнавати візерунок? Тобі вирішувати.
Тепер спробуйте спроектувати загальну структуру рішення цієї проблеми і дайте цитату в грошах і в часі. Моя обставина, що навіть ваша системна архітектура ... (так, архітектура) буде помилятися. Оцінка витрат і часу буде випадковими числами.
Ми його реалізували і зараз це працююча система, але неодноразово змінювали свою думку про саму форму системи. Ми додали цілі підсистеми, які зараз неможливо дістати навіть із меню. Ми не один раз перемикали ролі головного / підлеглого в протоколах. Напевно, зараз у нас достатньо знань, щоб спробувати її краще відновити.
Інші компанії, звичайно, вирішили ту ж проблему ... але якщо ви не знаходитесь в одній з цих компаній, швидше за все, ваш детальний проект згори вниз буде жартом. Ми можемо спроектувати це зверху вниз. Ви не можете, тому що ніколи раніше цього не робили.
Можливо, ви можете вирішити таку ж проблему. Однак працюємо знизу вгору. Починаючи з того, що знаєте, вивчаючи те, чого ви не робите, і складаючи.
Вирощуються нові складні програмні системи, не розробляються. Раз у раз хтось починає проектувати велику нову складну програмно-програмну систему з нуля (зауважте, що при великому складному програмному проекті є лише три можливості: a) специфікація нечітка, b) специфікація неправильна та суперечлива або с] і те ... і найчастіше [с] так).
Це типові проекти величезної компанії з тисячами і тисячами годин, що підкидаються лише слайдами Powerpoint та діаграмами UML. Вони незмінно повністю виходять з ладу після спалювання незручних обсягів ресурсів ... або в дуже надзвичайному випадку вони нарешті доставляють завищену частину програмного забезпечення, яка реалізує лише мініатюрну частину початкових специфікацій. І це програмне забезпечення незмінно ненависне користувачами ... не той тип програмного забезпечення, який ви купували б, а тип програмного забезпечення, яке ви використовуєте, тому що ви змушені.
Чи означає це, що я думаю, що ви повинні думати лише для кодування? Звичайно, ні. Але, на мою думку, будівництво має починатися знизу (цегла, бетонний код) і повинно підніматися вгору ... і ваша увага та увага до деталей повинні певним чином «згасати», оскільки ви стаєте далі від того, що маєте. Зверху вниз часто подається так, ніби ви повинні одразу ставити один і той же рівень деталізації всієї системи: просто продовжуйте її розбивати кожен вузол, поки все не стане очевидно ... в модулях реальності підсистема "вирощується" з підпрограм. Якщо у вас немає попереднього досвіду вирішення конкретної проблеми, дизайн підсистеми, модуля або бібліотеки буде зверху жахливим. Ви можете спроектувати хорошу бібліотеку, як тільки зрозумієте, які функції потрібно вкласти, а не навпаки.
Багато ідей Lisp стають все більш популярними (функції першого класу, закриття, динамічне введення тексту за замовчуванням, збирання сміття, метапрограмування, інтерактивна розробка), але Lisp все ще є сьогодні (серед мов, яких я знаю) досить унікальний тим, як легко формувати код для того, що вам потрібно.
Наприклад, параметри ключових слів вже є, але якщо їх не було, їх можна додати. Я зробив це (включаючи перевірку ключових слів під час компіляції) для іграшкового компілятора Lisp, з яким я експериментую, і це не потребує великого коду.
Замість цього на C ++ найбільше ви можете отримати купу експертів C ++, які говорять вам про те, що параметри ключових слів не настільки корисні, або неймовірно складна, зламана, наполовину захищена реалізація шаблону, яка насправді не є такою корисною. Чи є об'єкти класу C ++ першокласними? Ні, і ви нічого з цим не можете зробити. Ви можете мати самоаналіз під час виконання або під час компіляції? Ні, і ви нічого з цим не можете зробити.
Ця мовна гнучкість Lisp - це те, що робить його чудовим для будівництва знизу вгору. Ви можете будувати не тільки підпрограми, але й синтаксис та семантику мови. І в певному сенсі сам Лісп знизу вгору.