Статьи

Мой старый кодекс зверский

Исправление чужого кода

Исправление старого кода — это всегда унизительный опыт. Особенно твой собственный.

Это ложь. Исправление старого кода других людей — это безумный опыт, который ставит вас в тупик. По крайней мере, вы хотели бы несколько раз ударить программиста по лицу, крича: «ПОЧЕМУ ТЫ СДЕЛАЛ, ЧТО ТЫ ДУМАЛ, ПОЛНЫЙ ИДИОТ ИЛИ ТОЛЬКО ИДИОТ?» и поливая их слюной. Вены выскакивают из шеи и лба. Лицо становится красным. Весь шпиль.

Ваш собственный код, хотя … это унизительно.

Исправление старого проекта

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

Но не этот проект . Это моя коронованная слава, самая крутая вещь, которую я когда-либо строил. Эта странная какофония технологий, которая раз в несколько дней отправляет мне электронное письмо со словами: «Привет, у тебя все хорошо. Продолжай тратить. или «Какого черта ты делаешь, идиот? Ваши деньги исчезают! STAHP!»

Это действительно опрятно.

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

Прошлой ночью я чуть не плакала.

Зверства

Первым злодеянием, совершенным во имя взлома, было написание программы на двух разных языках по причинам, которые в лучшем случае были слабыми.

Я использовал node.js для управления основным процессом и общения с API. runner.jsвызывает другие части кода, общается с MongoDB и запускает алгоритмическую часть Haskell как подпроцесс.

Часть Haskell и node.js взаимодействуют через MongoDB.

Я даже не использовал библиотеку MongoDB. Взломали что-то вместе, потому что mongoose — ORM-подобная библиотека MongoDB для узла — была по какой-то причине слишком медленной. И я понятия не имею, как Хаскелл это делает. Монады продолжают смущать меня.

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

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

Да, это включает отправку незашифрованных паролей через https. Да, это также включает сохранение указанного пароля в файле на сервере.

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

Замечательный иннит?

И даже не заводите меня на реализацию Toggl. Это то, что сломалось, кстати. Версия 6 их API устарела 1 сентября, и я просто не заметил.

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

Да, это включает в себя настройку Accept: application/jsonзаголовков и кодировку utf8.

Да, там также не было никакой абстракции вообще. Три вызова API были тщательно прописаны. Все от битов URL (https, toggl.com,…) до указания заголовков каждый раз.

Все это стало этой функцией:

var __request = function (url, query, callback) {
    callback = arguments[arguments.length-1];
    query = typeof query === 'function' ? {} : query;
 
    request.get({protocol: 'https',
                 hostname: 'www.toggl.com',
                 pathname: url,
                 query: query,
                 auth: require('./secrets').toggl_api+':api_token'})
        .set('Accept-Charset', 'utf-8')
        .set('Accept', 'application/json')
        .end(callback);
};

Что позволяет мне сделать это:

var workspaces = function (callback) {
    __request('/api/v8/workspaces', callback);
};

Гораздо лучше, чем, по сути, __requestповторять функцию каждый раз.

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

Увы, я был идиотом. Увы, увы, я не очень исправил ситуацию прошлой ночью.

В довершение всего, библиотека синтаксического анализа CSV изменилась в более новой версии, поэтому мне пришлось исправить и эту часть моего кода.

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

Может быть, в другой раз. Когда я еще раз наберусь смелости, чтобы исправить мой старый код.

Я просто надеюсь, что все еще знаю достаточно Haskell, чтобы исправить алгоритмическую часть, если она когда-нибудь сломается. Без комментариев. Нет объяснения алгоритма. D’о.