Всеки, който някога е водил отчет за времето, знае ритуала в петък следобед: гледаш седмица, в която със сигурност си работил, и се опитваш да си спомниш кое от нея беше миграцията и кое беше бъгът, който изяде вторника. Часовете са били истински. Записът кое за коя задача е бил, така и не е бил направен, защото да го направиш означаваше да спреш работа и да натиснеш бутон.
TimerOS отчита часовете автоматично от самото начало. Това, което не можеше да прави досега, е да каже за какво са били. То излезе с версиите v1.3 — настолното приложение вече съпоставя отчетеното време с вашите собствени отворени задачи, докато работите, на вашата машина. Тази статия е за това как решава и, по-полезно, за това кога решава да не каже нищо.
Защо гадаенето е начинът да се провалиш
Очевидният начин това да се направи е да вземеш каквото човекът гледа, да намериш най-близко звучащата задача и да запишеш времето. Изглежда чудесно на демонстрация и е тихо разяждащо, защото отчет, който е верен на 80%, е по-лош от отчет, попълнен на 60%. Тези 20% са невидими — изглеждат точно като верните редове — така че или проверявате всичко, което струва повече от самото попълване, или фактурирате на клиент работа, свършена по друга поръчка.
Едно грешно записване струва повече от едно липсващо, защото не можете да го видите.
Затова съпоставянето е построено да се въздържа. То трябва да мине истинска летва от доказателства, преди да запише каквото и да е, а когато не може, времето просто си остава продуктивно и неразпределено. Неразпределеното време тук е нормален изход, а не състояние на провал, и приложението не ви натяква за него.
Какво всъщност чете
Един сигнал в тази версия: заглавието на прозореца, който гледате. Не името на приложението, не адреса в браузъра. Тези двата захранват отделната класификация продуктивно/неактивно и нямат никаква тежест при съпоставянето със задача — параметърът с хоста се подава на точкуващата функция и умишлено се пренебрегва.
Това заглавие се разбива на думи и се точкува срещу корпус, изграден от вашите собствени отворени задачи и подзадачи. Думите от заглавието на задачата се броят с пълна тежест; думите от описанието ѝ се броят с 40% и могат само да вдигат резултата, никога да го разреждат. По-редките думи тежат повече от често срещаните, а около 130 общи думи — оправи, бъг, обнови, задача — се премахват изцяло, така че „Оправи бъга при входа“ и „Оправи бъга при експорта“ се разделят по думите, които наистина се различават.
Летвата от доказателства
Преди да се запише каквото и да е, кандидатът трябва да мине през всичко изброено:
- Две съвпадащи съдържателни думи — или една, която е уникална. Една споделена обща дума никога не може да носи съвпадение. Една дума върши работа само ако тя се среща в точно една задача от целия ви списък — това е и причината номерата на тикетите да работят.
- Резултат 0,45, измерен като претеглено покритие на думите от самото заглавие на задачата.
- Преднина от 0,15 пред втория. Две сходни задачи с близки резултати не произвеждат никакво записване, вместо да се хвърля ези-тура. Точно това правило върши най-много работа.
- Шейсет секунди съгласие. Една и съща задача трябва да печели при последователни проверки в рамките на цяла минута, преди първото ѝ записване. Превключването през нещо за петнайсет секунди не записва нищо.
Два палеца на везната
Покритието само по себе си пренебрегва всичко, което вече знаете за работата, затова две предварителни допускания го коригират. Задача, отбелязана като „в ход“, се претегля нагоре с една четвърт. И датите на задачата имат значение: работа, случваща се в рамките на нейния планиран прозорец, получава умерено повдигане, а задача, до чието начало има повече от седмица или която е просрочена с повече от две, се претегля надолу до 60%. Датата се взема от същия доверен часовник, който използва логиката за смените, така че промяната на часовата зона на машината ви не я мести.
Да стоиш на място и да пускаш
Другата половина от задачата не е точността, а устойчивостта. Съпоставяне, което решава наново на всеки пет секунди, произвежда ден, нарязан на деветдесет парчета — технически подробно и практически безполезно.
Затова съвпадението се захваща. Щом веднъж една задача се държи, друга задача трябва да я надточкува непрекъснато цели две минути, преди записването да се превключи — един бърз поглед към друг тикет не изважда от блока, в който сте. А захващане, минало трийсет минути без свежо потвърждение, се пуска само, така че задача, която сте приключили в единайсет, не продължава тихо да събира следобеда ви.
Има и втори, по-тих канал. Когато сте вътре в самия TimerOS с отворена на екрана задача, инцидент или заявка за промяна в продължение на двайсет секунди, това се брои за контекст направо — не се налага гадаене, защото буквално гледате самото нещо. Това е единственият път, по който инцидентите и заявките за промяна изобщо се разпределят.
Какво напуска машината ви
Всичко описано дотук се случва в настолното приложение, на Rust, на вашия собствен компютър. Корпусът се изгражда локално от възложената ви работа, точкуването е локално, захващането е локално.
Това, което се синхронизира, е таблица от идентификатори на задачи към брой секунди— със същата форма като останалите часове от деня. Заглавията на прозорците не се предават, защото това, което е трябвало да ги прочете, вече е приключило с четенето, преди нещо да напусне машината. Това е същата архитектура като на самата класификация, за която сме писали отделно.
Струва си да се каже направо: нищо от това не е изкуствен интелект. В пътя на съпоставянето няма модел, няма сървър за извод, няма нищо, което да иска графичен процесор. Това е детерминирана точкуваща функция — един и същ вход дава един и същ изход всеки път, и тя се държи еднакво независимо дали режимът ви на отчитане е Автоматичен, или По правила. Това не е скромност. Детерминизмът е причината да можем да ви кажем точните прагове в тази статия и вие да можете да предвидите какво ще направи тя.
По какво това се различава от автоматичното отчитане другаде
Записването на заден план не е ново и не бива да се преструваме, че е. И Toggl Track, и Clockify записват активност без пуснат таймер. Разликата е какво пристига на другия край.
Нито един от двата подхода не е очевидно правилният. „Записване и преглед“ никога не записва нищо грешно, защото изобщо не записва — цената пада върху вас в петък. Съпоставянето мести тази цена към машина и приема, че понякога ще сгреши, а точно затова панелът за преглед и връщането назад имат по-голямо значение от самото съпоставяне.
Какво умишлено не направихме
- Без връщане към ниво проект. Първата версия записваше на проекта, когато не можеше да разпознае задача. Премахнахме го пет часа по-късно, във v1.3.1. „Някакво време, горе-долу на верния проект“ е точно онзи правдоподобен на вид шум, който прави отчета недостоверен.
- Без натякване. Има ред „Неразпределено“, който показва времето, съвпаднало с нищо, с разпределяне с едно натискане, ако го искате. Той не почервенява и не ви следва навсякъде.
- Без мълчаливо презаписване. Отчетените часове се появяват на задачата сами, но число, което сте въвели вие, винаги надделява над число, което е изведено. Задачата показва кое от двете е.
- Без път към фактурата ви. Разпределените часове още не влизат във фактурирането. Като се има предвид, че едно грешно записване би станало грешна фактура, тази подредба е умишлена — съпоставянето ще заслужи фактурирането по-късно, щом бетата ни покаже къде е слабо.
Целта никога не е била отчет, който се попълва безупречно сам. Целта беше работата да се премести от помненето към проверката — защото един списък може да се провери за две минути в петък, а вторника така или иначе нямаше да го запомните.