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

О блоге

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

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

суббота, 31 января 2015 г.

[work] Рекомендации для Артура Суднеко

Мой бывший подчиненный, член моей C++ной команды, Артур Суднеко, собирается переезжать в Минск. В связи с чем уходит из Интервэйл-Гомель и ищет себе работу. Как человек, который работал с Артуром с 2010-го года, могу отрекомендовать его следующим образом.

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

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

Интересное впечатление производил Артур на собеседованиях. Было очевидно, что передо мной не мега-гуру, который сходу может назвать раздел стандарта C++, описывающий чистые виртуальные деструкторы. Не харизматичный лидер, который через минуту после обдумывания любой проблемы озвучит план по ее решению и заразит всех окружающих энергией и верой, что так оно все и будет. Не лузер-неудачник, который во всем винит обстоятельства и козни недоброжелателей. Артур произвел впечатление очень хорошего человека. И, как показали затем годы совместной работы, так оно и оказалось. Открытый, честный, доброжелательный, трудолюбивый, скромный и неконфликтный человек, 100%-ный командный игрок.

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

Лично я опасаюсь, что некоторые особенности характера Артура (в частности, скромность, доброжелательность и тактичность) в совокупности с отсутствием энциклопедических знаний языка C++, могут помешать Артуру на собеседованиях. Ну что поделать, отличное знание C++ никогда не было его сильной стороной. Хотя то, что нужно по работе он осваивает не хуже других. Важно другое -- Артур не гуру, который может все. Это надежный тыл, без которого сложно браться за что-то большое и сложное. Именно это самое главное. Именно поэтому мне жаль, что он покидает Интервэйл-Гомель и еще больше жаль того, что собранная мной команда уменьшилась еще больше. Но такова жизнь, все течет, все изменяется.

В общем, если кто-то ищет себе хорошего командного игрока, то смело рекомендую Артура Суднеко. Его профиль на linkedin находится здесь.

При необходимости можно поговорить об Артуре Суднеко более подробно в приватном режиме.

четверг, 29 января 2015 г.

[prog.flame] Вот и выросло поколение...

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

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

среда, 28 января 2015 г.

[prog] Какая емкая характеристика!

Увидел на LinkedIn:

Опытный разработчик кроссплатформенных серверных приложений высокой надежности.

Совершенно без иронии. Хорошо человек характеристику для самого себя придумал. Даже немного завидую.

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

[prog.c++.sobjectizer] Разбор примера простой реализации дедлайнов для сообщений

В продолжение темы, начатой заметками "Реализация дедлайнов для сообщений своими руками" и "Агент-collector + агент-performer = паттерн для нескольких ситуаций", в SObjectizer добавлен еще один пример simple_message_deadline. Оказалось, что в данном примере задействуется много ключевых возможностей SObjectizer-а, поэтому имеет смысл разобрать пример подробнее, объясняя, по ходу рассказа, что к чему и почему. Рассказ я постарался сделать максимально простым и подробным, ориентированным на читателя, который либо вообще не имеет представления о SObjectizer-е, либо имеет самое поверхностное.

Что делает пример? Один агент-generator инициирует запросы, у каждого из которых есть дедлайн. Т.е. для запроса задано время, до наступления которого обработка запроса должна быть начата. Если этого не случилось, то запрос должен быть отвергнут.

Агент-collector, который собирает запросы от агента-generator-а в очередь и по одному отдает их агенту-performer-у. Агент-performer имитирует обработку запросов, затрачивая по четыре секунды на каждый полученный им запрос. За то время, пока агент-performer "занимается" обработкой, у части сохраненных агентом-collector-ом запросов может наступить дедлайн. Это контролируется агентом-collector-ом, который выбрасывает просроченные запросы из очереди.

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

четверг, 22 января 2015 г.

[prog.c++.sobjectizer] Кстати в догонку к предыдущему посту, про управление нитями

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

Просто все работает и все ;)

SObjectizer рулит, одним словом :)))