← Назад к вопросам
Расскажи про последнее место работы
1.0 Junior🔥 241 комментариев
#Опыт и софт-скиллы
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Мой последний проект как Android Developer
Компания и проект
В последнем проекте я работал на финтех-приложение для управления инвестициями. Это была высоконагруженная система для работы с портфелями акций и крипто-активов.
Технологический стек
Архитектура:
- Clean Architecture с разделением на Domain, Data, Presentation слои
- MVVM + Repository pattern
- Kotlin Coroutines для асинхронных операций
- Jetpack Compose для UI (последние версии)
Основные библиотеки:
- Kotlin Coroutines + Flow для реактивного программирования
- Room для локального хранилища
- Retrofit + OkHttp для сетевых запросов
- Hilt для dependency injection
- Jetpack Compose для UI
- StateFlow + SharedFlow для состояния
Мои основные задачи
1. Разработка Real-time портфеля
Реализовал экран портфеля с обновлением цен в real-time через WebSocket
class PortfolioViewModel(
private val portfolioRepository: PortfolioRepository
) : ViewModel() {
private val _portfolio = MutableStateFlow<Portfolio?>(null)
val portfolio: StateFlow<Portfolio?> = _portfolio.asStateFlow()
private val _priceUpdates = MutableSharedFlow<PriceUpdate>()
init {
viewModelScope.launch {
portfolioRepository.getPriceUpdates()
.onEach { update ->
_priceUpdates.emit(update)
}
.collect()
}
}
}
2. Оптимизация производительности
- Снизил время загрузки списка активов с 3 сек до 500 мс (кэширование + pagination)
- Оптимизировал Compose рекомпозиции с помощью derivedStateOf
- Реализовал virtual scrolling для больших списков
3. Работа с WebSocket и real-time данными
class PriceWebSocketManager(
private val url: String
) {
private val _prices = MutableSharedFlow<PriceUpdate>()
val prices: SharedFlow<PriceUpdate> = _prices.asSharedFlow()
fun connectAndListen() {
viewModelScope.launch {
webSocket.connect(url)
webSocket.receiveAsFlow()
.onEach { message ->
val priceUpdate = parsePriceUpdate(message)
_prices.emit(priceUpdate)
}
.catch { exception ->
Log.e("WebSocket", "Error", exception)
}
.collect()
}
}
}
4. Тестирование
- Покрытие тестами: 87% (unit + integration)
- Использовал Mockk для моков
- VCR.py для записи HTTP ответов
- Тесты run за <100 мс каждый
@Test
fun testPortfolioCalculation() = runTest {
val mockRepository = mockk<PortfolioRepository>()
coEvery { mockRepository.getPortfolio() } returns testPortfolio
val viewModel = PortfolioViewModel(mockRepository)
advanceUntilIdle()
assertEquals(testPortfolio, viewModel.portfolio.value)
}
5. Работа с базой данных
- Миграции с Goose (raw SQL)
- Room для типизированного доступа
- Оптимизировал запросы с помощью индексов
Достижения
- Performance: снизил потребление памяти на 35%
- Reliability: увеличил стабильность приложения (крашей стало < 0.01%)
- Features: реализовал 12 новых экранов за 3 спринта
- Code Quality: внедрил CI/CD с обязательными тестами перед мержем
Команда и опыт
- Работал в команде из 8 человек (4 Android разработчика)
- Code Review культура: все PR проходят через 2 разработчика
- Регулярные перестроены с PM и дизайнерами
- Опыт работы с Agile (2-недельные спринты)
Главные learnings
- Performance matters: даже малые оптимизации дают большой результат на миллионы пользователей
- Testing is essential: хорошие тесты спасают при рефакторинге
- Communication: чаще общайтесь с командой о технических решениях
- Kotlin Coroutines: это реальная магия, научился использовать Flow на 100%
Почему я ищу новый проект
Проект был отличным опытом, но я хочу расширить свой кругозор:
- Попробовать новые архитектурные паттерны
- Работать с AI/ML интеграциями
- Улучшить знания в DevOps и CI/CD
- Присоединиться к более крупной команде с менторством
Я готов к вызовам и новым технологиям!