И я имею в виду *фактически* строить, а не просить ChatGPT строить

Забавно, куда можно попасть, следуя своему любопытству.

В конце 2021 года, когда мне было немного скучно, я нашел бесплатное руководство по программированию на Python и подумал: почему бы и нет?

Менее чем через год после того, как я написал свой первый Hello, World и работал над проектом неполный рабочий день, я запустил свое приложение Kava в App Store и Play Store. У меня довольно приличная пресса. И он растет. Вроде.

Это мое путешествие. Хорошие, плохие, отрывки-вопли-вырывающие-на-волосы-почему-ты-внезапно-перестали-работать-ты-дерьмо-биты.

Если вы думаете о том, чтобы сделать что-то подобное, сядьте на несколько минут и прочитайте это.

Шаг 1 — Учитесь бесплатно

Я начинал с нуля, с нулевым опытом программирования (если не считать полсеместра C в колледже более 20 лет назад).

Поэтому сначала я прошел несколько бесплатных онлайн-курсов, включая Введение в Python, Python для всех и Django для всех от Udacity.

Я прошел еще несколько руководств, выполнил несколько задач по кодированию на таких сайтах, как Codewars, и создал несколько парсеров на основе вакансий фрилансеров, которые я видел на Upwork, но я быстро решил, что действительно хочу создать что-нибудь, а не просто писать небольшие фрагменты или воссоздавать простые примеры проектов.

Шаг 2. Вернитесь к идее, которая крутилась у меня в голове

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

Что-то вроде Untappd, но для спешелти кофе, а не для крафтового пива.

Некоторые поиски выявили несколько других специальных приложений для кофе, но ничего из того, что я хотел.

Итак, в марте 2022 года, стремясь приступить к работе над реальным проектом, я вытащил свой дневник и начал набрасывать план приложения. Что бы это сделало? Как будут храниться данные? Как будет выглядеть пользовательский интерфейс?

На этом этапе я просто хотел построить что-то вроде учебного проекта, а не реального бизнеса. Я подумал, что это звучит круто, и это было примерно столько оправданий или исследований, сколько мне было нужно.

При этом я проигнорировал собственный совет. В старой статье я бойко посоветовал потенциальным предпринимателям:

Создайте фан-клуб, прежде чем делать что-то еще. — Я, октябрь 2021

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

Не вернется ли это позже, чтобы укусить меня за задницу? Возможно, но мне не терпелось начать, и ничто не могло меня удержать.

Шаг 3. Определитесь с техническим стеком для олдскульного приложения для социальных сетей.

Как полный новичок, мне нужно было, чтобы технический стек был простым в освоении и быстрым в разработке, а множество ресурсов, библиотек и фреймворков помогало мне в этом.

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

Вот технический стек, который я выбрал:

Серверная часть — Python/Django/PostgreSQL

Поскольку я уже изучил Python и Django, они были естественным выбором для серверной части, поскольку они быстрые, масштабируемые и безопасные. Django абстрагируется от большей части базы данных, но я выбрал PostgreSQL, так как он казался де-факто выбором базы данных для большинства приложений Django.

Позже я включил Celery и Amazon SQS для асинхронного планирования задач. Я выбрал SQS, потому что он оказался более совместимым с выбранной мной платформой облачного хостинга по сравнению с другими вариантами, такими как RabbitMQ или Redis.

Интерфейс — шаблоны Django/HTML/CSS/JavaScript

Я хотел, чтобы приложение имело очень простой, олдскульный вид, поэтому мне не нужно было ничего слишком сложного, и рендеринг шаблонов Django на стороне сервера хорошо работал для этого, дополненный небольшим количеством JavaScript.

Поскольку я уже использовал CSS-фреймворк Bulma во время Руководства по настоящему Python, я решил придерживаться его, так как мне понравился чистый внешний вид, простой синтаксис и адаптивный подход для мобильных устройств.

На этом этапе я ничего не знал о SPA или React — или подобном — но в любом случае это означало бы изучение целого ряда новых вещей и задержку процесса разработки.

Простой олдскульный интерфейсный стек был заперт.

Приложения — PWABuilder

Небольшое исследование показало, что для разработки приложений для iPhone и Android мне, вероятно, потребуется изучить больше языков, чем только Python. Но в идеале я хотел иметь дело только с одной кодовой базой. Учитывая, что я только начал изучать один язык, мне не хотелось учить еще целую кучу других новых языков.

Я решил начать с того, что сначала создам его как веб-сайт, а затем возьму его оттуда. Однако дальнейшие поиски показали, что можно преобразовать веб-сайты в кроссплатформенные приложения под названием Progressive Web Apps.

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

Это откровение было достаточно захватывающим, но потом я узнал, что можно упаковать PWA для распространения через Google Play Store и Apple App Store с помощью PWABuilder.

Технология все еще является экспериментальной, и не гарантируется, что она будет построена правильно или будет одобрена повелителями App Store. Тем не менее, это стоило того, чтобы попробовать. Я всегда мог бы подумать о разработке полноценных нативных приложений в будущем, но, по крайней мере, у меня было бы что-то, с чего можно начать.

Облачный хостинг — Платформа приложений DigitalOcean

После оценки нескольких вариантов я решил использовать DigitalOcean App Platform, так как он отвечал всем требованиям с точки зрения простоты и относительной дешевизны для начала работы, а также имел в виду масштабируемость, если что-то пойдет не так.

У него также есть отличная поддержка, которая, как я понял, мне, вероятно, понадобится, когда я только начинаю (конечно, я это сделал).

Шаг 4 — Сядьте (желательно в кофейне) и закодируйте эту чертову штуку

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

Процесс развития

У меня была грубая идея процесса разработки, но, по сути, я просто построил ее постепенно, начиная с самых основ, таких как регистрация пользователей и аутентификация, прежде чем перейти к созданию рейтинговой системы, обработке изображений и интеграции с Google Maps для интерактивной карты.

На каждом этапе я начинал с самого простого подхода, а затем совершенствовал его.

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

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

Тестирование (или его отсутствие)

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

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

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

Шаг 5. Выпустите ребенка в мир

Доведение приложения до стадии, когда я мог выпустить его как PWA, заняло около 5–6 месяцев, хотя я работал над приложением только неполный рабочий день, и, конечно, мне пришлось изучать все с нуля. как я пошел.

Преобразование веб-сайта в PWA было очень простым с помощью PWABuilder — на самом деле требовалось только настроить JSON-файл манифеста шаблона и выбрать подходящее кэширование сервис-воркера и автономную стратегию.

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

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

Это было там.

Шаг 6. Наименее любимая часть каждого разработчика-одиночки (маркетинг)

Я (сейчас) разработчик, а не маркетолог.

Я не силен ни в саморекламе, ни в какой-либо другой форме контента в социальных сетях. Чтобы усложнить ситуацию, я не хотел тратить деньги на рекламу.

Я надеялся, что если мне удастся привлечь к приложению пару сотен человек, оно постепенно начнет расти органически.

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

Еще.

Приложение еще молодое — ему всего несколько месяцев. Вот некоторые вещи, которые я нашел хорошо работающими:

  • Освещение в прессе, в частности хорошая статья в Хорватии, один из ключевых рынков для приложения.
  • Контент-маркетинг и использование авторитета домена того самого сайта, на котором вы сейчас находитесь, чтобы помочь повысить поисковый рейтинг контента блога приложения.
  • Свяжитесь со специализированными кофейнями и любителями кофе напрямую в Instagram, чтобы пригласить их проверить приложение.

И вот что я намерен делать впредь:

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

Запуск приложения — это не одноразовая вещь — это постоянный проект. И я намерен относиться к этому соответственно.

Мои самые важные уроки, только для вас

  • Если вы начинаете писать код с нуля, помните, что все занимает больше времени, чем вы думаете. Мой второй проект приложения, над которым я сейчас работаю, был завершен в несколько раз быстрее, чем Kava.
  • Это здорово, если вы просто хотите следовать своему любопытству, особенно если вы подходите к своей первой идее приложения как к учебному проекту.
  • Ничто не идеально. Легко переживать, что как начинающий программист вы не сможете создать что-то столь же хорошее, как приложения, созданные «настоящими» командами разработчиков. Ну, вы, вероятно, не будете. Но это нормально. Ничто не идеально, даже (или, возможно, особенно) приложения, сделанные большими парнями.
  • Да, есть некоторые решения, которые действительно могут ударить вас по заднице. Но вряд ли вам придется все выбрасывать и начинать заново. Как правило, вы можете уточнять и улучшать по ходу дела. Так что не затягивайте с принятием решений.
  • Самые, казалось бы, тривиальные вещи могут занять больше всего времени. И наоборот, то, что внешне — или для обычного пользователя — может выглядеть как серьезные изменения, на самом деле часто может быть крошечной доработкой.
  • Интеграция различных сервисов в производственную среду может быть сложной задачей. Например, включить Celery в мою локальную среду разработки было просто, но совсем по-другому в моей производственной среде.
  • Если маркетинг вам не по душе, не делайте того, что сделал я, и подождите до конца, или избегайте этого, заставляя себя чувствовать себя занятым, возясь с вещами, которые представляют собой просто технические проблемы или приятные вещи. Разберитесь со своей стратегией и придерживайтесь ее.

Последние мысли

Создание и выпуск Кавы было одним из самых сложных, приятных и полезных дел, которые я когда-либо делал.

Да, временами это меня расстраивало, и да, есть вещи, которые я мог бы сделать лучше или сделал бы по-другому.

Но если у вас есть идея — даже если вы новичок — следуйте своему любопытству.

Вы никогда не знаете, куда это может привести вас.