Еще одна переписка с читателем (в календарном порядке):
-------------------------------
Wednesday, August 18, 2004, 12:56:44 Alexandr Antonov wrote:
AA> Здравствуйте, Константин.
AA> Я только что прочитал Вашу книгу "Набор серебряных пуль - Справочник
AA> удачных проектных решений при разработке ПО".
AA> Книга произвела на меня довольно сильное впечатление. И хотя я
AA> довольно часто читаю различные книги, статьи, форумы на данную тему,
AA> но именно Ваш труд как-то по особенному меня задел (в хорошем смысле).
AA> С первых несколько страниц бросились в глаза несколько довольно
AA> смелых, прямо таки дерзких утверждений, которые однако выглядят
AA> довольно обоснованными и разумными с моей личной точки зрения.
AA> Например, главный тезис книги: "методологий не существует".
AA> Также поразило, что многие утверждения книги прямо таки полностью
AA> совпадают с моими личными выводами, сделанными из профессионального опыта.
AA> Очень понравилась и согласуется с моими личными выводами идея про то,
AA> что нет совершенных методологий, а все они подходят в той или иной
AA> степени только при определённых обстоятельствах, и из каждой методологии
AA> надо брать лучшее.
AA> Я также согласен с Вашим выводами относительно XP. Сам я знаком с ним
AA> только теоретически, и меня всегда возмущала крайняя категоричность
AA> положений этой методологии и высказываний её приверженцев. Несомненно
AA> есть в XP очень разумные идеи, но нельзя его, по моему, применять всегда и
AA> полностью, без оглядки. Особенно у меня вызывают критику положения
AA> "минимум проектной документации и диаграмм". Мне, кажется, для
AA> проектов длиной хотя бы в несколько месяцев это абсолютно неприемлемо,
AA> даже если команда разработчиков состоит из одного человека.
AA> Также меня прямо таки задела за живое библиография.
AA> Во-первых: просмотрев её, я в очередной раз схватился за голову со
AA> словами: "О ужас, какой я темный человек, а ещё называю себя
AA> профессионалом! Сколько необходимых книг я ещё не прочитал! Немедленно
AA> в книжный магазин!". Если все книги и статьи из данной библиографии Вы
AA> прочитали лично в полном объеме, то примите моё искреннее и глубокое
AA> уважение! Сам я от Вас в этом плане значительно отстаю, хотя я на один
AA> год и старше.
AA> Во-вторых: я себе лично определил, что данная библиография подходит
AA> мне, как нельзя лучше, как план для чтения на ближайшие годы.
AA> Я бы сказал, что данная библиография имеет самостоятельную,
AA> независимую от самой книги, образовательную ценность, как ориентир для
AA> чтения для начинающих специалистов и специалистов
AA> среднего уровня по разработке программного обеспечения.
AA> Ну, хватит о хорошем. Перейдём к критике книги. Лёгкой критике.
AA> Позволю себе высказать несколько замечаний по частям книги, с которыми
AA> я немного не согласен (или просто не понял?).
AA> Сначала, небольшие замечания по структуре книги. Глава 7.3.9
AA> "Расслоение системы" показалась мне находящейся не на своем месте.
AA> Во-первых, сразу бросилось в глаза, что принцип Model-View-Controller
AA> является паттерном проектирования, и выглядит нелогично, что есть
AA> отдельная глава "Паттерны проектирования", но MVC выделен отдельно,
AA> причем в другом месте книги. Мне кажется эти две главы должны быть как
AA> то явно связаны, например идти одна за другой или ссылаться друг на друга.
AA> Также сама идея "расслоения системы", по моему, практически идентична
AA> принципу "создавать 'правильные' объекты" (или является его подмножеством),
AA> описанному в главе 7.3.1 "Создание объектов". Разве одной из целей создания
AA> "правильных" объектов не является хорошее расслоение системы на
AA> классы\пакеты\подсистемы с минимальным зацеплением друг с другом для
AA> того, чтобы работал главный принцип борьбы со сложность "разделяй и властвуй"?
AA> Таким образом, мне кажется, что главы 7.3.1 и 7.3.9 должны быть как то
AA> явно связаны или объединены.
AA> Теперь о минусах ООП, приведённых вами в главе 7.3.10 "ООП". К моему
AA> удивлению они у меня вызвали некоторое несогласие.
AA> Рассмотрим из по отдельности:
AA> 1) "снижение скорости выполнения методов". Звучит очень спорно. Если я
AA> правильно понял, Вы имеете в виду накладные издержки при вызове
AA> виртуальных методов? Много раз встречал споры по этому поводу и мой
AA> личный вывод таков: значительного снижения скорости здесь нет (по сравнению с
AA> процедурным стилем). Если я всё правильно понял, то готов
AA> подискутировать на данную тему.
AA> 2) "увеличение размера программы". Имеете ли Вы виду увеличение
AA> исходных текстов? Если да, то я посмею поспорить. По авторитетным мнениям
AA> (кажется Г.Буч) и по своим личным выводам дело обстоит как раз
AA> наоборот. Хорошая (именно хорошая) ОО программная архитектура отличается,
AA> по моему, как раз таки лаконичностью, с которой можно реализовать
AA> каждый метод программы. Вспомните хотя бы цитату из вашей книги: "Код
AA> каждого метода должен быть не более трех строк".
AA> Также, заметьте, одна из главных целей ООП - это повторное
AA> использование, а повторное использование, очевидно, ведет только к
AA> уменьшению суммарного размера исходных текстов.
AA> 3) "повышение сложности системы". Каким образом? Ведь главная цель ООП -
AA> это победа над сложностью предметной области, т.е. упрощение
AA> всей системы за счет грамотной инкапсуляции, распределения
AA> обязанностей программных сущностей (классов, модулей, ...) и т.д.
AA> Может я не так Вас понял?
AA> 4) "значительный рост требований к квалификации разработчиков". С этим
AA> согласен, но это и минусом ООП назвать сложно. ООП в первую очередь
AA> необходим для разработки сложных систем, а чем сложнее система, тем
AA> выше рост требований к квалификации разработчиков, независимо от
AA> используемой методологии. Таком образом первопричина роста требований
AA> к квалификации, - по моему, не в ОПП, а в сложности систем для которых
AA> ООП создан.
AA> Ещё раз повторюсь, книга очень понравилась. Единственно, так это остаётся
AA> ощущение не полноты книги. Такая серьёзная тема так и просит больше
AA> объема, деталей и охвата.
AA> Очень надеюсь, что мои теплые слова добавят вам, хотя бы немного,
AA> творческого и профессионального вдохновения, а моя критика поможет
AA> сделать следующую версии книгу ещё полезней и интересней.
AA> С глубоким уважением, Александр Антонов.
-------------------------------
Здравствуйте!
AA> Сначала, небольшие замечания по структуре книги. Глава 7.3.9
AA> "Расслоение системы" показалась мне находящейся не на своем месте.
Отчасти с Вами согласен. Но я решил выделить MVC в отдельную главу,
т.к. считаю его не просто паттерном, а скорее "философией", которая
помогает строить "правильную" структуру системы.
Паттерны, по моему мнению, это более "мелкие" кирпичики. Поэтому все
они были помещены в одну главу.
AA> отдельная глава "Паттерны проектирования", но MVC выделен отдельно,
AA> причем в другом месте книги. Мне кажется эти две главы должны быть как
AA> то явно связаны, например идти одна за другой или ссылаться друг на друга.
На самом деле в плане написания книги у меня был записан отдельный пункт -
отсортировать главы в к-л логическом порядке. Но в спешке я забыл это сделать
AA> Также сама идея "расслоения системы", по моему, практически идентична
AA> принципу "создавать 'правильные' объекты" (или является его подмножеством),
AA> ...
AA> Таким образом, мне кажется, что главы 7.3.1 и 7.3.9 должны быть как то
AA> явно связаны или объединены.
То, что принцип создавать "правильные" объекты является подмножеством
"расслоения системы" - полностью согласен. На момент написания книги я
о такой связи не думал. Но в принципе, 7.3.1, также как и паттерны,
можно считать идеей более мелкого масштаба, чем 7.3.9 (следовательно
глава 7.3.1 также имеет право на отдельное существование).
AA> 1) "снижение скорости выполнения методов". Звучит очень спорно. Если я
AA> ...
AA> виртуальных методов? Много раз встречал споры по этому поводу и мой
Честно говоря, этот пункт (минус ООП) я написал исходя из тех споров, о
которых Вы говорите, в Интернете, на форумах, в различных книгах и
статьях. Т.е. лично на практике скорость выполнения методов (исходя из
того, что в ООП методы могут быть перегруженными, отнаследованными из
базовых классов и т.п.) я не проверял.
Поэтому в данном случае, могу признать некоторую "сырость" главы про
ООП в общем и пункт про скорость методов в частности.
Надо было больше работать над материалом
AA> 2) "увеличение размера программы". Имеете ли Вы виду увеличение
AA> исходных текстов? Если да, то я посмею поспорить. По авторитетным мнениям
Имеется в виду размер исполняемого кода (EXE, DLL, etc).
Впрочем, на данный момент, размер исполняемого кода программы уже не
важен (главное, надежность, функциональность и гибкость ПО).
Поэтому, этот аргумент, медленно, но верно устаревает.
AA> 3) "повышение сложности системы". Каким образом? Ведь главная цель ООП -
AA> это победа над сложностью предметной области, т.е. упрощение
AA> всей системы за счет грамотной инкапсуляции, распределения
AA> обязанностей программных сущностей (классов, модулей, ...) и т.д.
Все понятно, если речь идет именно о ГРАМОТНОЙ инкапсуляции и т.п.
Чаще всего это не так. По моему мнению, среднему и начинающему
разработчикам значительно легче разобраться в "плоской" структуре
программы, т.е. наборе функций, вызываемых из разных форм + набор
глобальных переменных, чем держать в голове "объемную" модель
программы - т.е. понимать как в текущем контексте работают объекты
разных классов, когда вызывается базовый метод, а когда метод потомка,
что кому делегируется, какие были применены паттерны и т.п.
AA> 4) "значительный рост требований к квалификации разработчиков". С этим
AA> согласен, но это и минусом ООП назвать сложно. ООП в первую очередь
AA> необходим для разработки сложных систем, а чем сложнее система, тем
AA> выше рост требований к квалификации разработчиков, независимо от
AA> используемой методологии. Таком образом первопричина роста требований
AA> к квалификации, - по моему, не в ОПП, а в сложности систем для которых
AA> ООП создан.
Согласен наполовину. Всем понятно, что С++ более мощный, чем
VBasic, но тем не менее, много людей пишут на ВБ.
В ситуации, когда ПО нужно создавать как можно быстрее, а средний
возраст разработчиков в районе 25 лет, то повышение требований к
квалификации (и времени на изучение и получение опыта)
среды/языка/методики можно считать минусом.
Хотя насчет первопричины согласен.
AA> Такая серьёзная тема так и просит больше объема, деталей и охвата.
Если бы мой рабочий график это позволял... если бы дали отпуск...
больше недели...оплачиваемый...
то тогда конечно
С уважением,
Константин Берлинский
-------------------------------
Thursday, August 19, 2004, 4:56:21 Alexandr Antonov wrote:
Доброго времени суток.
N> Честно говоря, этот пункт (минус ООП) я написал исходя из тех споров, о
N> …………
N> Надо было больше работать над материалом
Про "сырость" главы согласен. Я, честно говоря, вообще не был уверен
правильно ли я понял, некоторые утверждения этой главы, в частности про минусы ООП.
Также про скорость могу добавить следующее: по моему мнению,
программы, построенные по всем принципам ООП могут быть более
медленными, чем их процедурно построенные функциональные аналоги,
потому что в ООП программе очень частым явлением является
делегирование, а точнее даже цепочки делегирования, порой довольно длинные.
Происходит это обычно (как Вы и сами знаете) из-за того, что порой
между клиентом и сервером некоторой услуги находятся несколько уровней
абстракции или "слоев" системы. Прямой вызов клиентом метода сервера
был бы значительно эффективнее, но это противоречит главным принципам ООП:
инкапсуляции, минимизации зацепления и т.д.
Мне кажется, это действительно является минусом ООП, причем более
весомым, чем накладные расходы на вызов виртуального метода, которые на
самом деле я считаю абсолютно несущественными, но правда, именно
относительно С++. (готов это обсудить более подробно, есть есть
желание). Про другие языке говорить не буду.
Кстати, про скорость вызова виртуальных методов есть хороший тест здесь
http://www.rsdn.ru/article/devtools/perftest.xml
Его нельзя назвать всеобъемлющим, но все же он подтверждает мои чисто
теоретические выводы (относительно C++ и Object Pascal), хотя про одну
только фактическую скорость рассуждать здесь нельзя. Надо ещё
учитывать, что процедурная программа должна содержать некий дополнительный
код, который эквивалентен механизму вызова виртуальной функции, например
"поле типа" (термин Страуструпа) и его анализ, например, с помощью оператора case.
AA>> 2) "увеличение размера программы". Имеете ли Вы виду увеличение
AA>> исходных текстов? Если да, то я посмею поспорить. По авторитетным мнениям
N> Имеется в виду размер исполняемого кода (EXE, DLL, etc).
С этим частично согласен. Но мне кажется, в наше время больше на
размер исполняемого кода влияют сторонние библиотеки статически
подключаемые к проекту. Также есть у меня подозрение, что в программах
именно на C++ размер хорошо раздувают templates, если один и тот же
template инстанцирован в проекте большим множеством разных типов.
N> Впрочем, на данный момент, размер исполняемого кода программы уже не
N> важен (главное, надежность, функциональность и гибкость ПО).
N> Поэтому, этот аргумент, медленно, но верно устаревает.
Полностью согласен. Я думаю, "минусы" про скорость устаревают по той
же причине.
N> Все понятно, если речь идет именно о ГРАМОТНОЙ инкапсуляции и т.п.
N> Чаще всего это не так.
Не могу спорить.
N> По моему мнению, среднему и начинающему разработчикам значительно в "плоской"
N> ………….
N> что кому делегируется, какие были применены паттерны и т.п.
Так для этого диаграммы и текстовая документация и нужны! (ещё один
камешек в огород XP). Ни один гений не удержит в голове всю архитектуру
большого проекта.
Так что в плоской структуре без проектной документации все же будет
разобраться сложнее, чем в хотя бы поверхностно документированной ООП
структуре. А документация, а именно различные диаграммы, - это один из
неотъемлемых и обязательных аспектов ООП.
Вспомните хотя бы горячо любимый новичками Delphi. Структуру VCL
тривиальной назвать нельзя, размер тоже немаленький, но все же хорошая
документация делает использование VCL довольно простым.
Так что с "повышением сложности системы" не могу согласится.
N> Спасибо еще раз за такую детальную и аргументированную рецензию.
Рад, что угодил. С интересным человеком и коллегой пообщаться и
интересно и полезно. Хотя я обычно письма и реплики в форумы пишу
редко, но, повторюсь, ваша книга как-то задела меня за живое.
N> Если хотите дискуссию сделать публичной, то можете запостить Ваше письмо и мой ответ на форум, где обсуждается книга:
http://bbs.vbstreets.ru/viewtopic.php?t=8337.
Я только "за", но данная страница выдаёт у меня серверную SQL ошибку.
Буду только рад, если вы запостите нашу переписку и расскажите, как
все-таки на этот форум зайти.
Меня несколько позабавило название сервера vbstreets. Похоже сайт про
VB, но вопросы обсуждаемые именно в нашей переписке далековаты от мира
VB, хотя сама книга, конечно же, актуальна для всех.
С уважением, Александр Антонов.