Programistyczne WTF jakie Was spotkały

0

trochę z innej strony.
była sobie pewna strona, robiona przez pewną firmę z naszej pewnej grupy. z bliżej mi nieznanych powodów powodów strona ta trafiła do mojej firmy. tu się zaczyna. z racji tego, że używamy c#/asp, w firmie nie było programistów php (a w tymże języku napisana została strona). było dwóch jako-tako znających ten język, projekt trafił do znającego go słabiej i w dodatku odchodzącego za miesiąc z firmy pana W.
W. przez miesiąc nie zrobił prawie nic, a miał do zrobienia dość dużo - miał podzielić serwis tak, aby mógł działać w kilku "instancjach" jednocześnie, coś w rodzaju osobnych wersji dla różnych krajów. po miesiącu nadszedł termin oddania projektu i pewnego poniedziałku mieli zjechać do Warszawy dyrektorzy regionalni ze świtami z całej Polski. kilka dni wcześniej, w okolicach wtorku, okazało się, że pan W. faktycznie prawie nic nie zrobił i że mamy nielichy problem. przez miesiąc project manager nie zauważył, że postępów w projekcie praktycznie nie ma, a było to do przewidzenia, skoro projekt dostał człowiek odchodzący z firmy, któremu nie zależało na zrobieniu go. zostało kilka dni na wdrożenie w projekt drugiego programisty (Z.) oraz na wykonanie i przetestowanie zmian. fizycznie niemal niemożliwe. ale to nic. pan Z. dowiedział się w środę, że jest taki projekt, w czwartek, że jest dość ważny, w piątek trzeba było wykonać krytyczne poprawki w innym systemie i tak oto zostały dwie i pół doby do godziny "0". dopiero w piątek wieczorem kierownictwo oświadczyło Z., że projekt jest krytycznie ważny, a poniedziałkowej prezentacji nie da się odwołać (wykupione miejsca w hotelach, bilety itp). i co? ano, udało się, programista zasuwał ponoć 40h pracy bez przerwy + dwa genialne pomysły account managera (nie potrafiącego programować) + pobłażliwość (wynikła ze zdziwienia) ze strony przybyłych na prezentację, którzy byli święcie przekonani, że nie zdążymy.
to odnośnie "warstwy biznesowej" projektu. ale to nie koniec.
strona działała kosmicznie wolno. kilka-kilkanaście sekund na wygenerowanie strony. po krótkiej analizie okazało się, że z każdej strony do bazy danych leci około 200 zapytań. bardziej wnikliwa analiza wykopała takie kwiatki:

  • chcesz wyświetlić konkurs o danym id? pobierz wszystkie konkursy i w pętli wyświetl ten właściwy (oczywiście bez break - a nuż autoincrement na id konkursu nie zadziała).
  • pobieranie danych do wszystkich możliwych elementów stron, tak jest przecież fajniej, bo można jeden moduł ładujący dane podpiąć pod każdą stronę - a że 3/4 z tych danych jest niepotrzebne to nieważne;
  • załączniki dla newsów? koniecznie dla każdego newsa wyciągane w osobnych zapytaniach, jesli na stronie 10 newsów, to 10 dodatkowych zapytań.
    po odchudzeniu/wyrzuceniu/przepisaniu zapytań udało się zejść do ~25 zapytań per request przy wyłączonym cache'u. ale i tak coś długo się wykonywały, ponad 80% czasu generacji strony. rzut oka na indeksy w bazie danych (może coś się uda podkręcić?) i jedno z większych wtf mojego programistycznego życia: ani jednego indeksu. powinienem to sprawdzić na początku, ale w życiu mi do głowy nie przyszło, że w profesjonalnej skąd-inąd firmie, która wcześniej zajmowała się tworzeniem tego serwisu, mogli tego nie zrobić. godzina pracy i baza danych przyspieszyła 4-krotnie.
    to nie koniec.
    rozbudowana strona, odwiedzana przez kilkanaście osób na sekundę, działająca na jednym serwerze http (w dodatku iis) i napisana w php wymaga jakiegoś systemu buforowania. poprzedni programiści nie wpadli na to, buforowali jedynie niektóre zapytania (z czego część nieprawidłowo - dane w niektórych miejscach odświeżały się dopiero po restarcie serwera). buforowanie na poziomie całej strony (nie dało się zrobić na poziomie pojedyńczych elementów, bo serwis nie jest oparty o żaden framework - doh!) zmniejszyło obciążenie serwera na tyle, że z wyjątkiem sporadycznych peaków strona generowała się w akceptowalnym czasie > 1s.
    warstwa "logiki" biznesowej... żal. jeden plik o rozmiarze 300kB, nawet nie klasy. podział na poszczególne kraje? kopie tego pliku ze zmienioną nazwą, zmienionymi nazwami funkcji (!) i innymi wartościami niektórych zmiennych/stałych.
    została warstwa prezentacji. tabele. w nich tabele, a w nich kolejne, rekordowo chyba siódmy poziom zagnieżdżenia, już nie wiadomo czy wszystkie tabele są pozamkane i która gdzie się kończy, zwłaszcza, jeśli tabelę otwiera się w jednym pliku, a zamyka w drugim. css? no, jest, ale inline jest dużo fajniej przecież, więc i dużo częściej. do tego nazwy klas typu gren_span czy yeloow_header.
    projekt spieprzony jeśli chodzi o bazę danych, warstwę biznesową i prezentacji oraz zarządzanie nim.
    ale nie zapominajmy o przedstawicielu firmy, dla której powstawała ta strona. gościu z innej bajki, niemający pojęcia o tym, co to bugzilla, trac czy mantis, niepotrafiący nie tylko programować, ale nieznający nawet podstaw html (dopiero ostatnio się podszkolił), a zatem nie mający bladego pojęcia, jak to wszystko działa, do tego bardzo chaotyczny i niekonsekwentny. w efekcie kilka razy było tak, że trzeba było kilkadziesiąt minut pracy poświęcić na cofnięcie zmian robionych pół dnia.
    i teraz moim zdaniem najśmieszniejsze: po miesiącu zorientował się, że nie działa system rejestracji nowych użytkowników, po sześciu tygodniach, że nie działa system dodawania komentarzy, i dopiero po półtora roku, że nie działa wysyłanie propozycji piosenek.

wstydzę się tego systemu. programistyczna prostytutka.

cdn.

ps. serwis nie ma serwera deweloperskiego ani acceptance...

// o kurczę, ale cegła wyszła...

0
Koziołek napisał(a)
while (errcd.fetchFrom()) {
	if (true) {
		break;
	}
}
if (1 == 1) {
	return (0);
}
return 0;

parę moich "poprawek" tak wyglądało jak się nie chciało usuwać wcięć i klamerek
dość wygodne, zwłaszcza że obok w komentarzu można sobie dać stary warunek i w razie czego szybko przywrócić
zadziwiająco często dostaję request że jakiś warunek nagle ma być "zawsze prawdziwy" :o

0

wstydzę się tego systemu.

Czego się spodziewać po systemie stworzonym w 60 godzin? ;)

z każdej strony do bazy danych leci około 200 zapytań.
siódmy poziom zagnieżdżenia

To akurat naprawdę niezłe wyniki, powinieneś zgłosić je na jakiś konkurs ;)

// system nie został stworzony w 60 godzin, raczej przez kilka miesięcy. w kilkadziesiąt godzin został głęboko przebudowany - Ł

0

Dzis w pracy: baza otrzymana jako zrzut z systemu produkcyjnego kilenta, by stworzyc nasze oprogramowanie z niej pobierajace czesc danych do swoich obliczen.

Oracle, baza z setkami tysiecy rekordow w kazdej tabeli (czyli srednio), kazdy uzytkownik (nawet nie posiadajacy obiektow) z osobna przestrzenia tabel i schematem. Brak indeksow, kluczy obcych, sekwencji (w zamian max(id) + 1). Brak mozliwosci ingerencji w baze danych (tworzony przez nas system bedzie mial prawo wylacznie do odczytu), a tu zamiast podzapytan czy zlaczen: procedury wbudowane i pakiety.

Wyzwanie: 10 select'ow zlaczonych po kilkunastu tabelach, sredni czas wykonania najszybszego 2,5h na szybkim serwerze produkcyjnym (zaznacze, ze zadanie wsadowe z harmonogramem raz na dwa dni, takze nikt nie czekal specjalnie na wyniki; po prostu po zakonczeniu miesiaca musialy byc dostepne za kazdy dzien). Rozmiar wynikow: 35000 wierszy, 30 kolumn.

Osiagniety cel: 5 select'ow parametryzowanych, czas wykonania najwolniejszego okolo 10 sekund na lokalnej maszynie wirtualnej, wynikow z grubsza 30000 (okazalo sie, ze czesc z zapytan oryginalnie zwracala wiersze, ktorych nie powinna i po stronie klienta byly przed prezentowaniem odfiltrowywane (gdy w jednej z kolumn byl null). Brak wykorzystania jakichkolwiek dodatkowych funkcji z pakietow - wszystko w ladnych (choc bardzo dlugich) zapytaniach.

To jednak nie koniec. Naszym faworytem byl komentarz z skrypcie aktualizacyjnym, dostarczonym przez producenta istniejacego systemu (nie podam z nazwy, ale duza, znana korporacja):

-- This is to ensure the seed data are appended faultlessly / Please do not remove WHERE condition
SELECT [...] WHERE (1 = 2) OR (2 = 3) OR (3 = 4) {i tak wyliczone do 100}
0

Szczawik: pierwszy raz czytajac ten topic zrobilem naprawde 'oczy kobry' o0

0

To dzis ciag dalszy, bo spedzilem kolejne 8 godzin nad ta koszmarna baza danych - istnieje w owej bazie seria widokow, ktorych jedna z kolumn (czasem wiecej), jest wyliczana funkcjami wbudowanymi (ktore jak okazalo sie dzis opieraja sie na duzych zapytania samych w sobie; wyliczanych dla kazdego z wierszy "superzapytania" osobno). Plan wykonania stworzony przez Oracle wykazal TABLE ACCESS(FULL) dla kilkunastu tabel i byl dluzszy od wysokosci mojego monitora (ostatecznie zawiesil SqlDevelopera jeszcze nim wykonalem samo zapytanie). Rezultat optmalizacji: select po trzech tabelach (join) plus podzapytanie, czyli okolo czterech linii SQL. O wydajnosci pisal nie bede... Jak pomysle, ze tworca systemu wzial za niego kwote o jakies zero wieksza niz my zgarniemy za nasz, to az mnie bierze :/

Perelka dnia dzisiejszego: funkcja wbudowana, robiaca dokladnie to samo, co funkcja DECODE (zastanawiam sie, jak ktos potrafil stworzyc paczke funkcji, nie slyszac o podstawowym DECODE czy NVL?!).

0

Szczawik napisz co to za firma albo chociaż co ten program robi :)

0

Napisze co robi (poniewaz z tego co wiem rywalizujemy z nimi obecnie o jakis przetarg, nazwy wymieniac nie chce); a sam program jest na tyle nietypowy jak na ta firme, ze z jego opisu zgadnac nikt nie ma szans raczej.

Program to duza krowa (ok, kod paskudny, UI przeraza, ale program swoje zadanie wykonuje [o zgrozo] prawidlowo). Oferuje funkcje od podstawowych jak inwentaryzacja stanu pol naftowych, ich testow i przegladow technicznych, notowanie ich wskaznikow i przewidywan produkcji na bazie stanu technicznego, po sugerowanie wspolczynnikow produkcyjnych w oparciu o dzialania handlowe. Jak pisalem, na ta firme bardzo nietypowy produkt.

0

znalezione przed minutą (odtwarzacz z portalu zetki):

		private var _auroRweind:Boolean=true; //always true at the moment

uśmiech od ucha do ucha gości na mojej twarzy

2

Pamietam kiedys taki kod w jakims sklepie internetowym:

public function GetDeliveryCost()
{
  return 20; //mialo byc pobierane i konfigurowane w bazie, ale nie bedzie, bo sie klient rozmyslil
}

:D

0

duża firma szczecińska, marketing i reklama ;P

baza danych przeszło 1gb, miło się zawsze od razu robi jak klient zleca optymalizację

kasa, 11k zł
czas 3miesiące
zadanie: zoptymalizowanie, przebudowanie bazy danych i wszystko co z tym związane dalej
użytkownik bazy pobierał dane (dowolny select po tabeli która miała przeszło 700MB) w 7min 15sek

rozwiązanie:
primary key....
czas pracy 5min (??)
czas wykonania zapytania <3 sek

0

@DaVinci: :D pozazdroscic :D

Robie strone dla pewnej firmy. Dostalem kod XHTML i CSS. A tam takie kwiatki typu:

<div style="margin-top: 30px;">
<div style="margin-top: 10px;">

</div>
</div>

Masa bledow walidatora. Niby strona w XHTML, a zamiast CSS uzywane znaczniki . Niektore wartosci atrybutow wziete w cudzyslowia, niektore nie. Itp. itd.

Zaproponowalem przepisanie kodu od poczatku, ale powiedzieli ze jezeli sie wyswietla to jest ok. ;)

0

co jest złego w zagniezdzaniu divów ?? Programuje od niedawna więc po prostu nie wiem :) Chyba ,ze chodzi po prostu o to ,że divy nie są w żadnych klasach ,albo ,że nic w nich nie ma :)

0

że tak nie za bardzo jest sens robić 2 divy z TYLKO margin-top. nie lepiej jest zrobić po prostu 1 ale z większym.

0

niby tak ,ale możliwe ,że autor miał w zamiar w przyszłości zmienic tło dodac border czy co ,a wtedy juz miałoby to sens chyba :)

0

to tak nie patrząc chyba lepiej jak by dał atrybut class co nie?? wygodniej by mu było

0

No dokladnie. Byly dwa divy identyczne z tym co opublikowalem pare postow wyzej. Zadnych atrybutow class, po prostu zamiast dodac wartosci marginesow ktos utworzyl dwa divy ;)

W ogole ktos kto pisal ten kodw wszystko prawie pisal na divach :] Jakby nie bylo innych znacznikow w xHTML...

0

Wlasnie zaliczylem najwieksze WTF z cyklu bledy zglaszane przez klienta. Od miesiaca dostaje wiadomosci, ze czasami po wpisaniu numeru zamowienia wyskakuje blad iz zamowienie nie zostalo znalezione. Od miesiaca odpisuje, iz nie potrafie tego odtworzyc. Dzis <ort>wkoncu </ort>podostawalem screenshoty z danymi jakie trzeba bylo wpisac i sledze nieco skomplikowany proces walidacji przez pol dnia, gdyz oczywiscie dalej nie moge tego odtworzyc.

Sedno sprawy: w query string jest numer firmy z ktora uzytkownik akurat pracuje (tak se ort!). Wpisalem tam inna wartosc i ten jeden raz nie nacisnalem automatycznie entera by odswiezyc strone, tylko wypelnilem reszte pol... i tak! Znalazlem swoj blad ze screenshota! Gdzie query string jest poprawnie wypelniony a zamowienia istniejacego do niego nieznajduje.... no doslownie argh!

A najlepsze w tym jest to, iz za napisanie iz rozwiazaniem jest wcisniecie entera, klient zostanie skasowany z 500 euro.

0

najwyraźniej strona nie jest dostatecznie idioto-odporna. Jednak jak to się mówi, programista próbuje stworzyć coś bardziej doskonałego idioto-odpornego, a bóg tworzy doskonalszych idiotów.

0

Ja miałem wczoraj wft przy kontroli wersji... Napisałem od cholery kodu, puściłem na svn, a jakiś geniusz(któremu się dostanie opieprz w poniedziałek), jakimś cudem walnął w następnej rewizji stary plik i poszło się jechać tak 3/4 funkcjonalności... Chyba ktoś mnie nie słuchał jak mówiłem żeby robić update przed commitem żeby wiedzieć co się dzieje i nie robić syfu na plikach robionych przez innych...

0

To svn w ogóle pozwolił wrzucić coś co nie zostało wcześniej uaktualnione w kopii lokalnej?
Zresztą nawet jeśli, to nic straconego - zawsze można wyciągnąć poprzednią wersję i zrobić undo.

SVN fajnie się zachowuje jak dane w kopii lokalnej rozjadą się z tym co myśli wtyczka SVN do eclipse'a i z tym co jest na serwerze. Np. wtyczka usilnie próbuje wtedy dodawać jakieś pliki, które już są w repozytorium, albo odwrotnie commitować pliki do katalogów, których w repozytorium nie ma. Wygrzebanie się z tego czasem jest bardzo trudne i bolesne (i raz skończyło się świeżym checkoutem całego drzewa).

// SVN wywala wtedy okienko "out of date".. ale 'niektórzy' klikają "Yes, commit" i idzie stara wersja do repo - Deti
0
MarekR22 napisał(a)

najwyraźniej strona nie jest dostatecznie idioto-odporna. Jednak jak to się mówi, programista próbuje stworzyć coś bardziej doskonałego idioto-odpornego, a bóg tworzy doskonalszych idiotów.

Oj akurat tutaj kod strony nie ma nic do rzeczy. Z poziomu strony nie masz dostepu do address bara i uzytkownik moze tam wpisac cokolwiek chce i dopoki nie nacisnie entera to po prostu ten adres nie zostanie odswiezony. Nawet jak odswiezysz strone przez F5 to mozesz miec inny adres a byc na starej stronie. Ale to chyba normalne dla kazdego nas, ze jak chcemy przejsc do innej strony to naciskamy enter po wpisaniu jej adresu?

0
Krolik napisał(a)

To svn w ogóle pozwolił wrzucić coś co nie zostało wcześniej uaktualnione w kopii lokalnej?
Zresztą nawet jeśli, to nic straconego - zawsze można wyciągnąć poprzednią wersję i zrobić undo.

True, ale jak słowo daję, wtf? Teraz jak się spojrzałem jak to głupie robi... ściąga na dysk caaaaałe drzewo do którego ma dostep, kopije pliki, na nich robi, kopiuje z powrotem, commituje a potem robi update caaaałego drzewa... ja pierd... tożto dopiero wtf... chyba parę osób przetrącę w poniedziałek z zasad pracy... poza tym jak ludzie robią w domu to zamiast jak normalni używać normalnego systemu, to oni robią na windowsie i commitują nawet zmiany plików które wyraźnie mówiłem że są dowiązaniami symbolicznymi i będzie ok na każdym systemie, ale nie na windowsie.

Krolik napisał(a)

SVN fajnie się zachowuje jak dane w kopii lokalnej rozjadą się z tym co myśli wtyczka SVN do eclipse'a i z tym co jest na serwerze. Np. wtyczka usilnie próbuje wtedy dodawać jakieś pliki, które już są w repozytorium, albo odwrotnie commitować pliki do katalogów, których w repozytorium nie ma. Wygrzebanie się z tego czasem jest bardzo trudne i bolesne (i raz skończyło się świeżym checkoutem całego drzewa).

Oj true jak nic... na szczęście nie mamy eclipse do bawienia się, ale też się zdarzają jazdy...

Taka ciekawostka, którą odkryłem dziś po południu: im ktoś ma mniejsze praw dostępu do svn tym więcej potrafi spier***ić, 3 pliki na krzyż, a konflikty i tak lecą...

0

Wlasnie mam ciekawe WTF

Pisze do klienta, ze nie moge aplikacji testowac bo VPN wolno dziala... oczywiscie zlew na to i odpowiedz:

That the VPN is slow that's possible, a whole lot of people are watching the tour de france on internet!!

Czyli jak wyglada praca w Holandii ;)

0
this->~NazwaKlasy();

To wczoraj napisal doktor informatyki, zabije go!!!... [diabel]

0

No i? Jakaś metoda, która usuwa obiekt z pamięci (jak został zaalokowany przez malloc czy coś podobnego + placement new) i wtedy ma to prawo bytu.

0

Albo fragment przeciążonego delete. Jak pisałem GC dla C++ to takich bajerów było tam mnóstwo (łącznie z malloc + placement new). Ważne żeby wiedzieć co się robi.

0

Ja widziałem odpowiednik tego w kodzie Javowym - jawnie była wywołana metoda finalize(). Ciekawe czy w przypadku Javy to da się jakoś wytłumaczyć ;)

1

@rnd, da się. Głupotą. Generalnie Metody finalize nie należy implementować, chyba że tworzymy coś w rodzaju siatki bezpieczeństwa mającen na celu zamykanie i zwalnianie zasobów systemowych takich jak porty czy pliki.

0
Fanael napisał(a)

No i? Jakaś metoda, która usuwa obiekt z pamięci (jak został zaalokowany przez malloc czy coś podobnego + placement new) i wtedy ma to prawo bytu.

Krolik napisał(a)

Albo fragment przeciążonego delete. Jak pisałem GC dla C++ to takich bajerów było tam mnóstwo (łącznie z malloc + placement new). Ważne żeby wiedzieć co się robi.

Nie wiem gdzie wy pracujecie albo co robicie ale u nas to maksymalnie moglibyscie sobie poogladac jak wyglada biurowiec z zewnatrz. [rotfl]

0 użytkowników online, w tym zalogowanych: 0, gości: 0