Чи є надія написати гарний код на вершині жахливо розробленої бази даних?


18

Ось мій важкий стан. Одна з декількох програм, які я нещодавно успадкувала, побудована з жахливою базою даних на бекенді. Поважані його творці, очевидно, не цінували реляційні поняття. Таблиця для кожного клієнта, названа як унікальний ідентифікатор клієнта. Вісімдесят три криптично названі поля. Код є процедурним із десятками об'єднаних вбудованих операторів SQL.

Оскільки нам не було надано важливе допоміжне додаток, яке працює з тією ж базою даних, я отримав завдання відтворити його з нуля. Я єдиний розробник, який навіть не є моєю основною відповідальністю, оскільки принаймні половину мого часу займають операції. Зараз неминучий термін встановлений на 30 днів.

Незважаючи на свій недосвідчений досвід, я впевнений, що міг би розробити цю базу даних та наявну програму набагато краще, ніж вони були, але я не думаю, що для мене реально змінювати базу даних, коригувати наявну програму та бути впевненим, що я цього не зробив ' t зламати що-небудь, потребуючи цього швидко створити додаткову програму.

Тож припустимо, що я застряг із жахливою базою даних. Чи потребуватиму працювати з такою поганою структурою, чи все, що я пишу, що відповідає їй, просто додасть до купи купи технічного боргу, яку слід відкласти, поки щось повністю не порушиться або не буде потрібна нова функціональність? Як я міг підійти до цієї ситуації і отримати щось гарне з неї, окрім сподіваюсь, функціонального застосування?

редагувати: Якщо хтось зацікавився, ми закінчилися записувати цю жахливу базу даних та додаток, який працював на ній. Ми передали аутсорсинг на створення додаткового додатку (я не брав участі в цьому), в кінцевому рахунку двох різних підрядників, які обоє потрапили на нас, нічого не виконавши. Мені в кінцевому підсумку довелося вискочити жахливий, частково функціональний злом виправлення за три дні, який використовується і сьогодні.


2
Подумайте, як би ви кодували бібліотеку, де спеціальний випадок "2 + 2" не повернувся 4. Це непросто.

8
тому я все це чую, що у вас є 30 днів, щоб знайти іншу роботу. спробуйте careers.stackoverflow.com ;-)
Стівен А. Лоу


@gnat: Навіть близько.
Роберт Харві

Відповіді:


27

Є надія, але це важкий бій, особливо якщо ніхто не усвідомлює, що дизайн бази даних жахливий. Можна спробувати абстрагувати неприємність від шару абстракції, але ймовірно, що це не буде варто битви.

Моєю порадою було б створити достатню кількість абстракцій над базою даних, щоб сама програма була чистою та належним чином розроблена; таким чином, якщо ви зможете будь-коли виправити базу даних, програма не вплине, оскільки це не байдуже, як була створена база даних.

Це такий підхід, який я зазвичай використовую при роботі з базою даних, яка існує і, частіше за все, розроблена з нульовою думкою. Кілька застосувань вибору шаблонів сховища або шлюзу, з деякими сервісними шарами для спілкування зі шлюзом / сховищем, повинні допомогти зробити карантин поганою конструкцією.


1
+1 Я в основному сказав те саме у своїй відповіді перед тим, як повністю прочитати вашу, проте я не бачу способу видалити свою відповідь, оскільки ваша охоплює той самий матеріал.
Омінус

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

3
@maple_shaft Погоджений, але ОП каже, що йому було запропоновано створити з нуля нову програму, яка взаємодіє з базою даних. У такому випадку має сенс правильно створити нову програму.
Уейн Моліна

1
@maple_shaft, єдиною лайновою програмою буде та частина, яка взаємодіє з базою даних лайна. У цьому суть архітектури N-Tier та SOC.
StuperUser

1
@maple_shaft Метою було б поставити базу даних у "чорний ящик" свого роду та надати додатку інтерфейс до неї, який є більш ідеальним та необов'язково представником дизайну бази даних.
Майкл Дін

10

Створіть інтерфейсний шар, який обробляє всі речі в БД, а потім напишіть програму, щоб поєднатися з цим. У випадку, якщо база даних коли-небудь буде "виправлена", ви просто заміните / оновите свій "інтерфейс". Такий підхід заощадив мені багато часу, коли ми маємо справу з поганою базою даних або базою даних, яка живила інші програми та не змогла зіпсуватись.


Як можна видалити власні відповіді чи це неможливо?
Омінус

Ви можете видалити власні відповіді. Ви постійно бачите їх із тонованим фоном, і це скаже щось на кшталт "видалено власником". За винятком вас бачитимуть лише люди, що мають повноваження модератора.
Мар'ян Венема

@Ominus: Це повинно бути можливо, але чому б ти цього хотів? У вас 3 оновлення!
FrustratedWithFormsDesigner

1
@Marjan: Модератори та хтось із респ.> 10K
Джеррі Труну

1
Чому ви хочете видалити цю відповідь? Я думаю, що це відмінне рішення.
Джим Г.

6

Ой ... Ви успадкували кошмарний безлад, у вас є 30 днів, щоб зробити його корисним для вашої організації, і половину дня займаєте операційні завдання?

Я впевнений, що ви могли б змінити показник, але, безумовно, не за цей час.

Щоб відповісти на ваше запитання, я не думаю, що ви насправді можете написати хороший код на такій конструкції. Технічний борг вже занадто великий. Якби я був ти, я би зламав можливості, які міг би, і натисну для повного рефакторингу на більш пізній термін, коли у тебе буде більше часу та людей у ​​вашій команді, щоб краще їх вирішити.

Тільки обережно натискайте на рефакторинг. Іноді вищі особи приймають рішення про придбання вихідного коду продуктів та прав власності, і вони не хочуть думати, що повністю витратили гроші на сміття. Так було в мене на одній роботі, яку я мав. На жаль, менеджери приймають рішення щодо придбання подібного програмного забезпечення, і вони ніколи не беруть технічної участі, щоб оцінити, що вони купують, і побачити, чи є це реконструкція і чи є велика кількість технічної заборгованості. У цьому випадку погане рішення є політичним, і наполягання на рефакторингу може поставити під загрозу вашу роботу.


Незважаючи на незнайомість всіх інших з програмуванням, я зрозумів, як якість цієї кодової бази вплине на технічне обслуговування. Вони на борту з величезними зусиллями рефакторингу, щоб перевести все в більш підходящий стан, тому я не ризикую поставити під загрозу свою роботу, але я не думаю, що це станеться в цьому місяці.
Джон Страка

3
Іноді вдалий злом, оскільки ваш перший досвід роботи з проектом може дати вам надійність рефакторингу в пізніших проектах для того ж додатка. Сумно але правда. Спочатку вони повинні повірити, що ви знаєте, що ви робите, перш ніж вони розглядають будь-які радикальні зміни. Плакат знаходиться у важкому місці, щоб бути впевненим.
HLGEM

1
@John, Це добре, що вони ВІДПОВІДАЮТЬ потребу в рефакторингу. Це ознака хорошого довгострокового управління та перший крок до фактичного рефакторингу.
maple_shaft

3
+1 за чудову реалістичну відповідь. У вас є місяць, але насправді лише півмісяця, тому що ви працюєте половину часу на операціях. Це 11-15 днів, залежно від того, чи знімаєте ви вихідні. Я ненавиджу це говорити, але я погоджуюся, що найкраще зібрати разом щось, що працює якнайшвидше, і робити нотатки про те, як це вдосконалити чи переписати пізніше, тим більше, що ваше управління працює на рефакторингу.
Боб Мерфі

6

Бази даних можуть бути відновлені як і інший код. Виправте частину, на яку впливає код, необхідний для написання та написання тестів, щоб переконатися, що більше нічого не зламається. Виконайте один невеликий шматочок одночасно, як і будь-який інший рефакторинг. Існує хороша книга про рефакторинг баз даних, яка може допомогти вам почати прибирати безлад. http://www.amazon.com/Refactoring-Databases-Evolutionary-paperback-Addison-Wesley/dp/0321774515/ref=sr_1_1?ie=UTF8&qid=1307025831&sr=8-1

Є й інші, але я особисто читав та працював із прийомами в цьому.

І не забувайте, що ви можете реструктурувати спосіб запиту до бази даних, створивши перегляди, щоб зробити неприємну трансформаційну роботу для вас у структуру, яку простіше запитувати.


Це все добре і добре, але я сумніваюсь, що якщо дизайн баз даних буде безладним, то код програми, мабуть, теж марний.
maple_shaft

@maple_shaft, це могло бути, хоча, як мій досвід, навіть хороші розробники додатків створюють жахливі бази даних. Так чи інакше, лише поступове рефакторинг виправить безлад, він не може просто замінити його прямо, хоча я впевнений, що хотів би це зробити.
HLGEM

+1 @HLGEM, Це хороші моменти. Ваша порада є здоровою, якщо код програми добре розроблений. Реконструкція частинами - це, мабуть, найкращий шлях, але за всю свою кар’єру я ніколи не бачив, щоб це було успішно. Це, можливо, було через поганий менеджмент проектів, а не тому, що це невдала ідея.
maple_shaft

5

Щоб отримати найбільший удар для свого долара, створіть оновлені види, щоб відновити деякі "відносність" та надати більш значущі назви стовпців.


Це було б гарним початком. Якщо база даних денормалізована, я б додав тригери або збережені процедури, щоб ізолювати додаток від денормалізації.
кевін клайн

4

Однією з можливостей було б встановити другу базу даних, структуровану (принаймні ближче до), як вам подобається, і встановити реплікацію між двома базами даних. Тоді ви можете написати свій код у новій базі даних і все-таки залишити існуючу базу даних (і додаток) недоторканою, з якою потрібно працювати, коли у вас буде більше часу.

Правда, все ще відкрито багато питань, чи можете ви це зробити за ~ 15 днів роботи. Зокрема, це може залежати від того, чи потрібна вам двостороння реплікація (тобто ваша нова програма фактично оновить дані) або лише один спосіб (ваша нова програма просто дозволяє людям переглядати дані). Останній випадок (звичайно) різко простіше вирішити.

Якщо вам потрібна двостороння реплікація, велика ймовірність, що просто не вистачить часу, щоб виконати роботу. Зокрема, двостороння реплікація, яка передбачає істотне перетворення структури, ніколи не є тривіальною, і наявні інструменти часто підтримують її досить погано (наприклад, потрібно вручну написати всі SQL для всіх перетворень даних в обох напрямках).

Якщо вам потрібен лише односторонній шлях, це правильно в той момент, коли це може бути межею можливого. Це також буде залежати небагато від того, чи дозволяєте ви витрачати гроші чи ні - існує досить багато додатків для зберігання даних, призначених саме для такого роду завдань, які, ймовірно, зробить це трохи швидше і простіше управляти - але більшість з них НЕ дешево.


+1, Це також може бути хорошою ідеєю, якщо весь код доступу до програми належним чином відокремлений від інших шарів, і що код доступу до даних може бути відновлений для роботи з новою схемою
maple_shaft
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.