Когда вы сталкиваетесь с проблемой, ошибкой в ​​вашем коде, как вы пытаетесь ее исправить?

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

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

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

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

«Но эволюция работает», вы можете возразить. "Если он может создать что-то столь же сложное, как человеческие существа, почему бы не использовать тот же метод в моем повседневном программировании?" Подумайте об этом:

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

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

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

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

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

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

Первоначально опубликовано на http://software.rajivprab.com 29 апреля 2018 г.