вторник, 1 января 2030 г.

О блоге

Более двадцати лет я занимался разработкой ПО, в основном как программист и тим-лид, а в 2012-2014гг как руководитель департамента разработки и внедрения ПО в компании Интервэйл (подробнее на LinkedIn). В настоящее время занимаюсь развитием компании по разработке ПО stiffstream, в которой являюсь одним из соучредителей. Поэтому в моем блоге много заметок о работе, в частности о программировании и компьютерах, а так же об управлении.

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

понедельник, 31 декабря 2029 г.

[life.photo] Характерный портрет: вы и ваш мир моими глазами. Безвозмездно :)

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

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

четверг, 21 марта 2019 г.

[prog.bugs] Интересная ошибка, связанная с многопоточностью

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

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

среда, 20 марта 2019 г.

[prog] Тестов много не бывает...

В SObjectizer-е чуть менее 400 тестов. И когда вносишь ломающие совместимость изменения, то приходится изрядно попотеть, перелопачивая простыни старого кода, чтобы заменить устаревшие API-шные вызовы на новые.

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

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

Ну и да, традиционное: если у вас есть возможность не писать многопоточный код, то не пишите. А если вам все-таки нужно оный написать, то не опускайтесь на уровень голой многопоточности. Используйте лучше высокоуровневый инструментарий. Ну там акторов, CSP, task-flow, data-flow, STM и пр. Багов вы и там насажаете в свой код, можете даже не сомневаться. Но до такого траха, как с голой многопоточностью доходить будете гораздо, гораздо реже.

вторник, 12 марта 2019 г.

[prog.c++] C++Modules: there is no place for simplicity and beauty in C++?

C++Modules has been accepted in C++20. Nobody has a real experience with those modules and only few understand what C++Modules are. I don't understand that too. Moreover I don't read accepted Modules proposal yet. But I read a wonderful post "Understanding C++ Modules: Part 1: Hello Modules, and Module Units" and want to share some impressions.

It seems that simplicity and understandability weren't friends of C++ anytime in the past. But C++Modules lifts this up on another level.

It obvious that work on C++ standards is performed by very smart people. But sometimes you have to be as smart as they if not smarter to understand some of the new C++ additions and to find some beauty in them. C++Modules is an example.

Unfortunately I'm not as smart to participate in the evolution of C++ language. I'm just a (very ordinary) user of C++ and use C++ as a tool for solving my and my client's problems. Because of that, I can understand that there were some reasons to accept C++Modules in that form. But it's very hard to find and understand those reasons.

I can't understand why there are different types of module units (module interface, module implementation, module interface partition, module implementation partition, primary module interface) and very strange looking sentences like "export import :something;". Why not just:

module greeting;

export {

   public import another_module; // Instead of export import another_module.

   ... // Some ordinary C++ code.

// interface.

implementation {

   ... // Some ordinary C++ code.

// implementation.

If we have to deal with very big amount of code for a module we can simply use old #include directive:

module greeting;

export {

   public import another_module; // Instead of export import another_module.

   #include "some_declarations.hpp"
   #include "some_more_declations.hpp"

// interface.

implementation {

   #include "some_implementations.cpp"
   #include "some_more_implementations.cpp"
   #include "yet_more_implementations.cpp"

// implementation.

It's also hard to understand why modules and namespaces are orthogonal. Namespaces played their role in the pre-Modules world where we had only headers files and namespaces were used for "modularization" of C++ code.

But it's hard to imagine why we can write something like that:

import hello;

int main() {
   bye::tell();
}

From experience with different languages I expect that "import hello" introduces stuff from "hello" namespace. But in C++ we can "import hello" but receive "bye" namespace. Maybe there is some logic, but it seems also that "least surprise principle" doesn't live here.

I can suppose that there are some very important reasons why C++Modules and C++ namespaces are different entities. And I want to read the justification for this decision because as for me modules should make namespaces obsolete. With modules, we can get namespaces and nested namespaces (top-level modules and submodules).

Namespaces in C++ are open. It had two benefits in the past:

1. The content of namespace could be stored in several headers and source files. We opened namespace in one header file then reopened it in another file and so on.

But this benefit doesn't have sense with modules. IMHO.

2. An user can add specialization for its own types into external namespace.

But we can keep this benefit with modules if we add something like module's specialization (based on example from our json_dto library):

module json_dto specialization;

export {

   import my_module;

   template<>
   read_json_value( my_module::some_type & v, const rapidjson::Value & object )
   {
      ... // Specific version for some_type from my_module.
   }
}

Instead of conclusion.

I don't want to say that C++Modules proposal is bad. But it seems that C++Modules look much more complex than many of us expected. It also seems that C++Modules are intended to solve different problems than many of us can suppose.

It would be great to have some explanation about what C++Modules actually are, which problems they address, why C++Modules do it that way.

Without such explanation C++Modules remind me things like "export template" and "throw specification" from C++98 and "concept maps" from C++0x. They looked good in theory, but were deprecated or/and eliminated later.

суббота, 9 марта 2019 г.

[life.books] "Мастер своего дела": начал читать, дошел до первого примера, закончил читать

По случаю прикупил книгу "Мастер своего дела" Мортена Хансена. Хансен мне известен тем, что был соавтором у "гуру" Джима Коллинза при работе над "Великие по собственному выбору". В аннотации к "Мастеру своего дела" было сказано, что автор провел многолетнее исследование и выявил ряд привычек, которые присущи людям, демонстрирующим высокую личную производительность.

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

воскресенье, 3 марта 2019 г.

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

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

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

На краю (Cut Bank, 2014). Далеко не шедевр. Но мне понравился. Добротный фильм. Хотя какие-то вещи в итоге остались непонятными, что портит общее впечатление.

Море соблазна (Serenity, 2019). Сюжет для меня лично оказался "немного предсказуем", после где-то на последней трети фильма я уже понимал, чем все закончится и как будут оправдывать происходящее. Но вот визуальная составляющая выше всяких похвал: что ни кадр, то образец для изучения композиции и освещения.

Виновный (Den skyldige, 2017). На удивление неплохо. Прекрасный образец того, как можно построить напряженный сюжет только на одном персонаже и диалогах. Хотя некоторые моменты вызывают вопросы и портят впечатление, но сам факт того, что это датская картина, очень сильно и приятно удивляет.

Алита: Боевой ангел (Alita: Battle Angel, 2019). Понравилось исполнение, картинка радует глаз. Понравилось то, что это один из немногих фильмов за последние годы, который хоть как-то претендует на жанр научной фантастики. Сюжет не понравился. Да и само по себе это кино для детей.

Зеленая книга (Green Book, 2019). Мне не зашел. Довольно примитивно, сильно предсказуемо, никакой интриги. Такое ощущение, что целью фильма было скрыть ужас отношения к неграм в США даже спустя 100 лет после отмены рабства обаятельным главным героем. Мол, да, к неграм относились как к скоту, но ведь не все же, были среди белых и нормальные люди.

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

Правила бойни (Slaughterhouse Rulez, 2018). Редкая муть. Даже непонятно, как туда попали Саймон Пегг, Марго Робби и Ник Фрост.