Для кого эта статья?
Для новичков в IOS, которым интересно как устроена сфера
Для тех, кто тоже выкладывает свое приложение
Для тех, кому интересно вспомнить, как они начинали свой путь новичком
Для тех, кто еще не определился со сферой в IT
Для тех, кому интересна моя история
Кто я и почему именно IOS?
На данный момент я являюсь 16-и летнем Питерским парнем, у которого еще с 7 класса была цель стать программистом. Пытался начать я свой путь несколько раз в течение 3-х лет. Вкатывался в Web dev с JS, но что-то не зашло - забил. Начинал вкатываться в Python с появлением его на школьных уроках информатики - забил. И вот, третий подход - состоявшийся, как я считаю. Я всегда был влюблен в технику Apple, и в один момент мне дико захотелось МакБук без причины. Он мне нравился и все - я горел им. В течение года копил 120к. Откладывал, работал с отцом, мутил серые темы. Вместе с моей покупкой мне открылся мир iOS разработки, которая с первых минут показалась мне особенным, чем-то новым. Это симбиоз как разработки клиент-серверной части(backend), так и версткой UI(frontend). Конечно, это вылилось в огромный трудоемкий процесс после того, как я начал создавать свое собственное приложение, но об этом позже.
Как я вкатывался в IOS?
В большинстве случаях новички загораются конкретным направлением в программировании после просмотра на ютубе человека, который говорит, что он зарабатывает 100000$ в наносекунду сидя дома и ничего не делая. Так случилось и со мной, когда я наткнулся на зарубежного IOS engineer'a. А так как этот период совпал с моей покупкой MacBook'a - я сразу определился с родом занятий на ближайшее время. Начинал я с простейших видео на ютубе: изучал основы, пробовал делать что-то в playground'e. Сначала было легко, ибо основные понятия в программировании я знал, оставался только синтаксис Swift'a.
Мой первый учебный проект, который и стал моим занятием на пол года
Я знал, что учить язык лучше сразу с практики. Мой путь был таков:
есть задача -> моя попытка реализации -> анализ результата -> поиск способа как сделать лучше
Почему я бы посоветовал новичкам делать именно так, в противовес идеи, которая гласит о том, что теория должна отлетать от зубов, а только потом можно приступить к практике? Ведь основная проблема новичков - сохранение мотивации. Лучше всего ее сохраняет видимый результат
. Ведь реальная практика на своем проекте позволяет понять тебе, что ты делать что-то реальное, не абстрактное.
По такой логике я и выбрал, что буду учиться на своем проекте, идея которого у меня была до этого. Было сложно, но я очень сильно радовался, когда у меня получалось сделать что-то незнакомое, да пусть даже вставить код из интернета, чтобы он работал.
LiquiLove: Приложение для пар
Так как у меня есть девушка, которая меня во всем поддерживала - я решил сделать приложение для нас. А дальше уже как пойдет. Спустя 5 месяцев разработки с полного нуля встречайте - LiquiLove, приложение, в котором вы сможете отслеживать ваши отношения, добавлять события и друзей. Синхронизироваться со второй половинкой, получать награды за ежедневный вход и добавлять виджеты.
Цикл разработки I: Создание первых экранов регистрации
На этом этапе я только познавал основы UIKit'a, верстки, переходов. Хочу отметить, что с самого начала я был против Сторибордов, все писал кодом. Этот период был самым сложным, ведь я окунулся в абсолютно незнакомую среду. Основы языка, которые я до этого учил, оказались вообще не тем, в чем заключались мои нынешние задачи. В результате я познакомился с созданием и настройкой UI, переходами между экранами.
Цикл разработки II: Подключение базы данных - Realm
Возникла необходимость локально хранить данные. Был выбор между нативным фреймворком CoreData и сторонним - Realm, который я и выбрал. На этом этапе разработки я реализовал логику регистрации, сохранения данных локально.
Цикл разработки III: Основные экраны: Главная, Календарь, Профиль
Самая масштабная ступень, которая до сих пор регулярно обновляется и дорабатывается. Здесь я намного ближе познакомился с UIKit, стал использовать архитектуру MVVM. Главный экран, где выводятся две фотографии, два имени и количество дней, проведенных вместе со своей второй половинкой, не составил большого труда. Интереснее же Календарь!
Здесь я близко познакомился с работой с датами, составлял свои собственные алгоритмы по сортировке, отображению, проверке валидности дат. Не всегда быстро, иногда нехотя, но я закончил делать календарь. Оставался последний шаг в этом этапе - экран настроек. Но это было несложно
Цикл разработки IV: Работа с сетью - синхронизация, добавление друзей
На этом этапе я понял, что нужно вносить в приложение нечто уникальное, надо быть выше конкурентов. Хотя их не особо много, да и уже на этом этапе я превзошел многих как по функционалу, так и по банальному удобству приложения. Здесь я убил двух зайцев сразу
Расширил функционал приложения, добавив две глобальных функции
Увеличил количество загрузок. Ведь некоторые функции становятся доступны только после синхронизации со второй половинкой)) А это значит, что один партнер будет просить скачать приложение другого!)
Использовал я Firebase - сервис от Гугла. В нем пользовался инструментами базы данных, хранилища фотографий, аналитики, авторизации, используя Sign In With Apple. В дальнейшем планирую ознакомиться A/B тестами.
Думаю, на этот этап я потратил больше всего нервных клеток) Ведь столько раз сталкивался с необъяснимым поведением. А сколько крашей и блокирований пользователей было на релизе - ммммм) Ведь синхронизация Realm и Firestore выкинула много подводных камней.
Цикл разработки V: виджеты и проблема с изучением новой технологии
Я решил вынести виджеты в отдельный пункт, ведь ради них мне пришлось познакомиться со SwiftUI, что выбило меня из колеи. Тут сработал "Синдром утенка". Ведь с начала знакомства с IOS разработкой я работал только с UIKit'ом. Я посчитал это лучшим для себя, отбрасывая другие варианты. Так же получилось и с Realm - я посчитал его перспективной и современной технологией с крутой командой разработчиков, как говорилось в видео на ютубе. В результате на ментально уровне у меня появилось отвращение к CoreData, он стал мне неприятен. После слов этого же видео, в котором гласилось, что Apple обосрались с кор датой, мой "эффект установки" дал о собе знать.
Эффект установки (Einstellung-effect) — феномен, при котором уже имеющаяся у вас идея или начальная мысль препятствует поиску лучшей идеи или решения.
Цикл разработки VI: подготовка к релизу, тесты
И вот, казалось бы, все уже готово, остается только протестировать, но этот этап затянулся. Я скинул проложение на оценку своим друзьям и знакомым, попросил фидбека. В результате этого в приложение много что поменялось, начиная переработкой каких-либо функций, заканчивая изменением в дизайне. Так же выявился ряд ошибок, на исправление которых мне понадобилась неделя. Параллельно я готовился выкладывать приложение в AppStore. Начал создавать дизайн, логотип, превью для аппстора. Это заняло у меня еще одну неделю. На релиз получилось бы выйти быстрее, если бы я не скачал Xcode 14 Beta. Мне пришлось около месяца ждать официальной версии Xcode, чтобы выложить приложение.
Цикл разработки VII: Финал - релиз
И настал заветный день - 8 сентября. Ровно пол года с момента начала моего изучения IOS разработки. Я не стал сразу подключать рекламу, ведь должен был убедиться, что все работает хорошо. Как вы понимаете, не все пошло хорошо)) пришлось выпустить 5 версий приложения с мелкими доработками и фиксами. На шестой версии я подключил рекламу от AppleAppstoreSearch с бесплатным промо кредитом в 100$. Спустя 10 дней после релиза приложение собрало около 70 загрузок, 1/3 из которых пришла при помощи синхронизации с партнером! Сейчас на момент 19-го сентября я буду подключать стороннюю рекламу, пытаясь добить 1000 загрузок до конца октября.
Итог
С полного нуля в IOS разработке за пол года я создал свое собственное приложение, что считаю хорошим результатом. Я не сидел по 6 часов в день, часто я вообще не садился за разработку. Главное, я не потерял интерес к этому, делал все по своим силам и возможностям, никуда не торопясь.
Отдельное спасибо хочу передать сообществу EasySwift