Читай код
От: Gaperton http://gaperton.livejournal.com
Дата: 05.05.09 22:25
Оценка: 222 (31) +4 :)
Организаторы SoftwarePeople попросили меня написать какую-нибудь статью для сайта. Я собственно, написал нечто, и опубликовал сначала в своем блоге. Эта совершенно безобидная статья вызвала почему-то кучу шума. Топ яндекса, и концы — заломилась толпа, и какого-то дуба половина ЖЖ меня теперь обвиняет в том, что я "проповедую" отказ от любой документации во всех ее проявлениях — и что такой подход — враг всему "промышленному". С ума спятить. Причем, переубедить людей, и объяснить им, что статья вообще не о том, и что я ничего не проповедую — практически невозможно. Короче, вот, читайте .

http://www.softwarepeople.ru/press/articles/09/

Когда я заступил на работу в компанию CQG в конце 1999 года, у меня уже был, как мне казалось, достаточно большой опыт в разработке ПО – три года создания корпоративных приложений БД под заказ. Мне уже казалось, что я очень много знаю и умею, и я был крайне самоуверен. Однако, возникла некоторая загвоздка – CQG не являлось приложением баз данных, основанном на комбинации готовых сторонних технологий, таких как MS SQL сервер, Visual Basic, Delphi, JavaScript, и 1C – к которым я привык. Меня потряс объем приложения – почти 50 мегабайт основных исходников, не считая свистулек, прибамбасов, разного рода служебных и системных штук, по размеру почему-то превосходящих размер основных исходников.

Это был действительно серьезный и успешный программный комплекс, разрабатывавшийся десятками людей на тот момент на протяжении десяти лет, целиком написанный на С++, со своим собственным специализированным сервером БД, собственным встроенным языком программирования, собственным толстым клиентом, умеющим все, что может и не может пожелать трейдер, отказоустойчивый, работающий в реальном времени, сервера которого развернуты на ферме из сотен компьютеров и обслуживали порядка десятка тысяч пользователей одновременно.

Задание, которое мне было выдано, предполагало модификацию движка обработки данных и сервера, подкупало своей простотой, и практически свело меня с ума – завершить его я смог только через 7 месяцев после начала работ, после того, как прослушал лекции по архитектуре данного комплекса. Что характерно, после лекций пришлось выкинуть все, что я написал до них, и за два месяца сделать правильно.

В этот раз, перед тем, как что-либо писать, я предусмотрительно показал свой предварительный дизайн (подход к решению проблемы) Толу Корину (Tal Korin), автору и главному архитектору данной системы, и он направил меня в правильном направлении. У Тола ушло на это 5 минут. Это был первый случай, когда я сам инициировал дизайн-ревью (не зная, как оно называется), и был рад найденным у меня проблемам. После успешного выполнения данного задания я поступил в распоряжение Тола Корина, поскольку, с его слов и к моему безмерному удивлению, я оказался одним из немногих, кому пошли впрок лекции по архитектуре.

Каких-либо иллюзий на свой счет, меж тем, к тому моменту у меня уже не осталось – я понял, что цена всем моим знаниям, университетскому образованию, и опыту – ломаный грош. Меня поражал простой факт – я был объективно образован в Computer Science гораздо лучше Тола, и _знал_ больше. При этом, и, после некоторого опыта работы, я был в этом абсолютно уверен – я бы не смог спроектировать и реализовать такую систему за год, как это десять лет назад с одним помощником сделал Тол. Сложность системы явно превосходила мои возможности — я бы по ходу работы закопался в деталях. И уж тем более, у меня не получилось сделать систему так гибко, чтобы она прожила 10 лет, и была до сих пор адекватна ситуации.

То есть, до меня начало доходить, что есть нечто очень важное, что совершенно перпендикулярно университетскому образованию, чего нас просто не учили даже замечать. Оно перпендикулярно «дизайн-паттернам» и книгам по ОО проектированию. И оно, это нечто, у Тола есть, а у меня – нет. Если мои знания не могут мне помочь сделать такую систему – то много ли они стоят? Понимание и знание требуется для действия, ни для чего другого – это не китайская декоративная ваза.

С этого момента я начал внимательно наблюдать за Толом, изучать его решения и подход, и твердо решил разобраться, что же это такое за неуловимая штука, которой я не понимаю. То есть, я «записался в ученики», и Тол с удовольствием взял роль наставника. И за несколько лет Тол сделал меня инженером, показав мне на практике, что это такое, и за что я ему буду всегда благодарен.

По большей части это напоминало дзен, когда вам дают задание, разрывающее мозг, вроде хлопка одной ладонью, и через некоторое время вы неожиданно ловите просветление. Удивительный опыт. Вот один небольшой пример, на что это было похоже.
— Тол, скажи, а как работает вот эта штука.
— Влад, вот этого я на самом деле не знаю. А ты почитай код, и разберись!
— Тол, ты издеваешься надо мной?! Здесь пятьдесят мегабайт этого гребанного недокументированного кода! Ты знаешь все Тол, и это ни для кого не секрет.
— Хорошо, смотри, – не стал спорить Тол, — Я тебе говорю – я не знаю, и поэтому я должен сам почитать код, чтобы ответить на твой вопрос. Поэтому, я открываю код.
Тол открывает правильный файл в одну попытку, продираясь через файловую систему, не пользуясь класс-браузером, мотает файл в правильную середину.
— Так. Ты сказал, вот эта фигня? Вот, открыл. Так… Тебе нужен вот этот метод. Читаем. Вот, смотри, он вызывает вот этого парня (так Тол называл классы и объекты – look – now this guy tell that guy to do this thing). Видишь? Вот, происходит тут то-то и то-то. Все просто.
— Спасибо, Тол! Теперь все ясно. А говорил – не знаешь!
— Я тебе говорю – код читай, блин! Все то же самое ты можешь сделать сам!
— Тол, ну в нем же нихрена не понятно без документации, — сказал я, будучи совершенно уверен, что я не смогу сделать того же сам. Происходящее напоминало ловкий фокус.
— Тебе, чтобы читать код, нужна документация? Прости – какая?
— Ну, там, диаграммы классов, например.
— У нас была одна, вроде, составленная лет пять назад. Она сейчас, мягко говоря, не соответствует действительности. Сам понимаешь, у нас 50 инженеров, и разработка идет очень активная. Но если ты уверен, что она тебе поможет, я могу поискать, – участливо смотрит на меня Тол, — ну так что, искать?
— Не, устаревшая, мне, пожалуй, не поможет, — подумав, ответил я, — это ж я все равно должен весь код изучить, чтобы понять, где ей можно доверять, а где нет.
— На самом деле, я не уверен, что тебе сильно поможет даже новая, и поэтому я тебе и говорю: код – лучшая документация! – терпеливо разъясняет Тол, — Она _всегда_ актуальна, и _никогда_ не устаревает, помимо того, что более информативна чем диаграмма классов, конечно.
— Хорошо, я понял, а может, ты мне еще объяснишь, вот в этом месте как работает…
— Нет. Это ты мне объяснишь, после того, как прочтешь. Мне как раз надо скоро будет туда правки вносить. Давай, парень, я не тебя рассчитываю. Иди — читай код.
— Хорошо, Тол, – обреченно сказал я, и пошел читать код.

Да, надо сказать, я тогда немного обиделся на Тола, я думал, что он нифига не понимает. И долгое время считал, что он был не прав. Как-то года через три ко мне подошел коллега, с вопросом. Я был утомлен от работы, голова соображала вяло. К этому моменту я выкинул все свои диаграммы классов, за ненадобностью – зачем на них смотреть, если они давно уже в голове?

— Слушай, Влад, не поможешь, объясни, как работает вот эта подсистема?
Я вяло поднимаю глаза на коллегу, вижу безнадежность в его взгляде, тяжело вздыхаю, и решаю ему помочь. Хоть я ничего и не понимаю в этой подсистеме – так, рядом проходил.
— Хорошо, смотри, – тут я «вслепую», без всяких класс-браузеров, продираюсь к «правильному» файлу, открываю его, и поиском нахожу нужный метод, — видишь, вот здесь что происходит?

Я читаю код, без труда восстанавливая логику поведения и структуру программы в уме, и одновременно простыми словами объясняю это коллеге. Тут у меня в голове что-то перещелкивает, и я с изумлением вспоминаю наш разговор с Толом трехлетней давности, сознание у меня как бы раздваивается, и я наблюдаю за собой со стороны.

— Вот, видишь, как все просто, — заканчиваю я. И к своему чудовищному удивлению добавляю, то, что надо сказать, потому что это правда:
— А вообще — читай код. Код – лучшая документация. Ты вот думаешь, я разбираюсь в этой подсистеме? Нет, я этот код вижу в первый раз, так же как и ты.
— Но этот код совершенно не документирован! Диаграммы хоть какие-нибудь бы!
— Смотри, — говорю я улыбаясь, окончательно осознавая, что Тол в очередной раз, как и всегда, оказался прав, — вот я запускаю Rational Rose, где у меня всосана вся наша система в режиме reverse engineering, и бросаю на чистый лист эти пять классов. Видишь? Вот тебе свежая, актуальная диаграмма. Какой смысл тратить усилия на документирование того, что устаревает за год, и может быть в любой момент восстановлено за пару минут? Если она тебе сильно поможет, я сейчас ее тебе распечатаю. Распечатать?
— Да нет, пожалуй, — задумчиво отвечает коллега, рассматривая диаграмму. Ясности она не добавляла.
— Вот. Диаграммы не стоят ничего, ценны мыслительные процессы, происходящие у тебя в голове в процессе их составления. Поэтому я и говорю: код – лучшая документация. Читай код.

Разумеется, Тол хотел мне показать не только и не столько практическую бесполезность проектной документации, как это могло показалось на первый взгляд. Философия "код — лучшая документация" дает гораздо большее, чем отсутствие документации. Это необходимое ограничение, только приняв и осознав которое, и в результате — рассчитывая только на свои силы, понимая — что код — основной источник информации, его нельзя боятся, с ним надо столкнуться в лоб, и этого не получится избежать, обойти, и перепрыгнуть, — можно достичь мастерства в reverse engineering и вообще понять, что это такое.

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

Толу на самом деле было все равно, есть документация или нет. В совершенстве владея reverse engineering, он в уме потрясающе легко умел переходить от кода к архитектуре, и наоборот. В результате, проектируя, он всегда детально представлял, в какой код превратятся его мысли, и поэтому был способен быстро прокручивать в голове огромное количество вариантов, отбрасывая "плохие". В его понимании, архитектор, не умеющий читать чужой код с "листа", и не пишущий своего — подобен инвалиду, пытающемуся бегать на костылях. Он довольно быстро закончит очень плохим архитектором — вопрос нескольких лет.

Второй важный аспект этой философии — понимание того, что код пишется в первую очередь для человека, и только во вторую — для компьютера. Это приводит нас к идеям, близким по духу к literate programming, за которое ратует Кнут. Как может человек, который не в состоянии внятно выразить свою мысль на неформальном, знакомом ему с детства естественном языке, выразить эту же мысль понятным образом на существенно более формальном языке программирования? Но это уже другая история.

Re: Наглядная иллюстрация к тексту
От: Gaperton http://gaperton.livejournal.com
Дата: 05.05.09 23:28
Оценка: :))) :))) :))) :))) :)))
Re: Читай код
От: yumi  
Дата: 06.05.09 00:32
Оценка: 1 (1) +2
Здравствуйте, Gaperton, Вы писали:

G>

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


Мне всегда казалось, что это не высшая степень инженерного мастерства и компетенция архитектора, как ты говоришь, а простой обычный базовый навык, обычного, среднего программиста. Вообще не представляю себе такого программиста, который не обладает этим навыком, ну потому что иначе он и не программист вовсе.
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[2]: Читай код
От: Gaperton http://gaperton.livejournal.com
Дата: 06.05.09 00:52
Оценка:
Здравствуйте, yumi, Вы писали:

Y>Мне всегда казалось, что это не высшая степень инженерного мастерства и компетенция архитектора, как ты говоришь, а простой обычный базовый навык, обычного, среднего программиста. Вообще не представляю себе такого программиста, который не обладает этим навыком, ну потому что иначе он и не программист вовсе.


Да, пожалуй, это действительно навык senior software developer. Надо поправить. Эта фраза у меня вызывала какие-то смутные колебания.

Видишь ли, с одной стороны, средний программист обычно входит в ступор, пытаясь читать код CQG. Не потому, что он плохо написан — просто он зараза очень большой, и чтобы его читать, надо, скажем так, довольно много знать вещей на самом деле, специфичных для CQG. Скажем, наследование от Messenger означает, что класс умеет отправлять и принимать асинхронные сообщения — просто как пример. Ну, другими словами, абстрагируясь — чтобы читать код, надо знать и понимать Common Design Principles, в соответствии с которым он написан. Это нормально, фокусом не является, и это навык обычного программиста.

С другой стороны, уметь "читать код" можно тоже по разному — в этом деле есть разные уровни. Одно дело сориентироваться в чужом коде, и закрыть багу, и другое — в сжатые сроки восстановить дизайн подсистемы по коду, и "понять" ее — вот на это способен, мне кажется, уже не каждый средний программист. Или я плохо думаю о среднем программисте?
Re[3]: Читай код
От: yumi  
Дата: 06.05.09 01:25
Оценка: +2
Здравствуйте, Gaperton, Вы писали:

G>Видишь ли, с одной стороны, средний программист обычно входит в ступор, пытаясь читать код CQG. Не потому, что он плохо написан — просто он зараза очень большой, и чтобы его читать, надо, скажем так, довольно много знать вещей на самом деле, специфичных для CQG. Скажем, наследование от Messenger означает, что класс умеет отправлять и принимать асинхронные сообщения — просто как пример. Ну, другими словами, абстрагируясь — чтобы читать код, надо знать и понимать Common Design Principles, в соответствии с которым он написан. Это нормально, фокусом не является, и это навык обычного программиста.


И все равно у меня тут есть, с чем не согласиться. Большой и даже очень большой, это не оправдание. Обычно, что-то большое, состоит из небольших подсистем. Подсистемы тоже внутри состоят из небольших кусков. Там в статье было упоминание о 50Мб исходников. Сам я учавствовал в проекте, наверное чуть меньшем, но мы как-то с ребятами считали, там было около 40Мб основного кода. Плюс бинарники сторонних вендоров. Для примера, подсистема мейнтейнером, которой я был, была одна из самых крупных, весила около 10Мб. Она же в свою очередь делилась на несколько подсистем. Кстати, история примерно похожа на твою, всей системе, тоже более 10 лет и живет она до сих пор благодоря своей очень гибкой, простой и прозрачной архитектуре. И был у меня такой же учитель-наставник Только учил он меня немного другому, тоже вроде банальной вещи, KISS, что самое простое рещение и есть самое правильное. Только я понимал это, но решения мои все равно громоздкие получались, только спустя кажется год я начал выдавать лаконичные, простые и красивые решения Что-то я отклонился от общей темы, ах да, время для новых сотрудников тратилось только в начале, чтобы вникнуть в архитектуру, понять, что и где находится, хотя бы примерно и до первого реального коммита проходило 3 мес, как раз к этому моменту у нас кончался испытательный срок А дальше уже, разобраться, что и где, внести изменения в какой-либо подсистеме все могли без проблем, и скорее всего это благодоря банальной KISS.

G>С другой стороны, уметь "читать код" можно тоже по разному — в этом деле есть разные уровни. Одно дело сориентироваться в чужом коде, и закрыть багу, и другое — в сжатые сроки восстановить дизайн подсистемы по коду, и "понять" ее — вот на это способен, мне кажется, уже не каждый средний программист. Или я плохо думаю о среднем программисте?


Ну в этом плане да, согласен.
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[2]: Читай код
От: jazzer Россия Skype: enerjazzer
Дата: 06.05.09 02:29
Оценка: +1
Здравствуйте, yumi, Вы писали:

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


G>>

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


Y>Мне всегда казалось, что это не высшая степень инженерного мастерства и компетенция архитектора, как ты говоришь, а простой обычный базовый навык, обычного, среднего программиста. Вообще не представляю себе такого программиста, который не обладает этим навыком, ну потому что иначе он и не программист вовсе.


Для мотивации начинающих статья — самое оно, и отсыл к "высшей ступени" — это то, что надо.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Читай код
От: Aikin Беларусь kavaleu.ru
Дата: 06.05.09 06:04
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

G>Организаторы SoftwarePeople попросили меня написать какую-нибудь статью для сайта. Я собственно, написал нечто, и опубликовал сначала в своем блоге.

О!, статья перебралась сюда Дождался (не хотелось там писать).

Хочу поделиться отличной статьей (маленькой, но толковой) о том как же вести проектную документацию.
Если кратко, то документировать нужно:
1) требования
2) высокоуровневая архитектура (aka CDP)
3) история принятия решений

Об этом же говорит Гапертон, но выделить эти пункты довольно таки сложно .


СУВ, Aikin
Re: Читай код
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 06.05.09 06:13
Оценка:
Здравствуйте, Gaperton, Вы писали:

Все правильно. Код — лучшая документация. Но, только тогда, когда его пишут профессионалы в соответствии с принятыми в компании нормами. Хочу работать в такой компании )
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[2]: Читай код
От: genre Россия  
Дата: 06.05.09 08:22
Оценка: +1
Здравствуйте, yumi, Вы писали:

Y>Мне всегда казалось, что это не высшая степень инженерного мастерства и компетенция архитектора, как ты говоришь, а простой обычный базовый навык, обычного, среднего программиста. Вообще не представляю себе такого программиста, который не обладает этим навыком, ну потому что иначе он и не программист вовсе.


Как оказывается мало программистов вокруг
Может это и не высшая степень мастерства, но как минимум признак очень хорошего программиста. Поскольку программистов не обладающих таким навыком вокруг пруд пруди. Я видел много команд в которых есть отдельный человек отлично разбирающийся в дизайне системы и куча человек разбирающихся в этом весьма посредственно.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re: Читай код
От: genre Россия  
Дата: 06.05.09 08:24
Оценка: 1 (1) +6
Здравствуйте, Gaperton, Вы писали:

Добавлю. Код конечно лучшая документация, но он не отвечает на один очень важный вопрос: "Почему сделано именно так, а не иначе".
Вот это все-таки нужно документировать отдельно.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re: Читай код
От: bkat  
Дата: 06.05.09 08:30
Оценка: 6 (1) +2
Да, умение читать код очень важно.
Но и "картинки" тоже весьма полезны.
Просто они должны быть сделаны людьми и для людей, а не сгенерировыны тулом.
Сгенерировыны тулом картинки самые бесполезные.

На мой взляд, картинки полезны в 2 ситуациях:
  1. Нужно дать обзор системы новому человеку.
    В этом случае нужны высокоуровневое описание того,
    как работает система в целом, без описания ненужных деталей.
    Если такие картинки есть, то новый человек быстрее вникает в суть
    и ему требуется меньше времени, чтобы потом самому
    быстро открывать нужный файл и находить нужное место.
  2. Нужно обсудить новые вещи, которых еще нету в виде коде.
    Набросать пару диаграмм и обсудить их с коллегами — это эффективнее,
    чем написать кучу кода, и потом начинать его обсуждать с коллегами.
Re[3]: Читай код
От: Mr.Cat  
Дата: 06.05.09 08:40
Оценка: 7 (1) +1
Здравствуйте, Gaperton, Вы писали:
G>Ну, другими словами, абстрагируясь — чтобы читать код, надо знать и понимать Common Design Principles, в соответствии с которым он написан. Это нормально, фокусом не является, и это навык обычного программиста.
+1. Вот, пожалуй, эти "Common Design Principles" и должны быть задокументированы.

G>Одно дело сориентироваться в чужом коде, и закрыть багу, и другое — в сжатые сроки восстановить дизайн подсистемы по коду, и "понять" ее — вот на это способен, мне кажется, уже не каждый средний программист. Или я плохо думаю о среднем программисте?

Думаю, понять "как?" — это бывает сложно, но возможно. А вот понять, "почему?"...
Re[2]: Читай код
От: Gaperton http://gaperton.livejournal.com
Дата: 06.05.09 08:51
Оценка: +1
Здравствуйте, genre, Вы писали:

G>Добавлю. Код конечно лучшая документация, но он не отвечает на один очень важный вопрос: "Почему сделано именно так, а не иначе".

G>Вот это все-таки нужно документировать отдельно.

Точно. Очень, очень своевременный вопрос. На этот вопрос отвечают комментарии к коммитам кода в VCS. В этих комментариях помимо описания rationale (кстати, и поэтому тоже многофайловые "транзакционные" коммиты рулят, когда коммитится только работоспособный код — вы видите связь разрозненных правок) может быть ссылка на дефект, фичреквест, или просто страничку в вики, где висит дизайн-документ, по реализации которого сейчас делается коммит.

И все. Следить на актуальностью документов при такой схеме не надо — все сделает режим просмотра файлов annotate (смотреть файл в веб морде репозитория контроля версий), где можно определить автора каждой строки и коммит, которой она добавлена, соответственно — в один клик почитать ее rationale, и в два клика — добраться до мегадизайна, описания дефекта, или фичи, если они есть.

Настоятельно рекомендую. Советы лучших собаководов, буквально .
Re[2]: Читай код
От: elmal  
Дата: 06.05.09 08:54
Оценка:
Здравствуйте, Sshur, Вы писали:

S>Все правильно. Код — лучшая документация. Но, только тогда, когда его пишут профессионалы в соответствии с принятыми в компании нормами. Хочу работать в такой компании )

Даже если код пишут индусы в худшем случае этого слова, и даже если есть документация — один черт даже ужасный индусский код будет лучшей документацией. И в любом случае придется лезть в этот код, чтобы что-то понять. Так как та документация, которая есть — она даже близко не будет соответствовать коду, так как писалась скорее всего на заре становления системы, и потом на нее никто не смотрел и все писали абы как.
Re[3]: Читай код
От: genre Россия  
Дата: 06.05.09 09:04
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Настоятельно рекомендую. Советы лучших собаководов, буквально .


Методы решения я знаю, я просто хотел заметить, что в статье слишком однозначно сказано, что документация не нужна. А все-таки дизайн-дока в вики проявилась
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[3]: Читай код
От: bastrakov Россия http://bastrakof.livejournal.com/
Дата: 06.05.09 10:13
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

G>>Добавлю. Код конечно лучшая документация, но он не отвечает на один очень важный вопрос: "Почему сделано именно так, а не иначе".

G>Точно. Очень, очень своевременный вопрос. На этот вопрос отвечают комментарии к коммитам кода в VCS.

тут засада. сырцы были перелиты из одного репозитория в другой не раз.
и там уже давно первым стоит билд-мастер. и после несколько изменений для последних релизов.
так что причину к-л решения найти можно только у старых в памяти.

на самом деле есть что сказать по статье, но чет и со временем напряженка, да и война тут опять пойдет.
так что коротко:
1) диаграммы классов выкинул уже лет 7 назад. смысла нет. "под пиво" узнал, что куча коллег того же мнения.
2) доки писать надо, но выше уровня кода. на уровне кода — код лучшая дока.
3) любые чужие действия считаются магией, пока не понял как это делается. потом — ремеслом. ничего чудесного из описанного я не увидел. больше того, я увидел, что вместо 5-минутного поиска и рассказа про метод "в первый раз", надо было за 15 минут научить находить любой метод "в следующий раз", проследив, что и как вы сами найдете.

зюыю сам в сырцах писал как-то коммент "всю эту фигню, я сделал по прямому требованию заказчика. детали в доке..." во
Re[4]: Читай код
От: Gaperton http://gaperton.livejournal.com
Дата: 06.05.09 10:14
Оценка: 2 (1) +3
Здравствуйте, Mr.Cat, Вы писали:

G>>Ну, другими словами, абстрагируясь — чтобы читать код, надо знать и понимать Common Design Principles, в соответствии с которым он написан. Это нормально, фокусом не является, и это навык обычного программиста.

MC>+1. Вот, пожалуй, эти "Common Design Principles" и должны быть задокументированы.
Пожалуй, да. Кстати, я кажется даже знаю хороший пример, как это делается, дающий понимание, как это должно выглядеть.
http://erlang.org/doc/design_principles/part_frame.html

G>>Одно дело сориентироваться в чужом коде, и закрыть багу, и другое — в сжатые сроки восстановить дизайн подсистемы по коду, и "понять" ее — вот на это способен, мне кажется, уже не каждый средний программист. Или я плохо думаю о среднем программисте?

MC>Думаю, понять "как?" — это бывает сложно, но возможно. А вот понять, "почему?"...

"Историческое программирование". Однажды, когда я спросил, почему некая подсистема хранения данных выглядит так, что напоминает бред сумасшедшего, Тол сказал мне — "чтобы ты понял, я должен начать свой рассказ с 90 года, когда компьютеры были медленными, диски — очень маленькими, а память — дорогой." После чего я узнал, что эта подсистема крупно, но эволюционно изменялась три раза с 90 годов, каждый раз — действия людей были мегаразумны и оправданы, и были оптимальными в каждой из ситуаций. Однако, в результате вышло, гхм, очень необычно, и в четвертый раз подсистему проще было уже переписать нафиг, чем менять. Накопились критическое количество реликтовых слоев.

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

Как выяснять историю? Ну, не знаю, право. Программист-историк, как и любой историк, может работать с письменными свидетельствами очевидцев, или же опрашивая аксакалов о событиях минувших дней (что заметно эффективнее, хрен восстановишь историю по документам).
Re[4]: Читай код
От: Gaperton http://gaperton.livejournal.com
Дата: 06.05.09 10:17
Оценка:
Здравствуйте, genre, Вы писали:

G>>Настоятельно рекомендую. Советы лучших собаководов, буквально .


G>Методы решения я знаю, я просто хотел заметить, что в статье слишком однозначно сказано, что документация не нужна. А все-таки дизайн-дока в вики проявилась


Через пять лет дизайн-дока в вики у вас будет именно такая, как сказано в статье — пятилетней давности, и код перестанет ей соответствовать. Это — не наталкивает не на какие мысли?
Re[5]: Читай код
От: genre Россия  
Дата: 06.05.09 10:58
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Через пять лет дизайн-дока в вики у вас будет именно такая, как сказано в статье — пятилетней давности, и код перестанет ей соответствовать. Это — не наталкивает не на какие мысли?


Не-не. Дизайн-дока появилась не у меня, а у вас. Я наверное неправильно выразился.
еще раз цитирую:

G>Точно. Очень, очень своевременный вопрос. На этот вопрос отвечают комментарии к коммитам кода в VCS. В этих комментариях помимо описания rationale (кстати, и поэтому тоже многофайловые "транзакционные" коммиты рулят, когда коммитится только работоспособный код — вы видите связь разрозненных правок) может быть ссылка на дефект, фичреквест, или просто страничку в вики, где висит дизайн-документ, по реализации которого сейчас делается коммит.


я выделил.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[6]: Читай код
От: Gaperton http://gaperton.livejournal.com
Дата: 06.05.09 15:47
Оценка:
Здравствуйте, genre, Вы писали:

G>>Через пять лет дизайн-дока в вики у вас будет именно такая, как сказано в статье — пятилетней давности, и код перестанет ей соответствовать. Это — не наталкивает не на какие мысли?


G>Не-не. Дизайн-дока появилась не у меня, а у вас. Я наверное неправильно выразился.


Это так принципиально?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.