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


Причиной моего недовольства стал очередной неудачный опыт работы с фрилансером, именующим себя "мобильным разработчиком". Человеку была поставлена задача, он ее даже выполнил — приложение как-то работало, хотя некоторые баги с удалением объектов навевали грустные мысли о неправильной работе с индексами списков. А это — плохая примета. Если человек не умеет работать с удалением из списков, то это скорее всего только начало проблем, и далее стоит ожидать худшего.


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


Напомню, что приложения Android пишутся на Java — объектном (с небольшими оговорками) ЯП. Или даже некоторых объектно-функциональных (тоже с оговорками) ЯП типа Kotlin и Scala.


Наш же герой, назвавшийся «разработчиком Android», не освоил даже процедурного программирования (своеобразный «бронзовый век» программирования) и остался где-то на уровне структурного («каменный век»). Своим каменным топором на палке с единственной функцией "копи-паст", он и сколотил все мое будущее приложение.


О, этот человек — гений копипасты. Например, каждый раз, когда надо было взять объект по id из списка, он писал цикл. А когда ему попадался список списков, он писал вложенный цикл. Поэтому мое новое приложение на 80% состояло из «лесенок» циклов разной степени вложенности…
Все эти циклы были до боли похожи друг на друга, но создать приватный метод, например, getObjectById "разработчик" так и не догадался. Надо ли говорить, что методы insert и update длиной по 200 строк совпадали на 90 процентов?


Я занялся рефакторингом этого "чемодана без ручки" (нести неудобно, бросить жалко — деньги же уплочены). IDEA честно мне подсвечивала дублирующиеся куски и предлагала вынести их в функции. Методом простого нажимания F2 (переход к следующему предупреждению), Alt-Enter (показать варианты действий) и Enter (выбор первого дефолтного варианта). Мне удалось сократить исходный код в 1.5 раза. Остается загадкой, что мешало сделать это самому разработчику. Незнание, что в IDEA есть предупреждения?


Потом я занялся уже рефакторингом классов, которые тоже были тупо скопированы, без малейших попыток создания супер-классов с общей функциональностью. Пришлось серьезно поработать и над инкапсуляцией и побочными эффектами — статичные публичные свойства классов с успехом заменили человеку отсутствие глобальных переменных в Java. Например, id редактируемого объекта было просто глобальной переменной главного Activity...


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


Чем меньше кода, тем меньше глюков.

Не глючит только код, которого нет. Отсутствующий код (при сохранении функциональности) – это предел, к которому надо стремиться. Из этой аксиомы неудивительным образом следует утверждение "больше кода — больше глюков". Избыточный код — это главная проблема копипасты — она примерно квадратично увеличивает количество багов в коде. Для борьбы с этим явлением еще на заре императивного программирования придумали процедуры. Но наш программист не искал легких путей…


Впрочем хватит ныть. Речь ведь не о нем, а о методиках обучения программированию в ВУЗах, когда свежего первокурсника сажают сразу на какой-нибудь С++ (прямо скажем, не самый лучший язык для новичков) учить ООП или зубрить алгоритмы сортировки с «о-большое-от-эн-логарифм-эн». И хорошо, если перед этим им хотя бы объяснили "черепашью графику". По факту же люди не знают самых основ программирования.


Но давайте по чесноку! Вот вы там такие умные сидите сейчас и думаете "Ну это же детский сад! Я бы так никогда не сделал.". Допустим, все так, и настолько глупого кода с копипастой вы не напишите. Но насколько вы усвоили (и применяете) остальные, более сложные, концепции и парадигмы? Ведь любой современный ЯП — мультипарадигменный. И все эти парадигмы надо применять одновременно: создавая методы объекта, выделять смыслово-законченный или повторяющийся код в процедуры, возвращая замыкание в качестве результата обобщенной функции, не забыть про инкапсуляцию, заводя в проекте новый утилитарный модуль, вспомнить про решаемый аспект, и т.д.


Ниже в статье голосовалка — проверь себя, все ли из перечисленного ты знаешь. Там нет ни одной технологии или библиотеки специфичной для предметной области, только общие парадигмы. Я убежден, что любой, кто называет себя программистом просто обязан знать и применять все перечисленные подходы в любом языке программирования (от CSS до Erlang, от прости-господи-1С до Rust).


Итак, что ты знаешь (можешь объяснить суть и плюсы-минусы в 2-3 предложениях и дать примеры, как ты это применял в последнее время)?


Если что-то для тебя там новое или ты не уверен, что можешь правильно объяснить, советую погуглить на досуге и немного повысить свой уровень с «разработчика» (в плохом смысле этого слова) до настоящего лампового «программиста».


P.S.: список парадигм не претендует на полноту. Предлагайте свои дополнения в комментариях.

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


  1. SirEdvin
    21.02.2018 12:01

    А еще меньше инженеров…



  1. dmitry_dvm
    21.02.2018 12:34
    +10

    Выбрали, наверное, самое выгодное по цене предложение и жалуетесь, что там оказался новичок. Через полгода он посмотрит на этот код и ужаснется. Но зато на нем он немного прокачался. Я когда начал свое первое коммерческое приложение — не знал как прокинуть нажатие кнопки из View в ViewModel. А вы с первой строчки кода как синьор писали?
    И почему это деньги выброшены зря? Приложение работает? Работает.


    1. Free_ze
      21.02.2018 12:41
      +2

      Что называется, оба участника приобрели ценный опыт.


    1. Neikist
      21.02.2018 13:02

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


  1. dro1d
    21.02.2018 12:36
    +2

    я думаю, для полноты картины, надо выложить исходники фрилансера, или хотя бы самые «гениальные» куски кода.


    1. ToshiruWang
      22.02.2018 13:07

      Для полноты — ещё и код после рефакторинга.


  1. xakepmega
    21.02.2018 13:16
    +1

    Можно было бы в процессе работы требовать выливки и кодревью


  1. sbnur
    21.02.2018 13:24
    +3

    а судьи кто


  1. Naglec
    21.02.2018 14:27
    +3

    В ТЗ были требования к парадигмам, покрытию тестами и качеству кода в целом?


    1. Free_ze
      21.02.2018 14:46

      Фрилансер фрилансера видит издалека) Профессиональная культура должна же быть какая-то.


      1. Naglec
        21.02.2018 14:47
        +2

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


        1. Free_ze
          21.02.2018 14:54

          Автор теперь тоже понимает) Но что поделать?
          «Качество кода» — это мерка субъективная, а тесты тоже можно писать чисто номинально. Другого фрилансера привлекать — чревато. Можно самостоятельно делать поэтапное кодревью и всячески участвовать в разработке архитектуры, но… может и написать тогда самому, если есть экспертная квалификация во всех необходимых аспектах? Не факт, что выйдет дороже.


          1. Naglec
            21.02.2018 14:56

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

            Нанимать левого чувака, а потом в конце удивляться качеству кода как-то странновато.


  1. irbis_al
    21.02.2018 20:07

    Соглашусь, что работа с фрилансером это предпринимательский риск(Хотя и фрилансер, по ту сторону монитора,- скажет, что работа с заказчиком это риск)… Я частенько прибегаю к заказам фрилансеров… И мой опыт таков, что нельзя давать делать большое приложение… Надо его разбить на части… В Вашем случае… дайте задачу типа вывести какой-то список… Проверьте код… если он «косой»… не работайте с этим фрилансером.Отрефакторьте код… и дайте задачу на фриланс,- уже имеющийся список загрузить данные из базы(тлт сервиса)… проверьте задачу… Нравится… продолжайте работать далее с этим человеком.


  1. corr256
    22.02.2018 10:25

    Всё знаю, всё умею, но отдаю свою работу на фриланс, в надежде, что самому ничего делать не придётся…


  1. just_prepod
    22.02.2018 10:46

    Вам, заказчикам из индустрии, не угодишь. Когда мы в вузах учим на первом курсе основам алгоритмов (именно той самой черепашке, рисующей псевдографикой рисуночки) вы нас на смех поднимаете. Дескать, «поглядите на юродивых — мы тут уже микросервисные блокчейны на big-data нейросетях делаем, а они ерунде учат». Лет десять назад был социальный заказ на людей, которым азы не нужны, им нужно уметь приложения на андроиде делать — вот, вы познакомились с результатами этого обучения. Получите, распишитесь.


  1. barbalion Автор
    24.02.2018 11:03

    .