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

О блоге

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

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

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

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

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

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

вторник, 6 октября 2026 г.

[prog.c++] Пара слов о докладе про переход от акторов к C++20 короутинам

На Хабре появился отчет "У нас есть «плюсы» дома: о чем говорили на митапе YADRO × C++ Russia", в котором опубликованы видео докладов "Make legacy great again: переводим зрелый проект на С++20-корутины" и "С++20-корутины в KvadraOS: как устроены и зачем внедрялись". Первый из этих докладов я посмотрел и, как разработчик акторного фреймворка для С++, имею что сказать.

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


Первая и главная, в том, что акторы, реализованные в виде объектов с коллбэками, плохо подходят для "линейного" кода. Т.е. когда ваш алгоритм выражается простой последовательностью шагов, вроде: сделали запрос к подсистеме №1, дождались ответа, сделали запрос к подсистеме №2, дождались ответа, сделали запрос к подсистеме №3 и т.д., то реализация его как актора превратит код в лапшу. Либо в совсем страшную, если все коллбэки представляются лямбдами, либо чуть в менее страшную, если коллбэки -- это обычные методы обычного объекта. Но все равно будет лапша из-за принципиального ограничения такого подхода -- коллбэк не должен "засыпать" и блокировать тред, на котором работает. Обработчик события должен максимально быстро сделать свое дело и вернуть управление фреймворку, отвечающему за вызов коллбэков.

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

auto r1 = subsystem_1.ask_something();
auto r2 = subsystem_2.ask_something(r1.some_data);
auto r3 = subsystem_3.ask_something(r2.some_data);
make_response(r3.some_data);

Будет что-то вида (псевдокод, не привязанный к конкретному C++ному фреймворку):

my_actor.on([&](start_signal) {
  send<ask_something>(subsystem_1).reply_to(my_actor);
});
my_actor.on(subsystem_1, [&](response & r) {
  send<ask_something>(subsystem_1, r.some_data).reply_to(my_actor);
});
my_actor.on(subsystem_2, [&](response & r) {
  send<ask_something>(subsystem_2, r.some_data).reply_to(my_actor);
});
my_actor.on(subsystem_3, [&](response & r) {
  make_response(r.some_data);
});

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

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

auto msg = receive_message();
switch(msg.type)
{
case event_1: ...; break;
case event_2: ...; break;
case event_3: ...; break;
}

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

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


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

Во-первых, потому, что виденный мной код акторов на CAF -- это лямбда в лямбде верхом на лямбде и лямбдой погоняет.

Во-вторых, потому, что в виденных мной примерах кода на CAF сообщения принято передавать в виде ad-hoc туплов. Все эти туплы приходится выписывать и в декларациях обработчиков сообщений, и в операциях отсылки сообщений. Что требует затем ручной правки всех этих мест в коде если тупл потребовалось изменить (например, добавить еще что-то в отсылаемое сообщение).

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

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


Отдельный вопрос в том, а акторы в принципе подходят под решение задач, подобных рассмотренной в докладе "Make legacy great again: переводим зрелый проект на С++20-корутины"?

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

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

Поэтому лично я бы при попытке подойти к подобной проблеме с акторами на перевес, попробовал бы сперва продумать схему "один актор на операцию". Т.е. актор для авторизации, один актор для выполнения запросов к БД, один актор для протоколирования и т.д., и т.п.

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

Так же, возможно, акторы были бы вполне уместны даже в схеме "один актор на запрос", но в случае, если у акторов коллбеки могут безопасно и дешево засыпать на синхронных обращениях к другим акторам, не блокируя при этом механизмы диспетчеризации событий в акторном фреймворке. Например, если каждый актор -- это stackfull короутина (fiber, green thread). Тогда актор запросто может заснуть на синхронной операции, а обслуживающий его тред ОС возьмет в работу какого-то другого актора. Но, во-первых, ни CAF, ни SObjectizer подобные акторы не поддерживают. Во-вторых, в докладе отдельно говорится про проблемы, связанные с fiber-ами.


Теперь пара слов о том, а можно ли получить лучшее из двух миров в одном флаконе, т.е. иметь возможность использовать и акторы, и C++20 stackless короутины.

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

Да, думаю, что можно.

И я пытаюсь научить SO-5 этому. Но не могу сказать, когда же это заработает на практике.

Тут нужно понимать одну простую вещь: SObjectizer напрямую не приносит нам денег, мы не зарабатываем ни на продаже SO-5, ни на его техподдержке, ни на обучении, ни на кастомизации SO-5 под чьи-то специфические нужды. SO-5 и RESTinio создают нам репутацию, которая приводит клиентов. Но клиенты платят за решение своих проблем в своем коде. И эти проблемы, в 99% случаев, вообще никак не связаны с SO-5.

Поэтому работы над SO-5 ведутся лишь тогда, когда для этого удается выкроить ресурсы. То, что могло бы занять 2-3 месяца нормальной работы над SO-5 в режиме "полный рабочий день", растягивается, буквально, на год, если получается выкраивать по 10-15 часов в неделю, да и то далеко не всегда. Посему поддержка короутин в SO-5, надеюсь, появится. Но не через неделю, и даже не через месяц, а может и не через два. Увы, такова се ля ви.

По текущему статусу добавления С++20 короутин в SO-5 могу сказать следующее: часть подготовительных работ выполнена. Дело уперлось в такое понятие, как event_handler_method_t. Эта штука предназначена для хранения обработчиков сообщений и сейчас она заточена только под синхронные обработчики. А нужно поддержать еще и асинхронные. И вопрос в том как это сделать.

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

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

понедельник, 5 октября 2026 г.

[comp.notebooks] От 14" ноутбука к 16" и обратно

Поделюсь очень неожиданным для себя самого открытием. В очередной раз на тему ноутбуков. Уж прошу простить мне эту слабость, т.к. в последние 25 лет работаю только на ноутбуках и для меня это инструмент, с которым я живу, наверное, в режиме 10/7, а иногда и 12/7.

Так вот, много лет подряд пользовался небольшими по размеру 13.3" и 14" ноутбуками. Была попытка в 2019-ом пересесть на 15.6", но в итоге эта пятнашка гораздо чаще использовалась (и используется) для обработки фото и просмотра кино, чем для работы, программировал же, в основном, на 14" ноутбуке.

Но постепенно стали накапливаться некоторые проблемы, вызванные как размерами 14" экрана, так и тем, что в современных 13" и 14" ноутбуках производители очень редко делают на клавиатуре отдельные кнопки Insert, PgUp, PgDn, не говоря уже про Home и End:

  • при созвонах в Zoom или Telemost собеседники часто показывали свои экраны. И если на той стороне большой дисплей с разрешением выше 2.5K, масштабируется на твой 14" экранчик, то читаемость заметно ухудшается (даже не смотря на то, что на 14" экране разрешение 2.8K);
  • если заходишь по RDP из Linux-а через Remmina на Windows машину, то качество шрифтов в окне Remmina оставляет желать много лучшего. Причем это проблема именно входа из Linux-а через Remmina, когда вход делаешь с Windows машины, то с качеством все гораздо, гораздо лучше. Но так уж получается, что в основном я работаю на Linux-е 🙁
  • в какой-то момент я стал в vim-е делить окно пополам для того, чтобы в левой части держать один файл (например, .hpp), а в правой части -- другой (.cpp). Тем самым охватывая взглядом фрагменты из разных файлов. На 14" это можно было сделать только очень сильно уменьшив размер шрифта, а работать так долго невозможно, быстро устают глаза;
  • на имевшихся в моем распоряжении 14" ноутбуках не было аппаратных кнопок Insert (привык пользоваться комбинациями Shift+Insert и Ctrl+Insert), Home и End. А на одном из них не было и отдельных клавиш PgUp, PgDn. Что со временем стало сильно раздражать, т.к. невозможно было двигаться по документам (в Word-е или в окне браузера) посредством одной руки. Например, держишь ноутбук на весу левой рукой, а правой пытаешься двигаться по тексту. Или же держишь в правой руке карандаш для записей в тетрадке, а левой выполняешь навигацию по документу (или даже нескольким документам).

В конце 2025-го года все эти факторы накопились + добавилось подозрение, что в 2026-ом новые ноутбуки могут заметно подорожать из-за роста цен на память и SSD. Появилось желание пересесть на 16" ноутбук пока есть возможность закупиться по старым ценам. Что и было сделано в январе 2026-го года.

Сперва был полный восторг. Особенно из-за того, что на 16" была полноценная клавиатура со всеми нужными мне аппаратными кнопками. В какой-то момент мне даже стало казаться, что 16" маловато, надо хотя бы 17.3", а еще лучше 18.4" 🙂

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

И тут я был шокирован тем, что возвращение на 14" не только не было болезненным, но вообще возникло ощущение, что я вернулся домой. Работать на 14", как будто бы, оказалось даже комфортнее, чем на 16".

Полагаю, что сказалось несколько факторов.

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

По RDP заходить на Windows-сервера клиентов приходится лишь изредка. Раньше к этому прибегать приходилось гораздо чаще. А когда делаешь это раз в неделю и всего на пару-тройку минут, то шрифты плохого качества проблемой не являются. Неприятно, но пять минут можно и потерпеть. Да и, как выяснилось, качество шрифтов в Remmina на 16" не сильно лучше, чем на 14".

Делить экран в vim-е на две части по вертикали практически перестал. Оказалось, что даже на 16" при комфортном размере шрифта этот режим далеко не всегда удобен. Тут в очередной раз хочу сказать спасибо тем разработчикам, которые считают, что ограничение на 80 символов в строке -- это пережиток прошлого. У меня на эту тему уже давно нет цензурных слов, поэтому промолчу.

Т.е. на 16" с разрешением 3200x2000 можно сделать шрифт достаточно мелким, чтобы открыть в vim-е два файла по вертикали и текст оставался читаемым. Но долго в таком режиме не поработаешь. Таки уже не молод и глаза быстро уставали, приходилось увеличивать размер символов.

В общем, те причины, по которым состоялся переход на 16", со временем оказались менее актуальными. Возможно, если бы я сменил 14" сразу на 18.4" с 4K матрицей, то эффект был бы более долгосрочным, а с 16" получилось вот так.

Кроме того, сыграл еще один фактор. За долгие-долгие годы программирования привык к режиму "одного окна", т.е. когда практически всю площадь экрана занимает одно текущее окно приложения, а остальные скрыты под ним. Будь то vim, под которым прячется консоль. Или же браузер, под которым прячется vim. Или окно telegram, под которым прячется что-то еще.

Видимо, корни уходят в 1990-е годы, когда я только учился программировать. Происходило это на маленьких алфавитно-цифровых экранах 80x25, да еще в однозадачных ОС (вроде CP/M и MS-DOS). Даже когда появились Windows и OS/2 с возможностью запустить сразу несколько приложений, то на тогдашних 14" ЭЛТ мониторах с разрешением 640x480 или даже 800x600 (хотя это было ну очень круто по тем временам) все равно не было возможности комфортно поделить площадь экрана сразу между несколькими окнами.

Так до сих пор и работаю: в центре основное текущее приложение (как правило, это vim, konsole, браузер или telegram), а из под него выглядывают краешки окон других приложений. И оказывается, что на 14" эти самые краешки отвлекают гораздо меньше, чем на 16".

Похоже, что на 14" режим "одного окна" таки комфортнее, чем на ноутбуках с большей диагональю.

А вот о чем остается только сожалеть при возвращении на 14", так это об отсутствии отдельных клавиш Insert, PgUp, PgDn, Home и End. Такое ощущение, что когда года через 2-3 буду выбирать более мощный и современный ноутбук, то придется смотреть в сторону ThinkPad-ов, на которых все эти кнопки все еще присутствуют. Хоть сам я не большой любитель клавиатур ThinkPad-ов. А особенно не любитель цен на нормальные ThinkPad-ы T-серии 🙂

четверг, 1 октября 2026 г.

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

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

Фильмы

Майк и Ник, Ник и Элис (Mike & Nick & Nick & Alice, 2026). Очень даже неплохо, мне понравилось. Но есть в этом кино некая толика укуренности в хорошем смысле этого слова. Мне такая укуренность зашла, но кому-то наверняка испортит впечатления от просмотра.

Ночной бизнес (The Get Out, 2026). Мне понравилось.

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

Сыграть в ящик (Just Play Dead, 2026). Нормально, можно смотреть, хотя на мой взгляд, с поворотами сюжета авторы перемудрили.

Зараза (Cold Storage, 2025). Как по мне, то неплохая черная комедия. Главное не ждать от кино чего-то серьезного.

Запретный город ("Forbidden City" или "La Città proibita", 2025). На удивление любопытный боевик с мордобоем и тетенькой в роли главного непобедимого бойца. Портит впечатление количество розовых соплей вокруг происходящего, лучше бы экшОна побольше впихнули.

Соперники Амзиа Кинга (или "Гнев улья", The Rivals of Amziah King, 2025). Купился на участие в фильме Мэттью Макконахи, но его роль там оказалась не самой главной. Фильм специфический и, как по мне, несколько странный. Посмотреть можно. По визуальной составляющей, как и по актерской игре, у меня претензий нет. А вот что касается смысла и сюжета, то у меня остались вопросы о том, кто же здесь главный злодей.

Старуха с ножом (Pagwa, 2025). Во-первых, это кино для тех, кто спокойно или положительно относится к корейскому кинематографу. Во-вторых, фильм далеко не шедевр: экшОна маловато, в сюжет лучше не вдумываться вовсе.

Обсессия (Obsession, 2025). Низкобюджетная муть, жалко потраченного времени. Мне кажется, что низкобюджетные ужастики из видеосалонов 1980-х и то были сделаны круче.

Гандикап (2023). Не понял что это было, больше похоже на отечественный ответ "Бегущему человеку" на самых-самых минималках. В общем, можно пройти мимо.

Сериалы

Джентельмены (The Gentelmen, второй сезон, 2026). Отличное продолжение. Мне даже показалось, что второй сезон динамичнее и интереснее первого. Посмотрел с удовольствием. Надеюсь, что будет продолжение.

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

Магазин для киллеров (Killeodeului syopingmol, второй сезон, 2026). Если понравился первый сезон, то смело можно смотреть и второй. Мне зашло, хотя временами фантастичность происходящего была где-то на уровне сказочки для детей.

Холод (первый сезон, 2026). Разочарован, ждал от сериала сильно большего. А выбор Любовь Аксёнова в главной роли, это очевидный для меня мискаст.

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

Преимущества путешествия поездами (Ventajas de viajar en tren, 2019). Как по мне, так совершенно укуренное кино. Мне такие нравятся. Однако, рекомендовать не могу, т.к. ну очень уж на любителя.

понедельник, 28 сентября 2026 г.

[life.photo] Несколько кадров из прогулки по лесу

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

воскресенье, 27 сентября 2026 г.

[comp.thoughts] Многопроцессорные ноутбуки на ARM-ах. Почему нет?

Уже почти два года с удовольствием пользуюсь 12" планшетом HONOR Pad 9. По Geekbench 7 у него не сказать, чтобы какие-то выдающиеся результаты. Что-то около 800 баллов в однопотоке и чуть больше 2800 баллов в многопотоке. Т.е. формально это откровенно тормознутый по нынешним меркам процессор.

Однако, за два года использования этого планшета для потребления контента (т.е. ролики на YouTube/RuTube/VK, чтение статей на сайтах, просмотр PDF, небольшие правки в Google Docs, простые ответы по email, переписка в Telegram, Yandex.Music в фоне и вот это вот все) никаких тормозов замечено не было. Т.е. с производительностью для обычных повседневных задач у достаточно старого по нынешним временам Snapdragon 6 Gen 1 хватает. И здесь остается только жалеть, что на таком процессоре нет легкого, тихого и долго живущего на одном заряде ноутбука.

Почему раньше не было ноутбуков на ARM-ах из мобильных телефонов понятно: хоть Windows когда-то в 1990-е и начиналась как ОС с поддержкой нескольких типов архитектур, но довольно быстро десктопная версия Windows сконцентрировалась исключительно на x86, а всякие MIPS и Alpha пошли лесом, т.к. рыночек порешал. Этот же рыночек вместе с эффективным менеджментом из Microsoft и Nokia порешал и мобильную Windows CE (или как она там в последние годы своей жизни назвалась).

Тем не менее, мегауспешный переход Apple на свои собственные процессоры подтолкнул Microsoft к портированию десктопной Windows на ARM-ы. И уже года четыре как Windows доступна на ноутбуках с ARM. Например, был вот такой совсем чахлый TCL Book 14 Go на Snapdragon 7C Gen.1, который, по отзывам, был не просто тормозной, а очень тормозной. Возможно, не из-за процессора, а совсем крошечного по нынешним временам объема RAM, но все таки.

Первый блин Windows-ноутбуков на ARM в лице вот таких вот TCL Book 14 Go вышел комом, поэтому дальше эволюция пошла привычным для ИТ способом -- дождались выхода гораздо более мощных Snapdragon X от Qualcomm и пошли клепать не самые дешевые модели с этим новым процессором, большим объемом памяти, крутыми экранами и вот этим вот всем. Т.е. как будто бы основной прицел был в сегмент повыше среднего. Встречаются недорогие ASUS Vivobook-и и Lenovo IdeaPad-ы из среднего сегмента, но там и разновидности Snapdragon X не самые мощные.

Уж не знаю, есть ли какой-то успех у Windows-ноутбуков на ARM, сам пока не отважился на покупку чего-то подобно (хотя, наверное, надо бы рискнуть, чтобы было на чем проверять свои OpenSource разработки). Но давеча задумался вот о чем: а почему не пробуют сделать ARM ноутбуки с несколькими процессорами?

Грубо говоря, почему бы вместо дорогих и горячих Snapdragon X не взять 2-3-4 более старых, но вполне себе годных Snapdgragon 6 Gen 1, как в моем HONOR Pad 9? Пусть каждый из них сидит в своем сокете и располагает собственными 6 или 8 GiB RAM.

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

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

Что-то мне кажется, что не надо.

Смысл же в том, что если сделать ноутбук на одном Snapdragon 6 Gen 1 с 8 GiB RAM, то его ограниченность (как в плане быстродействия, так и в плане доступной памяти) быстро выплывет на поверхность.

Но есть таких процессоров будет уже два, а памяти не 8, а 16, то это уже совсем другая история. А если не 2, а 3 процессора и 24 GiB RAM? Это же еще лучше. Ну а 4-е процессора -- это уже совсем серьезная штука 😀

Любопытно, почему по этому пути не пошли? Что является основным препятствием? Железо или софт?

Рискну предположить, что приди в голову кому-нибудь идея выпуска подобных ноутбуков, то куча проблем была бы и с аппаратной, и с программной частями. Может быть даже с программной частью больше (особенно если RAM на каждом сокете будет своя, не связанная с RAM других сокетов).