Отложенная смерть или как похоронить перспективу своей ленью

Кота с лампой – нет, держите мотылька.
Велика вероятность того, что не каждый из читателей знаком с понятием «визуальная новелла», а если и знаком, то уже пишет в комментариях восклицание по типу: «Снова эти виабушники на хабре!». Но если вам просто интересно прочитать историю одного недо-переводчика с небольшими навыками программирования и большими амбициями, то я вам её поведаю.
С чего все началось
В 2016 году я еще не имел полноценной работы связанной с программированием. На тот момент я работал удаленно в технической поддержке по всяким бухгалтерским программам. Клиентов у нас было не много, поэтому у меня было достаточно свободного времени.
Я брал некоторые заказы по сайтам, два раза в неделю посещал занятия по японскому языку. Очень уж мне нравилось звучание их языка (да чего уж таить — и сейчас нравится). Уже через полгода, имея «великое» знание азбук и горсти иероглифов, я хвастался этим в группах по аниме и визуальным новеллам. Наконец, в один из дней я получил сообщение от руководителя перевода одной визуальной новеллы с японского:

Скриншот первого сообщения
Для тех, кто не знаком с данным жанром игр, я вкратце опишу — это рассказ с картинками, с возможностью влиять на сюжет выбором реплик в диалогах. В некоторых экземплярах встречается какое-то подобие геймплея в перерывах между сюжетом, типа карточных игр, игр на ловкость и так далее. Зачастую, в подобных играх присутствуют «клубничные» моменты, а порой, и в значительном количестве. В русскоязычном сообществе особенно сильно прославилось «Бесконечное лето», с его героем-сычом и коммунистическим бэкграундом.
Ну и не забываем про Алису с бутылкой водки и Лену с ножом, да…
Перевод они делали через специальную программу — Visual Novel Reader. Настоящий монстр, как по количеству функционала, так и по прожорливости. Основной костяк был написан на питоне, который в свою очередь вызывал десяток других библиотек. Суть её работы заключалась в извлечении текста из новеллы прямо в процессе игры. Затем, с помощью множества встроенных словарей и машинных переводчиков, этот текст переводился, доводился до ума уже самим переводчиком и только потом сохранялся для остальных пользователей на сервере автора программы.

Пример основного интерфейса
Некоторое время поломавшись, я все-таки согласился помочь им с переводом, впрочем, толку от меня было мало. Работать переводчиком оказалось намного сложнее чем я мог себе представить. Если ранее, читая для себя, я мог просто пропускать то, что не понимал, то теперь приходилось обращаться к более опытным коллегам и выяснять: «а что там написано смесью иероглифов и двух азбук…?». Некоторое время я помучался со всем этим, но, когда нашел прибыльную подработку – забросил.
Хоть я и забросил, но за процессом перевода все равно продолжал наблюдать, очень уж мне приглянулись некоторые персонажи в новелле, хотелось почитать их на русском. Итак, спустя несколько месяцев возник прецендент: сервер, хранящий на себе все переводы, пользовательские словари и кучу всего прочего – умер. Или, вернее сказать, создатель просто забыл заплатить за домен. Казалось бы чепуха, но его не продлевали несколько дней. В русскоязычном и зарубежном комьюнити начали возникать волнения и опасения по поводу сложившейся ситуации. Именно тогда у меня возникли первые мысли о создании собственного сервера, тем более, что все исходники лежали в открытом виде, главное — найти нужные места в коде. Но, спустя еще некоторое время, домен чудесным образом заработал, и все забыли об этой ситуации. Однако, всеобщее счастье продлилось недолго…
Власть, которая и не снилась моему отцу…
Через несколько месяцев ситуация повторилась вновь. Так как это было уже не в первый раз, то все не сильно волновались, наверное, создатель на этот раз забыл заплатить за хостинг. Но вот прошла уже неделя, а сервер как лежал, так и лежит. Те, кто был знаком с создателем, пытались до него достучатся через известные каналы связи, но все было тщетно. Человек просто пропал…
В таком режиме прошел чуть ли не месяц, сервер продолжал быть в мертвом состоянии, а о создателе ничего не было слышно с тех самых пор. Программой по-прежнему можно было пользоваться, но только в качестве инструмента для перевода. Для простых обывателей, ради которых задумывался перевод это было, по сути, бесполезное приложение. В итоге, все активные переводы через эту программу были остановлены, а значит — настало время создавать свой сервер!
На тот момент моё понимание разработки было не выше уровня «чайника», и я понятия не имел о том, что такое IDE, фреймворки, да и вообще, мои познания были ограничены только вебом на уровне недо-джуна. И на тот момент для меня стояла неординарная задача – откопать в неизвестной мне архитектуре на неизвестном языке файл, который отвечает за отправку запросов на сервер, но в остальном я был абсолютно уверен в своих силах! Я не знал на какой домен отправляются запросы, а проверять подобного я еще не умел, но предположил, что домен в программе будет тем же, что и сам сайт, поэтому просто сделал поиск по всем файлам исходного кода программы. Подождав некоторое время, я получил немалый список упоминаний домена в коде и дальше, уже ручками, перебрал все файлы, пока не нашел нужное мне место. Подставил свой домен, запустил программу и убедился, что запросы идут куда нужно. Начало было положено!
Теперь возник вопрос с тем, какие данные посылает клиент, и какие ожидает. Мне пришлось потратить немало времени на изучение всего этого, и, должен сказать, мне крупно повезло. Субтитры, комментарии, словари, пользователи, игры… все это сохранялось в кэше программы в виде обычных xml файлов в первозданном виде. Просто бери, копируй на сервер и все заведется. Потратив несколько дней на написание, как я думал, гениального кода на стороне сервера, создание базы данных и бесконечные перезагрузки программы (у меня был слабый ноутбук, и перезагрузка занимала по несколько минут), я наконец-таки закончил работу над минимальным функционалом, и отдал на тестирование знакомой команде переводчиков. В течение дня мы тестировали, исправляли появляющиеся баги и в конце концов констатировали – сервер готов к работе! Но в данный момент сервер был абсолютно пустым, а на предыдущем были сохранены драгоценные данные. Благо, у пользователей все данные были сохранены в кэше, поэтому решение было очевидное – создать на сайте сервера форму для загрузки собственных субтитров и словарей.
Для всего этого дела я создал отдельный поддомен на своем основном сайте, и через дичайшие костыли связал авторизацию между своим основным сайтом и сервером для VNR.
Что бы вы понимали весь ужас ситуации, этот глупец вместо того, чтобы создать отдельную базу данных, добавил таблицы в базу данных основного сайта. Я в то время думал создать многофункциональный портал… В итоге получился невероятный бардак, который теперь тяжело распутать. Даже я путаюсь, где используется логин основного сайта, а где логин VNR. Не будьте такими, как я 🙁
Т.к. я понятия не имел о паролях других пользователей, то пришлось на веру дать возможность людям самостоятельно указать свой старый логин, который они использовали в VNR и с которым потом будет связан аккаунт. И должен сказать – я рад что мне никто так и не написал о том, что его аккаунт угнали, моя вера в человечество спасена!

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

Внимательный читатель заметит, что нигде нет кнопки выхода. Просто я поленился её добавлять…

Наконец, спустя пару недель разработки и отлова багов, сервер был отправлен в свободное плавание. Это был апогей того, что я делал до этого… Одно дело, когда ты делаешь что-то прикольное для своих соотечественников, но совсем другое, когда к ним подключаются еще и люди с остального мира! На форумах удивлялись тому, какую работу проделали русские, и самое главное – как у них это получилось?! Хотя ничего сложного в проделанной мною работе не было, я все же сильно возгордился своим достижением. Я – никто из «мухосранска», получил благодарности от иностранцев, я просто всемогущий!
Разумеется, на сервере еще оставались баги, и некоторое время я продолжал их исправлять и ловить плюсы от переводчиков на форумах и в дискорд-сервере, посвященному этой программе. Самое забавное, что мы настолько сильно засели в дискорде, что админ в конечном итоге создал нам отдельный канал для нашей болтовни, который существует и по сей день, хотя VNR упоминается теперь все меньше и меньше.
Брошенный на произвол судьбы
После восстановления сервера, я начал понемногу его дорабатывать. Сделал несколько фичей, добавил пару новых словарей для переводчиков. Но в конечном итоге, подустал всем этим заниматься и оставил сервер жить своей жизнью. Потом, спустя еще пару месяцев, мне удалось устроится в полноценную продуктовую ИТ-компанию, где из-за постоянных переработок ради повышения, я совсем позабыл о сервере.
Таким образом, прошло больше года и за это время я многому научился в программировании. В очередной раз открывая панель управления хостингом, я увидел поддомен сервера, на котором вертится VNR и решил, что его нужно передать другим, более достойным людям. Но, так как сервер был тесно связан с моим основным сайтом, который я тоже забросил, его было тяжело отделить. Но даже если и отделить, то возникает другая проблема: код, который я написал – полное дерьмо! Это самое мягкое что я могу о нем сказать. Все API-методы обрабатываются в единственном файле, написанном в процедурном стиле. Условия в условиях, добавляем туда циклы в несколько уровней, и получаем код, который невозможно читать. Даже сборка xml ответа происходит руками, потому что я где-то вычитал, что так будет менее ресурсоемко, нежели использовать для этого специальный инструмент. Я просто не мог выложить этот ужас в открытый доступ, мне глубоко стыдно за то, что там написано.
Поэтому я решил переписать сервер с нуля на нормальном фреймворке, а также, добавить немного функционала, связанного с социализацией. Например, страницы групп переводчиков с их контактными данными и ссылками на пожертвования. В перспективе, даже подумывал дать возможность переводчикам делать свои субтитры платными, как это сделано на том же «rulate». В течение месяца я потихоньку пилил новый сервер, но в итоге столкнулся с большой проблемой. Я хотел, чтобы все было идеально! «Это же open source, я должен сделать все максимально красиво!» — думал я. И в итоге, выгорел в бесконечной шлифовке одного и того же. А потом произошло повышение на работе, и по вечерам уже было далеко не до спасения старого сервера.
И вот, снова прошло полтора года и 11 мая серверу исполнится 3 года со дня его публикации. Я по-прежнему не переписал сервер на новый движок, а о создателе программы до сих пор ничего не слышно. Со мной все понятно, я ленивый мудак, который ничего не будет делать, если это не приносит ни выгоды, ни морального удовлетворения. Но вот насчет создателя, боюсь, что ничего радужного с ним не приключилось…
К концу статьи хотелось бы сказать: «Не будьте такими мудаками, как я, которые бросают дело на полпути!», но кто я такой, чтобы это говорить. Меня только радует, что есть и другие специалисты, которые делают чтение визуальных новелл проще. Сейчас активно развивается упрощенный аналог VNR-а – «Textractor», у него пока что нет такого крутого функционала, но зато он очень шустрый и легко расширяемый (правда, расширения могут очень сильно конфликтовать друг с другом). Не так давно я сделал для него отдельное расширение для получения переводов с сервера VNR, так что переводчики вполне могут создавать переводы в более сложной программе, а читатели – читать в легкой. Хотел также начать перенос словарей, но ни в какую не могу завести MeCab библиотеку под плюсами, буду рад, если найдется эксперт, который поможет в этом вопросе.
В заключение, немного статистики сервера на текущий момент:
• Всего созданных субтитров: 1,555,653
• Новых субтитров в месяц: 21 470,3
• Количество игр, имеющих хоть один субтитр: 1759
• Количество пользователей: 62 430
Благодарности:
gasparchik и анониму за редактуру текста
JoyToy показала распаковку фигурки Малогарста Кривого из легиона Сынов Хоруса
Iron Studios открыла предзаказ на статую Шанг Цунга из классической Mortal Kombat
Создатель оригинальной God of War раскритиковал авторов God of War Laufey за отсутствие страсти к играм
Бывший креативный директор Halo призвал Activision вернуть уволенных разработчиков для работы над серией
По данным датамайнеров, Nintendo готовит бесплатные подарки для подписчиков Switch Online
В сети появились новые кадры GTA VI из журнала Game Informer
Ветеран Bethesda заявил, что Skyrim не получила спин-офф из-за The Elder Scrolls Online
Prime 1 Studio открыла предзаказ на статую Мистера Фриза