Подтвердить что ты не робот

Какую самую неудовлетворительную программу вы должны были поддерживать?

Мне периодически призывают выполнять ремонтные работы на системе, которая была создана настоящим ракетологом. Там так много неправильно, что трудно понять, с чего начать.

Нет, подождите, я начну с самого начала: в начале проекта дизайнеру сказали, что системе нужно будет масштабировать, и он читал, что источником проблем с масштабируемостью является трафик между серверов приложений и баз данных, поэтому он старался минимизировать этот трафик. Как? Поместив всю логику приложения в хранимые процедуры SQL Server.

Серьезно. Основная часть приложения работает с интерфейсом HTML, который формирует XML-сообщения. Когда средний уровень получает XML-сообщение, он использует имя тега элемента документа как имя хранимой процедуры, которую он должен вызывать, и вызывает SP, передавая ему все XML-сообщение в качестве параметра. Требуется XML-сообщение, которое возвращается SP, и возвращает его обратно обратно в интерфейс. В уровне приложения нет другой логики.

(Для проверки входящих XML-сообщений в библиотеке схем был обнаружен некоторый код, но я удалил его, установив, что 1) только небольшая часть сообщений имела соответствующие схемы, 2) t фактически соответствуют этим схемам, и 3) после проверки сообщений, если были обнаружены какие-либо ошибки, метод отменил их. "Этот блок предохранителей - реальная экономия времени - он поставляется с factory с заранее установленными пенни!" )

Я видел программное обеспечение, которое раньше делало неправильное. Много. Я написал совсем немного. Но я никогда не видел ничего похожего на твердое намерение сделать не то, что нужно, в любой момент, воплотившийся в дизайне и программировании этой системы.

Ну, по крайней мере, он пошел с тем, что знал, да? Um. По-видимому, он знал, что "Доступ". И он действительно не понимал Access. Или базы данных.

Вот общий шаблон в этом коде:

SELECT @TestCodeID FROM TestCode WHERE TestCode = @TestCode

SELECT @CountryID FROM Country WHERE CountryAbbr = @CountryAbbr

SELECT Invoice.*, TestCode.*, Country.*
   FROM Invoice
   JOIN TestCode ON Invoice.TestCodeID = TestCode.ID
   JOIN Country ON Invoice.CountryID = Country.ID
   WHERE Invoice.TestCodeID = @TestCodeID AND Invoice.CountryID = @CountryID

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

-- Fix NULLs
SET @TargetValue = ISNULL(@TargetValue, -9999)

Да, этот код делает именно то, что вы не можете позволить себе поверить в это, чтобы вас не смутило. Если переменная содержит NULL, он предупреждает вызывающего абонента, изменяя его значение на -9999. Здесь, как обычно используется это число:

-- Get target value
EXEC ap_GetTargetValue @Param1, @Param2, OUTPUT @TargetValue
-- Check target value for NULL value
IF @TargetValue = -9999
    ...

На самом деле.

Для другого измерения этой системы см. статью на thedailywtf.com под названием Думаю, я позвоню им "Транзакции" . Я не делаю этого. Клянусь.

Мне часто вспоминают, когда я работаю над этой системой, Вольфганга Паули известный ответ ученику: "Это неправильно, это даже не так".

На самом деле это не самая худшая программа. Это определенно худший из тех, над которыми я работал в своей 30-летней карьере. Но я не видел всего. Что вы видели?

4b9b3361

Ответ 1

Я однажды попытался написать декодер MP3. Это не сработало.

Ответ 2

Я поддерживал ExtUtils::MakeMaker. MakeMaker, безусловно, не самый худший код, который мне пришлось поддерживать; это действительно инженерное чудо. Тем не менее, именно в этом уникальном классе ужасов кодирования, где наиболее критически важный код также является самым страшным.

MakeMaker является установщиком для большинства модулей Perl. Когда вы запускаете "Makefile.PL", вы вызываете MakeMaker. Если MakeMaker ломается, Perl ломается. Perl работает на всем, поэтому MakeMaker должен работать на все. Когда я говорю все, что я имею в виду ВСЕ. Каждый причудливый вариант Unix. Windows 95 вверх. И VMS. Да, VMS.

Что делает MakeMaker? Makefile.PL - это программа Perl, которая записывает Makefile, который содержит команды оболочки, которые часто запускают Perl, для сборки и установки модуля Perl. Позвольте мне повторить: он пишет команды оболочки для запуска Perl. Perl, язык, который заменяет скрипты оболочки.

О, он также может скомпилировать и связать C-код. И он также может статически связывать модули Perl с perl. О, и он может управлять проверками RCS. О, и перетащите tarballs вашего дистрибутива... и zip файлы. И делать все это, что смутно связано с установкой модулей.

И он должен сделать все это в переносном, обратном совместимости. Он должен иметь дело с вариантами и ошибками в...

  • make (GNU make, BSD make, nmake, dmake, mms, mmk, чтобы назвать несколько)
  • оболочки
  • Perl
  • Файловая система (если вы не думаете, что это важно, попробуйте VMS)
  • C компиляторы и компоновщики

Это абсолютно, положительно не может потерпеть неудачу и должно оставаться на 100% обратно совместимым.

О, и у него очень мало возможностей для реального API расширения, поэтому он должен оставаться совместимым с ad hoc файлами Makefile, которые люди должны сделать, чтобы расширить его.

Зачем все это? 15 лет назад, когда Perl работал только на Unix, это казалось отличной идеей. Зачем писать целую систему сборки, когда вы можете просто использовать make? Perl - язык обработки текстов; мы просто используем его для создания Makefile!

К счастью, есть замена Module::Build, и я возлагал надежды на то, что он быстро уничтожит MakeMaker. Но его поглощение было медленным, и сообщество очень устойчиво к изменениям, поэтому я застрял в поддержке MakeMaker.

Ответ 3

Какая самая неудовлетворительная программа, которую вы должны поддерживать?

Все, что я когда-либо писал!

Серьезно. Чем больше я читаю блоги, слушаю подкасты и следую за такими сайтами, тем больше я учусь каждый день. И каждый день я в основном понимаю, что все, что я написал вчера, ошибочно. Я чувствую к бедным сокам, которые сохраняют то, что я написал в начале своей карьеры.

Ответ 4

Я только что начал.

  • Нет контроля источника.
  • Все источники редактируются в прямом эфире. Чтобы прекратить ошибки, есть резервные файлы, такие как db-access.php.070821, засоряющие исходное дерево.
  • Код исключительно хрупкий - очень мало на пути проверки ошибок и абсолютно не отпадает, если он это делает.

Ответ 5

Я когда-то должен был сохранить устаревшее приложение C, которое ранее было написано и поддерживалось некоторыми программистами, которые потеряли желание программировать (и, возможно, жить). Было слишком много WTF, но я помню логическую функцию, которая в различных особых случаях возвращала TRUE + 1, TRUE + 2 и т.д.

Затем я прочитал эссе Roedy Green и много рассмеялся, пока не понял, что причина, по которой мне показалось смешной, это то, что я узнал большую часть примеры из кода, который я поддерживал. (Это эссе стало немного раздутым в течение многих лет дополнений, но это все еще стоит посмотреть.)

Ответ 6

Я был программистом COBOL (дрожь). Весь наш код попал в категорию "необоснованные". В COBOL у вас нет пространств имен, все переменные глобальны, и существует много обязательного дублирования имен файлов и других ресурсов. Чтобы вызвать процедуру, вы устанавливаете глобальные переменные, вызываете процедуру, а затем проверяете содержимое этих глобальных переменных (или других, которые могут быть установлены).

Хуже всего было поддерживать программу COBOL, написанную до моего рождения (я родился в 1967 году), а ее эксклюзивным методом контроля потока был GOTO. Это был абсолютный беспорядок и невозможно было следовать. Незначительные изменения типа переменной могут занять несколько дней. Автоматических тестов не проводилось, а ручные тестовые планы никогда не сохранялись, поэтому для каждого изменения требовалось выписать новый план ручного тестирования, затем исчерпывающе включить и включить код.

По иронии судьбы, это то, что делает COBOL настолько успешным. COBOL часто выполняется языком управления заданиями (JCL). Поскольку COBOL настолько слаб, программы не делают много, поэтому JCL будет выделять некоторое дисковое пространство (часто до уровня цилиндров) и выполнять небольшую программу COBOL для чтения данных, а затем выписывать только нужные вам данные. Затем JCL может вызвать программу сортировки для сортировки полученного файла. Затем будет вызываться другая программа COBOL для чтения отсортированного файла и суммирования данных и, возможно, повторного извлечения необходимых результатов. И, возможно, JCL снова будет использоваться для перемещения файла в другом месте, и еще одна программа COBOL будет вызвана, чтобы читать результаты и хранить их в базе данных и так далее. Каждая программа COBOL имела тенденцию делать только одно дело, и была создана примитивная версия модели конвейера Unix - все потому, что COBOL слишком сложно поддерживать или делать что-то сложное. У нас была свободная связь и плотное сцепление (между программами, а не в них), потому что было практически невозможно писать COBOL любым другим способом.

Ответ 7

Прямо из школы градиента в Lucent мне предоставили компилятор и интерпретатор для поддержки, написанный в PL/I. Скомпилированный язык описывает сложный набор ограничений целостности, и интерпретатор управляет этими ограничениями в отношении большого набора данных, который впоследствии будет сформирован в исходную базу данных, управляющую переключателем 4ESS. 4ESS был и остается коммутатором для передачи голосового трафика на большие расстояния.

Код был беспорядочным. Был ярлык для ветки, называемый "NORTH40". Я спросил оригинального разработчика, что это значит.

"Что, если проверки диапазона выполняются, вы знаете, проверки, чтобы убедиться, что каждое поле имеет правильное значение."

"Но почему" NORTH40 "?"

"Знаешь," Домой, домой на дальности ".

"А?"

Оказалось, что "NORTH40" означало ферму на севере в 40 гектаров, которая в его разведенном в городе умом имела неясную связь с ранчо крупного рогатого скота.

В другом модуле имелись две параллельные массивы TORY и DIREC, которые были обновлены параллельно и, следовательно, были явно ошибочной попыткой моделировать один массив, содержащий пары данных. Я не мог понять имена и спросил разработчика. Оказалось, что они предназначены для чтения вместе: "директри". Отлично.

Бедные ребята, которым приходилось писать ограничения целостности, не имели руководства для руководства, а просто устные традиции и рукописные заметки. Хуже того, компилятор не проводил проверку синтаксиса, и очень часто они заканчивали указывать ограничение, которое тихо отображалось в неправильной логике, часто с очень плохими последствиями.

Хуже должно было прийти. Когда я углубился в недра переводчика, я обнаружил, что он был построен вокруг процесса гигантского сортирования. Перед сортировкой был входной процесс, который генерировал входные данные сортировки из необработанных данных и ограничений целостности. Поэтому, если в нем есть таблица с 5000 определениями соединительных линий, и каждая запись транков имела три значения полей, которые должны были быть уникальными во всем наборе входных данных, процесс ввода создавал 3 * 5 000 = 15 000 записей ввода сортировки, каждый из которых был необработанным запись данных с префиксом номера ограничения целостности и копию значения поля, подлежащего сортировке. Вместо того, чтобы делать три 5000 записей, он сделал один 15 000 записей. К тому времени, когда вы учитывали сотни ограничений целостности внутри и между таблицами и некоторые очень большие таблицы, у вас был комбинаторный кошмар.

Мне удалось немного реорганизовать документ, задокументировать язык и добавить проверку синтаксиса с понятными сообщениями об ошибках, но через несколько месяцев перешел на передачу в новую группу.

Ответ 8

Я поддерживаю веб-приложение планирования, которое мы используем в нашей интрасети. Когда меня спросили, могу ли я удалить агента из планировщика, подумал я, конечно, почему бы и нет. Когда я взглянул на исходный код, я понял, что каждый час этого дня агента кодируется отдельно. Так было каждый день его недели. И так было каждую неделю каждого агента этого региона. Так было и в каждом регионе из 5 регионов. Html fies, которые содержат asp-код повсюду.

Однажды мне потребовалось некоторое время, чтобы угадать, сколько строк кода находится в этих разных файлах, и я оценил около 300000. Триста тысяч строк кода, которые были однажды написаны от руки, а затем скопировали и вставляли код.

Но это число очень быстро убедило моего менеджера, что нам потребуется новое приложение для планирования очень быстро.

Ответ 9

Управляемая PHP/MySQL система управления контактами, в которой таблица контактов не имеет естественного ключа. Было множество экземпляров полей базы данных, содержащих составные данные, в виде строки с разделителями, которая впоследствии должна анализироваться кодом приложения.

HTML и логика были переплетены, почти никакие функции не использовались, но скорее код был вырезан и вставлен в десятки файлов исходного кода. Данные не подвергались дезинфекции и поэтому поля с (например) встроенными вертикальными вкладками приводили к тому, что XML, возвращаемый вызовами Ajax, был неисправен, и, прежде всего, файлы с десятками, если не сотни пустых операторов, состоящих из закрывающих фигурных скобок, за которыми немедленно следуют полуколоны: "};"

Ответ 10

Я когда-то работал над CAD-приложением, написанным на BASIC, где политика компании заключалась в том, что каждая программа должна начинаться с утверждения:

ВКЛ. ОШИБКА

Jmm

Ответ 11

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

Каждая функция копируется и вставляется в каждую страницу ASP. Таким образом, никакие функции не определены или что-то еще... Каждый день я искалечен их средами, потому что у меня есть сначала удаленный сервер, чтобы обойти DMZ. После этого я должен удалиться на производственный сервер, где мне нужно внести изменения.

Ответ 12

Однажды меня вызвали, чтобы помочь отслеживать периодический сбой в читателе EDIF. Почти сразу я начал получать головную боль. Оригинальный автор, казалось, чувствовал, что Yacc собирался оштрафовать его за пробел, а его грамматика Yacc была плотным, нечитаемым беспорядком. Я потратил пару часов на его форматирование, добавив правила для отсутствия терминалов, когда они появились, структурируя объявления, чтобы избежать роста стека, и вуаля, авария была потушена.

Так что помните, что каждый раз, когда вы ждете, пока Yacc обрабатывает вашу грамматику, будут тысячи запусков с созданным парсером. Не стоит дешево с пробелами!

Ответ 13

Все, что я когда-либо писал, изначально предполагалось, что это быстрый прототип, и заканчивается на некоторое время. Моя проблемная область требует очень много прототипов по своей природе. Для этих прототипов иногда разумно нарушать все лучшие практики и правила хорошего стиля, просто сделайте это и очистите позже, если прототип окажется достойным. Однако иногда эти прототипы в конечном итоге очень трудны для правильной работы, но в конечном итоге становятся хранителями. В этих случаях я обычно в конечном итоге откладываю рефакторинг/переписывание вещи на неопределенный срок, потому что, боюсь, я больше никогда не буду работать. Дальнейшее уменьшение моей мотивации заключается в том, что мой босс является экспертом в области, который вообще не программирует.

Ответ 14

Интерпретатор для языка обработки геометрии CAD/CAM (P1 = 10,10; P2 = 20,20; L1 = P1, P2; - такого рода), написанный в Microsoft BASIC Professional Development System (PDS), с именами переменных минимальной длины (быстро закончились отдельные буквы, поэтому переместились на двойные буквы. PP, PQ, PR, кто-нибудь?). И, честно говоря, некоторые комментарии. На итальянском языке.

Как ни странно, это действительно сработало, и я смог добавить к нему некоторые функции, но это было похоже на любительскую стоматологию - больно и, конечно же, не рекомендуется...