суббота, 30 ноября 2013 г.

[life.cinema] Очередной кинообзор (2013/11)

Подошло время очередного кинообзора. Как обычно, в начале перечислены те фильмы, которые мне понравились больше всего.

Горько! Смешно!

Армагеддец. Хорошая комедия. Первые 2/3 фильма чуть не ржал в голос. Финал оказался несколько не в моем вкусе, но фильма не испортил.

Географ глобус пропил. Приятно, что это качественный российский фильм. Не понятно, правда, о чем и зачем.

Пленницы. Хороший, добротный триллер.

Тор 2. Монументально. Масштабнее, чем первый Тор. Но сказка, она и есть сказка.

Ведьмы из Сугаррамурди. Мне нравится такое сочетание треша, стеба и угара. Поэтому получил от фильма удовольствие. Но, подозреваю, что он сильно на любителя.

Малавита. При всей своей добротности и отличных актерах фильм весьма занудный.

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

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

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

Росомаха: Бессмертный. Редкая муть. И экшена в фильме не хватает, чтобы это компенсировать.

Паранойя. Скучный и неинтересный фильм. Не спасает его даже замечательная игра Гари Олдмана и наличие Харисона Форда и Ричарда Дрейфуса на вторых ролях.

пятница, 29 ноября 2013 г.

[life.sport.darts] Дата проведения Чемпионата РБ по Дартс -- 1 декабря 2013

Объявлена дата проведения Чемпионата Республики Беларусь по дартс 2013 -- это 1-е декабря. Участие в турнире бесплатное.

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

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

Кроме того, большой турнир -- это большой турнир. У него своя специфика, с ней нужно рано или поздно познакомиться лично. Никакие разговоры и байки "бывалых" этого не заменят. И если начинать участвовать в официальных соревнованиях, то Чемпионат самый лучший для этого момент. В том числе и из-за бесплатного участия. Плюс к тому, игры на Чемпионате, даже на групповом этапе будут до 4-х побед (а не до 3-х, как обычно), так что игровой практики можно хватить даже выше крыши :)

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

Это отнюдь не фантастика. Просто не нужно ждать, что это случится завтра по мановению волшебной палочки. К этому всего лишь нужно спокойно и поступательно двигаться. Небольшими шажками. Начав, например, с того, чтобы собрать на Чемпионате РБ не 50-60 игроков, как в последние годы, а 70-80, еще лучше 100. Чтобы на следующий год было уже 150, а еще через год -- 300. И таки я не рассказываю сказки, просто знаю по себе, как воодушевляет, когда после соревнований, на которых собирается 25-30 человек, вдруг оказываешься на турнире, где рядом с тобой еще 60 дартсменов.

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

Кстати говоря, от неформального дартс-клуба "Интервэйл-Гомель", к основанию и деятельности которого я приложил руку, на Чемпионат собирается поехать восемь человек. Уверен, что найдутся коллективы, которые нас переплюнут :)

PS. Перепосты, +1 и другие способы распространения этой информации всячески приветствуются.

PPS. Какое-то время эта запись будет висеть в самом верху блога.

[prog.humour] Это или явный перебор или совсем уж специфический стеб

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

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

это просто среда, посредник, medium. и medium is not just a message, it's little more than this.

medium это контекст для метациклического вычислителя этого сообщения, которое вычисляет каждый участнег — и немного по своему.

каждый участнег — такой метациклический вычислитель

знакомься, именно это и есть язык — та конструкция в голове, которая разворачивается у тебя в голове, участнег, читая эти строки.

Ну как, после прочтения метациклический вычислитель не зациклился? ;)

четверг, 28 ноября 2013 г.

[life.photo.humour] После Samsung Galaxy Camera мир стал другим :)

Сейчас на полном серьезе можно сказать, что чувак рядом со мной звонил по фотоаппарату. Хотя это казалось невероятным еще пару лет назад :)

[prog.flame] Прочел тут "критику" использования IDE

В очередном дайджесте новостей от dev.by проскочила ссылка на перевод статьи с критикой IDE: Культура IDE против философии Unix. Стал читать. По началу был поражен, весьма разумные вещи озвучены в начале статьи. Даже удивился, неужели dev.by хоть что-то путное разместил?

Чуда не случилось. Где-то с середины статьи начинается господство маразма. Сначала автор что-то стал говорить об отношении "один ко многим", т.е. что правильным подходом является работа одного разработчика над несколькими программами. Тут у меня закрались первые сомнения. Но когда автор завел старую шарманку на счет unix-style, тут-то уж все стало на свои места: пионерия на марше.

В общем, первая треть статьи интересна и ее можно прочесть. Дальше можно не идти.

Зато эта статья напомнила, что я ведь и сам далеко не сторонник IDE. И даже на заре своего блогерства описывал причины этого. Перечитал то, что написал почти пять лет назад. Полагаю, сегодня написал бы тоже самое.

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

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

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

[prog.c++11] std::function и лямбды дают возможность к применению ФПшных приемов

Допустим, нам нужно передать куда-то callback-функцию с тем, чтобы кто-нибудь ее в какой-то момент времени вызвал. Если эта функция не нуждается в специальном контексте, то все просто: достаточно передать простой указатель на функцию. Но такой вырожденный случай не интересен, обычно требуется, чтобы функция была связана с каким-то контекстом. Но как передать этот контекст?

Процедурный подход, практикуемый в C, подразумевает использование дополнительного аргумента для функции. Как правило, этот аргумент имеет тип void* и внутри callback-функции приводится к нужному типу. В качестве примера того, как это делается, если кто-то не понимает, о чем речь, можно посмотреть на POSIX-овую функцию pthread_create.

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

Сторонники Функционального Программирования (ФП), в которых комбинирование функций, являющихся к тому же замыканиями, зачастую насмехаются над C++ и Java разработчиками. Ведь им не нужно городить огород с декларациями интерфейсов и их реализацией. Достаточно просто объявить прототип функции. А потом передать в качестве callback-а лямбда-функцию (или что-то посложнее, вроде результата карринга). Что, действительно, гораздо лаконичнее и понятнее.

Защищаясь мы, приверженцы ОО-стиля, любили говорить, что если где-то ждут функцию с прототипом void(void), то туда можно одинаково легко передать как void say_hello(), так и void format_disk_c(), так и void launch_nuclear_missles(). Но, конечно, тихо завидовали функциональщикам, которые могли писать меньше кода :)

Однако, долго вынашиваемый и не так давно принятый стандарт C++11 дает и нам теперь возможность определять callback-и в почти что функциональном стиле. Ведь лямбда-функции в C++11 являются замыканиями. И сохранить на длительное время нужный контекст внутри лямбда функции можно, например, посредством std::shared_ptr.

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

[prog.management] Еще об управлении и актуальности "Просто сделай как я сказал"

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

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

А вот в разработке ПО есть своя уникальная специфика. Молодые разработчики (причем молодые как по возрасту, так и по опыту) имеют очень большую значимость. Они намного лучше ориентируются в самых последних технологиях, намного быстрее все осваивают, очень легко перестраиваются. Опять же, молодые и гибкие мозги позволяют им решать новые задачки (в основном связанные с изучением чего-то нового) гораздо быстрее, чем возрастным программистам. Так же еще специфика конктретно СНГ: у нас мало действующих программистов возраста 45+. Виной тому распад СССР и развал отрасли. Многие молодые люди тогда либо не пришли в профессию, либо ушли из нее. А те, немногие, что остались, благодаря своим способностям давно перешли из разработчиков в управленцы или владельцы своего бизнеса.

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

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

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

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

Собственно, вся упомянутая мной дискуссия -- это наглядное подтверждение тому, что можно потратить много времени и сил на объяснение причин, с которыми тебе приходится считаться. А итог нулевой.

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

Более того, обсуждая те или иные решения, мы, как правило, плотно задействуем "послезнание" (т.е. мы не можем абстрагироваться от знания последствий принятого решения). Даже те, кто принимал решение, могут со временем относится к нему иначе: значимость каких-то факторов оказалась преувеличенной, многие риски не сработали, события развернулись далеко не по самому худшему сценарию и т.д. и т.п. Что уж тут говорить о мнении людей, которым не нужно было это решение принимать, ответственность на них не давила, пусть даже они и находились рядом?

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

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

[prog.management] Небольшая ремарка про увольнения менеджеров

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

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

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

[prog.multithreading] Сломавшийся тест показал на просчет в моих предположениях

Многопоточное программирование -- это сложная штука. К этому утверждению можно относиться по-разному. Можно думать, что это преувеличение. И что тщательное отношение к делу, а так же использование "правильных" инструментов (будь то Haskell, Erlang или SObjectizer) полностью снимает сложность разработки многопоточных программ. Или, напротив, можно считать, что это слишком оптимистичное отношение к проблеме и, на самом-то деле, многопоточность -- это архисложно и практически никто не может делать это правильно. Каждая точка зрения имеет право на жизнь, ибо зависит от сложности задач, условий, в которых приходится искать решение, а так же профессионального уровня и величины собственного самомнения ;) Лично я уверен в том, что многопоточность -- это сложная штука. С ней можно справится, но легкой ее уж точно называть не следует.

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

[prog.management] Несколько причин, по которым начальник таки прав

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

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

воскресенье, 24 ноября 2013 г.

[life.sport.darts] Что-то меня сегодня порвали. На британский флаг :)

После того, как я похвастался успехами в игре против n01 нужно проявить последовательность и рассказать об сегодняшнем оглушительном разгроме 1-10:

В середине матча, где-то при счете 0-5 и 0-6 средние наборы были 72.5 у меня и 76.5 у n01. Среднее количество дротиков на лег у n01 -- 19.47 -- не совсем показательно. Это не означает, что все леги n01 заканчивал за 19-20 дротиков, было достаточно легов в 21-24 дротика. Но в ключевые моменты n01 очень лихо укладывался в 15-18 дротиков. Тем самым сильно деморализуя соперника, т.е. меня :)

Вот пример одного лега в 15 дротиков. Чтобы выиграть его мне так же нужно было уложиться в 15 дротиков (мое начало), но я не смог:

А вот еще один. Тут было начало n01 и чтобы выиграть нужно было укладываться в 12 дротиков. Задачка, думаю, для игрока уровня Фила Тейлора:

Ну а это лег в 12 дротиков, так же на начале n01. Т.е. чтобы выиграть, нужно было делать девять дротиков. Тут и Фил Тейлор бы не справился :)

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

Единственное светлое пятно сегодня -- это вот такое закрытие 125:

Первым дротиком бросал в 25, попал в Bull. Поэтому вторым бросил в 25, а третьим еще раз в Bull -- и попал! Мелочь на фоне такого разгромного поражения, но приятно :)