Русский
Русский
English
Статистика
Реклама

Начало пути

Из песочницы Веб-разработка с нуля руководство для молодых команд по созданию инфраструктуры CICD и процесса разработки

04.11.2020 16:22:09 | Автор: admin

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


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

Внутренний перфекционист жаждал организовать всё правильно. Делюсь результатами поисков ответа на вопрос: а как, собственно, правильно?


Мы добились


  • Легкого и быстрого деплоя в production (ради эксперимента выводили каждый день две недели подряд);
  • Гарантию защищённости от ошибок из-за различий в окружении приложения;
  • Можем организовать эффективное взаимодействие с заказчиком:
    • демонстрировать каждую feature-ветку;
    • давать гостевой доступ для создания задач и наблюдения над ходом работ.

Данная статья будет полезна, если вы:


  • начинающая IT-компания или в первый раз столкнулись с работой в команде над большим проектом;
  • хотите обновить свой устаревший процесс разработки (workflow);
  • ищете лучшие практики и хотите посмотреть, как у других;
  • часто натыкаетесь на статьи про DevOps, CI/CD, облака и хотите, чтобы у вас одним нажатием кнопки создавались тестовые окружения, а очередное обновление прода не было рулеткой.

Под катом вы найдёте


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


Статья состоит из трех частей:


  • Моё видение типичного процесса разработки;
  • Инфраструктура для реализации любого современного рабочего процесса;
  • Кейс для веб-разработки.

Поиск информации, актуальность вопроса


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


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


В конце концов, я пересмотрел большое количество связанных с данной темой материалов, ознакомился с различными инфраструктурными инструментами, пропустил всё через собственный опыт. При реализации прошёлся по всем граблям, о которых в официальной документации было сказано мало, но грабли должны были быть пройдены во имя best practices. Также понадобилось время по наладке работы отдела по-новому.


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


Итак, приступим.


Вам понадобится:


  • Наличие каких-либо мощностей в распоряжении. Может быть свой сервер, а может быть и облачная инфраструктура;
  • Знание вашего приложения, как оно работает, как сейчас разворачивается;
  • Базовые знания сетей, git, Linux, Docker, GitLab, Traefik.

Типичный процесс разработки


Обязательные составляющие


1. Работа по классической модели в git



A successful Git branching model by Vincent Driessen


Необходимый минимум иметь ветки: master, dev и feature.


Feature
В каждой feature-ветке ведется работа над каждым отдельным функционалом / исправлениями, создаются от dev-ветки. Прекращают существование после того, как изменения вольются в dev.


Dev
В dev происходит окончательная совместная отладка и тестирование всех новых изменений, после этого производится релиз в master.


Master
От этой ветки и происходит релиз на production-сервер. Также, при необходимости срочных исправлений, от неё создаются hotfix-ветки, вливаются в неё же и удаляются.
Master и dev защищены от прямых пушей, существуют всегда.


2. Совместная работа в трекере задач. Документация всех принятых решений.



Это очень важный момент. При переключении между несколькими feature ветками, программисты теряют контекст буквально на следующий день. Записать задачу с невысоким приоритетом в виде глянуть, что не так с xxx недостаточно, чтобы вспомнить, о чем идёт речь. Все замечания необходимо фиксировать в обсуждениях Merge Request-а данной ветки. Необходимо вести wiki проекта, чтобы ускорить адаптацию новичков и утверждать принятые решения.


Важно всегда помнить, что если что-то не записано этого не существует.

Крайней степенью документирования может служить опыт GitLab, которая была компанией без офиса ещё до того, как это стало мейнстримом пандемии.


3. Автоматизация инфраструктуры для тестирования и релизов


Всё просто чем быстрее вы можете выводить свои решения в продакшн, тем они надёжнее и вы конкурентоспособнее. Часто можно встретить статьи, где измеряется количество релизов в месяц/неделю/день.


Я считаю, что это и послужило катализатором развития всех современных IT-гигантов и то, что сформировало DevOps. Сперва они автоматизировали процесс тестирования и выкатки своего монолита. Появилась проблема ожидания и невозможности локально развернуть окружение для разработки. Решением стала идея микросервисной архитектуры, что принесло новые проблемы. Где-то тут появилась идея контейнеризации (LXC), затем Docker, оркестраторы и понеслось...


Функциональные роли


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


Менеджер проекта


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


Владелец продукта


Представляет себе общий образ продукта, чем он должен стать, какие ценности нести для клиента. Ведет бэклог (список задач) продукта, определяет приоритеты задач, знает о всех функциях продукта, также, до определённой степени, с технической стороны. Должен иметь опыт разработки. Именно тот человек, который должен сказать, что людей не хватает. Ограждает команду от прессинга начальства.


Аналитик / Технический писатель


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


Дизайнер UI/UX


Ответственный за то, чтобы пользователям было удобно работать с продуктом. Критически важный элемент успеха (если вы не Microsoft, конечно).


Архитектор


Скорее всего работает на нескольких проектах. Самый опытный разработчик в компании. Консультирует тимлида.


Тимлид


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


Разработчик


Пишет и документирует код. Проводит код-ревью коллег.


Разработчики специализируются на своих направлениях: бэкенд, фронтенд, мобильная разработка и т.д., в зависимости от проекта.


Тестировщик (QA / QC)


Quality Control (QC) тестирует продукт. Как вручную, так и с помощью написания кода. Quality Assurance (QA) также участвует в разработке архитектуры и инфраструктуры проекта, чтобы получение качественного результата закладывалось в процессе производства (Дао Toyota принцип встраивания качества). К примеру, тестировать именно тот docker-образ, который и будет выкачен на продакшн, а не пересобирать его после тестов.


Системный администратор (DevOps)


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


Процесс разработки



Этапы workflow


  1. Любая задача начинается с появления потребности в каком-то улучшении (feature) или отчёта об ошибке, которая сообщается владельцу продукта. Происходит фиксация в трекере.
  2. Владелец продукта сам или с помощью аналитика выясняет все подробности. Всё записывается в задачу. Проводится первичная оценка трудоёмкости. Определяются приоритеты, возможно уже ставится в план работ.
  3. Когда подходит время реализации, совместно с тимлидом производится декомпозиция (разбиение на подзадачи), определяются исполнители, совместно с ними она проговаривается, фиксируются достаточные для исполнителей описания по реализации. Если требуются уточнения по задаче обращаются к владельцу продукта.
  4. Создаётся feature-ветка из dev и, собственно, пишется код. Если задача большая и состоит из подзадач, то выделяется основная feature-ветка, в которую вливаются ветки подзадач. Пишутся тесты, если для этой задачи было принято такое решение.
    Примечание: для того, чтобы минимизировать конфликты при слияниях веток, необходимо, чтобы архитектура вашего приложения поддерживала минимальную связанность модулей. А также не стоит начинать работать над задачей, реализация которой приходится на тот же самый участок кода, который изменен в другой задаче, но по ней ещё не принят merge-request.
  5. Создаётся merge-request в dev-ветку, производится сборка, тестирование и деплой feature-ветки.
  6. Проводится ревью кода другими разработчиками, ручное тестирование. При наличии недочётов снова авто-тесты, деплой, повторная проверка.
  7. Тимлид проводит финальную проверку и принимает готовую feature-ветку в dev.
  8. Когда приходит время очередного релиза, из dev-ветки со всеми последними изменениями создаётся merge-request в master и аналогичные пунктам 5, 6 действия.
  9. Аналогично пункту 7, возможно привлекается владелец продукта.
  10. Очень полезно сообщать пользователям, какие произошли изменения (формирование changelog-а), а также обновлять справку по продукту. Обновляем документацию и принимаем изменения в мастер.
  11. Автоматически или вручную, выкатываются изменения в production.
  12. Ведётся мониторинг приложения. В данной статье не рассмотрен.

Инфраструктура


При выборе инструментов использовались критерии:


  • production-ready
  • большое комьюнити
  • невысокий порог входа относительно других инструментов
  • как можно меньшее их количество (больше функциональности у каждого)

Итогом стал выбор технологий: Traefik, GitLab и Docker.



  • Используется 3 сервера [Production], [Staging] и [Services]. Могут быть физическими или виртуальными машинами, количество может быть меньше и больше, может быть всё в облаке. Приведена наиболее эффективная конфигурация с точки зрения надёжность/цена. Главное, чтобы [Production] был отдельным и самым надёжным. На сервере [Services] установлен GitLab а также второстепенные сервисы (мониторинг, docker registry: Portainer, ELK, Harbor, etc), которые и будем называть Services. В данном примере их настройка не рассматривается. Все приложения работают в Docker-контейнерах. GitLab лучше установить отдельно, зависит от располагаемых мощностей.
  • Traefik собирает информацию о запущенных динамических DNS-именах для *.dev.company.ru, подключившись к докеру [Staging] по TCP и предоставляет к ним доступ. Также автоматически получает SSL сертификаты для приложения на [Production]. Wildcard (WC) сертификат *dev.company.ru получается с помощью отдельного контейнера letsencrypt-dns, если ваш DNS-провайдер не поддерживается в Traefik. Traefik использует этот или самостоятельно полученный сертификат, обрезает SSL от клиентов и перенаправляет http запросы по доменным именам на соответствующие сервисы. Работает на [Production] вместе с основным приложением App.
  • GitLab на [Services] с помощью GitLab-runner-ов, установленных на остальных ВМ, по Merge Request-ам (МР) на ветки dev и master, управляет запущенными докер-образами на [Staging] и [Production] согласно файлам .gitlab-ci.yml проектов.
  • Сборка, тест и стейджинг происходят на [Staging].
  • В данном решении GitLab также работает как Docker Registry, где хранятся собранные образы приложений.
  • Сами GitLab, Traefik и Gitlab-runner-ы также работают в docker-контейнерах, что позволяет легко обновлять и переносить инфраструктуру.

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


https://github.com/Akkarine/demo_cicd


Предупреждение


  • Данное инфраструктурное решение является скорее стартовой площадкой для понимания основных принципов, нагрузочных тестирований не проводилось. Очень многое зависит от железа и архитектуры приложения. Для больших нагрузок, повышения надёжности и работы в облаке рекомендуется рассмотреть Enterprise версии Traefik и GitLab и воспользоваться консультациями специалистов.
  • В репозитории содержатся части конфигурации, которые очевидно нужно будет изменить под себя. Например, временная зона, почтовые адреса, домены и т.п.
  • Так как работа была проведена год назад, Traefik и GitLab заметно развились за это время и уже многие вещи можно оптимизировать. Так, Traefik уже поддерживает DNS Yandex (не без моего скромного участия) и больше не нужен промежуточный сервис. А в GitLab появились более гибкие возможности конфигурирования. Например, rules.
  • Также стоит обратить на секцию Что можно сразу улучшить.


Кейс для веб-разработки


https://github.com/Akkarine/demo_cicd_project


Пример приводится для небольшого веб-приложения, также для понимания основных принципов, так как предполагает:


  • Недоступность приложения при обновлениях. Для организации выкатки без downtime потребуется поддержка со стороны кода приложения (версионность API бэкенда, поэтапные миграции БД), более сложные настройки load-balancer-а и алгоритма выкатки, а в идеале переход на другой уровень инфраструктуры kubernetes. Так что это уже далеко не уровень для начинающих
  • Запуск базы данных в докере (влияет на производительность)
  • Копирование production-базы данных для стейджинга (конфиденциальность данных)
  • Вызов команд от root в контейнерах (далеко не лучшая практика)

Самое главное в репозитории файл .gitlab-ci.yml. Рассмотрим стадии pipeline-а и входящие в них задачи на соответствие шагам в рабочем процессе:


  • base-img-rebuild
    • rebuild-base-backend
      Для ускорения сборка разбита на два этапа. На текущем первом, строится базовый образ, который будет запускаться только при изменении файлов с описанием зависимостей. Во втором (стадия build), уже самого приложения.
  • rebuild-dev-db
    • rebuild-dev-db
      В данной задаче подготавливается общий образ базы данных для тестовых веток с бэкапом базы данных, развёрнутой прямо внутри образа.
  • build
    • rebuild-proxy-img
      Так как образ прокси-сервера nginx будет обновляться крайне редко, то данный образ можно сразу создавать с тэгом latest
    • build-backend
      Происходит сборка приложения с текущими изменениями, пока тегируется номером задачи (уникально для всего GitLab)
  • test
    • testing
      Запуск автоматических тестов
  • deploy-review
    • deploy_review
      Поднимается тестовый сервер, практически идентичный production, только с конфигурациями серверов, менее агрессивными к ресурсам.
  • skip_review
    Используется для того, чтобы пропустить создание тестового сервера, если он на данном этапе разработки не нужен.
  • review
    • approve-dev
      Вызывается вручную. Когда Merge-request идёт в dev (т.е. текущая ветка feature), то можно не нажимать. Задача просто для зелёной галочки на пайплайне.
    • approve-staging
      Вызывается вручную. Когда Merge-request идёт в master (т.е. текущая ветка hotfix или dev и идёт релиз), то протестированный образ с этапа build тегируется latest и заменяет предыдущую версию в репозитории. Для того, чтобы не затёрлась следующей latest версией, также заливается и с тэгом номером задачи.
    • reject
      Вызывается вручную. Просто отображает красный крест на пайплайне. Так из списка Merge Request-ов будет видно, что с данной веткой что-то не так.
    • stop_review
      Может быть вызвана как автоматически, так и вручную. Останавливает поднятый тестовый сервер.
  • rebuild-approved-db-img
    • rebuild-approved-db-img
      Если review был успешен и было обновление файлов в контексте создания образа БД, то создаётся новый образ с меткой latest и заливается в репозиторий.
  • deploy-prod
    • deploy-production
      На проде делается бэкап базы данных и обновляются контейнеры до latest. Если бэкап был неудачен, выкатка не происходит.
    • deploy-production-wo-containers
      В случае, если не поднята базы данных для бэкапа, пропускается это действие.
  • clear
    Происходит очистка серверов staging и production от хлама
    • clean-staging
    • clean-prod
  • restore-db
    • restore-db
      Для первого деплоя или крайне неудачного обновления восстанавливает базу данных из бэкапа.

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



Материалы


Traefik



Альтернативный вариант reverse proxy + SSL на nginx



GitLab



GitLab SSL config



GitLab Registry



Gitlab-runner



Docker



Прочее полезное


Подробнее..

Из песочницы Cоздавать или отказываться проверка идеи на прочность

15.06.2020 18:18:41 | Автор: admin

С чего начинается IT-стартап и вообще любая новая задача в IT-проекте? С идеи и вопросов к себе


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

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

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

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

Чек-лист с содержанием в коротких абзацах


Я хочу создать <Идея>, потому что <Кто Ваши пользователи и конкретные примеры реальных потенциальных клиентов?> имеют проблемы: <Какие проблемы у Ваших потенциальных пользователей?>.

Мое решение будет <Список особенностей, составляющих Идею>, что позволит устранить проблемы целевой аудитории. Мои пользователи Не могут решить проблемы иначе / Также могут решить задачу <Список альтернативных решений>.

Я выполнил анализ информации и Не нашел аналогов своего решения / Нашел аналоги своего решения, но мое будет лучше, потому что <Список уникальных особенностей, отличающих Идею от аналогов>.

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

Я планирую запустить разработку <Дата>.

Я готов и я уверен в своей Идее.

Use the Google, my Dear


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



Если Google говорит, что идея нова, то с удовлетворением можно ставить галочку в чек-листе и переходить дальше, но советую разочаровавшимся не отчаиваться и попробовать провести анализ. Для начала пролистаем первые страницы результатов и выберем список работающих решений (если хоть одно вообще работает!) их может быть одно, а могут быть десятки.

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

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

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



Какую проблему я хочу решить и для кого?


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

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

Предлагаю базовый список вопросов, достаточный для проверки гипотезы о существовании проблемы:

Это создается для устранения потерь времени или денег?
Если решение никаким образом с этим не связано, то круг ваших пользователей скорее всего будет очень ограниченным. Сразу же хочу остановить негодование: развлекательные IT-проекты (например игры) решают проблему потери времени. Вместо того, чтобы бесполезно его терять, умирая со скуки, люди теряют его, занимаясь делом. Поэтому не обязательно, что решение напрямую касается времени и денег, но важно притянуть его к тому, что эти потери будут устранены.

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

А у кого эта проблема?
Это последний и главный вопрос. Бывает так, что проблема кажется проблемой только для ограниченного круга лиц или только для одного человека себя.
Для проверки гипотезы существования проблемы определитесь с кругом лиц, которому может потребоваться создаваемое решение, выберите целевую аудиторию и звоните, пишите и спрашивайте. Важно! При опросе не пытайтесь продавать, используйте фразы: А интересно ли , А как Вы отнесетесь к, А что, если мы бесплатно предложим Вам поучаствовать в тестировании и другие.
Если Вы найдете отклик среди своих друзей, знакомых или потенциальных клиентов среди любых возможных пользователей, то значит найдена целевая аудитория, и создается что-то действительно нужное. В противном случае, кажется, что решается локальная проблема это нормально, если Вы не планировали большого количества конечных пользователей. А вот если планировали кажется что-то пошло не так и не стоит делать бесполезный продукт.



Время, деньги и рок-н-ролл


Любая идея автоматизации преследует за собой цель завоевание пользователей. Получение пользователей получение прибыли.



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

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

Время создания минимальной версии не должно превышать 4-6 месяцев это тот простительный период, когда никто не успеет начать делать то же самое, а вдохновение будет еще сильным. Перед началом разработки обязательно нужно будет пройти этап описания минимальной версии проекта, для понимания масштабов на этом этапе. Это шаг формирования технического задания (только не думайте о ГОСТ нам это не надо).

Время финансовой окупаемости и получения первой прибыли не должно быть больше времени разработки, потому что в плюс нужно будет выходить, чтобы развиваться. Расчет бюджета IT-проекта отдельный вид искусства. Бывают разные виды проектов и разные способы заработка. Например, проекты для себя, где нужно автоматизировать какие-то внутренние процессы организации, чтобы получить выгоду от внедрения решения, а не от продажи его кому-либо. Есть приложения для разовой продажи и внедрения, есть приложения по подписке. Слишком много всего, главное найти способ примерно оценить доход.

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

Я дочитал до этого раздела и все еще уверен в себе


А если Вы все еще не сомневаетесь в своей идее, значит надо делать.

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



Спасибо за внимание!
Подробнее..

Мечтал стать сценаристом, а стал программистом

28.04.2021 10:12:44 | Автор: admin


Привет! Меня зовут Михаил и год назад я стал iOS-разработчиком в компании ЦФТ. До этого почти 8 лет я проработал в сфере логистики и таможенного оформления, а айосером меня можно было назвать разве что из-за наличия iPhone.


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


Немного о прошлом


До 2018 года я жил в небольшом городке Находка, что на берегу Японского моря. Несмотря на своё профильное IT-образование, меня мало интересовало программирование. В универе мы проходили древние Pascal и Delphi, которые меня никак не увлекали. Хотя в студенческие времена, меня мало что интересовало кроме корейских MMORPG. Играл в Lineage 2 и Aion.




Отучившись в универе, я ушёл в армию. А после службы, я не нашёл альтернативы с нормальным заработком под мои способности (которых, как мне казалось, особо и не было). Так я оказался в сфере логистики. Сначала я устроился менеджером по работе с клиентами, затем портовым экспедитором. После двух лет в логистике я решил перейти в таможенное оформление. Первое время мне было интересно, потом просто всё устраивало. В какой-то момент я осознал, что дальше в этой сфере не хочу развиваться.


Почему iOS?


До сих пор помню тот момент, когда я увидел iPhone впервые. Это был безумно красивый iPhone 4, который подарили моему другу. Меня сильно впечатлило то, как было реализовано взаимодействие с ОС, насколько оно было плавным и отзывчивым.




С тех пор началась, и все еще продолжается моя любовь к яблочным гаджетам. Эх, а это был далёкий 2011 год, когда Джобс ещё был жив, FruitNinja была в топе AppStore, а в Instagram не было рекламы.



Swift. Начало


Swift я начал изучать в 2017. Мне стало интересно сложно ли создать своё приложение. Сначала я наткнулся на стэндфордские курсы, а позже я нашёл swiftbook, который уже к тому времени запустил Иван Акулов.


Язык по первости казался не таким уж и сложным для понимания. Ну что там? If, else, циклы всё же понятно! Версия на тот момент была уже 3.x, которая в том же году прыгнула до 4.0.


Под это дело я приобрёл бу MacBook Pro 15 2010 за ~ 40 тыс. рублей, так как запускать Xcode в виртуалке было невыносимо. Но даже этот древний Mac вызывал у меня восторг от качества его исполнения. Там стоял SSD и для учёбы хватало за глаза! Теперь в свободное время я изучал азы программирования на Swift.



Казалось бы, все есть для учебы, бери и учись! Однако, пару раз столкнувшись с нерешаемыми проблемами (например, closures), которые заводили меня в тупик, разум начал меня предавать и подкидывать мысли вроде: а может это не моё?.


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


Переезд в Питер


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


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




1 октября 2018-го я уже был в Петербурге. В первую же неделю я устроился специалистом по таможенному оформлению, снял жильё и начал обдумывать дальнейшие шаги.


Swift. Вторая попытка


Как ни странно, к изучению Swift и iOS-разработке я вернулся, после того как начал посещать очные курсы по сценарному мастерству в Питере. Параллельно я ещё интересовался работой мозга, даже посещал очный курс сейчас уже небезызвестного Андрея Курпатова.




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


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


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


В феврале 2019-го я записался на вебинары в группе с преподавателем. Три месяца я жил в режиме работа дом учёба. В таком графике было тяжело. Я проводил за компом по 12-14 часов в день: на работе 8-10 часов + дежурства, а после еще 3-4 часа за учёбой. Подсело зрение, и я решил, что так больше не должно продолжаться нужно что-то менять. И я решил уволиться.


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



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


Свободное плавание


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


Не сказать, что я учился 24/7. Я выдерживал 8-10 часовой учебный день, за который успевал проходить вебинары, делать домашки и изучать что-то параллельно (например, проходил очень интересный CS50, а иногда даже успевал посещать очные курсы по сценарному мастерству). Отдыхать я тоже не забывал: занимался спортом, играл c друзьями в PS4. Всё это помогало не перегорать и, на мой взгляд, качественней усваивать знания.




В таком режиме я провёл больше полугода. За это время я посетил пару бесплатных митапов для мобильных разработчиков: один от CocoaHeads в офисе Яндекса, а второй MobiFest от ЦФТ. Признаться, мне было неуютно: не имея опыта коммерческой разработки, я чувствовал себя недоразработчиком, но мне очень понравилась атмосфера. То, что люди собираются и делятся знаниями друг с другом очень круто! Это придавало сил и желания довести начатое до конца.


Первые собеседования


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


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


Первый отклик, конечно же, был отказом и довольно неприятным. Мне предложили сделать тестовое задание и дали срок в 3 дня. По заданию необходимо было создать форму регистрации агента с валидацией полей и отправить её на сервер (дали ссылку на их тестовый API). Я сделал тестовое, попутно изучив регулярные выражения и отправил в срок. В ответ тишина. Я решил перезвонить им сам, чтобы получить обратную связь, но мне лишь сказали, что я не подхожу.


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


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




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


Focus Start


Осенью 2019, мне исполнилось 30 лет. Я всё ещё искал работу и наткнулся на объявление о наборе на очный курс по iOS-разработке от компании ЦФТ.


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


Недолго думая я отправил заявку. Предложили выполнить тестовое задание. На iOS это выглядело как обычный TableView + DetailView, с поддержкой CRUD и сохранением данных между запусками приложения.




Я отправил тестовое и стал ждать. Через некоторое время пришло письмо с приглашением на очное собеседование.


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


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


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


Обучение на Focus Start


Через неделю мне пришло письмо! Мне сообщили, что я прошёл отбор. Всего на обучение отобрали 12 человек. Мы собирались 3 раза в неделю: по вторникам, четвергам и субботам.


По будням занятия длились 2 часа, а по субботам 4 часа. Суббота была ещё особенна тем, что в перерыв нас угощали пиццей. Ну, и чай/кофе были всегда в нашем распоряжении.


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


Учится было интересно и материала было довольно много. Я даже не знаю, как справлялись ребята, которые ещё параллельно учились или работали. Всё своё свободное время (а его на тот момент было предостаточно) я посвящал домашним заданиям.


Примерно через месяц обучения нас разбили на группы по 3 человека, чтобы мы начали разрабатывать выпускной проект. Наша команда писала фоторедактор с использованием CoreImage.


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


В конце обучения был выпускной, на котором все команды презентовали свои проекты. Было очень интересно посмотреть на другие работы, и, конечно, все ребята справились на отлично. Вот что в итоге получилось у моей команды: https://github.com/c0dedbear/PhotoTune




Должен отметить, что преподаватели в течение всего срока обучения всегда были готовы прийти на помощь и поделится с нами своим опытом. Это было отличное время! Я даже немного скучаю по той атмосфере.


Что было дальше?


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


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




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


Подводя черту


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


  • Нужно быть готовым к длительному обучению. Есть люди, которые, пройдя пару курсов, попали на работу, но это скорее исключение. Настраивайтесь как минимум на год непрерывного обучения. Примите это.
  • Нужно продумать финансовую сторону вопроса: у вас должна быть подушка или другой источник дохода на время обучения. Либо же у вас должно быть время на обучение в отрыве от основной деятельности (желательно 34 часа в день). И здесь важна регулярность, лучше по часу-два каждый день, чем по полдня раз в неделю.
  • Ходите на тематические митапы, если есть такая возможность. Там можно проникнуться атмосферой, познакомиться с другими разработчиками и даже найти работу.
  • Не попадите в ловушку вечного студента. Проходить туториалы и курсы можно бесконечно, но чем раньше вы начнёте делать что-то самостоятельно, тем быстрее будете прогрессировать.
  • Ходите на собеседования. Даже если не уверены или не хочется. Как только вы освоили базу по iOS время ходить по собеседованиям. Они принесут вам опыт и дадут возможность увидеть пробелы в знаниях.
  • Правильный настрой. Проходя собеседования, не переживайте, о том возьмут вас или нет. Лучше заранее принять то, что вас не возьмут и сосредоточится на том, какие вопросы бьют по вашим слабым местам, чтобы впоследствии их проработать.

В заключение хочу сказать: многие разработчики, с которыми я общался говорят, что первое трудоустройство было самым сложным в их карьере, и в какой-то мере им просто повезло. Отчасти это действительно так 1% удачи всегда присутствует, но к этому проценту, как правило, прилагается 99% вложенных усилий.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru