Проектирование и рефакторинг
11.02.2006
|
IT |
Здравствуйте, xbit, Вы писали:
X> Лично я, тоже не могу в это поверить. Как можно сесть и сразу начать писать (как IT например) какой нибудь крупный (или средний) проект. Может объясните мне глупому ? Наверное для этого надо быть очень очень умным и иметь огромный опыт или наоборот быть идиотом
На самом деле, это просто. Очень умным быть не обязательно, главное не быть полным идиотом.
eao197 пропагандирует во всех отношениях правильный и устоявшийся стиль мышления — подумай, нарисуй на бумажке, потом закодируй. Современные супер-дюпер архитекторы заменятю бумажку какой-нибудь рисовалкой типа Visio. Но eao197 с бумажкой в этом смысле не очень сильно отстал, не исключено, что для него этот способ гораздо более эффективнее
Проектирование как отдельная стадия очень даже имеет смысл, действительно имеет и действительно смысл, тогда, когда речь идёт о передаче знаний от одного человека другому. Но судя по постам eao197 этот кто-то другой — он сам. Он просто хочет передать свои же знания самому же себе во времени. Т.е. когда-то он потратил 10 минут на идею, затем 2 часа на воплощение этой идеи на бумаге, что через 2 месяца безусловно гарантировало ему сохранение 10-ти минут на воспроизведение этой самой идеи в течении 20 минутного разглядывания бумажек 2-х месячной давности.
Всё нормально. Только если он сразу начал бы писать код, то не исключено, что задача была бы решена ещё 2 месяца назад. Либо была бы решена на 90%.
У меня складывается стойкое впечатление, что вы думаете, что если я или Влад начинаем сразу писать код, то этап проектирования как таковой ислючается. Но это не так. Возьмём, например, дизайн базы данных. Можно взять Визио, нарисовать в нём таблички, затем перенести их в SQL Server. Затем внести какие-то изменения в диаграммы, перенести эти изменения в SQL Server. И так до посинения.
Если же я сразу начну создавать таблицы прямо в БД, то по твоей логике я как бы и не занимаюсь проектированием вообще. Но это же ведь не так Конечно же я проектирую, но помимо того, что я не делаю одну и ту же работу дважды, перенося изменения из одного места в другое, я постепенно, шаг за шагом вместе с моим дизайном получаю физически готовую БД. Я могу наполнить её данными, погонять какие-то тесты и на их основе изменить текущий дизайн, что несомненно повлияет на будущий. Если же я всё сначала спроектирую на бумажке или в Визио, то возможно, что из-за каких-то незамеченных сразу проблем половину законченного проекта придётся выбросить и переделать по-новой.
К тому же я могу взять встроенный в SQL Server диаграммер. Он не такой навороченный, но в отличии от Визио позволяет не делать одно и то же дважды и мгновенно отражает любые изменения в структуре БД. Т.е. я получаю тот же результат что и с Визио, но гораздо быстрее.
То же самое и с кодом. Я начинаю одновременно проектировать систему и писать код, пробовать в живую, ошибаться, переписывать. Бывают, конечно, случаи, когда открываешь лаптоп, задумываешься что и как делать, смотришь 40 минут в окно, закрываешь лаптоп и откладываешь свою писанину до завтра. Идея ещё не сварилась, она пока не готова. Не готова для воплощения ни в коде, ни на бумаге.
Вопрос — что же изменилось, почему те кто ещё вчера агитировал за обязательное проектирование, сегодня утверждают, что во многих случаях его как стадию проекта можно опустить и сразу начинать писать код?
Чтобы ответить на этот вопрос, нам нужно понять что даёт нам проектирование на бумаге или в Визио. Одной из целей проектирования явлюется минимизация затрат на кодирование, а именно затрат на переделку уже готовых вещей, в случае, если изменился дизайн системы. Такие изменения, как правило, самые болезненные и вносят в систему наибольшее количество проблем. Поэтому, мы сначала всё досконально продумываем на бумаге и только потом переносим это в код.
Ещё одна вещь, которую нам даёт проектирование — это возможность быстро восстанавливать в голове подзабытые детали. Например, одного взгляда на диаграмму классов достаточно, чтобы вспомнить связи между сущностями. Т.е. фактически мы уже имеем некоторую документацию на систему.
Но проблема в том, что наличие проекта на бумаге ни коим образом не гарантирует отсутствие изменения дизайна в будущем и вместе с ним актуальность документации. Гораздо чаще приходится иметь дело с задачами с невнятными первоначальными требованиями, чем с чёткой постановкой и законченным списком функциональных требований. Соответственно проектирование не оправдывает возложенных на него надежд и его важность уменьшается, хотя всё ещё и остаётся положительной величиной.
Теперь ответ на вопрос что изменилось. Изменились средства разработки. С решарпером или с 2005-й студией, я больше не боюсь глубоких переделок кода. Это стало вполне обычным делом. Если я вижу кривизну дизайна или его несоответствие новым требованиям, я не задумываясь переделываю всё что меня не устраивает. Средства рефакторинга позволяют это делать очень быстро. Например, переименование метода или изменение порядка его параметров с изменением всех ссылок на него делается в течении нескольких секунд. Попробуй это корректно сделать поиском/заменой. Генерация заглушек методов позволяет создавать их прямо из мест использования. А это значит, что я могу не отвлекаться от текущей задачи, что позволяет мне сохранить минуту-две. Скорость набора кода обеспечивает автокомплит. Интеллисенс позволяет держать в голове только ссылки на информацию, но не весь MSDN.
Таким образом, первое из перечисленных выше преимуществ проектирования становится не актуальным.
Остаётся документирование. Точнее не оно само, а возможность с помощью него быстрого воспроизведения информации. Средства современных IDE по организации проектов и навигации по коду сводят и это преимущество проектирования практически в ноль. Разбиение задачи на проекты, а проекты на фолдеры делает навигацию по классам в Solution Explorer не сложнее чем перебор бумажек с диаграммами на столе. Поиск ссылок на класс или метод — это одна секунда. За кнопку F12 разработчикам студии надо вообще поставить 5 с плюсом. Закладки, аутлайнинг и partial классы позволяют больше не беспокоится о размере классов и устраняют проблемы навигации по ним. Раньше я старался держать как можно больше файлов открытими, чтобы иметь возможность вернуться в место где я был до этого. Сейчас после написания очередного функционала я делаю Close All Documents, так как много открытых документов — это всё же не очень удобно, а найти нужное для меня место в проекте с современным возможностями IDE — задача элементарная. Наличие отработанных соглашений усиливает эффект от всего перечисленного и позволяет нормально ориентироваться не только в своём коде, но и в коде своих коллег.
При этом, кроме быстрой навигации я получаю ещё и возможность заглянуть в сам код. Если он хорошо организован и отформатирован, то на понимание того, что он делает уходит тоже совсем немного времени. Никакая проектная документация не даст мне больше, чем чтение исходников.
Что же у нас осталось положительного от проектирования на бумаге в сравнении с проектированием прямо в коде? А ничего не осталось. Учитывая то, что проектная документация имеет тенденцию довольно быстро устаревать и требует серьёзных усилий по поддержке её в актуальном состоянии, то получается, что сегодня, при поддержке современных IDE, от неё больше вреда чем пользы. Впрочем, если заказчик готов за неё платить, то почему бы и нет
X> Лично я, тоже не могу в это поверить. Как можно сесть и сразу начать писать (как IT например) какой нибудь крупный (или средний) проект. Может объясните мне глупому ? Наверное для этого надо быть очень очень умным и иметь огромный опыт или наоборот быть идиотом
На самом деле, это просто. Очень умным быть не обязательно, главное не быть полным идиотом.
eao197 пропагандирует во всех отношениях правильный и устоявшийся стиль мышления — подумай, нарисуй на бумажке, потом закодируй. Современные супер-дюпер архитекторы заменятю бумажку какой-нибудь рисовалкой типа Visio. Но eao197 с бумажкой в этом смысле не очень сильно отстал, не исключено, что для него этот способ гораздо более эффективнее
Проектирование как отдельная стадия очень даже имеет смысл, действительно имеет и действительно смысл, тогда, когда речь идёт о передаче знаний от одного человека другому. Но судя по постам eao197 этот кто-то другой — он сам. Он просто хочет передать свои же знания самому же себе во времени. Т.е. когда-то он потратил 10 минут на идею, затем 2 часа на воплощение этой идеи на бумаге, что через 2 месяца безусловно гарантировало ему сохранение 10-ти минут на воспроизведение этой самой идеи в течении 20 минутного разглядывания бумажек 2-х месячной давности.
Всё нормально. Только если он сразу начал бы писать код, то не исключено, что задача была бы решена ещё 2 месяца назад. Либо была бы решена на 90%.
У меня складывается стойкое впечатление, что вы думаете, что если я или Влад начинаем сразу писать код, то этап проектирования как таковой ислючается. Но это не так. Возьмём, например, дизайн базы данных. Можно взять Визио, нарисовать в нём таблички, затем перенести их в SQL Server. Затем внести какие-то изменения в диаграммы, перенести эти изменения в SQL Server. И так до посинения.
Если же я сразу начну создавать таблицы прямо в БД, то по твоей логике я как бы и не занимаюсь проектированием вообще. Но это же ведь не так Конечно же я проектирую, но помимо того, что я не делаю одну и ту же работу дважды, перенося изменения из одного места в другое, я постепенно, шаг за шагом вместе с моим дизайном получаю физически готовую БД. Я могу наполнить её данными, погонять какие-то тесты и на их основе изменить текущий дизайн, что несомненно повлияет на будущий. Если же я всё сначала спроектирую на бумажке или в Визио, то возможно, что из-за каких-то незамеченных сразу проблем половину законченного проекта придётся выбросить и переделать по-новой.
К тому же я могу взять встроенный в SQL Server диаграммер. Он не такой навороченный, но в отличии от Визио позволяет не делать одно и то же дважды и мгновенно отражает любые изменения в структуре БД. Т.е. я получаю тот же результат что и с Визио, но гораздо быстрее.
То же самое и с кодом. Я начинаю одновременно проектировать систему и писать код, пробовать в живую, ошибаться, переписывать. Бывают, конечно, случаи, когда открываешь лаптоп, задумываешься что и как делать, смотришь 40 минут в окно, закрываешь лаптоп и откладываешь свою писанину до завтра. Идея ещё не сварилась, она пока не готова. Не готова для воплощения ни в коде, ни на бумаге.
Вопрос — что же изменилось, почему те кто ещё вчера агитировал за обязательное проектирование, сегодня утверждают, что во многих случаях его как стадию проекта можно опустить и сразу начинать писать код?
Чтобы ответить на этот вопрос, нам нужно понять что даёт нам проектирование на бумаге или в Визио. Одной из целей проектирования явлюется минимизация затрат на кодирование, а именно затрат на переделку уже готовых вещей, в случае, если изменился дизайн системы. Такие изменения, как правило, самые болезненные и вносят в систему наибольшее количество проблем. Поэтому, мы сначала всё досконально продумываем на бумаге и только потом переносим это в код.
Ещё одна вещь, которую нам даёт проектирование — это возможность быстро восстанавливать в голове подзабытые детали. Например, одного взгляда на диаграмму классов достаточно, чтобы вспомнить связи между сущностями. Т.е. фактически мы уже имеем некоторую документацию на систему.
Но проблема в том, что наличие проекта на бумаге ни коим образом не гарантирует отсутствие изменения дизайна в будущем и вместе с ним актуальность документации. Гораздо чаще приходится иметь дело с задачами с невнятными первоначальными требованиями, чем с чёткой постановкой и законченным списком функциональных требований. Соответственно проектирование не оправдывает возложенных на него надежд и его важность уменьшается, хотя всё ещё и остаётся положительной величиной.
Теперь ответ на вопрос что изменилось. Изменились средства разработки. С решарпером или с 2005-й студией, я больше не боюсь глубоких переделок кода. Это стало вполне обычным делом. Если я вижу кривизну дизайна или его несоответствие новым требованиям, я не задумываясь переделываю всё что меня не устраивает. Средства рефакторинга позволяют это делать очень быстро. Например, переименование метода или изменение порядка его параметров с изменением всех ссылок на него делается в течении нескольких секунд. Попробуй это корректно сделать поиском/заменой. Генерация заглушек методов позволяет создавать их прямо из мест использования. А это значит, что я могу не отвлекаться от текущей задачи, что позволяет мне сохранить минуту-две. Скорость набора кода обеспечивает автокомплит. Интеллисенс позволяет держать в голове только ссылки на информацию, но не весь MSDN.
Таким образом, первое из перечисленных выше преимуществ проектирования становится не актуальным.
Остаётся документирование. Точнее не оно само, а возможность с помощью него быстрого воспроизведения информации. Средства современных IDE по организации проектов и навигации по коду сводят и это преимущество проектирования практически в ноль. Разбиение задачи на проекты, а проекты на фолдеры делает навигацию по классам в Solution Explorer не сложнее чем перебор бумажек с диаграммами на столе. Поиск ссылок на класс или метод — это одна секунда. За кнопку F12 разработчикам студии надо вообще поставить 5 с плюсом. Закладки, аутлайнинг и partial классы позволяют больше не беспокоится о размере классов и устраняют проблемы навигации по ним. Раньше я старался держать как можно больше файлов открытими, чтобы иметь возможность вернуться в место где я был до этого. Сейчас после написания очередного функционала я делаю Close All Documents, так как много открытых документов — это всё же не очень удобно, а найти нужное для меня место в проекте с современным возможностями IDE — задача элементарная. Наличие отработанных соглашений усиливает эффект от всего перечисленного и позволяет нормально ориентироваться не только в своём коде, но и в коде своих коллег.
При этом, кроме быстрой навигации я получаю ещё и возможность заглянуть в сам код. Если он хорошо организован и отформатирован, то на понимание того, что он делает уходит тоже совсем немного времени. Никакая проектная документация не даст мне больше, чем чтение исходников.
Что же у нас осталось положительного от проектирования на бумаге в сравнении с проектированием прямо в коде? А ничего не осталось. Учитывая то, что проектная документация имеет тенденцию довольно быстро устаревать и требует серьёзных усилий по поддержке её в актуальном состоянии, то получается, что сегодня, при поддержке современных IDE, от неё больше вреда чем пользы. Впрочем, если заказчик готов за неё платить, то почему бы и нет
... << RSDN@Home 1.2.0 alpha rev. 0>>
11.02.2006 51 комментарий |
IT>eao197 пропагандирует во всех отношениях правильный и устоявшийся стиль мышления — подумай, нарисуй на бумажке, потом закодируй. Современные супер-дюпер архитекторы заменятю бумажку какой-нибудь рисовалкой типа Visio. Но eao197 с бумажкой в этом смысле не очень сильно отстал, не исключено, что для него этот способ гораздо более эффективнее
Именно, что лично для меня.
IT>Проектирование как отдельная стадия очень даже имеет смысл, действительно имеет и действительно смысл, тогда, когда речь идёт о передаче знаний от одного человека другому. Но судя по постам eao197 этот кто-то другой — он сам. Он просто хочет передать свои же знания самому же себе во времени. Т.е. когда-то он потратил 10 минут на идею, затем 2 часа на воплощение этой идеи на бумаге, что через 2 месяца безусловно гарантировало ему сохранение 10-ти минут на воспроизведение этой самой идеи в течении 20 минутного разглядывания бумажек 2-х месячной давности.
+1
IT>Всё нормально. Только если он сразу начал бы писать код, то не исключено, что задача была бы решена ещё 2 месяца назад. Либо была бы решена на 90%.
А вот это исключено. Проверено годами на собственном опыте.
IT>>Всё нормально. Только если он сразу начал бы писать код, то не исключено, что задача была бы решена ещё 2 месяца назад. Либо была бы решена на 90%.
E>А вот это исключено. Проверено годами на собственном опыте.
Это были неправильные задачи!
ГВ>Это были неправильные задачи!
((С) К.Вонегут).
ГВ>>Это были неправильные задачи!
E> E>((С) К.Вонегут).
И заказчики у тебя неправильные! Они несут неправильный мёд. Так что, ты его не пей, козлёночком станешь. Давай, бросай всё и вливайся в ряды миллионов. Ты понял, нет? Миллионы тебя ждут. Мил-ли-о-ны!А ты, понимаешь, расчирикался! Ты ещё не понял, как надо компиляторы писать? Эх, и поимела же тебя матрица! По самое фрейдистское начало.
ГВ>И заказчики у тебя неправильные! Они несут неправильный мёд. Так что, ты его не пей, козлёночком станешь. Давай, бросай всё и вливайся в ряды миллионов. Ты понял, нет? Миллионы тебя ждут. Мил-ли-о-ны!А ты, понимаешь, расчирикался! Ты ещё не понял, как надо компиляторы писать? Эх, и поимела же тебя матрица! По самое фрейдистское начало.
Гена, что-то ты злой сегодня.
E>Гена, что-то ты злой сегодня.
Да нет, Женя, это я ещё не злой. Это, в общем, шуточный пост был.
Данное сообщение не является попыткой покритиковать или опровергнуть что-нибудь в рассказе IT. Как я понимаю, Игорь просто поделился своим опытом. У меня же есть мой опыт, исходя из которого я смотрю на некоторые вещи чуть иначе. Так же я думаю, что мы с IT занимаемся разными задачами, что дает возможность нам использовать разные подходы к разработке.
Этот пост в некоторой степени является ответом и на сообщение VladGalkin, о хороших результатах инкрементальной разработки и дискредитировавшей себя модели Waterfall.
С моей точки зрения, главной задачей проектирования является достижение понимания того, что нужно сделать. Точного понимания.
Степень точности зависит от уровня абстракции. На каком-то уровне нужно точно понять, что необходимо разработать инструмент SObjectizer (или ACE, или Spring, или BLToolkit, конкретное имя ничего не значит). Здесь мы можем более-менее расплывчато представлять себе конкретные возможности нового инструмента, но зато точно должны знать, чем этот инструмент отличается от конкурентов и зачем он нужем нам (либо потенциальным покупателям).
На более низком уровне нужно точно понять, что за работу с таймером в SObjectizer будет отвечать нечто, что описывается некоторым интерфейсом timer_thread_t. Опять же, требуется более-менее расплывчатое представление о возможных способах его реализации (чтобы не выбрать в результате заведомо проигрышный по эффективности вариант). Но нужно точно знать зачем и почему timer_thread_t необходим.
Еще на более низком уровне нужно точно понять, как реализовать timer_thread_t с помощью ACE_Thread_Timer_Queue_Adapter. На этом уровне я не знаю всех деталей реализации методов timer_thread_t, но зато должен точно понимать, что эти реализации не будут приводить к тупикам, гонкам или утечкам ресурсов.
По моему мнению, здесь нет никакой модели Waterfall. На каждом уровне абстракции я нахожусь ровно столько, сколько нужно чтобы понять, что я точно представляю себе работу этого уровня. И что это знание позволяет мне двигаться дальше. Не на всех уровнях возможно написание кода, но если где-то возможно и это имеет смысл, то я пишу код. Но я предпочитаю пользоваться при проектировании именно бумагой, потому что:
* лично меня отвлекает большое количество мелких деталей общения к компьютером (хотя бы необходимость периодически сохранять изменения в документе);
* на компьютере для меня «хуже обзор», т.к. даже на мониторе с большим разрешением я вижу гораздо меньше деталей, чем на двух сложенных рядом листах формата A4;
* в большинстве случаев процесс поиска точного представления напоминает блуждание в тумане, когда перебираются десятки вариантов. Многие варианты отвергаются и затем принимаются к расмотрению по несколько раз, многократно перекраиваются и возвращаются затем к первоначальному варианту. Лично мне не хочется проделывать лишнюю работу и проделывать все это мышкой в Visio, поскольку на бумаге все это для меня гораздо проще.
Кстати, приведенный мной черновой вариант решения с timer_thread_t оказался не правильным. И я выбросил его не написав ни одной лишней строчки кода. У меня не возникло соблазна взять какую-то часть написанного кода для нового решения (не знаю как у кого, но у меня такой соблазн всегда был слишком велик).
И еще один важный момент по поводу проектирования. Неявно подразумевается, что проект все равно будет неоднократно пересматриваться, требования к нему будут изменяться и все равно его придется перекраивать и переделывать. В некоторых предметных областях только так и можно, но не везде. При разработке программного инструментария ситуация несколько иная. Если я разрабатываю объектную СУБД, то глупо, имхо, расчитывать на то, что требования к ней будут меняться раз в месяц. Нет, я сразу должен буду получить приемлимый результат. Более того, должен быть выбран такой API для СУБД, который бы позволил выпустить несколько версий СУБД не нарушая совместимости клиентских приложений. А в разработке СУБД есть области, в которых лично я не представляю себе написания кода без точного понимания того, как он будет работать. Например, механизм записи транзакционных изменений посредством write-ahead log. До написания кода я уже должен четко знать, какая метаинформация информация должна быть в log-е, как по этой информации определять актуальность log-а, как по log-у восстанавливать БД после сбоя, можно ли использовать log для организации on-line репликации и пр. Конечно, точный состав и форма представления метаинформации будет меняться по ходу реализации. Сама реализация может быть итерационной, где некоторые части метаинформации будут игнорироваться на разных итерациях. Еще более вероятно, что перед разработкой будет создано и выброшено несколько прототипов. Но суть в том, что лично я не представляю, как придти к механизму write-ahead log-а начав с программирования подсистемы write-ahead log-а.
И в завершении хотелось бы сказать про документацию. IT указал, что самая точная документация – это программный код. Но эта информация не всегда самая полезная. Например, если речь идет о вспомогательных библиотеках. Я думаю, что для программиста, использующего ACE, не так уж много пользы даст код метода ACE_Event_Handler::handle_input или ACE_Reactor::run_reactor_event_loop. А в некоторых случаях кода используемой библиотеки нет вовсе. На первое место в таких условях выходит документация, написанная в комментариях к методам и классам. Но чтобы ее написать, довольно часто нужно представлять себе всю картину в целом. Картину, которая открывается мне после предварительного проектирования на бумаге. Поэтому, когда я приступаю к программированию, я приступаю и к документированию. При этом написание doxygen комментариев к коду является, наверное, более трудоемкой и длительной операций, чем кодирование. Зато на выходе получается еще и довольно объемный и актуальный Reference Manual. Конечно, не иногда он не нужен. Но, поскольку я всегда старался заниматься разработкой инструментария, то практически постоянно мне приходилось делать еще и документацию. И предварительное проектирование на бумаге существенно облегчало этот процесс.
E>Кстати, приведенный мной черновой вариант решения с timer_thread_t оказался не правильным. И я выбросил его не написав ни одной лишней строчки кода. У меня не возникло соблазна взять какую-то часть написанного кода для нового решения (не знаю как у кого, но у меня такой соблазн всегда был слишком велик).
Гм. Ты как бы неявно предполагаешь, что строчки кода — штука дорогая. И вот ты получил лист A4, и сэкономил несколько строк кода.
Я пока еще не достиг нужного уровня просветления, но довольно давно предпочитаю проектировать в терминах кода. Раньше мне это было не очень удобно, потому что я писал на дельфи, а там еще и изменения в интерфейсе не очень хорошо отображались в имплементейшн. Не говоря уже о внешних ссылках.
Сейчас в студии я пишу код не задумываясь. При этом получается у меня быстрее, чем на бумажке:
— когда я описываю интерфейс или делегат, мне вообще не нужно делать лишних нажатий. За меня почти все дописывает автокомплит.
— когдя я меняю сигнатуру, у меня под рукой рефакторинг, который мгновенно согласованно меняет весь солюшн.
Поэтому мне не страшно сделать ошибку. Я не пользуюсь решарпером, т.к. он еще недостаточно стабилен. Но даже встроенный рефакторинг VS2005 позволяет мне думать кодом.
При этом самое милое — в том, что когда я хочу нарисовать картинку, дизайнер диаграмм делает это гораздо быстрее и аккуратнее, чем карандаш и бумага. И, в отличие от бумаги, эти картинки не теряются под столом, а идут в SVN. И они бесплатно сохраняют актуальность, если я что-то поменял в коде!
Я выбрасываю довольно много кода. Зачастую придуманные мной интерфейсы/классы не переживают очередного витка рефакторинга. Но я отношусь к ним так же, как к бумажкам на столе — периодически выкидываю их из SVN.
Получается, что мне проектировать в студии дешевле, чем на бумаге!
E>И еще один важный момент по поводу проектирования. Неявно подразумевается, что проект все равно будет неоднократно пересматриваться, требования к нему будут изменяться и все равно его придется перекраивать и переделывать. В некоторых предметных областях только так и можно, но не везде. При разработке программного инструментария ситуация несколько иная. Если я разрабатываю объектную СУБД, то глупо, имхо, расчитывать на то, что требования к ней будут меняться раз в месяц. Нет, я сразу должен буду получить приемлимый результат. Более того, должен быть выбран такой API для СУБД, который бы позволил выпустить несколько версий СУБД не нарушая совместимости клиентских приложений.
API — пожалуйста. А внутреннее устройство можно пересматривать как угодно. Более того, обычно этого не делают не потому, что не надо, а потому, что очень дорого.
E>А в разработке СУБД есть области, в которых лично я не представляю себе написания кода без точного понимания того, как он будет работать. Например, механизм записи транзакционных изменений посредством write-ahead log. До написания кода я уже должен четко знать, какая метаинформация информация должна быть в log-е, как по этой информации определять актуальность log-а, как по log-у восстанавливать БД после сбоя, можно ли использовать log для организации on-line репликации и пр. Конечно, точный состав и форма представления метаинформации будет меняться по ходу реализации. Сама реализация может быть итерационной, где некоторые части метаинформации будут игнорироваться на разных итерациях. Еще более вероятно, что перед разработкой будет создано и выброшено несколько прототипов. Но суть в том, что лично я не представляю, как придти к механизму write-ahead log-а начав с программирования подсистемы write-ahead log-а.
А что ты начинаешь делать при проектировании? пишешь текст? Ну так я просто набиваю // и тайпаю. Возникла какая-то сущность типа LogRecord? Ок, пишем:
E>И в завершении хотелось бы сказать про документацию. IT указал, что самая точная документация – это программный код. Но эта информация не всегда самая полезная. Например, если речь идет о вспомогательных библиотеках. Я думаю, что для программиста, использующего ACE, не так уж много пользы даст код метода ACE_Event_Handler::handle_input или ACE_Reactor::run_reactor_event_loop. А в некоторых случаях кода используемой библиотеки нет вовсе. На первое место в таких условях выходит документация, написанная в комментариях к методам и классам. Но чтобы ее написать, довольно часто нужно представлять себе всю картину в целом. Картину, которая открывается мне после предварительного проектирования на бумаге.
Гм. К моменту, когда у тебя завершено проектирование на бумаге с текстами, у Влада и IT уже готов набор заглушков на все методы этой библиотеки. Все мало-мальски существенные мысли записаны не карандашом, а в блоках ///. Поэтому в конце достаточно просто просмотреть эту документацию на предмет корректности, понятности и полноты.
E>Поэтому, когда я приступаю к программированию, я приступаю и к документированию. При этом написание doxygen комментариев к коду является, наверное, более трудоемкой и длительной операций, чем кодирование. Зато на выходе получается еще и довольно объемный и актуальный Reference Manual. Конечно, не иногда он не нужен. Но, поскольку я всегда старался заниматься разработкой инструментария, то практически постоянно мне приходилось делать еще и документацию. И предварительное проектирование на бумаге существенно облегчало этот процесс.
S>Гм. Ты как бы неявно предполагаешь, что строчки кода — штука дорогая.
Строки отлаженного кода штука дорогая.
Вообще, я никому не навязываю свой способ работы. Не доказываю, что чей-то способ работы ущербен.
Я просто рассказал, как я работаю. И к этому механизму я пришел не сразу, а за 15 лет, которые занимаюсь программированием. Если кому-то не нравится -- это его дело. Если кто-то не верит, то может посмотреть на RuCodeGen, Mxx_ru, ObjESSty, SObjectizer. Это все проекты, которые развивались практически в свободное от основной работы время. Для меня это служит доказательством эффективности моего подхода (примененного ко мне).
Если кто-то использует другие способы работы, то мне интересно про них узнавать и брать что-то на вооружение. Но я не собирась на навязывать свое мнение, ни реагировать на навязывание мне чужого мнения.
E>Здравствуйте, Sinclair, Вы писали:
S>>Гм. Ты как бы неявно предполагаешь, что строчки кода — штука дорогая.
E>Строки отлаженного кода штука дорогая.
Так никто и не предлагает отлаживать этот код. Ты же не занимаешься отладкой идей на бумаге? Вот и этот код начинает отлаживаться только в том случае, если дожил до реального использования.
E>Я просто рассказал, как я работаю. И к этому механизму я пришел не сразу, а за 15 лет, которые занимаюсь программированием. Если кому-то не нравится -- это его дело. Если кто-то не верит, то может посмотреть на RuCodeGen, Mxx_ru, ObjESSty, SObjectizer. Это все проекты, которые развивались практически в свободное от основной работы время. Для меня это служит доказательством эффективности моего подхода (примененного ко мне).
E>Если кто-то использует другие способы работы, то мне интересно про них узнавать и брать что-то на вооружение. Но я не собирась на навязывать свое мнение, ни реагировать на навязывание мне чужого мнения.
Ну, я надеюсь, что ни о каком навязывании речи не идет.
Я вообще всю жизнь хотел как можно больше проектировать. Но меня постоянно сдерживала тщетность моих усилий — бумагу в SVN не положишь, и в какой-то момент все равно надо набить этот код руками. Пробовал UML, но постоянно бесило отсутствие round-trip и поддержки полной модели языка. В какой-то момент я пришел к проектированию в коде, и использованию плагина в Розе для визуализации — благо Delphi позволял довольно шустро педалить интерфейсы (студия в те времена в качестве автокомплита предлагала вообще все, что ей известно, включая макросы. Се ля ви — плюсы язык такой, никогда заранее не знаешь, что удастся привести к чему ).
Неприятность была в том, что вносить изменения в коде было дорого — банальная опечатка в имени класса могла жить до конца проекта, т.к. не доходили руки сделать полную замену.
Я уже не говорю о смене типа свойства или раскидывании класса на два.
Теперь вроде как есть кульный кульман. Все как встарь, только в углу кнопка "построить здание по этому чертежу"
E>>Строки отлаженного кода штука дорогая.
S>Так никто и не предлагает отлаживать этот код. Ты же не занимаешься отладкой идей на бумаге? Вот и этот код начинает отлаживаться только в том случае, если дожил до реального использования.
Один умный человек когда-то на лекции сказал: "Ты знаешь что-то сам только когда можешь объяснить это другому". Имхо, ты понимаешь что-то только тогда, когда можешь внятно это описать. Мое рисование на бумаге как раз является критерием проверки понимания. А кристализация идеи до такой степени, чтобы быть внятно записанной, имхо, включает в себя и процесс отладки идеи. Отладки, которой может никогда не произойти, если я раньше времени отвлекусь от продумывания и брушусь за реализацию.
Приведенный мной пример с timer_thread_t как раз стал яркой тому иллюстрацией. На тот момент мне представлялось, что я четко представляю себе, как будет работать не только timer_thread_t, но и необходимый ему ACE_Event_Handler. И если бы я взялся за программирование, то написал бы код, заставил бы его работать, прикрутил бы к нему тесты. Проблема была бы в том, что в очень эпизодических ситуациях (когда вызов destroy_all_agent_msg() совпал бы с определенным моментом времени при обработке периодического сообщения этого агента) происходила бы порча памяти. Я сильно сомневаюсь, что такую ошибку удалось бы отловить в автономных тестах. И в реальном использовании она бы возникала очень нестабильно. Зато при проектировании, когда кода не было написано вообще, эта ошибка стала очевидной как только я взялся расписывать обработчик handle_timeout. Иначе как отладкой идей на бумаге я назвать это не берусь.
Может быть кто-то и может при программировании помнить детали проекта, но это не я.
E>Здравствуйте, Sinclair, Вы писали:
E>>>Строки отлаженного кода штука дорогая.
S>>Так никто и не предлагает отлаживать этот код. Ты же не занимаешься отладкой идей на бумаге? Вот и этот код начинает отлаживаться только в том случае, если дожил до реального использования.
E>Один умный человек когда-то на лекции сказал: "Ты знаешь что-то сам только когда можешь объяснить это другому".
Это слова Давида Гильберта.
Он сказал как-то примерно так: ты по настоящему понимаешь предмет если можешь выйти на улицу и объяснить его первому встречному.
E>Один умный человек когда-то на лекции сказал: "Ты знаешь что-то сам только когда можешь объяснить это другому".
Пробовал когда нибудь переводить текст в большом объеме? Лично у меня на это уходит на порядок больше сил, нежели если нужно просто этот текст понять.
S>А что ты начинаешь делать при проектировании? пишешь текст? Ну так я просто набиваю // и тайпаю. Возникла какая-то сущность типа LogRecord? Ок, пишем:
S>
Ты ведь своей ООСУБД хотел занятся? Вот как раз попробуй подобным образом write-ahead log сделать.
У себя я начал писать код, только когда представил что у меня будут trace-файлы и snapshot-ы, и что я с ними буду делать.
E>И в завершении хотелось бы сказать про документацию. IT указал, что самая точная документация – это программный код. Но эта информация не всегда самая полезная.
Код — это как раз самая точная и достоверная информация. Когда уже не помогают хелпы, то остаётся только код. Да простит меня Бил Гейтс, но чтобы разобраться как работает баиндинг в WinForms, мне пришлось декомпильнуть фреймворк. Это уже после изучения всех MSDN'ов и прочих гуглей. Есть такая WinForms библиотека Syncfusion с, мягко выражаясь, несколько противоречивым интерефейсом. Документация к ней есть, но понять главную идея и охватить широту мысли разработчиков можно только изучая исходный код. Если при этом этот исходный код можно подключить к текущему проекту, то во многих случаях проход по коду отладчиком даёт полное представление о происходящем.
IT>Код — это как раз самая точная и достоверная информация. Когда уже не помогают хелпы, то остаётся только код. Да простит меня Бил Гейтс, но чтобы разобраться как работает баиндинг в WinForms, мне пришлось декомпильнуть фреймворк. Это уже после изучения всех MSDN'ов и прочих гуглей. Есть такая WinForms библиотека Syncfusion с, мягко выражаясь, несколько противоречивым интерефейсом. Документация к ней есть, но понять главную идея и охватить широту мысли разработчиков можно только изучая исходный код. Если при этом этот исходный код можно подключить к текущему проекту, то во многих случаях проход по коду отладчиком даёт полное представление о происходящем.
Таких примеров можно сотнями приводить. Например, если бы с ACE не шло несколько мегабайт тестов и примеров, то от их Reference Manual толку вообще было бы ~0%.
Но меня плохие примеры не интересуют, мне хочется делать хорошие примеры. Чтобы на мои проекты и мою документацию народ не плевался.
E>Таких примеров можно сотнями приводить. Например, если бы с ACE не шло несколько мегабайт тестов и примеров, то от их Reference Manual толку вообще было бы ~0%.
E>Но меня плохие примеры не интересуют, мне хочется делать хорошие примеры. Чтобы на мои проекты и мою документацию народ не плевался.
Это что-то из области фантастики. Разве что ты будешь сопровождать каждый метод блок-схемами.
IT>Здравствуйте, eao197, Вы писали:
E>>И в завершении хотелось бы сказать про документацию. IT указал, что самая точная документация – это программный код. Но эта информация не всегда самая полезная.
IT>Код — это как раз самая точная и достоверная информация. Когда уже не помогают хелпы, то остаётся только код. Да простит меня Бил Гейтс, но чтобы разобраться как работает баиндинг в WinForms, мне пришлось декомпильнуть фреймворк. Это уже после изучения всех MSDN'ов и прочих гуглей.
Да... биндинг в дотнете — это вообще пестня...
Помню свой ступор, когда обнаружил, что они используют правила о name conventions событий PropNameChanging и PropNameChanged для обеспечения работы биндинга.
А ТРИЖДЫ запрашиваемые данные при загрузке и отображении формы??? Именно, если "ничего не делать" — трижды... Если кое-что в базовых классах делать, то можно снизить до двух раз... пестня...
V>Да... биндинг в дотнете — это вообще пестня...
V>Помню свой ступор, когда обнаружил, что они используют правила о name conventions событий PropNameChanging и PropNameChanged для обеспечения работы биндинга.
Там ещё есть соответствующий интерфейс.
V>А ТРИЖДЫ запрашиваемые данные при загрузке и отображении формы??? Именно, если "ничего не делать" — трижды... Если кое-что в базовых классах делать, то можно снизить до двух раз... пестня...
Трижды? По-моему, там стрельба идёт как из пулемёта. А если учесть, что стандартный TypeDescriptor не отличается остротой ума и скоростью сообразительности, то картина совсем становится печальная.
Но если это всё правильно приготовить, то вполне может получиться деликатесная вещь
IT>Там ещё есть соответствующий интерфейс.
Только для списков.
IT>>Там ещё есть соответствующий интерфейс.
AVK>Только для списков.
В 2.0 добавили INotifyPropertyChanged.
IT>В 2.0 добавили INotifyPropertyChanged.
До 2.0 руки пока не доходили. Недавно попробовал новый дизайн-тайм — понравилось. Наконец то это стало возможно использовать. В потроха не заглядывал.
IT>В 2.0 добавили INotifyPropertyChanged.
Кстати, прикольное совпадение, я тут порассуждал для Wolfhound, как бы могли выглядеть "внешние" связи объектов и как бы работала система, построенная на этих внешних связях. Перекликается с биндингом и оповещением об изменении состояния.
V>Помню свой ступор, когда обнаружил, что они используют правила о name conventions событий PropNameChanging и PropNameChanged для обеспечения работы биндинга.
Это не байндинг, это особенности работы ReflectPropertyDescriptor.
AVK>Здравствуйте, vdimas, Вы писали:
V>>Помню свой ступор, когда обнаружил, что они используют правила о name conventions событий PropNameChanging и PropNameChanged для обеспечения работы биндинга.
AVK>Это не байндинг, это особенности работы ReflectPropertyDescriptor.
Может быть, но используется именно в биндинге (и я пока не нашел, где еще).
Такие подходы — неявные шаманства по своей сути.
V>Такие подходы — неявные шаманства по своей сути.
Никто тебе не мешает использовать собственную реализацию PropertyDescriptor.AddPropertyChanged.
Напишу о том как я проетирую в случае, если это не групповая разработка в которой нужно писать кучу, иногда не нужной, документации. Здесь упоминается только то, как я работаю один.
Этап 1. Думаю.
Я думаю над тем что я хочу сделать. Во первых, нужно ли это делать. Процентов 90 именно на этом этапе и заканчивается. И во вторых, что это должно быть. Это не архитектура. Это действия пользователей(будем говорить сценарии). При этом я придумываю эти действия пользователей. Чаще все рождается и остается в голове, если не умещается и вещь непростая в тетрадке. (кои всегда с собой). Но я не в коем случае не думаю как я это сделаю. Не дай бог, хотя бы одним нейроном подумать об архитектуре. Тогда картина вырисовывается, и получается решение которое легко сделать. А оно ошибочное, лучше думать о действиях пользователя или системы, или утилиты. Как только подумал об архитектуре не доработав действия, то можно считать проект пропал. Это самое сложное для меня. И за этим занятием я провожу большую часть проекта.
Этап 2. Сажусь за компьютер. С первыми строчками кода, типа void main(){} в голове уже лежит архитектура. Я ее как-то уже давно не придумываю. Она сама рождается. Я примерно представляю как это строить. И начинаю писать. Сначало пишу процедуру. Потом пишу для нее тест. Поскольку процедура обычно получается большой и здоровой, а по пацански сходу я красиво писать не умею, разбиваю ее на различные процедуры и объекты(то бишь рефакторинг). Потом следующую процедуру. Потом для нее тесты. Потом чувствую что эти две процедуры можно будет совместить в одну, но в два вызова с разными параметрами. Сново рефакторинг. Третья процедура уже будет построена на предыдущих. И т.д. Рефакторинг у меня идет все время. Пока пишу код.
Этап 3. Документирование. Нет ничего хуже чем понимать как все это работает через код. Ну фигово разбираться в классах и бегать по всяческим Class View да мотать колесика у мышки в поиске что тут имелось ввиду. Сам такое делал неоднократно, поэтому злорадно пытаюсь не делать документации. Пускай знают почем килограмм байтов. Но если тебя взяли за грудки и сказали что лишат премии, то пишешь некоторую концепцию. Этого и еще желательно тестов, вполне достаточно чтобы разобраться что там и как работает. Остальное все фигня, и лично мне мало помогало.
Насчет итераций. Нету у меня их. Потому как каждая процедура есть итерация.
GZ>Этап 2. Сажусь за компьютер.
Я ещё такую вещь стал практиковать последнее время. Если кажется, что какой-то код может стать универсальным и его можно будет повторно использовать, то я его... правильно, никуда не выношу, никак отдельно не оформляю и никаких повторно-используемых модулей не создаю. Всё остаётся как есть. Но закладку в голове нужно положить. Когда возникает написать подобный код второй раз, то это будет... правильно копипейст И только на третий раз, а может даже на четвёртый, когда уже чётко видно сформировавшийся паттерн, он выносится в отдельный метод.
Что это даёт? Во-первых, к повторно используемому коду должны предъявляться повышенные требования. А значит требуется больше времени над ним подумать. То, что этот код где-то ещё несколько раз пригодится именно в таком виде — не факт. По-этому, кроме потери времени можно ещё и понаделать кучу одноразовых-повторно-используемых методов и классов. В результате мы имеем как выигрышь по времени, так и достаточно продуманную и полезную повторно-используемую часть подсистемы.
При чём тут рефакторинг и почему я так раньше не делал? Потому что это было долго и чревато багами, т.е. было неэффективно. Лугче было сразу продумывать и писать повторно-испольуемые вещи.
IT>Что это даёт? Во-первых, к повторно используемому коду должны предъявляться повышенные требования. А значит требуется больше времени над ним подумать. То, что этот код где-то ещё несколько раз пригодится именно в таком виде — не факт. По-этому, кроме потери времени можно ещё и понаделать кучу одноразовых-повторно-используемых методов и классов. В результате мы имеем как выигрышь по времени, так и достаточно продуманную и полезную повторно-используемую часть подсистемы.
IT>При чём тут рефакторинг и почему я так раньше не делал? Потому что это было долго и чревато багами, т.е. было неэффективно. Лугче было сразу продумывать и писать повторно-испольуемые вещи.
Когда пишешь код на бумаге получается точно такой же эффект.
Вообще, написание кода сначала на бумаге напоминает парное программирование, только силами одного человека.
IT>Что это даёт? Во-первых, к повторно используемому коду должны предъявляться повышенные требования.
Моя проблема в том, что я предъявляю повышенные требования ко всему коду. И сразу не отходя от кассы. В результате получается что треть проекта пишется как бы с нуля, а остальная треть — это подключение и расширения классов. Никогда не поймешь, понадобится или не понадобится то или иное место во второй раз. А когда оно уже полностью подготовлено к расширению, то где-то через треть проекта начинаешь пользоваться готовыми конструкциями, которые и уже не нужно продумывать.
GZ>Что-то вас господа занесло. Один апологет XP, другой водпадов.
Не, я не водопада апологет. А так... серии маленьких водопадиков.
GZ>>Что-то вас господа занесло. Один апологет XP, другой водпадов.
E>Не, я не водопада апологет. А так... серии маленьких водопадиков.
Что характерно, эта метафора намного ближе к описанию итеративного процесса, чем аморфный режим "постоянного рефакторинга". Последняя метафора страдает концентрацией на коде, а не на результате. В случае же полного (хотя и короткого) цикла (проектирование — реализация — документирование — тестирование — выпуск) жизнь проекта "полнее", и всевозможные "глюки" вылавливаются в большей мере, чем в случае хронического "зависания" на стадии реализации в виде "постоянного рефакторинга". То же проектирование нужно в т.ч. и для организации тестирования и "прикормки" documentation writers.
ПК>Что характерно, эта метафора намного ближе к описанию итеративного процесса, чем аморфный режим "постоянного рефакторинга". Последняя метафора страдает концентрацией на коде, а не на результате.
Хотелось бы намекнуть, что рефакторинг — это улучшение кода не влияя на функциональность. И он мало зависит от процесса разработки. Просто в ХП она обязательная дисциплина.
ПК>В случае же полного (хотя и короткого) цикла (проектирование — реализация — документирование — тестирование — выпуск) жизнь проекта "полнее", и всевозможные "глюки" вылавливаются в большей мере, чем в случае хронического "зависания" на стадии реализации в виде "постоянного рефакторинга".
Нет. По случаям глюков могу сказать что ХП дает менее глючный код. И рефакторинг с TDD положительно влияет. Но основная проблема в несоответсвии требований пользователей и результатом. Если при тебе нет представителя клиента, у которого можно что-то спросить не отходя от кассы, получается полная фигня. Если имеются функциональные требования, то их можно утвердить у заказчика, и даже если в результате получится фигня, всегда можно сослаться на подпись.
ПК>То же проектирование нужно в т.ч. и для организации тестирования и "прикормки" documentation writers.
Для тестирования и documentation writers в основном полезны прецеденты написанные аналитиками а не архитекторами.
ПК>>Что характерно, эта метафора намного ближе к описанию итеративного процесса, чем аморфный режим "постоянного рефакторинга". Последняя метафора страдает концентрацией на коде, а не на результате.
GZ>Хотелось бы намекнуть, что рефакторинг — это улучшение кода не влияя на функциональность. И он мало зависит от процесса разработки. Просто в ХП она обязательная дисциплина.
XP не отвергает выделенного этапа проектирования и планирования, и даже наоборот, в классике предполагает наличие в начале каждой итерации выделенное планирование, iteration planning meeting, и выделенный этап проектирования, основанный на использовании CRC Cards. Как мы уже разобрались выше и ранее, режим "постоянного рефакторинга" в трактовке Влада (т.е. произвольные модификации кода с помощью инструментальных средств IDE, обычно без unit tests) принципиально отличается от рефакторинга в трактовке XP, который, действительно, принципиально не изменяет функциональность.
ПК>>В случае же полного (хотя и короткого) цикла (проектирование — реализация — документирование — тестирование — выпуск) жизнь проекта "полнее", и всевозможные "глюки" вылавливаются в большей мере, чем в случае хронического "зависания" на стадии реализации в виде "постоянного рефакторинга".
GZ>Нет. По случаям глюков могу сказать что ХП дает менее глючный код. <...>
Ну началось... XP и прочие модные итерационные процессы как раз построены по схеме, упомянутой выше (полные, но короткие циклы, включающие в т.ч. (коллективное) планирование и проектирование ближайшей итерации).
P.S. Интересно, на основании чего ты воспринял метафору "серии маленьких водопадиков" как противоречащую XP и т.п.? Уж не из-за того, что встретил слово "водопадик"?
GZ>>Хотелось бы намекнуть, что рефакторинг — это улучшение кода не влияя на функциональность. И он мало зависит от процесса разработки. Просто в ХП она обязательная дисциплина.
ПК>XP не отвергает выделенного этапа проектирования и планирования, и даже наоборот, в классике предполагает наличие в начале каждой итерации выделенное планирование, iteration planning meeting, и выделенный этап проектирования, основанный на использовании CRC Cards.
Проектирование и планирование совершенно различается у жестких и мягких процессов программирования(я имею ввиду RUP и XP). В XP нет ничего постоянного. Ни в планировании, ни тем более в архитектуре. Даже те же CRC карты — это всего лишь некоторые намерения которые вполне могут измениться.
ПК>Как мы уже разобрались выше и ранее, режим "постоянного рефакторинга" в трактовке Влада (т.е. произвольные модификации кода с помощью инструментальных средств IDE, обычно без unit tests) принципиально отличается от рефакторинга в трактовке XP, который, действительно, принципиально не изменяет функциональность.
Он собственно сильно отличается и от моего рефакторинга. В отличие от принятых норм в XP, я не выделяю для него время в виде итераций. Он делается постоянно в каждой процедуре, и тесты я делаю после того как написал первую версию того или иного блока.
GZ>>Нет. По случаям глюков могу сказать что ХП дает менее глючный код. <...>
ПК>Ну началось... XP и прочие модные итерационные процессы как раз построены по схеме, упомянутой выше (полные, но короткие циклы, включающие в т.ч. (коллективное) планирование и проектирование ближайшей итерации).
Проблема в том, что XP хорошо защищен на предмет изменений(которые в любом случае вносятся). Он защищает от изменений чужих разработчиков. И он защищает те места, которые не определяются функциональными тестами. Которые во многом дебильны и слишком неполны.
ПК>P.S. Интересно, на основании чего ты воспринял метафору "серии маленьких водопадиков" как противоречащую XP и т.п.? Уж не из-за того, что встретил слово "водопадик"?
Ключевым словом здесь было дизайн кода.
PS. Пока писал код, позвонили, узнал что стал уже дважды отцом.
GZ>PS. Пока писал код, позвонили, узнал что стал уже дважды отцом.
Мои поздравления! Мальчик, девочка?
GZ>PS. Пока писал код, позвонили, узнал что стал уже дважды отцом.
Двойняшки?
GZ> . . . могу сказать что ХП . . .
GZ>Для тестирования и documentation writers в основном полезны прецеденты написанные аналитиками а не архитекторами.
О, кстати, а как XP и выделенные аналитики и архитекторы сочетаются между собой? По моему представлению это вещи, не вполне совместимые...
GZ>> . . . могу сказать что ХП . . .
GZ>>Для тестирования и documentation writers в основном полезны прецеденты написанные аналитиками а не архитекторами.
ПК>О, кстати, а как XP и выделенные аналитики и архитекторы сочетаются между собой? По моему представлению это вещи, не вполне совместимые...
Архитекторов как таковых нет. А аналитики(или представители клиента) используются в большей степени консультативно. Вобщем хаос управляемый одним человеком обязанности которого только в одном: чтобы друг другу морды не набили. Почти полное отрицания документации влияет и на documentation writers. Я очень сомневаюсь что писатели будут разбирать функциональные тесты. Что касается тестирования, то они предлагают именно автоматизированное тестирование притом сделанная клиентами. Во первых, задолбаешься с граничными условиями разбираться(что я не видел ни одной книжке по XP ). Во вторых, все равно все придется делать с аналитиками. Программисты не всегда хорошие помошники потому как для тестеров они люди заинтересованные, а для техписателей, люди не от мира сего.
GZ>>Что-то вас господа занесло. Один апологет XP, другой водпадов.
E>Не, я не водопада апологет. А так... серии маленьких водопадиков.
Я как-то побоялся называть разработку итерационной, поскольку все процессы разработки в современном мире итерационные.
GZ>Здесь упоминается только то, как я работаю один.
:Жму лапу. Уровень саморефлексии на высоте.
GZ>Этап 1. Думаю.
GZ>Я думаю над тем что я хочу сделать.
Я на этом этапе предпочитаю гулять где-нибуддь по парку... чтобы ногами перебирать. Чтобы окружающий мир разными сторонами поворачивался...
GZ> Во первых, нужно ли это делать. Процентов 90 именно на этом этапе и заканчивается.
!!!!!
Только у меня это два этапа. (или даже 3)
1а) Какие (и чьи) задачи задачи собираемся решать. То есть чеко определить субъект интереса (или надсистеу) и задачи этого субъекта в его собственной системе ценностей.
1б) Можно ли решить эти задачи ничего не разрабатывая (тот самый предельный случай — ни одной строчки кода).
1в) Хочу ли лично я этим заниматься и почему.
GZ> И во вторых, что это должно быть. Это не архитектура. Это действия пользователей(будем говорить сценарии).
1е) ... частично становится ясным на этапе 1б. Но дествительно требует возвращения и более детальной проаботки — отдельного этапа.
GZ> При этом я придумываю эти действия пользователей. Чаще все рождается и остается в голове, если не умещается и вещь непростая в тетрадке. (кои всегда с собой). Но я не в коем случае не думаю как я это сделаю. Не дай бог, хотя бы одним нейроном подумать об архитектуре. Тогда картина вырисовывается, и получается решение которое легко сделать. А оно ошибочное, лучше думать о действиях пользователя или системы, или утилиты. Как только подумал об архитектуре не доработав действия, то можно считать проект пропал. Это самое сложное для меня. И за этим занятием я провожу большую часть проекта.
Посмотри вот это (может не самые удачные ссылки, но что уж нагуглилось):
http://www.journal.gennadij.pavlenko.name/node/2344
http://www.brainstorming.ru/article/diltsstr.htm
GZ>Этап 2. Сажусь за компьютер. С первыми строчками кода, типа void main(){} в голове уже лежит архитектура. Я ее как-то уже давно не придумываю. Она сама рождается.
Вот здесь начинаются расхождения. Архитектуру я рисую. Черкаюсь.
На этом этапе я не нашел пока адекватной замены бумаге.
Но рисую вовсе не классы, а "компаненты", процессы, модули. И потоколы между ними.
То есть декомпозицию задачи на подсистемы. Стараюсь получить их "слабосвязанность".
А дальше — для каждой отдельной подсистемы уже берусь за объетное проектирование. Например — через дерево классов. И это да — если возможно, в среде разработки. С удовольствием задействую все красивости и удобства.
Но этот этап (и остальные до резултата) у меня занимает уже около четверти времени.
EXO>Посмотри вот это (может не самые удачные ссылки, но что уж нагуглилось):
EXO>http://www.journal.gennadij.pavlenko.name/node/2344
EXO>http://www.brainstorming.ru/article/diltsstr.htm
Удачные. Я когда-то читал об этом, но давно. А штука весьма интересная. И вообще, весьма жизненно.
EXO>Вот здесь начинаются расхождения. Архитектуру я рисую. Черкаюсь.
EXO>На этом этапе я не нашел пока адекватной замены бумаге.
EXO>Но рисую вовсе не классы, а "компаненты", процессы, модули. И потоколы между ними.
EXO>То есть декомпозицию задачи на подсистемы. Стараюсь получить их "слабосвязанность".
EXO>А дальше — для каждой отдельной подсистемы уже берусь за объетное проектирование. Например — через дерево классов. И это да — если возможно, в среде разработки. С удовольствием задействую все красивости и удобства.
EXO>Но этот этап (и остальные до резултата) у меня занимает уже около четверти времени.
Иногда приходится работать по довольно жесткому RUP с прописыванием в UML. Такие процессы мне очень не нравятся. Обычно это писанина компонентов которые уже есть в голове, и элементарно выводящиеся из прецедентов и предметной области.
IT, отличный рассказ и я практически со всем согласен. С чем не согласен — проекты бывают разных масштабов и на них меняются разработчики (проект на 2-3 года скажем, люди могут уходить-приходить). Чтобы проект развивался обязательно должны быть зафиксированы структура проекта и т.п., это все забывается, не успевается передать и т.д.
Потом еще бывают ситуации с (мягко говоря) не самыми умными разработчиками, код которых приходится дорабатывать. Например, у меня была ситуация, когда я пришел в проект, половина которого была написана человеком за месяц до увольнения. Можно себе представить что там написал человек, котор. И сколько я промучался разбираясь в его коде (не было проектирования как такового по тому проекту, было только задание: сделать то-то и то-то).
_>IT, отличный рассказ и я практически со всем согласен. С чем не согласен — проекты бывают разных масштабов и на них меняются разработчики (проект на 2-3 года скажем, люди могут уходить-приходить). Чтобы проект развивался обязательно должны быть зафиксированы структура проекта и т.п., это все забывается, не успевается передать и т.д.
Бывают такие проекты. А бывают ещё и бесконечные проекты. Бывают где взаимодействуют много команд. Но об этом я оговорился выше. Если необходима передача знаний, что наличие проектной документации и спецификаций (особенно на внешние интерфейсы) становится отдельным вопросом. Это с одной стороны. С другой — соревнования по тому, кто больше произведёт бумаги тоже не имеют никакого смысла. Вреда от 150 страниц на модуль, в которых смысл содержит только название и то уже давно устарело, даже больше, чем если бы их вообще не было.
Всегда нужна актуальная схема базы данных (если есть БД), схема объектной модели тоже полезна. Если схема БД близка к объектной модели, то достаточно первой. Описание какой-нибудь общей концепции. Разъяснение неочевидных мест и алгоритмов. Этого в большинстве случаев более чем достаточно и чем меньше бумаги, тем легче поддерживать её в актуальном состоянии.
_>Потом еще бывают ситуации с (мягко говоря) не самыми умными разработчиками, код которых приходится дорабатывать. Например, у меня была ситуация, когда я пришел в проект, половина которого была написана человеком за месяц до увольнения. Можно себе представить что там написал человек, котор. И сколько я промучался разбираясь в его коде (не было проектирования как такового по тому проекту, было только задание: сделать то-то и то-то).
Про одноклеточных лучше никаких аргументов не приводить. Если бы он тебе оставил документация, то, поверь мне, было бы ещё хуже.