Как я могу убедить моих со-программистов не делать параноик "просто чтобы быть уверенным в программировании"? - PullRequest
21 голосов
/ 30 июля 2009

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

Примеры:

Перерисовка окна, которое по какой-то причине не нарисовано так, как хотелось бы программисту:

Invalidate();
Revalidate();
ProcessMessages(); 
Update();    
Repaint();
Repaint();
ProcessMessages(); 
Repaint();

Чрезмерная настороженность:

function test1(x: boolean) 
begin
  select case x
    true: // do something
    false: // do something else
    else
      raise Exception.Create("Invalid value.") // just to be sure
  end;
end;

function test2(x: Integer);
var
  y: Integer;
begin
  y = Abs(x);
  if y >= 0 then
  begin
    // do something
  end;
end;

Хотя особенно осторожные методы кодирования приводят к предупреждению компилятора на большинстве языков, на самом деле я видел все вышеперечисленное в рабочем коде!

В большинстве случаев этот вид кодирования защищается программистом и / или начальником. Причины всегда сводятся к этому ответу:

  • Ну, больно, если мы перепроверим? Лучше быть в безопасности, чем потом сожалеть!
  • Это защитное программирование, разве они не учили этому в университете?!

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

Могу ли я представить какие-либо неопровержимые факты о том, что этот стиль в конечном итоге имеет плохие последствия?

РЕДАКТИРОВАТЬ: Спасибо за хорошие предложения, чтобы избавиться от этого стиля. Но я все еще интересуюсь причинами , которые я могу представить своим коллегам, чтобы объяснить и, возможно, убедить их, почему это плохо, и в их интересах не быть параноиком .

Ответы [ 17 ]

30 голосов
/ 30 июля 2009

Попросите их написать модульные тесты для каждого случая.

23 голосов
/ 30 июля 2009

Принудительное 100% покрытие ветвлений для юнит-тестов, или сборка не удалась. Он не сможет заставить test1 выдать исключение или оценить условие в test2 как ложное.

12 голосов
/ 30 июля 2009

Программирование по совпадению http://www.pragprog.com/the-pragmatic-programmer/extracts/coincidence

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

Фред не знает, почему код не работает, потому что он не знал, почему он сработал. Казалось, что это работает, учитывая ограниченное «тестирование», которое проводил Фред, но это было просто совпадение. Воодушевленный ложной уверенностью, Фред бросился навстречу забвению. Теперь самые умные люди могут знать кого-то вроде Фреда, но мы знаем лучше. Мы не полагаемся на совпадения - не так ли?

9 голосов
/ 30 июля 2009

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

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

Я сказал разработчику, что производительность является приоритетом для его части кода. Оказалось, что самым простым способом быстрого улучшения производительности было удаление лишних проверок и повторных повторных инициализаций ;-). Этот трюк работал как удовольствие, и вскоре он был обучен своим привычкам «защитного кодирования»!

6 голосов
/ 30 июля 2009
Repaint();
Repaint();
ProcessMessages(); 
Repaint();

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

5 голосов
/ 30 июля 2009

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

private bool IsValid(bool isValid)
{
    if(isValid == true) return true;
    else if(isValid == false) return false;
}

То же самое касается обоих приведенных вами примеров. Программист МОЖЕТ не знать, что делает каждый вызов функции (в первом случае) или каковы основные принципы switch (во втором). Не так ли?

4 голосов
/ 30 июля 2009

Причины чрезмерной осторожности включают:

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

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

3 голосов
/ 30 июля 2009

Первый приведенный пример - классический случай Программирование по совпадению , так что ваши патроны против этого.

Случаи 2 и 3 просто глупы в большинстве контекстов, если только они не являются тестовыми примерами для какого-либо языка бета-программирования или чего-то, в котором реализация ABS и логического значения может иметь неопределенное поведение.

3 голосов
/ 30 июля 2009
  1. Пусть пишут Unit Test
  2. Введение обзоров кода (возможно, вы можете обсудить такие фрагменты кода и показать, как они работают лучше)
  3. Ввести СУХОЕ правило (не повторяй себя)
2 голосов
/ 13 июня 2011

Есть только одно решение: Уволить его.

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

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

...