Читать стоящее ниже не надо. Тем, кто прочитает, счастья в жизни это не принесёт. Короче, я предупредил.
В прошлом посте я написал:
Описание мира в конечных автоматах, таблицах переходов и сообщениях - это модель.
Модель можно перевести практически в любую парадигму. Хоть в настоящие сообщения, хоть в функциональную запись, хоть в объектно-ориентированную, хоть в двоичный код. Также практически любую программу можно перевести в эту модель. Очень часто это совсем не просто, но принципиально возможно.
(Средний срок на перестройку мозгов - шесть месяцев, плюс надо ещё пару-тройку лет применения подхода, чтобы его освоить. Кто хочет, верит, кто хочет, не верит, но не надо говорить, что это не возможно, я это сам делал. Спорить об этом имеет смысл с людьми, имеющими аналогичный опыт. По крайней мере, в Германии мне таких встретить ещё не довелось.)
Короче говоря, всё это не более, чем метод дизайна. Гораздо более сложный и скучный, чем прямое кодирование, но дающий тем, кто это делает с умом некоторые особенные плюшки.
Первым делом, конечно, стоит разделить «можно» и «нужно», Я видел разбор строк, построенный на конечных автоматах и сообщениях. Естественно, это не представляло из себя пример рационального использования вычислительных мощностей.
Но там, где это имеет смысл (а это практически любая задача управления) представление обмена информации сообщениями даёт прямо из коробки возможность распараллелить все процессы. Если при этом выполняются достаточно простые правила, получается решение без блокировок, конфликтов и прочей нервотрёпки.
Но, главное, деление системы на домены становится совершенно элементарным. При этом смена доменов вплоть до языка программирования перестаёт быть нерешаемой задачей.
Естественно, хорошо прописанный интерфейс будет на порядок лучше сложившегося хаотично. Но хорошее всегда и везде лучше плохого. Тем более, что в типичных макаронах вызовов не увидеть качества или ошибок, а в описании интерфейса они на ладони.
Первый навык, которому учится аналитик - умение делить мир на независимые части. Причём, на самом деле независимые, а не так, как это принято в индустрии.
Все программы можно представить в виде конечных автоматов.
Даже то, где равномерная функция превращает вещественные входные значения в выходные, можно разделить на состояния вроде «много», «мало», «нормально», «какой-то бред». Да и когда мы последний раз видели такие задачи. Всё-таки в прикладной математике работают единицы, а у остальных системы достаточно чётко определены. Точнее, определимы.
Обычный студент приходит на фирму и делает кучку кода. Потом ещё одну. И ещё. Постепенно он мужает, обрастает бородой и пузом, набирается опыта... Он может без особого напряжения произвести большую кучу, или с удовольствием покопаться в чужой. Если он любопытен и честолюбив, он учит много ненужных слов и бесполезных понятий, строит на корреляциях причинно-следственные связи, выводит из частного общее, возводит закономерности на предвзятой выборке случайных совпадений и становится гуру.
Человек, работающий с правильными конечными автоматами не сможет развиться в творческую личность.
Для начинающего сложно удержать в голове больше десятка объектов. Чтобы свободно оперировать, надо отрезать пять-семь, а остальные высылать во внешний мир, ограничив общение небольшим набором сообщений. Для опытных высоколобых гуру предел где-то на четырёх десятках. При этом, нормально работать можно, когда в системе автоматов не больше двадцати.
Также плоский конечный автомат плохо помещается в голове, когда растёт количество овалов и стрелочек. Рост очень нелинейный и приходится делить и упрощать, просто чтобы с состояниями и переходами можно было работать нормально.
Диаграмма классов на пол стены или хитрый автомат из Рапсодии со сложными вложениями могут вызвать морщенье лба только у подготовленных софтверных дизайнеров. У остальных - сразу испуганные глаза и желание поскорее сменить тему. Плоские конечные автоматы понимают даже люди из маркетинга. Нормальные несофтверные инженеры схватывают всё налету.
Самое обидное, что при этом даже постороннему человеку прекрасно видно, как что работает и хорошо это сделано или бездарно.
Второй навык, который вырабатывают те, у кого на это есть мозги и желание, - это умение упрощать мир.
Освоить это чрезвычайно сложно. Но потом многое получается на автомате. В частности, когда в требованиях проблемы, или программисты делают непонятно что, я раскладываю use cases на автоматы и сразу становятся понятны как пути нормальной работы, так и условия обработки отказов. Причём, на диаграмме всё видно сразу, так что для общего анализа это гораздо удобнее штанов Кокбурна.
Последний компонент относится к утерянным знаниям. Это могут инженеры электротехники. Это могут специалисты по разным техническим системам. Программисты забыли, что это и зачем, а те тулы, которые это когда-то поддерживали, выбросили соответствующий функционал, чтоб не пугать народ.
Я о таблицах писал, так что повторяться не буду. Кто хочет, вспомнит. Кто не помнит, найдёт. Да и книжку почитать тоже иногда не помешает. Здесь расскажу только о неполных таблицах.
Возьмём банальный пример.
Казалось бы, это выглядит так:
Первая строчка - сигналы, первая колонка - состояния. Всё просто.
Всё просто было бы, если бы это было правдой. Но так видит мир нормальный программист. На самом деле таблица гораздо сложнее.
Даже дизайно-архитектор, рисующий прямоугольнички, овальчики и стрелочки, и считающий, что познал конечные автоматы в полном объёме сертификации по уэмэлю, о существовании «лишних» ячеек таблицы не подозревает. Они находятся в туманной неизвестности за гранью его восприятия.
Они иногда попадаются ему под нос, когда он вдруг понимает, что где-то дыра, которую надо заполнить. Но мысль о том, что можно просто нарисовать таблицу и методично пройти по всем вариантам, просто не приходит ему в голову.
И не только потому, что ему лень и страшно. Он не умеет делить мир на подсистемы. Он не умеет упрощать. Так что мозг автоматически блокирует информацию, которая может ошарашить. Потому нормальный айтишник в лучшем случае рисует стрелочки, а обычно просто пишет в код, стараясь не вылезать на более высокие уровни и не задаваться опасными вопросами.
Диаграмма переходов обозначает только переходы. Написанный код, отражает только осознанные условия. Но потенциально в любом состоянии может прийти любое сообщение. И когда стрелочки нет, возможны три варианта:
1. Стрелочка на самом деле должна быть, просто её забыли нарисовать.
2. Сообщение пришло, сообщение может приходить, но его можно просто игнорировать. Если пользователь заполнил формочку и нажал кнопочку, мы начали её обрабатывать. Если он жмёт второй и третий раз, мы не дёргаемся. Пишем в таблицу I for Ignore.
3. Это сообщение в этом состоянии прийти не может. Мы проверяем пин-код в банкомате, а тут нам сваливается очередной набор цифр. Это уже проблема. Возвращаем карточку, отключаем пользователя, закрываем терминал и зовём на помощь. Пишем E for Error.
Не полностью определённая таблица переходов - это совершенно нормально. Красивые примеры без дыр и вопросов - это только в книжках и в документации, сопровождающей отгруженный заказчику товар.
Иногда тонкости не важны, иногда просто нет времени, иногда только в реальном применении становится понятно, какие ситуации могут произойти, а разобраться, что с ними делать, можно только увидев и поняв реальные условия.
Конечно, делая таблицу, сложнее забыть стрелочку, так что поведение системы становится более определённым. Иногда пустая клетка приводит к нескольким часам обсуждения.
Но это не главное. Гораздо важнее, что не полностью определённая таблица для нормального, не знающего и не желающего знать программиста и для аналитика, владеющего технологией, коренным образом различаются.
Мир первого выглядит так.
Второй просто на уровне рефлексов строит совершенно другое.
Каждая E может быть не учтённым I. Это стоит одной остановки системы, одного разбора причин, и одной замены в соответствующей ячейке таблицы.
Каждая E может быть не учтённой стрелочкой. Цена вопроса такая же. Может быть, плюс время на выбор варианта или на исправление модели состояний.
Каждая I, которая на самом деле не I, - это приглашение к долгим увлекательным приключениям.
Для аналитиков, которые познали таблицы переходов, это достаточно редкая ошибка дизайна. А вот для типичного представителя софтопроизводящей индустрии это образ жизни.
Самая любимая отговорка тех, кому лень или недоступно, - это про цены и отсутствие специалистов.
Насчёт второго всё достаточно просто. Если у человека нет профильного образования, мозгов и опыта работы, никто в здравом уме его не посадит конструировать трансмиссию автомобиля, проектировать мост или подводить годовой баланс предприятия. Для софта это сплошь и рядом. Причём, даже в тех областях, которые сопоставимы по серьёзности и бюджетам.
Людей умных много, научить можно. Да, шесть месяцев и отсев, но результат того стоит. Тем более, можно брать любых специалистов, лучше всего нормальных инженеров или просто людей с головой. Код по дизайну набить - это потом можно нанять даже индусов, благо всё определено и описано теми, кто может думать.
Насчёт первого - всё очень просто и очень хитро.
В закрытой системе всегда и везде дешевле и быстрее делать сразу без ошибок, чем насаждать проблемы, а потом их исправлять. Это не зависит ни от бюджета, ни от критичности задач.
Если грубо считать качество в наработке на отказ, то понятно, что бюджеты под разные критерии разные. Как в айти, так и в нормальном производстве.
Если сковородка может сломаться через полгода, можно взять дешёвую сталь, простое покрытие и китайских рабочих. Если нужен срок жизни в десять лет, то придётся брать хорошие материалы, дорогие технологии и made in Germany.
Если мы можем игнорировать, что от сайта отваливается один пользователь из тысячи, можно быстро сварганить что-то простое. Если потеря одной финансовой транцакции грозит штрафом на полмиллиона, придётся подробно продумывать архитектуру, выбирать надёжные библиотеки и серьёзно заниматься тестированием.
Но при этом «быстро и просто» не значат «плохо».
Если сайт сделан так, что от него отваливается каждый десятый, то мы поимеем головную боль, постоянные авралы и бездонную дыру, куда проваливается бюджет. И хвастаться, сколько сэкономили на быстрой и простой разработке и отсутствии анализа, тоже не получится.
И тут надо вспомнить об игнорируемой всеми хитрости.
Авралы, расходы и головную боль мы поимеем только тогда, когда система закрыта. Если она открыта, все эти радости достанутся кому-нибудь другому.
Деньги на то, чтобы не наплодить багов, не потратили мы, а расходы на борьбу с ошибками несёт кто-то другой.
Пользователь вылавливает данные, заливает в Excel и исправляет ручками. Но это его время и его проблемы.
Заказчик терпит убытки из-за дефектных компонентов и открывает у себя отдел тестирования, ухлопывая десятки человеколет на то, предотвратить что мы могли бы, вложив один человекомесяц. Но это наши деньги, а то - его.
И, конечно, нам пофиг, сколько времени и сил потратят безымянные далёкие посетители нашего замечательного вебсайта, пытаясь побороть наши баги, или, тем более, пользователи наших замечательных фришных библиотек, которые бьются с непредсказуемыми ошибками и общей кривизной архитектуры.
Плоские конечные автоматы, построенные на таблицах переходов и обменивающиеся сообщениями, - это дешёвый и эффективный способ получить надёжно работающие сложные системы.
Но это никому нафиг не надо. Мы сидим у истоков пищевой цепочки пожирающих время и ресурсы багов, и нас совершенно не волнует, что мы выпускаем в большой мир.
В прошлом посте я написал:
Впрочем, будет работать любая методика, которая использует сообщения, конечные автоматы и таблицы переходов. Этот трюк изобретают вновь и вновь, потому что книжки старые никто не читает.Народ как-то странно это воспринял, так что объясняю на пальцах.
Про вправление мозгов
Описание мира в конечных автоматах, таблицах переходов и сообщениях - это модель. Модель можно перевести практически в любую парадигму. Хоть в настоящие сообщения, хоть в функциональную запись, хоть в объектно-ориентированную, хоть в двоичный код. Также практически любую программу можно перевести в эту модель. Очень часто это совсем не просто, но принципиально возможно.
(Средний срок на перестройку мозгов - шесть месяцев, плюс надо ещё пару-тройку лет применения подхода, чтобы его освоить. Кто хочет, верит, кто хочет, не верит, но не надо говорить, что это не возможно, я это сам делал. Спорить об этом имеет смысл с людьми, имеющими аналогичный опыт. По крайней мере, в Германии мне таких встретить ещё не довелось.)
Короче говоря, всё это не более, чем метод дизайна. Гораздо более сложный и скучный, чем прямое кодирование, но дающий тем, кто это делает с умом некоторые особенные плюшки.
Работа с сообщениями
Первым делом, конечно, стоит разделить «можно» и «нужно», Я видел разбор строк, построенный на конечных автоматах и сообщениях. Естественно, это не представляло из себя пример рационального использования вычислительных мощностей.
Но там, где это имеет смысл (а это практически любая задача управления) представление обмена информации сообщениями даёт прямо из коробки возможность распараллелить все процессы. Если при этом выполняются достаточно простые правила, получается решение без блокировок, конфликтов и прочей нервотрёпки.
Но, главное, деление системы на домены становится совершенно элементарным. При этом смена доменов вплоть до языка программирования перестаёт быть нерешаемой задачей.
Естественно, хорошо прописанный интерфейс будет на порядок лучше сложившегося хаотично. Но хорошее всегда и везде лучше плохого. Тем более, что в типичных макаронах вызовов не увидеть качества или ошибок, а в описании интерфейса они на ладони.
Первый навык, которому учится аналитик - умение делить мир на независимые части. Причём, на самом деле независимые, а не так, как это принято в индустрии.
Конечные автоматы
Все программы можно представить в виде конечных автоматов.
Даже то, где равномерная функция превращает вещественные входные значения в выходные, можно разделить на состояния вроде «много», «мало», «нормально», «какой-то бред». Да и когда мы последний раз видели такие задачи. Всё-таки в прикладной математике работают единицы, а у остальных системы достаточно чётко определены. Точнее, определимы.
Обычный студент приходит на фирму и делает кучку кода. Потом ещё одну. И ещё. Постепенно он мужает, обрастает бородой и пузом, набирается опыта... Он может без особого напряжения произвести большую кучу, или с удовольствием покопаться в чужой. Если он любопытен и честолюбив, он учит много ненужных слов и бесполезных понятий, строит на корреляциях причинно-следственные связи, выводит из частного общее, возводит закономерности на предвзятой выборке случайных совпадений и становится гуру.
Человек, работающий с правильными конечными автоматами не сможет развиться в творческую личность.
Для начинающего сложно удержать в голове больше десятка объектов. Чтобы свободно оперировать, надо отрезать пять-семь, а остальные высылать во внешний мир, ограничив общение небольшим набором сообщений. Для опытных высоколобых гуру предел где-то на четырёх десятках. При этом, нормально работать можно, когда в системе автоматов не больше двадцати.
Также плоский конечный автомат плохо помещается в голове, когда растёт количество овалов и стрелочек. Рост очень нелинейный и приходится делить и упрощать, просто чтобы с состояниями и переходами можно было работать нормально.
Диаграмма классов на пол стены или хитрый автомат из Рапсодии со сложными вложениями могут вызвать морщенье лба только у подготовленных софтверных дизайнеров. У остальных - сразу испуганные глаза и желание поскорее сменить тему. Плоские конечные автоматы понимают даже люди из маркетинга. Нормальные несофтверные инженеры схватывают всё налету.
Самое обидное, что при этом даже постороннему человеку прекрасно видно, как что работает и хорошо это сделано или бездарно.
Второй навык, который вырабатывают те, у кого на это есть мозги и желание, - это умение упрощать мир.
Освоить это чрезвычайно сложно. Но потом многое получается на автомате. В частности, когда в требованиях проблемы, или программисты делают непонятно что, я раскладываю use cases на автоматы и сразу становятся понятны как пути нормальной работы, так и условия обработки отказов. Причём, на диаграмме всё видно сразу, так что для общего анализа это гораздо удобнее штанов Кокбурна.
Таблицы переходов
Последний компонент относится к утерянным знаниям. Это могут инженеры электротехники. Это могут специалисты по разным техническим системам. Программисты забыли, что это и зачем, а те тулы, которые это когда-то поддерживали, выбросили соответствующий функционал, чтоб не пугать народ.
Я о таблицах писал, так что повторяться не буду. Кто хочет, вспомнит. Кто не помнит, найдёт. Да и книжку почитать тоже иногда не помешает. Здесь расскажу только о неполных таблицах.
Возьмём банальный пример.
if( A ) {
if( a) {
X ;
} elsif( b) {
Y ;
}
} elsif( C && a) {
А ;
}
Казалось бы, это выглядит так:
| a | b |
----+---+---+
A | X | Y |
----+---+---+
C | А |
----+---+
Первая строчка - сигналы, первая колонка - состояния. Всё просто.
Всё просто было бы, если бы это было правдой. Но так видит мир нормальный программист. На самом деле таблица гораздо сложнее.
| a | b | c | d | ... | q |
----+---+---+---+---+- ... -+---+
A | X | Y | | | ... | |
----+---+---+---+---+- ... -+---+
B | | | | | ... | |
----+---+---+---+---+- ... -+---+
C | А | | | | ... | |
----+---+---+---+---+- ... -+---+
..................................
----+---+---+---+---+- ... -+---+
X | | | | | ... | |
----+---+---+---+---+- ... -+---+
Y | | | | | ... | |
----+---+---+---+---+- ... -+---+
Даже дизайно-архитектор, рисующий прямоугольнички, овальчики и стрелочки, и считающий, что познал конечные автоматы в полном объёме сертификации по уэмэлю, о существовании «лишних» ячеек таблицы не подозревает. Они находятся в туманной неизвестности за гранью его восприятия.
Они иногда попадаются ему под нос, когда он вдруг понимает, что где-то дыра, которую надо заполнить. Но мысль о том, что можно просто нарисовать таблицу и методично пройти по всем вариантам, просто не приходит ему в голову.
И не только потому, что ему лень и страшно. Он не умеет делить мир на подсистемы. Он не умеет упрощать. Так что мозг автоматически блокирует информацию, которая может ошарашить. Потому нормальный айтишник в лучшем случае рисует стрелочки, а обычно просто пишет в код, стараясь не вылезать на более высокие уровни и не задаваться опасными вопросами.
Диаграмма переходов обозначает только переходы. Написанный код, отражает только осознанные условия. Но потенциально в любом состоянии может прийти любое сообщение. И когда стрелочки нет, возможны три варианта:
1. Стрелочка на самом деле должна быть, просто её забыли нарисовать.
2. Сообщение пришло, сообщение может приходить, но его можно просто игнорировать. Если пользователь заполнил формочку и нажал кнопочку, мы начали её обрабатывать. Если он жмёт второй и третий раз, мы не дёргаемся. Пишем в таблицу I for Ignore.
3. Это сообщение в этом состоянии прийти не может. Мы проверяем пин-код в банкомате, а тут нам сваливается очередной набор цифр. Это уже проблема. Возвращаем карточку, отключаем пользователя, закрываем терминал и зовём на помощь. Пишем E for Error.
Не полностью определённая таблица переходов - это совершенно нормально. Красивые примеры без дыр и вопросов - это только в книжках и в документации, сопровождающей отгруженный заказчику товар.
Иногда тонкости не важны, иногда просто нет времени, иногда только в реальном применении становится понятно, какие ситуации могут произойти, а разобраться, что с ними делать, можно только увидев и поняв реальные условия.
Конечно, делая таблицу, сложнее забыть стрелочку, так что поведение системы становится более определённым. Иногда пустая клетка приводит к нескольким часам обсуждения.
Но это не главное. Гораздо важнее, что не полностью определённая таблица для нормального, не знающего и не желающего знать программиста и для аналитика, владеющего технологией, коренным образом различаются.
Мир первого выглядит так.
| a | b | c | d | ... | q |
----+---+---+---+---+- ... -+---+
A | X | Y | I | I | ... | I |
----+---+---+---+---+- ... -+---+
B | I | I | I | I | ... | I |
----+---+---+---+---+- ... -+---+
C | A | I | I | I | ... | I |
----+---+---+---+---+- ... -+---+
..................................
----+---+---+---+---+- ... -+---+
X | I | I | I | I | ... | I |
----+---+---+---+---+- ... -+---+
Y | I | I | I | I | ... | I |
----+---+---+---+---+- ... -+---+
Второй просто на уровне рефлексов строит совершенно другое.
| a | b | c | d | ... | q |
----+---+---+---+---+- ... -+---+
A | X | Y | E | E | ... | E |
----+---+---+---+---+- ... -+---+
B | E | E | E | E | ... | E |
----+---+---+---+---+- ... -+---+
C | A | E | E | E | ... | E |
----+---+---+---+---+- ... -+---+
..................................
----+---+---+---+---+- ... -+---+
X | E | E | E | E | ... | E |
----+---+---+---+---+- ... -+---+
Y | E | E | E | E | ... | E |
----+---+---+---+---+- ... -+---+
Каждая E может быть не учтённым I. Это стоит одной остановки системы, одного разбора причин, и одной замены в соответствующей ячейке таблицы.
Каждая E может быть не учтённой стрелочкой. Цена вопроса такая же. Может быть, плюс время на выбор варианта или на исправление модели состояний.
Каждая I, которая на самом деле не I, - это приглашение к долгим увлекательным приключениям.
Для аналитиков, которые познали таблицы переходов, это достаточно редкая ошибка дизайна. А вот для типичного представителя софтопроизводящей индустрии это образ жизни.
Про цену, которую мы или не мы платим
Самая любимая отговорка тех, кому лень или недоступно, - это про цены и отсутствие специалистов.
Насчёт второго всё достаточно просто. Если у человека нет профильного образования, мозгов и опыта работы, никто в здравом уме его не посадит конструировать трансмиссию автомобиля, проектировать мост или подводить годовой баланс предприятия. Для софта это сплошь и рядом. Причём, даже в тех областях, которые сопоставимы по серьёзности и бюджетам.
Людей умных много, научить можно. Да, шесть месяцев и отсев, но результат того стоит. Тем более, можно брать любых специалистов, лучше всего нормальных инженеров или просто людей с головой. Код по дизайну набить - это потом можно нанять даже индусов, благо всё определено и описано теми, кто может думать.
Насчёт первого - всё очень просто и очень хитро.
В закрытой системе всегда и везде дешевле и быстрее делать сразу без ошибок, чем насаждать проблемы, а потом их исправлять. Это не зависит ни от бюджета, ни от критичности задач.
Если грубо считать качество в наработке на отказ, то понятно, что бюджеты под разные критерии разные. Как в айти, так и в нормальном производстве.
Если сковородка может сломаться через полгода, можно взять дешёвую сталь, простое покрытие и китайских рабочих. Если нужен срок жизни в десять лет, то придётся брать хорошие материалы, дорогие технологии и made in Germany.
Если мы можем игнорировать, что от сайта отваливается один пользователь из тысячи, можно быстро сварганить что-то простое. Если потеря одной финансовой транцакции грозит штрафом на полмиллиона, придётся подробно продумывать архитектуру, выбирать надёжные библиотеки и серьёзно заниматься тестированием.
Но при этом «быстро и просто» не значат «плохо».
Если сайт сделан так, что от него отваливается каждый десятый, то мы поимеем головную боль, постоянные авралы и бездонную дыру, куда проваливается бюджет. И хвастаться, сколько сэкономили на быстрой и простой разработке и отсутствии анализа, тоже не получится.
И тут надо вспомнить об игнорируемой всеми хитрости.
Авралы, расходы и головную боль мы поимеем только тогда, когда система закрыта. Если она открыта, все эти радости достанутся кому-нибудь другому.
Деньги на то, чтобы не наплодить багов, не потратили мы, а расходы на борьбу с ошибками несёт кто-то другой.
Пользователь вылавливает данные, заливает в Excel и исправляет ручками. Но это его время и его проблемы.
Заказчик терпит убытки из-за дефектных компонентов и открывает у себя отдел тестирования, ухлопывая десятки человеколет на то, предотвратить что мы могли бы, вложив один человекомесяц. Но это наши деньги, а то - его.
И, конечно, нам пофиг, сколько времени и сил потратят безымянные далёкие посетители нашего замечательного вебсайта, пытаясь побороть наши баги, или, тем более, пользователи наших замечательных фришных библиотек, которые бьются с непредсказуемыми ошибками и общей кривизной архитектуры.
Плоские конечные автоматы, построенные на таблицах переходов и обменивающиеся сообщениями, - это дешёвый и эффективный способ получить надёжно работающие сложные системы.
Но это никому нафиг не надо. Мы сидим у истоков пищевой цепочки пожирающих время и ресурсы багов, и нас совершенно не волнует, что мы выпускаем в большой мир.
Copyright
(CC BY-NC-ND 3.0)
vit_r, 2013
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
Перевод на английский запрещён, потому как нефиг портить хорошую вещь.
no subject
Date: 2013-06-20 11:12 pm (UTC)(repost) Про ёжика в тумане, зазнайство, языки программиро
Date: 2013-06-20 11:20 pm (UTC)no subject
Date: 2013-06-20 11:25 pm (UTC)no subject
Date: 2013-06-20 11:33 pm (UTC)no subject
Date: 2013-06-21 01:45 am (UTC)Это типичная физическая задача - выделить "самое главное", которое по совместительству достаточно просто, чтобы его можно было до мельчайших деталей обсудить. Разумеется, это "самое главное" - сильносвязанная часть.
Т.е. по-хорошему, таким вещам нужно учить на школьных уроках физики. Вроде бы, в паре школ и учат.
no subject
Date: 2013-06-21 06:19 am (UTC)no subject
Date: 2013-06-21 08:04 am (UTC)Начальник отдела программистов у нас на заводе почти то же самое говорит %) После инста было немного непривычно, там конечные автоматы преподавали, но довольно скупо.
В общем, даже удивилась, когда прочитала этот постинг. Я далека от тусовки "продвинутых" программистов, но мне казалось, что автоматы - нечто, мм, узко применимое... Ну у нас-то понятно почему такой подход - промышленность, все дела. Надёжность и отказоусточивость на первом месте. Всё-таки тормозные системы - это ещё более сурово, чем банковские переводы.
Про ёжика в тумане, зазнайство, языки программирования
Date: 2013-06-21 09:02 am (UTC)no subject
Date: 2013-06-21 09:29 am (UTC)Если это правило верно, почему же всякие Прологи/Хаскелли/что-либо еще более строгое, падающее(или вообще не поднимающееся) при каждом непродуманном чихе не вытеснило Яву/Кобол?
no subject
Date: 2013-06-21 03:44 pm (UTC)no subject
Date: 2013-06-21 05:37 pm (UTC)no subject
Date: 2013-06-21 08:18 pm (UTC)no subject
Date: 2013-06-21 08:19 pm (UTC)no subject
Date: 2013-06-21 08:19 pm (UTC)Если с технологиями всё нормально, хотя информацию приходится искать, то со специалистами ситуация очень хреновая. Все хотят новых языков и фейсбуков.
no subject
Date: 2013-06-21 08:30 pm (UTC)no subject
Date: 2013-06-21 10:13 pm (UTC)Ну хорошо, MUSKOX напел. А Паваротти картавит и фальшивит.
no subject
Date: 2013-06-21 10:22 pm (UTC)no subject
Date: 2013-06-21 10:27 pm (UTC)no subject
Date: 2013-06-21 11:39 pm (UTC)Кто будет разбираться с багами - зависит вообще от нетехнических аспектов типа контрактoв или сложивхейся практики или личной харизмы участников. в случае закрытой системы и пользователя-терпилы это лишь приведёт к тому что пользователь будет заниматься шаманством или всё равно лезть потроха, в засисимости от личной квалификации. Я сам проходил этот квест незадолго до отпуска - осваивал отладку по дизассемблеру, долго препирался с афторами в чатике ("я посмотрел код и не вижу никаких причин ему себя так вести", "но это после ваших изменений всё перестало работать?", "у нас нет исходников вашей программы, так что прогнать вашу ситуацию с отладчиком мы не можем", "это старый код, нам очень не хочется его трогать"), искал какие-то другие случаи, когда это проявляется.
А основная проблема, которую призвана решать открытость - что вендор окажется (или станет) сволочью, а это никакими приёмами проектирования не решишь.
no subject
Date: 2013-06-22 01:04 am (UTC)no subject
Date: 2013-06-22 05:49 am (UTC)Открытые и закрытые системы - это школьный курс физики. Причём, нормальные учителя рассказывают это классе в седьмом, потому что на этом строятся все экспериментальные измерения.
В данном случае закрытость-открытость рассматривается с точки зрения экономики. Которая, кстати, тоже прекрасно работает в случае программистского понимания термина.
no subject
Date: 2013-06-22 05:50 am (UTC)"Абрам! Кому ты веришь - мне или своим глазам!"
no subject
Date: 2013-06-22 10:57 am (UTC)Если есть языки/технологии/подходы, усложняющие написание некорректного кода, а значит снижающие время и стоимость исправления ошибок, однако они не получили широкого распространения, несмотря на достаточную способность менеджмента и ЛПР к подсчету затрат, то можно ли говорить о верности тезиса "В закрытой системе всегда и везде дешевле и быстрее делать сразу без ошибок"? В массовое следование мантре "хуже-лучше" и любовь к мертвой конине среди ЛПР верится с трудом.
no subject
Date: 2013-06-22 11:00 am (UTC)Откуда это-то вылезло?
no subject
Date: 2013-06-22 11:31 am (UTC)Неужто надо исходить из того, что управленцы в массе своей знают и умеют меньше зеленых бакалавров экономики/менеджмента?
no subject
Date: 2013-06-22 11:38 am (UTC)Там, где считать умеют, применяют правильные технологии.
no subject
Date: 2013-06-23 03:29 am (UTC)http://ru.wikipedia.org/wiki/Programmer's_Stone
no subject
Date: 2013-06-23 06:49 am (UTC)Если монстры вроде Вайнберга пишут, что не знают, что такое хороший программист и какими качествами он должен обладать, то не стоит серьёзно воспринимать каких-то двух клоунов, основавшие очередную религию "Чем крутые мы отличаемся от плохих недопрограммистов"
no subject
Date: 2013-06-23 06:52 am (UTC)Удалено.
no subject
Date: 2013-06-23 04:07 pm (UTC)Ибо всякая сложная наука неотличима от магии ;)
no subject
Date: 2013-06-24 06:13 am (UTC)no subject
Date: 2013-06-24 10:48 am (UTC)Не знаю, почему жуликов нельзя называть жуликами.
no subject
Date: 2013-06-24 05:00 pm (UTC)И демагогия у нас не запрещена. Комментарии в духе "Если не можете атаковать мысль, атакуйте мыслителя".
Ну вот недостойны они произносить свои речи. Недостойны высказывать свои идеи. Ведь они не подходят по критерию http://lurkmore.to/Сперва_добейся
Я понимаю, вы тут хозяин, но, как-то, право, неловко с вами в таком ключе общаться.
no subject
Date: 2013-06-24 08:28 pm (UTC)no subject
Date: 2013-06-25 05:38 am (UTC)У вас тоже описана дихотомия -- "применяет автоматный подход к моделированию" и "не применяет". Ну, или "знает об автоматном подходе" или "не знает".
По мне, дихотомии достаточно для качественного описания ситуации, потому что мы и в том, и в другом случае говорим о привычке:
"привычке разбираться в предметной области задачи и возможностях инструментов, когда решаешь задачи" против "привычке не пытаться разбираться в предметной области задачи и возможностях инструментов или не доводить этот процесс до конца". Вот вторые -- жуткие дилетанты, и у них, как правило, не только с автоматным подходом плохо, но и с ООАД, и с построением слоёной архитектуры, и даже с DRY. А почему? Потому что они допускают кашу из знаний у себя в голове, и не имеют привычки приводить голову в порядок.
Именно об этом я и хотел сказать ссылкой на Programmer's Stone.
no subject
Date: 2013-06-25 05:45 am (UTC)Не знаю, как нужно было читать, чтобы сделать такой вывод. Можно не применять, но думать в тех же терминах.
Человек, который начинает разбираться там, где нужно просто сделать, занимается фигнёй. Кстати, одна из самых частых причин вылета русскоязычных умных мальчиков. Когда сказали сортировку, они начинают писать библиотеку с нуля, "потому что стандартная не обрабатывает все случаи".
Потом, гуру в одной области будет бездарным дилетантом в другой. Это, кстати, относится и к попыткам многих программистов влезть в психологию от компьютеров, а не от психологических книжек.
no subject
Date: 2013-06-25 06:54 am (UTC)"Средний срок на перестройку мозгов - шесть месяцев, плюс надо ещё пару-тройку лет применения подхода, чтобы его освоить."
"Впрочем, будет работать любая методика, которая использует сообщения, конечные автоматы и таблицы переходов. Этот трюк изобретают вновь и вновь, потому что книжки старые никто не читает."
"Гораздо важнее, что не полностью определённая таблица для нормального, не знающего и не желающего знать программиста и для аналитика, владеющего технологией, коренным образом различаются."
Вы рассказываете про навыки, которые можно "знать и поэтому применять" и "не знать, не уметь, и поэтому не применять".
Но, поверьте, я навидался на таких "аналитиков", которые не применяют имеющиеся у них навыки, или применяют их не к месту. И приходил к выводу, что цель применения этих навыков -- чтобы разобраться, не должно быть цели сделать проект в таком ключе.
И ещё хотелось добавить про "Этот трюк изобретают вновь и вновь, потому что книжки старые никто не читает."
В ООАД применение моделей, основанных на конечных автоматах -- это стандартная методика, для которой в UML есть стандартные представления и подходы.
http://en.wikipedia.org/wiki/Communication_diagram
http://en.wikipedia.org/wiki/State_diagram
http://en.wikipedia.org/wiki/UML_state_machine
Вы хотите сказать, что ваши знакомые профессиональные программисты не знакомы с UML и ООАД? И Гради Буча они даже не читали?
Как же они сложные системы тогда строят? По наитию?
А вот полный автоматный подход, наподобие описанного в http://en.wikipedia.org/wiki/Automata-based_programming -- это уже извращение, мало где оправданное, но в основном по причине низкой наглядности, а не по причине того, что оно плохо решает проблемы.
На что вам другие комментаторы и указывают.
А как известно, "Readability counts".
no subject
Date: 2013-06-25 05:20 pm (UTC)Нравится считать себя маппером и плевать свысока на паккеров, да сколько угодно. Но нафига пытаться здесь проповедовать, этого я не понимаю. Смешно выглядит.
Я это здесь оставлю в таком виде, но отвечать я уже устал.
no subject
Date: 2013-06-25 06:30 pm (UTC)Двумерной, да даже пусть многомерной таблицей объяснять программу?
Такое нечего обсуждать, разве что, взять это как метафору полного перебора и анализа возможных состояний системы при построении этой системы.
Я так это и рассматривал.
>"неблокируемая система обмена сообщениями"
На практике такое редко встречается, разве что в embedded, где полностью контролируется окружение, сообщения не теряются и порядок их прихода не меняется (а ещё зачастую система обозрима и разрабатывается одним человеком).
Там deadlock может быть лишь по собственному недосмотру, но это никак не пример сложной системы.
Посмотрел бы я, как бы вы применяли подобную технологию, скажем, при анализе бизнес-логики на промышленных системах >1 млн строчек кода, где вам известно меньше одной десятой кода. Как там построить вашу таблицу?
Поэтому тоже рассматривал как метафору того, что нужно понимать, что происходит в системе и прорабатывать крайние случаи, раз даже в полностью контролируемом окружении умудряются делать баги и дедлоки.
>Но нафига пытаться здесь проповедовать
Проповедовать? o_O
Да нет, скорее, лишь попытался обратить внимание на то, что уровень пафоса там и тут сопоставим, и выводы сводятся лишь к тому, что "думать нужно, что делаешь, и где программа может неправильно работать". Оттуда и отсылка на Programmer's Stone, который именно и фокусируется на причинах недоразвитости этого навыка в людях.
no subject
Date: 2013-06-25 07:47 pm (UTC)Я бы на вашем месте этот бред стёр и не позорился.
Кстати, по вашей же терминологии вместо того, чтобы по мапперски разобраться, вы по-паккерски нагромождаете одну фигню на другую.
Впрочем, это не удивительно.
С вашей любимой википедии.
Знаете, мне на самом деле надоело. У Вас ещё право на два коммента, которые я бы на вашем месте не писал. После пятидесятого ЖЖ начинает сворачивать ленту комментариев, а я это не люблю. Так что всё просто закрою.