Самое сложное объяснение программирования - PullRequest
19 голосов
/ 26 октября 2009

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

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

Ответы [ 26 ]

30 голосов
/ 26 октября 2009

Синхронизация потоков и мертвая блокировка.

25 голосов
/ 26 октября 2009

Тратить время на дизайн и тратить время на рефакторинг.

Рефакторинг вообще не производит видимых клиенту работ, что делает его самым трудным в проекте оправдать работу.

В качестве второй «невидимой для клиента» проблемы - модульное тестирование.

18 голосов
/ 26 октября 2009

Меня спросили, как работает интернет - я ответил "SYN, ACK, ACK". Не забывайте, что это SYN, SYN-ACK, ACK ..

alt text
(источник: inetdaemon.com )

14 голосов
/ 26 октября 2009

Мой самый сложный вопрос начался достаточно невинно: моя девушка спросила, как текст отображается в Firefox. Я просто ответил чем-то вроде «движок рендеринга, Gecko, HTML-парсер, бла-бла-бла».

Тогда это пошло под гору. «Ну, как Геккон знает, что тогда отображать?»

Оттуда буквально дошло до графических драйверов, операционной системы, компиляторов, аппаратных архитектур и необработанных единиц и нулей. Я не только осознал, что в моих собственных знаниях об иерархии слоев были значительные пробелы, но также и то, как, в конце концов, я оставил ее (и меня!) Более смущенной, чем когда я начал.

Я должен был сначала ответить "черепахи внизу" и придерживаться этого. : P

11 голосов
/ 26 октября 2009

У меня была забавная попытка объяснить, почему программа не работает так, как ожидалось, когда некоторые записи в базе данных имели пустые строки, а некоторые имели значение NULL. Я думаю, что их голова почти взорвалась, когда я сказал им, что пустая строка - это просто строка с 0 байтами в ней, в то время как NULL означает неизвестное значение, поэтому вы не можете сравнить его ни с чем.

После этого у меня была одна неприятная головная боль.

10 голосов
/ 26 октября 2009

1.) SQL: Мышление в наборах, а не процедурно (нам, программистам, достаточно сложно это понять!).

2.) ... и вот отличный пример демистификации технических концепций:

Как я объяснил REST моей жене

9 голосов
/ 27 октября 2009

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

Худшей ошибкой, которую я когда-либо совершал, было создание макета пользовательского интерфейса в NeXT Steps UI Builder. Это выглядело точно так же, как конечный продукт выглядел бы и имел некоторое поведение. Попытка объяснить, что после этого осталось 6 месяцев работы, была очень трудной.

9 голосов
/ 27 октября 2009

Мне приходит в голову множество утверждений, начинающихся с "It's because in Oracle, ...".

6 голосов
/ 26 октября 2009
5 голосов
/ 26 октября 2009

Почему такой код плох:

private void button1_Click(object sender, EventArgs e)
{
    System.Threading.ThreadStart start = 
        new System.Threading.ThreadStart(SomeFunction);
    System.Threading.Thread thread = new System.Threading.Thread(start);
    _SomeFunctionFinished = false;
    thread.Start();
    while (!_SomeFunctionFinished)
    {
        System.Threading.Thread.Sleep(1000);
    }
    // do something else that can only be done after SomeFunction() is finished
}

private bool _SomeFunctionFinished;
private void SomeFunction()
{
    // do some elaborate $#@%#
    _SomeFunctionFinished = true;
}

Обновление : каким должен быть этот код :

private void button1_Click(object sender, EventArgs e)
{
    SomeFunction();
    // do something else that can only be done after SomeFunction() is finished
}

private void SomeFunction()
{
    // do some elaborate $#@%#
}
...