понедельник, 12 февраля 2018 г.

[prog.flame] Про тупость и отношение к ней.

Походу, когда я вижу в обсуждении между программистами вот такое:

"Хочешь надёжный код — откажись от классов, наследований, мутаций и прочей шелухи."

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

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

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

пятница, 9 февраля 2018 г.

[management] Есть повод вспомнить о теме KPI

Те, кто читают мой блог давно, могут вспомнить, что когда-то я заострял свое внимание на теме KPI (Key Performance Indicators). Правда, с уходом с наемной работы эта тема меня волновать перестала. Но вот на днях на глаза попалась большая статья: "Утомленные KPI: как формальная оценка эффективности подрывает работу". И тема сама собой вспомнилась.

Посмотрел, что я в свое время писал. И вот эти три поста перечитал с большим интересом. Уже даже не верится, что это я писал.

  1. Вновь KPI: подмена понятий и погоня за краткосрочным эффектом (часть первая)
  2. Вновь KPI: подмена понятий и погоня за краткосрочным эффектом (часть вторая)
  3. Вновь KPI: подмена понятий и погоня за краткосрочным эффектом (часть третья)

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

Тем не менее, если кто-то не читал этих трех моих постов про KPI, то почитайте. Хуже не будет :)

четверг, 8 февраля 2018 г.

[prog.c++] SObjectizer v.5.5.21 и so_5_extra v.1.0.4

Мы обновили свои инструменты для упрощения разработки сложных многопоточных и/или событийно-ориентированных приложений на C++. SObjectizer обновился до версии 5.5.21, а дополнительный набор инструментов над ним -- до версии 1.0.4.

Самое главное в этом релизе -- это появление в so_5_extra такой штуки, как асинхронные операции или просто async_op. Что стало логическим завершением темы, начатой некоторое время назад (пост №1, пост №2, пост №3). Асинхронные операции значительно упрощают реализацию эпизодических однократных взаимодействий между агентами. Происходит это из-за того, что асинхронная операция берет на себя задачи по подписке на нужные сообщения при начале асинхронной операции и по удалению подписок после того, как результат операции будет получен. А так же async_op берет на себя задачи работы с отложенными сообщениями, если для операции существует лимит на время выполнения.

четверг, 1 февраля 2018 г.

[prog.c++] Как я тут давеча выкрутился с тестированием...

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

namespace details {

class data_t : public std::enable_shared_from_this {
   struct handler_t : public std::enable_shared_from_this {
      std::shared_ptr<data_t> owner_;
      ...
   };
   std::vector<std::shared_ptr<handler_t>> handlers_;
   ...
};

/* namespace details */

templatetypename Message >
class definition_point_t {
   std::shared_ptr<details::data_t> data_;
   ...
};

Т.е. есть объект типа definition_point_t, который держит умный указатель на объект details::data_t. При этом внутри details::data_t есть контейнер умных указателей на объекты-хендлеры, каждый из хэндлеров так же содержит умный указатель на этот же details::data_t. Получается, что details::data_t не может быть уничтожен, пока у него список хендлеров не пуст. Да и сами хендлеры не могут быть уничтожены, пока есть details::data_t, который на них ссылается.

Это все означало, что ответственность за корректное уничтожение details::data_t лежит на тех типах, которые data_t используют. Это, в частности, тип definition_point_t. Соответственно, нужно было написать набор юнит-тестов, которые бы прогоняли различные сценарии использования data_t внутри definition_point_t, и проверяли, удаляется ли data_t в конце-концов или нет.

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

[life.cinema] Очередной кинообзор (2017/12 + 2018/01)

Возвращаюсь к публикации кратких кинообзоров. В этот раз сразу за два месяца, т.к. в конце прошлого года с кинообзором не сложилось. Итак:

2017.12

Первые четыре фильма в списке вполне себе ничего. Первый вообще отличный. А вот последние два -- отстой, особенно самый последний.

Скрюченный домишко (Crooked House, 2017). Отличная, выполненная в классическом стиле экранизация Агаты Кристи. Получил большое удовольствие от просмотра.

Счастливого дня смерти (Happy Death Day, 2017). Неплохая вариация на тему "Дня сурка". Хотя, как по мне, фильм рассчитан больше на тинейджерскую аудиторию.

Снеговик (The Snowman, 2017). Что очень понравилось, так это атмосфера. Действительно погружаешься в ту среду, в которой происходят события фильма. Но вот финал настолько ущербный, что напрочь перечеркивает все хорошие впечатления.

Между нами горы (The Mountain Between Us, 2017). Снято красиво. И актеры хорошие. Однако по ходу сюжета возникают вопросы, которые не дают нормально воспринимать происходящее (например, чем герои фильма кормили собаку пока выбирались из заснеженных гор?). Посему фильм не зацепил. А уж финал и вовсе оказался предсказуемым до невозможности.

Звёздные войны: Последние джедаи (Star Wars: Episode VIII - The Last Jedi, 2017). Красочно, конечно, все деньги на экране. Но если этот фильм и может кого-то зацепить, так разве что совсем маленьких детей.

Как Витька Чеснок вез Леху Штыря в дом инвалидов (2017). В двух словаях: Алексей Серебряков снялся в очередной чернушной социальной драме. Если кому-то такой жанр современного российского кино нравится, то смело можно смотреть. Мне, например, не понравилось. В том числе и из-за того, что авторы фильма не смогли поставить жирную точку в финале, оставив зрителя самостоятельно разбираться с якобы многозначительным многоточием.

2018.01

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

Приключения Паддингтона 2 (Paddington 2, 2017). Отличное кино для семейного просмотра.

Борг/Макинрой (Borg McEnroe, 2017). Любители спортивных драм могут посмотреть. Для остальных он может оказаться слишком неспешным и затянутым.

Ёлки новые (2017). Вообще не фанат этой эпопеи. Предыдущую часть вообще не смотрел. Эту довелось. Не шедевр, конечно. Но не раздражает и местами смешно, а иногда и симпатично.

Акты насилия (Acts of Violence, 2018). Такое ощущение, что несколько неплохих актеров собрались и замутили небольшую халтурку. Ну и результат соответствующий: халтура она и есть халтура.

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

Убийство в восточном экспрессе (Murder on the Orient Express, 2017). Сплошное издевательство над первоисточником. Кто читал оригинал, тому не смотреть. Кто не читал... Тоже не смотреть, лучше прочесть.

Короче (Downsizing, 2017). Снято прикольно. Некоторые сцены доставляют. Но в целом фильм не зацепил.

Открытая могила (Open Grave, 2013). Несмотря на наличие нескольких характерных актеров, получилось не пойми что. Можно не тратить свое время.

Субурбикон (Suburbicon, 2017). Посмотрел. Не проникся. Так что зачем смотрел не понятно. Потерянного времени жалко.

Безбашенные (Renegades, 2017). Все настолько прямолинейно, предсказуемо и скучно, что этот фильм может быть интересен разве что малолетним детям.

Ну и пару слов о Коловрате, но и не только

Попытался таки засмотреть новый российский фильм "Легенда о Коловрате". Хотя после обзора Клима Жукова у Гоблина было понятно, что ничего хорошего не выйдет. Но уж сильно много восторженных отзывов было у меня в FB-ной ленте во время премьеры. Захотелось составить свое собственное мнение.

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

В общем, говно редкое. И если это "символ возрождения российского кино", то мне очень жаль это самое российское кино... Если посмотреть на громкие российские премьеры в 2017-ом: Викинг, Притяжение, Легенда о Коловрате и Скиф, то как-то совсем печально. И это я еще "Движение вверх" не смотрел. Да и не собираюсь...

среда, 31 января 2018 г.

[prog.c++.flame] Простите, не могу удержаться от троллинга по поводу длинных имен... :)

Некоторое время назад довелось столкнуться на Хабре вот с таким мнением:

Мне не хотелось бы, чтобы появление простого синтаксиса вложенных пространств имён привело к росту их числа. По моему опыту программисты часто злоупотребляют: пишут длинный многоуровневый namespace (30-40 символов) там, где конфликтов имён быть не может, и в итоге просто неудобно пользоваться.
Заголовки потом выглядят отвратительно.
При этом я ничего не имею против namespace boost::detail, но даже boost::algorithm::any_of мне уже не нравится.

Вспомнил про это мнение, когда при написании Doxygen-овской документации к новой версии so_5_extra увидел в сгенерированном HTML-е вот такое полное название одного из классов:

so_5::extra::async_op::time_limited::details::msg_independent_part_of_definition_point_t<Operation_Data>

Пространства имен в C++ рулят и бибикают! ;)

понедельник, 29 января 2018 г.

[prog.c++] Библиотека RESTinio обновилась до версии 0.4.1

Мы обновили свою легковесную библиотеку для встраивания HTTP/WebSocket сервера в C++ приложение до версии 0.4.1. В этой версии мы поправили несколько недочетов и, самое главное для тех, кто любит Boost: мы сделали возможным использовать RESTinio совместно с Boost.Asio и Boost.Regex. Для этого, правда, нужен Boost-1.66 (ну что поделать, только в этой версии Boost-а Boost.Asio догнала standalone-версии Asio).

Так же мы работаем над тем, чтобы сделать RESTinio доступным через vcpkg и Conan. Но тут была засада с тем, что CMake вплоть до версии 3.10 не может распознать и подхватить Boost-1.66 под Windows. Как только CMake научится это делать, так мы сразу и... Ну, может быть не так сразу, но и... ;)

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

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

PS. Пока события развиваются так, что где-то к середине февраля мы закончим свои основные текущие работы. И, по сути, можно будет объявлять "свободная касса" :) Так что если кому-то нужны рабочие руки хороших C++ разработчиков, то мы можем предложить свои услуги.