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

Я запустил oTranscribe в октябре 2013 года и поделился им с друзьями и в местных группах встреч, включая Hacks/Hackers London. Через несколько месяцев я получил новую работу по разработке интерактивной графики для Wall Street Journal, во многом благодаря oTranscribe.

Я быстро влился в новую работу. Что касается меня, то я закончил с oTranscribe. Но oTranscribe еще не закончил со мной.

Приложение было создано, чтобы быть устойчивым: оно с открытым исходным кодом, (по-прежнему) размещено на страницах GitHub и не имеет компонентов на стороне сервера. Итак, при относительно небольшом моем участии oTranscribe продолжал органично расти. Сейчас у него более 90 000 пользователей в месяц.

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

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

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

Говоря о потерянной работе, позвольте мне на мгновение рассказать вам о localStorage. Это удобная функция браузера, обеспечивающая постоянное хранилище с помощью простого API, и она идеально подошла для oTranscribe, позволив мне хранить работу пользователей конфиденциально и без серверов. Но по мере роста oTranscribe ограничения этого подхода стали до боли очевидными. Если пользователь очистит свой кеш или переключит компьютеры, или если кеш переполнится из-за того, что oTranscribe сохраняет резервную копию каждые пять минут (без каких-либо ограничений, упс): безвозвратная потеря данных. И много-много грустных пользователей.

Конечно, я мог бы добавить серверы и систему входа в систему. Но тогда я храню конфиденциальные пользовательские данные и запускаю серверы. Или я мог бы добавить интеграцию с API Dropbox и Google Drive. Это лучшая идея, но некоторым пользователям нравится тот факт, что их данные остаются локальными. И мне нужно найти время, чтобы на самом деле реализовать это.

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

Эти обязанности усложнялись запутанной кодовой базой, написанной программистом-дилетантом в 2013 году (он же я). Я слышал, что «глобальные объекты — это зло», поэтому решил просто использовать один большой глобальный объект с именем oT.

var oT = {};
oT.init = function(){};
oT.media = function(){}; 
oT.lang = {};
oT.lang.langs = [];
oT.lang.applyLang = function(){};
oT.export = {};
oT.message = {};
oT.timestamp = {};
oT.timestamp.insert = function(){};
oT.player = function(){};
oT.import = {};
oT.import.loadFile = function(){};
oT.import.clean = function(){};
// etc...

Умно, правда? Неа. То, что я считал одним большим глобальным объектом, на самом деле было десятками более мелких глобальных объектов. Возможно, их не было в глобальном пространстве имен, но они по-прежнему были глобально доступны. Этот анти-шаблон усугублялся большим количеством jQuery и состояния приложения, хранящихся в DOM.

Моей первой попыткой справиться с этим техническим долгом был oTranscribe2, полная переработка базового JavaScript, написанного на ES6, с помощью Ractive.js (не путать с более популярным React) с модульными тестами. Но к тому времени, когда я реализовал половину существующих функций, код был еще более плотным и содержал больше ошибок, чем существующая кодовая база! И, как оказалось, модульное тестирование затруднено, когда речь идет о браузерных аудиоплеерах и текстовых редакторах.

Моей второй попыткой справиться с этим техническим долгом был Обновление проекта, в котором я переместил существующий код в модульную среду ES6/Webpack, а затем провел его рефакторинг по частям. Это пошло намного лучше.

После некоторого неформального бета-тестирования я отправил новый код на oTranscribe.com и скрестил пальцы (но не раньше, чем заархивировал последнюю сборку существующей кодовой базы как «oTranscribe Classic»).

Все идет нормально! После этого рефакторинга мне стало легче исправлять ошибки, легче добавлять новые функции, и, самое главное, я обнаружил, что на GitHub отправляется больше запросов на вытягивание.

Если я могу оставить вас с одной последней мыслью, дорогой читатель, я хотел бы задать вопрос: что определяет «успешный» сайд-проект? У него много пользователей, как у oTranscribe? Это тот, который приносит доход? Тот, у которого вы учитесь новым навыкам? Или это тот, который, когда вы работаете над ним, делает вас счастливым?

Первоначально опубликовано на ejb.github.io 17 июня 2017 г.