Najbardziej godna pożałowania decyzja dotycząca projektowania lub programowania? [Zamknięte]

57

Chciałbym usłyszeć, jakie decyzje projektowe podjąłeś i jak się odegrały. Z powodu złej decyzji projektowej ostatecznie musiałem poprzeć tę złą decyzję na zawsze (ja też miałem w tym swój udział). Uświadomiłem sobie, że jeden błąd projektowy może prześladować cię na zawsze. Chcę dowiedzieć się od bardziej doświadczonych ludzi, jakiego rodzaju wpadek doświadczyli i czego się od nich nauczyli.

Jestem pewien, że będzie to bardzo pomocne dla innych programistów, pomagając im nie powtarzać tych decyzji.

Dziękujemy za podzielenie się swoimi doświadczeniami.

VNarasimhaM
źródło
19
spędzanie zbyt dużo czasu na SO !! ;)
Mitch Wheat
6
@George: wygląda na to, że twój pierwszy link dotyczy nadmiernej inżynierii, która może być stycznie powiązana z tym wątkiem, ale nie jest duplikatem. Drugi i ostatni link dotyczą błędów kodowania i problemów związanych z zarządzaniem, z których żaden nie jest duplikatem tego wątku.
Juliet
1
Prawdopodobnie powinno to zostać przekształcone w wiki społeczności (podczas edycji postu jest pole).
3
Chciałbym, aby istniał sposób, aby zagłosować przeciwko zamknięciu. Głosujesz za blisko?
Kieveli
5
Co jest nie tak ze wszystkimi zamkniętymi wyborcami? Co jeśli nie jest to CW, pozwól pytającemu uzyskać kilka głosów za wymyślenie pytania. Naprawdę jestem zainteresowany tym tematem. Nie pozwól CW przeszkadzać w zadaniu dobrego subiektywnego pytania. Sheesh, SO jest pełne krzyczących „CW THIS”.
syaz

Odpowiedzi:

73

Ignorując YAGNI raz za razem ...

Jorge Córdoba
źródło
22
To prawda dla większości, ale są też ludzie, którzy mogliby użyć nieco mniej YAGNI. Żadna skrajność nie jest najlepszym miejscem.
Konsola 80x24,
56

„Zrobię to później”
„Później” nigdy nie nadejdzie.

Duleb
źródło
8
Później nigdy nie nadejdzie.
Nigdy tak nie jest.
Powiedziano: Jeśli nie masz czasu, aby to zrobić, co sprawia, że ​​myślisz, że będziesz miał czas, aby to naprawić później?
4
Nazywamy to „iteracją nigdy”
NotMe
10
Nie ma nic tak trwałego jak rozwiązanie tymczasowe.
dietbuddha
52

C ++, wielokrotne wirtualne dziedziczenie w kształcie rombu . Masz pomysł.

Kyralessa
źródło
19
Muszę utworzyć nowe konto, aby ponownie to zagłosować ...
Kieveli
Tak ... bolesne doświadczenia ...
Ed S.
Właśnie miałem brzydką retrospekcję
Neil N
1
@Jay wydawało się, że to dobry pomysł.
6
Nie wiem, co to w ogóle oznacza, ale brzmi bolesnie +1
The Disintegrator
44

Konfigurowalność w aplikacji jest dobra. Zbyt duża konfigurowalność to koszmar w użyciu i utrzymaniu.

Travis Beale
źródło
2
Tak. Prawdziwe. Idealizm polega na tym, aby wszystko konfigurować i powiedzieć szefowi, że nigdy więcej nie będziemy musieli zmieniać ani jednej linii kodu.
1
Będąc niefortunnym użytkownikiem, który utknął w jednym z tych nieskończenie konfigurowalnych systemów do zarządzania naszym projektem, mogę tylko powiedzieć, że głosowałbym za tobą milion razy, gdybym mógł.
HLGEM
Nadmierna elastyczność w konfiguracji jest zwykle spowodowana tym, że nie można wykonać dowolnego kodu w czasie wykonywania, dlatego należy wszystko przewidzieć.
Nazywa się to „spoftcoding” w przeciwieństwie do „hardcoding”
deadalnix
42

Z jednego z moich błędów nauczyłem się, że normalizacji DB nie należy ślepo przestrzegać. Możesz, aw niektórych sytuacjach MUSISZ spłaszczyć swoje stoły.

Skończyło się na zarządzaniu mnóstwem tabel (za pomocą modeli), a wydajność nie była tak dobra, jak mogłaby być z niewielkim spłaszczeniem tabel.

Eimantas
źródło
5
Nie mogę zgodzić się więcej ... Jestem inżynierem oprogramowania i każe nam się normalizować. Co za gówno gówna. Było tak tylko dlatego, że nauczyciele nigdy nie próbowali pracować z naprawdę złożonymi i zależnymi od wydajności bazami danych.
8
Mogę dodać, że normalizacja może być oczywiście bardzo pozytywna.
12
Myślę, że programiści są zbyt szybcy w denormalizacji z nieodpowiednich powodów, ale tak, niewolnicze przestrzeganie zasad normalizacji jest dużym błędem. Ogólnie rzecz biorąc, jedną z moich wielkich frustracji w tworzeniu oprogramowania jest to, że ktoś mówi „Musimy zrobić X”, a kiedy wskazuję wszystkie problemy, jakie to spowoduje, odpowiada: „To nie ma znaczenia. Wszyscy eksperci są zgodni, że X jest dobry, dlatego musimy robić X, zawsze bez wyjątków. ”
4
Moje podejście do normalizacji jest zawsze proste. Zawsze normalizuję się, ALE jeśli widzę potencjalny wzrost wydajności przy małym spłaszczeniu - zawsze testuję i testuję, aw większości przypadków opłaca się.
Eimantas
7
Ale normalizacja to ZABAWA! :) Mówię poważnie, lubię projektować struktury danych. Powiedziałbym, że chociaż łatwo jest znormalizować znormalizowany schemat, odwrotność NIE jest prawdą. Musisz WIEDZIEĆ zasady, zanim je złamiesz.
36

Używanie pojedynczego znaku w bazach danych dla statusów itp. Nie ma w tym sensu, narzut związany z używaniem dłuższego znaku () lub nvarchar2 () jest niewielki w porównaniu z siecią i analizą wywołaną przez każde wywołanie SQL, ale znaki zawsze się kończą raczej zaciemnione lub wyczerpujące (nie dla statusów, ale dla innych rzeczy). O wiele lepiej jest po prostu umieścić wersję czytelną dla człowieka i mieć w swoim modelu Java (w moim przypadku) wyliczenie z pasującymi wartościami.

Myślę, że jest to forma przedwczesnej niepotrzebnej i ślepej optymalizacji. Tak, jakby użycie jednego znaku uratowało świat w tych dniach. Oprócz boolanów Y / N w bazach danych, które nie obsługują boolanów / bitów.

JeeBee
źródło
+1 Właśnie mieliśmy spotkanie na ten temat. Doszliśmy do tego samego wniosku.
APC
Co się stanie, jeśli Twój klient pracuje z takimi skrótami i nie chce ich porzucić?
W przypadku istniejących systemów musisz być kompatybilny (nadal stworzę enum Java o odpowiednich wartościach, oczywiście za pomocą metody <code> MyEnum fromChar (char c) </code>). W przypadku nowych wzorów po prostu nie idź tam!
Niektóre bazy danych obsługują wyliczenia, które są zarówno zwarte, jak i czytelne, a także ładnie zabraniają nieoczekiwanych wartości. Jeśli możesz, skorzystaj z nich.
Karl Bartel,
2
Prawie tak źle: Używanie typu BIT w MS SQL Server, zanim odkryjesz, że nie może być częścią indeksu.
finnw
32

Nie rozwijam odpowiedniej Warstwy Dostępu do Danych i mam sql wszędzie w moim kodzie, tylko po to, żeby dostać coś „szybkiego” i działającego. Później, gdy projekt zaczął się rozwijać, a wymagania ulegały zmianie, stał się koszmarem. Nie wiedziałem wtedy, czym jest DAL.

... cieszę się, że to już przeszłość, chociaż wciąż widzę, że robią to programiści z ponad 20-letnim doświadczeniem.

CitizenBane
źródło
16
Nie pamiętam, gdzie go przeczytałem, ale istnieje różnica między 20-letnim doświadczeniem a rocznym doświadczeniem powtarzanym 19 razy.
CaffGeek
@Chad: Było to gdzieś w pismach Joela Spolsky'ego.
+1: Tak. I spróbuj refaktoryzować całą logikę związaną z tym SQL ... Niezależnie od tego, czy jest to wbudowany, dowolny SQL, czy przechowywane procy. [Tak - nie boję się tej świętej wojny.]
Jim G.
26

Myśląc, że mogę być Architektem, Deweloperem i PM w tym samym projekcie.

2 miesiące snu 3 godziny dziennie nauczyły mnie, że po prostu nie możesz tego zrobić.

Craig
źródło
15
Przestań więc spać tak dużo! och, czekaj ... masz na myśli, że to NIE jest normalne ... ?? Hmm, muszę
poprosić
Wygląda na to, że PM-potrzebujesz szkolenia z szacunkami :)
21

Wybór Microsoft Foundation Classes (MFC) do pisania środowiska Java IDE.

Oliver Weichhold
źródło
3
Owwww. To zraniłoby mój mózg.
Greg D
2
To nie była zła decyzja w 1999 roku. AWT było wtedy brzydkie i wolne.
finnw
finnw - cóż, przynajmniej wciąż jest brzydki!
Niklas H
20

To nie była moja decyzja (dołączyłem do firmy nieco później), ale gdzieś, gdzie pracowałem, zajęło mi to trochę za daleko, włączając w to tłumaczenie wszystkich komunikatów z dziennika.

Wyniki:

  • Bardziej bolesne jest dodawanie nowego rejestrowania
  • Więcej kosztów tłumaczenia
  • Dzienniki są później trudniejsze do odczytania

Ups

Jon Skeet
źródło
Robię tutaj trochę i18n i próbuję dowiedzieć się, co trafia do użytkownika, a co do dzienników. Chcę zlokalizować wszystkie dane wyjściowe skierowane do użytkownika, ale chcę, aby dzienniki pozostały takie same. W tym procesie muszę zrobić więcej, aby dowiedzieć się, gdzie jest wyjątek, niż lubię.
David Thornley,
1
Niech zgadnę, twój Amerykanin? A jeśli nie, mówisz tylko po angielsku? Użyj internacjonalizacji, gdy nowe wpisy dziennika w języku angielskim, jeśli dostępny jest inny język, wyświetlasz język użytkownika. WSKAZÓWKA: Użycie kodów błędów pomaga tutaj, ponieważ oznacza to, że zawsze możesz grep / skanować logi bez względu na język.
2
@Jacob: Jestem Anglikiem, ale mówię tylko po angielsku. Ale było to dla firmy, w której cała baza inżynierska znajdowała się w Anglii, więc posiadanie plików dziennika (które są w celach diagnostycznych, nie są widoczne dla użytkownika) w innych językach byłoby po prostu marnotrawstwem zasobów. Zgadzam się, że używanie kodów błędów zamiast tekstu pozwala na tłumaczenie w locie - ale to wciąż więcej pracy niż tylko używanie jednego języka na początek. Jest to kwestia ograniczenia pracy poprzez określenie, gdzie coś, co brzmi użytecznie, w rzeczywistości nie przyniesie żadnej znaczącej wartości.
Jon Skeet,
10
Jestem Szwedem. Musiałbym znaleźć średniowieczne na każdym, kto nawet sugeruje, że kod / komentarze / logi powinny być w czymkolwiek innym niż angielski. Angielski jest językiem używanym do wszystkiego oprócz interfejsów użytkownika. Wszystko inne sprawia, że ​​kod jest trudny do odczytania i omówienia. Używanie języka ojczystego jest niedorzeczne, ponieważ wszelkie inne ramy / biblioteki, z których korzystasz, są w języku angielskim.
jgauffin
1
+1 English to lingua franca programowania. Przetłumaczenie to po prostu nałożenie dodatkowej warstwy, w której potrzebujesz jak najmniej warstw i jak najwięcej przejrzystości.
19

Robię za dużo projektowania . Tworzenie wielu diagramów UML, szczególnie diagramów sekwencji dla każdej pojedynczej operacji, z których wiele ostatecznie okazało się bezużyteczne. Na koniec okazało się, że można by zaoszczędzić znaczną ilość czasu, pomijając niepotrzebnie szczegółowy projekt / diagramy i bezpośrednio rozpoczynając kodowanie.

Jahanzeb Farooq
źródło
Jeśli pytanie brzmiało: „Jaka jest najbardziej godna pożałowania decyzja dotycząca projektowania lub programowania, jaką kiedykolwiek podjąłeś?” w przeciwieństwie do błędów, które sami popełniliśmy, umieściłem „UML” u góry mojej listy. Tuż pod „rejestrem systemu Windows”.
2
UML dobrze jest omawiać między członkami zespołu, ale jeśli chodzi o projekt, a następnie wdrożyć zgodnie z projektem, zawsze kończy się źle. Jest to marzenie niektórych firm, ale naprawdę pisanie oprogramowania zdecydowanie nie działa w ten sposób. +1!
deadalnix
17

Wiara w klientów wie, czego chcą, a następnie zbyt wiele, zanim się z nimi skontaktuje.

Anders
źródło
15

Moja najgorsza decyzja projektowa? W latach 80. pracowałem nad projektem, w którym wpadliśmy na pomysł stworzenia pewnego rodzaju szablonu dla naszych ekranów wprowadzania danych, który byłby interpretowany w czasie wykonywania. Niezła decyzja: ułatwiło projektowanie ekranów wejściowych. Zasadniczo po prostu stwórz plik, który przypominałby ekran wprowadzania danych, z kilkoma specjalnymi kodami, aby zidentyfikować, co było etykietą w porównaniu z tym, co było polem wejściowym, i aby ustalić, czy pola wejściowe były alfanumeryczne czy numeryczne. Następnie postanowiłem dodać do tych plików kilka specjalnych kodów, aby określić, jakie weryfikacje należy wykonać. Następnie dodałem więcej kodów, aby umożliwić warunkowe budowanie ekranu, pole X było uwzględniane tylko wtedy, gdy jakiś warunek był spełniony itp. Następnie dodałem więcej kodów, aby wykonać proste przetwarzanie danych wejściowych. Itd itd. Ostatecznie zmieniliśmy szablon ekranu w nowy język programowania, zawierający wyrażenia, struktury kontrolne i bibliotekę we / wy. A po co? Zrobiliśmy mnóstwo pracy, aby ponownie wynaleźć FORTRAN. Mieliśmy półkę pełną kompilatorów dla języków, które były lepiej zaprojektowane i lepiej przetestowane. Jeśli poświęcilibyśmy tyle wysiłku na tworzenie produktów, w których rzeczywiście dysponowaliśmy wiedzą specjalistyczną, firma ta mogłaby nadal działać.

Sójka
źródło
To zarówno zabawne, jak i tragiczne :)
Smutne jest to, że takie podejście jest czasem najlepszym sposobem. Klient może wybrać „ekran można zmienić w mgnieniu oka” lub „ekran robi wszystko, łącznie z zaparzaniem herbaty”, ale nie jedno i drugie!
3
Nie mam nic przeciwko używaniu szablonów lub innego ogólnego kodu. Błąd polegał na przekształceniu fragmentu kodu ogólnego w język wewnątrz języka.
Widziałem to dokładnie zrobione ... w 2004 roku! Cała logika biznesowa jest rozłożona na około piętnaście tabel konfiguracji, z kilkoma na wpół wypróbowanymi dynamicznymi „językami” rzuconymi na dokładkę (patrz dziesiąta zasada Greenspun)!
1
Nie masz na myśli COBOL zamiast FORTRAN?
finnw
15

Nadgorliwe stosowanie YAGNI (zwanego Projektowaniem przez wyliczenie w pułapkach rozwoju obiektowego ) w środowisku, w którym każda rozsądna osoba może stwierdzić, że wymagania na pewno się zmienią. I zmieniaj się wielokrotnie.

Jeśli (twardo) zakodowałeś wszystko dokładnie do aktualnych wymagań - jednocześnie pokonując każdego, kto mówi „czy to nie może być bardziej ogólne?” z młotkiem YAGNI - a następnie wymagania zmieniają się drastycznie (ale w sposób, który można było rozsądnie przewidzieć), wtedy może to być różnica między poświęceniem 2 tygodni na dostosowanie, a zajęciem 20 minut.

AKTUALIZACJA: Aby wyjaśnić, oto fikcyjny przykład, który nie jest zbyt daleko od tego, co się stało. Przepełnienie stosu zostało zaprojektowane tak, aby obsługiwać odznaki, ale załóżmy, że na początku mogły myśleć tylko o czterech odznakach. Tylko cztery, tak mała liczba, więc zakodowali na stałe wsparcie dokładnie czterech odznak w całej logice na stronie. W bazie danych, w informacjach o użytkowniku, we wszystkich kodach wyświetlanych. Ponieważ „Nie będziesz potrzebować” żadnych odznak, o których nie możesz pomyśleć, prawda? Załóżmy, że witryna jest aktywna, a ludzie zaczynają sugerować nowe plakietki. Każda odznakadodanie zajmuje nawet dwa tygodnie, ponieważ w całym tym miejscu jest tak wiele poprawek. Ale nadal: „Nie będziesz potrzebował” więcej odznak niż dzisiejsza lista, więc nigdy nie będzie żadnego refaktoryzacji w celu obsługi ogólnej kolekcji odznak. Czy taka ogólna kolekcja zajęłaby więcej czasu z góry? Niewiele, jeśli w ogóle.

YAGNI jest cenną zasadą, ale nie należy jej (ab) usprawiedliwiać złego projektu i niewłaściwego kodowania. Jest równowaga i z doświadczeniem, myślę, że do niej podchodzę.

Konsola 80x24
źródło
1
Tak i nie, czy możesz przewidzieć, w jakim kierunku to się zmieni? Mam doświadczenie z boleśnie złożonymi systemami, które okazały się całkowicie nieodpowiednie do pierwszego ponownego użycia, które nie pasowały do ​​przewidywanej ogólności ...
Benjol,
^ tak, wolę zajmować się YAGNI niż tym gównem.
Więc uważasz, że powinieneś był spędzić 2 tygodnie z góry?
finnw
4
Ten przykład w ogóle nie jest YAGNI. DRY jest częścią YAGNI i bez niego nie możesz pozostać wrażliwy na zmiany.
3
Stephan, przykład pokazuje glib i niewłaściwe nadużywanie frazy catch, o co mi chodziło. OSUSZANIE (z jego wariantem OAOO) jest również dobrą zasadą, ale całkiem odrębną: c2.com/cgi/wiki?OaooBalancesYagni . Jednak nigdzie nie mogę znaleźć niczego, co potwierdziłoby twoje twierdzenie, że „DRY jest częścią YAGNI”. Musztarda pasuje do hot-dogów, ale to nie znaczy, że musztarda jest częścią hot-dogów. Jeśli możesz to wyjaśnić, być może odniesieniami, być może zrozumiem.
Konsola 80x24
15

Niekompetentne zasoby ludzkie

Próbuję zrobić coś dobrego i dobrego z niewłaściwymi ludźmi!
Nawet jeśli pełnią one rolę zbędnego premiera ego (co jest dość powszechne, szczególnie w dużych firmach, w których ich niekompetencja może trwać dłużej).

Robert Koritnik
źródło
1
Rozumiem twój ból :(
13

Za każdym razem, gdy tworzę dług techniczny, piszę kod proceduralny, pomijam pisanie testów itp., Ponieważ śpieszę się. Prawie nieuchronnie uważam, że powoduje to ból na drodze.

TrueWill
źródło
13

Korzystanie z usług SQL Server Intergration Services (SSIS).

Nie życzę tego mojemu najgorszemu wrogowi.

Po zbudowaniu kilku pakietów SSIS w ciągu ostatnich dwóch miesięcy, okazało się, że pakiety, które opracowałem, nie są dystrybuowalne i nieodwracalne. W szczególności w środowisku innym niż www, nie licencjonowanym SQL Server.

Jest to bardzo zła sytuacja, gdy masz mniej niż 48 godzin, aby ponownie napisać swoje pakiety SSIS w czystym kodzie .NET POCO lub nie dotrzymać wyznaczonego terminu.

Dziwi mnie, że udało mi się przepisać trzy pakiety SSIS (testowanie i rozwój zajęło mi dwa miesiące) w ciągu 12 godzin w czystym kodzie .NET za pomocą adapterów OLEDB i adapterów SQL.

SSIS nie jest rozpowszechniany i nie będzie wykonywać pakietów z komputera klienta, jeśli nie ma na nim zainstalowanej licencji SQL Server (w szczególności DTSPipeline.dll). Byłoby wspaniale wiedzieć z góry. Widzę teraz wyłączenie odpowiedzialności (drobnym drukiem) w witrynie MSDN. Nie ma to nic dobrego, jeśli masz przykładowy kod w całym Internecie, używając tylko kodu maszynowego SQL-LICENSED. Zasadniczo musisz utworzyć usługę internetową, która będzie komunikować się z serwerem SQL, aby programowo uruchamiać pakiety SSIS. Nie można ich wykonać z czystego kodu .NET, chyba że na komputerze wykonującym zainstalowana jest licencja SQL. Jak to jest nierealne? Czy Microsoft naprawdę oczekuje, że SSIS będzie używany na komputerach, które wymagają instalacji serwera SQL? Co za kompletna strata dwóch miesięcy.

Moja firma nigdy więcej nie użyje SSIS z powodu tego małego wydruku „gotcha”.

D3vtr0n
źródło
Być może powinieneś całkowicie unikać używania oprogramowania do drobnego drukowania! Na przykład Talend to IDE o otwartym kodzie źródłowym.
+1: Tak. Doświadczenie związane z programowaniem SSIS również jest koszmarem. Prawdopodobnie istnieje co najmniej pół tuzina lepszych sposobów wykonywania ETL.
Jim G.
11

Nie zdefiniowanie mechanizmu / modelu wdrażania tak wcześnie, jak to możliwe.

Austin Salonen
źródło
10

Wrzucam trochę „śmiesznych” pisanek do jakiegoś kodu, który napisałem przed wyjazdem na wakacje na 2 tygodnie. Myślałem, że będę jedyną osobą, która przeczytałaby go, gdy wrócę, zachichotałbym i byłbym gotowy go ponownie zakodować.

Nie trzeba dodawać, że mój szef nie był pod wrażeniem, gdy przejrzał go podczas mojej nieobecności, a jeszcze bardziej był pod wrażeniem, gdy jedno z „wielkanocnych jaj” obejmowało jego zabawnie rysowaną twarz w ASCII.

Mmmmmm ...

Daniel May
źródło
1
IMO, to „Dobra robota, sir!”
18
Niedawno mój zespół wyśmiewał mnie z powodu komunikatów śledzenia, takich jak: „addt 'th'value (p) t'yer table!” Powiedziałem: patrz, zmusili mnie do pracy w Talk Like A Pirate Day, zasługują na to, co dostają.
3
Arr, twoje logi szukają kilu!
10

Używanie motywów ASP.Net, gdy zwykły stary folder CSS byłby w porządku.

Phil.Wheeler
źródło
Lol, tak!
1
Ta odpowiedź może być skrócona do „Korzystanie z ASP.NET”
finnw
Skórki są przydatne do konfigurowania domyślnej klasy CssClass.
Min.
8

Szybka droga do uruchomienia kodu, a nie właściwa droga (nieco ogólna, ale nazwiemy to abstrakcją, a zatem „właściwą” odpowiedzią).

Paddy
źródło
7

Moja firma ma model rozwoju podobny do wodospadu, w którym nasi użytkownicy biznesowi i analitycy biznesowi określą wymagania dotyczące projektów. W przypadku jednego z naszych „dużych” projektów otrzymaliśmy stos wymagań i zauważyłem, że wiele wymagań zawierało szczegóły implementacji , w szczególności informacje związane ze schematem naszej bazy danych używanym przez nasz system księgowy.

Skomentowałem użytkownikom biznesowym, że implementacja jest moją domeną, nie powinna być zawarta w wymaganiach. Nie chcieli zmieniać swoich wymagań, ponieważ w końcu są BIZNESEM, a księgowi mają sens jedynie projektować oprogramowanie księgowe. Jako mało zaawansowany programista, który jest zbyt daleko w ankiecie totemowej, płacę za to zamiast myśleć . O ile walczyłem, nie udało mi się przekonać ich do ponownego napisania wymagań - jest zbyt wiele papierkowej roboty i biurokracji wokół zmian, co jest zbyt wielkim problemem.

Dałem im więc to, o co prosili. Przynajmniej trochę działa , ale baza danych jest dziwnie zaprojektowana:

  • Dużo niepotrzebnej normalizacji. Pojedynczy rekord zawierający 5 lub 10 pól jest podzielony na 3 lub 4 tabele. Mogę sobie z tym poradzić, ale osobiście chciałbym, aby wszystkie pola 1: 1 zostały zebrane w jednym stole.

  • Dużo niewłaściwej denormalizacji. Mamy tabelę, która przechowuje dane faktury, która przechowuje więcej niż dane faktury. W tabeli InvoiceData przechowujemy wiele różnych flag, nawet jeśli flaga nie jest logicznie powiązana z tabelą InvoiceData, tak że każda flaga ma magiczną, zakodowaną wartość Klucza podstawowego, a wszystkie inne pola wyzerowane w tabeli InvoiceData. Ponieważ flaga jest reprezentowana jako rekord w tabeli, zasugerowałem wciągnięcie flagi do własnej tabeli.

  • O wiele bardziej niewłaściwa denormalizacja. Niektóre flagi dla całej aplikacji są przechowywane jako kolumny w nieodpowiednich tabelach, tak że zmiana flagi aplikacji wymaga aktualizacji każdego rekordu w tabeli.

  • Klucze podstawowe zawierają metadane, tak że jeśli klucz podstawowy varchar kończy się na „D”, faktury obliczamy na podstawie jednego zestawu wartości, w przeciwnym razie obliczamy go na innym zestawie. Bardziej sensowne byłoby przeciągnięcie tych metadanych do osobnej kolumny lub pobranie zestawu wartości do obliczenia do innej tabeli.

  • Klucze obce często trafiają do więcej niż jednej tabeli, tak że klucz obcy kończący się na „M” może łączyć się z naszą tabelą kont hipotecznych, podczas gdy klucz obcy kończący się na „A” może łączyć się z naszą tabelą automatycznych kont. Łatwiej byłoby podzielić dane na dwie tabele, MortageData i AutoInsuranceData.

Wszystkie moje sugestie zostały zestrzelone z wieloma lamentami i zgrzytaniem zębami. Aplikacja działa zgodnie z projektem i choć jest to wielka kula błota, wszystkie nieprzyjemne hacki, specjalne przypadki i dziwne reguły biznesowe są sarkastycznie i humorystycznie udokumentowane w kodzie źródłowym.

Julia
źródło
3
Boże, mam nadzieję, że twoje CV jest ładne i aktualne na szybką ucieczkę, zanim wielka kula błota ulegnie grawitacji!
Benjol,
7

Trzymanie się starszej technologii, ponieważ wydaje się, że zbyt duży problem sprawia, że ​​Twoi klienci mogą aktualizować się do nowej wersji .NET Framework, ale w rzeczywistości tworzenie oprogramowania zajmie więcej czasu, ponieważ nie możesz użyć niektórych (oszczędzających czas) komponentów nowsza wersja frameworka.

Tom van Enckevort
źródło
+1: Tak - byłem tam ... I gdy tylko zorientowałem się, że n00bs się nie ulepszy, zacząłem planować ucieczkę na bardziej zielone pastwiska.
Jim G.
I tak zrobiłem, właśnie przeszedłem na emeryturę w następnym miesiącu!
winorośl
6

Po powrocie na uniwersytet pracowałem nad moim starszym projektem. Razem z innym facetem pisaliśmy internetowy system śledzenia błędów. (Nic przełomowego, ale oboje chcieliśmy uzyskać trochę doświadczenia w Internecie.) Zrobiliśmy to z serwletami Java i działało to całkiem dobrze, ale z jakiegoś głupiego powodu, zamiast zdecydować się na użycie wyjątków jako naszego mechanizmu obsługi błędów, wybraliśmy używać kodów błędów.

Kiedy przedstawiliśmy nasz projekt do oceny, a jeden z wykładowców zapytał nieuniknione: „Gdybyś musiał to zrobić ponownie, co zrobiłbyś inaczej?” Natychmiast znałem odpowiedź: „Użyłbym wyjątków, po to są.”

Greg D.
źródło
Ahhh radość z odkrywania koła na nowo! :-) Zabawne.
Nazywam to celowymi wadami, abyś mógł to poprawić w następnej iteracji.
whatnick
2
Wyjątki dotyczą wyłącznie wyjątków. Zbyt wiele osób nadużywa wyjątków, zamieniając wszystko w wyjątek.
@jacob - Zgadzam się z twoim sentymentem, że należy stosować wyjątki do rzeczy, które możesz przewidzieć (tj. wyjątkowe warunki), ale z tego, co widziałem (i nie jestem programistą Java) Java wydaje się używać wyjątków od wszystkiego pod słońcem. Dlatego niestosowanie wyjątków w kodzie Java można uznać za sprzeczne z przepływem języka.
6

Nie mój wybór metody, ale utworzyłem XSLT do konwersji pliku XML opartego na wierszach na raport HTML oparty na kolumnie.

Działa tylko w IE, było całkowicie niemożliwe do odkodowania, jak to działało. Za każdym razem, gdy potrzebowaliśmy go rozbudowywać, było to niemożliwie trudne i trwało wieki.

Na koniec zastąpiłem małym skryptem C #, który zrobił to samo.

JDunkerley
źródło
Też to zrobiłem. Zaimplementowałem silnik szablonów e-mail za pomocą XSL i trudno mi było je czytać i utrzymywać.
TrueWill,
Tak. Zastąpił czyjeś ogromne drzewo plików XSLT kilkoma prostymi funkcjami VB.NET. Bardzo satysfakcjonujące, szczególnie gdy następna prośba o zmianę klienta, która się pojawiła, byłaby niemożliwa do zrealizowania w XSLT.
Przekonałem się, że większość programistów uważa XSLT za zły wybór, po prostu dlatego, że go nie rozumie . Jest niezwykle przydatny w przypadku niewielkiego zestawu problemów, znacznie wydajniejszy niż wiele innych rozwiązań. Z drugiej strony jest używany zbyt często, a przede wszystkim NIE w tym niewielkim zestawie problemów ...
AviD
6

próbując wykorzystać wszystkie nowe technologie (aby nauczyć się nowych technologii), nawet jeśli nie wymagają nawet ..

oscar
źródło
5

Nie poświęciłem wystarczająco dużo czasu na ocenę modelu biznesowego. Zrobiłem to, o co prosił klient, ale 6-12 miesięcy później doszliśmy do wniosku, że powinno być inaczej.

Kucyki OMG
źródło
4

Projektowanie bez specyfikacji.

Sam
źródło
3
Specyfikacja nie zawsze jest możliwa
Powinno być „Wdrażanie rozwiązania bez pytania klienta, czy tego właśnie chciał”; co zwykle oznacza, że ​​postępowałeś zgodnie ze specyfikacjami.
dietbuddha
3

Zaimplementowałem podsekcję aplikacji zgodnie z wymaganiami.

Okazuje się, że wymagania były rozdęte i pozłacane, a mój kod został przeprojektowany. Powinienem był zaprojektować moją podsekcję, aby działała tylko z tym, co dodawałem w tym czasie, ale planuję dodać wszystkie inne rzeczy bez uwzględnienia ogólnej obsługi tego od samego początku.

Kieveli
źródło