В этой статье будет две части: техническая, про приложение на 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

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


  1. 150Rus
    05.07.2024 01:38

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


    1. bondeg
      05.07.2024 01:38

      Наверное стоит ещё добавить ссылки на исследования, а то открываешь инструкцию, а там про диабет. Например: https://www.probl-endojournals.ru/jour/article/view/13197

      Но рекомендуют ли врачи использовать его для этих целей и при каких условиях?

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


      1. 150Rus
        05.07.2024 01:38

        Но рекомендуют ли врачи использовать его для этих целей и при каких условиях?

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

        Любые лекарства имеют побочные эффекты, стоит так же это учитывать

        Вы мыслите как люди, которые не вакцинировались от ковида, потому что у вакцины были побочки.

        Наверное стоит ещё добавить ссылки на исследования

        Исследования - это частности. Если уж и добавлять ссылку, то вот эту: https://www.fda.gov/news-events/press-announcements/fda-approves-new-drug-treatment-chronic-weight-management-first-2014

        Эта ссылка является достаточным условием, в отличие от отдельных исследований.


    1. DarkGenius
      05.07.2024 01:38

      Не будет. Не надо советовать людям принимать без врача такие мощные препараты. Семаглутид может вызывать слепоту в качестве побочного эффекта, если что. И при прекращении приёма препарата вес быстро восстанавливается в 90% случаев.


  1. Vedomir
    05.07.2024 01:38
    +1

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


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

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


    1. Sorcer
      05.07.2024 01:38

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


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

        Согласен, но я интуитивно начинаю делать порции все больше и больше и вернуться в подсчет на пару недель, что бы вспомнить, каким они дожны быть для меня бывает очень полезно :)


  1. tminnigaliev
    05.07.2024 01:38
    +4

    И в статье много полезного и в комментах.

    Я недавно для себя пришёл к похожим выводам.

    Считать калории не могу - некогда, поэтому я просто решил использовать эффект куммуляции малых изменений.

    Например: заменил весь сахар и сдадкие напитки на сахарозаменитель (и тем стараюсь радовать себя не очень часто, т.е. использую его как вознаграждение).

    Убрал белый хлеб полностью. Вместо него ем чёрный и не более 2 кусочков в день.

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

    Когда отвожу детей в школу - паркуюсь за 300-500 метров, а не около школы. За счёт этого прохожу "лишние" 1-2 км в день.

    Иду в офис - поднимаюсь на 6 этаж по лестнице всегда, иду с обеда - ещё раз.

    За 3 месяца с 98 спустился до 88. Вначале быстро пошло, потом замедлилось, но я решил, что я не худею, а меняю привычки и это навсегда.

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

    И ещё: взвешиваться не надо каждый день. Достаточно раза в неделю, но если нет динамики, это означает, надо делать ревизию потреблённого. И снижение потребления и увеличение нагрузки.

    Мне в этом помогает Obsidian. Я использую рекуррентные таски для учёта съеденной "нездоровой" еды и учёта "лишней" нагрузки - километров и этажей.

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


    1. tminnigaliev
      05.07.2024 01:38
      +4

      Да, ещё одно дополнение: если вас позвали в гости или на корпоратив - не надо там делать вид, что вы на диете. Поскольку ваша цель изменить образ жизни - вы и так не поправитесь оттого, что один раз съедите что-то нездоровое. Надо себе в таких случаях говорить: я долго работал и заслужил вкусной еды. Но при этом главное там не обжираться.

      Аналогично, если один раз произошёл срыв, дети ели мороженное, не удержался и тоже съел - надо себя за это не ругать, а похвалить, что хорошо провел время с детьми.