Сверху вниз - отличный способ описать вещи, которые вы знаете, или восстановить вещи, которые вы уже создали.
Сверху вниз самая большая проблема в том, что довольно часто просто нет «вершины». Вы передумаете о том, что должна делать система при разработке системы и при изучении домена. Как может быть ваша отправная точка чего-то, чего вы не знаете (то есть, что вы хотите, чтобы система делала)?
«Локальный» нисходящий - это хорошо ... некоторые мысли об кодировании явно хороши. Но слишком много думать и планировать, потому что то, что вы представляете, не является реальным сценарием (если вы уже не были там раньше, то есть если вы не строите, а восстанавливаете). Глобальный нисходящий при создании новых вещей это просто глупость.
Подход «снизу вверх» должен быть (глобальным) подходом, если вы не знаете 100% проблемы, вам нужно просто закодировать известное решение, и вам не нужно искать возможные альтернативные решения.
Лисп-подход - это перегнанный снизу вверх. Вы можете не только строить снизу вверх, но и формировать кирпичи так, как вам нужно. Ничто не исправлено, свобода полная. Конечно, свобода берет на себя ответственность, и вы можете делать ужасные вещи, злоупотребляя этой силой.
Но ужасный код можно написать на любом языке. Даже в языках, которые имеют форму клеток для разума, они рассчитаны на то, что с этими языками даже обезьяны смогут запустить и запустить хорошие программы (идея настолько ошибочна на столь многих уровнях, что больно даже думать об этом).
Ваш пример о веб-сервере. Сейчас, в 2012 году, это четко определенная проблема, у вас есть спецификации, которым нужно следовать. Веб-сервер - это просто проблема реализации. Особенно, если вы нацелены на написание веб-сервера, по существу идентичного другим гаджиллионам веб-серверов, которые там существуют, тогда нет ничего действительно неясного, кроме некоторых мелочей. Даже ваш комментарий о RSA все еще говорит о четко определенной проблеме с формальными спецификациями.
С четко определенной проблемой, с формальными спецификациями и уже известными решениями, кодирование просто соединяется в точках. Сверху вниз это нормально. Это менеджер проекта рай.
Однако во многих случаях не существует проверенного общеизвестного подхода для соединения точек. На самом деле очень часто трудно сказать даже, каковы точки.
Предположим, например, что вас попросили дать автоматическому отрезному станку команду выровнять детали, которые нужно разрезать, по печатному материалу, который не полностью соответствует теоретическому повторяющемуся логотипу. Вам предоставляются детали и фотографии материала, снятые машиной.
Что такое правило выравнивания? Вам решать. Что такое шаблон, как его представить? Вам решать. Как выровнять части? Вам решать. Можно ли согнуть детали? Это зависит, некоторые нет, а некоторые да, но, конечно, не слишком много. Что делать, если материал слишком деформирован, чтобы деталь могла его разрезать приемлемо? Вам решать. Все ли рулоны материала идентичны? Конечно, нет, но вы не можете заставить пользователя адаптировать правила выравнивания для каждого броска ... это было бы нецелесообразно. Какие картинки видят камеры? Материал, что бы это ни значило ... это может быть цвет, он может быть черным над черным, где только светлый рефлекс делает рисунок очевидным. Что значит распознать шаблон? Вам решать.
Теперь попробуйте разработать общую структуру решения этой проблемы и дать цитату, в деньгах и времени. Держу пари, что даже ваша системная архитектура ... (да, архитектура) будет неправильной. Стоимость и время оценки будут случайными числами.
Мы внедрили его и теперь это работающая система, но много раз меняли свое мнение о самой форме системы. Мы добавили целые подсистемы, которые сейчас даже недоступны из меню. Мы переключали главные / подчиненные роли в протоколах более одного раза. Вероятно, теперь у нас достаточно знаний, чтобы попытаться восстановить его лучше.
Конечно, другие компании решили ту же проблему ... но если вы не в одной из этих компаний, скорее всего, ваш подробный проект сверху вниз будет шуткой. Мы можем спроектировать его сверху вниз. Вы не можете, потому что вы никогда не делали этого раньше.
Вы, вероятно, можете решить ту же проблему тоже. Работая снизу вверх однако. Начиная с того, что вы знаете, изучая то, что вы не делаете и складывая.
Новые сложные программные системы выращиваются, а не проектируются. Время от времени кто-то начинает с нуля разрабатывать новую сложную плохо определенную программную систему (обратите внимание, что в большом сложном программном проекте есть только три возможности: а) спецификация нечеткая, б] спецификация неправильная и противоречивая. или с] оба ... и чаще всего [с] имеет место).
Это типичные проекты огромных компаний, в которые тысячи и тысячи часов добавляются только слайды PowerPoint и диаграммы UML. Они неизменно терпят неудачу полностью после сжигания смущающего количества ресурсов ... или в каком-то очень исключительном случае они, наконец, поставляют переоцененную часть программного обеспечения, которая реализует только крошечную часть начальных спецификаций. И это программное обеспечение неизменно глубоко ненавидят пользователи ... не то, какое программное обеспечение вы бы купили, а то, какое программное обеспечение вы используете, потому что вы вынуждены.
Значит ли это, что я думаю, что вы должны думать только о коде? Конечно нет. Но, по моему мнению, строительство должно начинаться снизу (кирпичи, конкретный код) и должно идти вверх ... и ваше внимание и внимание к деталям должны в некотором смысле «исчезать» по мере того, как вы становитесь дальше от того, что у вас есть. Нисходящий поток часто представляется так, как будто вы должны поместить один и тот же уровень детализации во всю систему сразу: просто делайте это, разделяя каждый узел, пока все не станет очевидным ... в реальных модулях подсистема "выросла" из подпрограмм. Если у вас нет опыта работы с конкретной проблемой, ваш дизайн подсистемы, модуля или библиотеки будет ужасным. Вы можете создать хорошую библиотеку, когда будете знать, какие функции вставлять, а не наоборот.
Многие идеи Lisp становятся все более популярными (первоклассные функции, замыкания, динамическая типизация по умолчанию, сборка мусора, метапрограммирование, интерактивная разработка), но Lisp все еще сегодня (среди известных мне языков) совершенно уникален в том, как легко формировать код за то что тебе нужно.
Например, параметры ключевого слова уже присутствуют, но если они отсутствуют, их можно добавить. Я сделал это (включая проверку ключевых слов во время компиляции) для игрушечного компилятора Lisp, с которым я экспериментировал, и он не занимал много кода.
С C ++ вместо этого вы можете получить всего лишь кучу экспертов C ++, которые скажут вам, что параметры ключевых слов не так уж полезны, или невероятно сложную, сломанную, полуобеспеченную реализацию шаблона, которая действительно не так полезна. Являются ли классы C ++ первоклассными объектами? Нет, и с этим ничего не поделаешь. Можете ли вы провести самоанализ во время выполнения или во время компиляции? Нет, и с этим ничего не поделаешь.
Гибкость языка в Лиспе делает его идеальным для построения снизу вверх. Вы можете создавать не только подпрограммы, но также синтаксис и семантику языка. И в каком-то смысле сам Lisp является восходящим.