Опишите ваш стандартный процесс работы над новой задачей

Ответ

Мой подход к решению новой задачи — это структурированный процесс, который помогает обеспечить качество и предсказуемость результата. Он состоит из следующих шагов:

  1. Анализ и декомпозиция

    • Понимание требований: Внимательно изучаю ТЗ, уточняю у менеджера или заказчика все неясные моменты, бизнес-цели и критерии приемки.
    • Определение границ: Четко определяю входные/выходные данные, контракты (API), возможные пограничные случаи (edge cases) и сценарии ошибок.
  2. Проектирование (Дизайн)

    • Выбор архитектуры: Продумываю, как новая функциональность впишется в существующую систему. Будет ли это новый микросервис, или доработка существующего?
    • Структуры данных и алгоритмы: Выбираю оптимальные структуры (мапы, слайсы, кастомные структуры) и алгоритмы для решения подзадач.
    • Определение интерфейсов: Проектирую интерфейсы для обеспечения слабой связности и тестируемости кода.
  3. Реализация (Кодинг)

    • Пишу чистый, поддерживаемый код, следуя принципам SOLID и принятым в команде соглашениям.
    • Пример простой функции с обработкой ошибок:

      // CalculateAverage вычисляет среднее значение для слайса.
      // Возвращает ошибку, если слайс пустой.
      func CalculateAverage(numbers []int) (float64, error) {
      if len(numbers) == 0 {
          return 0, errors.New("input slice cannot be empty")
      }
      
      sum := 0
      for _, n := range numbers {
          sum += n
      }
      
      return float64(sum) / float64(len(numbers)), nil
      }
  4. Тестирование

    • Unit-тесты: Покрываю новую логику юнит-тестами, проверяя как позитивные, так и негативные сценарии (включая edge cases).
    • Интеграционные тесты: При необходимости пишу тесты, проверяющие взаимодействие с другими частями системы (БД, кэш, другие сервисы).
    • Бенчмарки: Если производительность критична, пишу бенчмарки для измерения и оптимизации узких мест.
  5. Code Review

    • Отправляю код на ревью коллегам. Это помогает найти ошибки, получить обратную связь и обменяться знаниями.
  6. Рефакторинг и Документация

    • Вношу правки по результатам ревью, улучшаю читаемость кода.
    • Добавляю комментарии к публичным API и сложным участкам логики. Обновляю документацию (например, в Swagger или Confluence).
  7. CI/CD и Развертывание

    • Убеждаюсь, что все проверки в CI (сборка, тесты, линтеры) проходят успешно, после чего код готов к развертыванию.

Ответ 18+ 🔞

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

1. Въезжаем в суть, блядь Первым делом — вникаю, как будто мне за это платят (ой, платят же). Читаю ТЗ, а там обычно написано так, что хоть святых выноси. Начинаю закидывать менеджера вопросами, пока не станет кристально ясно, что от меня хотят. Иначе получится «сделайте красиво», а потом — «ой, мы не это имели в виду». Нет уж, я не телепат, ёпта.

2. Рисуем схемки в голове и на бумажке Дальше начинаю думать, куда эту новую хуйню приткнуть. Новый сервис городить или в старый впихнуть? Как данные будут ходить? Какие могут быть подводные камни? Это как собирать мебель из Икеи — если сразу начать крутить болты, получится хитрая жопа, а не комод. Продумываю структуры, алгоритмы, чтобы не вышло «работает, но за O(n!)».

3. Непосредственно магия, она же кодинг Тут включаю режим «чистый код». SOLID, паттерны, вся эта муть. Не потому что модно, а потому что через месяц самому же и разгребать этот код, а не «о, какой умный мудак это писал». Вот, смотри, простой пример, чтобы не быть голословным:

// CalculateAverage вычисляет среднее значение для слайса.
// Возвращает ошибку, если слайс пустой.
func CalculateAverage(numbers []int) (float64, error) {
    if len(numbers) == 0 {
        return 0, errors.New("input slice cannot be empty")
    }

    sum := 0
    for _, n := range numbers {
        sum += n
    }

    return float64(sum) / float64(len(numbers)), nil
}

Видишь? Никаких сюрпризов. Пустой слайс — получи ошибку, всё честно. А то бывает напишут return 0, а потом в продакшене волнение ебать — почему у нас среднее чека равно нулю?

4. Издеваемся над своим творением (Тестирование) А вот теперь самое весёлое. Начинаю пытаться сломать то, что только что написал. Пишу тесты на все возможные и невозможные случаи. Что если nil передать? А если отрицательные числа? А если овердохуище чисел? Надо покрыть всё, иначе в проде вылезет какой-нибудь edge case, и пидарасы налетят с вопросами «почему упало?».

5. Скромно выставляем напоказ (Code Review) Отправляю код коллегам. Это как выйти на сцену в голом виде — страшно, но полезно. Кто-то заметит косяк, кто-то предложит вариант изящнее. Главное — не воспринимать критику в штыки, а то так и останешься полупидором, который пишет в своём стиле.

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

7. Выпускаем зверя (CI/CD и Деployment) Финальный аккорд. Пушим, смотрим, как CI/CD пайплайн прогоняет все тесты и линтеры. Если всё зелёное — можно выдыхать и деплоить. Если красное — ну, бывает, значит, где-то затупил, идём чинить.

Вот такой нехитрый план, чтобы не скатиться в хаос и чтобы твой код не превратился в legacy ещё до того, как попадёт в прод. Работает, проверено.