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

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

Обнаружено наличие ошибки

В основном ошибки находились и исправлялись тем, кто их сделал за некоторое малое время. Это как бы часть процесса отладки - быстрое нахождение ошибок.

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

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

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

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

Помощь друга

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

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

Озарение

И в какой-то момент вдруг неожиданно тот, кто ошибку сделал, ее сам и находит. Именно автор ошибки. В каком-то таком месте, на которое он смотрел уже не однократно. Далее текст "спасибо я все нашел!" Он по этому месту ездил отладчиком не один раз. Проверял все переменные и индексы. Проверил чтобы все скобки стояли правильно. Но ничего не нашел. И только когда рядом появился человек, которому он начал пояснять как все устроено, ошибка была найдена.

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

И вот чаще всего я сам никакую ошибку не нахожу. Я даже и мало понимаю, что там на самом деле происходит. Коллега в итоге все находит сам. Но только мое присутствие и выслушивание его объяснений приводит к успеху.

Почему так происходит?

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

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

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

Скорость кодирования

Ранее (30 и более лет назад) была некая классификация программистов по скорости работы. Считалось, что 30-40 строк отлаженного кода в день это уровень нормального программиста. Но есть программисты, которые производят более 150 строк отлаженного кода в день. Их классифицировали как "супер программистов". И были две методики разработки. Один из них - набор команды нормальных программистов, к ним прибавлялся как сейчас говорят "тимлид" и с максимальным документированием изготовлялся проект.
И был второй подход. Нанимается один супер программист или двое. И они, работая на другом уровне скорости и концентрации, приводили к успеху проект даже быстрее. Это не проекты размера с "гугол" или "word". Но все равно не маленькие.

На Хабре тема скорости кодирования уже всплывала.

Вот еще более ранняя переводная статья.

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

Быть может кто-то сделает такое предположение по поводу работы описанного эффекта, которое позволит его понять и использовать системно.
Я им пользовался, так и не поняв самого механизма. Хотелось бы еще понять, как его использовать, когда команда не сидит в одном месте, а является распределенной.

В общих наших интересах находить полезные способы работы и учиться системно их использовать.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Для меня нормально создавать отлаженный код в темпе
4.76%10-20 строк в день2
11.9%30-50 строк в день5
7.14%60-100 строк а день3
7.14%150 и более строк в день3
7.14%Более 3003
61.9%Я свою работу оцениваю не в количестве строк, а по результату26
Проголосовали 42 пользователя. Воздержались 7 пользователей.