Как стать автором
Обновить

userver — что мы узнали за полгода в open-source

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров20K
Всего голосов 55: ↑54 и ↓1+64
Комментарии29

Комментарии 29

Спасибо, что продолжаете делиться своими наработками.
Вы абсолютно правы, смысл опенсорса не в том, что вам будут присылать багрепорты или писать код за вас. Хотя и в этом тоже. Эти поводы легко объяснить далёким от IT менеджерам, но они не главные.
Смысл опенсрса -- счастье команды.
И это вполне разумный аргумент.
Высшее счастье инженера -- видеть как результатами его труда пользуются и они приносит пользу другим людям, а высшее несчастье -- работа в стол.
И если у вас команда профессионалов, то выкладка кода в открытый доступ безусловно принесёт удовлетворение, мотивирует работать лучше.
Кроме того, чего греха таить, когда мы знаем что наш код попадёт в опенсорс, мы прикладываем больше усилий, что бы код был максимально качественным.
А вот утаивание кода приносит меньше профитов, чем принято думать.
Ну и конечно, опенсорс повышает престиж компании. Ведь мы судим о компании в том числе по её коду.
Рад, что ответственные люди в Яндексе на стороне прогресса. И надеюсь, что эта практика понемногу станет нормой повсеместной.

+100

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

Ну зачем так категорично. Человеки вполне имеют право в течение жизни шагать вверх по пирамидке товарища Маслоу.

Откуда такая щенячья наивность, что корпорации думают про счастье какого-то винтика, а не про деньги, которые можно делать из выкладки в open source, прямо или косвенно?

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

Антон, спасибо - вопрос: используется ли в этом проекте идиома / утилита fast pimpl (вы рассказывали о ней в презентации "C++ трюки из Такси" 2.5 лет назад)? Я заглянул в пару-тройку хедеров и не наткнулся на использование (пока). Предполагаю, что не используется - т.е. C++ утилита / приём весьма общего назначения, полезная в одном крупном C++ проекте, с которым вы работали, в другом крупном C++ проекте (в той же фирме) оказалась не так уж полезна?

Отлично, спасибо! Я себе сделал попроще, по мотивам той презентации, буду иметь в виду, если понадобится улучшить.

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

НЛО прилетело и опубликовало эту надпись здесь

Гадаю по фотографии, делаю кодревью, дорого. Один файл, и только сегодня, бесплатно. Рандом сказал read.cpp.

  • Макросы - зло, USERVER_NAMESPACE_BEGIN, UASSERT. У Вас современный C++, есть и static_assert, и if costexpr.

  • boost::filesystem::path - уже в C++17 появился , пожалуйста не тащите буст, когда можно без него.

  • Первая функция принимает const boost::filesystem::path& path, вторая std::string_view path - пожалуйста, определитесь, то у Вас path, а иначе c++ implicit conversion это зло.

  • Nit: не будем тратить Ваше время~

1) Согласен что зло. Однако единственный способ отобразить произвольное выражение в виде массива символов - макросы вида `#define STRINGIZE(X) #X`

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

2) Мы и не используем Boost когда можно без него. В данном случае он необходим, так как на многих платформах где собирается userver авторы стандартных библиотек C++ помечают реализацию std::filesystem как experimental и неготовую к промышленному использованию

3) И правда некрасивенько. Можно будет поправить как-нибудь

4) Вы пропустили большую проблему в данном коде, сосредоточившись в ревью не на логике/архитектуре. Первый кто найдёт проблему до того как мы закомитим фикс, получит от нас маленький презент

Симлинки специально пропускаете?

Специально, в этом месте ОК

И то, что GetRelative не проверяет, что path действительно начинается c dir, тоже ок? (хотя, скорее всего за пределами он не используется)

Функция действительно используется только в одном месте из этого файла, только на директориях с заданным префиксом. Так что ОК

И runtime_error при ошибке чтения (например, нет прав) тоже можно не обратывать?
Да boost в некоторых случаях может filesystem_error выбросить.

Такие ошибки обрабатываютя вызывающим кодом, исключения тут как раз кстати

GetRelative(f.path().string(), path)

— не оторвётся ли случайно (или скорее наоборот останется) какой-нибудь слэш / в relative-пути, если передать path без завершающего слэша? Зависит, конечно, от того, как именно path доходит до сюда.


UPD: ну и в принципе смешивание std::string и fs::path для навигации звучит довольно взрывоопасно, вроде API fs должно хватать для всех GetRelative и т.д., но он ещё и нормализует пути.

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

Но большая проблема остаётся не разгаданной, есть шанс получить ещё приз

    FileInfoWithData info{};
    info.size = boost::filesystem::file_size(f.path());
   ...
    info.data = ReadFileContents(async_tp, f.path().string());

А это не гонка? Сначала узнавать размер, а потом читать данные и размер может быть уже другой

Ага, гонка. Вам полагается подарок! Напишите в личку адрес доставки

Сербия, Хаб яндекса...

Там как-то странно, IsHiddenFile() реагирует не только на ".", но и на "..", вроде как это надо было в другом месте отфильтровать бы.

Макросы — зло, USERVER_NAMESPACE_BEGIN, UASSERT. У Вас современный C++, есть и static_assert, и if costexpr.

И как по-вашему современный C++ избавит нас от этих макросов?

Это же гениально. Мне кажется, что яндекс слил этот движок в open-source, только чтобы после разделения компании на российскую и международную, обе компании могли им пользоваться. Это же снимает проблемы с делением интелектуальной собственности. Ждём еще другие интересные наработки :)

Спасибо!

Но мы уже 5 лет назад говорили, что готовим userver к выходу в open-source. Так что по срокам не сходится %)

Добрый день! Большое спасибо за статью! Удачи Вашему фрэймворку! Не могли бы Вы уточнить несколько моментов:

1. Реализованный Вами подход, как я понимаю, отличается от Coroutine TS C++. Почему Вы не использовали разработки Lewiss Baker (follycoro) (потому что к моменту начала разработки Userver их ещё не было, или по какой-либо другой причине)? Планируете ли Вы в будущем дрейфовать в сторону стандарта (в смысле в части корутин) (или, наоборот, считаете, что стандарт должен дрейфовать в Вашу сторону ?). 

2. Есть ли где-то более или менее подробное описание Вашего подхода к  корутинам? Вынесены ли Ваши корутины в отдельную библиотеку (независимую от userver).

3. Есть ли где-то описание Вашего планировщика корутин? Вы использовали подходы, сходные с подходами Дмитрия Вьюкова (Go), или разработали что-то своё?

4. Не думали ли Вы над следующим вопросом: асинхронный сервер – это реально круто, статусно, но для большей раскрутки и востребованности проекта может имеет смысл попиариться и с точки зрения возможности делать асинхронные запросы к web-серверам (по типу pythonовского aiohttp) – чтобы привлечь на свою сторону пользователей, который запросы пишут, но которым не требуется сам web-сервер.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий