Привет. Меня зовут Кирилл Розов и вы если вы интересуетесь разработкой под Android, то скорее всего слышали о Telegram канале "Android Broadcast", с ежедневными новостями для Android разработчиков, и одноимённом YouTube канале. Этот пост является текстовой расшифровкой видео на канале

Не так давно на моём YouTube канале стартанула новая рубрика «Code Review кода подписчиков», где я разбираю код подписчиков канала и даю своё профессиональное мнение о нём, а также советы по улучшению.

Пока я разбирал проекты кандидатов на ревью кода, я заметил много общих ошибок, которые есть на проектах. Сразу же вспомнил, сколько такого же кода я видел, когда мне приходилось делать code review своих коллег из команды или изучать тестовые задания. Решил, что пора рассказать вам 10 лучших практик, которые вам позволят улучшить качество кода и создать крутое впечатление у ревьювера. Конечно, они не исправят ваши технические навыки, но отдельные советы смогут сделать и это.

Если вы хотите попасть на разбор кода Android проектов, то вы можете подать заявку здесь

1. README должен содержать полезную информацию о репозитории

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

Пример отображения репозитория на GitHub
Пример отображения репозитория на GitHub

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

Пример оформления README у библиотеки ViewBindingPropertyDelegate
Пример оформления README у библиотеки ViewBindingPropertyDelegate

Зачастую большинство людей просто выкладывают код в репозитории. Ты совсем не понимаешь, что это за проект и как он устроен. Если вы хотите, чтобы о вашем проекте дали отзыв, то пишите, что это за проект, что он делает.

Пример плохого описания README в репозитории
Пример плохого описания README в репозитории

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

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

2. Оформляете историю коммитов в GIT

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

Пример хорошей истории в GitHub
Пример хорошей истории в GitHub

Зачастую у проектов, которые кандидаты отправляют на review, написан весь код локально. Они делают один комит, в который складывают весь свой код и его так отправляют. Ты не знаешь, что там происходило, не можешь посмотреть историю. А когда ты видишь, как человек разрабатывал этот проект, как он к нему подходил, как он сливал какие-то части, а также какие комиты там были и что он делал, то это очень здорово позволяет понять историю жизни этого проекта. Видно, как человек его разрабатывал. Поэтому обязательно ведите хорошую Git-историю. Учитесь этому сразу. Вам в продакшене это всегда понадобится. А ревьюверы вашего кода это оценят.

3. Упростите ревьюверу работу. Собери сборку вашего приложения

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

Позаботьтесь о том, чтобы куда-то выложить собранную релизную версию вашего труда. Это можно очень эффективно сделать через GitHub в release notes. У вас там есть assets, которые вы можете прикреплять к релизам. Вы можете это положить прямо в репозиторий и иметь файлик, на который будет ссылка. Вы можете это опубликовать в магазине приложений. Возможно, у вас даже есть свой аккаунт и вы можете сделать просто закрытый доступ. Делайте это обязательно. Это очень здорово повысит то, каким образом можно пощупать ваш проект и посмотреть на то, какой конечный результат вы можете сделать помимо того, какой код вы пишите.

4. Отправляйте только код, который компилируется не только на вашем компе

Прежде чем отправлять код на review, обязательно убедитесь, что он полностью может компилироваться и не только на вашем копьютере. Проверьте сборку, собрав проект с нуля (включая копиравоние репозитория) и попробуйте его собрать из терминала, даже не заходя в IDE. Это очень упростит ваше понимание о том, что у вас всё хорошо. Также не забывайте про релизую сборку. В приложениях очень часто разработчики проверяют только debug, а попытаешься собрать релиз, всё крэшится, т. е. оно не может собраться, потому что там не хватает build-конфигов, которые только прописали в один build variant, а также чего-то еще.

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

Лучший подход - автоматизировать все варианты сборки, но об этом читайте ниже

5. Не используйте диковинные технологии/библиотеки

При разработке проекта не используйте какие-то диковинные технологии. Особенно не используйте те технологии, которые вы не знаете, просто решив поупражняться на реальном проекте, который будут оцениваться и у вас ограниченные сроки для выполнения задания. Ни в коем случае этого не делайте, если у вас нет явных требований от заказчика этого кода, чтобы использовать именно эти технологии. Это ведет к очень печальным последствиям. Например, если вы используете какие-то диковинные решения, допустим, непопулярный DI или что-то еще, то это может вызвать вопрос: «Умеете ли вообще работать с общепринятыми tools?».

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

6. Продумайте организацию кода заранее

Прежде чем начинать, продумайте то, каким образом вы будете организовывать код в вашем проекте. Имеется в виду и Gradle модули или какие-то другие модули. Также это относится и к пакетам, наименованиям классов и ко всему, что связано с пониманием, как у вас организован код. Например, реализация одних и тех же экранов должна быть идентична: структура классов, пакетов, разеделние кода и пр.

Очень плохая практика, если у вас есть пакеты аля view-model, screens и репозиторий. Там три пакета, в которые скинуто абсолютно все. И если у вас количество экранов растет, то у вас эти пакеты безразмерно начинают расти.

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

7. Осмысленное именование переменных, методов и классов

Если мы уже заговорили о хорошей организации вашего кода, то, конечно, не стоит забывать, что переменные, название классов и прочее тоже должны быть понятно созданы и не именоваться автоматическими способами или буквами, например, a, b, c, d. Это снижает читабельность и приводит к тому, что ваш код даже не захотят разбирать. Учтите, что при написании реальных проектов, чтение – это половина от того, что приходится делать с кодом, а остальное написание. Даже бывает в соотношении 60 на 40, а то и 70 на 30, где в меньшую часть вмещается написание кода. Поэтому следите за читабельностью. Её высоко ценят в профессиональной среде!

8. Соблюдайте стиль кода

У любого художника есть фирменный стиль. А у нас, как у программистов, должен быть свой стиль кода. Конечно, необязательно он должен быть полностью свой. Можно легко взять стандартный и рекомендуемый для Java или Kotlin, причем они, скорее всего, уже сразу включены в вашу IDE, особенно это актуально для IDEA и Android Studio. И вы легко можете их придерживаться.

Я сразу вижу, когда вы выходите за границы, если нарушаете количество символов в сроке. Например, у меня лимит стоит в 120 символов в строке (у меня прямо черта проведена). Я сразу вижу, что выходит за границы и происходит что-то неприемлемое. Мне это сильно режет глаза, поэтому такой код я сразу считаю не очень приятным. Мне в нем труднее разбираться, особенно, когда у меня небольшой монитор в 13-15 дюймов, а строка очень длинная. Мне ее нужно скролить. Возможно, у автора ультраширокий монитор и для него это нормально. Уважайте тех людей, которым даете свой код, а также своих коллег по команде, которые будут этот код читать. Возможно, не у всех такие широкие мониторы как у вас.

Кстати, вам не нужно следить за этим самостоятельно, потому что есть много автоматических утилит, которые это делают за вас. Они могут даже форматировать код, когда вы будете делать комиты. Они будут упрощать вашу работу. Я как раз делал обзор на все такие tools. Вы можете его посмотреть и найти для себя много полезного. Такие утилиты могут исправлять не только стиль кода, они могут давать советы по производительности и как лучше писать, а также почему что-то не стоит делать и стоит делать иначе.

9. Документируйте код

Слышали про такое понятие, как самодокументированный код? Да, есть большие компании, которые говорят: «Нам не нужно писать документацию для нашего кода. У нас он настолько шикарен, что никому не нужно разбираться, все и так понятно без дополнительной документации». Да, этого можно достичь, например, в команде, которая пишет слаженно, хорошо и долго работает вместе. Но со временем, когда приходят новые люди, эта документация поможет понять, что вы тут написали, как что использовать и какие вещи есть.

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

10. Автоматизируйте ваш проект, настройте CI/CD

Если вы хотите показать крутое отношение к своему проекту ревьюверу, просто настройте CI/CD в вашем проекте. Сделать это в GitHub Actions, если у вас там находится проект, совсем не сложно. Есть готовые шаблоны и статьи, которые помогут вам это сделать. Это повысит мнение о вас в глазах ревьювера, да и вы автоматизируете поиск всяких мест, где у вас могут быть потенциальные ошибки, что не даст вам допустить их.

Заключение

Если вы будете придерживаться тех 10 советов, которые я описал выше, любой ревьювер от вашего кода придёт в восторг. Он сразу поставит вам апрув на всех ваших pull request-ы или возьмет вас на работу, что здорово вас порадует и вы будете жить прекрасно и счастливо.

Да, конечно, качество вашего кода я не увеличу, т. е. все равно нужно учиться использовать технологии и их лучшим практики!


10 советов, 10 советов, но на самом деле есть один простой и хороший совет - хотите показать крутое качество ревьюверу, относитесь к своему проекту как к боевому, даже в котором один экран. Делайте все так, как бы вы сделали в реальной фиче. И у вас всё будет топ!

Комментарии (16)


  1. alexonelove911
    06.09.2021 12:07
    +3

    Страшный сон джуна


  1. Bringoff
    06.09.2021 13:17
    +1

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

    Делал в своей жизни пару тестовых заданий, и, если не было каких-то особых требований, обязательно затягивал какую-то незнакомую для себя штуку, типа Toothpick вместо Dagger. Чтобы раз уже трачу свое время непонятно на что, так хоть с пользой для себя.


    1. kirich1409 Автор
      06.09.2021 13:21

      Не было страха запутаться с новой технологией и не уложиться в срок?


      1. Bringoff
        07.09.2021 10:00

        Нет, по нескольким причинам.

        Во-первых, я не так много делал тестовых ???? И за большие не брался, запас времени в несколько дней есть, тестовое даётся на дом же.

        Во-вторых, я не брал какие-то сложные штуки с новыми концепциями (типа RxJava, не видя реактивщины до этого). А Toothpick после Dagger или Room после ORMLite не знаю, чем могут запутать.

        Конечно, возьми я RxJava, не видя до этого реактивщины в лицо, мог бы и запутаться, наверное.


    1. DMGarikk
      06.09.2021 16:31
      +1

      обязательно затягивал какую-то незнакомую для себя штуку

      а потом получить в лоб вопрос про эту штуку в контексте 'во, во, а мы это юзаем, можете пояснить как вы в ней __такоето__ делали?'
      или наоборот 'а вы знаете что в __этойштуке__ есть некие проблемы с многопоточностью (например) и как вы их решаете? (раз тут применили значит разбираетесь'?


      1. Bringoff
        07.09.2021 10:10

        можете пояснить как вы в ней __такоето__ делали?

        А что мешает сказать: «__такое-то__ я на этой штуке не делал»?

        раз тут применили значит разбираетесь

        А из чего это исходит? Где-то есть правило, что я должен быть экспертом 5000+xp в каждой либе, которую использую в тестовом или любом другом проекте? Жалко, что вам попадались интервьюеры, цель которых была очевидно вас подловить.


        1. DMGarikk
          07.09.2021 10:30

          Где-то есть правило, что я должен быть экспертом 5000+xp в каждой либе,

          ну тоесть вы на работе, будете использовать первые попавшиеся либы тупо почитав что 'вроде подходит, фигзнает как и что там внутри'?

          Жалко, что вам попадались интервьюеры, цель которых была очевидно вас подловить.

          ну я лично, если приходилось, выбирал либы только те которые знал и те про которые мог чтото рассказать.
          я несколько раз сталкивался лично с непреодолимыми проблемами в библиотеках которые затянули в проект люди с подобным подходом:
          1) заюзать либу у который последний коммит на гитхабе более 5 лет назад
          2) заюзать либу у который разработчик с альтернативным мышлением. типа 'я юзаю только python3.2 потому что спать не могу как не люблю более новые версии и не собираюсь ничего менять'
          3) заюзать форк от основной либы где ктото пофиксил важную ошибку, и не описать это в документации и не продумать кто будет потом этот форк апдейтить в вашем проекте

          А что мешает сказать: «__такое-то__ я на этой штуке не делал»?

          и перейти на разговор в плане 'а почему вы вообще решили эту либу заюзать?'


          1. Bringoff
            07.09.2021 10:42
            +1

            тоесть вы на работе, будете использовать первые попавшиеся либы тупо почитав что 'вроде подходит, фигзнает как и что там внутри'?

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

            Право, не стоит впадать в крайности :) Дают вам тестовое задание вида "что-то получить с апишки и показать несколько графиков" (без явного требования реализации их ручной отрисовки), и вы героически несколько ночей реализовываете отрисовку их вручную, потому что до этого с либами для графиков не сталкивались, а, значит, и сказать ничего не сможете?)

            я несколько раз сталкивался лично с непреодолимыми проблемами в библиотеках которые затянули в проект люди с подобным подходом

            Опять же ненужные крайности. Я в тестовые затягивал библиотеки не просто ради того, чтобы хоть что-то затянуть, а чтобы разобраться с чем-то новым, в чем нет времени ковыряться просто так (как уже писал выше, Toothpick и Room я впервые испытал именно в тестовых заданиях).

            и перейти на разговор в плане 'а почему вы вообще решили эту либу заюзать?'

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

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


            1. DMGarikk
              07.09.2021 12:30

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

              ну у меня аналогичная история, за всё время я делал только одно тестовое задание за всё время (которое гордо повесил на гитхабе чтобы показывать на собесах в стиле 'ну вот както так я делал микросервисы')

              я уже в принципе, если человек всётаки делает какуюто задачу и использует какието инструменты — он должен делать это не назло (типа вы дураки нечего мое время тратить, вот запилю както так), а так как сделал бы это на работе.


              1. Bringoff
                07.09.2021 12:43
                +1

                так как сделал бы это на работе

                А на работе новые либы никогда не надо затягивать?) Реальный плюс-минус кейс: работал я когда-то 2 года на проекте, где в качестве ORM была Greendao. Неплохо с этой штукой за 2 года успел разобраться, но также и узнал его проблемы (допустим, join-ы через id, который не long, приходилось костылить, потому что кодогенерация этого не умела). Плюс увидел, что на гитхабе год никаких коммитов, проблемы не исправляются.

                И тут меняю работу, где надо заложить основу для нового проекта. Google тем временем уже представил Room. Ваш вариант, что следует затянуть в проект? Greendao, который я знаю, или Room, который, судя по всему, может решить известную мне боль, да и завтра не загнется, так как уже рекомендуется на d.android.com?

                Если бы все юзали только библиотеки, которые они знают, мы бы до сих пор в андроиде сидели на асинктасках и контентпровайдерах.


                1. DMGarikk
                  07.09.2021 13:10

                  А на работе новые либы никогда не надо затягивать?)

                  надо, но у меня затягивание новой либы всегда было — только после обсуждения с коллегами

                  Google тем временем уже представил Room. Ваш вариант, что следует затянуть в проект?

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

                  Если бы все юзали только библиотеки, которые они знают, мы бы до сих пор в андроиде сидели на асинктасках и контентпровайдерах.

                  Это двоякий вопрос, с одной стороны вы как разработчик правильно думаете (развитие важно), а с другой стороны это риски закопать кучу бабла с нулевым выхлопом… а потом еще кучу бабла чтобы всё починить.
                  причем аргумент для бизнеса 'ну потому что это модно, надо всё новое юзать' — очень фиговый аргумент, бизнес он про бизнес, а не про образование сотрудников


                  1. Bringoff
                    07.09.2021 13:14

                    1) затягивать тот который вы знаете

                    гугл не единожды замечен в забрасывании проектов

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

                    Ну и Android — проект гугла, тогда и под Android разрабатывать не стоит с такой логикой.

                    это риски закопать кучу бабла с нулевым выхлопом

                    Ну вот поэтому при возможность пощупать любу без необходимости затягивать в реальный проект я не упускаю :)


                    1. DMGarikk
                      07.09.2021 14:32

                      Ну и Android — проект гугла, тогда и под Android разрабатывать не стоит с такой логикой.

                      и у меня слов матерных не хватает… по поводу андройда
                      Я тут открыл свой проект 9 летней девности, он весь зачеркнут как depricated (меня еще больше забавляет что темплейты приложений в андройдстудии тоже наполовину с depricated кодом… типа лень заапдейтить… олимпиадники погромисты на такое не размениваются)
                      а их способ писать код с импортом compat библотек когда например 'базовая библиотека у нас, например layout… но если хотите в совместимость юзайте layoutcompat'… тоесть всегда надо юзать compat и при смене версии compat перелопачивать весь код… а версии они меняют с завидной регулярностью

                      а уж сколько они технологий успели родить и закопать...instant apps вроде год чтоли продержались?


                      1. Bringoff
                        07.09.2021 15:04

                        Это, конечно, уже совсем другая тема, но

                        проект 9 летней девности, он весь зачеркнут как depricated

                        9 лет назад Android был молодой и зелёный, было бы странно, если бы за это время ничего не устарело. Это Java может себе позволить 9 лет ничего не менять и называть это обратной совместимостью.

                        тоесть всегда надо юзать compat и при смене версии compat перелопачивать весь код

                        Очень редко при смене версий compat надо что-то «перелопачивать». Я помню только одну такую ситуацию, когда гугл зачем-то решил переименовать все пакеты. Зато эти либы позволяют использовать какие-то штуки, появившиеся в новых версиях Android, без необходимости отказываться от поддержки старых версий ОС. Без этого фрагментация среди Android-экосистемы была бы ещё больше.

                        instant apps вроде год чтоли продержались?

                        Вы что-то путаете, они и сейчас «держатся». Их, правда, почти никто не делает, но это уже другой вопрос.


                      1. DMGarikk
                        07.09.2021 15:17

                        Вы что-то путаете, они и сейчас «держатся»

                        я давно не слежу за андройдом

                        но тут на хабре читал гдето год назад статью
                        что они выкатили инстант апп как отдельную сущность потом её деприкейтнули и сделали частью обычного аппа… в итоге всем несколько раз надо было переписывать проекты
                        9 лет назад Android был молодой и зелёный, было бы странно

                        они сильно чаще выпиливают фишки какието чем раз в 9 лет.
                        мне вспоминается глобальный переход в районе 5-6 версии когда массово поменяли настраиваемую безопасность, а потом новый тип лайаутов… и чтото с асинхронщиной.
                        а 9 лет назад вышел 4 андройд который 'наконецто созрел и избавился от наследия 2й версии… помню киткату оды пели тогда… а сейчас киткат только в матерном контексте поминают


  1. saboteur_kiev
    06.09.2021 14:08
    +1

    Не знаю какой размер должен быть у тех задания, чтобы для него надо было мучаться с историей коммитов, созданием CI/CD. Может быть еще и можно в release выложить готовый бинарник, но ревьюверу, для которого пишется тех задание, несложно его скомпилить

    любой ревьювер от вашего кода придёт в восторг.

    Очень плохо говорить за всех. У "любых" ревьюверов могут быть любые свои собственные хотелки и представления о том, что они хотят увидеть в проекте...

    Если вы хотите, чтобы о вашем проекте дали отзыв, то пишите, что это за проект, что он делает.

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

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

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