Архивы по Категориям: Software design

Кто будет смотреть в дверной глазок, пока Вас нет дома?

Дисклеймер — этот пост содержит наглый, вызывающий, ничем не прикрытый ПЕАР!

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

А я задумался. Как бы так за полчаса, из говна и палок, соорудить нечто, что будет меня автоматически уведомлять о всякой подозрительной активности перед моей дверью? Покопавшись в ящике стола, я нашел там сотовый телефон Sony Xperia ST25. Нашел его и задумался. Камера 5 мегапикселей, больше, чем у телескопа Хаббл при запуске в 1993. Два ядра. Олимп гигабайт оперативки. Да блин, на Марс летали и летают с меньшей вычислительной мощностью, это ж просто суперкомпьютер по меркам 80-х! Неужели его нельзя применить как-нибудь с пользой?

Походил я вокруг этого телефона и вот что задумал.

IMG_9685

Читать далее »

Время кидаться пальцами

Вышла новая версия буста. Теперь могу обоснованно заявлять, что в бусте присутствует и мой contribution в том числе.

 

Докатился…

Отправил баг-репорт в boost.

Будут молчать, придется пойти на совсем немыслимое — отправить им патч.

Однако, первый блин..

Нарисовал тут аппликуху для ондроида.


Get it on Google Play

Включает хотспот адным кнопом, да.

Это они серьезно?

На фоне якобы запуска якобы Самсунгом новой версии Tizen, на КЫВТе состоялось обсуждение API. Я тоже побыл соучаснегом.

All two-phase construction classes have the Construct() method, which must be called once right after the class is instantiated.

Two-phase construction is used to let the caller know about an exception raised in class constructors. Because Tizen does not use the standard C++ exception mechanism in the platform layer, it is impossible to let the caller know about exceptions raised in the class constructors

Это пипец.

Error handling in Tizen works differently compared to standard C++. Tizen uses error results instead of C++ exceptions, due to historical reasons.

All exceptions in Tizen are caught as the result return type. The E_SUCCESS result indicates a method succeeded, while all other result values indicate an error.

А это треш и угар. Due to historical reasons, ага. В 2013 году. Они ее во времена первых версий DOS разрабатывать начали, что ли?

Весь хелп здесь. Примеры использования доставляют до состояния «дайте мне ЭТО развидеть».

Зато авторы ЭТОГО, надеюсь, в сортировках разбираются и гномиков в боингах взвешивать умеют.

Профессиональное

Говорят, что по-настоящему понимаешь предмет, когда становишься способен доходчиво объяснить его.

В современном C++ появились rvalue references. Что это такое, в принципе понятно. Как это объяснить на пальцах — х.з.

Примерно такая же история с корутинами. Этот концепт настолько прост, что я всегда попадаю в тупик, пытаясь объяснить его в двух словах. Хотя конечный автомат внутри корутины — это интересно (правда, расточительно — целый стек пропадает).

Программеру на заметку: анализ managed crash dumps

Очень, очень полезная и всеобъемлющая статья.

Ставить в закладки совершенно обязательно.

О туннельном мышлении

Когда у тебя в руках молоток, то вокруг всё гвозди мерещатся.
Народная мудрость

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

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

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

У меня в практике был эпизод. Планировали мы новый модуль для системы. С самого начала было очевидно, что нам нужно будет изолировать фронт-энд от бэк-энда, то есть мы должны будем иметь как минимум два потока. Обычно в подобных проектах нам удавалось обойтись без многопоточности, на в данном конкретном случае это был единственный вариант. На слове «многопоточность» технического лидера (на тот момент) нашей команды конкретно заклинило.

Оказалось, что раз наш модуль многопоточный, нам совершенно необходима lock-free очередь. И даже не только очередь, а lock-free контейнеры (как потом оказалось, построенные на основе этой самой очереди). Причем очередь оказалась нужна еще до начала обсуждения архитектуры. Более того, оказалось, что обсуждать архитектуру совершенно не надо, ибо lock-free контейнеры суть решение всех проблем и нам надо всего лишь их реализовать и сразу наступит вселенское Щастье с большой буквы «H» (потому что по-английски). С этими словами он и кинулся эти самые очереди писать/выковыривать из других проектов. Да, прямо посередине первого обсуждения архитектуры. Еще до того, как мы определились даже не с фичами, а с требованиями (про stories и таски я даже не заикаюсь).

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

Результат оказался довольно предсказуем. Дикий срыв сроков, треш и угар в архитектуре, лингвини** в коде, чертовщина в багзилле, нервный тик у менеджера проекта. Вообще весь проект со стороны напоминал попытку впихнуть прямоугольную пробку в треугольную дырку. Ваш покорный слуга потом это рефакторил. Конейнеры эти в итоге оказались не нужны и были выброшены. В паре мест получил где-то 1000-кратное увеличение производительности просто за счет применения правильной архитектуры, еще в нескольких местах убрал несколько алгоритмов с якобы O(log N), а на деле хорошо если O(N) и заменил их на O(1).

В процессе рефакторинга, который скорее напоминал вскрытие, выяснилось, что весь дизайн программы своидлся к грубому приколачиванию модных lock-free гвоздями туда, где в них не было никакой нужды. Простейший анализ data flow показал, что обмен данными между потоками минимален и направлен в одну сторону, и применение lock-free контейнеров просто не давало никакой выгоды. Ну хотелось человеку их применить, и все тут. Более того, передовые лок-фри контейнероы оказались не thread safe в некоторых применениях, как бы ни смешно это звучало. Архитектура же модуля была представлена кучей строительного мусора, местам скрепленного гвоздями (жидкими). Вкупе с отстутствием юнит-тестов (стандартное — тесты писать некогда, копать надо!) рефакторинг этого превратился в увлекательный квест.

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

О результатах такого подхода можете догадаться сами.

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

Это свершилось

Постиг дао рекурсии. Написал юнит-тест для юнит-теста.

Новости технологий

Говорят, что буст и под айбблофон собирается.

Интересно, интересно. Если правда (сам проверить не могу за остутствием фруктовых продуктов как таковых), то будем заниматься весьма кросс-платформенным весьма программированием.

5 посетителей онлайн
1 гостей, 4 bots, 0 зарегистрированных
Максимум сегодня:: 10 в 02:26 am UTC
В этом месяце: 24 в 08-12-2017 12:58 pm UTC
В этом году: 50 в 02-12-2017 07:56 am UTC
За все время: 130 в 10-22-2014 11:16 pm UTC