четверг, 19 сентября 2013 г.

Способы предоставления информации

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

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

Мне известны три различных способа, каждый из которых имеет свои особенности и подходит для отдельных целей. Здесь их изложение.

Сократовский метод

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

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

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

Проблема → Способ её решения → Решение порождает новые проблемы.

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

Следующий шаг — описание решения. Т.е. мы описали что мы хотим решить, и только потом пишем, каким образом.

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

Таким образом, применение метода — последовательное выполнение ряда шагов (некоторые из которых могут отсутствовать):

  1. Проблема.
    1. Актуальность проблемы (зачем её надо решать?)
    2. Описание проблемы (в чем суть).
    3. Примеры.
  2. Решение проблемы — что предлагается/суть сообщения.
    1. Описание способа решения (она же теория).
    2. Примеры (они же практика).
    3. Особенности.
  3. Выводы.
    1. Значимые результаты.
    2. Какие были/остались проблемы.
    3. Что будет в будущем.

Но не только научные статьи пишутся в таком стиле. Теперь третье приближение к сократовскому методу — цитата о применении метода из книги И.Адизеса «Идеальный руководитель»:

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

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

Inverted Pyramid

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

Данный способ появился во время Гражданской Войны (Civil War, полагаю что в США). Все репортеры хотели передать с линии фронта домой свои истории с помощью телеграфа, но особенность в том, что они могли бы погибнуть в любой момент, или телекоммуникационные линии могли бы быть оборваны. Поэтому никто никогда не знал, сколько времени отведено на передачу, и необходимо было передавать самую важную информацию в начале, а менее важное — в последующем.

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

Таким образом, основная цель способа — захватить внимание читающего.

Burying the Lead

Lead — основной смысл сообщения. Burying — «закапывание». Т.е., целью является «закопать смысл сообщения». В данном контексте это может означать два основных замысла. Первый — смысл раскрывается в самом конце, второй — смысл закопан внутри и читателю предстоит его найти.

Основным ореолом обитания данного метода являются детективы, истории, анекдоты, пьесы и тому подобное. Читатель чаще всего заинтересован в поиске смысла и к этому подготовлен. Цель — неожиданная развязка или заставить о чем-то задуматься.

Комбинированные схемы

Совсем необязательно при написании использовать только одну из трех схем — их можно вполне успешно комбинировать.

Хорошим вариантом является написание некоторого заголовка или аннотации (lead), в котором содержится основной смысл статьи (core idea), раскрывающая суть, либо захватывающая внимание. А после lead'a можно использовать одну из других схем (сократовский метод для научных и технических статей, или burying the lead для публицистики).

Для иллюстрации этой схемы цитата Don Wycliff'a, победителя конкурса Editorial Writing (1996):

“I’ve always been a believer that if I've got two hours in which to do something, the best investment I can make is to spend the first hour and 45 minutes of it getting a good lead, because after that everything will come easily.”

Я всегда считал, что если у вас есть два часа на то, чтобы что-то сделать [написать], то лучшее, что я могу сделать, это потратить первый час и 45 минут на создание хорошего лида (lead), потому что после этого все остальное идет легко.


понедельник, 16 сентября 2013 г.

Эссенциализм как признак понимания предметной области

Когда-то, при прочтении книги А.Маркова «Эволюция человека», мною уловилось определенное нейробиологическое свойство нашего мозга, речь о котором пойдет ниже. Но прежде чем, небольшой отрывок из книги об этом (доступен онлайн):

Многие люди хотя и признают эволюцию, но при этом имеют весьма превратные представления о ее механизмах. Одной из причин недопонимания является присущий нашему мышлению типологический взгляд на животных: мы склонны видеть в каждой особи не индивидуальное существо, а представителя того или иного вида. Из-за этого мы оказываемся слепы к проявлениям внутривидовой изменчивости («медведь — он и есть медведь»). Данное явление тесно связано с так называемым эссенциализмом — склонностью нашего разума приписывать группам объектов, сходных по каким-то признакам, некую общую для них всех идеальную «сущность». Философы написали о сущностях гигабайты текстов. Я не философ и не считаю это недостатком. Но на одном философском сайте мне попалась мудрая мысль, под которой я с радостью подпишусь. Звучит она так: «У вещей нет сущностей».

Дэниел Неттл из Университета Ньюкасла (Великобритания), специалист по эволюции и генетике поведения, провел со своими студентами ряд экспериментов, которые показали, что понимание эволюции может быть улучшено, если в ходе обучения использовать «человеческие» примеры (Nettle, 2010). Как и другие преподаватели эволюции, Неттл неоднократно замечал, что студенты с трудом понимают основы дарвиновского эволюционного механизма, несмотря на всю его кажущуюся простоту и вопреки всем усилиям учителей. Некоторые типичные заблуждения основаны на недооценке внутривидовой изменчивости. Люди склонны думать о том или ином животном прежде всего как о представителе вида. Речь идет, конечно, не о зоологических видах, а о «народных», то есть о таких группировках организмов, которые имеют общеупотребительное название. Народные виды иногда совпадают с зоологическими («лев»), но могут соответствовать целой группе близких видов («дельфин», «медведь») или внутривидовым группировкам (например, собака и волк — два народных вида, которые, по современным представлениям, относятся к одному и тому же зоологическому виду).

Такое «типологическое» восприятие животных, вероятно, сформировалось у наших предков под действием отбора как полезная адаптация. У людей есть специализированные участки мозга, расположенные в височной доле (а именно в верхней височной борозде и веретеновидной извилине), отвечающие за классификацию животных и растений. Повреждение этих участков может привести к утрате способности отличить льва от мыши и ромашку от березы при сохранении прочих ментальных функций. Современные охотники-собиратели различают многие сотни видов живых существ — в отличие от горожан, у которых соответствующие участки памяти, по-видимому, забиты сортами шампуней, йогуртов и автомобилей (Yoon, 2009).

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

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

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

Это все теория. Что же может быть из неё полезного?

Признак понимания

Книгу читал год назад, но после несколько раз замечал следующий эффект: наблюдаем, что человек пользуется общими понятиями, не различая смысла более подробных. Например у него нет различия в таких парах, как «теория» и «гипотеза», «определение» и «доказательство», «погода» и «климат». Это говорит о том, что имеет место меньший уровень понимания предмета.

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

Таким образом, если человек различает более подобные понятия, то он лучше разбирается. Если пользуется общими словами, то хуже разбирается. При наблюдении подобного эффекта впоследствии результат прогнозируем и проверяем — меньший или уровень понимания предмета. Более высокий уровень понимания наблюдать сложнее, но можно (терракотовый цвет; использование разнообразных слов, когда кажется, что можно использовать одно).

Вредные обобщения

При контакте с небольшой выборкой целевой группы можно попасться на то, что могут сформироваться не совсем корректные суждения. Например, «X — поганый народ». Т.е. на основании единичной или малой выборки было сформировано внутреннее обобщение. Хотя известно, что в любой статистически значимой популяции можно найти индивидуумов с любыми чертами, только распределение вероятностей будет немногим различаться.

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


пятница, 13 сентября 2013 г.

Синглтоны языков программирования

Разбираясь с некоторыми вопросами высоконадежных систем, предназначенных для управления критически важных процессов информатизации (safety-critical systems), нашел некоторую особенность и попытался её разгрызть, почему сделано так.

Согласно стандарту ISO 61508 (сейчас он же действующий ГОСТ Р МЭК 61508), крайне не рекомендуется использовать динамическую память и динамические объекты (что для серьезных западных систем означает нельзя). Аналогичные требования есть в JPL Coding Standard (это ответственные системы NASA, например софт для марсоходов и МКС) и в MISRA C/C++(ответственные системы по умолчанию, например химическое производство которое может устроить катастрофу или автомобильный транспорт с тем же потенциалом для последствий).

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

Авторов всего этого понять можно: динамика поставила на колени далеко не один проект С/C++, а в последние годы много усилий ушло на уменьшение последствий от возможных проблем на данном минном поле.

Прошло какое-то время, прежде чем мною ощутилась разница между описанным первым (глобальной динамикой) и вторым (верифицированными структурами данных): отдельно разрабатываемые структуры данных играют (в том числе) роль специализированных менеджеров памяти, а поставляемые в коробке new/delete и malloc/free — синглтонов языка программирования.

Динамика как синглтон

new/malloc и delete/free работают глобально, в одной большой куче. Доступ к ней есть отовсюду. О том, как лучше работать с этой кучей — изобретается множество инструментов и техник, так как надо контролировать создание (только один раз) и удаление (только один раз и только после создания), обрабатывать ошибки (переполнение памяти), попадать куда надо указателем (неопределенное поведение) и типом (срезка), получать доступ и разделять ответственность. Фактически сама куча является глобальной структурой данных, поддерживаемой на уровне языка.

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

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

Синглтоны C++

Прошелся по языку и нашел следующие синглтоны:

  • new/delete
  • static
  • cout/cerr/cin
  • Ресурсы (файловые дескрипторы, коннекты, потоки, …).
  • Нелокальные макросы.
  • Указатели.

Т.о. язык предоставляет пользователю набор синглтонов в упаковке, готовых к использованию.

Свойства

Свойства очень похожи из того, что есть в оригинальном синглтоне. Для всех описанных (кроме макросов, они на этапе сборки):

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

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

Т.о., понимание синглтонов позволяет лучше ощутить источник проблем и ведет к светлому будущему (;


четверг, 12 сентября 2013 г.

Алхимики современности или неразрешимые проблемы

Раньше алхимики искали философский камень и способ превратить что-нибудь простое и подручное в золото. Т.е., каким-то простым действием (например хитрым ударом молотка и словами «крэкс-пэкс-фэкс») сделать из куска глины кусок золота. Закончилось все это тем, что простого способа не нашли (в настоящее время на это нужно потратить огромное количество энергии для ядерных реакций), но попутно было изобретено много чего.

Но алхимики никуда не исчезли. Они до сих пор среди нас, только декорации изменяются.

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

Современные примеры

Поиск серебряной пули

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

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

Поиск элексира вечной молодости

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

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

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

Знание языка

Имеется ввиду человеческого языка общения.

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

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

General Problem Solver

Это мое прогностическое мнение. Не существует универсального AI, решающего любую проблему. Есть много разных AI с разной эффективностью, и естественный интеллект не исключение.

Было и будет много разных интеллектов. Много предлагателей универсальных интеллектов. Много попыток его построить с провалом, но с косвенными плюшками.

Свойства

Все свойства расписаны выше, но здесь их явная систематизация.

Кроме того, мое контекстное определение. Неразрешимая проблема — такая проблема, которая решается частично, но не может быть решена полностью, либо полное её решение слишком затратно; мы можем решить её частично, и улучшить результат, но полного решения нет.

Полезность и бесполезность попыток

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

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

Множество предложений простого способа

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

Нет простого способа

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

Оптимизм

Есть вещи, которые не таковы, какими мы хотели бы их видеть. Очень хочется иметь философский камень, универсальный молоток, элексир молодости и пр.. Но реальность не такова.

Заключение

Когда каркас данного сообщения был готов, то перечитал Брукса (его Мифический человеко-месяц, где есть No Silver Bullet с историей 10 и 20 лет спустя). И с восхитительным удивлением нашел там следующую цитату:

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

Turski W. M. And no philosophers’ stone, either // Kugler H. J. (Ed.). Information Processing 86. Amsterdam : Elsevier Science, North Holland, 1986. P. 1077-1080.