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

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

Оба этих события дарят ощущение лёгкости, как в последний учебный день в школе.

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

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

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

Самая большая сложность, пожалуй, была с тем, чтобы не перетруждаться.

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

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

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

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

К концу года, когда я уже начал чувствовать собственный износ, мне всё-таки удалось оторвать свою задницу от сидения за клавиатурой.

Рождественский сочельник? Вы серьёзно?

Быть самому себе начальником подразумевает невероятную многозадачность. Всегда есть что-то ещё, что можно сделать. Причём одновременно нужно учитывать как мелкие детали, так и более широкую картину, продвигать проект и рассказывать о нём миру. И всё это поверх дежурных бытовых задач. Я, пожалуй, мог бы использовать чуть более структурированный подход, но излишняя структурированность в то же время препятствует креативности. Между этими вещами не так просто найти удачный баланс.

У меня такое ощущение, что я зашёл далеко на неизведанную территорию, где сложно найти какие-то готовые ролевые модели или наставника. В итоге мне не остаётся ничего другого, кроме как выкручиваться.

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

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

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

Обозначенные мной проблемы охватывали широкий контекст:

  • Механизм поиска, по сути, был опенсорсным, но никто не мог его собрать, отсутствовала документация, и в базе кода было много старого хлама, серьёзно усложнявшего навигацию. И хотя невелика вероятность, что механизм интернет-поиска станет особо популярным или привлечёт множество контрибьюторов, он всё же является важной частью стратегии обеспечения устойчивости, чтобы проект имел возможность продолжать существование, даже если в какой-то момент я не смогу продолжать поддерживать свою часть.
  • В краулере использовался неудачный формат хранения данных — JSON, сжатый с помощью ZSTD.
  • Для функционирования системы требовался невероятный объём ручной работы. Она была спроектирована явно по образу и подобию UNIX, включая в себя несколько исполнительных файлов, каждый из которых имел своё предназначение. Проблема заключалась в том, что их нужно было запускать в строгом порядке, а между ними вручную выполнять инструкции SQL. Если вы вдруг делали что-то не так, то теряли двухмесячный объём собранных данных.
  • Парсинг и трактовка запросов были реализованы очень грубо. Выполнялся этот процесс более-менее неплохо, но написан был так, что читать и изменять его было крайне сложно.

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

Я рад тому, как развернулась основная часть процессов, хотя, естественно, всегда есть что улучшить.

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

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

Если учесть текущее состояние проекта, то в перспективе я бы хотел проработать два основных аспекта.

  • Определение расположения выражений. Как я уже писал, на данный момент в индексе сохранение позиций ключевых слов на уровне предложений реализуется с помощью битовой маски. Такое решение прекрасно работает в удивительном числе случаев, но определённые запросы обрабатываются недостаточно хорошо. Одним из недостающих элементов являются n-граммы слов с именованными сущностями, но для исправления этой ситуации, пожалуй, требуется более традиционный список записей (postings list). Я уже начал работать над соответствующим решением, и всё идёт хорошо, но это очень серьёзное изменение, которое вряд ли попадёт в продакшен до конца лета.
  • Процесс сбора 1 миллиарда документов оказался медленнее, чем я бы хотел. Сейчас механизм поиска содержит примерно 300 миллионов документов. При этом индекс растёт медленно и склонен к углублению индексации уже известных областей. Проблема увеличения проиндексированных данных требует переосмысления. При каждом их увеличении также наблюдается сильный скачок в выдаче результатов со спамом/порно/насилием, которые на данный момент приходится удалять вручную. Также хотелось бы проиндексировать, например PDF-файлы.

Есть более детальный план на 2024–2025 годы с дополнительными идеями по улучшению, хотя он ещё не продуман. Я с нетерпением жду, когда по истечениb гранта смогу какое-то время побыть в свободном полёте — именно в такие моменты мне удаётся трудиться с максимальным вдохновением.

Но в самое ближайшее время я всё же планирую немного отдохнуть — хочу посмотреть, насколько я справлюсь.

Telegram-канал со скидками, розыгрышами призов и новостями IT ?

Комментарии (2)


  1. Thomas_Hanniball
    30.06.2024 11:13
    +3

    А где, собственно, результат работы за год? Что было реализовано, как это работает и прочее?

    Если это https://search.marginalia.nu/ и есть результат работы, то всё очень плохо. Начиная от дизайна и заканчивая результатами поиска. Если в поиске вбить habr, то сайта https://habr.com/ нет даже среди первых 20 результатов поиска.


  1. edogs
    30.06.2024 11:13
    +1

    Кошмарный перевод, напоминает первые версии гугл транслейта, есть достаточное количество ошибок.
    Сама статья ни о чем вообще, tldr: "взял какой-то опенсоурсный движок, год над ним поработал, что-то получилось, что-то нет", никаких деталей вообще нет.
    Крайне редко критикуем, но блин...