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

Иногда я страдаю от синдрома «изобретено не здесь». Когда это произойдет, я не остановлюсь и мне придется заново изобретать велосипед. Пока я не замечу, что это слишком много работы, или пока не оправлюсь от синдрома, я с радостью буду кодировать всю ночь.

Однажды все вышло из-под контроля, и я дважды заразился синдромом НИЗ. Да, дважды. У меня была потрясающая идея запрограммировать демона, который будет проверять, работают ли мои серверы и есть ли подключение к Интернету. Я подумал, что довольно просто, просто отправьте несколько UDP-пакетов, дождитесь результата и готово. Вариант использования звучит знакомо? Для каждого системного администратора это, вероятно, будет. Но вместо того, чтобы использовать одно из доступных решений, я подумал: «Эх, я сам напишу код. У меня есть только один вариант использования, это будет легко».

Итак, я начал кодировать. И я закодировал. И я провел рефакторинг. И я снова вспомнил, как делать socket dance на C, забыл, что такое UDP вообще и снова занялся socket dance. (Да, я забыл, как сделать UDP в C). Я не забыл о безопасности. Я дал обещание, разветвился и отказался от привилегий демонов. Теперь он мог отправлять и получать сердцебиения. Я назвал ответы сердцебиением, потому что это хорошее имя, и никто никогда не использовал его раньше для такого рода услуг. Алгоритм разницы во времени ответов прост, проблем нет. Внезапно меня снова поразил синдром NIH. Если у меня есть список из 1000 IP-адресов серверов (у меня нет 1000 серверов), и мне нужно перебрать список, чтобы найти нужный сервер, проверить его время и вычислить дельту, это означает, что в худшем случае я должен проверить 1000 записей в этом списке! Ни за что. Никогда. Это намногослишком медленно! Мне нужна хэш-карта для этого. Я должен реализовать свою собственную хэш-карту. Это просто хэш-карта, ничего особенного. О, Боже.

Новый репозиторий, новое причудливое имя: smap (простая хэш-карта). Я вспомнил, как разрабатываются хэш-карты, и начал программировать. Оказывается, это на самом деле не так уж и сложно. После некоторого чтения о широко используемых хэш-картах я заметил, что просто забыл о перехешировании, перераспределении, коллизиях и обо всем остальном, что делает хорошую хэш-карту. Но это работает. Я проверил наличие утечек памяти с помощью Valgrind, посмотрел на промахи кеша (а почему бы и нет) и был вполне доволен результатом. Пару дней спустя я поговорил со своим коллегой об этой супер простой хэш-карте, в которой не может быть коллизий, потому что каждый IP-адрес уникален. Он сказал мне, что это предположение верно только в том случае, если DHCP-сервер хороший, правильный и я не получаю никаких поддельных сообщений. Хотя я применил методы предотвращения подделки сердцебиений, он все еще прав. Я должен был использовать широко распространенную хэш-карту или просто остаться со связанным списком. У меня максимум пять серверов. Я должен был остаться со связанным списком.

Тем не менее синдром NIH прошел. Я так и не закончил работу над сервером, и хэш-карта не попала в него. Я (пере)изучил, как использовать UDP, как предотвратить подделку сообщений и как реализовать дерьмовую хэш-карту.

Чтобы вам было над чем посмеяться: smap (отсутствуют функции совместимости для работы в Linux)

Я все еще наслаждался этим, и я уверен, что это произойдет снова в недалеком будущем.