Как-то на днях я с товарищем разговорился на тему того, что есть процесс разработки, работают ли программисты или давят клопов? Может ли любой стать разработчиком? В чем вообще сложность процесса разработки ПО? Надеюсь наш диалог поможет разобраться в деле тем, кто сам не занимается программированием или просто любит поразмышлять о своем любимом занятии.

И началось всё с достаточно популярного вопроса.

— Почему бюджет на разработку проекта часто оказывается превышен?

— Это непростой вопрос. Предлагаю взять за основу одну метафору, которая поможет мне объяснить положение вещей. Конечно это моё мнение, основанное на том опыте, что получил я.
Так вот, разработчики – творцы новых миров. Виртуальных миров.

— Ты бы ещё про фильм Матрица мне рассказал!

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

— Погоди. Почему сразу размытые? Например, у меня проект который я хочу запустить. Я чётко понимаю как он должен работать. Более того, у меня есть ТЗ!!!

— Хах. Да, но о многих аспектах этого нового мира заказчик не думает и не должен, ведь это работа разработчиков. Как организовать исходный код? Какой конвенции именования переменных следовать? Какие библиотеки использовать? Какую стратегию разделения на ветки использовать? Как обеспечить быстродействие?

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

— Допустим, но какое это имеет отношение к бюджету и срокам?

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

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

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

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

— Это как строить дом? Например если я хочу добавить ещё одно окно в комнату, я должен учесть хватит ли отопления? Не нарушу ли я законы теплообмена?

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

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

— А почему нельзя постепенно пересматривать что было понаделано и упрощать, убирать лишнее?

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

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

— Другой сценарий – разработчики не завышают оценки, потому что не видят возрастающей сложности, хотя она есть. Законы в их мире уже есть, они просто их не знают. И как в реальной жизни – незнание законов не освобождает от ответственности. Это ведёт либо к накоплению технического долга – проблемы есть, но всплывут впоследствии. Либо реализация новых фич ведёт к обрушению других частей системы, и это может быть не сразу заметно – вы не всегда перепроверяете всю работу и что то всплывет потом (что по сути увеличивает стоимость конкретной фичи). Ах да, автотесты скажешь ты – но дешево ли обходится их разработка? Проверяют ли они работоспособность на 100%?

— Да брось, мне кажется ты нагнетаешь – а как же модульность? Даже я – не программист, понимаю как бороться со сложностью. Разделить на части. Разделить зоны ответственности.

— Ты прав. Именно на это направлено большинство современных практик программирования. Например, может ты слышал про микросервисную архитектуру. Разработчики пытаются понизить сложность систем путем ограничения объема ответственности.
Но проблемы остаются все те же, просто часть из них переходит в другую плоскость – интеграция. Налаживание связей между теми самыми модулями или сервисами.
Хотел привести тебе ещё один пример о предыдущем тезисе – сложности внесения изменений в существующие законы.

Люблю философствовать на эту тему. Почему сложно увидеть необходимость изменений?

Когда ты создал мир, и не просто знаешь его законы, они рождены тобой, тяжело воспринимать вещи по-другому. Самому же подвергнуть свою логику сильной критике – так можно и до шизофрении дойти. И перекраивать эти законы может быть очень сложно. Не всегда долго, но сложно, потому что это требует смены какой-то парадигмы этого мира в голове конкретного разработчика или всей команды. Представь что тебе нужно переосмыслить все в реальном мире если измениться понимание закона гравитации. Или например вдруг, ты выяснил, что земля всё-таки плоская? Это настолько базовые понятия и они настолько вплетены в нашу жизнь, что процесс переосмысления может занять всю жизнь. И по сути реально ничего не изменит кроме твоего восприятия этого мира. Поэтому разработчики не любят менять свои парадигмы. Во всяком случае большинство. Комфортнее написать больше кода в старой парадигме, чем изменить парадигму чтобы упростить какую-то частность.

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

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


  1. thatsme
    27.11.2017 19:04

    В идеальном мире, всё почти вот так красиво, хоть и сложно. Однако в реальном мире, заказчик по 10 раз переделывает ТЗ на один и тот-же функционал («А мы не знали что так будет»), и очень часто простит несовместимого в новой версии, того что ведёт к усложнению системы ещё больше, либо противоречит тому что было сделано раньше. Объяснить подобное невероятно трудно. Oсобенно, если твои письма и документы не читают, или читают просто проскользив глазами, просмотрев картинки. Но смысла не уловив. Клиповое сознание менеджмента заказчика, — самая большая из бед.


    1. IRuslan Автор
      27.11.2017 19:09

      Нечего вам возразить – со всем этим сталкивался много раз. Моя идея в том, что даже в идеальном случае далеко не всё просто.
      А если по 10 раз менять требования, то именно из-за вышеупомянутой сложности в смене парадигдмы/метаформы, помимо объективного усложнения, как правило можно встретить и лютое негодование со стороны разработчика.


      1. Fox_exe
        27.11.2017 20:30

        Ещё известная проблема (Связанная с недостатком опыта и знаний прогера): После реализации очередной фичи, начинается отлавливание багов, что требует в десятки раз больше времени, чем написание этой самой фичи…


    1. vmm86
      27.11.2017 20:46

      Клиент подчас вообще слабо представляет регламентирование своей же предметной области, приходилось и с такими примерами сталкиваться… :-/


  1. vasIvas
    27.11.2017 19:39

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


  1. SpyDeX
    27.11.2017 22:15

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

    Странно, что это до сих пор обмусоливается, в рамках тостера «этот ответ легко ищется поисковиком».


    1. SpyDeX
      27.11.2017 22:26

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


      1. IRuslan Автор
        28.11.2017 07:57

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


        1. SpyDeX
          28.11.2017 08:52

          Думаю всё из-за единственного поставленого во главу угла вопроса.
          Вы сами попали в его ловушку и начали вокруг него ходить и, как сусанин, всех завели по нему.
          Догадываетесь какой вопрос?

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

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


        1. flancer
          28.11.2017 09:07

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

          Поэтому и вот. Проще притянуть статью к своему мировоззрению, чем свое мировоззрение к статье. Не принимайте всерьез мнение людей, которые, прочитав "пару предложений" из статьи, пишут коммент на три ;) 18 человекам, которые добавили статью в закладки, вы все-таки что-то донесли.


          1. SpyDeX
            28.11.2017 10:16
            +1

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


            1. flancer
              28.11.2017 12:25

              Помечайте. Верить, в наше время, нельзя никому, даже себе. Мне — можно.


    1. Helwig
      28.11.2017 09:54

      1. SpyDeX
        28.11.2017 10:12
        +1

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


  1. Sdima1357
    28.11.2017 00:23

    Дьявол прячется в деталях. И не только в программных проектах. Почему проект просрочен? — потому что недооцен. Почему недооценен? -у «оценщика» не хватило квалификации или опыта. И ПО тут просто частный случай, хотя и типичный


  1. Alexeyslav
    28.11.2017 12:15

    Бывают такие приколы и когда сам себе заказчик и исполнитель. И почему-то всё происходит точно так же будто это два разных человека.


  1. DigitalSmile
    28.11.2017 14:32

    Сложно ли разрабатывать ПО?

    Нет.


  1. andyudol
    28.11.2017 16:59
    +1

    Помню, как-то меня спросили, умею ли я стрелять. Конечно, чё там уметь-то? — ответил я — осталось только попадать научиться.
    Так и с разработкой. И со всем остальным.


  1. HappyGroundhog
    28.11.2017 17:36

    С завышением и раздутием сроков и стоимости, они же padding, нормальные проектные менеджеры борются с помощью работы с рисками. Составления карты рисков, их постоянного отслеживания и актуализации. Куда все риски с неверно выбранным фреймворком, сложным тестированием и заносятся. А вот как много компаний реально работают с рисками или знают о такой методике — это другой вопрос…