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

О блоге

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

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

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

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

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

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

понедельник, 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 тысяч лье под водой" или "Таинственный остров".

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

четверг, 2 января 2025 г.

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

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

Фильмы

Веном: Последний танец (Venom: The Last Dance, 2024). Третья часть мне понравилась больше, чем вторая. Хотя есть ощущение, что фильм полностью держится на юморе + еще немного на хорошей графике. Тем не менее, как аттракцион, который позволяет отвлечься от повседневных забот, фильм отличный.

Блуждающая тень (The Shadow Strays, 2024). Отличное кино для любителей жанра "кровавое мочилово". Хотя, имхо, до уровня первого "Рейда" чутка не дотянули, но очень старались.

День Шакала (The Day of the Jackal, 1973). Посмотрел его после одноименного сериала 2024-го года. Общего не так уж много, так что можно смотреть практически как самостоятельное произведение. Полагаю, что для своего времени было отличное кино, но сейчас это совсем уж ретро.

Задержанная (Detained, 2024). Средней паршивости кино. Производит впечатление телеспектакля, а не художественного фильма. Можно глянуть, если больше вообще уже нечего смотреть.

Безмолвное братство (The Order, 2024). Наглядный пример того, как потенциально интересную историю превратить в унылое говно.

Ручная кладь (Carry-On, 2024). Откровенная халтура. Причем и как по сюжету, так и по исполнению.

Сериалы

День шакала (The Day of the Jackal, первый сезон, 2024). К происходившему на экране есть несколько серьезных вопросов, но в целом понравился. Возможно, это лучший сериал из увиденных в 2024-ом году.

Чужак (The Outsider, 2020). О просмотре не жалею, но и не впечатлил. Сделано добротно. Но, имхо, можно было бы на пару серий и подсократить.

Горький 53 (первый сезон, 2024). Есть ощущение, что съемки этого сериала организовали чтобы пристроить большое количество известных еще 10-15 лет назад хороших актеров. Видеть их приятно, они стараются и мастерства у каждого на десятерых, но общее впечатление от сериала средненькое. Слишком много вопросов к сюжету, а развязка оставляет вопрос "И это все?" Может быть создатели планируют продолжение?

Боевой ангел (Machine, первый сезон, 2024). Все очень простенько, наивно, прямолинейно и предсказуемо. Но в этом есть свое очарование. Так что лично мне вполне зашел как раз потому, что можно не вдумываться в происходящее. Еще бы экшОна с мордобоем бы побольше, зашел бы еще лучше :)

Вне категории

Присяжный номер два (Juror #2, 2024). У меня просто нет цензурный слов: что бы так слить собственный фильм в унитаз Клинту Иствуду нужно было сильно постараться. Вот зачем нужно было историю главного героя раскрывать в самом начале? Это же убило всю интригу. Мне совершенно непонятно. Расскажи судьбу Джастина Кемпа в финале картины и получилось бы совсем другое кино, гораздо более интересное и с неожиданным поворотом в развязке.

вторник, 31 декабря 2024 г.

[work-n-life] Послесловие к уходящему году и поздравления с НГ

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

Кроме того, в предновогоднюю пору лента в LinkedIn-е стала напоминать выставку тщеславия: у каждого второго наполеоновские планы, а у каждого третьего достижений за минувший год больше, чем у самого Цезаря. ИМХО, нужен такой предновогодний пост, прочитав который люди вроде меня почувствовали бы себя нормальными, выдохнули с облегчением, мол, а ведь у меня все не так уж и плохо, а может даже и вполне себе хорошо. Так что если вам нужна подобного рода терапия, то вы попали по адресу 😉

В профессиональном плане уходящий 2024-ый год оказался ровным и ничем не выдающимся, сплошная рутина: получаешь новую задачу, вникаешь, куришь бамбук, экспериментируешь, делаешь, тестируешь, доводишь до ума, получаешь новую задачу, вникаешь, куришь бамбук... И так снова и снова. Разительное отличие от нервяка и неопределенности 2019-2021 гг.

Очень надеюсь, что так продолжится и в 2025-ом.

С другой стороны, 2024-ый оказался безрадостным для наших собственных открытых продуктов. Два небольших релиза для SObjectizer, всего одна статья на Хабре и ничего нового в RESTinio 🙁 При этом, далеко не факт, что в 2025-ом получится выкраивать больше времени на собственный OpenSource, постараемся, конечно же, но последние годы научили не загадывать далеко наперед.

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

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

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

Ну вот как-то так, 2024-ой год прошел тихо и спокойно, без потерь и достижений. Планы на будущий год простые: прожить его.

Своим же читателям пожелаю счастливого Нового Года. Пусть все будет хорошо! И пусть ваш 2025-й будет гораздо лучше, чем мой 2024-й 😜

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

[life.audiophilia.diy] Итоги уходящего года в сфере бюджетной аудиофилии

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


Итак, начнем с побывавших в моих руках ЦАПах.

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

VE Megatron. Мои впечатления полностью совпадают с тем, что было рассказано в обзоре от Soundcheck39: отличное качество звука и огромная мощность за смешные по аудиофильским меркам деньги. Правда, в моем случае Megatron не работает от моего смартфона, видимо не хватает питания, которое телефон выдает по USB. Ну и у меня нет (пока?) настолько высокоомных наушников, для которых потребовалась бы вся мощь Megatron-а -- даже 300омные вкладыши с LCP-диафрагмой приходится слушать на минимальной громкости. Так что всю прелесть Megatron-а еще не оценил.

Hiby FC6. Просто лучшее, что побывало у меня в руках. Знаю, что есть и отрицательные отзывы, но мне нравится то, что слышу. Отдельный вопрос "а стоит ли он своих денег в сравнении с конкурентами?" Но у меня нет на него ответа, т.к. я на него собственных денег не тратил. И, наверное, за свои кровные не купил бы.

Главная проблема с FC6 в том, что в реальности он прожорливый -- по моим замерам 0.14A на 5V. Что сравнимо с Colorfly CDA M1, который выжирал более 10% аккумулятора за час. А это очень много для меня. Так что если много слушать FC6, то телефон приходится заряжать каждый день 🙁


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

14.2mm от Huayunxin на 16 ом. Отличные по техничности динамики с шикарной серединой, отменной 3-х мерностью, но с проваленными самыми низкими частотами (по ощущениям, все что ниже 50Гц играет очень тихо). Как попробовал их, так и использовал на ежедневной основе месяца полтора. Пока не возникло ощущение, что звук детальный, приятный по тоналке, с отличными атаками... Но какой-то пресный. Взял после них более басовитые модели и понял в чем дело: самых-самых низких НЧ то и нет. Осознал это не сразу, но когда осознал, то это начало преследовать, поэтому редко их слушаю. Так что любителям хороших НЧ не советую. А вот ценителям светлой подачи вполне может зайти. Главная проблема -- это найти корпуса для динамиков такого диаметра, шеллы на 14.2mm редкая штука на Aliexpress, поэтому я в качестве доноров использовал какие-то совсем дешевые наушники за один или полтора доллара.

15.4mm динамики на 18 ом с "рупорной" (horn) композитной диафрагмой. Скажу так: бывают динамики для выслушивания деталек на ВЧ, а это динамики для выслушивания деталей на НЧ. Сильный упор на НЧ и СЧ, высокие отведены далеко назад, хотя с сохранением детальности, но эти самые детали на ВЧ нужно очень и очень тщательно выслушивать и даже разыскивать. Зато НЧ мощные, глубокие и ни капли не ватные. В общем, динамики для настоящих басхэдов и ВЧ-фобов. Стоят вменяемых денег, плюс идут сразу с MX500 корпусами.

14.2mm динамики на 32 ома с пометкой 6H. Внезапное и приятное открытие. Стоят недорого, а звучат раза в два-три дороже. По крайней мере я для себя отличия этих динамиков от более дорогих с LCP и DLC диафрагмами слышу, но не уверен, оправдывают ли эти отличия разницу в цене. По звучанию у них нет уклона ни в светлую, ни в темную сторону, хотя они чуть потемнее и пожирнее, чем DLC. Все так, как мне бы и хотелось. ИМХО, просто отличная модель за свои деньги, а особенно хороши будут для людей с небольшими ушами, которым вкладыши с 15.4-мм динамиками носить не удобно.

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


Пару слов о корпусах и кабелях.

У меня побывало штук пять или шесть разных типов корпусов для динамиков размером 15.4mm. Самыми удобными в итоге оказались вот эти металлические корпуса. Причем, как мне показалось, они делают звук более глубоким и басовитым по сравнению с деревянными и пластиковыми корпусами. На втором месте с большим отрывом от всего остального классические черные MX500.

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

И вот о кабелях: за год переделал/починил несколько пар наушников используя беспонтовые кабеля из магазина 3C-Accessories Store и пришел к выводу, что сменные кабеля от NiceHCK, OpenHeart или ivipQ, за $10 или $20, -- это хорошо, конечно же, но и простой кабель за $4 делает свое дело ничуть не хуже.

Ну и в повседневной жизни кабель с простым 3.5мм джеком оказывается гораздо практичнее, чем в 4.4мм балансным 🙁


А теперь о неожиданном состоянии, в котором оказался после того, как попользовался Hiby FC6 с месяц или около того.

Перестал понимать какие динамики звучат лучше, а какие хуже.

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

Тогда как с Hiby FC6 практически все, что у меня есть в наличии, звучит круто.

Да, звучит по разному.

Если у динамиков нет НЧ, то FC6 не совершит магию и не возьмет НЧ ниоткуда. А если ВЧ задвинуты далеко назад, то вперед их FC6 не выдвинет.

Но все равно наушники звучат круто. По разному, но круто.

И в итоге я перестал понимать что лучше, а что хуже.

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

И вот теперь как-то с этим нужно жить. Раньше были поиски лучшего звука. Теперь же непонятно что искать, т.к. уже имеющееся уже звучит 🙂

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

Думаю, что единственное, что еще хочется попробовать -- это нормальный плеер с Android-ом. Что-то вроде Tempotec V6 или уровнем повыше. Чтобы можно было и файлы с SD-карты, и Yandex.Music, и из Telegram, и из VK. Как раз то, что дает смартфон, но чтобы качеством уровня FC6.