Подход

Програмистските блогове са за споделяне на опит. И като притежател на такива (блог и опит) ми идe отвътре да споделя малко. Искам да пробвам нещо – ще разкажа подробно за проблем от работата ми и как го решавам. Не мисля да навлизам в технически детайли, а да илюстрирам моя подход. Демек ми е интересно как другите хора от занаята работят и съответно може на тях да им е интересно как аз работя.

Не съм сигурен какво ще излезе, така че при неуспех ще трябва да потърпите (или просто да не четете). Но в случай, че се окаже интересно, хвърлям ръкавицата на няколко от познатите/приятелите ми. Смятам че имат хубави приказки за разказване и поне аз бих ги чел с удоволствие. Номинираните са Петьо, Свилен, Ники и Митьо. Бих добавил и Riznlog, но не познавам пичовете а и едва ли ме четат.

Един от компонентите във вечния ми проект е търсачка. Едно от изискванията като показваме намерен документ да го съпровожда извадка около думата с която е открит. Тези думи трябва да бъдат акцентирани в извадката. Точно като търсенето в Google. В нашата терминология, думата се нарича term, а извадката – chunk.

Това по никакъв начин не е тривиално. Теслата е това, че за мен търсачката е черна кутия. Разполагам само със заявката и намерените документи – нямам никаква идея през какъв път е минал search engine-а да ги открие. А самите заявки могат да бъдат бая сложни – (ruby OR python OR perl) AND programming NOT java. Това търси статии които споменават някой от трите езика за програмиране заедно с думата „програмиране“ (за да няма змии или скъпоценни камъни), но не показва статии които имат нещо общо с Java. Може да съдържат фрази ("Ruby on Rails"), маски (prog*, Pyt???) или търсения по разстояние (sony NEAR playstation). А, да – търсачката има някакъв скрит от мен алгоритъм, с който барва документите преди да ги индексира – маха някои пунктуационни символи, чисти XML етикети и прави странни неща с някои думи (don’t). В следствие това, в което търси потребителя и това, от което вадя chunk не съвпадат съвсем. Вече усещате как животът ми става по-интересен.

Има гъста мъгла, която няма как да премахна. Пък и като цяло правя нещо, което е работа на търсачката. Очевидно не мога да реша проблема на 100% – целя нещо работещо в повечето случаи със смислена алтернатива в останалите. Трябва и да се съобразя с редица странности, които са важни за потребителите – да показвам най-първия chunk в документа, да съдържа цели изречения или двете думи при търсене по разстяние. И все пак извадката не трябва да става твърде дълга.

Вече се вижда, че проблема не е хамалски, а по-скоро алгоритмичен. Трябва да реша това с всичките му глезотии, без да резултира в тонове излишен/грозен код, редица дребни буболечки и гъста каша, която не бих искал да помирисвам след седмица. А това е предизвикателство, предвид че пиша на Java (а не по-гъвкав език). И дори трябва да мисля за ефективност – случва се да показвам по 50 документа в отговор на доста сложни заявки и ако се отплесна в регулярни изрази, туко виж chunk-овете отнемат повече време от търсенето. Което би било кретенско.

При такъв проблем имам следната рутина – взимам по-примитивна технология за писане и се премествам далеч от всякакви компютри, интернет и модерни технологии. Настанявам се някъде удобно, заглушавам света с музика и се отдавам на размисъл. Не е задължително дори да бъде в офиса – може да е сред природата или в някое заведение. През лятото мога да се занеса до някое от софийските паркчета с колелото и да се разположа на пейка. Но понеже е зима се задоволих с удобен диван.

Гледам да записвам всичко, което ми хрумне. Най-общо започвам с проблеми, които искам да реша, идеи които имам и детайли които трябва да взема предвид. Размишлявам на няколко „итерации“, след което надрасквам всичко това в тефтера. В даден момент си създавам цялостна картинка – какви term-ове има, какви проблеми могат да изникнат с тях и няколко идеи как да напарвя хавата по-добре.

Следващата стъпка е да си раздробя проблема на няколко парчета и да ги подхвана без определен ред. Или по-точно, от най-интересния към най-безинтересния. Първо започнах с това какви обекти ще извадя от заявката и как ще ги ползвам за да намеря първото срещане в документа и да го заградя с тагове (highlight). След това превключих на как ще изваждам цели изречения и как ще ограничавам дължината на chunk-а. После се замислих над реда, в който се случва всичко. И накрая – какви класове ще създам и кой какви задължения ще има. Всичко това си го записах.

Артефакта, който се произведох са пет страници в тефтера ми. Те съдържат малко разхвърляни размисли без детайл, от които да мога да си възстановя идеите. Ето как изглеждат в този случай:

Малко отклонение – имам навика да си държа подобен журнал за всеки по-голям проект. Преди време ползвах една дебела тетрадка за Rebirth, но някъде я затрих и минах на джобен скицник. За един друг проект пък отскоро пиша в moleskin тефтер, вдъхновен от тези двамата. Освен че действа като „допълнителен RAM“ за разсъжденията ми, остава като трайни бележки за проекта. Често са ми били полезни – в тях откривам цялостни схеми на кода или причините за някои решения.

Намирам ритуала за успокояващ и продуктивен. Напоследък умишлено пиша дребно и бавно, за мога добре да премислям нещата. Преди имах навика да замъквам един-двама колеги пред бяла дъска, да дискутираме идеите мажейки с маркерите по нея и след това да правя снимки с телефон. Но това не оставяше трайни материали. А напоследък работя сам.

Откривам, че не е добра идея да продължавам повече от 40-60 минути. След това започвам да се разсейвам и да бъда неефективен. В такива моменти е добре човек да си почине – кратка разходка, цъкане из нета, една цигара или каквото там ви устройва. И няма опастност да забравя нещо – имам достатъчно записки да си припомня.

Ако сте работили поне мъничко с мен или сте слушали крайните ми проповеди за занаята, вече се досещате каква е следващата стъпка. Не? Наистина?! Ами да напиша тестове, разбира се! В този случай тестът бе един – публикувам го, защото съм много доволен от него. Чувствам го като един от най-хубавите и показателни unit test-ове, които някога написал. Не е твърде устойчив на промени и много подробен, но съм убеден че си заслужава да отделите няколко минути да го проучите. Вярвам, че намерите една-две идеи които да ви допаднат.

В думите на един колега: сега остава само да напиша имплементацията. Тя нито е особено интересна, нито значима за тезата ми. Тестът вече е готов и имам записки – мога спокойно да се прибера от работа и да довърша на следващия ден или седмица. Концепцията е добре премислена, а аз съм уверен че ще работи. И че ще изгладя ръбчетата, които ще изникнат с кода.

И така завършва експозицията ми. Надявам се да ви е било интересно и дори полезно. Ако е така, то определено искам да го чуя – или по-точно, прочета – под формата на коментар.

Вашият коментар

Вашият имейл адрес няма да бъде публикуван.