Мне бы хотелось услышать, какие дизайнерские решения вы приняли и как они дали обратный эффект. Из-за плохого дизайнерского решения я вынужден был всегда поддерживать это плохое решение (я тоже участвовал в нем). Это заставило меня понять, что одна ошибка дизайна может преследовать вас вечно. Я хочу узнать от более опытных людей, какие грубые ошибки они испытали и чему они научились у них.
Я уверен, что это очень поможет другим программистам, помогая им не повторять эти решения.
Спасибо за обмен вашего опыта.
Ответы:
Игнорируя ЯГНИ , снова и снова ...
источник
«Сделаем это позже»
«Позже» никогда не наступит.
источник
C ++, ромбовидное множественное виртуальное наследование . Вы поняли идею.
источник
Конфигурируемость в приложении хорошая. Слишком большая конфигурируемость - это кошмар для использования и обслуживания.
источник
От одной из моих ошибок я узнал, что нормализация БД не должна проводиться вслепую. Вы можете, и в некоторых ситуациях вы ДОЛЖНЫ сгладить ваши столы.
Я закончил тем, что управлял загрузками таблиц (через модели), и производительность была не так хороша, как могла бы быть с небольшим выравниванием для таблиц.
источник
Использование одного char в базах данных для статусов и т. Д. Нет никакого смысла в этом, издержки использования более длинных char () или nvarchar2 () незначительны по сравнению с сетью и синтаксическим анализом, возникающим при любом вызове SQL, однако символы всегда заканчиваются довольно запутанный или истощающийся (не для статусов, а для других вещей). Гораздо лучше просто добавить версию, удобную для чтения человеком, а также иметь в вашей модели Java (в моем случае) перечисление с соответствующими значениями.
Я предполагаю, что это форма преждевременной ненужной и слепой оптимизации. Как будто использование одного символа спасет мир в наши дни. Помимо булевых значений Y / N в базах данных, которые не поддерживают логические значения / биты.
источник
Не разрабатывать надлежащий уровень доступа к данным и иметь sql везде в моем коде, просто чтобы что-то «быстро» заработало и заработало. Позже, когда проект начал расширяться, а требования изменились, это стало кошмаром. Я не знал, что такое DAL в то время.
... рад, что я прошел через это, хотя я все еще вижу программистов с более чем 20-летним опытом работы.
источник
Думаю, я могу быть архитектором, разработчиком и премьер-министром в одном проекте.
2 месяца сна по 3 часа в сутки научили меня, что ты просто не можешь этого сделать.
источник
Выбор Microsoft Foundation Classes (MFC) для написания Java IDE.
источник
Это было не мое решение (я присоединился к компании несколько позже), но где-то, где я работал, я слишком далеко зашел, включая перевод всех их сообщений журнала.
Результаты:
К сожалению.
источник
Изобретая Колесо
источник
Делать слишком много дизайна . Создание множества диаграмм UML, в частности диаграмм последовательности для каждой отдельной операции, большая часть которых в итоге оказалась бесполезной. В конце концов оказалось, что можно сэкономить значительное количество времени, пропустив излишне подробный дизайн / схемы и непосредственно начав кодирование.
источник
Верующие клиенты знают, чего они хотят, а затем делают слишком много, прежде чем сверяться с ними.
источник
Мое единственное худшее дизайнерское решение? Еще в 1980-х годах я работал над проектом, в котором у нас появилась блестящая идея создать своего рода шаблон для наших экранов ввода данных, который будет интерпретироваться во время выполнения. Неплохое решение: оно облегчает проектирование экранов ввода. По сути, просто создайте файл, похожий на экран ввода данных, с некоторыми специальными кодами, чтобы идентифицировать, что было меткой, а не тем, что было полем ввода, и определить, были ли поля ввода буквенными или числовыми. Затем я решил добавить еще несколько специальных кодов в эти файлы, чтобы определить, какие проверки должны быть выполнены. Затем я добавил больше кодов, чтобы разрешить условное построение экрана, поле X включалось только тогда, когда некоторые условия выполнялись, и т. Д. Затем я добавил больше кодов, чтобы выполнить простую обработку входных данных. И т. Д. В конце концов мы превратили наш экранный шаблон в новый язык программирования с выражениями, управляющими структурами и библиотекой ввода / вывода. А для чего? Мы проделали большую работу, чтобы заново изобрести Фортран. У нас была полка компиляторов для языков, которые были лучше разработаны и лучше протестированы. Если бы мы посвятили столько усилий созданию продуктов, в которых у нас действительно был некоторый опыт, эта компания могла бы по-прежнему существовать сегодня.
источник
Чрезмерное применение YAGNI (которое называется « Проектирование путем перечисления в ловушках объектно-ориентированной разработки» ) в среде, где любой разумный человек может сказать, что требования определенно изменятся. И меняются неоднократно.
Если вы (жестко) закодировали все точно в соответствии с текущими требованиями - в то же время избивая любого, кто говорит: «Разве это не может быть более общим?» с вашим молотком YAGNI - и тогда требования резко изменятся (но таким образом, который можно было бы разумно предвидеть), тогда это может быть разницей между 2-недельной адаптацией и 20-минутной.
ОБНОВЛЕНИЕ: Чтобы уточнить, вот вымышленный пример, который не слишком далек от того, что произошло. Переполнение стека было разработано для поддержки значков, но предположим, что сначала они могли думать только о четырех значках. Их всего четыре, такое небольшое количество, поэтому они жестко закодировали поддержку ровно четырех значков во всей логике сайта. В базе данных, в пользовательской информации, во всем коде дисплея. Потому что "Я не буду нуждаться" в каких-либо значках, о которых ты не можешь думать, верно? Предположим, что сайт начинает работать, и люди начинают предлагать новые значки. Каждый значокна добавление уходит до двух недель, потому что повсюду столько жестких настроек. Но все же «Я не буду нуждаться» в большем количестве значков, чем в сегодняшнем списке, поэтому никогда не будет никакого рефакторинга для поддержки общего набора значков. Разве такая общая коллекция заняла бы больше времени заранее? Не много, если есть.
YAGNI - ценный принцип, но его не следует использовать для оправдания плохого дизайна и неправильного кодирования. Там есть баланс, и с опытом, я думаю, я приближаюсь к нему.
источник
Некомпетентные человеческие ресурсы
Попытка сделать что-то правильное и отличное с неправильными людьми
Даже если они выступают в роли избыточного эго-менеджера (что довольно часто встречается, особенно в крупных фирмах, где их некомпетентность может продолжаться дольше).
источник
Каждый раз, когда я создаю технический долг, пишу процедурный код, пропускаю написание тестов и т. Д., Потому что я тороплюсь. Почти неизбежно я нахожу, что это причиняет мне боль в будущем.
источник
Использование служб интеграции SQL Server (SSIS).
Я не желаю этого моему злейшему врагу.
После создания нескольких пакетов служб SSIS за последние два месяца я узнал, что разработанные мной пакеты не распространяются и не могут быть развернуты. В частности, в не-веб-среде, а не в лицензированной среде SQL Server.
Это очень плохая ситуация, когда у вас меньше 48 часов, чтобы переписать свои пакеты служб SSIS в чистом коде .NET POCO или пропустить установленный срок.
Меня удивляет, что я смог переписать три пакета служб SSIS (на тестирование и разработку которых у меня ушло два месяца) в течение 12 часов в чистом коде .NET с помощью адаптеров OLEDB и адаптеров SQL.
Служба SSIS не распространяется и не будет запускать пакеты с клиентского компьютера, если на нем не установлена лицензия SQL Server (в частности, DTSPipeline.dll). Это было бы здорово знать заранее. Теперь я вижу отказ от ответственности (мелким шрифтом) на MSDN. Это бесполезно, когда у вас есть пример кода по всему Интернету, использующий машинный код SQL-LICENSED. По сути, вам нужно создать веб-сервис, который будет взаимодействовать с вашим сервером SQL, чтобы программно запускать ваши пакеты служб SSIS. Вы не можете выполнить их из чистого кода .NET, если на исполняющей машине не установлена лицензия SQL. Насколько это нереально? Действительно ли Microsoft ожидает, что SSIS будет использоваться с компьютеров, на которых требуется установка SQL-сервера? Какая полная трата двух месяцев.
Моя компания никогда больше не будет использовать SSIS из-за этой маленькой надписи.
источник
Не определить механизм / модель развертывания как можно раньше.
источник
Добавив несколько «забавных» пасхальных яиц в код, который я написал, перед тем, как отправиться в отпуск на 2 недели. Я думал, что буду единственным человеком, который прочтет это, когда вернется, это заставит меня посмеяться и быть готовым перекодировать это.
Само собой разумеется, мой начальник не был впечатлен, когда он рассмотрел это, в то время как я отсутствовал, и он был еще менее впечатлен, когда одно из «пасхальных яиц» затрагивало его лицо, забавно изображенное в ASCII.
Mmmmmm ...
источник
Использование ASP.Net Themes, когда обычная старая CSS-папка работала бы хорошо.
источник
Быстрый путь к тому, чтобы заставить некоторый код работать, а не правильный путь (немного общий, но мы назовем это абстракцией и, следовательно, «правильным» ответом).
источник
У моей компании есть модель развития, похожая на водопад, где наши бизнес-пользователи и бизнес-аналитики будут определять требования к проектам. В одном из наших «больших» проектов мы получили набор требований, и я заметил, что ряд требований содержал детали реализации , в частности информацию, касающуюся схемы нашей базы данных, используемой нашей системой учета.
Я прокомментировал бизнес-пользователям, что реализация - это мой домен, он не должен содержаться в требованиях. Они не хотели менять свои требования, потому что, в конце концов, они ДЕЛА, а для бухгалтеров имеет смысл разрабатывать бухгалтерские программы. Как скромный разработчик, который слишком далеко опущен в тотемный опрос, мне платят , а не думают . Как бы я ни боролся с этим, я не мог убедить их переписать требования - слишком много бумажной работы и волокиты вокруг изменений, что просто слишком хлопотно.
Итак, я дал им то, что они просили. По крайней мере, это работает , но база данных странно разработана:
Много ненужной нормализации. Одна запись, содержащая 5 или 10 полей, разбивается на 3 или 4 таблицы. Я могу с этим справиться, но лично я хотел бы, чтобы все поля 1: 1 были объединены в одну таблицу.
Много неуместной денормализации. У нас есть таблица, в которой хранятся данные счетов-фактур, в которых хранится больше данных о счетах. Мы храним несколько разных флагов в таблице InvoiceData, даже если флаг логически не связан с таблицей InvoiceData, так что каждый флаг имеет магическое, жестко заданное значение первичного ключа и все другие поля, обнуляемые в таблице InvoiceData. Поскольку флаг представлен в виде записи в таблице, я предложил перенести флаг в его собственную таблицу.
Много больше неуместной денормализации. Некоторые флаги всего приложения хранятся в виде столбцов в неподходящих таблицах, поэтому изменение флага приложения требует обновления каждой записи в таблице.
Первичные ключи содержат метаданные, например, если первичный ключ varchar оканчивается на «D», мы рассчитываем счета-фактуры, используя один набор значений, в противном случае мы рассчитываем его с другим набором. Было бы разумнее перенести эти метаданные в отдельный столбец или перетащить набор значений для расчета в другую таблицу.
Внешние ключи часто идут в более чем одну таблицу, так что внешний ключ, заканчивающийся на «M», может ссылаться на нашу таблицу учетных записей, в то время как внешний ключ, заканчивающийся на «A», может ссылаться на нашу таблицу автоматических учетных записей. Было бы проще разделить данные на две таблицы, MortageData и AutoInsuranceData.
Все мои предложения были сбиты с большим воплем и скрежетом зубов. Приложение работает как спроектировано, и, хотя оно представляет собой большую грязь, все неприятные хаки, особые случаи и странные бизнес-правила саркастически и юмористически документированы в исходном коде.
источник
Придерживаясь старых технологий, потому что кажется слишком сложным позволить вашим клиентам обновиться до новой версии .NET Framework, но на самом деле создание программного обеспечения займет больше времени, потому что вы не можете использовать некоторые (экономящие время) компоненты более новая версия фреймворка.
источник
Вернувшись в университет, я работал над своим старшим дизайнерским проектом. Мы с другим парнем писали веб-систему отслеживания ошибок. (Ничего новаторского, но мы оба хотели получить некоторый опыт работы в Интернете.) Мы сделали это с сервлетами Java, и это работало достаточно хорошо, но по какой-то глупой причине вместо того, чтобы использовать Исключения в качестве нашего механизма обработки ошибок, мы выбрали использовать коды ошибок.
Когда мы представили наш проект для оценки, и один из преподавателей спросил неизбежного: «Если бы вам пришлось делать это снова, что бы вы сделали по-другому?» Я сразу понял ответ: «Я бы использовал исключения, вот для чего они здесь».
источник
Не мой выбор метода, но я создал XSLT для преобразования XML-файла на основе строк в HTML-отчет на основе столбцов.
Это работало только в IE, было совершенно невозможно расшифровать, как это работает. Каждый раз, когда нам нужно было расширять его, это было невероятно сложно и занимало целую вечность.
В конце я заменил крошечный скрипт на C #, который сделал то же самое.
источник
пытаясь использовать все новые технологии (чтобы изучить новые технологии), хотя это даже не требуется ..
источник
Я не потратил достаточно времени, чтобы оценить бизнес-модель. Я сделал то, что просил клиент, но через 6-12 месяцев мы оба пришли к выводу, что это следовало сделать по-другому.
источник
Проектирование без спецификации.
источник
Я реализовал подраздел приложения в соответствии с требованиями.
Оказывается, требования были раздуты и позолочены, а мой код был чрезмерно разработан. Я должен был спроектировать свой подраздел таким образом, чтобы он работал только с тем, что я добавил в то время, но планировал добавить все остальные вещи, не включая общую поддержку для него с самого начала.
источник