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

[prog.rust.flame] "Говорил я вам. Не прислушались. Так и получилось. Как говорил я вам..."

На выходных, лениво пожевывая попкорн почитывал срачик на Habr-е, в котором светлые рыцари ордена safe Rust-а громко доказывали, что писать код так, как сделал автор Actix-Web, ни в коем случае нельзя. Занимательное чтиво, аж душа пела.

Пела потому, что когда лет 5-6 назад первые упоротые в своей воинственности Rust-оманы начали бегать по профильным форумам и убеждать всех тех, кому Rust вообще не был интересен, что Rust -- это самое лучше, что произошло с софтостроением после изобретения перфокарт, некоторые скептически настроенные старпёры сердито ворчали: "Ну подождите пару-тройку лет, в этот ваш Rust обязательно придут люди, которые начнут использовать unsafe, скажем так, весьма творчески. Вот тогда и посмотрим, насколько Rust окажется safe в реальной-то жизни".

Ну вот и дождались.

Вполне ожидаемо оказалось, что это во влажных мечтах оторванных от реальности фанатов в боевом коде на Rust-е unsafe либо не будет вообще, либо он будет локализован, тщательно оттестирован и аналь огорожен.

Просто одно дело, когда ты в свободное время пишешь pet project на своем любимом языке для души. Совсем другое -- когда у тебя есть жесткие цели, сроки, бюджеты, конкретные люди со своими проблемами и куча других факторов, которые и отличают настоящую разработку от экспериментов с перспективной технологией. Вот автор Actix-Web-а столкнулся с задачей выжать из своего Web-сервера максимум производительсти и был вынужден прибегнуть к unsafe. И это еще был весьма квалифицированный и мотивированный разработчик. Что уж говорить об писателях индусокода (всех национальностей), которые неизбежно будут пихать unsafe в код, потому что дедлайн, а времени ублажать компилятор нету.

PS. А для всех свято верующих в то, что в реальной жизни unsafe в Rust будут использовать исключительно правильно, а прецидент Actix-Web-а -- это досадное исключение, ВИА "Громыка" исполняет свой незабвенный шлягер, строчка из которого была вынесена в заголовок заметки.

6 комментариев:

XX комментирует...

Да нет, как раз в этом споре Rust проявил себя с сильной стороны и случилось ровно то, что предсказывали "упоротые растоманы": unsafe позволил быстро найти скрытые проблемы с UB. Если бы не точечная локализация unsafe-кода, то не было бы к этим участкам такого повышенного внимания и, возможно, так мы бы и не узнали, что actix-web содержит там UB.

А так, как вышло - так и должно быть в нормальном Rust-проекте, просто автор повел себя неадекватно. Вместо того, чтобы разобраться с багами или сказать всем "идите к черту, это лично мой pet-project", он начал удалять issue, а потом и вовсе психанул. Так что ты либо делай проект для сообщества - но тогда будь готов, что контрибьюторы не будут в восторге от использования unsafe не по делу и будут тебя тыкать носом в UB, если таковое имеется, либо делай проект для себя, но тогда не надо строить из себя "организацию" и делать вид, будто проект разрабатывается сообществом и для сообщества.

Ну и не надо строить из себя обиженного на то, что тебя попросили не писать на Rust, если ты уж придерживаешься такого "стиля". Напомню, что сам Николай в прошлый конфликт по-поводу unsafe посылал всех писать на динамических языках, кто был не доволен actix-web'ом.

Ну так что в итоге? Проект передан сообществу, которое сразу начало пилить патчи безопасности, чтобы убрать UB и лишние unsafe. Потом решили уже смотреть, как улучшить производительность. То есть надежность на первом месте - и это правильно. Я, как пользователь actix-web, могу в таком случае продолжать его использовать, однако в противном случае - пришлось искать бы ему замену. Или вы считаете, что UB в веб-сервере - это нормально?

eao197 комментирует...

Я считаю, что у упоротых Rust-оманов есть пунктик по поводу UB. Хотя UB есть даже в простом x+1, где x -- это знаковое целое число.

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

Ну и отдельно по поводу того, кто что и кому должен в OpenSource: никто, ничего и никому. Человек делал то, что хотел и принимал те патчи, которые сам считал нужными ему и его проекту. Все остальные (напрасные) ожидания типа "делать для коммьюнити" можно отправлять в /dev/null сразу и без разговоров.

XX комментирует...

> Хотя UB есть даже в простом x+1, где x -- это знаковое целое число.

В Rust тут нет UB.

> Только хорошо было бы понимать, что это не решение конкретных задач, а именно что надрачивание.

Вы бы сами поняли, что сказали глупость, если бы использовали actix-web в проде, как мы. С ним регулярно возникают проблемы, а после миграции на версию 2.0 стали падать тесты, которые раньше работали. Причем падают время от времени, а не всегда. Вот это надо, иметь UB во внешней зависимости?

> Ну и отдельно по поводу того, кто что и кому должен в OpenSource: никто, ничего и никому.

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

eao197 комментирует...

> Вы бы сами поняли, что сказали глупость, если бы использовали actix-web в проде, как мы.

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

> Если вы придерживаетесь такой позиции, то тогда какие претензии к Раст-сообществу?

К Rust-сообществу у меня вообще нет претензий. Ибо это вообще аморфное понятие.

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

Хорошо хоть, что потом многие сказали Николаю спасибо за его работу.

XX комментирует...

> Т.е. вы завязались на использование OpenSource проекта без какой-либо поддержки за ним, а глупость сказал я?

Дело в том, что в Rust до сих пор экосистема сырая, так что да, мы завязались на OpenSource без поддержки с явным осознанием того, что в случае проблем мы будем участвовать в доработке экосистемы. И участвовали, в том числе и в доработке actix-web. И в прочих случаях, мейнтейнеры были рады, когда к ним в библиотеку засылают патч, ну или хотя бы вели конструктивную дискуссию. Это и есть тот OpenSource, который мы ожидаем. У Николая же, похоже, были свои представления об OpenSource и ирония в том, что плохо от этого стало только ему.

Dmitry Popov комментирует...

Rust это во многом религия, там если уж уверовал, то соблюдай заветы, а не так, что "вообще не курю, только если выпью..". Если не придерживаться этой safe религии, то нафиг за Раст вообще садиться, есть же и более зрелые альтернативы (тот же С++) и более приятные (в разных нишах разные).