Показаны сообщения с ярлыком Инструменты. Показать все сообщения
Показаны сообщения с ярлыком Инструменты. Показать все сообщения

среда, 6 ноября 2013 г.

Истец, судья и адвокат дьявола

Критика и Адвокат дьявола

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

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

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

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

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

Переключение между ролями

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

По моему опыту, хорошо время на переключение делать где-то минимум в 5-6 минут. За это время — очистить эмоциональный фон и оперативную память. Слишком частые переключения череповаты.

Третья роль

В последнее время окончательно вырисовалась третья роль, в корне отличающаяся от двух, описанных выше.

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

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

Суммируя. Истец выдвигает идею и её защищает. Адвокат дьявола критикует. Судья устанавливает правила (обязательно до), и принимает решение (обязательно после).

Роли в дискуссиях

Часто в разных дискуссиях люди присваивают другим определенные роли (например человек A за идею X, B против X). По моему мнению, такое мышление погубно, и уже давно я научился и привык быстро переключатся между ролями Истца и Адвоката дьявола. Что интересно, исторически была уже масса случаев, когда народ откровенно не понимал мою позицию, пытаясь присвоить её к одной или противоположной точке зрения, и все непонимание получалось потому, что фактически моей личной позиции по вопросу попросту не было.

Аналогии

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


суббота, 22 сентября 2012 г.

Диагностика исключений

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

Короткий обзор

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

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

Все instance отправляются в коллектор и в дальнейшем при перехвате используются по усмотрению.

Детальный обзор

Рассмотрим нижеследующую функцию.

Она занимается тем, что парсит файл специального формата, проверяет корректность и укладывает данные в память в соответствии с внутренним представлением. Для иллюстрации и разбора важно только заметить, что она работает с одним файлом и использует другие функции, это get_utfmarker_line(), check_elements(), getline(), check_and_union_ranges().

void
parse_file( const std::string & filename ) 
{
    std::ifstream file( filename.c_str() );
 
    if ( !file.good() )
    {
        throw phone_ranges_error_t( 
            "Can't open file '" + filename + "' to parse." );
    }
 
    // Receive first line and cut marker (if it present).
    elements_t elements = get_utfmarker_line( file );
 
    // Parse all file and collect map.
    ranges_t ranges;
    while( true )
    {
        check_elements( elements, ranges );
 
        ranges_t::const_iterator it = 
            ranges.find( range_t( elements[0], elements[1] ) );
 
        if ( it == ranges.end() )
            ranges[ range_t( elements[0], elements[1] ) ] = elements[2];
 
        if ( file.eof() )
            break;
 
        elements = getline( file );
    }
 
    check_and_union_ranges( ranges );
 
    m_ranges = ranges;
}

Проблема

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

Как мы это можем сделать?

Ниже два примера, как это может быть реализовано традиционными методами.

Первый: добавить информацию в пролетающие мимо исключения

void
parse_file( const std::string & filename ) 
{
        std::ifstream file( filename.c_str() );

        try
        {
                ...
        }
        catch( const std::runtime_error & ex )
        {
                throw std::runtime_error( 
                        ex.what() + " parse_file filename:" + filename + ";" );
        }
 
}

Этот способ имеет ряд недостатков.

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

Во-вторых, нам нужно писать try и catch. И все содержимое функции сдвигать на одну табуляцию. Все это усложняет код, его понимание и сопровождение.

В-третьих, здесь происходит дополнительная операция конструирования объекта исключения.

Второй: передача параметра в контекст броска исключения

Один из способов:

void
parse_file( const std::string & filename ) 
{
        std::ifstream file( filename.c_str() );
 
...
 
        elements_t elements = get_utfmarker_line( file, filename );

...
 
                check_elements( elements, ranges, filename );
 
...

                elements = getline( file, filename );

...
 
        check_and_union_ranges( ranges, filename );

...
}

Здесь следующие проблемы.

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

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

Предлагаемое решение

Необходимо добавить всего одну строчку:

void
parse_file( const std::string & filename ) 
{
        ex_diag::reg<std::string> reg_file ( filename, "parse filename" );
...

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

catch ( ... )
        {
                std::cout << 
                        ex_diag::get_collector_instance().info() << std::endl;
        }

Или это произойдет само, если мы наследовались от исключения библиотеки:

catch ( const ex_diag::ex_t & ex )
        {
                // Dump will be at ex_diag::ex_t d'tor.
        }

В завершение

Инструмент межплатформенный, проверенный, с тестами и примерами.

Проверялся с помощью VC7 и GCC.

Обертки работают для любых объектов, которые можно отправить в std::ostream.

Проектировалось для минимального синтаксиса и минимального использования ресурсов.


пятница, 18 ноября 2011 г.

Const Generator в Google Code

Const Generator перезжает в Google Code.

Переезд и публикация больше для теста и опробации. А за ним вероятно поедут и другие свои разработки.


суббота, 5 марта 2011 г.

Инструментарий

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

Google

Google Alerts
Удобная вещь для ловли новой узкоспециализированной информации по всему интернету.
Google Docs
Работа с документами, которые требуют онлайна или взаимодействия множества пользователей.
Google Picasa
Хранение онлайн фото - тех, которые возможно нужно кому-то показать или использовать в любой момент времени.
Google Translate
По умолчанию массовый текст перевожу именно им. Если что-то более точное, то Lingvo. Если онлайновые страницы для чтения по диагонали - то Google Translate как плагин Chrome. Это решает все задачи помощи по переводу практически полностью.
Google Health
Личная онлайн-медицинская карта. Сейчас стараюсь фиксировать в ней по максимуму. Удобная и практичная вещь (хранение медицинской истории и информации по здоровью в одном доступном месте). Единственно что реально тормозит в полное внедрение и не устраивает - это использование не метрических единиц, а во всем только буржуйских. Например они недавно только сделали сохранение роста в см и веса в кг, а ранее был рост в дюймах/футах, а вес в фунтах. Но остальное пока что не меняется, а например записывать температуру тела в фаренгейтах совсем не хочется. Но думаю они с этим справятся. И к нему инфраструктура подтягивается (например весы, которые автоматически записывают показания в аккаунт). У продукта есть конкурент HealthVault от Microsoft.
Google Chart API
Графики, формулы, диаграммы, … и все это вставляемо в HTML. Т.е. можно быстро и просто давать URL, который описывает структурный элемент. При этом не нужно париться с картинками и прочим.

В ближайшее время планирую подключится к Google Latitude. Когда появится умеющий это делать девайс.

Несколько ресурсов гугла пользовал и бросил: iGoogle, Google Calendar, Google Bookmarks,Google Desktop, Google Notebook.

Оформление страниц и документов

tohtml.com
Оформление кода и других форматов в HTML.
Редактор формул
В ряде случаев бывает практичней Google Chart API.

Online

Декодер кодировок
Не только хорошо декодирует, но и показывает, как делает преобразование.
Будильник
Единственная потенциальная проблема - отсутствие электричества до утра и исчезновение будильника.

Разное

Comapping
Online инструмент для создания графических связных карт (интеллект-карт). Хорошо использовать при работе в онлайне и при одновременном доступе. Бесплатность обуславливается созданием нового ящика раз в 3 месяца. В оффлайне же схемы можно собирать в XMind.
Thinking Rock
Рабочий инструмент для организации дел по GTD. Легкий и бесплатный.
Doodle
Удобный инструмент для голосований, организаций митингов и пр., особенно для случаев, когда люди не работают в одной системе (например организации, месте) и при этом не нужно никаких лишних движений - только ссылка.
Dropbox
Описание.

Для меня оказался одним и самых эффективных открытых инструментов последнего времени. Некоторые отличительные действия:

  • Работаем в команде над одними и теми же файлами. Кто-то расшаривает папку и команда получает доступ. В любой момент времени кто-то редактирует файлы, добавляет и пр., а Dropbox автоматически синхронизирует. В результате не нужно знать специфичных действий как в SVN, фиксация делается автоматически, работа идет с любой машины, где есть Dropbox и инет, обрабатываются любые типы документов.
  • Сохранение общих файлов данных. Например Thinking Rock БД сохраняю в Dropbox'e. Сам TR установлен на множестве машин. И без лишних телодвижений получаем работу с одними и теми же данными с разных точек.
  • Помещение приложения в Dropbox. Например тот же QIP можно сохранить в Dropbox, и открывать его со всей историей и настройками на разных машинах. Тут и в предыдущем пункте только нужно закрывать приложение при выходе на каждой машине, и сами данные не должны быть слишком большими (скорость инета и размер ящика ограничены).
  • Использование других ресурсов с Dropbox. Например сторонние инструменты задействуют Dropbox для обеспечения сервиса (Boomp3).
  • Пример использования: torrentавтоматическая закачка. Создаем каталог в Dropbox для torrent файлов. На машине, которая Torrent, настраиваем его, чтобы он подхватывал файлы из созданного каталога и удалял оттуда, ставя их на закачку. В результате если мы находимся далеко, а нам нужно запустить torrent на предназначенной для этого машине, то мы просто torrent-файл отправляем в torrent-каталог Dropbox'a. Dropbox его синхронизирует, torrent-машина автоматически забирает этот файл и ставит на закачку.

Если кто будет регистрироваться, можно сделать это через этот линк - хуже не будет, а мне дадут 250 Мб свободного пр-ва :smile:


вторник, 26 октября 2010 г.

Const Generator

Собственный генератор констант приложения.