ManoKnyga.lt

Po tūkstančių darbo valandų, įvairiausių derinimų, taisymų ir optimizavimų, šiandien mes pristatome pirmąjį savo projektą ManoKnyga.lt elektroninį knygyną. Apsilankykite, įvertinkite ir pasidalinkite savo mintimis - į viską atsižvelgsime ir panaudosime siekiant užtikrinti maksimalų patogumą vartotojui. Mes savo ruožtu įvertinome kitų svetainių trūkumus ir klaidas ir pristatėme tikrai šaunų projektą. Štai keletas svarbiausių jo privalumų:

  1. Knygas tiekiame/tieksime iš visų leidyklų (Alma littera, Baltos lankos ir t.t.)
  2. Jei norite padovanoti knygą, bet nežinote kokią, tai galite padovanoti dovanų kuponą arba pasisemti idėjų dovanoms
  3. Registruotis prie svetainės reikia tik prieš pildant užsakymą, o krepšelį susikrauti galite ir be registracijos (krepšelio turinys bet kokiu atveju išliks apsilankius kitą kartą)
  4. Siekdami suteikti daugiau informacijos apie knygas pateikiame knygų ištraukas, nuorodas į recenzijas ir kitų vartotojų komentarus

Kadangi tai neturėtų būti vien tik reklama ir visgi tai yra mano asmeninis tinklaraštis, tai papasakosiu apie mano nuveiktus darbus, indėlį į šį projektą ir jo naudą man. Ne paslaptis, kad jam skirdavau daugybę laiko, kuris natūraliai turėjo tekti mokslams ir kitam laisvalaikiui bei projektams (pvz.: BlogAds.lt).

Aš esu programuotojas (taip, oficialiai juo dirbu). Natūralu, kad pagrindinė mano veikla manoknygoje buvo sistemos programavimas. Juokinga, kai visą nuveiktą darbą galima apibūdinti vienu žodžiu („programavau“), nes iš programavimo pusės šis projektas išspaudė iš manęs viską - tiek daug skirtingų užduočių dar niekada neteko atlikti. Viskas be abejo prasidėjo nuo kelių A4 lapų su trumpai Vidmanto aprašyta užduotimi, tačiau jau kuriant sprendimą viskas daug kartų keitėsi, atsirado naujų reikalavimų ir t.t. Pradžioje projektas tikrai neatrodė sudėtingas, bet kai atsirado darbas su nutolusiais serveriais, konkurentų/tiekėjų svetainių automatinis apdorojimas, logiškų sprendimų priėmimas, tai visas PHP projektams būdingas nuobodumas labai labai greitai išgaravo.

Visgi turbūt dar ilgai (mažiausiai pusei metų) nuo tokio dydžio darbų stengsiuosi pailsėti - vienam žmogui sukurti tokią didelę sistemą (apie 20′000 kodo eilučių (neskaičiuojant tuščių eilučių)) yra tikrai sudėtinga tiek fiziškai tiek morališkai. Nežinau kaip aprašyti savo nuveiktą darbą taip, kad tai nenuskambėtų kaip pagyros, tačiau šiuo darbu aš didžiuojuosi taip, kaip nei vienu kitu. Jau miesteliai.lt buvo padarytas labai gerai, tačiau šis projektas padarytas dar geriau, žymiai geriau. Žinoma, man sunku žodžiais apibūdinti tą „gerumą“, kai negaliu parodyti programinio kodo, bet ir iš vartotojo dalies tai puikiai jaučiasi: vien tik „gražios“ nuorodos, didelė sparta ir protingai naudojamas AJAX yra puikūs to atspindžiai.

Kodėl šis projektas yra toks svarbus man? Nes tai vienas iš tokių darbų, kuriuos atlikau taip, kaip man (mums) atrodė geriausia ir juo man ne gėda girtis. Šį projektą būtinai paminėsiu savo CV - jis puikiai įrodo ką moku ir ką galiu. Kol kas jis veikia vos pora dienelių, tai apie pelną kalbėti dar tikrai anksti, bet labai naiviai tikiu, kad jis bus ir visas mūsų darbas nenueis vėjais - įvertinkite ir jūs!

Balandis 18, 2008Darbas vardan idėjos

Idėja

Sekmadienį rašiau apie bendruomenes ir apie tai, kaip žmonės kartu sugeba nuversti kalnus. Akivaizdu, kad žmones link tikslo stumia kažkokia jėga, kažkas tokio, kas yra stipresnis už visas kylančias problemas. Tai - idėja. Kai kas idėjas bando pavogti iš kitų, tačiau šį kartą aš kalbėsiu ne apie pačias idėjas, o apie tai, kaip jos valdo žmones ir kodėl žmonės ne visada dirba dėl pinigų.

Pradėkime nuo tų pačių bendruomenių. Prisiminus jau anksčiau aprašytą kūrėjų bendruomenę ŽaliaŽolė.lt, nesunku pastebėti, kad pagrindinis veiksnys jos susikūrime ir gyvavime yra idėja. Šio projekto idėja buvo sukurti geresnę kūrybos erdvę lietuviams ir jau daugiau kaip tris metus šio projekto dalyviai dirba vien jos vedami. Projektas niekada neturėjo rėmėjų, jis niekada neturėjo pajamų ir tuo labiau nenešė jo prižiūrėtojams pelno. Aš atlikdamas programavimo darbus už tai gaudavau atlygį, tačiau ilgainiui supratau, kad jį imti nėra teisinga - iš kokių lėšų man turi būti mokamas atlyginimas, jei projektas neneša pelno?

Kaip dažnas internetinis projektas, ŽaliaŽolė.lt turi moderatorius, žmones, kurie prižiūri svetainę. Nors per visą gyvavimo laikotarpį jų pasikeitė ne viena dešimtis, tačiau yra išlikę ir tokių, kurie prie projekto dirba jau nuo pat jo įsikūrimo dienos. Galbūt kažkam toks darbas atrodo nelogiškas ir bergždžias, bet jis puikiai pagrindžia darbo vardan idėjos modelį. Moderatoriai negauna jokio atlyginimo, jiems dažnai net ne visi pasako ačiū, tačiau jie labai nuoširdžiai ir atkakliai dirba ir nesibodi skirti net keletą valandų per dieną - žmonės tiesiog dirba ne dėl to, kad tai jiems tai neštų pajamas, nes beveik visi ir taip turi pastovius darbus.

Daugelis mano amžiaus jaunuolių mokosi programuoti įvairiausiomis kalbomis, tačiau tik labai retas iš jų sugeba kažką doro suprogramuoti. Pavyzdžiui jei mokaisi PHP programavimo kalbą (mano atveju), tai tavo pagrindinė darbo sritis bus WEB projektų kūrimas. Labai daug dalykų galima išbandyti savo kompiuteryje adresu http://localhost/, bet mano manymu tik sukūrus keletą veikiančių ir būtinai viešų svetainių galima tikrai išmokti programuoti. Kažkas pradeda kurti beverčius ir beprasmius tinklalapius, o aš nusprendžiau, kad geriausias būdas išmokti gerai programuoti yra realių užsakymų vykdymas.

Savo programuotojo darbą aš irgi galėčiau pavadinti darbu vardan idėjos. Neretai manęs žmonės pradėjo klausinėti kodėl aš dirbu ir ar man ne gaila tiek daug savo laisvalaikio skirti darbui. Atsakymas vienas ir labai paprastas - dirbu, nes man tiesiog patinka kurti ir prižiūrėti projektus. Be abejo aš už darbą gaunu pinigus, tačiau dirbu ne dėl pinigų - nesu nei išrankus nei reiklus, kad man jų reikėtų daug, todėl kol kas visiškai pakanka to, ką gaunu gyvendamas su tėvais. Iš pradžių tikrai kūriau vien tik tam, kad įgaučiau patirties ir pažinčių, tačiau dabar jau dirbu beveik vien dėl malonumo ir tik ten, kur darbo tikslas yra iššauktas idėjos.

Daugelis gali nesutikti ir teigti, kad ne visada idėjos yra svarbios ir kartais tiesiog užtenka elementaraus galutinio produkto, tačiau juk tiek daug tūkstančių garsių ir sėkmingų projektų yra kilę iš idėjos. Tarkime programavimo srityje galima teigti, kad tau nereikia galvoti apie kažką daugiau ir užtenka tiesiog kasdien atidirbti savo valandas, bet juk tokiu atveju per visą gyvenimą nieko įdomaus ir nenuveiksi (tikriausiai). Aš manau, kad jei bent keletą minučių kasdien skirtum pagalvoti apie tai, ką galėtum padaryti kitaip, tai tikrai nesunkiai surastum idėją, kurią norėtum įgyvendinti. Galbūt čia idėja susilies su svajone, tačiau juk kartais taip gera svajoti…

Verslo įkūrimą tikrai galėčiau pavadinti avantiūra. Ir toliau būčiau lankęs pamokas, karts nuo karto atlikęs keletą mažyčių darbelių, tačiau tik pradėjęs dirbti savo pačio įmonėje supratau ką reiškia gyventi įdomiai ir svarbiausia - dirbti taip, kaip dar niekada neteko. Verslo įkūrimas mano gyvenime tikrai padarė didžiulį persilaužimą ir kuo daugiau susitinku su verslu užsiimančiais žmonėmis, tuo labiau įsitikinu, kad labai dažnas verslininkas verslą kuria vedamas idėjos (iki kažkurio pelno milijono). Nors kol kas verslas dar jokių apčiuopiamų rezultatų neatnešė, bet juk tai darbas vardan idėjos.

Šiuolaikiniame pasaulyje tokie dalykai kaip idėja ar mintis dažnai nustumiami į šoną, nes žmonės reikalauja galutinių produktų ir dirba visiškai nemotyvuojami bei monotoniškai. Nemanau, kad visiems dabar reikia mesti savo darbus ir atsiduoti savo idėjų įgyvendinimui, tačiau tikrai tikiu, kad savo idėjas reikia bent pabandyti įgyvendinti (Tomas Edisonas lemputę išrado po dešimčių tūkstančių nesėkmingų bandymų). Gražu, kai gali sau leisti dirbti vardan idėjos.

Klasė

Informatikos pamokos visgi yra naudingos - plačiau susipažįstu su įvairių žmonių programavimo stiliais. Be abejo, turbūt vos vienas kitas iš kelių dešimčių bus programuotojais, tačiau visgi - jie visi yra labai šaunūs ir matyti kaip jie tai daro yra labai linksma ir įdomu. Nenoriu minėti nei vardų, nei pavardžių tų žmonių, kurių stilius ir požiūris čia gali atsispindėti, tačiau primygtinai konstatuoju, kad čia nebus jokio melo ar „varymo“, todėl visą šią informaciją galite priimti kaip bendrinę, o ne orientuotą ties keliais žmonėmis. Šiandien papasakosiu kokius žmones mačiau/matau ir kuo jie yra įdomūs - paskutiniai du informatikos metai yra be galo šaunūs sutiktais žmonėmis ir visokiais darbeliais, kurie buvo atlikti arba ne.

Turbūt taikliausia pradėti nuo tų, kurie programavime nesigaudo. Nesigaudo visiškai. Kadangi mokykloje programuojame Paskaliu, tai labai sėkmingai naudojamės FPS programa, kuri yra labai šauni vienu aspektu - sukūrus naują programą ji automatiškai sukonstruoja „Sveikas, pasauli!“ programėlę. Žinoma, man tai trukdo, tačiau ji labai svarbi pirmajam žmonių tipui. Taigi šie žmonės pasileidžia FPS, išvysta tą elementarią programą ir kokias 5 minutes į ją žiūri (tikriausiai galvoja). Kurį laiką pažiūrėję dar kartą akimis permeta sąlygą ir tada lėtai ir palengva pradeda rašyti programą. Nesvarbu, kad dažnai jiems nepavyksta, bet dirba jie tikrai ramiai - nesinervina kai neišeina ir nepuola ieškoti klaidų. Jie tiesiog bando. Galbūt netgi tiktų palyginimas su Estais, žmonėmis, kurie liaudyje pagarsėję kaip lėti žmonės, nes tokia ramybė ir atsipalaidavimas lėtai sutinkamas - žmonės taip įsitraukia į mąstymą, kad jiems laikas lyg ir sustoja. Tokių žmonių turbūt yra daugiausiai visoje masėje, nes visgi ne visi žmonės suvokia programavimą.

Yra ir labai priešingas šiems žmonėms tipas - tai greituoliai. Gavę programą jie dar gerai neįsiskaitę į sąlygą pradeda rašyti programą. Visai normalu, kad po kurio laiko jie „užstringa“ - programa nesikompiliuoja, o klaidos nesimato. Nesu aš piktas žmogus, tad visada baigęs savo darbus mielai padedu ir kitiems, taigi prisidės prie tokių žmonių kompiuterių dažniausiai pats kurį laiką žiūriu tiesiai į ekraną lyg priklausyčiau pirmajam tipui. Didžiausia šių žmonių problema, kad jie nelabai supranta ką rašo ir dažniausiai jų programos visiškai neatitinka sąlygos keliamų uždavinių. Taip atsitinka dėl to, kad žmonės tiesiog naudoja kažkur girdėtus būdus, pabando pritaikyti keletą ciklų, tačiau realiai jie nesuvokia ką daro, tačiau priešingai nei pirmieji, jie dar ir nelabai galvoja - svarbu kažką prirašyti. Žinoma, pats noras kažką padaryti yra sveikintinas, tačiau jis deja yra aklas, todėl rezultatai retai kada nudžiugina. Grįžtant prie šios grupės - šių žmonių yra mažiau nei pirmojoje grupėje, tačiau visgi jų pasitaiko.

Neminėdamas vardo galiu pasakyti, kad yra vienas žmogus, kuris turi patį keisčiausią mano matytą programavimo stilių ir vertas yra paminėjimo. Žmogus labai šaunus ir protingas, tačiau programuoja be galo neoptimaliai. Gavęs užduotį jis ją išsianalizuoja, sugalvoja kaip daryti ir pradeda rašyti programą. Viskas būtų gerai, jei jis tą programą nors kartą pabandytų sukompiliuoti - labai gerai atsimenu tokį atvejį, kai jis pirmą kartą programą pabandė tik ją baigęs rašyti. Turbūt ne sunku atspėti, kad programa neveikė, jis daug ir ilgai ieškojo problemų, kol galų gale pradėjo lysti daugybė loginių klaidų - skirtingi kintamieji, duomenų tipų aprašai maišosi su kintamaisiais ir t.t. Žodžiu, po ilgų tvarkymų ir taisymų programa visgi pasileido, tačiau laiko buvo sugaišta marios ir jei neklystu, ji veikė nekorektiškai. Paskalis yra labai paprasta kalba, todėl visiškai nereikėtų bijoti ja rašomų programų karts nuo karto išbandyti - tai tikrai tik padės parašyti teisingai, jau vien dėl to, kad labai mažai žmonių iš vis suvokia ką rašo.

Visi kiti žmonės arba dirba padoriai, arba aš jų tiesiog nepastebėjau. Apie savo požiūrį ir darbo stilių turbūt dar kada nors parašysiu, nes į šį įrašą nebenoriu to talpinti vien dėl per didelio teksto kiekio jums. Manau, kad netgi galima čia iššaukti visai įdomią diskusiją - kokių keistų/įdomių žmonių esate matę programuojant. Programuotojai yra programuotojai - jie tikrai vargiai gali kuo nustebinti, tačiau paprastų žmonių algoritmavimo bandymai yra tikrai įdomūs ir verti dėmesio.

Robotas

Vakar pradėjome pažintį su vartotojų sekimu internete. Kol kas vis dar neprieisime prie konkrečių kodo pavyzdžių, nes iki galo visko neišsiaiškinus kodas gali likti neaiškus, o jei jau aš juo noriu pasidalinti su kitais, tai tegu jis turės subjektyviai padorų pagrindimą ir paaiškinimą. Šiandien plačiau nagrinėsime svetainės veiksmų saugojimą ir reitingavimą - vis dar formuosime mūsų duomenų struktūrą, kurią vėliau bus galima efektyviai panaudoti vartotojo pomėgių identifikavimui. Taip pat norėčiau nuraminti visus skaitytojus, kad tokios sistemos dažniausiai kuriamos ne kenkti vartotojams, o svetainėms suteikti interaktyvumo ir vartotojo naršymą padaryti kuo labiau naudingą jam pačiam.

Jei robotą jau apsibrėžėme kaip visiškai nuo konkrečios svetainės atskirtą servisą, tai kaip suderinsime jų veiksmus? Mano pasiūlymas ir pasirinkimas - naudoti svetainių profilius arba kitaip aprašus. Aprašas yra naudingas tuo, kad vienas robotas galės dirbti su keliomis svetainėmis vienu metu, taip pat bus galima lengvai naudoti kelių svetainių sukauptus duomenis, kas automatiškai padidina efektyvumą. Iš esmės aprašas gali būti suformuotas labai įvairiais būdais, tačiau paprasčiausia jį padaryti hierarchinės duomenų struktūros principu arba tiesiog elementariu n-mačiu masyvu. Šiame įraše aprašymą mes naudosime svetainės veiksmų reitingavimui, o tolesnėse dalyse jį praplėsime taip, kad jis galėtų jungti svetaines ir pan.

Vakar nagrinėjome vieną elektroninės parduotuvės nuorodą, todėl ir šį kartą likime prie tos pačios parduotuvės. Paprasčiausia ir efektyviausia yra apsirašyti tik tas svetainės vietas, kurios yra realiai naudingos analizuoti - tai prekių katalogas ir prekės. Pagalbos tekstai, užsakymo apmokėjimas ir panašūs puslapiai yra neverti analizės, nes šie veiksmai nenurodo pirkėjo pomėgių ir interesų. O analizuodami vartotojo veiksmus prekių kataloge ir konkrečiose prekėse mes galime gana nesunkiai nustatyti žmogaus mėgstamas prekes ir net jį dominantį kainų spektrą ar pan. Taigi mūsų testinėje parduotuvėje verta sukurti visų esančių kategorijų ir kainų grupių sąrašus ir juos patalpinti į svetainės aprašą roboto sistemoje.

Aprašo naudojimas mums padės susikurti jau anksčiau minėtą svetainės vietos objekto aprašą. Kaip tai padaroma? Susiejant vartotojo naršomą nuorodą ar atliekamą veiksmą su aprašo dalimis arba tiesiog sudėliojant žymas (angl. tags). Nuorodą http://www.manoparduotuve.lt/index.php?action=category&cat_id=41242 pažymime kaip „kategorija.41242“, o http://www.manoparduotuve.lt/index.php?action=product&cat_id=143 - su „kaina.>100“ ir „kategorija.43565“ žymėmis. Matome, kad antroji nuoroda savyje talpina ne tik produkto informaciją, bet ir loginį sąryšį su kategorija. Mums toks susižymėjimas naudingas tuo, kad norėdami nuspręsti kokio tipo prekės patinka vartotojui mes žiūrėsime ne į lankytas kategorijas, o į visus veiksmus, kurie turi kategorijų žymas.

Toks požymių žymėjimas yra šiek tiek neoptimalus - juk vienas požymis yra vertingesnis už kitą. Siekdami įvesti šiek tiek tvarkos ir efektyvumo, mes suteiksime sąryšiui „svorio“ vertę - kuo didesnė svorio reikšmė, tuo šis sąryšis yra vertingesnis. Vartotojui peržiūrint prekę kategorija yra svarbi, tačiau ne tokia svarbi kaip pati prekės informacija, todėl kategorijos žymai suteikime mažesnę „svorio“ reikšmę nei prekės kainos požymiui. Paprasčiausia „svoriui“ naudoti reikšmes nuo 0 iki 1, kur 1 žymėtų maksimalų atitikimą, o 0 - visišką neatitikimą (nors 0 mes niekada nenaudosime, nes toks požymis yra vertingas tiek pat, kiek ir požymio nebuvimas). Žinoma, tokiam žymėjimui reikia nusistatyti savo vertas įvertinus kiekvieno požymio svarbą jūsų svetainei - laisvė jūsų vaizduotei.

Deja, bet ir požymių „svorio“ pridėjimas nėra efektyvus, nes vienos aplankytos puslapio vietos yra svarbesnės už kitas - nupirkta prekė pasako žymiai daugiau informacijos apie vartotoją, nei jo naršymas. Naršoma yra daug, o nusiperkama vis tiek tik tai, kas iš tikrųjų domina. Todėl svetainės aprašyme sukursime ir specialias konstantas žyminčias svetainės vietų vertę - prekės peržiūrėjimas vertinamas mažiau nei prekės įsidėjimas į krepšelį, kuris tuo tarpu yra vertinamas mažiau nei prekės įsigijimas - tas pats požymis bus skirtingų „svorių“. Akivaizdu, kad atsiranda gana daug niuansų, nes reikia iš anksto numatyti kas yra vertinga, o kas yra ne, tačiau visus veiksmus žymint vienodai bus sunkiau atsirinkti, kurie yra naudingi, o kurie - ne.

Tačiau vertėtų nepamiršti, kad teisingas išvadas galime padaryti tik surinkę daug (labai daug) duomenų, taigi jei vartotojas aplanko vos kelis puslapius per dieną, tai teisingai nuspėti jo norus bus pernelyg sudėtinga. Kaip duomenis apdoroti neprarandant efektyvumo? Būtina nusistatyti ribą, ties kuria vartotojo veikla svetainėje gali būti efektyviai apdorojama. Ribai skaičiuoti mums pravers ir anksčiau apibrėžtas „svoris“ - sudėkime visus vartotojo veiklos svorius ir jei gautoji reikšmė yra didesnė arba lygi nustatytajai - galime pradėti analizę. Kadangi kai kurie veiksmai turės kelis požymis, tai ir jų turima didesnė informacija bus automatiškai įvertinama - juk kiekvienas požymis turės po „svorį“, kuriuos sudėjus gausime didesnę vertę, nei kad vieną požymį teturintis veiksmas.

Šiame straipsnyje pradėjome analizuoti jau nebe nuorodas, o vartotojo veiksmus - mūsų robotas žymėsis ne nuorodas, kurias aplanko vartotojas, o veiksmus kuriuos jis atlieka - peržiūri prekę, ją įsigyja ir t.t. Tokia informacija yra žymiai naudingesnė ir plačiau panaudojama nes kartu su „svorio“ koeficientais ji aprašo veiksmus, kuriuos atlieka vartotojas ir jų loginę reikšmę nustatant vartotojo poreikius. Tolesniuose įrašuose pabandysime sudaryti keletą pavyzdinių duomenų grupių ir atlikti jų analizę, o užbaigsiu pažymėdamas, kad ši straipsnių serija yra daugiau teorino pobūdžio ir aprašytas būdas tikriausiai nebus pats efektyviausias.

Robotas

Kadangi programuoju elektroninę parduotuvę, tai be abejo mano tikslas yra užtikrinti kuo didesnę apyvartą. Vienas įdomiausių ir mistiškiausių būdų yra svetainės interaktyvumo sukūrimas - kaip priversti svetainę reaguoti į vartotojo pomėgius ir siūlyti jam tik tai, kas jam tikėtina, kad patinka? į šį klausimą atsakyti nėra lengva ir tai vis dar labai retai naudojama technologija ypač Lietuvoje, tačiau aš jums pabandysiu papasakoti kaip aš esu suplanavęs vartotojų sekimą (jis dar nėra padarytas, kol kas jį brandinu teoriniame lygmenyje) ir kaip jį gali pabandyti pasidaryti kiekvienas. Šį straipsnį suskaidžiau į keletą dalių, nes vienu ypu viską aprėpti gana sudėtinga - viename įraše apžvelgsiu vis kitą aspektą, kol paskutiniame straipsnyje prieisiu prie konkrečių veikiančių pavyzdžių.

Kas yra vartotojų sekimas? Labai plati frazė, tačiau paprasčiausiai tai suvokti kaip procesą, kurio metu visi vartotojo veiksmai yra išsaugomi ir pagal juos daromos išvados, bei siekiama įtikti vartotojui. Vartotojų seklį pavadinkime robotu, tai leis aiškiau suvokti jo paskirtį - nepastebimai sekti vartotoją ir daryti išvadas vadovaujantis kompiuterio protu. Nors robotas gali skambėti šiek tiek atgrasančiai, tačiau juk pats sekimas ir yra toks procesas - gana iškrypėliškas noras stebėti žmones jiems apie tai nežinant.Be to, robotai tam netgi labiau tinka, nes žmonės jaučiasi laisviau, kai juos stebi ne žmonės - juk prieš kompiuterį žmonės daro viską be jokių kompleksų net nežinodami, kad jie tikrai yra stebimi.

Pirmiausia reikia suvokti, kad mūsų robotas turi veikti visiškai atskirai nuo bet kokios svetainės - jis neturi būti įprogramuotas į svetainę ar elektroninę parduotuvę, nes roboto veikla turi priklausyti tik nuo vartotojo naršymo kitimų ir jo atliekamų veiksmų. Tuo labiau šie dalykai negali dalintis viena duomenų baze, nes ne vien skirtingųjų dalių apkrova bus labai skirtinga, bet ir bus prarandama loginė tvarka. Paprasčiausia tai suvokti kaip du atskirus serverius iš kurių vienas atsakingas už svetainės turinio generavimą, o kitas - už vartotojo veiksmų sekimą. Bet koks roboto tiesioginis surišimas su svetaine nebus naudingas - robotas neturi veikti priklausomai nuo svetainės vidinės struktūros, o sprendimai neturi būti priimami pagal vidinę struktūra - visas procesas turi vykti tik bendraujant tarpusavyje.

Kadangi tokiose kalbose kaip PHP nėra tokio dalyko kaip nuolatos veikiantys serveriai, todėl robotas tebūnie būna servisas. Servisas apibūdins robotą kaip loginį daiktą, kuris pasiekiamas specialiu adresu ir bendrauja jo nustatytomis taisyklėmis. Bendravimui aš rinkčiausi vieną iš XML pagrindų veikiančių protokolų (XMLRPC, SOAP ar pan.), nes jų užklausas ir atsakymus galima labai lengvai apdoroti bet kurioje kalboje ir aplinkoje, be to jie yra lengvai tvarkomi, nes siunčiami pranešimai yra suprantami net žmogui. Plačiau bendravimo nenagrinėsiu nes tai kol kas nėra lemiamas dalykas. Pasiruošimo darbai beveik baigti - dabar atėjo laikas pasižiūrėti kaip patogiai ir gerai dirbti su duomenis.

Jei svetainė suprogramuota teisingai tai ji naudoja Front Controller komponentą, kuris apdoroja visas vartotojo užklausas. Centralizuotas užklausų apdorojimas leidžia lengviau dirbti su vartotojo sekimu, nes darbą su robotu užtenka apsirašyti vos vienoje vietoje ir jis gali būti lengviau kontroliuojamas. Kaip sekti vartotojo veiksmus internete? Išsaugant vartotojo įvedamus duomenis GET ir POST tipuose. Tai galima padaryti labai įvairiais būdais, tačiau ne visi jie yra tinkami. Čia iškart galiu perspėti, kad tokių būdų galima surasti labai įvairių, tačiau aprašysiu tuos, kuriuos mano manymu yra labiausiai tikėtina ir naudinga pasirinkti.

Paprasčiausias būdas yra tiesiog saugoti vartotojo ID, aplankytą nuorodą ir aplankymo datą. Deja, bet tai yra gana prastas sprendimas, nes norint iš išsaugotų duomenų ištraukti bent šiek tiek informacijos juos reikės gana ilgai analizuoti - nuoroda nėra informacijos objektas, nes ją dar reikia paversti į informacijos atitikmenį. Tarkime turime nuorodą http://www.manoparduotuve.lt/index.php?action=category&cat_id=41242, kuri iš pirmo žvilgsnio atrodo aiški, tačiau yra visiškai netinkama analizei, nes neišskaidžius jos į atitinkamus komponentus (['action' => category, 'category_id' => 41242] bus neįmanoma padaryti išvadas apie vartotojo poreikius.

Žymiai geresnis būdas yra saugoti konkretų svetainės vietos atitikmenį arba tiesiog svetainės objekto aprašymą. Duomenų struktūra automatiškai tampa sudėtingesnė, tačiau darbas su jais be galo supaprastėja. Tarkime turime tą pačią nuorodą, kurią minėjau anksčiau, tačiau vietoje jos išsaugome informaciją “Pliušinių meškiukų kategorija” (programiškai tai be abejo būtų aprašyta kaip kažkokia duomenų struktūra ar pan.). Dabar jau net nebereikia analizuoti išsaugotų duomenų - juos apdoroti galime tiesiogiai. Pačios duomenų struktūros irgi dar neaprašinėsiu nes be pilno programos kodo ji būtų bevertė, tačiau galite įsivaizduoti, kad saugoma ne nuoroda, o kompiuteriui suprantamu stiliumi aprašytas svetainės vietos aprašymas.

Šį kartą nusistatėme pradines ribas - loginis roboto atskyrimas nuo svetainės ir duomenų saugojimo būdai. Nors tai dar tik labai mažai informacijos, tačiau to turėtų užtekti susidaryti pradinei nuomonei apie sekimo procesą - tai nėra vien programavimas, o ir teorinis užduoties supratimas. Kaip jau minėjau - pats dar nespėjau visko iki galo įgyvendinti, bet tikriausiai jau kelių mėnesių bėgyje spėsiu išbandyti tokį dalyką realiai ir įsitikinti jo žadama nauda. O jūs ar neišsigandote, kai sužinojote jog internete jus stebi ne tik Google, bet ir kita galybė svetainių?

Žaidimas

Nėra didelė paslaptis, kad aš esu įmonės UAB „Barzda“ akcininkas ir darbuotojas, taigi jau pats laikas papasakoti kaip mes iš mėgėjiškų pomėgių sukūrėme rimtą įmonę. Nors skaičiuojame tik pirmuosius veiklos mėnesius - kol kas verslas man vis dar panašus į šiokį tokį žaidimą. Jau gana ilgą laiką dirbame ties elektroninio knygyno projektu, apie kurį jau esu daugybę kartų rašęs. Projektas bus jau gana greitai baigtas, tačiau šį kartą papasakosiu ne apie jį - šiandien šnekėsiu apie programinę įrangą, kurią mes naudojame/naudosime darbui su klientais ir projektais ir kaip mes siekiame savo užsibrėžtų tikslų.

Mūsų įmonės išskirtinis bruožas - neturime ofiso. Žinoma, tai yra neigiamas bruožas, nes koordinuoti įmonės veiklą tenka telefonu ar elektroniniu paštu, tačiau tai nėra taip blogai kaip gali pasirodyti. Tai nėra blogai, nes mūsų komanda yra labai aiškiai pasiskirsčiusi darbais - aš programuoju, kažkas užsiima pardavimais ir t.t. Toks darbų pasiskirstymas ir kol kas mažas darbuotojų skaičius gelbsti mus nuo papildomų išlaidų ofiso patalpoms, kurios kol kas mus ir taip smarkiai riboja. Ofiso nėra, visi žmonės dirba namuose, todėl labai svarbu, kad visi darbuotojai galėtų dirbti nuotoliniu būdu - internetu. Darbas internetu yra greitas tik tuo atveju, kai internetu yra pasiekiami visi įmonės įrankiai - sąskaitų, darbų paskirstymo (arba TODO) ir bendravimo su klientais sistemos. Pradėti dirbti be jų būtų sudėtinga, nes būtų labai sunku sukontroliuoti įmonės finansus ir atliekamus darbus.

Įdomiausia, kad beveik visus šiuos įrankius mes pasidarėme patys: sąskaitų ir darbų paskirstymo sistemą susiprogramavome, o bendravimui su klientais panaudojome nemokamą įrankį ir jį pritaikėme savo poreikiams. Be abejo, įmonė turi turėti bent vieną gerą programuotoją, kad tokią infrastruktūrą susikurtų pati, tačiau tikrai neverta švaistyti didžiulių sumų super galingoms ir funkcionalioms sistemoms - pradžioje užtenka gana elementarių įrankių, o visą kapitalą galima panaudoti ir svarbesniems dalykams. Tikrai nėra prasmės investuoti į sistemas jei nėra jokio garanto, kad jos pasiteisins - juk darbuotojai turi ir matyti prasmę jomis naudotis. Mes pasidarėme šaunias sistemas ir esame be galo patenkinti, nes dar rimtai nepradėję didelių komercinių projektų jau turime puikią programinės įrangos infrastruktūrą tolimesniems darbams, o ką jau kalbėti apie tai, kad mums tai beveik nekainavo.

Turbūt svarbiausia iš visų sistemų yra sąskaitų sistema. Ją mes pasidarėme gana apgalvotai, nes iš anksto numatėme, kad turėsime ne vieną projektą ir jiems būtinai reikės išrašinėti sąskaitas. Dėl šios priežasties mūsų sąskaitų sistema gali dirbti su neribotu kiekiu projektų vienu metu (užklausų kiekis neturi būti pernelyg didelis), nes yra sukurtas XML-RPC tunelis, kuriuo prie jos gali prisijungti svetainės ir išrašyti, bei kitaip dirbti su sąskaitomis. Be abejo, tunelis yra viešai nepastebimas ir maksimaliai apsaugotas, todėl niekas iš išorės tikriausiai net nesuras kur jis yra - sąskaitos yra tai, kas turėtų būti prieinama tik tiems kas ją išrašė ir tam kam išrašė. Svarbu ir tai, kad tinkamai pasidarius sąskaitų sistemą žymiai supaprastėja ir buhalterinis darbas, nes daugelis veiksmų jau yra optimizuota ir paruošta naudoti. Be to, juk sąskaitos, tai pagrindinė įmonės „valiuta“.

Galimybė iš bet kur dirbti yra tiesiog nuostabi, nes mes nesame prirakinti prie savo darbo vietos, o įgavę šiokį tokį finansinį stabilumą galėsime nesunkiai migruoti į dar rimtesnius įrankius. Žinoma, galima labai daug dalykų palikti tvarkyti žmonėms, bet kam tai daryti jei tam yra kompiuteriai? Mūsų elektroninis knygynas daugybę sprendimų ir veiksmų atliks pats atsižvelgdamas į pirkėjo veiksmus ir jo norus, o mums nereikės įsitempus stebėti ateinančius užsakymus ir skubėti kažką iš kart keisti - viskas vyks dinamiškai ir automatizuotai, todėl įdėjus dar šiek tiek darbo (pradžioje ne viską įjungsime) sistemą galėsime palikti veikti visiškai autonomiškai. Gana keista, kad tokį stambų ir gana sudėtingą projektą mes darome vien nuotoliniu būdu, tačiau tai tik įrodo, kad ir turint mažą pradinį kapitalą galima pasiekti puikių rezultatų.

Šiuo straipsniu aš tikrai neskatinu jūsų pulti kurti įmones, tačiau jei apie tai galvojate, tai nemanykite, kad įmonei būtinas didelis pradinis kapitalas. Taip, pradinis finansinis pagrindas tikrai suteikia laisvės ir jėgos dirbti, tačiau ir neturint didelių pinigų ar tik pereinant nuo mėgėjiškumo iki sąlyginio profesionalumo galima pasiekti tikrai daug. Jei norite, mus galite laikyti kaip „pavyzdį“ - dirbame nuotoliniu būdu, patys pasidarome visus reikalingus įrankius ir puikiai plėtojame pradėtus darbus, ko dar reikia? Žinoma, turėdami didesnį kapitalą darbus galbūt jau būtume baigę, tačiau kuriant savo pirmąjį verslą tikrai įdomu viską išbandyti ir susidėlioti taip, kaip tau patinka. O svarbiausia yra turėti tikslą - nekurkite įmonės tiksliai nežinodami ko siekiate, nes plaukimas pasroviui versle retai būna sėkmingas.

Nežinau ar man pavyko padaryti kažkokią įtaką ir parodyti, kad verslui pradėti nebūtinai reikia daug pinigų. Mano manymu, bet koks informatikos studentas su ekonomikos studento pagalba gali gana sėkmingai susikurti IT įmonės pagrindą. Be abejo, pelnas dar nėra garantuotas, tačiau turint gerus specialistus tikrai galima išsilaikyti rinkoje ir net pasiekti kažko daugiau. Jei jūsų svajonė dirbti sau, kodėl nepabandyti? Mes bandome ir gal net žaidžiame, bet esame tuo patenkinti, nes kol kas viskas juda labai teisinga linkme ir jau kažkur toli toli žybsi sėkmės švieselė. Live the dream sušunku ir linkiu sėkmės, svarbiausia nenustokite tikėję!

Objektai

Vakar vienas mano tinklaraščio skaitytojas pasidžiaugė mano straipsnių apie programavimą gausa ir įdomumu, bei paprašė plačiau papasakoti apie objektinį programavimą ir jo teikiamus privalumus. Kadangi pereiti nuo bet kokio programavimo iki tvarkingo (nebūtinai objektinio) programavimo pradedantiesiems dažnai būna sunku, tai aš pabandysiu paaiškinti kas yra objektas, kodėl programuotojai savo kodą skirsto į objektus ir kaip visą tai galima panaudoti praktikoje. Be to, šis straipsnis nebus visiškai nukreiptas į programuotojus, todėl jis turėtų pasirodyti įdomus ir kitiems, kompiuteriais besidomintiems, skaitytojams - jame nagrinėsiu ne programavimo kalbų subtilybes, o aiškinsiu bendrą objektinio programavimo sampratą.

Kas yra objektas? Į šį klausimą būtina žinoti atsakymą norint suvokti objektinio programavimo esmę. Pradėkime nuo to, kad objektu galima laikyti bet kokį realų ar įsivaizduojamą kūną, pvz.: katę, namą, knygą, mašiną ir t.t. yra objektai. Žinoma programavime objektai dažniausiai atspindi loginį kūną ar duomenų struktūrą, tačiau vis tiek objektai programavime yra panašūs į realaus gyvenimo objektus. Turbūt jums kilo klausimas, o kokia prasmė skirstyti kodą į objektus? Pirmiausia, objektas apibrėžiamas įvairias parametrais, iš kurių svarbiausi yra jo funkcijos arba veiksmai, kuriuos galima atlikti su objektu. Įsivaizduokime realų objektą knygų lentyną, kurią apibrėžėme jos talpa. Su knygų lentyna galime atlikti šiuos veiksmus: įdėti knygą, rasti knygą, paimti rastą knygą, perkelti rastą knygą, suskaičiuoti knygas ir pan. Matome, kad mūsų objektas yra konkretus daiktas, kuris turi keletą parametrų (dydį, spalvą ir pan.) ir apibrėžtus veiksmus, kuriuos galime su juo atlikti.

Objektai visose kalbose apibrėžiami vienodai - klasėmis. Klasė, tai rinkinys funkcijų bei kintamųjų pagal kuriuos ir sukuriamas objektas. Nemažai pradedančiųjų programuotojų galvoja, kad klasė ir yra objektas, tačiau tai nėra tiesa - klasė yra tik objekto struktūros aprašas ir iš vienos klasės galima sukurti neribotą kiekį objektų. Kartais žmonės sutrinka ir dėl to, kad klasė gali būti panaudojama keliems objektams, tačiau tai yra gana aišku, nes juk mes galime naudoti ne vieną knygų lentyną - vietoje pirmajame pavyzdyje naudotos knygų lentynos galime naudoti tris lentynas. Visos trys lentynos gali būti skirtingos, tačiau visų jų funkcionalumas (veiksmai su jomis) bus apibrėžtas vienodai. Taigi galime drąsiai sakyti, kad objektas yra realių kūnų atitikmuo programavime ir kiekvienas objektas apibrėžiamas veiksmais, kuriuos su juo galima atlikti (funkcijos) bei savybėmis (kintamieji).

Programavime objektai naudingi tuo, kad paprastas kintamasis savyje talpina ne tik konkrečią reikšmę, bet ir visą spektrą veiksmų. Jeigu norite suprogramuoti rašytojų paieškos algoritmą, kuris gražina visus rašytojus, kurių vardas atitinka konkrečią reikšmę, tai labiausiai tikėtina, kad rezultatus gražinsite kaip asociatyvų dvimatį masyvą. Toks sprendimas yra pateisinimas ir teisingas, tačiau norint pasiekti maksimalų optimalumą reikėtų gražinti vienmatį masyvą, kuriame kiekvienas rašytojas būtų apibrėžtas ne asociatyviu vienmačiu masyvu, o konkrečiu rašytojo objektu. Jei rezultatus gražinate masyvu, tai norėdami atlikti papildomus veiksmus su rašytojais jūs turėsite dirbti su masyvo reikšmėmis, tačiau jei naudosite objektus, tai su rezultatais galėsite dirbti tiesiogiai. Pasižiūrėkite pavyzdį (PHP):

Funkcinis programavimas

$writers = getWriters(); //Gauname rašytojus


foreach ($writers as $writer)
{
print $writer['first_name'] . $writer['last_name'];
}

Objektinis programavimas

$writers = getWriters(); //Gauname rašytojus


foreach ($writers as $writer)
{
$writer->printName();
}

Antrasis kodas yra geresnis, nes norėdami išvesti rašytojo vardą ir pavardę mes neturime žinoti kokiais masyvo elementais jie žymimi. Programuojant objektiškai mums nebūtina žinoti kaip saugomi duomenys objekto viduje - mums užtenka žinoti funkcijų vardus, kuriais galima iškviesti konkrečius veiksmus. Tai patogu tuo, kad mūsų pavyzdinėje rašytojo klasėje pakeitus rašytojo vardo saugojimo būdą mums nereikės perrašinėti kodo klasės išorėje - visa programa nesikreipia į duomenys tiesiogiai, todėl pakitimai duomenų struktūroje neturės įtakos programos darbui. Žinoma yra dar daug kitų objektinio programavimo pliusų - kodo per-panaudojimas, paveldėjimas, abstrakcijos ir interfeisai, statiniai metodai ir t.t., tačiau mano manymu šiuos dalykus reikia nagrinėti tik tada, kai yra iš esmės suprantama objektinio programavimo prasmė bei tvarka. O be to, labai svarbu, kad objektinis programavimas nėra privalomas ir tai tik vienas iš būdų programuoti, kuris nebūtina yra privalomas ir tai, kad jūs programuojate objektiškai nebūtinai reiškia, kad jūs programuojate gerai.

Be abejo aš tikrai nerodysiu kaip reikia aprašyti klases ar kurti objektus - internete ir knygose yra daugybė pavyzdžių ir pats objekto suprogramavimas nėra sudėtingas suvokiant objektinio programavimo esmę. Kai aš mokiausi programuoti objektiškai, tai turbūt didžiąją dalį laiko praleidau studijuodamas teorinę medžiagą, o ne konkrečios programavimo kalbos subtilybes - aprašyti klasę galima išmokti perskaičius vieną knygos paragrafą, tačiau suvokti objektų prasmę gali pareikalauti žymiai daugiau laiko. Tikiuosi visiems pradedantiesiems šis straipsnis bus naudingas ir informatyvus, o jei kyla klausimų, tai galite drąsiai man rašyti ir aš pasistengsiu atsakyti į visus jūsų klausimus.

Vasaris 12, 2008Pirmasis milijonas

Milijonas

Ne, aš kol kas neuždirbau milijono, tačiau mūsų sukurtas reklamos tinklas jau milijoną kartų parodė reklamą. Tai lyg džiugus ir simbolinis skaičius, tačiau yra nemažai svarbesnių dalykų ir šiokių tokių problemų, kurios kilo trumpo projekto gyvavimo metu. Iš kart siūlau nesidrovėti ir parašyti tiesiai man, jei turite kažkokių pasiūlymų ar idėjų, nes jos visos yra peržiūrimos ir įvertinus jų naudą realizuojamos. Šiandien pabandysiu apžvelgti ir trumpai aprašyti veikimo kryptis ir siekius ateičiai - juk mes nestovime vietoje!

Pirmasis milijonas turi tik 0.8% reklamos efektyvumą, kas tikrai nėra daug. Pagrindinis dalykas, kuris kol kas pristabdo reklamos efektyvumą - reklama matoma tik tinklaraščiuose, todėl retas lankytojas pamato dar nematytą reklamą. Žinoma tinklaraščių savininkai turėtų pasirodyti įdomiais skydeliais, tačiau kadangi nevisi tai sugeba, tai reikia ieškoti būdų kaip reklamos rodymą optimizuoti kitaip. Kadangi vienas iš šio projekto tikslų yra padėti visai blogosferai neužsibūti uždaroje bendruomenėje ir leisti visuomenei sužinoti apie tinklaraščius, tai turbūt realiausia būtų pasiekti keletą dalykų: reklamos rodymą ne tik tinklaraščiuose ir įvairesnės reklamos rodymą. Akivaizdu, kad reklamos bloką patalpinus su tinklaraščiais nesusijusiame tinklalapyje būtų įmanoma pasiekti žymiai didesnį efektą, nes turėtume susilauktume žymiai daugiau naujų lankytojų. Nauji lankytojai ateitų dėl elementarios priežasties - jie dar nebūtų matę reklamos ir kažkas naujo juos tikrai sudomintų. Taip pat optimalu reklamos vietoje rodyti ne tik tinklaraščių reklamą - bet kokia komercinė reklama sudomintų nevieną lankytoją. Kol kas reklama yra pernelyg vienoda ir mažai ką dominanti, bei nevisiškai tinkamai orientuota, todėl permainos yra būtinos - kitaip šis tinklas praras prasmę dėl mažo efektyvumo. Kol kas nėra parinktas konkretus tolesnės veiklos modelis, tačiau greitu metu susidėliosime veiklos planus ir galvosime apie kažką realaus, bei naudingo. Kadangi turime keletą pasiūlymų, tai galbūt sutelkę keletos grupių jėgas pasieksime šaunių rezultatų.

Jau rašiau, kad paskutiniuoju metu buvau nepaprastai daug užimtas, todėl šis projektas buvo paliktas nuošalyje. Situacija jau normalizavosi, todėl galiu grįžti prie šio projekto. Nors nemažai problemų yra jau išspręsta ir pati sistema nuo pačios pirmosios versijos jau skiria gana nemažai - tiek našumo, tiek funkcionalumo atžvilgiu. Šiuo metu planuoju padaryti sistemos tinklaraščių skydelių galeriją, galimybę reklamuotis įvairiems projektams (susijusiems su tinklaraščiais) ir pažymėti, kad sistema yra stabili. Kol kas nežinau kada šie planai bus įgyvendinti, nes ir taip darbų yra galybė, tačiau iki savaitgalio jau turėtų pasirodyti pirmieji patobulinimai. Labai džiaugiuosi tuo, kad kol kas nepasirodė nei viena rimta klaida, todėl galiu pernelyg nesijaudinti dėl autonominio veikimo, be to, optimizavus visą sistemą buvo smarkiai sumažintas kompiuterio išteklių poreikis. Iš tiesų, tai šis projektas turi ir keletą mano asmeninių naudingų dalykų, kurių svarbiausias yra tai, kad aš jame galiu išbandyti dar nebandytus dalykus - didelį užklausų skaičių, maksimalią spartą, optimalumą vs. patogumą ir t.t. Tai lyg smėlio dėžė, kuri man padeda mokytis naujų dalykų, tačiau kartu ir naudinga visiems kitiems savo funkcionalumu. Be to, jau esu suplanavęs kur galėsiu panaudoti keletą gudrių algoritmų, kurių taip niekam nereikia. Nenoriu grįžti prie senos temos, bet greitu laiku parodysiu kaip pasinaudojus puikiais išradimais galima palengvinti sau darbą - nesvarbu, kad tai PHP, kuriai ale nereikia jokių Dijkstrų (naudosiu ne šį algoritmą). Bus įdomu priimti iššūkį iš tų, kurie mano, kad programuojant PHP užtenka tik WEB-orientied dalykų, nes jau ne kartą sakiau - programuojant prireikia daug ko ir papildomos žinios niekad nemaišo.

Darbas vyksta ir šiuo metu viskas darome pagal neegzistuojantį planą ir jokių rimtų problemų nekyla. Dirbame toliau, galvojame kažkokius patobulinimus ir užtikriname sklandų veikimą. Nors nemažai dalykų dar yra tik teoriniame lygmenyje, tačiau juos tikrai įgyvendinsime ir projekto nepaliksime likimo valiai. Labai laukių konstruktyvių komentarų ir nuomonių, nes tikrai tikiu, kad su jūsų įnašu galime pasiekti labai šaunių rezultatų. Nors tai nuskambėjo kaip koks banalus politinės partijos šūkis, bet taip jau yra - mūsų darbas su jūsų įtaka bus tik geresnis.

Voras

Vienas projektas nenumaldomai artėja prie pabaigos, tačiau iki šiol vis dar atsiranda darbų, taigi iki normalaus testavimo dar liko šiek tiek laiko. Visai neseniai sužinojau, kad turi būti galimybė importuoti duomenis iš teikėjų sandėlio turinio sąrašo į mūsų sistemos duomenų bazę. Atrodytų viskas paprasta, tačiau kaip parodė vėlesni bandymai - netvarkingi duomenys sudaro tiek daug problemų, kad be žmogaus patikros su jais dirbti beveik neįmanoma. Kadangi pradinių duomenų kiekis buvo gana didelis, tai pasitelkti žmogiškaisiais ištekliais nebūtų visiškai protinga, todėl nusprendžiau dalį žmogaus darbo perkelti kompiuteriui.

Pradėjau nuo to, kad gavau Excel rinkmeną su 1000 įrašų - gana įspūdingas skaičius, nes visą 1000 prekių reikia įkelti. Blogiausia, kad prekių sąrašas yra sudarytas be jokios padorios tvarkos - panašūs pavadinimai skiriasi tik tarpu, informacijos pateikimo forma ne visada vienoda ir pan. Žinoma, tiekėjai neturi noro surašyti visus prekės parametrus, todėl pateikė tik pavadinimus ir kažkokius neaiškius prekių kodus, kurie beveik neatitiko realybės. Kadangi tiek duomenų yra žymiai per mažai išsamiam prekės aprašymui, tai teko ieškoti būdų kaip gauti papildomos informacijos apie prekes. Vienintelis įmanomas variantas - internetas. Pateiktieji priekių kodai neatitiko jokių duomenų internete, todėl teko pasikliauti prekės pavadinimu. Paieškos sistemoje Google tikrai būtų galima susirasti pačios įvairiausios informacijos apie bet kokią prekę, tačiau informacijos ieškojimas negalėtų būti pavestas kompiuteriui, nes aprašyti reikalingos informacijos ieškojimą svetainės turinyje būtų gana sudėtinga. Labai gerai būtų tam panaudoti žmones(!), tačiau internete surasti 1000 prekių tikriausiai užtruktų keletą savaičių. Nieko kito nebeliko, kaip bandyti panaudoti netikėtai atrastą tiekėjo svetainę. Gaila, tačiau svetainė neturi jokios normalaus katalogo, todėl teko programiškai aprašyti tokią veiksmų seką, kuri žinant prekės pavadinimą suranda išsamesnę informaciją:

  1. Prisijungiame prie tiekėjo svetainės paieškos puslapio
  2. Į paieškos laukelį įvedame prekės pavadinimą
  3. Rezultatuose surandame patį pirmą įrašą (labiausiai tikėtina, kad visada bus tik vienas rezultatas)
  4. Pereiname į įrašo puslapį ir nuskaitome dominančią informaciją

Veiksmai neatrodo sudėtingi, tačiau tai yra gana problematiškas procesas, nes ne tik, kad prireiks 2000 prisijungimų į tiekėjų serverį, tačiau ir įrašo puslapyje reikės tinkamai atsirinkti naudingą informaciją. Kadangi svetainė yra parašyta nesilaikant W3C reikalavimų, tai pasinaudoti DOM galimybėmis tikriausiai nebūtų pavykę, o gaišti laiką bandymams nelabai norėjau. Realiausia buvo kuo daugiau atkurti žmogaus informacijos ieškojimo principą, kuris remiasi tuo, kad informacija randama pagal ją supančius duomenis. Taigi turbūt vienintelis įmanomas variantas - informaciją ieškoti pagal įvairiausius parametrus pačiame html kode. Pavyzdžiui: prekės kainą randame prie „Kaina: X.X Lt.“, prekės nuotrauką randame pagal nuorodos adresą ir t.t. Tiesiog pagrindinis dalykas norint programiškai apdoroti bet kokį dokumentą ar internetinį puslapį - būtinai reikia išsamiai išanalizuoti jo turinį ir atrasti vietas, už kurių galėtų „užsikabinti“ informacijos ieškojimo ciklas. Be to, labai svarbu rasti išskirtinius atvejus, kai standartinėje informacijos pateikimo formoje atsiranda papildomi duomenis, kurie gali iškreipti rezultatus, todėl būtina prieš analizuojant informaciją įvertinti ir jos padėti dokumente. O liūdniausia, kad atakuojamos svetainės autoriai bet kada gali pakeisti svetainės struktūrą ir informacijos ieškojimas nustos veikti.

Tai yra viena įdomiausių paskutiniuoju metu daromų užduočių, nes tiesiog nėra pasirinkimo daryti taip, kaip būtų geriausia ir optimaliausią - tiesiog reikia naudoti tą informaciją, kuri yra pasiekiama, o daugiau informacijos ieškoti itin įdomiais būdais. Nenoriu atskleisti mano „taikinio“ pavadinimo, nes pyktelėję darbuotojai gali užblokuoti mano įrankius ir viską reikėtų daryti iš naujo. Sunku net pasakyti kokia šio įrašo prasmė - galbūt tai vienas iš tų įrašų, kai dalinamasi nestandartine ir galbūt kitiems įdomia asmenine patirtimi. Tikiuosi atradote ką nors naudingo!

Darbas

Programavime yra keli svarbūs dalykai, kurių laikytis yra tiesiog privaloma, tačiau nemažai programuotojų jų nesilaiko vien tik dėl per mažo žinių kiekio. Nežinau kodėl neretas programuotojas neskaito teorinės medžiagos, o tik skuba kuo greičiau daryti veikiančias programas - galbūt tai kyla iš to, kad iš programuotojų beveik visada reikalaujama galutinio produkto, o laiko gilinti žinias ne visada lieka. Labai naiviai tikiuosi, kad žemiau sekančios mintys padarys įtaką bent vienam būsimajam programuotojui ir jis nepuls daryti žemos kokybės programų.

Logiškumas

Kadangi dažnas kodas yra sudarytas iš daugybės tūkstančių eilučių, tai labai svarbu programuoti taip, kad kodas galėtų būti skaitomas lyg knyga ar straipsnis. Nežinau tokios programavimo knygos, jei kas jas vis dar skaito, kuri nepradėtų nuo skatinimo naudoti aiškius ir konkrečius kintamuosius, komentarus ir įvairią kodo įtrauką. Toks patarimas yra brukamas ne veltui, nes tvarkingai parašytas kodas yra žymiai lengviau skaitomas ir suprantamas, o ir pačiam programuotojui vėliau gali kilti problemų vien tik dėl to, kad jis nebe supras ką daro konkreti kodo vieta. Tokie kintamieji, kaip $a, $pn, $sxy, $ty iš esmės nieko nesako, nes pavadinimai nesusieti su jokia logiška reikšme. Juk akivaizdu, kad kintamojo vardas $puslapio_numeris yra žymiai lengviau suvokiamas nei $pn. Tapati situacija ir su funkcijų vardais - asrt(), h() ir panašūs vardai nieko nereiškia, o pavadinus funkcijas ascending_sort() ir heap() paskirtis iškart žinoma. Tiesiog nesistenkite visko darykite kuo sudėtingiau - paprastumas ir tik paprastumas suteikia kodui lengvumo skaitant, o perdėtas visko iškraipymas tik trukdo programuojant. Jei jau neišvengiate sudėtingo kodo tai bent pakomentuokite jo prasmę ir veikimo principą, nes vėliau galite ir nebe suprasti net savo skurto kodo.

Dinamiškumas

Nelanksti programa yra tinkama tik itin konkrečioje situacijoje, kuri iš esmės yra tik apribotas konkretus laiko tarpas. Kuriant programas visada reikia palikti laisvės tobulinimams, keitimams ir modifikacijoms, nes labai dažnai pradinis variantas netinka užsakovui, todėl neišvengiamai reikia atlikti pakeitimus. Dinamiškumas atsiranda naudojant konstantas, konfigūracijos rinkmenas ir kitus parametrų saugojimo būdus. Labai blogas programavimo pavyzdys - skaičius programos kode. Be abejo, be skaičių neišsiverčiama, tačiau juos reikia naudoti tik kaip konstantas arba aiškiai pakomentuoti jų prasmę, nes kai sudėtingame kode atsiranda kažkokie skaičiai, tai jų prasmės nustatymas gali labai ilgai užtrukti. Blogiausia kai programoje atsiranda neaiškūs keliai iki rinkmenų, kurie tikriausiai vedė į programuotojo kompiuteryje esančias rinkmenas, o kliento kompiuteryje juk sistemos rinkmenų struktūra nebūtinai tapati. Labai patogu iš anksto apsirašyti visus naudojamus skaičius ir reikšmes konfigūracijos rinkmenoje arba klasės antraštėje - taip visada žinosite kur ieškoti statiškų reikšmių kilmės šaltinio. Be to, vienoje vietoje surašę parametrus, galėsite lengvai manipuliuoti programos veikimo subtilybėmis.

Funkcionalumas

Labai dažnas užsakovas reikalauja kuo didesnio funkcionalumo, todėl neretai programuotojai jį sukuria „bile, kad veiktų“. Toks atmestinas požiūris gimsta iš to, kad tiesiog sukuriamos funkcijos, kurios veikia tik su konkrečiais duomenimis, o su išskirtiniais atvejais tiesiog nesusitvarko. Man labai patinka toks testavimo būdas, kai pavyzdžiui vietoje puslapio numerio įvedamas tekstas, o vietoje vartotojo vardo - daug tarpų. Programa neturi nulūžti be jokio pranešimo - programa turi patikrinti įvedamus duomenis ir padaryti tinkamas išvadas apie įvestus duomenis ir jei reikia paprašytų juos pataisyti - niekada neverta pasitikėti vartotoju. Neretai programuotojai neįvertina ir duomenų dydžio, ko pasekoje naudoja elementarius algoritmus, kurių sparta siekia net N^2, o įvedus duomenis, kurių N siekia 2^16, tiesiog nulūžta. Žinoma ne visose situacijose verta tikrinti ką įveda vartotojas, tačiau tiesiog būtina rašyti tokius algoritmus, kurie tvarkingai veiktų su visai įmanomais duomenimis - juk tam yra „unit testing“. Nereikia beatodairiškai siekti maksimalaus funkcionalumo - žymiai svarbiau yra užtikrinti, kad programa veiktų tinkamai ir stabiliai.

Solidumas

Paskutinioji dalis turi keisčiausią pavadinimą, nes nežinau kaip pavadinti rašomo kodo „brandą“ ir „svorį“. Programavime reikia taikyti „9 -is kartus pamatuok - 10-ą pjauk“ principą, nes žymiai geresnė kodo kokybė yra pasiekiama idėją subrandinus teoriškai. Neretai tenka net savaitę ieškoti optimalaus algoritmo ar duomenų struktūros, tačiau mąstymo pastangos atsiperka su kaupu, nes atsisėdus rašyti kodo, jis tiesiog vienu prisėdimu parašomas nuo pradžios iki galo. Anksčiau atsisėsdavau prie kodo rengyklės ir vis bandydavau įvairius sprendimus, tačiau ilgainiui pastebėjau, kad tai yra beprasmiška, nes iki galo nesugalvotas algoritmas yra žymiai ilgiau rašomas, nei prieš tai sugalvotas vien tik dėl to, kad programuojant reikia įvertinti ir kalbos subtilybes, kas neretai atima nemažai laiko. Tai patarimas, kuris ne vienam gali nepatikti vien dėl įpratimo, tačiau mano manymu geriau neskubėti - teisingi sprendimai gali pareikalauti nemažai laiko, bet jie bus iki galo teisingi ir optimalūs, nei atmestinai ir nepamąsčius suręstas kodas. Blogiausia, kai paskubomis padarytas kodas taip ir lieka nesutvarkytas, o jame atrastos klaidos tampa sunkiai ištaisomos.

Tai dar vienas straipsnis labiau orientuotas į pradedančiuosius, nes labai tikiuosi, kad Lietuvos profesionalūs programuotojai dirba tinkamai. Nemanykite, kad teorinės žinios yra bevertės ir praktinė patirtis yra žymiai svarbesnė - be gero teorinio pagrindo, jūsų patirtis ir žinios visada liks tik paviršutiniškos; nemanykite, kad pirmieji knygų skyriai parašyti be reikalo ir juos galima tiesiog praversti. Galiu patikinti iš savo patirties, kad išmokus daugybę dalykų teoriniame lygmenyje, programos rašosi žymiai lengviau, nes daug kas tiesiog tampa natūralu ir nereikia leisti valandų analizuojant kaskur „ateina“ ir kodėl būtent false. Sėkmės!


© 2008 Juozo Kaziukėno blogas | TextNData dizainas | Wordpress variklis