Как устроен процесс разработки
Почему нельзя «просто написать код»
Вы когда-нибудь заказывали ремонт в квартире? Не косметический — а полноценный, со всеми радостями жизни. Там есть порядок: замеры → дизайн-проект → черновые работы → чистовые → приёмка. Попытка «начнём сразу класть плитку, а там разберёмся» заканчивается тем, что через неделю срывают плитку, которую только что положили.
В разработке программ — то же самое. Есть процесс. И как любой процесс в условиях сжатых сроков, он иногда превращается в «и так сойдёт». Но мы здесь, чтобы учиться правильному — поэтому разберём по шагам.
Нужно понимать, что иногда "и так сойдет" - является единственным правильным решением из-за внешних ограничений. Например - появился новый закон, который обязывает изменить вас подход к обработке персональных данных пользователя, иначе можно получить штраф и блокировку
Давайте представим: вы — часть команды. Вам поручили сделать одну фичу. Пройдём весь путь.
Шаг 1. Требование — «Что вообще делаем?»
Менеджер подходит к вам и говорит:
«Нам нужно, чтобы пользователи могли восстанавливать пароль, если забыли.»
Фича (от англ. feature) — это новая возможность программы. Звучит просто, правда? Одно предложение. Можно бежать писать код?
Нет. И вот почему.
Хороший программист начинает решение задачи не с кода, а с вопросов о задаче:
Как именно восстанавливать? По email? По SMS? По звонку в поддержку?
Сколько живёт ссылка для восстановления? Пятнадцать минут? Час? Год?
Ссылка одноразовая или многоразовая?
Новый пароль должен отличаться от старого?
Без уточнений требование — это как строить дом, не зная, сколько в нём комнат.
Хорошие команды всегда уделяют время сбору требований. Увы, у бизнеса не всегда бывают готовые ответы — иногда приходится придумывать на ходу, адаптироваться. А иногда бизнес и не подозревает о технических ограничениях. Например: «Хотим восстанавливать по SMS!» — а мы SMS отправлять не умеем, и сделать это долго. И вот уже требование меняется.
Этот этап нудный. Но если его проигнорировать - всегда есть риск что-то сделать, что окажется неправильным или не нужным. А значит придется переделывать, а значит - тратить лишние деньги.
Собрали требование. Теперь можно писать код?
Всё ещё нет. Потому что внутри любого «простого» сценария прячется десяток «а что если». Давайте распишем наивную версию:
Пользователь нажал "Забыли пароль?"
→ Ввёл email
→ Отправили ссылку
→ Пользователь ввёл новый пароль
→ СохранилиВыглядит просто и логично. Слишком логично, чтобы быть правдой.
Потому что это план для идеального пользователя. А таких не бывает.
Представьте реального. Он вбил email с опечаткой — ссылка улетела в пустоту, а на экране мигает непонятное «Ошибка», или просто «Отправлено» Открыл письмо через три дня — ссылка уже просрочена, система выдает ошибку. Перешел дважды — что делать со вторым переходом? Выдавать ошибку? А что если первый раз пользователь случайно закрыл окно со сменой пароля?
Каждый из этих случаев — вполне реален. Не учтете самые частые ошибки - их заметит пользователь. И конечно же пойдет рассказывать об этом всем вокруг.
Поэтому план — не бюрократия, а продумывание того, что пойдёт не так. Дизайнер рисует кнопку. Программист решает, что под ней произойдёт — особенно когда что-то идет не так.
Если описать алгоритм чуть подробнее, то получится что-то вроде:
Пользователь нажал "Забыли пароль?"
→ Ввёл email
→ Проверили: email существует в базе?
→ Нет → "Такого email нет"
→ Да → Сгенерировали ссылку (живёт 15 минут, одноразовая)
→ Отправили email
→ Пользователь перешёл по ссылке
→ Проверили: ссылка не истекла?
→ Нет → "Ссылка истекла, запросите новую"
→ Да → Показать форму нового пароля
→ Пользователь ввёл новый пароль
→ Проверили: отличается от старого?
→ Нет → "Нельзя использовать старый пароль"
→ Да → СохранилиЗачем такой подробный план? Чтобы в момент написания кода думать только о коде. Вся логика уже продумана — осталось её перевести.
И да, вы 100% что-то не учтете, но это будет лишь несколько сценариев, а не «все»
Шаг 2. Код и тест — «Пишем и ломаем»
Плана нет — пока нет кода. Когда план готов, программист наконец-то садится писать.
И вот тут ловушка новичка: кажется, что написать код — это и есть вся работа. Набросал функцию для идеального сценария — ввели email → нашли пользователя → сгенерировали ссылку → отправили письмо, — запустил, увидел «письмо отправлено»… И... Это только половина. Может, даже меньше.
Потому что код, прошедший идеальный сценарий, ещё ничего не значит. Это случай, когда пользователь не ошибается, сеть не падает, а ссылки живут вечно, короче - все условия идеальны. В профессиональном жаргоне это называют happy path — потому что на нём всё всегда работает, но в жизни есть еще "exceptional flow":
Давайте теперь проверим код в реальном мире — на нестандартных сценариях, где всё идёт наперекосяк:
email пустой или кривой;
почтовый сервер лёг;
пользователь кликнул по ссылке, которую уже использовали;
ссылка сдохла между отправкой письма и кликом.
Хороший программист проверяет свой код на все эти "крайние" случаи самостоятельно. Он не ждёт, пока это сделает кто-то другой: тестировщик или пользователь.
Тестирование идёт кругами: тестируешь → находишь баг → исправляешь → тестируешь снова Каждый круг — новый баг, новая правка. Звучит скучно? Зато так код из «кажется, работает» превращается в «точно работает».
Код без теста — как кот Шрёдингера: он одновременно и работает, и не работает, пока ты его не запустил.
Нет никаких гарантий, что тестирование найдет все баги программы, но лучше найти что-то, чем ничего. Ведь всё, что не нашел разработчик - найдет пользователь.
Шаг 3. Релиз — «Поехало!»
Код готов, протестирован, прошёл ревью у коллег. Его добавляют в проект и отправляют пользователям.
Фича появляется у людей. Кто-то радуется. Кто-то тут же находит баг, о котором никто не подумал. А кто-то ищет баги специально. А дальше — цикл начинается заново:
баг → требование → план → код → тест → релиз → ...Это бесконечный круг. И это нормально. Программа — живая: она меняется, пока кому-то нужна.
Главная мысль
Программирование в команде — это не «написал и забыл». Это коллективная работа с процессом. Каждый шаг — требование, план, код, тест, ревью, релиз — существует ради одной цели: чтобы код был надёжным, понятным и не ломал то, что уже работает.
Когда вы позже начнёте писать свои первые программы, помните: в реальных проектах сам код занимает меньшую часть времени. Большая часть — это думать, планировать и проверять. Привыкайте к этому ритму заранее.
Мы прошли путь от идеи до релиза. Вы увидели, что разработка — это процесс. Но почему, собственно, Java? Почему не Python, не C++, не JavaScript? У каждого языка своё призвание — давайте разберёмся, какое у Java.
Что такое программирование
8 мин
Чем занимается программист на работе
6 мин
Как устроен процесс разработки
8 мин
Зачем учиться программированию
9 мин
Почему Java?
6 мин
Что будет в курсе
6 мин