Expand Cut Tags

No cut tags
norian: (Default)
Программер на боевом посту

Подходы, методики, языки

Для каждого кусочка кода надо найти отображение между проблемной областью и системной семантикой, которая может решить проблему. Очевидно, чем меньше вариантов отображения, тем легче найти подходящий, особенно если он существует. Как каждая проблемная область, так и каждая проблема в ней характеризуется некоторым уровнем сложности. Редко можно изменить определение проблемы так, чтобы управлять уровнем сложности, хотя это и желательно. Обычно, чтобы найти наиболее эффективный путь сделать работу, можно лишь поиграть с системной семантикой.

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

В этой терминологии язык является некоторым мешком с семантикой. Например, С или Excel являются такими мешками, которые не содержат однако рецепта для решения проблемы. Специализированные для определённых предметных областей языки позволяют проще найти отображение для проблемы из этой области. Критерием выбора языка может служить простота отображения (наиболее простая программа) для данной проблемы. За исключением тривиальных случаев, выбор требует хорошего знания особенностей всех имеющихся мешков.

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

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

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

Есть языки, привязанные к определённым подходам. Smalltalk требует видения мира как набора объектов, Lisp тесно связан с лямбда-исчислением, что приводит к предложению еды из собаки вместо предложения накормить собаку.

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

Интересные методики состоят сразу из подхода и языка. Структурный дизайн Джексона (JSD) рассматривает задачи с чётко определяемыми свойствами и содержит детальные указания, как с ними обращаться. Если смотреть в оба глаза, JSD может хорошо послужить в своей области. За её пределами он не работает и не является средством решения любых задач.

В JSD есть артефакт того времени - алгоритм преобразования полученных диаграмм в код вручную. Сегодня он написал бы генератор кода, но на самом деле его диаграммы можно рассматривать как язык программирования, то есть он создал язык программирования для специализированного отображения области задач.

То же самое относится и к Бучу с его UML, и к каждой интересной методике. В ранних работах он и Румбаух тоже не использовали кодогенераторы, а показывали, что трансляция диаграмм является рутинной ручной работой, значит, несложной.

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

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

norian: (Default)
Хорошая композиция и бенефиты

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

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

Логики, изучающие систему аксиом, сталкиваются с тем же самым. Они говорят, что система должна быть "необходимой и достаточной". Необходимость и достаточность позволяют ясно видеть природу рассматриваемого явления и гарантируют, что следствия действительно относятся к рассматриваемой области, а не являются произвольными.

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

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

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

Основная сложность на этом этапе - реалистичная оценка продолжительности очистки. Чем больше мусора, тем больший эффект от очистки, но тем больше риск, что не хватит времени. В таких случаях может помочь вопрос "насколько сложна внешняя функциональность?" - если она небольшая, то можно рассчитывать на постепенное улучшение методом последовательных упрощений, даже если не видно всего пути.

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

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

В эпоху индустриального строительства мы имеем дело со многими физическими объектами (например, кирпичами), которыми неудобно управлять. Вместо того, чтобы сравнивать кучи кирпича с эталонными, чтобы определить необходимое количество, мы их считаем. Этот переход от физического уровня к информационному даёт нам огромное преимущество в управлении. Когда у нас есть множество чисел о поставках, транспорте и потребностях, их надо организовать в шаблоны. Мы составляем таблицы, и переход от информационной к концептуальной абстракции опять даёт преимущество.

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

Проблема в том, что мы не получаем преимуществ. Результаты обсуждения могут быть больше, чем предмет обсуждения, то есть обсуждение принесло отрицательное усиление. Мы можем получить выигрыш, только применяя новый кусок информации много раз или получая многократную выгоду от его использования вместе с другими частями.

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

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

norian: (Default)
Знание, а не кликанье

Программеры дороги, не так, как раньше, но всё-таки. Результаты их работы должны приносить прибыль компании. Проблема в том, что заготовители считают результатом только то, что можно пощупать и сосчитать. Результаты процесса разработки программ состоят в первую очередь в понимании проблемы, тестировании этого понимания в суровом виде собраных бинарников и вовсе не в кликанье при набивании кода в процессе изучения. Конечный результат - это то понимание, к которому они пришли по завершении процесса.

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

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

norian: (Default)
Уровень качества

Когда картёжник создаёт карту проблемной области и улучшает её, он должен понять, когда остановиться. Это относится ко всем уровням разработки. Обычно существует решение, которое существенно проще других и очевидно минимально. Может быть несколько способов его выражения, но они обозначают по сути одно и то же. Хотя высказывания типа "вы это узнаете, когда увидите" несомненно правильны, они не говорят, куда смотреть.

В качестве примера можно привести функцию для Win32 из книги Рихтера, которая, несмотря на попытку достичь максимальной ясности, не была упрощена в силу принятых соглашений:

DWORD WINAPI SecondThread (LPVOID lpwThreadParm) {
BOOL fDone = FALSE;
DWORD dw;

while (!fDone) {
// Wait forever for the mutex to become signaled.
dw = WaitForSingleObject(g_hMutex, INFINITE);

if (dw == WAIT_OBJECT_0) {
// Mutex became signalled.
if (g_nIndex >= MAX_TIMES) {
fDone = TRUE;
} else {
g_nIndex++;
g_dwTimes[g_nIndex - 1] = GetTickCount():
}

// Release the mutex.
ReleaseMutex(g_hMutex);
} else {
// The mutex was abandoned.
break;// Exit the while loop.
}
}
return(0);
}

Однако мы можем сделать это и достичь максимального уровня качества

DWORD TheThread(void *ThreadParm)
{
while(Index < MAX_TIMES &&
WaitForSingleObject(Mutex, INFINITE) == WAIT_OBJECT_0)
{
if (Index < MAX_TIMES)
Times[Index++] = GetTickCount():
ReleaseMutex(Mutex);
}
return(0);
}

Причём вместо

hThreads[0] = CreateThread(..., FirstThread, ...);
hThreads[1] = CreateThread(..., SecondThread, ...);

можно писать

hThreads[0] = CreateThread(..., TheThread, ...);
hThreads[1] = CreateThread(..., TheThread, ...);

и тем самым избежать поддержки нескольких версий одного и того же кода.

norian: (Default)
При определении атомов важно не совершить распространённую ошибку. Часто возможно автоматически разбивать их на части и достичь уровня кода без особых усилий. Но когда доходит до стадии разработки, начинается хаос. Настоящие проблемы не ушли, они просто просочились и стали ужасными внутренними интерфейсами, низкой производительностью, хрупкостью и т.д. Границы атомов моделирования сжимались и сжимались .. пока не стали опять границами всей системы. Доктрина механического дробления без сверки с реальностью привела ко многим трагедиям в разработке.

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

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

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

norian: (Default)
Атомы моделирования

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

Опытные планировщики проектов знают, что выявление атомов и управление ими очень важно для удержания контроля над проектом. Сначала находятся атомы моделирования. Затем архитектор системы на основе интуиции находит ещё не решённые, но имеющие решение проблемы. Эти проблемы и определяют ход разработки, поскольку никто не хочет заниматься разработкой невозможной или неправильной архитектуры.

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

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

А как может литературная критика повлиять на холивары? Некоторые из них, конечно, ведутся для развлечения, и негуманно лишать людей маленькой радости подвергнуть беспощадной критике недостатки любимых тулзов и технологий их коллег. Но зачастую интеллигентные на вид люди бывают пойманы на контрпродуктивных склоках, которые бесконечно крутятся в цикле. Мы забываем, что мы можем использовать лишь структурированные аргументы и строго между нами. Когда начинается очередной холивар, задайте следующие вопросы:

Существует ли позиция верхнего уровня, включающая обе точки зрения?
Есть ли различия в намерениях между позициями сторон?
Какова конечная цель?

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

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

norian: (Default)
На этом уровне программирования "литературная критика" может получить серьёзные преимущества от изучения шаблонов проектирования. Это куски архитектурных приёмов, более крупные, чем обычное управление вычислениями, потоками, обработка исключений и т.д. Также они очень мощные и переносимые. Шаблоны проектирования подробно описаны в книге гаммы, хелма, джонсона и влиссидеса, которые дают такое определение:

"описывает проблему, которая возникает снова и снова и предлагает схему решения этой проблемы, которую можно использовать миллионы раз разными способами"

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

norian: (Default)
Литературная критика и шаблоны программирования

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

В языке ассемблера команды могут выполнять всякие хитрые действия, но мы судим о них в первую очередь по названию (например, DAA - аккумулятор выравнивания десятичных величин). Хоты команда и её название соотносятся напрямую, более высокий уровень названия может скрывать действие команды, которая просто переставляет биты по некоторому алгоритму. Если мы видим, что на самом деле выполняет команда, означает ли это, что мы злоупотребляем мухоморами? Ответ на этот вопрос зависит от обстоятельств.

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

Мы можем получить строгий и элегантный стиль кодирования из разницы между намерением и действием. Рассмотрим следующий пример:

// Search the list of available dealers and find those that
// handle the triggering stock. Send them notification of
// the event.

for(DealerIterator DI(DealersOnline); DI.more(); DI++)
if(DI.CurrentDealer()->InPortfolio(TheEvent.GetStock()))
DI.CurrentDealer()->HandleEvent(TheEvent);

Определения объектов позволили лаконично выразить намерения в действии. Однако, здесь нельзя разбить код на более мелкие части и написать комменты так, чтобы они не были совсем идиотскими. Если мы чередуем комменты и код на этом естественном уровне, все строки кода окажутся объяснены в комментах. Поэтому есть мотивация разработать объекты или функции так, чтобы сохранить этот уровень. При этом легче исправить неэлегантный код, чем объяснять его кривизну в комментах.

Осознание разницы между намерениями и действиями помогает также совместить детальное документирование и комментирование кода, заодно помогая его верифицировать. Размещая всё в одном месте, мы способствуем когерентности уровней. Эта концепция развита в "литературном программировании" кнута, хотя и требует инструментальной поддержки. Но не обязательно покупать всё снаряжение, чтобы заниматься этим видом спорта - литературное программирование больше жизненная позиция, чем инструмент.

norian: (Default)
Ангелы, драконы и философский камень

Наши предки были не менее сообразительными, и когда рано темнело, одним из немногих развлечений была игра с содержимым собственной головы. Понимание некоторых античных головоломок как образцов мышления картёжников прошлого полезно не только как интересный факт, но и как демонстрация возможностей интеллекта. Это то, что может дать нам контроль как над рабочими процессами, так и над всеми жизненными процессами.

Одной из горячих тем была бесконечность. Концептуально бесконечность довольно проста - достаточно сказать "всегда" и понятие готово. Возможная бесконечность несколько сложнее - если поручить кому-то считать всегда, можно получить бесконечный ряд чисел. Однако если получить бесконечное количество каких-то предметов, например, капусты, они заполнят бесконечный объём и больше ни для чего во вселенной места не останется. Но всё ещё есть возможность бесконечного числа бесконечно малых объектов - например, ангелов. Таким образом было бы возможно разместить бесконечное число танцующих ангелов на острие иглы.

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

Что касается драконов, они ревут и изрыгают пламя, их рёв настигает быстрее ветра, они хранят драгоценные камни в подземельях. Они живут в южной америке, китае, уэльсе. Они едят людей. Они черви, и античный символ мироздания - гигантский червь. Они - тот концептуальный сосуд, в котором предки собрали то, что мы называем тектоническими явлениями. У них не было идеи, что мир состоит из твёрдой коры, плавающей вокруг жидкого ядра, но они собрали все эффекты вместе, составив карту на основе прямых наблюдений. Дракон занимал место реальных вещей на их ментальных картах, пока они не изучили реальные процессы, которые производят эффекты драконов.

А алхимия? Напрасные поиски способа превратить дешёвый металл в золото и быстро разбогатеть? Алхимические преобразования состояли из серии операций, проводимых оператором. Они закончились там же, где и начинались, но в этом процессе восприятие мира оператором изменилось. Знание оператора углубилось,
и именно оно, а не вещества в тигле, действительно изменилось. Возврат к началу необходим, чтобы наглядно показать, что то, что было неясно, теперь прояснилось. Алхимия есть составление карт.

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

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

Созидательность и ответственность орготональны, а не противоположны. Можно совмещать удовольствие от использования своих способностей на пределе и выполнять взятые на себя обязательства перед коллегами.

norian: (Default)
Составление карт как процесс

Цель разработки софта - удостовериться, что необходимые заказчикам программы успешно выполняются на их компьютерах.

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

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

norian: (Default)
Основные хинты составления карт - 2

7. Интенсивный отдых

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

8. Выход из заколдованного круга.

Чувство возбуждения от эффективного размышления в фоновом режиме отличается от того затхлого тошнотного чувства, когда мозг исчерпал все возможные варианты и нуждается в эмпирической пище. Очевидно, не хватает каких-то ключевых данных или же вся модель кривая. Дайте ему больше данных, поговорите с кем-нибудь. Может быть, надо прочесать проблему частым бреднем. Если это баги в программе, вставьте печать после каждой строчки и сбросьте в лог. Затем внимательно изучите его за чашкой кофе. Конечно, это потребует много времени - а у вас есть идея получше? Если это ужасный набор асинхронных событий, нарисуйте их вручную на листе бумаги. Это позволит рассмотреть каждое по отдельности и возможно даст новые линии в расследовании ещё до середины этого занятия.

9. Ступор и стратегия своппинга

Существуют виды тупизма, свойственные только картёжникам. Они могут впасть в ступор, пытаясь оптимизировать слишком большую последовательность, которая не может уместиться в голове. Например, решить задачу про волка, козу и капусту для целого зоопарка. Современные ОС, когда им не хватает страниц памяти, применяют стратегию своппинга, выгружая ненужные страницы на диск. Это помогает очистить память для более важных процессов. Так что не впадайте в ступор - просто решайте небольшие задачи по очереди.

10. Одевание пододеяльника

Выверните пододеяльник, просуньте руки внутрь и возьмите дальние углы. Затем возьмите углы одеяла через углы пододеяльника и стряхните пододеяльник поверх одеяла. Немного практики, и вы сможете делать это менее чем за 30 секунд.

norian: (Default)
Основные хинты составления карт

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

Картёжники редко справляются с бытовыми неурядицами, но зато когда им это удаётся, это может быть весело. Обычно они обходятся без общепринятого процесса воспитания, так что до всего доходят сами. В составлении карты можно научиться очень многим вещам, обмениваясь опытом с другими.

1. Утруска проблемы.

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

2. Незаметный рост и стихийные бедствия

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

3. Ограничения

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

4. Возможные превращения

Если у вас есть зелёная утка, розовый лев и зелёный лев, попробуйте выяснить, как можно получить розовую утку. Понимание возможных и невозможных превращений приводит к лучшему общему пониманию проблемы и некоторые превращения могут оказаться полезными для её решения.

5. Задом наперёд

Все знают, как проходить лабиринты из детских книжек, да?

6. Жонглирование

Можно определить, как идёт составление карты, по бессознательным чувствам уверенности, беспокойства или раздражения. Чтобы восстановить уверенность, можно предпринять короткий тур вокруг проблемы, посмотрев на неё в другом масштабе или с других направлений. Это похоже на то, как жонглёр подхватывает предметы прежде, чем они упадут на пол.

Profile

norian: (Default)
Norian

January 2026

S M T W T F S
    1 2 3
45678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Syndicate

RSS Atom

Style Credit

Page generated Jan. 3rd, 2026 05:10 pm
Powered by Dreamwidth Studios