ДМ / selado / ISART / MOUNT VII
58 subscribers
277 photos
55 videos
138 links
Download Telegram
Этим постом начну.
В ноябре 2018 я окончательно для себя решил, что хочу стать программистом.
До этого почти 10 лет я был коммерческим фотографом, но после 4 года стал каждый раз выгорать в конце сезона. И общая усталость и внутренее недовольство тем, что я занимаюсь "какой-то фигнёй" все росло.
Итак. Начал с самых-самых азов и поначалу был в радостном возбуждении от новой сферы.
Параллельно вел группу вконтакте, где описал все со мной происходящее. Копировать ее целиком сюда смысла не вижу, но время от времени буду проводить ретроспективу прошлых записей.
#СтатьПрограммистомПослеТридцати
И всегда мне казалось, что айтишники — это существа в кофтах и с пивасом, которые бегают по этажам и настраивают компы в бухгалтерии. Короче, какая-то фигня. То ли дело транспорт! Реальный сектор! Такие знания всегда пригодятся.

Мало того, что мне было смертельно скучно изучать основы проектирования АТП, принцип работы сцепления и как правильно нарезать зубчатые шестерни (я и сейчас помню про эвольвенту, чтоб её!); так еще и ни дня я не проработал по специальности.
6 лет обучения, магистерская степень и два диплома.
Мама, почему я так забил на себя? Почему не жалел времени и сил.

Когда мне попал в руки фотоаппарат, я понял, что это отдушина после стольких лет занятия не тем. Чистое творчество, компьютер и много новых знакомств. И понеслась.

Тем не менее, потребность в фундаментальном IT-образовании осталась. И здорово, что сейчас есть крутые курсы по программированию и море информации в открытых источниках.

#СтатьПрограммистомПослеТридцати
Вот как выглядит backlog #getbetterapp
Начал ещё в выходные, но только сейчас после работы доделал настройки для пушей.
Сделал по красоте, минимум кода и расширять потом будет легко.
Можно было хранить настройки в UserDefaults, но я упоролся по идее хранить конфиг удаленно, и потому фичу пришлось писать дольше, чем я думал.
Но зато какой кайф, когда «оно работает». Билд залил в AppStore, завтра проверю, чтобы в 9 долетел пуш (я у мамы кьюэй), и потом на проверку.
#getbetterapp
Как я выбирал язык программирования?

Ноябрь 2018. Мой текущий грейд — абсолютно никто.
Чтобы вы понимали, для меня не было большой разницы между Java и JavaScript. Я предполагал, что второй - это разновидность первого, но со скриптами.

Окей, у меня же есть знакомые программисты. Пишу им.
"Все деньги в джаве"
"Ты же модный и современный, почему бы не JS?"
"Попробуй рельсы"
Это соответственно Java, JS и Ruby разработчики😅

Я выбрал Java (не из-за денег, конечно же) и с головой ушел в обучение. Базу освоил быстро, а вот с ООП было тяжело. До сих пор помню когнитивный диссонанс от записи User user = new User().
Инстансы, наследование, SOLID... "Неужели все программисты знают это?"

Изучать Swift даже мысли не было. Почему-то iOS-разработчики казались мне небожителями (возможно, всё дело в стоимости Apple техники).
К марту 2019 окончил курс, сдал экзамен, написал с ментором небольшой проект и начал искать работу. Об этом расскажу в следующий раз.
#СтатьПрограммистомПослеТридцати
Нашел и пофиксил баг с авторизацией

Вчера выкатил версию 1.10.
От Waiting for Review до Ready to Sale прошло всего полчаса, удивительно.

Пока доводил до ума пуши, обнаружил неприятный баг.
GetBetter я писал как свой первый большой iOS-проект, и местами там остались некоторые сомнительные решения. Например, в классе FirebaseDatabase лежало поле let user = Auth.auth().currentUser. И это было удобно, например, чтобы в методах получать id пользователя. Вот только, если выйти из приложения и потом сразу нажать "продолжить без регистрации", то user оставался старый. А это вело к тому, что не запускался welcome-экран, выбор сфер и тд. База данных пыталась найти информацию о старом пользователе, а в сессии был новый.

В 1.10 баг пофиксил, и добавил классные анимации в дневник и советы дня, если там нет контента. Ну и по мелочи порефакторил.

#GetBetterApp
Тот случай, когда #GetBetterApp стал для меня вполне себе заменой Instagram и VK. Потребность вести дневник есть, но не хочется делать это в публичном пространстве. Приватная лента собственных постов с картинками — самое оно. Плюс есть визуализация прогресса, и некоторая статистика для любителей циферок.
Раньше я пользовался приложением DayOne, но оно было слишком навязчиво с просьбой оплатить подписку.
В 2021 есть, кстати, мысли сделать GetBetter платным, с единой ценой в 1-2 доллара, без внутренних оплат.
Бывает такое, что рабочий день кончился, а ты ближе к ночи придумал, как пофиксить тот баг. И с самого утра летишь к компу, смотришь, что это работает, и со спокойной душой идешь завтракать. Знакомо?
Anonymous Poll
79%
Да, братан, жиза
0%
Нет, зачем работать в нерабочее время?
21%
Я не программист и вообще не понимаю, о чем ты
Наверно, в любом коллективе время от времени рождаются локальные мемы. Для истории сохраню наши мемасы декабря, хоть они и в категории "memes without context".
Если это кажется лишним и вы на это не подписывались, дайте знать.
Чего не умеет Firebase

Сервисы Firebase от Google действительно хороши. Auth берет на себя всю работу с авторизацией (до сих пор не люблю писать авторизацию😅). Cloud Message шлет пуши. Storage хранит файлы. Даже на бесплатном тарифе нормальные квоты, которых хватит для небольшого проекта.
Realtime Database — это NoSQL база с нестрогой типизацией. К сожалению, она не умеет в запросы с просчетом на стороне сервера (либо я просто не знаю, как).

В #GetBetterApp есть фича "совет дня", у котого можно ставить лайк. Я хотел, чтобы на экране отображалось количество лайков всех пользователей. Долго думал, как лучше это реализовать. В итоге сделал таблицу tip_likes, в которой id - это id юзера, а внутри лежит массив id залайканных им советов. И чтобы показать количество лайков, приходится получать ВСЕ данные этой таблицы и искать вхождение текущего совета в каждой записи. И хорошо, если пользователей меньше 1к (как сейчас). А представьте размер JSON даже для 10к юзеров! Хотелось бы прямо в запросе делать entries.where { $0.contains(tipId) }.count и получать с сервера просто число, а не простынь.
График отправки и открытия пуш-уведомлений.
В декабре 2020 добавил пуши для советов дня. Заметно, что пользователи оценили и стали охотнее тапать по ним.
В январские праздники прирост новых пользователей сильно вырос: от 3-6 в день в 2020 до 10-15 в день сейчас.
#GetBetterApp
Уже несколько пользователей #GetBetterApp дали понять, что хотели бы видеть настройку времени для push-уведомлений. Ну что ж, этим я сегодня и занялся.

В Firebase на бесплатном плане доступны только 10 топиков. 2 уже заняты под текущие пуши, значит остается по 4 кастомных под эту задачу.
Раскидал так: Советы дня (6, 8, 10 и 12 МСК), Итоги дня (16, 18,20 и 22 МСК).

Как только все юзеры перейдут на новую версию 1.11, то старые топики удалю (и в коде надо будет убрать их упоминания).

Удалил сохранение настроек пушей из Firebase Database и перенес их в UserDefaults на устройстве. Потому что хранить конфиг в удаленной базе было лишним. Я совсем забыл, что подписка зависит от FCM-токена, который привязан к устройству. Простыми словами, можно было подписаться на айфоне, а на айпаде под тем же аккаунтом показывалось бы, что айпад тоже подписан (а это не так).

Пока что сборка только у меня на телефоне. Потестирую уведомления и если все ок, то на следующей неделе выпущу.
Слева: быстрый прототип
Справа: после ревью дизайнера
#GetBetterApp
Версия 1.11 уже в AppStore.
https://apps.apple.com/us/app/getbetter/id1522666671
Алмаз, тебе привет🖖