Rube Goldberg software design [закрыто]
кто-нибудь видел Руба Голдберга дизайн программного обеспечения? В основном, сложный дизайн для простых продуктов.
пожалуйста, поделитесь своими историями.
13 ответов
Это то, что я слышал от коллеги. По-видимому, он нашел веб-приложение, которое делает что-то подобное для проверки текстового поля javascript на стороне клиента:
- Javascript создает строку для представления текстового поля на стороне клиента.
- посылает строку на веб-сервер.
- веб-сервер использует отражение для восстановления текстового поля на сервере из переданной строки.
- веб-сервер проверяет, имеет ли текстовое поле значение.
- возвращает результат клиенту.
- клиент отображает сообщение.
- во время выполнения веб-сервером проверки клиент отображает индикатор выполнения.
реализация индикатора выполнения хороша для другого поста. :)
ежедневный WTF вы источник для более Rube Goldberg программного обеспечения, которое вы могли бы, возможно, хотели бы прочитать о: P.
один из наших младших программистов однажды написал то, что должно было быть простым текстовым полем AJAX-ified auto-suggest для поиска учетных записей пользователей в одном из наших приложений.
Это был его процесс:
- Run
SELECT * FROM Users
на базе - верните полные результаты в
GetAllUsers()
веб-службы метод - цикл через результаты XML в Javascript, чтобы найти имена, соответствующие символам, набранным до сих пор, и добавить их в массив
- цикл через массив, чтобы создать раскрывающийся список auto-suggest
- повторите весь процесс для следующего введенного письма...
это на самом деле сработало довольно хорошо, когда он протестировал его с 10 образцами пользователей, но довел систему до визга при запуске против полного набора тестов 3000 пользователей.
поскольку устройство Даффа было популярно здесь сегодня, я думаю, что это уместно, поскольку сложный код делает что-то простое:
dsend(to, from, count)
char *to, *from;
int count;
{
int n = (count + 7) / 8;
switch (count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}
}
обратите внимание, что это на самом деле супер эффективно, по сравнению с:
do { /* count > 0 assumed */
*to = *from++; /* Note that the ''to'' pointer is NOT incremented */
} while (--count > 0);
однако, отвесная элегантность в зависимости от fallthrough переключателя C делает его Rube достойным.
Я не видел их в производстве, но я получил удовольствие от просмотра Hello World с шаблонами дизайна на следующем сайте:
http://www.phppatterns.com/docs/design/hello_world_in_patterns
когда я был в известной антивирусной компании и компании программного обеспечения удаленного доступа, сотрудник, который по какой-то причине считался некоторыми менеджерами низкого уровня действительно отличным, писал всевозможные сложные вещи. Я боялся работать над его кодом. Многое из этого было излишним. В конце концов, мне пришлось поболтать с ним, когда я обнаружил, что он представил MFC в ранее свободную от mfc библиотеку (мы пытались сохранить это дерьмо из нашего кода). Он явно нуждался в нем для струн и коллекции. Я показал ему stl. Он был очень увлечен этим и, казалось, действительно принимал мои предложения близко к сердцу. Позже, когда я снова посмотрел на код, я увидел, что он реализовал коллекции MFC и обернул STL своими собственными интерфейсами, чтобы они выглядели как коллекции mfc. Круто. просто вау.
другой совершенно бесполезный разработчик в той же компании, по-видимому, не любил использовать наследование в C++ - несмотря на то, что он копировал страницы из " эффективного C++", чтобы дать в качестве тестов потенциальным нанимателям. Во всяком случае, во время обзора кода один из людей, которые сообщили мне, спросил, почему Пит использовал #ifdefs в своем коде повсюду. Его проект будет компилироваться 4 раза, и каждый раз он будет определять другое ключевое слово. Условный код был для определенного поведения, а весь другой код был для аналогичной функциональности. Я сдулся. И этот парень тоже считался золотым мальчиком. Он в одиночку вызвал повторный выпуск продукта, потому что он оставил отладку messagebox в процессе службы win32-эффективно висит служба, потому что он отказался узнать, как использовать отладчик исходного уровня-но это другая история.
99 бутылок пива также имеет много примеров. Например,расширенный, расширяемый пивной / настенный каркас. Что, забавно, написано на python, а не на Java.
похоже, что каждое преобразование данных, которое я сделал из базы данных Filemaker Pro, заставляет меня думать, что база данных была разработана самим Рубом.
давайте посмотрим... Все поля имеют длину 256 символов. Названия компаний, используемые в качестве первичных ключей (подождите! не меняй имя...) Де-нормализованная структура базы данных (payment1date, payment2date ... payment256date).
(Не то, что я dissing Filemaker Pro. Просто это позволяет не-программистам создавать базы данных, которые в конечном итоге нуждаются для преобразования в другое приложение.)
представьте себе файл конфигурации, который выглядит следующим образом:
<param name="foo">
<name>p1</name>
<name>p2</name>
<param name="bar">
<name>q1</name>
<name>q2</name>
<name>q3</name>
<param name="foobar">
<name>q1</name>
<name>q2</name>
<name>q3</name>
<parame name="barfoo">
....
</param>
</param>
</param>
</param>
и парсер, который выглядит так
int i = 0;
while (n.hasChild("param"))
{
if (n.name()=="param")
{
process new node n
i++
else{
//add child
}
}
в случае, если вам интересно, "я" используется позже, чтобы выяснить, сколько параметров у вас. И это очень чистить код.
не очень долго, но все равно смешно. Чтобы очистить StringBuilder
:
If sb.Length > 0 Then
sb.Remove(0, sb.Length)
End If
однажды я унаследовал приложение, которое обрабатывало файлы конфигурации в стиле rubegoldbergian. Конфигурация была простой текстовый XML-файл, с ключами и значениями, полностью читаемый. При запуске приложение откроет XML-файл, переберет все пары ключ / значение, зашифрует ключ и значение каждого, создаст хэш зашифрованного ключа и добавит зашифрованную пару ключ/значение в статическую хэш-таблицу.
функция для чтения установки приняла обычный ключ строку и возвратил обычное строковое значение, поэтому он должен был зашифровать ключ, хэш и хэш, чтобы найти пару ключ/значение в хэш-таблице, а затем расшифровать и вернуть значение.
мы называли это шифрование в памяти. Я до сих пор не знаю, какие мыслительные процессы привели к его созданию, но я подумал о мышеловке, как только увидел ее.
нашел это в stackoverflow, Enterprise FizzBuzz. Лучший пример, который я видел, - это простая проблема и слишком много "корпоративного" кода вокруг нее.