Здравствуйте, господа, в этой статье я поделюсь опытом создания приложения учёта трат, в частности отвечу на следующие вопросы:
- Зачем мне приложение учёта трат?
- Почему это личный проект?
- Почему проект на Git+JS?
1. Зачем мне приложение учёта трат?
Как и многие другие люди я давно хотел стать богатым и практиковать успешный успех. Одной из рекомендаций в таких случаях часто выступает предложение вести собственный бюджет, чем я и занялся несколько лет назад. Скажу сразу, что ведение бюджета не сделало меня богатым и успешным, а своё материальное положение я улучшил обычным переездом в Москву.
Вести бюджет я начал, если не изменяет память, где-то в 2012-м году. В то время у меня уже была профессиональная деформация программиста, выражающаяся формулой "сделано не мной" и попыткой написать всё самому. Тем не менее, по неопытности я решил начать с "проверенных" решений и приобрёл YNAB (You Need A Budget), т.к. приложение позволяло работать и с ПК, и с телефона.
Я честно пытался задавать план трат на месяц и укладываться в него года три. Однако, где-то в 2015-м году авторы выпустили новую версию приложения, за которую опять хотели денег, старую же версию эти недальновидные капиталисты выкинули на обочину истории. В итоге мне пришлось выбирать из двух вариантов:
- Заплатить за новую версию и пользоваться "совершенно новым" приложением с другим интерфейсом.
- Послать их нафиг, сохранить деньги, но потерять текущую историю трат.
Я рассудил, что:
- приложение уже оплачивал;
- старая версия меня устраивала;
- новую версия я не просил;
- если бы они мне до покупки сказали, что будут каждый раз драть с меня деньги, я бы им не заплатил и первый раз;
- спонсировать такое хамство я не буду;
и выбрал второй вариант: послал их нафиг и потерял историю трат.
Эта ситуация меня довольно сильно разочаровала, поэтому я забросил ведение бюджета где-то на год. Однако, в один из дней "болезненной синхронизации" (также известной как "выяснение отношений") я не смог отбить финансовый наброс вида "ты транжира, вечно тратишь деньги на ерунду", после чего ясно осознал важность учёта трат.
В этот раз я решил не повторять ошибку и не отдавать свои данные неизвестно куда с потенциальной возможностью их потерять, поэтому начал вести учёт трат в самых обычных заметках телефона. Формат был довольно простым и выглядел следующим образом:
Заметки продержались у меня до середины 2018-го, пока я всё-таки не захотел иметь возможность работать с тратами на ПК, чтобы анализировать их. Я решил поискать решение, которое позволит мне бесплатно работать с историей трат и на ПК, и на телефоне. Таким решением оказался обычный календарь:
В календаре я использовал учётку Google, чтобы иметь доступ к Apps Script (фактически JavaScript) для анализа записей. Делать скрипты оказалось не очень удобно, т.к. формат хранения календарных записей мало подходит для трат. Вопрос владения данными также оставался нерешённым: мои данные опять пылились на неизвестном и неподконтрольном мне сервере, а доступ к ним был лишь через неподконтрольный мне и изменяющийся по чужой прихоти API.
Во время использования календаря меня периодически посещали две мысли:
- как здорово было бы все свои данные хранить в Git, чтобы легко анализировать траты;
- как здорово было бы использовать интерфейс без всего лишнего, чтобы ускорить запись трат.
Осенью 2019-го я наткнулся на проект Isomorphic-Git, позволяющий работать с Git из JavaScript, бегло проверил его работоспособность и понял, что нашёл свой Святой Грааль. Недавно я завершил создание первой версии приложения ГитБюджет, функциональность которого можно увидеть в видео из заголовка статьи.
В итоге, сейчас учёт трат на телефоне у меня выглядит следующим образом:
Данные в Git выглядят cследующим образом: https://gitlab.com/kornerr/git-budget-sample-data/-/blob/me/gb.log
Отмечу некоторые важные моменты:
- по ссылке представлено хранилище Git, отражающее действия из видео;
- свои траты я храню в отдельном закрытом хранилище, так следует делать каждому;
- приложение работает полностью на устройстве и не имеет сервера: используется хостинг GitHub Pages;
- приложение общается с внешним миром лишь в момент синхронизации с Git;
- пароль хранит браузер, приложение использует его лишь в момент синхронизации с Git;
- приложение необходимо загружать по HTTP, т.к. используемая версия Isomorphic-Git (0.70.0) некоторые запросы (метаданные) к Git выполняет по HTTP, а браузеры нынче запрещают обращения к HTTP из HTTPS.
2. Почему это личный проект?
На ГитБюджет я потратил 40 часов своей жизни в течение первого квартала 2020-го, т.е. в среднем каждый день я тратил около получаса.
Личный проект обладает следующими преимуществами по сравнению с рабочим:
- Можно делать всё, что угодно, и учиться на своих ошибках.
- Никто не стоит над душой и не ограничивает фантазию.
- Предыдущие два пункта дают душевный покой и возможность совершенно спокойно принимать и исполнять самые идиотские решения на работе.
- Шишки, набитые в личном проекте, колоссально расширяют кругозор.
У личного проекта также есть и недостатки:
- На твой проект пофиг всем в мире, кроме тебя.
- Никто не даст тебе ни гроша.
- Нужно умудряться выкраивать время на личный проект каждый день.
- Жена не скажет тебе "спасибо", даже если сама потом будет использовать приложение.
Легко заметить, что все недостатки личного проекта перекрываются преимуществами рабочего проекта. А все недостатки рабочего проекта перекрываются преимуществами личного проекта. Инь и янь.
3. Почему проект на Git+JS?
Хранение данных в Git вместо неизвестного сервера/API даёт следующие преимущества:
- Git является самым распространённым решением для децентрализованного хранения проектов среди разработчиков, т.е. практически каждый разработчик умеет работать с Git.
- Для работы с Git не нужен очередной API: вы просто работаете с файлами.
- Есть много сервисов, предоставляющих хранилище Git бесплатно, если вы не помешаны на безопасности или не хотите платить денег за сервис.
- Владелец сервиса Git, конечно, может через несколько лет быть выкуплен крупной корпорацией, однако, вы легко сможете перенести свои данные Git.
- Для максимальной безопасности данных вы всегда можете поднять свой Git.
Использование JS с HTML/CSS вместо Swift/Kotlin/C#/Python даёт следующие преимущества:
- Ваше приложение будет работать и на телефоне, и на планшете, и на ПК.
- Вам не нужно проходить никаких проверок вроде AppStore, для того чтобы попасть в каждое устройство.
- Ввиду того, что стандарты HTML/CSS/JS согласуются огромным количеством компаний, ни одна из компаний не может в одностороннем порядке прекратить поддерживать какую-либо технологию или в очередной раз поменять API, так что обратная совместимость может достигать 20 лет и больше.
- Ввиду отсутствия сервера вся логика размещается в JS, исполняемый на клиенте, что даёт возможность сохранить ту версию приложения, которая устраивает лично вас, и забыть про обновления, зачастую приводящие лишь к увеличению тормозов.
ГитБюджет является лишь первым испытанием возможностей Git+JS. Посмотрим, что удастся сделать ещё.
P.S.: English version is available here.