пятница, 8 мая 2020 г.

[prog.c++] Теперь и SObjectizer, и RESTinio перечислены в списке Awesome C++

В общем-то мелочь (на самом деле нет), а очень приятно: теперь и SObjectizer, и RESTinio перечислены в важном для C++сообщества списке Awesome C++.

Для нас, как разработчиков SObjectizer и RESTinio, это важно потому, что в мире C++ люди нередко начинают поиск подходящих для себя инструментов именно с Awesome C++. В этом смысле Awesome C++ -- это нечто вроде "желтых страниц". И теперь оба наших основных OpenSource продукта на этих "желтых страницах" перечислены.

RESTinio в Awesome C++ попал достаточно бысто. А вот включения туда SObjectizer-а пришлось ждать в течении нескольких лет. Поэтому большое спасибо всем тем, кто отдал свой голос за добавление наших разработок в этот престижный список!


Как обычно добавлю, что мы очень внимательно относимся ко всем пожеланиям и предложениям наших пользователей. Поэтому если вам чего-то не хватает в SObjectizer/so5extra, RESTinio или json_dto, то дайте нам знать. Постараемся учесть ваше мнение.

Так же, если у кого-то есть сложности в освоении и/или использовании SObjectizer и RESTinio, то не стесняйтесь, спрашивайте. Обязательно поможем. И еще с большим энтузиазмом поможем вам, если вы решите заказать у нас разработку, в которой будут использованы SObjectizer или RESTinio ;)

четверг, 7 мая 2020 г.

[prog.c++.fantasy] А что, если кто-то возьмет и форкнет C++?

И будет развивать свой диалект независимо от комитета. Причем вменяемый диалект, с преферансом и куртизанками прямо сейчас, а не после принятия C++26 или C++29?

Звучит вроде бы дико. Но вот мне давеча попалась ссылка на экспериментальный язык Circle. Это форк C++17 с дополнительными возможностями по метапрограммированию, но не только. Поскольку сейчас в C++ мне больше всего не хватает паттерн-матчинга для удобной и надежной работы с optional, variant и expected, то я пробежался по описанию того, что в Circle сделано в плане поддержки паттерн-матчинга.

И знаете что? Выглядит впечатляюще.

Вот пример:

#include <cstdio>

int main() {

  struct foo_t {
    int x, y, z;
  };
  foo_t obj { 345 };

  int Z = 6;
  @match(obj) {
    // Test an expression against the initializer.
    [_, _, 3]    => printf(".z is 3\n");  // structured binding
    [  .z: 4]    => printf(".z is 4\n");  // designated binding

    // Is Z a test/expression or a binding? If the clause fails, it's got to
    // be a test.
    [_, _, Z]    => printf("Z must be a binding\n");
    _            => printf("Z must be an expression\n");
  };

  return 0;
}

И вот какая мысль внезапно посетила мою голову: а вот что, если автора Circle возьмет "под крыло" какой-нибудь крупный игрок на рынке? Типа Facebook-а, Amazon-а, Bloomberg-а или IBM... И проект превратится из усилий энтузиаста-одиночки во вполне себе живой OpenSource продукт с солидной финансовой поддержкой за плечами.

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

Но вот если форк обещает совместимость с C++17 (т.е. старые кодовые базы на него перетащить не проблема) и, при этом, более оперативное и гладкое развитие в будущем? Развитие под управлением "мягкого диктатора", а не в результате компромиссов комитета? Когда вещи, типа метапрограммирования, паттерн-матчинга и дешевых исключений в нем появляются с темпом в 6-9 месяцев, а не спустя 4-5-6 лет обсуждений в комитете?

Лично я сильно сомневаюсь, что найдется кто-то, кто вложится в поддержку Circle. Но, думаю, если бы такой нашелся, то перспективы бы открылись интересные.

воскресенье, 3 мая 2020 г.

[prog.c++] По поводу стенаний на счет сложности выразительного C++ кода

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

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

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

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

При этом во мне еще была жива память о реализованном на продвинутых C++14 шаблонах easy_parser из RESTinio. И я уверен, что если бы была возможность сделать тот же самый разбор, но с применением easy_parser, то и времени бы это заняло в районе получаса, ну может быть часа. И кода было бы написано меньше. И надежность всего этого была бы выше. И работало бы это все быстрее.

Можно сказать, что на собственной шкуре проверил историю, которую когда-то рассказывал Максим Янченко (aka jazzer с RSDN), про быструю и дешевую реализацию парсеров на Boost.Spirit.


Какова мораль?

Переусложнить можно все что угодно.

Но фичи C++ действительно дают возможность писать меньше, а результат получать качественно.

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

пятница, 1 мая 2020 г.

[prog.c++] К сожалению, не всегда есть возможность применять SObjectizer, а хотелось бы...

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

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

Ну а раз это старый чужой код, то SObjectizer-а там нет и в помине.

И вот на этом фоне временами становится очевидно, насколько бы проще оказалось бы доработка/сопровождение, если бы SObjectizer или что-то подобное в проекте использовалось бы.

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

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

Но ни акторов, ни CSP в проекте не было, запросы к ресурсу шли из разных рабочих нитей, причем сам ресурc не был отдельной нитью, это был объект, методы которого можно было дергать из разных тредов одновременно. Поэтому пришлось делать систему очередей на mutex-ах и куче condition_variables. Что оказалось сильно сложнее, чем если бы использовались SObjectizer-овские агенты.

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

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

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

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


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

Поэтому еще раз предлагаю тем, кто пишет код на C++, посмотреть в сторону SObjectizer-а.

Это бесплатный и свободный инструмент с большой историей. С поддержкой. С возможностью доработать под ваши нужды.

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

Поэтому зачем нужно жрать кактус и пердолится с голой многопоточностью когда можно взять SObjectizer или какой-то подобный инструмент... Я не понимаю.


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

Ну и да, если вам нужна помощь в разработке на C++, то вы можете обратиться к нам. Даже если это не связано, ни с SObjectizer, ни с RESTinio.

среда, 29 апреля 2020 г.

[prog.c++] Ну и о наболевшем...

На языке C++ можно не торопясь, вдумчиво и обстоятельно писать код, который затем будет работать под большой нагрузкой. И, возможно, годами. А торопять и не вдумчиво не получится. По крайней мере так, чтобы код потом работал. Не говоря уже про работал долго.

На языке C++ невозможно налабать что-то полезное за 5 минут. Как из-за особенностей самого языка, так и состояния его экосистемы.

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

среда, 22 апреля 2020 г.

[prog.thoughts] Извините, что притащил к вам Егора Бугаенко, но...

...но думаю, что это интервью стоит того, чтобы высказать о нем несколько своих впечатлений. Итак, вот свежее интервью с Егором Бугаенко, которое появилось на днях на YouTube:

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


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

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

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


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

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

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

И, пожалуй, единственное, ради чего стоит потратить время и посмотреть данное интервью -- это получить представление о том, во что нельзя превращаться.


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

четверг, 16 апреля 2020 г.

[prog.c++] Послесловие к релизу RESTinio-0.6.6

На неделе была выпущена очередная версия нашей библиотеки для встраивания в C++ приложения асинхронного HTTP/Websocket сервера: RESTinio-0.6.6.

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

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

Взлетит или не взлетит эта тема не знаю. Хотелось бы, чтобы взлетела. Т.к. C++ требует большого внимания со стороны программиста и не прощает ошибок, а REST API (и не только), как оказалось, на C++ таки вполне себе пишут. Ну а раз пишут, то пусть C++ компилятор помогает разработчику избегать глупых ошибок и опечаток.

Ну а если не взлетит... Ну не взлетит, что тут поделать.

В общем, по моему мнению RESTinio стал еще лучше и мощнее. Так что если кто-то сомневается пробовать или не пробовать, то имеет смысл попробовать ;)


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

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