У меня просто неистово горит от мейнтейнеров стандартной библиотеки C++.



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



Так вот, помните я писал про сортировку и как нормально мигрировать один алгоритм на другой посредством рандомизации? Почитайте этот пост, мне он нравится



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



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



Но в данном случае будет что-то между:



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



Плохой сценарий: какая-нибудь распределённая streaming база данных на запрос "select x, y from table order by x limit 10" возвращает разные значения y при равных x, падают чексуммы, все ломается на десятки часов, десятки сотни миллионов долларов сжигаются.





Реальность будет где-то между плохим и хорошим исходом.



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



Для меня это самое большое отличие инженерии в физике и в computer science. В физике меньше вещей меняются, в software engineering вещи меняются каждый день, и мы должны думать намного больше над тем, как уметь менять вещи.



Вы хотите новую сортировку или хэштаблицу, чтобы ваша программа кушала меньше ресурсов. Но если кто-то (мейнтейнеры) не дают этой возможности, то я не могу вам ее предложить. Люди будут писать std::sort, потому что так и надо. В итоге максимум что мы можем сделать — ругаться и говорить, что надо мигрировать на что-то другое — скажем, abseil.



К слову, активность в изменении сортировки в LLVM libcxx пошли https://reviews.llvm.org/D93233, хотят новую сортировку bitsetsort сделать. И не предлагают вариант для миграции. Ну я отказываюсь играть по таким правилам. Скриньте, что кто-то упадёт или застрянет на версии libcxx, потому что тесты падают.



Долго думал насчёт других решений помимо рандомизации:



1. Сделать как Rust, .sort() всегда стабильная сортировка (равные элементы не меняют относительный порядок никогда) и это, мать его, хорошее решение. Тем не менее, разница между самой быстрой стабильной и нестабильной сортировкой где-то 10-20% (будет пост на след неделе, обещаю!).

2. Начать исследовать стабильные сортировки больше, вдруг получится быстрее, чем pdqsort, bitsetsort и тд. В open source нет исследований по стабильным сортировкам, очень надо!



[1] Мой пост про сортировки

[2] Мой PR в LLVM, молчат уже 8 месяцев!

[3] Bitsetsort

[4] Ревью bitset sort в LLVM, идёт уже больше года!

[5] Рандомизация сортировки в репозитории LLVM (ничего общего с libcxx)

[6] Рандомизация seed в absl::flat_hash* контейнерах

[7] Golang iterator randomization

[8] Сортировка Vec в Rust