Rube Goldberg software design [закрыто]

кто-нибудь видел Руба Голдберга дизайн программного обеспечения? В основном, сложный дизайн для простых продуктов.

пожалуйста, поделитесь своими историями.

13 ответов


Это то, что я слышал от коллеги. По-видимому, он нашел веб-приложение, которое делает что-то подобное для проверки текстового поля javascript на стороне клиента:

  1. Javascript создает строку для представления текстового поля на стороне клиента.
  2. посылает строку на веб-сервер.
  3. веб-сервер использует отражение для восстановления текстового поля на сервере из переданной строки.
  4. веб-сервер проверяет, имеет ли текстовое поле значение.
  5. возвращает результат клиенту.
  6. клиент отображает сообщение.
  7. во время выполнения веб-сервером проверки клиент отображает индикатор выполнения.

реализация индикатора выполнения хороша для другого поста. :)


ежедневный WTF вы источник для более Rube Goldberg программного обеспечения, которое вы могли бы, возможно, хотели бы прочитать о: P.


один из наших младших программистов однажды написал то, что должно было быть простым текстовым полем AJAX-ified auto-suggest для поиска учетных записей пользователей в одном из наших приложений.

Это был его процесс:

  1. Run SELECT * FROM Users на базе
  2. верните полные результаты в GetAllUsers() веб-службы метод
  3. цикл через результаты XML в Javascript, чтобы найти имена, соответствующие символам, набранным до сих пор, и добавить их в массив
  4. цикл через массив, чтобы создать раскрывающийся список auto-suggest
  5. повторите весь процесс для следующего введенного письма...

это на самом деле сработало довольно хорошо, когда он протестировал его с 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.


может быть, лучше искать ответы на этот вопрос в ежедневный WTF :)


похоже, что каждое преобразование данных, которое я сделал из базы данных 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. Лучший пример, который я видел, - это простая проблема и слишком много "корпоративного" кода вокруг нее.