Проектирование и рефакторинг

IT 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, от неё больше вреда чем пользы. Впрочем, если заказчик готов за неё платить, то почему бы и нет
... << RSDN@Home 1.2.0 alpha rev. 0>>
eao197
eao197 Философический вопрос про автоматический вывод типов
12.02.2006 06:51
Здравствуйте, IT, Вы писали:

IT>eao197 пропагандирует во всех отношениях правильный и устоявшийся стиль мышления — подумай, нарисуй на бумажке, потом закодируй. Современные супер-дюпер архитекторы заменятю бумажку какой-нибудь рисовалкой типа Visio. Но eao197 с бумажкой в этом смысле не очень сильно отстал, не исключено, что для него этот способ гораздо более эффективнее


Именно, что лично для меня.

IT>Проектирование как отдельная стадия очень даже имеет смысл, действительно имеет и действительно смысл, тогда, когда речь идёт о передаче знаний от одного человека другому. Но судя по постам eao197 этот кто-то другой — он сам. Он просто хочет передать свои же знания самому же себе во времени. Т.е. когда-то он потратил 10 минут на идею, затем 2 часа на воплощение этой идеи на бумаге, что через 2 месяца безусловно гарантировало ему сохранение 10-ти минут на воспроизведение этой самой идеи в течении 20 минутного разглядывания бумажек 2-х месячной давности.


+1

IT>Всё нормально. Только если он сразу начал бы писать код, то не исключено, что задача была бы решена ещё 2 месяца назад. Либо была бы решена на 90%.


А вот это исключено. Проверено годами на собственном опыте.
Геннадий Васильев
Здравствуйте, eao197, Вы писали:

IT>>Всё нормально. Только если он сразу начал бы писать код, то не исключено, что задача была бы решена ещё 2 месяца назад. Либо была бы решена на 90%.


E>А вот это исключено. Проверено годами на собственном опыте.


Это были неправильные задачи!
eao197
eao197
12.02.2006 08:14
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Это были неправильные задачи!


Все мы жертвы цепи нелепых случайностей.

((С) К.Вонегут).
Геннадий Васильев
Здравствуйте, eao197, Вы писали:

ГВ>>Это были неправильные задачи!

E>

E>Все мы жертвы цепи нелепых случайностей.

E>((С) К.Вонегут).

И заказчики у тебя неправильные! Они несут неправильный мёд. Так что, ты его не пей, козлёночком станешь. Давай, бросай всё и вливайся в ряды миллионов. Ты понял, нет? Миллионы тебя ждут. Мил-ли-о-ны!А ты, понимаешь, расчирикался! Ты ещё не понял, как надо компиляторы писать? Эх, и поимела же тебя матрица! По самое фрейдистское начало.
eao197
eao197
12.02.2006 09:52
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>И заказчики у тебя неправильные! Они несут неправильный мёд. Так что, ты его не пей, козлёночком станешь. Давай, бросай всё и вливайся в ряды миллионов. Ты понял, нет? Миллионы тебя ждут. Мил-ли-о-ны!А ты, понимаешь, расчирикался! Ты ещё не понял, как надо компиляторы писать? Эх, и поимела же тебя матрица! По самое фрейдистское начало.




Гена, что-то ты злой сегодня.
Геннадий Васильев
Здравствуйте, eao197, Вы писали:

E>Гена, что-то ты злой сегодня.


Да нет, Женя, это я ещё не злой. Это, в общем, шуточный пост был.
eao197
eao197 Философический вопрос про автоматический вывод типов
13.02.2006 06:23
Здравствуйте, IT

Данное сообщение не является попыткой покритиковать или опровергнуть что-нибудь в рассказе 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. Конечно, не иногда он не нужен. Но, поскольку я всегда старался заниматься разработкой инструментария, то практически постоянно мне приходилось делать еще и документацию. И предварительное проектирование на бумаге существенно облегчало этот процесс.
Sinclair
Sinclair
13.02.2006 02:34
Здравствуйте, eao197, Вы писали:
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? Ок, пишем:
internal struct LogRecord
{
  Guid Id;
    DateTime TimeStamp;
    |
}

E>И в завершении хотелось бы сказать про документацию. IT указал, что самая точная документация – это программный код. Но эта информация не всегда самая полезная. Например, если речь идет о вспомогательных библиотеках. Я думаю, что для программиста, использующего ACE, не так уж много пользы даст код метода ACE_Event_Handler::handle_input или ACE_Reactor::run_reactor_event_loop. А в некоторых случаях кода используемой библиотеки нет вовсе. На первое место в таких условях выходит документация, написанная в комментариях к методам и классам. Но чтобы ее написать, довольно часто нужно представлять себе всю картину в целом. Картину, которая открывается мне после предварительного проектирования на бумаге.
Гм. К моменту, когда у тебя завершено проектирование на бумаге с текстами, у Влада и IT уже готов набор заглушков на все методы этой библиотеки. Все мало-мальски существенные мысли записаны не карандашом, а в блоках ///. Поэтому в конце достаточно просто просмотреть эту документацию на предмет корректности, понятности и полноты.
E>Поэтому, когда я приступаю к программированию, я приступаю и к документированию. При этом написание doxygen комментариев к коду является, наверное, более трудоемкой и длительной операций, чем кодирование. Зато на выходе получается еще и довольно объемный и актуальный Reference Manual. Конечно, не иногда он не нужен. Но, поскольку я всегда старался заниматься разработкой инструментария, то практически постоянно мне приходилось делать еще и документацию. И предварительное проектирование на бумаге существенно облегчало этот процесс.
http://rsdn.org/File/5743/rsdn@home2.gif 1.1.4 stable rev. 510
eao197
eao197
13.02.2006 02:52
Здравствуйте, Sinclair, Вы писали:

S>Гм. Ты как бы неявно предполагаешь, что строчки кода — штука дорогая.


Строки отлаженного кода штука дорогая.



Вообще, я никому не навязываю свой способ работы. Не доказываю, что чей-то способ работы ущербен.

Я просто рассказал, как я работаю. И к этому механизму я пришел не сразу, а за 15 лет, которые занимаюсь программированием. Если кому-то не нравится -- это его дело. Если кто-то не верит, то может посмотреть на RuCodeGen, Mxx_ru, ObjESSty, SObjectizer. Это все проекты, которые развивались практически в свободное от основной работы время. Для меня это служит доказательством эффективности моего подхода (примененного ко мне).

Если кто-то использует другие способы работы, то мне интересно про них узнавать и брать что-то на вооружение. Но я не собирась на навязывать свое мнение, ни реагировать на навязывание мне чужого мнения.
Sinclair
Sinclair
13.02.2006 02:59
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, Sinclair, Вы писали:


S>>Гм. Ты как бы неявно предполагаешь, что строчки кода — штука дорогая.


E>Строки отлаженного кода штука дорогая.

Так никто и не предлагает отлаживать этот код. Ты же не занимаешься отладкой идей на бумаге? Вот и этот код начинает отлаживаться только в том случае, если дожил до реального использования.

E>Я просто рассказал, как я работаю. И к этому механизму я пришел не сразу, а за 15 лет, которые занимаюсь программированием. Если кому-то не нравится -- это его дело. Если кто-то не верит, то может посмотреть на RuCodeGen, Mxx_ru, ObjESSty, SObjectizer. Это все проекты, которые развивались практически в свободное от основной работы время. Для меня это служит доказательством эффективности моего подхода (примененного ко мне).


E>Если кто-то использует другие способы работы, то мне интересно про них узнавать и брать что-то на вооружение. Но я не собирась на навязывать свое мнение, ни реагировать на навязывание мне чужого мнения.

Ну, я надеюсь, что ни о каком навязывании речи не идет.
Я вообще всю жизнь хотел как можно больше проектировать. Но меня постоянно сдерживала тщетность моих усилий — бумагу в SVN не положишь, и в какой-то момент все равно надо набить этот код руками. Пробовал UML, но постоянно бесило отсутствие round-trip и поддержки полной модели языка. В какой-то момент я пришел к проектированию в коде, и использованию плагина в Розе для визуализации — благо Delphi позволял довольно шустро педалить интерфейсы (студия в те времена в качестве автокомплита предлагала вообще все, что ей известно, включая макросы. Се ля ви — плюсы язык такой, никогда заранее не знаешь, что удастся привести к чему ).
Неприятность была в том, что вносить изменения в коде было дорого — банальная опечатка в имени класса могла жить до конца проекта, т.к. не доходили руки сделать полную замену.
Я уже не говорю о смене типа свойства или раскидывании класса на два.

Теперь вроде как есть кульный кульман. Все как встарь, только в углу кнопка "построить здание по этому чертежу"
http://rsdn.org/File/5743/rsdn@home2.gif 1.1.4 stable rev. 510
eao197
eao197
13.02.2006 03:24
Здравствуйте, Sinclair, Вы писали:

E>>Строки отлаженного кода штука дорогая.

S>Так никто и не предлагает отлаживать этот код. Ты же не занимаешься отладкой идей на бумаге? Вот и этот код начинает отлаживаться только в том случае, если дожил до реального использования.

Один умный человек когда-то на лекции сказал: "Ты знаешь что-то сам только когда можешь объяснить это другому". Имхо, ты понимаешь что-то только тогда, когда можешь внятно это описать. Мое рисование на бумаге как раз является критерием проверки понимания. А кристализация идеи до такой степени, чтобы быть внятно записанной, имхо, включает в себя и процесс отладки идеи. Отладки, которой может никогда не произойти, если я раньше времени отвлекусь от продумывания и брушусь за реализацию.

Приведенный мной пример с timer_thread_t как раз стал яркой тому иллюстрацией. На тот момент мне представлялось, что я четко представляю себе, как будет работать не только timer_thread_t, но и необходимый ему ACE_Event_Handler. И если бы я взялся за программирование, то написал бы код, заставил бы его работать, прикрутил бы к нему тесты. Проблема была бы в том, что в очень эпизодических ситуациях (когда вызов destroy_all_agent_msg() совпал бы с определенным моментом времени при обработке периодического сообщения этого агента) происходила бы порча памяти. Я сильно сомневаюсь, что такую ошибку удалось бы отловить в автономных тестах. И в реальном использовании она бы возникала очень нестабильно. Зато при проектировании, когда кода не было написано вообще, эта ошибка стала очевидной как только я взялся расписывать обработчик handle_timeout. Иначе как отладкой идей на бумаге я назвать это не берусь.

Может быть кто-то и может при программировании помнить детали проекта, но это не я.
Шахтер
Шахтер
14.02.2006 07:36
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, Sinclair, Вы писали:


E>>>Строки отлаженного кода штука дорогая.

S>>Так никто и не предлагает отлаживать этот код. Ты же не занимаешься отладкой идей на бумаге? Вот и этот код начинает отлаживаться только в том случае, если дожил до реального использования.

E>Один умный человек когда-то на лекции сказал: "Ты знаешь что-то сам только когда можешь объяснить это другому".


Это слова Давида Гильберта.
Он сказал как-то примерно так: ты по настоящему понимаешь предмет если можешь выйти на улицу и объяснить его первому встречному.
AndrewVK
AndrewVK
15.02.2006 09:58
Здравствуйте, eao197, Вы писали:

E>Один умный человек когда-то на лекции сказал: "Ты знаешь что-то сам только когда можешь объяснить это другому".


Пробовал когда нибудь переводить текст в большом объеме? Лично у меня на это уходит на порядок больше сил, нежели если нужно просто этот текст понять.
... << RSDN@Home 1.2.0 alpha rev. 642 on Windows XP 5.1.2600.131072>>
eao197
eao197
13.02.2006 04:17
Здравствуйте, Sinclair, Вы писали:

S>А что ты начинаешь делать при проектировании? пишешь текст? Ну так я просто набиваю // и тайпаю. Возникла какая-то сущность типа LogRecord? Ок, пишем:

S>
S>internal struct LogRecord
S>{
S>  Guid Id;
S>    DateTime TimeStamp;
S>    |
S>}
S>


Ты ведь своей ООСУБД хотел занятся? Вот как раз попробуй подобным образом write-ahead log сделать.
У себя я начал писать код, только когда представил что у меня будут trace-файлы и snapshot-ы, и что я с ними буду делать.
IT
IT
13.02.2006 03:37
Здравствуйте, eao197, Вы писали:

E>И в завершении хотелось бы сказать про документацию. IT указал, что самая точная документация – это программный код. Но эта информация не всегда самая полезная.


Код — это как раз самая точная и достоверная информация. Когда уже не помогают хелпы, то остаётся только код. Да простит меня Бил Гейтс, но чтобы разобраться как работает баиндинг в WinForms, мне пришлось декомпильнуть фреймворк. Это уже после изучения всех MSDN'ов и прочих гуглей. Есть такая WinForms библиотека Syncfusion с, мягко выражаясь, несколько противоречивым интерефейсом. Документация к ней есть, но понять главную идея и охватить широту мысли разработчиков можно только изучая исходный код. Если при этом этот исходный код можно подключить к текущему проекту, то во многих случаях проход по коду отладчиком даёт полное представление о происходящем.
eao197
eao197
13.02.2006 03:50
Здравствуйте, IT, Вы писали:

IT>Код — это как раз самая точная и достоверная информация. Когда уже не помогают хелпы, то остаётся только код. Да простит меня Бил Гейтс, но чтобы разобраться как работает баиндинг в WinForms, мне пришлось декомпильнуть фреймворк. Это уже после изучения всех MSDN'ов и прочих гуглей. Есть такая WinForms библиотека Syncfusion с, мягко выражаясь, несколько противоречивым интерефейсом. Документация к ней есть, но понять главную идея и охватить широту мысли разработчиков можно только изучая исходный код. Если при этом этот исходный код можно подключить к текущему проекту, то во многих случаях проход по коду отладчиком даёт полное представление о происходящем.


Таких примеров можно сотнями приводить. Например, если бы с ACE не шло несколько мегабайт тестов и примеров, то от их Reference Manual толку вообще было бы ~0%.
Но меня плохие примеры не интересуют, мне хочется делать хорошие примеры. Чтобы на мои проекты и мою документацию народ не плевался.
Sinclair
Sinclair
14.02.2006 04:46
Здравствуйте, eao197, Вы писали:
E>Таких примеров можно сотнями приводить. Например, если бы с ACE не шло несколько мегабайт тестов и примеров, то от их Reference Manual толку вообще было бы ~0%.
E>Но меня плохие примеры не интересуют, мне хочется делать хорошие примеры. Чтобы на мои проекты и мою документацию народ не плевался.
Это что-то из области фантастики. Разве что ты будешь сопровождать каждый метод блок-схемами.
http://rsdn.org/File/5743/rsdn@home2.gif 1.1.4 stable rev. 510
vdimas
vdimas
14.02.2006 10:43
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, eao197, Вы писали:


E>>И в завершении хотелось бы сказать про документацию. IT указал, что самая точная документация – это программный код. Но эта информация не всегда самая полезная.


IT>Код — это как раз самая точная и достоверная информация. Когда уже не помогают хелпы, то остаётся только код. Да простит меня Бил Гейтс, но чтобы разобраться как работает баиндинг в WinForms, мне пришлось декомпильнуть фреймворк. Это уже после изучения всех MSDN'ов и прочих гуглей.


Да... биндинг в дотнете — это вообще пестня...
Помню свой ступор, когда обнаружил, что они используют правила о name conventions событий PropNameChanging и PropNameChanged для обеспечения работы биндинга.

А ТРИЖДЫ запрашиваемые данные при загрузке и отображении формы??? Именно, если "ничего не делать" — трижды... Если кое-что в базовых классах делать, то можно снизить до двух раз... пестня...
IT
IT
14.02.2006 12:52
Здравствуйте, vdimas, Вы писали:

V>Да... биндинг в дотнете — это вообще пестня...

V>Помню свой ступор, когда обнаружил, что они используют правила о name conventions событий PropNameChanging и PropNameChanged для обеспечения работы биндинга.

Там ещё есть соответствующий интерфейс.

V>А ТРИЖДЫ запрашиваемые данные при загрузке и отображении формы??? Именно, если "ничего не делать" — трижды... Если кое-что в базовых классах делать, то можно снизить до двух раз... пестня...


Трижды? По-моему, там стрельба идёт как из пулемёта. А если учесть, что стандартный TypeDescriptor не отличается остротой ума и скоростью сообразительности, то картина совсем становится печальная.

Но если это всё правильно приготовить, то вполне может получиться деликатесная вещь
... << RSDN@Home 1.2.0 alpha rev. 0>>
AndrewVK
AndrewVK
15.02.2006 09:58
Здравствуйте, IT, Вы писали:

IT>Там ещё есть соответствующий интерфейс.


Только для списков.
... << RSDN@Home 1.2.0 alpha rev. 642 on Windows XP 5.1.2600.131072>>
IT
IT
15.02.2006 10:29
Здравствуйте, AndrewVK, Вы писали:

IT>>Там ещё есть соответствующий интерфейс.


AVK>Только для списков.


В 2.0 добавили INotifyPropertyChanged.
AndrewVK
AndrewVK
15.02.2006 10:31
Здравствуйте, IT, Вы писали:

IT>В 2.0 добавили INotifyPropertyChanged.


До 2.0 руки пока не доходили. Недавно попробовал новый дизайн-тайм — понравилось. Наконец то это стало возможно использовать. В потроха не заглядывал.
... << RSDN@Home 1.2.0 alpha rev. 642 on Windows XP 5.1.2600.131072>>
vdimas
vdimas
16.02.2006 04:06
Здравствуйте, IT, Вы писали:


IT>В 2.0 добавили INotifyPropertyChanged.


Кстати, прикольное совпадение, я тут порассуждал для Wolfhound, как бы могли выглядеть "внешние" связи объектов и как бы работала система, построенная на этих внешних связях. Перекликается с биндингом и оповещением об изменении состояния.
AndrewVK
AndrewVK
15.02.2006 09:58
Здравствуйте, vdimas, Вы писали:

V>Помню свой ступор, когда обнаружил, что они используют правила о name conventions событий PropNameChanging и PropNameChanged для обеспечения работы биндинга.


Это не байндинг, это особенности работы ReflectPropertyDescriptor.
... << RSDN@Home 1.2.0 alpha rev. 642 on Windows XP 5.1.2600.131072>>
vdimas
vdimas
16.02.2006 04:04
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, vdimas, Вы писали:


V>>Помню свой ступор, когда обнаружил, что они используют правила о name conventions событий PropNameChanging и PropNameChanged для обеспечения работы биндинга.


AVK>Это не байндинг, это особенности работы ReflectPropertyDescriptor.


Может быть, но используется именно в биндинге (и я пока не нашел, где еще).

Такие подходы — неявные шаманства по своей сути.
AndrewVK
AndrewVK
16.02.2006 05:07
Здравствуйте, vdimas, Вы писали:

V>Такие подходы — неявные шаманства по своей сути.


Никто тебе не мешает использовать собственную реализацию PropertyDescriptor.AddPropertyChanged.
... << RSDN@Home 1.2.0 alpha rev. 642 on Windows XP 5.1.2600.131072>>
GlebZ
GlebZ Мое проектирование и рефакторинг
14.02.2006 06:11
Что-то вас господа занесло. Один апологет XP, другой водпадов.

Напишу о том как я проетирую в случае, если это не групповая разработка в которой нужно писать кучу, иногда не нужной, документации. Здесь упоминается только то, как я работаю один.

Этап 1. Думаю.
Я думаю над тем что я хочу сделать. Во первых, нужно ли это делать. Процентов 90 именно на этом этапе и заканчивается. И во вторых, что это должно быть. Это не архитектура. Это действия пользователей(будем говорить сценарии). При этом я придумываю эти действия пользователей. Чаще все рождается и остается в голове, если не умещается и вещь непростая в тетрадке. (кои всегда с собой). Но я не в коем случае не думаю как я это сделаю. Не дай бог, хотя бы одним нейроном подумать об архитектуре. Тогда картина вырисовывается, и получается решение которое легко сделать. А оно ошибочное, лучше думать о действиях пользователя или системы, или утилиты. Как только подумал об архитектуре не доработав действия, то можно считать проект пропал. Это самое сложное для меня. И за этим занятием я провожу большую часть проекта.

Этап 2. Сажусь за компьютер. С первыми строчками кода, типа void main(){} в голове уже лежит архитектура. Я ее как-то уже давно не придумываю. Она сама рождается. Я примерно представляю как это строить. И начинаю писать. Сначало пишу процедуру. Потом пишу для нее тест. Поскольку процедура обычно получается большой и здоровой, а по пацански сходу я красиво писать не умею, разбиваю ее на различные процедуры и объекты(то бишь рефакторинг). Потом следующую процедуру. Потом для нее тесты. Потом чувствую что эти две процедуры можно будет совместить в одну, но в два вызова с разными параметрами. Сново рефакторинг. Третья процедура уже будет построена на предыдущих. И т.д. Рефакторинг у меня идет все время. Пока пишу код.

Этап 3. Документирование. Нет ничего хуже чем понимать как все это работает через код. Ну фигово разбираться в классах и бегать по всяческим Class View да мотать колесика у мышки в поиске что тут имелось ввиду. Сам такое делал неоднократно, поэтому злорадно пытаюсь не делать документации. Пускай знают почем килограмм байтов. Но если тебя взяли за грудки и сказали что лишат премии, то пишешь некоторую концепцию. Этого и еще желательно тестов, вполне достаточно чтобы разобраться что там и как работает. Остальное все фигня, и лично мне мало помогало.

Насчет итераций. Нету у меня их. Потому как каждая процедура есть итерация.
IT
IT
15.02.2006 02:34
Здравствуйте, GlebZ, Вы писали:

GZ>Этап 2. Сажусь за компьютер.


Я ещё такую вещь стал практиковать последнее время. Если кажется, что какой-то код может стать универсальным и его можно будет повторно использовать, то я его... правильно, никуда не выношу, никак отдельно не оформляю и никаких повторно-используемых модулей не создаю. Всё остаётся как есть. Но закладку в голове нужно положить. Когда возникает написать подобный код второй раз, то это будет... правильно копипейст И только на третий раз, а может даже на четвёртый, когда уже чётко видно сформировавшийся паттерн, он выносится в отдельный метод.

Что это даёт? Во-первых, к повторно используемому коду должны предъявляться повышенные требования. А значит требуется больше времени над ним подумать. То, что этот код где-то ещё несколько раз пригодится именно в таком виде — не факт. По-этому, кроме потери времени можно ещё и понаделать кучу одноразовых-повторно-используемых методов и классов. В результате мы имеем как выигрышь по времени, так и достаточно продуманную и полезную повторно-используемую часть подсистемы.

При чём тут рефакторинг и почему я так раньше не делал? Потому что это было долго и чревато багами, т.е. было неэффективно. Лугче было сразу продумывать и писать повторно-испольуемые вещи.
... << RSDN@Home 1.2.0 alpha rev. 0>>
eao197
eao197
15.02.2006 05:29
Здравствуйте, IT, Вы писали:

IT>Что это даёт? Во-первых, к повторно используемому коду должны предъявляться повышенные требования. А значит требуется больше времени над ним подумать. То, что этот код где-то ещё несколько раз пригодится именно в таком виде — не факт. По-этому, кроме потери времени можно ещё и понаделать кучу одноразовых-повторно-используемых методов и классов. В результате мы имеем как выигрышь по времени, так и достаточно продуманную и полезную повторно-используемую часть подсистемы.


IT>При чём тут рефакторинг и почему я так раньше не делал? Потому что это было долго и чревато багами, т.е. было неэффективно. Лугче было сразу продумывать и писать повторно-испольуемые вещи.


Когда пишешь код на бумаге получается точно такой же эффект.

Вообще, написание кода сначала на бумаге напоминает парное программирование, только силами одного человека.
GlebZ
GlebZ
16.02.2006 10:16
Здравствуйте, IT, Вы писали:

IT>Что это даёт? Во-первых, к повторно используемому коду должны предъявляться повышенные требования.

Моя проблема в том, что я предъявляю повышенные требования ко всему коду. И сразу не отходя от кассы. В результате получается что треть проекта пишется как бы с нуля, а остальная треть — это подключение и расширения классов. Никогда не поймешь, понадобится или не понадобится то или иное место во второй раз. А когда оно уже полностью подготовлено к расширению, то где-то через треть проекта начинаешь пользоваться готовыми конструкциями, которые и уже не нужно продумывать.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
eao197
eao197
15.02.2006 05:30
Здравствуйте, GlebZ, Вы писали:

GZ>Что-то вас господа занесло. Один апологет XP, другой водпадов.


Не, я не водопада апологет. А так... серии маленьких водопадиков.
Павел Кузнецов
Павел Кузнецов
15.02.2006 05:51
Здравствуйте, eao197, Вы писали:

GZ>>Что-то вас господа занесло. Один апологет XP, другой водпадов.


E>Не, я не водопада апологет. А так... серии маленьких водопадиков.


Что характерно, эта метафора намного ближе к описанию итеративного процесса, чем аморфный режим "постоянного рефакторинга". Последняя метафора страдает концентрацией на коде, а не на результате. В случае же полного (хотя и короткого) цикла (проектирование — реализация — документирование — тестирование — выпуск) жизнь проекта "полнее", и всевозможные "глюки" вылавливаются в большей мере, чем в случае хронического "зависания" на стадии реализации в виде "постоянного рефакторинга". То же проектирование нужно в т.ч. и для организации тестирования и "прикормки" documentation writers.
GlebZ
GlebZ
15.02.2006 08:49
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Что характерно, эта метафора намного ближе к описанию итеративного процесса, чем аморфный режим "постоянного рефакторинга". Последняя метафора страдает концентрацией на коде, а не на результате.

Хотелось бы намекнуть, что рефакторинг — это улучшение кода не влияя на функциональность. И он мало зависит от процесса разработки. Просто в ХП она обязательная дисциплина.

ПК>В случае же полного (хотя и короткого) цикла (проектирование — реализация — документирование — тестирование — выпуск) жизнь проекта "полнее", и всевозможные "глюки" вылавливаются в большей мере, чем в случае хронического "зависания" на стадии реализации в виде "постоянного рефакторинга".

Нет. По случаям глюков могу сказать что ХП дает менее глючный код. И рефакторинг с TDD положительно влияет. Но основная проблема в несоответсвии требований пользователей и результатом. Если при тебе нет представителя клиента, у которого можно что-то спросить не отходя от кассы, получается полная фигня. Если имеются функциональные требования, то их можно утвердить у заказчика, и даже если в результате получится фигня, всегда можно сослаться на подпись.

ПК>То же проектирование нужно в т.ч. и для организации тестирования и "прикормки" documentation writers.

Для тестирования и documentation writers в основном полезны прецеденты написанные аналитиками а не архитекторами.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Павел Кузнецов
Павел Кузнецов
16.02.2006 12:02
Здравствуйте, GlebZ, Вы писали:

ПК>>Что характерно, эта метафора намного ближе к описанию итеративного процесса, чем аморфный режим "постоянного рефакторинга". Последняя метафора страдает концентрацией на коде, а не на результате.


GZ>Хотелось бы намекнуть, что рефакторинг — это улучшение кода не влияя на функциональность. И он мало зависит от процесса разработки. Просто в ХП она обязательная дисциплина.


XP не отвергает выделенного этапа проектирования и планирования, и даже наоборот, в классике предполагает наличие в начале каждой итерации выделенное планирование, iteration planning meeting, и выделенный этап проектирования, основанный на использовании CRC Cards. Как мы уже разобрались выше и ранее, режим "постоянного рефакторинга" в трактовке Влада (т.е. произвольные модификации кода с помощью инструментальных средств IDE, обычно без unit tests) принципиально отличается от рефакторинга в трактовке XP, который, действительно, принципиально не изменяет функциональность.

ПК>>В случае же полного (хотя и короткого) цикла (проектирование — реализация — документирование — тестирование — выпуск) жизнь проекта "полнее", и всевозможные "глюки" вылавливаются в большей мере, чем в случае хронического "зависания" на стадии реализации в виде "постоянного рефакторинга".


GZ>Нет. По случаям глюков могу сказать что ХП дает менее глючный код. <...>


Ну началось... XP и прочие модные итерационные процессы как раз построены по схеме, упомянутой выше (полные, но короткие циклы, включающие в т.ч. (коллективное) планирование и проектирование ближайшей итерации).

P.S. Интересно, на основании чего ты воспринял метафору "серии маленьких водопадиков" как противоречащую XP и т.п.? Уж не из-за того, что встретил слово "водопадик"?
GlebZ
GlebZ
16.02.2006 10:16
Здравствуйте, Павел Кузнецов, Вы писали:

GZ>>Хотелось бы намекнуть, что рефакторинг — это улучшение кода не влияя на функциональность. И он мало зависит от процесса разработки. Просто в ХП она обязательная дисциплина.


ПК>XP не отвергает выделенного этапа проектирования и планирования, и даже наоборот, в классике предполагает наличие в начале каждой итерации выделенное планирование, iteration planning meeting, и выделенный этап проектирования, основанный на использовании CRC Cards.

Проектирование и планирование совершенно различается у жестких и мягких процессов программирования(я имею ввиду RUP и XP). В XP нет ничего постоянного. Ни в планировании, ни тем более в архитектуре. Даже те же CRC карты — это всего лишь некоторые намерения которые вполне могут измениться.
ПК>Как мы уже разобрались выше и ранее, режим "постоянного рефакторинга" в трактовке Влада (т.е. произвольные модификации кода с помощью инструментальных средств IDE, обычно без unit tests) принципиально отличается от рефакторинга в трактовке XP, который, действительно, принципиально не изменяет функциональность.
Он собственно сильно отличается и от моего рефакторинга. В отличие от принятых норм в XP, я не выделяю для него время в виде итераций. Он делается постоянно в каждой процедуре, и тесты я делаю после того как написал первую версию того или иного блока.

GZ>>Нет. По случаям глюков могу сказать что ХП дает менее глючный код. <...>

ПК>Ну началось... XP и прочие модные итерационные процессы как раз построены по схеме, упомянутой выше (полные, но короткие циклы, включающие в т.ч. (коллективное) планирование и проектирование ближайшей итерации).
Проблема в том, что XP хорошо защищен на предмет изменений(которые в любом случае вносятся). Он защищает от изменений чужих разработчиков. И он защищает те места, которые не определяются функциональными тестами. Которые во многом дебильны и слишком неполны.

ПК>P.S. Интересно, на основании чего ты воспринял метафору "серии маленьких водопадиков" как противоречащую XP и т.п.? Уж не из-за того, что встретил слово "водопадик"?

Ключевым словом здесь было дизайн кода.

PS. Пока писал код, позвонили, узнал что стал уже дважды отцом.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
IT
IT
17.02.2006 03:30
Здравствуйте, GlebZ, Вы писали:

GZ>PS. Пока писал код, позвонили, узнал что стал уже дважды отцом.


Мои поздравления! Мальчик, девочка?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Sinclair
Sinclair
17.02.2006 12:12
Здравствуйте, GlebZ, Вы писали:
GZ>PS. Пока писал код, позвонили, узнал что стал уже дважды отцом.
Двойняшки?
http://rsdn.org/File/5743/rsdn@home2.gif 1.1.4 stable rev. 510
Павел Кузнецов
Павел Кузнецов
16.02.2006 01:56
Здравствуйте, GlebZ, Вы писали:

GZ> . . . могу сказать что ХП . . .


GZ>Для тестирования и documentation writers в основном полезны прецеденты написанные аналитиками а не архитекторами.


О, кстати, а как XP и выделенные аналитики и архитекторы сочетаются между собой? По моему представлению это вещи, не вполне совместимые...
GlebZ
GlebZ
16.02.2006 10:16
Здравствуйте, Павел Кузнецов, Вы писали:

GZ>> . . . могу сказать что ХП . . .

GZ>>Для тестирования и documentation writers в основном полезны прецеденты написанные аналитиками а не архитекторами.
ПК>О, кстати, а как XP и выделенные аналитики и архитекторы сочетаются между собой? По моему представлению это вещи, не вполне совместимые...
Архитекторов как таковых нет. А аналитики(или представители клиента) используются в большей степени консультативно. Вобщем хаос управляемый одним человеком обязанности которого только в одном: чтобы друг другу морды не набили. Почти полное отрицания документации влияет и на documentation writers. Я очень сомневаюсь что писатели будут разбирать функциональные тесты. Что касается тестирования, то они предлагают именно автоматизированное тестирование притом сделанная клиентами. Во первых, задолбаешься с граничными условиями разбираться(что я не видел ни одной книжке по XP ). Во вторых, все равно все придется делать с аналитиками. Программисты не всегда хорошие помошники потому как для тестеров они люди заинтересованные, а для техписателей, люди не от мира сего.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
GlebZ
GlebZ
15.02.2006 08:49
Здравствуйте, eao197, Вы писали:

GZ>>Что-то вас господа занесло. Один апологет XP, другой водпадов.

E>Не, я не водопада апологет. А так... серии маленьких водопадиков.
Я как-то побоялся называть разработку итерационной, поскольку все процессы разработки в современном мире итерационные.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
EXO
EXO
15.02.2006 07:41
Здравствуйте, GlebZ, Вы писали:
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(){} в голове уже лежит архитектура. Я ее как-то уже давно не придумываю. Она сама рождается.


Вот здесь начинаются расхождения. Архитектуру я рисую. Черкаюсь.
На этом этапе я не нашел пока адекватной замены бумаге.
Но рисую вовсе не классы, а "компаненты", процессы, модули. И потоколы между ними.
То есть декомпозицию задачи на подсистемы. Стараюсь получить их "слабосвязанность".

А дальше — для каждой отдельной подсистемы уже берусь за объетное проектирование. Например — через дерево классов. И это да — если возможно, в среде разработки. С удовольствием задействую все красивости и удобства.
Но этот этап (и остальные до резултата) у меня занимает уже около четверти времени.
GlebZ
GlebZ
15.02.2006 08:49
Здравствуйте, EXO, Вы писали:

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. Такие процессы мне очень не нравятся. Обычно это писанина компонентов которые уже есть в голове, и элементарно выводящиеся из прецедентов и предметной области.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
vitaly_spb
vitaly_spb
16.02.2006 11:09
IT>Таким образом, первое из перечисленных выше преимуществ проектирования становится не актуальным.

IT, отличный рассказ и я практически со всем согласен. С чем не согласен — проекты бывают разных масштабов и на них меняются разработчики (проект на 2-3 года скажем, люди могут уходить-приходить). Чтобы проект развивался обязательно должны быть зафиксированы структура проекта и т.п., это все забывается, не успевается передать и т.д.

Потом еще бывают ситуации с (мягко говоря) не самыми умными разработчиками, код которых приходится дорабатывать. Например, у меня была ситуация, когда я пришел в проект, половина которого была написана человеком за месяц до увольнения. Можно себе представить что там написал человек, котор. И сколько я промучался разбираясь в его коде (не было проектирования как такового по тому проекту, было только задание: сделать то-то и то-то).
IT
IT
17.02.2006 01:50
Здравствуйте, vitaly_spb, Вы писали:

_>IT, отличный рассказ и я практически со всем согласен. С чем не согласен — проекты бывают разных масштабов и на них меняются разработчики (проект на 2-3 года скажем, люди могут уходить-приходить). Чтобы проект развивался обязательно должны быть зафиксированы структура проекта и т.п., это все забывается, не успевается передать и т.д.


Бывают такие проекты. А бывают ещё и бесконечные проекты. Бывают где взаимодействуют много команд. Но об этом я оговорился выше. Если необходима передача знаний, что наличие проектной документации и спецификаций (особенно на внешние интерфейсы) становится отдельным вопросом. Это с одной стороны. С другой — соревнования по тому, кто больше произведёт бумаги тоже не имеют никакого смысла. Вреда от 150 страниц на модуль, в которых смысл содержит только название и то уже давно устарело, даже больше, чем если бы их вообще не было.

Всегда нужна актуальная схема базы данных (если есть БД), схема объектной модели тоже полезна. Если схема БД близка к объектной модели, то достаточно первой. Описание какой-нибудь общей концепции. Разъяснение неочевидных мест и алгоритмов. Этого в большинстве случаев более чем достаточно и чем меньше бумаги, тем легче поддерживать её в актуальном состоянии.

_>Потом еще бывают ситуации с (мягко говоря) не самыми умными разработчиками, код которых приходится дорабатывать. Например, у меня была ситуация, когда я пришел в проект, половина которого была написана человеком за месяц до увольнения. Можно себе представить что там написал человек, котор. И сколько я промучался разбираясь в его коде (не было проектирования как такового по тому проекту, было только задание: сделать то-то и то-то).


Про одноклеточных лучше никаких аргументов не приводить. Если бы он тебе оставил документация, то, поверь мне, было бы ещё хуже.
... << RSDN@Home 1.2.0 alpha rev. 0>>