Steven
Steven6 мин четене

Спокоен софтуер: как убихме един трептящ превключвател и научихме чата да казва в кой режим е

Две малки издания на GeekBye, без ефектни функции — просто превключвател в настройките, който спря да трепти, и чат асистент, който най-накрая ти казва дали е отговорил в режим на среща или в режим на кодиране. Ето колко всъщност струва „спокойният софтуер", по един детайл наведнъж.

Продукт
Дизайн
Инженеринг
Издания на GeekBye
Спокоен софтуер: как убихме един трептящ превключвател и научихме чата да казва в кой режим е

Не всяко издание е военна история. Някои са просто списък от малки, почти невидими неща, които тихо не бяха наред — от онзи вид, който не срива нищо, но кара приложението да усеща като леко ненадеждно, леко нервно, леко не-твое. GeekBye v2.0.3 и v2.0.5 бяха две от тях. Без нови функции. Просто спокойствие.

„Спокоен софтуер" звучи като настроение. Всъщност е купчина конкретни решения. Ето три от тях.

Превключвател, който не можеше да се реши

Имаше един превключвател в настройките — този, който управлява възстановяването на аудиото — който трептеше, когато го кликнеш. Пипваш го да го включиш и за части от секундата той показваше включено, после отскачаше обратно към изключено, после се уталожваше. Мъничко визуално заекване, но окото ти го улавя, и то се чете като приложението не е сигурно какво прави.

Причината е класическа надпревара в интерфейса, наречена оптимистично обновяване. Когато кликнеш превключвател, приложението има два избора: да изчака настройката наистина да се запази и после да обнови ключа (правилно, но усеща като бавно), или да превключи ключа веднага и да запази на заден план (усеща като мигновено). GeekBye правеше второто — превключваше веднага — но също препрочиташе запазената стойност, когато тя се върнеше. Така че последователността беше: кликваш, ключът се превключва оптимистично, реалната запазена стойност пристига миг по-късно, и за един кадър двете не бяха съгласни и ключът видимо отскачаше.

Поправката е да накараме оптимистичната стойност и потвърдената стойност да се съгласят чисто — ключът се обвързва със състоянието, което си избрал, и спира да се съмнява в себе си, когато записът се потвърди. Заедно с това v2.0.3 направи един неефектен преглед на текстовете: описанието за възстановяване на аудиото беше окастрено, за да се подравни със съседните редове, а формулировките в настройките бяха очовечени. Нищо от това не е функция. Всичко от това е разликата между панел с настройки, който усеща като инженериран, и такъв, който усеща като изпипан с грижа.

Обиколка, която не искаше да си тръгне

Обиколките за нови потребители са полезни точно веднъж. Проблемът е в тази еднократност: след като си я видял, въвеждащ слой, който не можеш да отхвърлиш, се превръща в безпорядък, който сигнализира това приложение мисли, че още си нов. v2.0.3 поправи и двата края на това — продуктовата обиколка вече може да бъде скрита, и ако наистина я искаш обратно, има бутон Повтори обиколката. Показвай я, когато помага, махни се от пътя, когато не помага, и остави потребителя да я призове при свои условия. Уважението към това, че потребителят вече не е нов, е своя малка форма на спокойствие.

Асистентът, който не искаше да каже как мисли

Това е онзи, който наистина имаше значение, и той се свързва с по-дълбок проблем, който преследвахме.

Асистентът на GeekBye отговаря различно в зависимост от контекста. По време на среща „какво мислиш за това?" трябва да получи разговорен, съобразен със срещата отговор. В сесия на кодиране същите думи трябва да получат технически такъв. Затова бекендът прекарва въпроса през правилната рамка — наречи я режим на среща или режим на кодиране — и тази рамка наистина променя отговора, който получаваш.

Проблемът: приложението никога не ти казваше кой режим е отговорил. Така че когато асистентът ти даваше отговор с привкус на кодиране на разговорен въпрос — или отговаряше на въпрос за код, все едно си бъбрите — изглеждаше сякаш AI просто греши. Той не грешеше; беше в другия режим, а ти нямаше как да видиш това. Скрито състояние караше правилно поведение да изглежда счупено. (Самата логика на режимите е по-голямо парче работа — оркестраторът, който решава как да отговори на некодиращи въпроси по време на сесия на кодиране — но нищо от това не ти е от полза, ако не можеш да видиш решението, което той е взел.)

v2.0.5 добави чип за режим само за четене към чата: малък етикет, показващ дали асистентът е отговорил в режим на среща или в режим на кодиране. „Само за четене" е целият смисъл — това не е контрол, който настройваш, а прозорец към решение, което системата вече е взела. Спираш да гадаеш защо един отговор усеща като не наред; можеш да видиш рамката, от която е дошъл.

Детайлът, който прави чипа честен

Ето инженерния избор, който си струва да предадем нататък, защото той е от онзи вид неща, които отделят прилепен отгоре индикатор от такъв, на който можеш да имаш доверие.

Информацията за режима идва от бекенда като част от поточния отговор — малък кадър mode в потока от server-sent events. Но по-стар клиент, който предхожда тази функция, не би знаел какво е кадър mode; в най-добрия случай го игнорира, в най-лошия изобразява нещо изкривено. Затова клиентът обявява своята способност: изпраща заглавка на заявката, казваща знам как да покажа чип за режим, и бекендът излъчва кадъра mode само към клиенти, които са я изпратили. Старите клиенти никога не получават сигнал, който не могат да обработят; новите клиенти получават точно кадъра, за който са поискали.

Това е ръкостискане с една заглавка, и то е разликата между „добавихме функция" и „добавихме функция, без да счупим никого, който още не е обновил." Същият преглед стегна и останалото поведение: чипът се изчиства при нулиране и когато контекстът на разговора се промени (остарял етикет за режим е своя малка лъжа), и се показва само в изгледа на чата, където му е мястото.

На какво ни научиха две издания „без функции"

  1. Нервността е сигнал за доверие. Трептящ превключвател, отскачащ ключ, етикет, който се задържа с един кадър повече — нито едно от тях не е бъг в смисъла на сривване, но всяко едно нашепва това приложение не е съвсем под контрол. Спокойствието е отсъствието на тези нашепвания, и го заслужаваш по едно състояние на надпревара наведнъж.
  2. Скрит режим кара правилното поведение да изглежда като бъг. Асистентът правеше правилното нещо и биваше обвиняван за него, чисто защото потребителят не можеше да види рамката. Когато системата ти взема невидимо решение, което променя изхода, покажи решението — чип само за четене често е цялата поправка.
  3. Новите функции трябва да са невидими за клиентите, които не могат да ги използват. Ръкостискането със заглавка за способност означава, че сигналът за режим достига само до клиенти, които могат да го изобразят. Обратната съвместимост не е проверка на версията, прилепена по-късно; тя е клиент, който казва какво разбира, и сървър, който уважава отговора.

Това са изданията, за които никой не пише заглавия в списъка с промени, и те са голяма част от причината GeekBye v2 да усеща така, както усеща. За изданието, върху което беше построено това спокойствие, виж какво всъщност изисква една версия 2 (v2.0.0). За работата по надеждността редом с него, деня, в който нашето приложение си направи само DDoS (v2.0.1) и защо твоят AI notetaker спира да записва по средата на срещата (v2.0.9).

Свързани статии

Анатомията на изпращането на софтуер до съвършенство: как прегледът на кода улови това, което тестовете не можаха
Steven
Steven6 мин четене

Анатомията на изпращането на софтуер до съвършенство: как прегледът на кода улови това, което тестовете не можаха

В цялата поредица за GeekBye v2 се случва едно и също нещо: дадена поправка минава всеки тест на машината на разработчика, а после прегледът на кода доказва, че тя би се провалила за почти всеки друг. Това е работният процес зад девет издания — портата на прегледа, ранните улавяния при поправките и дисциплината „тествай преди да изпратиш“, която превръща „при мен работи“ в „работи“.

Инженеринг
Процес
Преглед на кода
Вашето Mac приложение получава достъп до микрофона — после го забравя при всяко стартиране
Steven
Steven5 мин четене

Вашето Mac приложение получава достъп до микрофона — после го забравя при всяко стартиране

GeekBye поиска разрешение за микрофона, вие го дадохте и всичко работеше. При следващото стартиране: изчезнало. А приложението изобщо не се появи в Системни настройки → Микрофон. Виновникът беше функция за сигурност на macOS, която тихомълком пускаше приложението от път, който изчезва — ето диагнозата и корекцията с един-единствен подкана.

macOS
Разрешения
Инженеринг
Какво всъщност изисква една Версия 2: 206 комита честни състояния
Steven
Steven7 мин четене

Какво всъщност изисква една Версия 2: 206 комита честни състояния

GeekBye v2 не беше издание с нови функции. Бяха 206 комита, насочени към една-единствена идея: приложението никога не бива да лъже за собственото си състояние. Ето колко струва това — включително еднолинейната грешка в lockfile, която за малко да ни попречи да пуснем каквото и да било от всичко това.

Надеждност
Инженеринг
Издание