В этой статье будет две части: техническая, про приложение на Java, написанное для AWS, и демагогически разглагольствующая про похудение, мотивацию и т.д. Если вам интересна только техническая часть, то можете прыгнуть к параграфу "Техническая часть", а если нет, то приглашаю к части рассужденческой:

Несколько лет назад я прочитал статью, где приводилось множество расчетов, формул и объяснений, почему нам, разработчикам, так сложно похудеть. Ссылку я, к сожалению, не нашел, но думаю, многие из вас встречались с подобными публикациями. Совсем не понимаю, из-за чего подобного материала и разговоров про похудение так много, если существует только один способ в нашей вселенной (может быть, в другой вселенной другие законы физики) скинуть заветные килограммы, и это потреблять меньше калорий, чем ты тратишь. Не существует другого способа избавиться от лишнего веса, его природа не изобрела, в эволюционном процессе не возникло, а если кто-то утверждает обратное, то, возможно, вы маг и волшебник, зачем вы читаете эту статью? Тогда при чем тут все-таки программирование?

Демагогия

Я не верю, что похудение — это тяжелый и сложный процесс. Избавление от лишнего веса — это долгий процесс, который в идеальном (для меня) сценарии перерастает в процесс длиною в жизнь и никогда не заканчивается, как ремонт. Правда, в процессе переходит в другую категорию, где вы не стараетесь похудеть, а становитесь спортсменом для собственного здоровья и долголетия, и вся тяжесть переходит в снаряд. А если так, значит ли это, что вы никогда не получите желаемый результат? Именно так. Как только вы задаетесь такой целью: мне нужно похудеть, вы предопределяете свой провал. Цель должна быть сформулирована иначе: я хочу жить здоровую и полноценную жизнь. Цель похудеть никогда не приведет к удовлетворению, потому что в зеркале отражение никогда не будет выглядеть так, как вы хотите, и никогда оно не будет таким, как на фоточках в Instagram у фитнес-блогеров, хотя бы потому что вы не фитнес-блогер. В цели похудеть сразу встает вопрос: похудеть за сколько времени и как? Ну вероятнее всего, как можно быстрее, так? А значит, либо начать пить какую-нибудь дрянь типа жиросжигателей и испортить себе здоровье, либо посадить себя на строжайшую диету и через время набрать еще больше, чем вы скинули, и повторять этот цикл раз за разом. Сколько же раз я наблюдал этот круг в спортзалах: раз за разом люди начинали новую жизнь и возвращались в старую с набранной скоростью, падая в еще большую яму. Давайте даже предположим, что вы скинули заветные килограммы, вы стали выглядеть лучше? С большой вероятностью нет, потому что потерять воду, жир и мышцы не значит выглядеть лучше, для большинства людей это скорее обратный эффект. Да и потом, выглядеть лучше для кого? Для себя, для фоточек в Instagram или для своего мужа, жены, парня или девушки? Ни разу за 11 лет, проведенных в спорт-залах, я не общался с человеком, который был бы доволен результатом такой цели в длительной перспективе, НИ РАЗУ! Я могу объяснять и приводить примеры еще очень и очень долго. Для себя я раз и навсегда решил: это не цель и целью быть никогда не может. Самонадеянно предлагаю согласиться со мной, хотя бы на время прочтения этой статьи.

Цель

Итак, наша цель — это быть спортсменом всю оставшуюся жизнь и улучшать ее качество. Почему цель должна быть длиною в жизнь? Да потому что я уверен на 100 процентов, что подавляющее число людей на земле одинаковые в одном: мы хотим жить счастливо. Что это значит, решать вам, и я сейчас не говорю о деструктивных или неисполнимых желаниях, маньяках или психопатах, я говорю про большенство. Так если мы хотим жить счастливо, то почему бы не задаться целью, которую мы будем способны держать все время, отведенное для нас, а не в период с 23 до 31 года? А держаться такой цели невозможно без постоянства на ежедневной основе, и речь дальше пойдет только про еду. Даже не про тренировки и про то, что мы должны быть активнее, больше двигаться, бегать и бла бла бла, а про то, что мы готовим и кушаем каждый день. Правильное питание — это чуть ли не 80% успеха в поставленной цели, а может и больше. Если вы можете контролировать то, что вы едите, вы сможете контролировать свой вес, свое самочувствие в той или иной степени, улучшить свой сон и, в конце концов, жизнь. Ну что за бред, пишу и сам не верю. А вы посчитайте, какой процент от жизни занимает еда, а то, как сильно влияет на ваш организм то, чем вы кормите себя на протяжении десятилетий, переоценить нельзя. Я бы добавил сюда еще и сон, но это отдельный разговор, оставлю ссылку на отличную книгу про него.

Беспроигрышная схема действий

Я постараюсь описать схему, которая, как мне кажется, не может быть беспроигрышной, и если коротко, то изменения должны происходить очень и очень медленно и должны начинаться с самых простых шагов. На данный момент я просто знаю свой калораж, который составляет 2300 ккал в день, и я считаю каждый прием пищи, хочу скинуть — постепенно снижаю калории, набрать — повышаю за счет белка и углеводов. Но это сильно сложно и долго для многих людей взять и начать считать, если вы никогда так не делали, то, скорее всего, не продержитесь и пары месяцев. Давайте упростим схему. Пусть ваш первый шаг будет начать записывать то, что вы едите, сделайте заметку в телефоне и продолжайте так несколько недель, а затем начните анализировать, задайте себе вопрос: что бы я мог убрать из своего рациона? Например, пока я еду домой с работы, я съедаю обычно две конфеты или выпиваю газировку, а значит, могу это убрать и так далее, шаг за шагом: что-то вычеркнуть из рациона совсем, что-то заменить на белок и клетчатку. Тоже кажется сильно сложно? Не беда, упростите себе первый шаг еще сильнее, так как вы хотите и так, чтобы вы могли сделать это привычкой на всю жизнь. Например, так: я каждый день буду выпивать 2-3 литра воды, у меня есть бутылка, в которую я буду наливать эти два литра, и к концу дня она должна быть пустой. Я думаю, паттерн вы поняли: это делать то, что вы сможете делать неделю, две, месяц и так далее, не останавливаясь и никогда не переставая. И добавлять такие изменения по мере привыкания к предыдущим.

Техническая часть

Плавно перехожу к программированию и как это может быть связано. Как я упомянул ранее, я считаю калории, а это значит, что я (или моя жена) взвешиваем сырую еду, которую мы будем употреблять, и у нас не всегда есть возможность готовить каждый день, поэтому мы готовим на неделю. В чем сложность? Например, сварили мы 500 грамм риса, но это сырого риса 500 грамм, а сколько готового? Каждый раз это разное число, зависит от множества факторов, но суть одна: вы должны знать (если вы считаете калории), сколько граммов сырого продукта у вас на тарелке. Чувствуете потенциал для автоматизации? Каждый раз, беря готовый рис (или любую другую еду), мы должны были считать его по одной и той же формуле чтобы понять, сколько же тут сырого риса в готовом, и так с каждым блюдом и приемом пищи: курицей, бобами, говядиной, рыбой, хлебом, маслом, гречкой и так далее.

Формула:

(X / N) * Y, где:

  • X — сырой вес блюда, который вы хотите съесть

  • N — общий сырой вес приготовленного блюда

  • Y — общий вес готового блюда

Автоматизация процесса

Каждый раз вес готового продукта разный, потому что мы не хотим сойти с ума, кушая одну вареную курицу и рис. Поэтому от того, как вы готовите меняется и конечный результат. Так вот, в какой-то момент мы осознали, что надо сделать это более удобным. Так и появилась идея сделать приложение, которое будет запоминать и считать это все за нас. Идея очень простая: 

Записываем еду, которую приготовили, сырой вес, готовый вес, а когда кушаем, просто выбираем блюдо и сколько в сыром виде вы хотите скушать, а бот дает вам вес в готовом виде, который будет соответствовать сырому. Например, если вы приготовили 500 грамм риса, на выходе это, предположим, 1210 грамм готового блюда, итого, чтобы скушать 40 грамм сырого, вам нужно взять 96 грамм готового.

Сохранения блюда
Сохранения блюда
Прием пищи
Прием пищи

Реализация

Как реализовать такой функционал — непаханное поле вариантов. Что повлияло на мое решение: во-первых, мне не хотелось иметь для этого отдельное приложение, особенно для такого незначительного функционала, должно быть что-то, чем я постоянно пользуюсь. Во-вторых, мне хотелось изучить AWS Lambda, и выбор был очевиден — Telegram Bot. Для DI я выбрал Dagger. А вот для связи с БД я использовал стандартные инструменты из java.sql, и в конечном итоге я пожалел, что не потратил больше времени на поиск какого-нибудь легковесного ORM решения. Нужно писать очень много вспомогательного кода, на это уходит много времени, да и проект сильно разрастается.

Основные функции

Итак, мне нужно было сделать всего две вещи: возможность запоминать приготовленную еду и считать, сколько в N грамм приготовленного блюда X грамм сырого. Есть всего две кнопки: “Cooking” и “Eating”. При каждом нажатии на одну из этих кнопок сообщение улетает на сервер Telegram и оттуда приходит на webhook API Gateway, что триггерит лямбда-функцию, и этот запрос попадает в метод handleRequest, где в input, в поле body, лежит сообщение пользователя и вся дополнительная информация, которую нужно положить в объект update. Соответственно, при каждом новом сообщении пользователя нам нужно знать, на каком шаге находится пользователь, чтобы прислать ему нужное сообщение и выполнить действие, соответствующее его шагу. Исключение — команды, такие как /start, /help, /cancel. /start и /help — это стандартные команды, которые Telegram советует реализовать для лучшего user experience, тут просто выводятся сообщения пользователю и не нужно ходить в БД. При команде /cancel пользователя нужно вернуть в начало и отменить все предыдущие действия. К моему стыду, тут я поленился и при удалении не реализовал процесс отмены удаленного блюда, эта команда просто возвращает пользователя в главное меню. А вот команда /delete тоже запускает цепочку действий, как и основные кнопки, и пользовательский шаг сохраняется в БД.

Структура проекта

  • В пакете  com.nutritrack.bot.service.step  находиться вся логика отвечающая за обработку каждого пользовательского шага

  • Каждый сервис реализует StepService интерфейс, и называется именем пользовательского шаг: SteplessServiceImpl, RawFoodWeighingServiceImpl и т.д.

  • Все возможные шаги пользователя представлены в классе UserStep 

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

Ссылка на сам проект. В README.md я постарался дать подробную инструкцию, как его запустить локально. Ссылка на сам бот.

Вывод

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

Уже точно последний вывод

 Для чего нужно было делать этот проект и писать статью? Во-первых, для своего же удобства и экономии времени в каждом дне моей семьи. Во-вторых, для мотивации: я сделал свой проект, не идеальный, не без ошибок, но он помогает мне каждый день держаться моей цели. Разве это не достойная причина для потраченного времени? Ну и достаточное количество положительных side-effects, таких как изучение новых технологий: Dagger и AWS Lambda, осознание ошибок в выборе библиотек, законченный pet-проект, который лежит на GitHub, а не в папке на переносном накопителе, о котором я никогда не вспомню, и так далее. А статья? Ну что ж, если я вдохновил или помог хотя бы одному человеку проделанной работой, то это уже не зря! И если кому-то из вас не хватает мотивации начать делать что-то большое, начните с маленького. И если ваш собственный проект, статья или вклад в чье-то приложение сподвигнут на положительные изменения, то почему бы не попробовать? Спасибо всем за внимание! 

P.S. Как сказал мастер: Меньше тестов в приложениях ты пишешь, больше калорий при отладке сжигается ;) да прибудет с вами сила.

Книга: Matthew Walker; Why We Sleep

Видео про кишечник, иммунитет и питание от врача Александра Дзидзария

Для связи со мной LinkedIn

Проект на GitHub

Telegram Bot

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


  1. 150Rus
    05.07.2024 01:38
    +1

    Автор отстал от научного прогресса и не знает про семаглутид. Так что для желающих похудеть этот коммент из одной строки будет полезнее чем эта огромная статья.


  1. Vedomir
    05.07.2024 01:38
    +1

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


    1. StavrGodinovih Автор
      05.07.2024 01:38

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