Ответ 1
Синхронизация потоков и блокировка мертвой точки.
Недавно я попытался объяснить плохо разработанный код моему менеджеру проекта. Все классы менеджера - это синглтоны ( "и поэтому я не могу легко изменить это" ), и в коде используется диспетчеризация событий везде, где хватило бы вызова функции ( "и почему его так сложно отлаживать" ). К сожалению, это просто появилось как неуклюжий беспорядок английского языка.
Самое сложное, что вам пришлось передать нетехническому человеку в качестве программиста? Вы нашли какие-либо аналоги или способы объяснения, которые стали более ясными?
Синхронизация потоков и блокировка мертвой точки.
Проводите время по дизайну и тратите время на рефакторинг.
Рефакторинг не создает никакой видимой на клиенте работы, что делает работу с ней труднее всего оправдывать.
В качестве второй проблемы, "не видимой на клиенте", модульного тестирования.
Меня спросили, как работает интернет - я ответил "SYN, ACK, ACK". Продолжайте забывать это SYN, SYN-ACK, ACK..
(источник: inetdaemon.com)
Мой самый трудный вопрос начался невинно: моя подруга спросила, как текст отображается в Firefox. Я просто ответил на что-то вроде "движка рендеринга", Gecko, HTML-парсер, "бла-бла-бла".
Затем он пошел вниз. "Хорошо, как Гекко знает, что показывать тогда?"
Он резко перешел оттуда к графическим драйверам, операционной системе, компиляторам, аппаратным архитектурам и исходным 1 и 0. Я не только осознал, что есть значительные пробелы в моем собственном знании иерархии слоев, но и как, в конце концов, я оставил ее (и меня!) Более смущенной, чем когда я начал.
Я должен был сначала ответить "черепахи до конца" и застрять в этом.: P
У меня был интересный пример, объясняющий, почему программа не вела себя так, как ожидалось, когда некоторые записи в базе данных имели пустые строки, а некоторые были NULL. Я думаю, что их голова только что взорвалась, когда я сказал им, что пустая строка - это всего лишь строка с 0 байтами, а NULL означает неизвестное значение, и поэтому вы не можете сравнить ее ни с чем.
После этого у меня была одна неприятная головная боль.
1.) SQL: Мышление в наборах, а не процедурно (это достаточно сложно для нас, программистов, чтобы понять!).
2.)... и вот отличный пример демистификации технических концепций:
Множество утверждений, начинающихся с "It because in Oracle, ..."
, приходят мне в голову.
Самые большие препятствия - это "технологический долг", особенно о том, как архитектура была правильной для этой версии, но ее необходимо изменить для следующей версии. Это похоже на проблему объяснения "прототип против производства" и "версия 1.0 в сравнении с версией 2.0".
Худшая ошибка, которую я когда-либо делал, - это сделать макет UI в NeXT-шагах UI Builder. Он выглядел точно так же, как будет выглядеть конечный продукт и какое-то поведение. Попытка объяснить, что осталось 6 месяцев работы, оставшихся после этого очень.
Почему код такой плохой:
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 $#@%#
}
"Добавление нового программиста в месяц к этой поздней задаче заставит его отправиться позже. Ничего, прочитайте эту книгу". ( "Мифический человек-месяц" ). Менеджеры все еще не совсем поняли.
Важность модульных тестов.
Концепция рекурсии - некоторым людям это очень сложно.
Мне иногда очень сложно объяснять концепцию ковариации/контравариантности и проблемы, связанные с ними с другими программистами.
Убедив друга, что приложение Facebook, которое я разработал, действительно не хранит ее личные данные (например, имя), даже несмотря на то, что все еще отображает его.
Почему для запуска этого приложения потребуется еще четыре недели. В конце концов, это займет всего неделю, чтобы сделать быстрый прототип. Он "работает" (или, по крайней мере, выглядит так, как есть), поэтому я должен быть в значительной степени закончен, не так ли?
Объяснения, которые включают безопасность, качество кода (ремонтопригодность), нормализованные схемы БД, тестирование и т.д., обычно отрываются как список абстракций, которые не имеют никакого видимого эффекта для приложения, поэтому трудно объяснить, что они на самом деле вносить вклад в проект и почему они необходимы. Иногда аналогии могут занять вас до сих пор.
C указатели
* я
& я
Предотвращение блокировки мертвой точки в многопоточной среде.
Я очистил путаницу, объяснив это визуально на белой доске, вычеркнув две параллельные линии и показывая, что происходит, когда достигаются одни и те же точки одновременно.
Также ролевая игра двух потоков с человеком, которого я объяснял, и используя физические объекты (книгу, кружку кофе и т.д.), чтобы показать, что происходит, когда мы оба пытаемся использовать что-то сразу.
На самом деле нет правильного или неправильного ответа для этого... все это переживает.
Самая сложная вещь, которую я должен был объяснить нетехническому человеку, - это то, почему он не мог добраться до своего веб-сайта во время поездок за границу, но его член семьи, который жил там (с совершенно другим провайдером), мог добраться до него. Так или иначе, "Fail in Finland" был недостаточно хорош.
Самые сложные концепции, объясняющие людей, которых я назвал бы программистам, в отличие от разработчиков, являются одними из самых основных парадигм объектно-ориентированного дизайна. В частности, абстракция, инкапсуляция и король, полиморфизм и способы их правильного использования.
Расширение этого уровня сложности объясняет, что такое инверсия управления и почему это абсолютная необходимость, а не только лишние слои кода, которые ничего не делают.
Я собирался прокомментировать сообщение Микаэля, что некоторые люди просто берут последовательное программирование и, к сожалению, просто остаются с этим.
Но это действительно означает: два серьезно трудно объяснить понятия:
Попытка объяснить, почему код был выполнен последовательно. По-видимому, это совсем не интуитивно для некоторых не-программистов (т.е. Моя подруга).
Почему вы не нуждаетесь в правильной обработке индексов символов в большинстве случаев, когда вы используете строки UTF-8.
Трудно объяснить, почему в большинстве программ есть ошибки. Многие нетехнические люди понятия не имеют, насколько сложным является программное обеспечение, и насколько легко игнорировать неожиданные условия. Они думают, что мы просто слишком ленивы, чтобы исправить вещи, которые, как мы знаем, сломаны.
В мире существует 10 разных типов людей.
Люди, которые понимают Двоичные и людей, которые не...
Говоря прямо, почему развитие - это самая сложная концепция, когда-либо подвергавшаяся человеческому виду. Не связан с каким-либо языком программирования, но в целом. И нет, я не пытаюсь обеспечить себя или вас импульсом эго, единственными реальными ограничениями в этой области являются ваш ум.
Почему? Мы не работаем с константами, и нет границ, единственная причина, по которой ИИ, который мыслит как человек, еще не существует, обусловлен нашими собственными ограничениями. Все остальные аспекты должны придерживаться какого-то закона, развитие не заботится о законах физики или каком-либо законе в этом отношении, следовательно, термин развитие... эволюция.