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

О блоге

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

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

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

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

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

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

четверг, 13 февраля 2025 г.

[prog.c++] Где брать информацию о современном C++?

Зафиксирую в склерознике несколько ссылок, которыми я сам регулярно пользуюсь и которые висят у меня в разного рода закладках. Чтобы самому проще было найти все это при необходимости.

All C++20 core language features with examples. Шпаргалка с примерами кода, иллюстрирующими нововведения в C++20 (только сам язык, без стандартной библиотеки).

Modern C++ Programming. Набор презентаций с рассказами о самых разных аспектах языках C++. Покрывает большой объем стандартов C++: от C++03 до C++26 на данный момент. Фундаментальная штука, такое ощущение, что если ознакомиться с материалом, то можно найти шпаргалки практически по всем аспектам языка.

Конечно же, cppreference. Но тут нужно знать что именно искать ;)

Working Draft Programming Languages — C++ Текущий драфт последнего C++ного стандарта. Там же можно найти и драфты конкретных стандартов, если вы знаете их идентификатор. Например, вот драфт C++20: N4861, а вот драфт C++23: N4950 (полагаю, все это описано здесь).

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

пятница, 7 февраля 2025 г.

[life] Ролики с YouTube про восхожения на Эверест и коммерческий альпинизм

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

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

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

Но это моя личная точка зрения, никому ее не навязываю. А если кому-то еще окажется интересна эта тема (вплоть до возникновения и реализации мечты "покорить" Эверест), то вот набор роликов с YouTube, которые лично мне показались наиболее интересными.

Ген высоты

Сергей Ковалёв. Как взойти на Эверест

Владимир Котляр. Взойти на Эверест. Фильм о восхождении на крышу мира

Еще у Владимира Котляра появился плейлист "Экспедиция на Эверест 2024", сам я его пока не смотрел, но ссылку на всякий случай оставлю: тыц

Алла Мишина. Старт в альпинизме после 50: личный опыт от Килиманджаро до Эвереста

Анна Шурышева. Восхождение на Эверест от и до. Акклиматизация, подготовка, рекомендации

Ну и, конечно же, "Ген высоты 2", хоть он и не про Эверест

суббота, 1 февраля 2025 г.

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

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

Фильмы

Граф Монте-Кристо (Le Comte de Monte-Cristo, 2024). Монументально и красочно. С визуальной точки зрения безупречно. Размах и масштаб почти такой, какой и ждешь от экранизации. Но мне лично показалось, что если бы в сюжете фильма было меньше отклонений от первоисточника, то часть происходящего на экране выглядела бы намного драматичнее.

Короли интриги (2019). Получил удовольствие. В большей степени от операторской работы, но и сюжет хороший, и игра актеров мне показалась убедительной.

Один день в Стамбуле (2024). Типичное кино от "Квартета И". Но, далеко не такой шедевр, как "О чем говорят мужчины". Так что смотреть можно, а вот ждать "Вау-эффекта" не стоит.

Охота на воров 2: Пантера (Den of Thieves 2: Pantera, 2025). В отличии от первой части вторая оказалась на редкость занудной и затянутой.

Похищение искусства (Art Thief, 2023). Очень простенько и бюджетненько. Но не без некоторой интриги. Можно глянуть если больше вообще ничего нет.

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

Сериалы

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

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

Черные голуби (Black Doves, первый сезон, 2024). Вот честно, лучше бы я это не смотрел. Во-первых, там гомосексуальная повестка в полный рост. Во-вторых, после развязки остается ощущение, что нам попытались втереть какую-то лютую дичь.

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

[prog.c++] Интересная постановка вопроса: если люди испытывают сложности с многопоточностью, то не забанить ли многопоточность совсем?

Этот вопрос всплыл на днях на r/cpp. Позволю себе процитировать значимую часть поста с reddit-а без перевода:

Hi all,

Had an interesting discussion today and would appreciate some advice.

Multithreaded code can be especially tricky for medium to junior level developers to write correctly. When a mistake is made, it can result in difficult to find bugs.

If the application you are working on needs to be very reliable (but isn't safety critical), what would you recommend for medium/low experience c++ teams?

Assume that the application will need to do 4 things at once and can't use state machines or coroutines. The various "threads" need to regularly exchange less than 10 KB of data a second.

Do you ban threads?

A few approaches come to mind.

#1 train the team to know the dangers and let them use threads with best practices. More experienced (and paranoid/diligent) developers carefully audit.

Any suggestions for books/resources for this team?

#2 and/or use a tool or technique to detect concurrency issues at compile time or during test? Thread sanitizer? cppcheck? ???

#3 ban threads and force concurrency to be implemented with multiple processes. 4 processes each with 1 thread. The processes will communicate with some form of IPC.

Т.е. смысл в том, что для разработчиков уровня middle/junior написание мультипоточного кода зачастую оказывается слишком сложным. И если приложение должно быть надежным, то возникает вопрос: как же быть? Может быть проще вообще запретить многопоточность в пользу многопроцессности? А если не запрещать, то что? Учить людей? Использовать какие-то инструменты для тестирования и анализа корректности кода?

Признаться, комментарии на reddit-е к этому посту я не читал, только просмотрел мельком и не увидел того, чего хотел 🙁

Поэтому выражу эмоции в этом блог-посте.

Хватить себя обманывать -- писать низкоуровневый многопоточный код сложно не только middle/junior-ам, но и senior-ам. Не устану повторять, что многопоточность на голых нитях, mutex-ах, condition_variable и, ниприведихоспади, atomic-ах -- это пот, боль и кровь.

Поэтому если у вас есть возможность не писать многопоточный код, то не пишите его.

Однако, такая рекомендация звучит очень похоже на банальность вида "хочешь быть здоровым -- будь им". Столь же бесполезная.

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

Если нужно, значит наш путь лежит в многопоточность. Если не нужно, то выдыхаем и не паримся (до поры до времени).

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

Ну а раз не обойтись, что вопрос уже не в том, запрещать многопоточность или нет. Вопрос в том, как уменьшить количество головной боли при использовании многопоточности. И ответ на него достаточно простой: использовать инструменты уровнем повыше, чем голые нити и примитивы синхронизации. Акторы, сопрограммы, CSP-шные каналы, task-и и вот это вот все. Плюс идеология shared nothing во главе угла (в том смысле, что чем меньше у вас разделяемых мутабельных данных, тем меньше у вас проблем).

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

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


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

  • обеспечение надежности работы в условиях ненадежности используемых программных компонент. Например, мы вынуждены полагаться на стороннюю библиотеку, которая время от времени падает и роняет весь процесс, в котором ее используют. Библиотека не наша, мы не можем "довести ее до ума", можем только минимизировать причиняемый ею ущерб;
  • обеспечение надежности работы в условиях ненадежности внешнего оборудования и/или внешних сервисов. Например, к компьютеру подключено устройство, которое может зависнуть. И единственный способ вернуть его к жизни -- это убить процесс, который общался с устройством, переинициалировать устройство и начать работать с ним заново. Аналогично и со сторонними сервисами, с которыми мы можем общаться через HTTP(S) или еще какую-то форму IPC. Бывает, что такой сервис набирает от нас N запросов и перестает подавать признаки жизни до тех пор, пока все эти N запросов не будут принудительно прекращены;
  • возможность жесткого прерывания длительных операций. Например, какой-то математический расчет, который может занимать часы и который не так-то просто прервать "изнутри". Но вот если вынести этот расчет в отдельный процесс, то этот процесс легко "прибить" в случае необходимости;
  • простота и удобство реконфигурации "на лету". Иногда работающий в режиме 24/7 сервис нужно переконфигурировать без его останова, но из-за внутренней кухни и/или особенностей использованных в нем библиотек, сделать такую переконфигурацию затруднительно.

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

  • в Unix-ах нужно избегать возникновения зомби-процессов;
  • после принудительно убитого дочернего процесса могут оставаться различные следы жизнедеятельности (в виде .tmp-файлов, которые не были вовремя удалены), которые нужно подчищать;
  • если взаимодействие идет через shared-memory, то нужно как-то определить а доверяем ли мы текущему содержимому блока разделяемой памяти или же внезапно умерший дочерний процесс оставил там какой-то мусор...

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

Но аргументы "за" такой переход точно не должны быть из категории "однопоточное программирование проще многопоточного".


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

суббота, 4 января 2025 г.

[life.books] Кратко о книге "Ковчег 47 Либра"

Когда-то давно, году в 2005-ом или 2006-ом прочитал отличный научно-фантастический роман "Стая" Франка Шетцинга. Сильно тогда впечатлился. Ощущения были как будто в детстве читаешь произведения Жюля Верна, где фантастические события базируются на научной основе.

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

Однако, несколько месяцев назад почему-то захотелось перечитать "Стаю". Ни с того, ни с сего.

Нашел, перечитал. Впечатление, конечно же, не такое яркое, но все равно получил удовольствие.

Внезапно возникло желание прочесть еще что-нибудь из фантастики. Но что именно?

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

А тут как-то случайно через ролики на YouTube узнал о существовании Бориса Евгеньевича Штерна. И о том, что он пишет научную фантастику. Решил попробовать что-то из его произведений прочитать. Наугад попал в "Ковчег 47 Либра". И не смог остановиться.

Вот прям такое же ощущение, как в детстве, когда читаешь жюльверновские "20 тысяч лье под водой" или "Таинственный остров".

Мне отлично зашло. Настолько, что захотелось оставить зарубку в склерознике.