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