Расскажи про стек технологий на прошлых местах работы

Ответ

На последнем коммерческом проекте (fintech-приложение) мы использовали следующий стек на Flutter/Dart:

  • Ядро: Flutter 3.x, Dart с null-safety.
  • Архитектура: Чистая архитектура (Clean Architecture) с разделением на domain, data, presentation слои.
  • State Management: Bloc/Cubit для управления сложным состоянием бизнес-логики. Для более локального состояния использовали Riverpod.
  • Сетевое взаимодействие: Dio для HTTP-запросов с кастомной оберткой для обработки ошибок, токенов и логирования. Для типизации API-ответов использовали json_serializable.
  • Локальное хранилище: Hive для кеширования пользовательских данных и настроек из-за его высокой скорости.
  • Внедрение зависимостей: get_it в сочетании с injectable для автоматической генерации регистраторов.
  • Тестирование: Unit-тесты с mockito для изолированного тестирования бизнес-логики (Cubit, UseCases). Widget-тесты для проверки UI. Интеграционные тесты для критических пользовательских сценариев.
  • Инструменты: Firebase Crashlytics и Analytics, Code Magic для CI/CD.

Пример структуры Bloc для загрузки данных:

class UserProfileBloc extends Bloc<UserProfileEvent, UserProfileState> {
  final GetUserProfileUseCase _getUserProfileUseCase;

  UserProfileBloc(this._getUserProfileUseCase) : super(UserProfileInitial()) {
    on<FetchUserProfile>((event, emit) async {
      emit(UserProfileLoading());
      final result = await _getUserProfileUseCase.call(event.userId);
      result.fold(
        (failure) => emit(UserProfileError(failure.message)),
        (profile) => emit(UserProfileLoaded(profile)),
      );
    });
  }
}

Также был опыт работы с GraphQL (пакет graphql_flutter) и написанием нативных модулей для работы с биометрией и Secure Storage.

Ответ 18+ 🔞

А, ну это же классика, ебушки-воробушки! Сидишь на собеседовании, а тебе такой: «Расскажите про стек последнего проекта». Ну, слушай, рассказываю, а сам думаю — ёпта, сейчас начнётся.

Короче, был у нас один fintech-проект, приложение. Ну, знаешь, где деньги крутятся, так что доверия ебать ноль ко всему, что летит по сети. Взяли, естественно, Flutter, версию 3.x, Dart с null-safety — чтобы голова не болела, что где-то вылезет null и всё накроется медным тазом.

Архитектуру замутили — Чистую, блядь, архитектуру. Domain, data, presentation. Сначала, конечно, все орали, что это овердохуища слоёв и кода, но потом, когда пришлось менять источник данных с API на заглушку для тестов, все поняли, что не дураки были. Просто э, бошка, думай наперёд.

Для управления состоянием взяли Bloc/Cubit. Ну, для всей серьёзной бизнес-логики — самое то. А для какой-нибудь мелкой хуйни, типа переключения темы в настройках, использовали Riverpod. Чтобы не городить пиздопроебибну из событий и состояний на ровном месте.

Сеть — Dio, конечно. Но не просто так, а с кастомной обёрткой. Чтобы все ошибки ловить, токены подкладывать и логи писать. А то без этого — подозрение ебать чувствую, что где-то на бэкенде косяк, а ты не поймёшь. Ещё json_serializable прикрутили, чтобы не парсить JSON руками, как будто на дворе 2002-й год.

Локальное хранилище — Hive. Быстрый, блядь, как ужаленный. Для кеша пользовательских данных и настроек — идеально. SQLite — это, конечно, мощно, но для наших нужд — хуй с горы, слишком жирно.

Внедрение зависимостей — get_it да injectable. Автоматическая генерация — красота. Раньше руками всё это регистрировать — терпения ноль ебать было.

Тестирование... О, это отдельная песня. Unit-тесты на mockito для Cubit'ов и UseCase'ов. Widget-тесты для UI. И, самое главное, интеграционные тесты на ключевые сценарии. Потому что иначе выкатываешь фичу, а она вротберунчик пользователю, и всё, приехали.

Из инструментов — Firebase для краш-репортов и аналитики, Code Magic для CI/CD. Без этого сейчас — пидарас шерстяной, а не разработчик.

Вот, к примеру, как один из наших Bloc'ов выглядел. Просто, но эффективно.

class UserProfileBloc extends Bloc<UserProfileEvent, UserProfileState> {
  final GetUserProfileUseCase _getUserProfileUseCase;

  UserProfileBloc(this._getUserProfileUseCase) : super(UserProfileInitial()) {
    on<FetchUserProfile>((event, emit) async {
      emit(UserProfileLoading());
      final result = await _getUserProfileUseCase.call(event.userId);
      result.fold(
        (failure) => emit(UserProfileError(failure.message)),
        (profile) => emit(UserProfileLoaded(profile)),
      );
    });
  }
}

А, ещё был опыт с GraphQL, через graphql_flutter. Когда перешли с REST — сначала удивление пиздец, а потом втянулись. И писали нативные модули под биометрию и Secure Storage. Вот это да, сам от себя охуел, когда на Swift/Котлине пришлось что-то делать, но Flutter Channel — сила. В общем, стек был крепкий, проект живой, все довольны.