Опишите ваш опыт работы в IT.

Ответ

Более 5 лет коммерческой разработки на Java в области backend.

Ключевые технологии и опыт:

  • Стек: Java 8-17, Spring Boot, Spring (MVC, Data, Security, Cloud), Hibernate/JPA, REST API.
  • Архитектура: Разработка и поддержка микросервисных и монолитных систем, проектирование API, работа с шаблонами проектирования (DDD, CQRS).
  • Инфраструктура: Docker, Kubernetes, CI/CD (Jenkins/GitLab CI), облачные платформы (AWS: EC2, S3, RDS).
  • Базы данных: Реляционные (PostgreSQL, MySQL) и NoSQL (MongoDB, Redis).
  • Тестирование: Unit-тесты (JUnit 5, Mockito), интеграционное тестирование.
  • Методологии: Работа в Agile/Scrum-командах, участие во всем цикле разработки — от проектирования до деплоя и поддержки.

Пример кода (Spring Boot REST Controller):

@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor // Lombok
public class UserController {
    private final UserService userService;

    @GetMapping("/{id}")
    public ResponseEntity<UserDto> getUser(@PathVariable Long id) {
        return ResponseEntity.ok(userService.getUserById(id));
    }
}

Последний проект — высоконагруженная SaaS-платформа с нагрузкой до 50k запросов в секунду (RPS).

Ответ 18+ 🔞

Так, слушай, вот сидишь ты, значит, и пишешь резюме. "Опыт работы с Elasticsearch включает..." Ну, классика, блядь. Все так пишут. А на деле-то что? А на деле — это же сплошная нервотрёпка, пока до кондиции эту штуку доведёшь!

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

Чем конкретно мозги пудрил:

  • Индексация и Mapping: Это ж святое, блядь! Создать индекс — это как ребёнка зачать, легко. А вот правильно поля описать — это уже искусство. Чтобы text искался, keyword агрегировался, а даты — чтобы как люди, а не как попало. И анализаторы эти... Русский морфологический — он, конечно, красава, но иногда так проанализирует запрос, что сам чёрт ногу сломит. А ngram — это вообще отдельная песня, когда нужно искать по кусочкам, но индекс потом раздувается, как шаровая молния, ёпта!
  • Поисковые запросы: Тут, блядь, начинается настоящая магия или цирк, смотря как повезёт. Bool Query — это наш главный инструмент для сборки запроса из кусочков. must — это "обязательно, сука, найди", should — "ну, было бы неплохо, но если нет — похуй", must_not — "этот говнодокумент мне даже не показывай", а filter — это "отсеял по-быстрому, не считая релевантности, умница". Full-text (match) — для нормального поиска по словам, а Term-level — когда нужно тыкать пальцем в точное значение, как в базу данных. Одно не туда сунешь — и всё, приехали, результаты хуйни.
  • Агрегации: А вот это уже для начальства, чтобы красивые графики строить. terms — "покажи мне топ-10 категорий", date_histogram — "как продажи по неделям скачут", avg с sum — "средняя цена и общая выручка, давай, не тупи". Выглядит просто, а попробуй на гигабайтах данных это сделать быстро — тут уже и шарды, и ноды, и прочая хуйня всплывает.
  • Администрирование: А это, блядь, самое весёлое. Следить, чтобы кластер не накрылся медным тазом. Шарды раскидать, реплики настроить — чтобы одна нода легла, а данные не пропали. А Kibana — это наше всё: и дашборды слепить, и запросы отладить, когда он тебе в ответ вместо JSON'а молча в сраку смотрит.

Вот, например, как документ впихнуть через их же Java-клиент: (Код не трогаю, он святой, но вокруг него можно поёрничать)

IndexRequest request = new IndexRequest("products");
request.id("123");
// Документ в формате JSON
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("name", "Smartphone");
jsonMap.put("price", 699);
jsonMap.put("category", "electronics");
request.source(jsonMap);

IndexResponse response = client.index(request, RequestOptions.DEFAULT);
System.out.println("Document id: " + response.getId()); // И молишься, чтобы не вылезло ConcurrentModificationException или ещё какая-нибудь дичь

А оптимизация — это отдельный вид спорта, блядь.
Ты думаешь: "Всё, индекс создал, данные залил — можно чай пить". Ан хуй там! Потом приходит запрос "айфон" и находит тебе утюги и носки. Начинаешь ковырять function_score, чтобы то, что дороже и популярнее, всплывало выше. Потом смотришь в маппинг и офигеваешь: зачем мы по полю internal_id полнотекстовый поиск делаем? Вырубаем его нахуй (index: false) и экономим место и время. А потом ещё и запросы переписываешь, чтобы они не делали овердохуища вычислений на каждый чих, особенно когда нагрузка подскакивает. В общем, работа такая — постоянно балансировать между "работает" и "работает быстро", а иначе — пиздец.