Чем вы занимаетесь на текущем проекте / последнем месте работы?

Ответ

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

Мои ключевые обязанности включают:

  • Проектирование и разработка микросервисов на Go.
  • Создание и поддержка RESTful и gRPC API для взаимодействия между сервисами и с клиентскими приложениями.
  • Оптимизация производительности: работа с базами данных (PostgreSQL, ClickHouse), кэширование (Redis), асинхронная обработка задач (Kafka, RabbitMQ).
  • Написание Unit и интеграционных тестов для обеспечения качества и стабильности кода.
  • Участие в Code Review для обмена знаниями и поддержания высоких стандартов кодирования.

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

// ProcessRequests безопасно обрабатывает входящие запросы в отдельной горутине.
func ProcessRequests(ctx context.Context, requests <-chan Request) error {
    for {
        select {
        case req := <-requests:
            if err := handleRequest(ctx, req); err != nil {
                // Логируем ошибку, но не останавливаем воркер
                log.Printf("failed to handle request %d: %v", req.ID, err)
            }
        case <-ctx.Done():
            // Контекст был отменен, завершаем работу
            log.Println("shutting down request processor")
            return ctx.Err()
        }
    }
}

Ответ 18+ 🔞

А, так вот ты где работаешь, разработчик! На финтехе, говоришь? Ну, это ж надо, блядь, деньги чужие пересчитывать, да? Овердохуища ответственности!

Слушай, а что ты там делаешь-то, по пунктам? А, ну давай, разложу я это всё по полочкам, как у нас в деревне сено вилами.

Во-первых, проектируешь и пишешь микросервисы на Go. Ну, это понятно, все сейчас по кусочкам раскидали, чтобы если один сервис накрылся медным тазом, остальные хоть как-то работали. Умно, чё. Go — он резвый, сука, как ошпаренный, горутины эти его... Красота.

Во-вторых, API всякие делаешь: RESTful и gRPC. Ну, это чтобы твои кусочки-сервисы между собой болтать могли, а не как Герасим из той истории — «Му-му» да «У-у». Тут надо внятно объяснить, кто кому и что должен. И чтобы клиенты, эти... с фронтенда, тоже понимали, куда стучаться.

В-третьих, оптимизация, ёпта! Это святое. Базы данных (PostgreSQL, ClickHouse) — чтобы не тупили, кэш (Redis) — чтобы не ходить каждый раз в дальний путь, а очереди (Kafka, RabbitMQ) — чтобы задачи в столбик встали и ждали своей участи, как в очереди за колбасой. Без этого — пиздец и лагают всё.

В-четвёртых, тесты пишешь. Unit, интеграционные... Это чтобы твой код, как построенный наспех сарай, от первого же ветра не развалился. Проверяешь, что всё работает, а не как в том анекдоте: «Запустили — не взлетело, блядь».

И наконец, Code Review. Сидишь, смотришь, что другие написали. Ищешь, где они костыль привинтили или, прости господи, хуй с винтом вместо гайки вкрутили. Обмен знаниями, стандарты... В общем, следишь, чтобы бардака не было.

А вот, смотри, кусочек кода твоего, я его не трогал, как велели. Воркер, который задачи из канала обрабатывает:

// ProcessRequests безопасно обрабатывает входящие запросы в отдельной горутине.
func ProcessRequests(ctx context.Context, requests <-chan Request) error {
    for {
        select {
        case req := <-requests:
            if err := handleRequest(ctx, req); err != nil {
                // Логируем ошибку, но не останавливаем воркер
                log.Printf("failed to handle request %d: %v", req.ID, err)
            }
        case <-ctx.Done():
            // Контекст был отменен, завершаем работу
            log.Println("shutting down request processor")
            return ctx.Err()
        }
    }
}

Вижу, вижу! Умничка! select ловит либо задачу, либо сигнал, что контекст отменили. Если задача — обрабатываем, если даже ошибка — логируем и дальше идём, не паникуем. А если контекст сказал «Всё, пиздуй нахой» — тогда культурно завершаемся и выходим. Красиво, без истерик. Не то что некоторые, которые горутины бросают как собаку Муму в озеро, а потом метаться начинают: «Бля, что же я наделал?!».

В общем, работа у тебя, я смотрю, серьёзная. Не хуй собачий. Деньги считать — это вам не в тетрис играть. Удачи там, на высоконагруженных фронтах! Главное — без паники, и чтобы базы не легли. А то будет волнение ебать, и терпения — ноль ебать.