Next Level Dev
678 subscribers
32 photos
2 videos
58 links
Заметки синьора-самоучки с 10-летним опытом

Доучиваю или учу с нуля до крепкого джуна, готового к собеседованиям и стажировке

Roadmap для начинающих в личке @ilia_a_popov
Там же запись на менторство и консультации

О менторстве: https://androidmentor.ru
Download Telegram
Как выглядит работа андроид-разработчика в продуктовой команде?

1️⃣ Тот код, что в продакшне (то есть у пользователей), всегда лежит в мастер-ветке. Код, который вы пишете, окажется в мастере только в самом конце вашей работы над задачей, после код-ревью, тестов и релиза в стор. До этого он будет существовать в отдельной ветке, которая будет ревьюиться и тестироваться.

2️⃣ Вам приходит таска в таск-трекере (Jira, Miro, etc.), например «Интегрировать новый дизайн на экране авторизации».

3️⃣ Вы от мастера ответвляете свою ветку под эту таску.

4️⃣ Пишете в этой ветке свой код для таски.

5️⃣ Коммитите/пушите изменения в своей ветке и создаёте из ветки пулл-реквест в гитхаб.

6️⃣ Этот пулл-реквест уже смотрят ваши коллеги из андроид-команды — это и есть код-ревью. Ваш код комментируют, при необходимости предлагают что-то изменить или исправить — в таком случае вы вносите изменения и делаете новый коммит-пуш в эту ветку и отдаёте на ревью заново.

7️⃣ После того, как коллеги решили, что ваш код в порядке - они ставят "Approve" пулл-реквесту, и после этого вашу ветку можно отдавать в тестирование. В зависимости от договорённостей в команде и её размера, вам может потребоваться один или несколько аппрувов.

8️⃣ Если тесты прошли успешно - ваша ветка мёрджится в релизную ветку, если нет - идёте вносить исправления и снова отдавать на код-ревью.

9️⃣ Релизная ветка — та, которая пойдёт в стор, и сразу после этого смёрджится в мастер. В релизную ветку сливаются все ветки, которые проревьюены, протестированы и готовы к публикации в стор.
Важно: перед тем, как мерджить свою ветку в релизную, вам может понадобиться исправить мердж-конфликты. Они возникают, если в одном и том же месте в двух ветках были внесены разные изменения, и вам нужно определиться, что с этим делать: заменить одно изменение другим, или добавить и то и другое, или каким-то ещё образом выйти из этой ситуации, не сломав логику обоих изменений. Это можно делать или внутри Android Studio, подлив релизную ветку в свою, а потом исправить конфликты и запушить итоговые изменения в свою ветку, или в самом гитхабе в пулл-реквесте.

В каждой компании может быть свой, упрощённый или усложнённый процесс разработки продукта, но в общих чертах он будет выглядеть похоже на то, что я описал.
И, напоследок, помните: когда вы приходите в компанию, вам всё это объяснят, покажут и расскажут. Не стесняйтесь уточнять и задавать вопросы, если что-то в процессе вам будет непонятно. Никто не ждёт, что вы мгновенно разберётесь. Но основные понятия и этапы, которые я тут упоминал, вам следует знать.

#android #работа #советы

@andrdevnotes | androidmentor.ru
👍8🔥42👌1
Бесконечные муки или источник кайфа?

На пути разработчика вам придётся привыкнуть к одной простой мысли: ваши усилия != количество написанных строк кода. Иначе оценка труда разработчика и его оплата была бы куда проще и прозрачнее.

Когда-то я считал иначе. И на полном серьёзе думал, что увеличение скорости печати сделает меня лучшим профессионалом :)

Поначалу вы будете сидеть днями над простыми вещами, которые решаются одной-двумя строками кода. Это будет обидно.

С улучшением ваших навыков будет увеличиваться сложность и уменьшаться количество вещей, над которыми вы зависаете на несколько дней, но решаться они будут... Одной-двумя строками кода.

Если вам хватит упорства, то спустя дни кропотливого труда, в течение которых пришлось несколько раз перебороть синдром самозванца и отчаяние, вы поймаете тот самый инсайт, после которого вы воскликнете "Эврика!!!" и напишете ту самую строчку кода, которая решит проблему.

И в этот момент вас захлестнёт кайф от долгожданной победы и вы поймёте, что оно того стоило. И чем больше будет таких моментов - тем больше вы будете верить в себя и тем легче будет в следующий раз. А он обязательно будет, даже у меня :)

Запомните: ваша цель – не написать побольше кода, а решать задачи. Максимально быстро и эффективно создавать стабильные приложения, закладывая в них необходимую бизнесу гибкость и поддерживаемость.

А сколько вы кода при этом напишете – не так важно. По сути, чем меньше кода – тем лучше. Не тот крут, кто пишет 1000 строк кода в день, а тот, кто 100 строками кода решает ту же задачу, что менее опытный за 1000 строк :)

#android #советы

@andrdevnotes | androidmentor.ru
👍9🔥43👀1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥103🆒3😍1
Надо ль вам идти с понятного пути в непонятное IT?

Я был научным работником, параллельно учился в аспирантуре, расположенной на территории этого же НИИ. Занятия в аспирантуре засчитывались за рабочее время и всячески поощрялись. Путь прост, проторен и понятен.

И главное – работа у меня была максимально ненапряжная, никто не следит и ничего не требует. Можно заниматься чем угодно на работе под видом исследований. Хочешь – сидишь и осваиваешь другую удалённую профессию, хочешь - залипаешь в соцсети или книжки читаешь. Почему же я ушёл?

Оказалось, что это очень разлагающая среда. Никому вокруг ничего не надо, и тебе тоже становится не надо. Тебя засасывает в это болото. В итоге дни пролетают почти бесполезно, хотя кажется, что свободного времени – вагон. Но твой КПД невероятно мал.

Почему я ушёл из науки?
Потому что потолок белой зарплаты там был
100 000р через несколько лет упорного труда, что меня не устраивало.

Почему я ушёл из науки?
Потому что я месяц почти не появлялся на рабочем месте, а после возвращения я услышал лишь «о, а ты не в отпуске был? Ну ладно». И я понял, что моя работа здесь никому не нужна.

Совсем по-другому в IT. Здесь у тебя постоянно горит земля под ногами от того, что тебе со всех сторон твердят: то, что ты знаешь, уже никому не нужно. Это вам не НИИ, тут знания протухают очень быстро. И ты вместе со всеми бежишь вперёд и развиваешься.

Идти ли вам в IT? Нет, если вы не готовы пахать. Первые полгода – год в обучении, хотя бы по 4 часа в день, а потом ещё год-другой в команде, пока не станете крепким миддлом. А там вас уже затянет, если до тех пор не сольётесь.

Здесь правда кайфово. Но не всем и не сразу.
Упорство и регулярность – ключ к успеху. Все ваши проблемы решаемы, если правильно к ним подойти.

#android #советы

@andrdevnotes | androidmentor.ru
👍8🔥42🥰1👏1
Подкаст от деды в IT:
Стажировки, джуны, начало пути в IT, менторство


Два андроид-разработчика:
Senior (я) и Lead (https://t.iss.one/LeadTales)
обсудили, как нынче стать джуном и всё вокруг этого.

Пока только на Spotify, поэтому запускать под VPN.
Позже, думаю, перенесём на более удобный хостинг и выложим на другие сервисы.

Жду вашей обратной связи: что отозвалось, что стало неожиданным открытием, а с чем бы вы поспорили?

@andrdevnotes | androidmentor.ru
👍6🔥3👏21
Поиск первой работы, часть 1: подготовка.

📌Давайте сразу уточним: если вы ещё не работали андроид-разработчиком, значит вы ещё не являетесь джуном, а тем более миддлом. Какие бы у вас ни были навыки, вы пока только кандидат на первую работу. Если до этого у вас была работа в IT, особенно в смежных сферах (бэкенд / iOS) – это сильно сыграет вам в плюс.

Да, раньше войти в IT было проще, но это не повод руки опускать. Джуны с опущенными руками точно никому не нужны, и если вы отчаялись, не успев даже найти работу – в IT вам делать нечего.

Подход к поиску работы – такой же, как и раньше: набраться терпения и стучаться во все двери, параллельно качать навыки. У кого-то получается с первого раза, у кого-то с пятьдесят первого.

На ваш гитхаб работодатели смотрят. Проект желательно делать настолько сильный, насколько можете: Clean Architecture и MVVM, DI, REST с кэшированием, сможете в многомодульность – совсем хорошо. А если ещё и опубликуете и решите проектом какую-то мелкую реальную проблему – ещё круче (но это уже миддл-уровень).

Пройдите успешно одно-два мок-собеседования на джуна, убедитесь в наличии необходимых навыков. Обязательно укажите это в резюме.

С точки зрения абсолютного большинства работодателей, миддлом без опыта реальной работы стать практически невозможно, сколько навыки ни качай. Однако, если все остальные способы не сработают, я бы и на низкооплачиваемые вакансии миддла попробовал пооткликаться. Некоторые работодатели под миддлом подразумевают не уровень навыков, а самостоятельного разработчика. Теоретически, таковым может стать и джун, хотя результат его работы будет хуже – но, учитывая пониженный оклад, некоторые компании это может устроить.

В подкасте, кстати, тему поиска работы тоже обсуждали ;)

🔜 Следующим постом расскажу о том, где и как бы я искал свою первую работу.

#android #работа #советы

@andrdevnotes | androidmentor.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3👌2🤝1
Поиск первой работы, часть 2: способы поиска.

1️⃣ Откликаться на все платные и бесплатные стажировки, они регулярно бывают у крупняков типа яндекса, тинькоффа, рэдмэдробота, домру и прочих. Конкурс будет жёсткий, харды нужны сильные. Скорее всего надо будет твёрдо знать Java Core, алгоритмы, коллекции и уметь в юнит-тесты.

2️⃣ Откликаться на все вакансии на всех сайтах с поиском работы: Junior Android Developer, Android Developer. И мониторить все телеграм-чаты с поиском работы в вашей сфере.

Лайфхак: можно воспользоваться промтами в гугле:
"site:hh.ru | site:<...> | site:<...> android developer"

Легче всего попасть на "галеры" – проектную разработку в какую-нибудь студию, которая на аутсорсе или аутстаффе клипает проекты для всех подряд. У них обычно требования минимальные. Там будет не "милая приятная айтишечка", но для первого опыта подойдёт.

3️⃣ Сам я работу джуном когда-то нашёл через линкедин. Просто искал там всех андроид-разработчиков senior/lead уровней и писал им в холодную "возьмите меня в команду, я хороший".

Также я в холодную писал во все студии мобильной разработки, которые нашёл.

Плюс знаю кейс, как кандидат пришёл после курсов гикбрейнса с весьма слабыми знаниями и попросился на стажировку. И для него эту стажировку открыли, т.к. для компании это весьма мягкий способ дёшево получить разработчика в будущем.

Заметьте – не компания выложила стажировку и он на неё откликнулся, а он сам инициировал стажировку в компании своей активностью. Берите пример. Можете даже попробовать усилить этот кейс и придумать оффер со стажировкой самим, и присылать его компаниям, например: "Я бесплатно постажируюсь у вас по ГПХ 3 месяца, потом устраиваюсь к вам и 3 месяца будет испытательный со сниженным окладом, а потом будет оклад по рынку."

4️⃣ Отдать резюме на вычитку кому-нибудь, кто имеет отношение к найму: лиду, hr-у. Соберите от них обратную связь и внесите исправления.

5️⃣ Участвовать в опенсорсе, активно делать туда пулл-реквесты. Вас будут ревьюить, там можно познакомиться с кем-нибудь и попроситься в команду. Аналогичный подход с участием в хакатонах. + всё это пойдёт в резюме и тоже будет полезно.

Ещё раз: готовьте лоб и ломайте им стены.
Стены поддадутся. Я и сейчас регулярно слышу о кейсах успешного устройства джунами. Да, не так часто, как раньше, но слышу.

#android #работа #советы

@andrdevnotes | androidmentor.ru
8👏3🔥1🥰1
Привет всем!
А давайте пообщаемся?

Присылайте в комментариях к этому посту
любые вопросы, которые вас волнуют.

А я завтра отвечу голосовыми на всё, что пришлёте.

#android #вопросы
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Ответ на вопрос подписчика

Как правильно настраивать инструменты обфускации?

В своём проекте заюзал в конфиге gradle флаги
isMinifyEnabled и isShrinkResources, в итоге у меня просто отвалился сетевой клиент после сборки

#android #вопросы #лайфхаки
🔥6👍31
Ответ на вопрос подписчика

Создал Scaffold, внутри которого вложил TopAppBar. Настроил поведение бара на enterAlwaysScrollBehavior(rememberTopAppBarState()). При скроллинге TopAppBar скрывается и при этом весь внутренний контент Scaffold перерисовывается снова и снова, нагружая экран. Делал все по документации

#android #вопросы
👌4🔥1👀1
Ответ на вопрос подписчика

Как найти первую работу если нет коммерческого опыта, а в портфолио всего лишь прогноз погоды

#android #вопросы #работа
5
Ответ на вопрос подписчика

Мне интересно, возможно ли без пересоздания активити сменить тему (setTheme()) и дарк и лайт режим? Xml разумеется. И можно это сделать только уже на compose?

#android #вопросы
👍32🔥1
Ответ на вопрос подписчика

Как должен выглядеть хороший пет-проект в портфолио? Что в нем должно быть?

#android #вопросы #работа
👍32
Ответ на вопрос подписчика

Интересно общее мнение по поводу compose)😁
стоит ли например делать сейчас акцент\изучать compose

#android #вопросы
4👍2😁2
Убеди его сказать "Да"

Для доступа к опасным действиям в android-системе, например выходу приложения в интернет или записи файлов, нужно запросить у системы разрешение.

Есть два основных вида разрешений:

1️⃣ install-time – те, что можно просто выдать через манифест: например, разрешение на интернет.

2️⃣ dangerous (runtime) – те, о которых надо напрямую попросить пользователя. И вот о них поговорим поподробнее.

Запрос runtime разрешения представляет из себя показ соответствующего системного диалога. Это значит, что просто повесить listener на его кнопки и узнать, когда пользователь нажал «Да», «Нет» или «Нет и больше не спрашивать» нельзя. А узнать о том, что в итоге выбрал пользователь, можно только в соответствующем системном коллбэке.

Если вы просто покажете системный диалог с запросом разрешения и не будете слушать коллбэк, то при нажатии на «Да» диалог скроется и всё. А вам надо, чтобы пользователь прошёл дальше по флоу, который раньше был для него закрыт из-за отсутствия разрешения.

Прежде, чем показывать системный диалог, стоит внятно объяснять пользователю, зачем вам нужно разрешение, чтобы:

а) увеличить вероятность того, что он согласится дать разрешение и продолжит пользоваться вашим приложением

б) не выглядеть в глазах Play Store негодяями, запрашивающими разрешения с дурной целью

Не надо запрашивать на старте приложения все разрешения, нужные вам в разных местах приложения. Лучше привяжите, например, запрос разрешения камеры к нажатию кнопки открытия камеры.

Если пользователь скажет "Да", то пускаете его дальше по флоу. Если "Нет" – не пускаете.
А вот если скажет "Нет, и больше не спрашивать" – вам надо продумать, что делать в таком случае. Ведь с этого момента вы больше не сможете запросить разрешение у системы, его можно будет выдать только вручную в настройках. Если без этого разрешения можно дальше пользоваться приложением – смиритесь, если нет – объясните пользователю, зачем ему теперь нужно идти в настройки, и что там нужно сделать.

Важно сделать путь пользователя удобным, а не раздражающим. Отлавливайте в коллбэках момент, когда пользователь выдаёт или не выдаёт разрешение, не оставляйте пользователя в подвешенном состоянии, не заставляйте нажимать на кнопку повторно. Пользователи будут вам за это благодарны.

#android #лайфхаки

@andrdevnotes | androidmentor.ru
👍7🔥4👏1😁1
Как Flow меня предал

Решил я недавно заменить синхронный код, длинными макаронами оплетающий приложение, на красивую удобную асинхронщину с Flow. Сказано – сделано.

Было: макароны с проксированием информации через интерфейсы со всех концов приложения в пару мест, где и производятся целевые действия.

interface Interactor {
fun onCameraMove(mapState: MapState)
}

interactor = parentFragment.checkInstance()

interactor?.onCameraMove(mapState)

interface MapCameraMovable {
fun onCameraMove(mapState: MapState)
}

override fun onCameraMove(mapState: MapState) {
(currentFragment as? MapCameraMovable)?.onCameraMove(mapState)
}


Стало: я сделал репозиторий с Flow, который асинхронно меняется в разных местах приложения, а в целевых местах он обзёрвится. Удобно и без бойлерплейта.

private val channel = Channel<MapState>(Channel.BUFFERED)
private val flow = channel.receiveAsFlow()

override fun observe(): Flow<MapState> = flow

override suspend fun once(): MapState? = flow.firstOrNull()

override suspend fun update(newMapState: MapState) = channel.send(newMapState)

Да вот только работало оно как-то странно: то правильно, то неправильно. Начал я копать:

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

fun <T> ReceiveChannel<T>.receiveAsFlow():

One element will be emitted to one collector only.

В итоге у меня в приложении вместо отправки одних и тех же данных нескольким подписчикам шла гонка: какой-то подписчик первый успевал получить данные, а остальным они не доставались.

Мораль: слушаете Flow в нескольких местах – используйте MutableSharedFlow.

#android #лайфхаки #рефакторинг
👍83
❇️ 5 простых лайфхаков для крутого кода ❇️

Поделился 5 простыми приёмами, которые помогут повысить качество вашего кода.

Приятного просмотра! 🚀

Мне будет приятно, если поддержите лайками и комментариями 👀

#android #видео #лайфхаки #рефакторинг

https://youtu.be/FJo4cRPJPMk?si=mHLUK_oL9_KcpLwV
🔥7🤩2👾2💯1🍓1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥82🥰1
❇️ 3 простых способа сделать разную вёрстку для планшетов и смартфонов ❇️

Отвечаю на вопрос подписчика: как правильно верстать под разные устройства.

Приятного просмотра! 🚀

Мне будет приятно, если поддержите лайками и комментариями 👀

https://youtu.be/VYQD9URfKVw?si=HsRtJDV1mGfXISHD

#android #видео #вопросы #лайфхаки

@andrdevnotes | androidmentor.ru
🔥10👍3🥰1