← Uz sākumu

The lifely WTF

2011. gada 5. aprīlī, 33 komentāri

Laiku pa laikam manās rokās nonāk kāds PHP projektiņš, kuram vajag pieķibināt "a" vai salabot "b". Pieredze rāda, ka vislielākās šausmas un sliktus sapņus rada kā reizi legacy projekti, kurus kāds par mazām naudām noalgots students programmētājs - mīlētājs ir veidojis pa naktīm. Skatījos pirmās koda lapas un parāva nostaļģija - kaut ko līdzīgu es rakstīju tālajā 2000/2001. gadā. Bet tā bija tikai mirkļa vājība, jo patiesībā tik traki man nav bijis.

Sāksim ar labo. Cilvēks caurmērā ir bijis pieklājīgs. Konsekventi visos SQL vaicājumos Select tiek rakstīts ar lielo burtu. Tas pats ir arī ar parasti par HTML vienpatni un atstumto uzskatīto <Br> Tas arī ir ar pirmo lielo.

Kodā, kā jau nojautāt, ir diezgan daudz SQL vaicājumu. Lielākā daļa no tiem ir vienā rindiņā. Pat tad, ja tā garums ir 400 simboli. Tukšņus un tabulācijas taustiņus, pie tam, viņš ir rūpīgi taupījis. Tas ir secināms ne tikai no tā, ka pirms un aiz operatoriem, piešķiršanas (=), aiz komatiem, un citur nepastāv nekādas tukšuma pazīmes. Kodā nav novērojamas arī atkāpju paliekas. Pat sestā līmeņa foreach cikls sākas ar kreiso malu.

Turpinājumā pats sākums. Man bija nepieciešams noskaidrot, kā saite no sērijas “index.php?&s=1&s2=2&s3=3&s4=4” tiek apstrādāta, lai gala rezultātā man parādītu vajadzīgo sadaļu. Sākumā tiek savāktas vērtības (ar kļūdu apstrādes atslēgšanu!) @$s = $_GET['s']. Pēc tam pēc dažādām ifošanām (if (!$s1) $s1 = 15; if (!$s2) $s2 = $s1;) un maldīšanās pa sešām dažādām inklūdēm, tiek noskaidrots, ka galu galā svarīgākais notiek pa vidu, kur $q1 = $s2; $q2 = $s1;, kas pēc tam tiek include("mod/$s1.php").

Taču, vissmalkākais OMGWTF gājiens mani gaidīja iekš “mysql.php”. Te es iemetīšu daļu no koda, jo tas nav izstāstāms. Formatējums ir saglabāts.

ob_start();
$db =&DB::connect($DSN,
array('debug'=> 2,'portability' => DB_PORTABILITY_ALL));
if (PEAR::isError($sysdb)) {    $error=$db ->getMessage(); } else {
$db->setFetchMode(DB_FETCHMODE_ASSOC);
$db->query("Set names 'utf8';");}
echo "<script>alert('@$error');";
if (!@$error) {ob_end_clean; } else {
ob_end_flush();}

Un, saprotiet, viss kods šādā stilā. Projekts nav maziņš (bet nav arī nekāds lielais). Projektam ir pat dokumentācija, kas patiesībā ir lietotāja rokasgrāmata, un kuras autors nav koda autors. .

Vēl jāpiebilst, ka visa tā padarīšana ir kodēta ar Zend Guard. Velti tērēta nauda. To kodu tāpat nav iespējams saprast.

Tīri tehniski tas viss projekts darbojas nu jau sešus gadus. To diendienā aktīvi lieto normāla čupiņa ar cilvēkiem. Tas liecina, ka viss nema nav tik ļauni, kā varētu šķist no koda apskates. Diemžēl, neskatoties uz to, ka piekļuve ir tikai no uzņēmuma iekšpuses, aplikācijas autorizācija darbojas ar veco labo ' or 1 = 1 or '...

Es pats esmu rakstījis šausmu lietas savās dienās. Un, domāju (ceru), ka šo projektu rakstījušais (vai rakstījušie) pašlaik to dara kvalitatīvi, pārdomāti un saprotami. Uzrakstīju šo ierakstu nevis ar mērķi paņirgāties par kāda spējām vai to trūkumu, bet gan tāpēc, ka tik daudz WTFs/min man nebija bijuši nekad. Un galu galā, mēs visi esam kādreiz sākuši. Un mums patīk laiku pa laikam par to pareflektēt.

Tu atbildi augstāk redzamajam komentāram. Atcelt

Gravatar Endijs Lisovskis

2011. gada 5. aprīlī, plkst. 01:42

Paldies par ierakstu! Ja esam pret sevi un citiem godīgi, tad stipri lielākā daļa savus pirmos kodus (un pat ne pirmos) esam sākuši rakstīt WTF manierē. Tajos kodos ir salikts miksējums no "nedaudz iemācījos" + "nedaudz copy & paste no citu skriptiem bez sajēgas kā tas īsti strādā" + "daudz murgu". Līdz netiekam līdz brīdim, kad esam redzējuši daudzus citus (turklāt smukus kodus), īsti uz skaistu risinājumu cerēt nevajag. Piemēram, es pat jau esot ar it kā zināmu pieredzi rakstīju "brīnumus", kad tiku pie tādas sarežģītības uzdevumiem, kuri iepriekš nav veikti. T.i. - programmētājs var pāris gadus var darīt vienveidīgu darbu, bet tad tikt pie tāda koncepta, kurš viņa prātam ir jauns. Un tad pat programmētājs it kā ar pieredzi sataisa tādus brīnumus kā iesācējs. Protams, ar laiku jau tas uzlabojas un var tikt galā ar teju jebkādas sarežģītības uzdevumu. Taču paradokss - pēc pāris gadiem atskatoties atkal liksies, ka varēja taču labāk. :)

btw - runājot par formatējumu - normālas IDEs māk taču forši kodu pašas saformatēt. Bet miskējumi ar mainīgajiem ir jautri. Tādos brīžos nāk talkā refactoring + debugger. Laiks gan tiek zaudēts pamatīgs, bet citreiz šādos gadījumos citādāk nemaz nevar. Kas attiecas uz to MySQL gabalu - esmu pat gatavs saderēt uz vienu Tērvetes alu, ka to autors bija paņēmis no kāda gatava skripta (vai pamācības) un tad licis visur kur vajag un nevajag.

Gravatar Endijs Lisovskis

2011. gada 5. aprīlī, plkst. 01:47

Kaut gan šādiem brīnumiem es pat nevaru izdomāt pamatojumu: @$s = $_GET['s']; Kādam ir ideja kāda doma varētu būt slēpusies, lai autors būtu izmantojis @ ? Saprotu include kļūdu, saprotu nejēdzīgo formatējumu, saprotu tango ar mainīgajiem, bet šādas lietas nesaprotu.

Gravatar BigUgga

2011. gada 5. aprīlī, plkst. 03:03

Nu gan jau jamam kādā brīdī E_NOTICEs rādījās, tāpē piemeta @ sākumā :D

Man ar šad-tad sanāk paņemt pa kādam šādam darbam. No sākuma domāju, ka nobeigšos, bet nekas - pēc pāris reizītēm jau tīri vai iepatikās zin. Lēnām refaktorējam, izmetam visu lieko. Nav nekādas vainas. Ja izmaiņas ir paredzētas diktām lielas, tad galvenais te pasūtītājam izstāstīt, ka vispirms kods tiks savests kārtībā un pa pirmo honorāru nekādas izmaiņas "uz aci" nebūs manāmas.

Gravatar faq

2011. gada 5. aprīlī, plkst. 06:43

Hehe, šis vēl ir fufelis. Ja tiktu pie mana 03 gadā rakstītajiem brīnumiem. Dažkārt kāds palūdz kautko pielikt klāt, tad man šķiet ka ātrāk būtu pārrakstīt pa jaunu. Bet par to nemaksās. Tākā nākas vien iesācēja proceduālai čerņai atkal braukt cauri. Bet par tabiem. Ir tak pilns ar formatētājiem. (PS. O, Operā man spellchekeris sācis darboties.)

Gravatar jo

2011. gada 5. aprīlī, plkst. 08:34

Ja būtu kaut neliela sajēga par php varētu ierēkt.

Gravatar laacz Autors

2011. gada 5. aprīlī, plkst. 08:42

faq, starp citu, common mistake. Tas, ka Tev nemaksā, lai refaktorētu kodu, nenozīmē, ka nav jēgas to pārrakstīt. Tāpēc, ka, ja projekts ir ilgtermiņa, daudz labāk ir to lēnā garā (ieteratīvi) pārrakstīt, lai pašam būtu mazāk jātnes vēlāk.

Un procedurālajai programmēšanai nav ne vainas, ja to pareizi izmanto :)

Gravatar Ingus

2011. gada 5. aprīlī, plkst. 10:21

Katram ir bijis kāds pirmais darbs. Es savu pirmo algoto darbu būvēju ap 2002. gadu. Viņš vēl joprojām tiek intensīvi izmantots un ir pilnībā funkcionējošs. Pie tam cik zinu, tad neviens tur arī neko nav labojis, tik cik pats pāris reizes esmu minimālas izmaiņas veicis, lai viss korekti strādātu uz jaunākām PHP versijām (sākotnēji tas bija kaut kāds 4.2, tad 4.3, tagad jau darbojas pat uz 5.3).

Tik traģiski, kā šis gan tas pilnīgi noteikti neizskatās, bet WTFs/min rezultāts gan varētu būt visai augsts. No otras puses - ja tas strādā un cilvēki ir apmierināti, tad varbūt stresam nav pamata? :)

Gravatar Papuass

2011. gada 5. aprīlī, plkst. 10:25

Kas domāts ar "lifely"?

Kur problēma iebarot Eclipse vai jebkuram citam redaktoram un palaist koda formatēšanu? Man arī bija kolēģis, kuram nebija izpratnes par to, cik lasāmāku kodu padara atkāpju lietošana.

Par pārējo - jā šajā profesijā strādā cilvēki, kuri raksta sliktu kodu. Un ļoti bieži rodas visādi brīnumi. Te man viena pieredze ar to bija: http://aiz.miga.lv/2007/01/26/dienas-pistne

Gravatar laacz Autors

2011. gada 5. aprīlī, plkst. 10:34

Papuas, lifely kā variācija par tēmu "daily", kas, savukārt, kā zināms, ir no http://thedailywtf.com/

Gravatar vbz

2011. gada 5. aprīlī, plkst. 10:57

Parasti šāds kods rodas, ja pirmā ir php programmēšanas valoda. Bet problēma ir aktuāla. Personīgi nesen saskāros ar projektu, kur uz šitādiem puņķiem vajadzēja pielikt klāt internet veikalu. 2. nedēļas nomocījos, kamēr klients pārtrauca saistības. Tika teikts, ka kods ir galīgi crazy, tas nepalīdzēja - termiņš, termiņš un izpildes laiks. Drusku žēl pazaudētā laika, bet no otras puses, lai tur mokās kāds students tālāk. Es pat nezinu, kā šitādās situācijās darīt - ok, var pateikt, ka nē, es nevaru uzņemties šādu projektu, jo laika nav, nav pieredzes utt., proti, melot par sliktu sev. Ja slikts projekta vadītājs, tad automātiski piefiksē pie sevīm, nu tas nav profesionālis, bet kaut kāds čaiņiks. Ok, lai tā domā. Bez darba nekad neesmu palicis :)

Gravatar laacz Autors

2011. gada 5. aprīlī, plkst. 11:07

vbz, cēlonis attiecību pārtrūkšanai starp klientu un izpildītāju Tavā gadījumā nebija sliktais kods, bet gan Tava nespēja ievērot termiņus. Kodu jau Tu neieraudzīji 2 dienas pirms nodošanas, ne? :)

Un kāpēc Tev jāmelo? Pasaki - kods tāds un tāds, saprašanas izmaksas tādas un tādas, kopā viss maksās tik un tik. Bet par to "tik un tik" pasūtītājs dabūs ne tikai prasītās izmaiņas, bet arī atbilstošās daļas vecajā kodā pārtaisītas pa smuko, lai vēlāk jebkādas citas izmaiņas sanāktu lētāk.

Gravatar Juris

2011. gada 5. aprīlī, plkst. 11:15

Par šo tēmu runājot, man kā hobby-level PHP koda bakstītājam jautājums - varbūt ir kāds labs PHP vai globāls " best practice" gabals kādam iesakāms, kur īsi un konkrēti būtu pateikt kā un kāpēc vajag/nevajag rakstīt? Googlē meklējos un daudzus atradu, bet nu nopirmajām rezultātu lapām neviens īsti nepārliecināja..

Gravatar vbz

2011. gada 5. aprīlī, plkst. 12:15

"saprašanas izmaksas". Labi, es apskatījos to kodu pirms tam, bet pavirši. Kapēc man pēdējā laikā liekas, ka php programmētājs Latvijā ir sviestmaizes cenā. Nevar pašlaik pierēķināt klāt tās saprašanas izmaksas, zaudēsi projektu, jo izcenojums par lielu. Es vairāk neņemu tādus projektus, 10000-iem citu gaida rindā. IT jomā pašlaik pieprasījums ir krietni lielāks par piedāvājumu. Otra lieta, ka izstrādes termiņi ir katastrofāli mazi vienmēr (subjektīvi) un te jau jārunā par ekstrēmo programmēšanu. Taisu vienam un tikai vienam projektam kodu - ātri, unikāli un nedomājot, kura tur klase, vai funkcija sāk dubultoties. Tas ir konveijers pašlaik programmēt interneta aplikāciju, nav vairs 2000.gads, kad varēja filozofēt - šo labāk uz db puses, šo labāk apstrādāt php pusē, šeit viena funkcija rekursīva, šeit ciklā nevajadzētu pieprasījumus veikt vai "ifot" utt. Tas ir skumīgi, programmēšana savā būtībā ir māksla, radošs process. Lai nopelnītu šodien ar interneta programmēšanu, Tev ir jāstāv pie tā konveijera.

Gravatar Fricis

2011. gada 5. aprīlī, plkst. 12:31

Tā tas notiek, ja kodētājs visu dara pats. Un pat ja viņš ir zinošs, varošs, pieredzējis, utt, varu apgalvot, ka arī tad visticamāk pastāvēs veids kā viņa brīnumdarbu nolikt uz ausīm.. Tapēc jau pasāv t.s. "frameworks", "communities", utt utjp. Piemēram šī lapa - būvēta visticamāk uz Wordpress, un tā ir puslīdz garantija, ka tajā nav vienkārša drošības cauruma. (ja vien nav kaut kā paškodēta) Bet ir ļoti daudz tādas lapas, kas ir kodētas pilnīgākajā "freestailā" - un tās visas ir cauras. Pat ja ir saprātīgi programmēts, tad piemēra pēc pietiek DB lietotājam būt dbowner statusā, jeb arī vienu neapstrādātu GET vai POST mainīgo, lai riskus kā minimums desmitkāršotu..

Gravatar laacz Autors

2011. gada 5. aprīlī, plkst. 12:32

vbz, nepiekritīšu. Tas prasās pēc izvērstāka skaidrojuma, bet pašlaik man tam, diemžēl, nav laika. Padomā ir viens raksts, kurš varbūt tieši skaidrojumu par imagināro konveijerbūšanu nesniegs, taču pāris ieteikumi vācelītē ir. Pacentīšos kaut kad uzrakstīt.

Gravatar faq

2011. gada 5. aprīlī, plkst. 12:40

Laacz, es zinu kur nepieciešams izmantot ko. Bet atvaino, penteris uz 12k rindiņām tagadējai saprašanai man nepakļaujas. Es pat nevaru iedomāties kā to varēju dabūt gatavu. Laigan toreiz tās bija pirmās php4 versijas, šķiet, ka 4.2. Tad kad tā pajebeņa ar register_globals panesās. Es zaļš gurķis tikko no stroikas izlīdis paņemu projektu. Bet jāatdzīst. Šams vēlarvien strādā. Nācās implantēt jūserus, sms šitu un pēdējas limitētu ajaxiņu šādām tādām fīčām. Bet engine strādā jau 9 gadus. Ja tā padomā, īsti pat neticās.

Gravatar Interesents

2011. gada 5. aprīlī, plkst. 14:27

saprotu ka tas ir privāts blogs. bet būtu patīkamāk kad svešvārdi būtu kā hyperlinki lai varētu ieguglēt kas tas ir un parko iet runa :) piemēram: {legacy}

Gravatar laacz Autors

2011. gada 5. aprīlī, plkst. 14:46

Interesent, Tu iedomājies, kā izskatīsies mans blogs, ja visus šitos žargonisms, svešvārdus un jaundarinājumus aprīkošu ar linkiem? :)

Gravatar kt315b

2011. gada 5. aprīlī, plkst. 14:56

Pasaki – kods tāds un tāds, saprašanas izmaksas tādas un tādas, kopā viss maksās tik un tik. Bet par to “tik un tik” pasūtītājs dabūs ne tikai prasītās izmaiņas, bet arī atbilstošās daļas vecajā kodā pārtaisītas pa smuko, lai vēlāk jebkādas citas izmaiņas sanāktu lētāk.

Paklau, ne jau visi ir gatavi ar tējkaroti izstrēbt atejas bedri, pat gadījumā, ja tas tiek adekvāti apmaksāts...

Gravatar e-remit

2011. gada 5. aprīlī, plkst. 16:40

Ir jau dažkārt brīnumi no koderiem, kuri ne pirmo dienu strādā, bet nu cenšas visu izdarīt pēc iespējas vienkāršāk. Nu kur vēl daiļāk: http://paste.php.lv/0388ed6bf23b8014e43abe5dbe53329a?lang=php

Gravatar Dindālis

2011. gada 5. aprīlī, plkst. 17:44

Ar nepacietību gaidu Laacz izvērsto skaidrojumu. Jo vairāk tādēļ, ka tas rosina diskusijas, un latviešu valodā par šo tēmu ir maz informācijas.

Gravatar djhurio

2011. gada 5. aprīlī, plkst. 18:18

@Interesents. Uz interesējošā vārda viens kreisais dubultklikšķis (select word) un vien labais un ir Tev izvēlne "Search Google for ..." - tas zem FF, par citiem browseriem nezinu. Kopā viens kreisais dubultklikšķis, vien labais un viens kreisais klikšķis ;)

Gravatar j

2011. gada 5. aprīlī, plkst. 19:07

"nebija bijuši nekad" - arī labs koda paraugs :D

Gravatar xxx2

2011. gada 5. aprīlī, plkst. 21:17

Man arī tagad nākas pārtaisīt vienu delphi veidotu datu bāzi.... Kaut gan programmēju šajā vidē gadus 10, tomēr tādus "brīnumus" nebija gadījies ieraudzīt.

Nerunāšu jau par to, ka DB struktūra pilnīgā pakaļā, piemēram ntajās tabulās dublējas viena un tā pati informācija, kas ir novedis pie pretrunīgas informācijas db - ja lasām datus no vienas tabulas iegūstam vienu rezultātu, ja lasām no citas - pilnīgi citu. Un neviens vairs nezin kurā tabulā ir pareizie dati.

Arī GUI kods nav labāks - cilvēks ir bijis centīgs - tā vietā lai izmatotu kādu TDataSet pēcteci un datubāzes vizuālos kontroļus, kurus var pa taisno pie laukiem piesaistīt, tiek izmantoti parastie Teditbox kuri tiek ar kodu aizpildīti, un viņiem eventā onChange tiek izsaukts sql pieprasījums kurš nomaina konkrēto lauku DB....... Jā - līdz kaut kam tādam ir jāizdomājas!

(Nu par tādām "mistiskām" lietām kā saprotami mainīgo nosaukumi vai kaut viens komentārs kodā nemaz nerunāšu....)

Protams ka nepareizi novērtēju darba apjomu lai šajā brīnumā ieviestu nelielu izmaiņu. Bet manā gadījumā pasūtītājs gadījās saprotošs - gaida pagaidām. Skaidrs ka uz naudām esmu ielidojis - darba apjoms vismaz 3x lielāks kā paredzēju, kaut paredzēju ar lielu rezervi.

Gravatar ragulops

2011. gada 5. aprīlī, plkst. 23:03

Nedaudz ne pa tēmu - nez kāpēc daži dižie koderi iedomājas, ka viņu kods ir ģeniāls un tāpēc obligāti aizšifrējams. Nesen nācās mocīties ar atšifrēsanu, lai tikai dabūtu DB paroli.

Gravatar laacz Autors

2011. gada 5. aprīlī, plkst. 23:04

ragulop, DB paroli var dabūt arī ķerot IP trafiku. Ātrāk un vienkāršāk.

Gravatar BlackHalt

2011. gada 5. aprīlī, plkst. 23:06

Es vēl tagad tā kodēju! Un ko tu man padarīsi? OOP vari iebāzt, ja vien neesi man saprotami iepriekš uzkodējis klasi un tā. Redzi, Eģik, dažreiz tā nākas kodēt! PHP3 tā darīja. Ja kods strādā, tad man nav jāpārkodē viss, ko uberalessuper koderis ir izdomājis pārkodēt. Pats padomā pirms smieties, kā es par eģikiem.

Gravatar HIGH-Zen

2011. gada 7. aprīlī, plkst. 11:21

Īsts koderis nekautrēsies izmantot par mainīgo arī ķeburus, kas radušies noslaukot alu no klavieres. Un par formatējumu un citām figņām - tā kunga ceļi ir neizdibināmi, bet galvenais, ka darbojas.

Gravatar GG

2011. gada 8. aprīlī, plkst. 23:53

Uzzināju jaunu vārdu Tuksnis, kādas 10 minūtes dziedāju pēc tam skaidroju 5-gadīgajai meitai kas ir tuksnis, viņs smējās.

Gravatar Mr.Key

2011. gada 13. aprīlī, plkst. 21:51

Profesionālis, ja viņu palīdz pieķibināt, viņš pieķibinās, nevis taisīs rewrite + refactoring.

Zobuārsts taču labo zobus tādus, kādi viņi ir, nevis bez maksas taisīs visu zobu transplantāciju, jo tad viņam būs vieglāk.

Gravatar Zorge

2011. gada 15. aprīlī, plkst. 14:21

Strādāju IT izstrādēs ļoti sen, daudz daudz projektu, pielikumsofts+web. Ne komandas :) Tad lūk - nevar uzrakstīt projektu ar skaistu kodu no pirmā piegājiena. Neiešu strīdēties - nevar. Precīzāk var, bet tie ir tādi ar kuriem ņemties neinteresanti un nav innovatīvi vai arī viss jau sen izdomāts un uzrakstīts. Ja jāsāk kāda problēma, kur vajadzīga IT sistēma kā ideja - no sākuma ir strādājošs prototips, AR BRIESMĪGU kodu un kļūdām. Jācenšas rakstīt bez fundamentālām kļūdām, ar to grēko 90% man zināmo programmētāju-viņš piesiesies pie kāda @$s=$_GET['s'];, bet nepamanīs pie kādiem noteiktiem nosacījumiem nebeidzamo ciklu vai injekcijas iespēju. Diemžēl tāda ir lielākā daļa mūsu programmētāju, viņi fano par viduvējas sarežģītības projektiem (augstāk nevelk :)), izceļ koda kvalitāti virs fundamentālām idejām un beigās tie negadījumi tāpēc arī ir tik daudz pie lielāku sistēmu ieviešanām vai interneta vietnēm. Man ir radusies pārliecība (pieredze ~18 gadi, no Mikrošas laikiem) ka sistēmai labāk ir strādājošs prototips ar nelasāmu nebaudāmu kodu (bet strādājošs) nekā izlaizīta koda fundamentāli kraši. Kodu, ja pasūtītājs maksā, var pārrakstīt jebkad vai jebkas, bet sistēmu uzbūvēt no nulles apejot sliktā koda stadiju nevar.

Gravatar Zorge

2011. gada 15. aprīlī, plkst. 14:25

Vēl pie iepriekšējā gribēju piebilst, ka php gadījumā bieži speciāli strādājošu atstāju kodu, kuru tikai pats izprotu. Tas ir oponējot teicienam, ka nav neaizvietojamu cilvēku :))) Viņam nav jābūt neloģiskam, bet drusku nesaprotamības piedos materiālu vēr'tibu tavam darbam