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

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

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

О менторстве: https://androidmentor.ru
Download Telegram
Общался я тут со своими выпускниками и понял, что нужно до всех донести пару мыслей по поводу поиска работы. И начнём мы с вами с резюме на джуниора.

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

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

В вашем резюме:

1️⃣ Обязательно должна быть фотография с вашим лицом

2️⃣ Обязательно должно быть чёткое описание вашего вклада на каждой работе

👎 Плохо: "выполнял обязанности программиста", "работал с клиентами", "участвовал в разработке проекта"

👍 Хорошо: "участвовал в разработке доски объявлений, аналога Авито. Написано на Java, Clean MVVM, стэк: retrofit, rx, ... . Я реализовал:

– экран авторизации (сетевой слой, кэширование, UI)

– кастомные пуш-уведомления с диплинками

В процессе взаимодействовал с iOS-командой, backend'ом, ручными тестировщиками, работали по спринтам.


3️⃣ Если вы никогда не работали андроид-разработчиком и пришли из совсем другой сферы:

👎 Плохо: подробно описать весь свой профессиональный путь в другой сфере.

👍 Хорошо: во-первых – описать только последнее место работы, или последнее + самое значимое. И очень кратко опишите эти места работы: описывайте именно то, что, на ваш взгляд, применимо к андроид-разработке и поможет вам в ней. Остальное никому не интересно.

Куда важнее чётко описать, что в андроид-разработке вы умеете, чему и как учились: какие курсы и книги освоили, какие проекты написали, чему научились, в какой стек технологий умеете.

И в идеале ваши навыки должны очень хорошо матчиться с навыками в каждой вакансии, на которую вы откликаетесь. Если видите, что навыков у вас маловато – идите подтягивайте.

4️⃣ Если есть старший товарищ, который вас менторил, ревьюил код ваших проектов и готов дать на вас рекомендацию – смело указывайте это в резюме – это тоже выделит вас среди толпы.

А если вы не показывали свой код опытным разработчикам, но считаете его крутым – советую подумать ещё раз.

#android #работа #резюме #советы #ошибки

@andrdevnotes | Обучение android
👍5🔥21
Теперь поговорим о вашем профиле гитхаба:

1️⃣ Обязательно должна быть фотография с вашим лицом

2️⃣ Обязательно должно быть краткое описание автора: кто вы, что из себя представляете, чему учились, что умеете

3️⃣ В описании (Readme) каждого проекта из вашего портфолио на гитхабе должно быть подробное описание проекта:

– что вообще за проект
– какой функционал реализован
– в какой ветке что находится
– что не успели реализовать, но понимаете, что надо бы
– что реализовали, но понимаете, что можно лучше
– где излишнее усложнение или избыточное упрощение
– другие особенности проекта

Проект должен собираться и запускаться и работать так, как написано в Readme

4️⃣ Проект желательно делать с Clean-архитектурой, MVVM / MVI, с корутинами и тд. Реализуйте в нём на практике те концепции, что вы знаете в теории

5️⃣ В проекте должна быть история осмысленных коммитов, чтобы было видно, что вы над проектом работали долгое время, а не просто откуда-то скачали и запушили одним коммитом. И должно быть видно, что вы умеете работать с feature-ветками и пулл-реквестами

Напишите в комментах, сколько из 5 пунктов у вас есть на момент прочтения поста =)

#android #работа #портфолио

@andrdevnotes | Обучение android
👍71🔥1😁1🤔1
Задолбало

На работе пару недель назад взял большую, важную, сложную, интересную задачу. И знаете что? Нихера не получается нормально её сделать.

А iOS'ер, параллельно занимающийся тем же, присылает красивые видосики о том, как у него всё круто работает.

Моим же видосиком того же функционала можно подтереться.

Причём я понимаю, что проблема именно в моём коде. И вроде смог локализовать, где именно – но убей не понимаю, какого хрена там не так-то.

В итоге голова над этим работает 24 / 7. То, что программистам платят только за 8 часов – издевательство. А те, кто считают, что программистам много платят – дилетанты чёртовы.

А ещё параллельно готовлю сюрприз-поездку жене на ДР, а после этого мой ДР, на который мы тоже едем в поездку, и её тоже надо спланировать. А там на носу основной отпуск, а это поездка за рубеж, и там тоже дохера работы по подготовке.

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

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

Ну и когда, блять, я должен всё это успеть?

В пизду. Я на тренировку.
💯16💔7🙏2🤔1🤯1
О рабочем пространстве

Я обычно работаю из дома. Но мозг время от времени устаёт и хочется сменить обстановку.

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

И главное – не сидеть за кодом часами напролёт. Мне вот помогает в зал ходить, после него со свежей головой выхожу. Или просто погулять выйти.

А вообще, знаете, какое у меня самое эффективное место для работы? Такси.

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

А вам откуда работать нравится?
👍7🤔41🥰1
Задача побеждена!

Всё же дело оказалось в одном из методов SDK, которое я внедрял.

Выглядел метод максимально безобидно, как-будто просто оборачивал передаваемый битмап / ресурс в удобный для SDK класс. Не знаю, что они там в конструктор напихали, но ЦПУ этот метод выжирает безбожно.

Когда речь идёт о десятках вызовов, всё норм, но когда о тысячах – устройство взвывает.

Лучший враг прячется там, где ты меньше всего будешь его искать (с)

Я этот метод всё это время не замечал, будучи уверен, что дело в коде вокруг него.

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

Постфактум понял, что несколько часов назад мне профайлер уже подсказал ответ, но я его не заметил :))
👍12🔥6🎉5😎2
ChatGPT – бог или дьявол?

🤓 Кажется, что chatGPT можно использовать, как умного старшего товарища, он же всё знает. При этом он не злится и не токсичит, в отличие от ребят из StackOverFlow или некоторых ребят из чата Android Developers =)

🫢 Но есть один большой минус, свойственный и подавляющему большинству людей и, как следствие, chatGPT, как отражению этого большинства. Этот минус сейчас, вероятно, прозвучит для вас комично: "Когда вы задаёте им вопрос, они вам на него отвечают, причём правильно".

🤔 Чем же это плохо? Вы же получаете ответ на вопрос, решаете проблему?

❗️ Засада в том, что вы не научились решать проблему, а решили проблему. Фактически, вы её просто избежали и пошли дальше, словно с ней и не сталкивались. Забрали у себя один из пунктов, на которых могли научиться.

Обучение начинается тогда, когда у вас возникают трудности в решении проблем.
А тут вы избежали всех трудностей :)

😕 К сожалению, это касается и многих менторов. Ведь ментор, зачастую, это просто крутой эксперт, который не умеет обучать. И сессии у него поначалу кажутся полезными, потому что "ну он же за сессию мне капец как много всего нового и полезного на голову вывалил".

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

Сталкивались с такими сессиями, когда после них вы почувствовали себя говном из-за того, что вам кучу ценной инфы вывалили, а вы нихрена не поняли? Напишите в комментариях.

Не вините в этом себя.

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

#android #лайфхаки #советы

@andrdevnotes | Обучение android
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92🥰2
❇️ Как упростить себе работу с коллекциями? ❇️

В этом видео я рассказал про коллекции и экстеншны: как упростить себе жизнь, при этом не выстрелив себе в ногу.

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

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

https://youtu.be/BfzaZ8D3sls

#android #видео #лайфхаки

@andrdevnotes | Обучение android
🔥52🥰1👏1
Хочешь продолжить начатое – …

… не сбивайся с ритма (с) Х. Мураками 🤓

Решил я тут во время августовского отпуска отдохнуть от блога – и на тебе, на дворе октябрь, а я с тех пор лишь пару постов осилил.

❗️Почему? Потому что сбился с ритма. Не повторяйте моих ошибок!

📖 Ведь то же самое и в обучении – если занимаешься регулярно, но хотя бы по паре часов – куда больше вероятность доучиться, чем если адски вджобнуть в выходные по 12 часов и выгореть к чертям.

Следующий пост ждите завтра утром. Возвращаюсь в строй 💪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10💯3😁2
Как разговаривать с адаптером, не привлекая внимания санитаров

💡 Представим, что вы хотите с помощью RecyclerView отобразить список, в котором будет несколько разных способов отображения элементов: в одном будет чекбокс, в другом картинка, в третьем картинка и текст, в остальных ещё что-то другое. Как это сделать

Адаптеру надо как-то объяснить, сколько типов отображения у вас есть, и чем они отличаются.

1️⃣ Начинаем мы ему объяснять с переопределения метода getItemViewType, который вызывается автоматически в начале отрисовки каждого элемента списка. В этом методе есть аргумент position, и именно здесь вы решаете, какой тип отображения будет на каждой position списка. Метод возвращает целое число, по которому мы и будем дальше определять тип отображения.

2️⃣ Потом адаптер вызовет метод onCreateViewHolder, у которого есть целочисленный аргумент viewType — тот самый, логику для вычисления которого мы переопределили в предыдущем методе. А из этого метода вы на основании полученного viewType должны вернуть соответствующий этому типу отображения ViewHolder — то есть объяснить адаптеру, какие вьюхи вам для каждого типа отображения понадобятся.

3️⃣ Теперь настанет очередь onBindViewHolder, в котором аргументом будет являться уже вьюхолдер и position. Вы должны определить, какой это из ваших вьюхолдеров (здравствуй, полиморфизм), взять из него соответствующие вьюхи и наполнить их информацией из элемента на этой position.

🎬 Дело сделано! Мы определили для конкретной position конкретный viewType, сопоставили с вьюхолдером и наполнили его вьюхи. И так адаптер пройдётся по всем элементам и отобразит их так, как мы ему сказали.

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

P.S.: хотите видео-разбор типичных ошибок при организации списков? 10 реакций этому посту и снимаю 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥4👏1
❇️ Я в шоке от его гибкости ❇️

Рассказываю про adapter delegates в android: как сделать удобнее и чище свой adapter для RecyclerView.

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

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

https://youtu.be/dQAqT2NhDJI?si=P0Mao0M-h1WX9K-k

#android #видео #лайфхаки

@andrdevnotes | Обучение android
🔥4👍2👏2😁21
А скажите, удобно вам на ютубе мои видео смотреть? Надо продублировать на российские площадки?
Где вам удобнее смотреть мои видео
Final Results
74%
Ютуб
26%
Вк
12%
Рутуб
6%
Другое (укажу в комментариях)
Волшебная таблетка для мотивации

Мне нравится изучать мотивацию людей на гормональном уровне. Это помогает понимать, почему на некоторые вещи энергия есть, а при одной мысли о других вещах хочется спать.

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

Тогда ваша дофаминовая система выделит вам энергию на то, чтобы поиграть. А раз вы привязали «поиграть» к «выполнить дело» – то и на это тоже выделит.

☝️Важные моменты:

1️⃣ Ни в коем случае не обманывайте себя! Пообещали поиграть – поиграйте. Иначе перестанете себе доверять, и будут проблемы с дофамином в дальнейшем.

2️⃣ Не путайте привязку «желанное дело только после нежеланного» с «подумать о желанном, получить на это энергию, а потом обмануть себя и попытаться эту энергию использовать на нежеланное». Выделение энергии дофаминовой системой всегда целенаправленное. Вам не «выделяют энергию», вам «выделяют конкретное количество энергии на конкретное действие».

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

P.S.: я тут с чего всё это задвигаю вам: у меня самого щас на работе очень важное дело, которое помимо написания кода жрёт кучу энергии на коммуникации. И я сам этим костылём пользуюсь, норм работает.
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍2🔥2
🤔 По мере усложнения приложения, в какой-то момент вам перестанет хватать «плоской» навигации «активити-фрагмент», и понадобится вкладывать фрагменты друг в друга. Как это правильно реализовать?

🫣 Конечно, вы можете временно скрыться за очередной стеной абстракций, используя navigation component, но я вас уверяю, что при отсутствии чёткого понимания fragment manager и его транзакций, вы придёте к бардаку и костылям. По крайней мере, у меня было так =)

У каждого фрагмента есть доступ к трём FragmentManager (fm):

1️⃣ activity.supportFragmentManagerfm, до которого мы можем достучаться через родительскую активити. Пока вы не используете вложенность фрагментов друг в друга, его вам будет хватать.

2️⃣ parentFragmentManagerfm родительского компонента. Если Ваш фрагмент был вложен в другой фрагмент, то это будет fm родительского фрагмента, а если фрагмент вложен напрямую в активити – то это будет тот самый fm активити из пункта 1.

3️⃣ childFragmentManager – это fm, предназначенный для создания дочерних фрагментов у этого фрагмента. Только используя этот менеджер, вы сможете делать вложенную иерархию фрагментов.

🚀 А теперь проверим, насколько вам это понятно =)
🔥2🤔1🌚1
Ставь лайк, если не понял, что там за простыня сверху 😏
Please open Telegram to view this post
VIEW IN TELEGRAM
😁8👍2🌚1