yk.camelcase.work

Нещодавні роботи

Нещодавні продукти, створені від початку до кінця. Кожен запис називає інженерне рішення, яке його сформувало, а не перелік функцій.

Кожен проєкт нижче почався з реальної проблеми. Далі роль та сама: продуктова концепція, системна архітектура, реалізація, інфраструктура, розгортання та безперервна доставка - кожен продукт продовжує розвиватися далеко за межами першого релізу.

DreamBank - Віртуальна банківська платформа замкненого циклу

DreamBank - фінансовий шар замкненої ігрової екосистеми: віртуальні картки, мультивалютні баланси, перекази, кешбек, заощадження й віртуальний кредит - без жодного виходу в реальні гроші. Валюти вигадані, облік - ні: він працює як подвійний запис із незмінними проводками за набором сервісів на Go. Ціль проєктування, під яку я оптимізував систему: кожну зміну балансу можна пояснити людині, якій він належить.

Проблема

DreamBank - один із кількох продуктів екосистеми Dream поряд із DreamBox, DreamFarm і DreamMarket - і саме через нього всі вони проводять розрахунки. Сама екосистема виросла з іншої ідеї: онлайн-шопінг легко стає звичкою, яка коштує реальних грошей, але дослідження свідчать, що найбільше задоволення дають пошук, вибір і оформлення замовлення, а не володіння річчю. Dream зберігає цей досвід і прибирає витрати завдяки віртуальній валюті, яка ніколи не перетворюється на реальні гроші. Щоб це відчувалося справжнім, гроші мають поводитися як гроші - картки, баланси, історія - в усіх продуктах одночасно.

Double-entry ledgerGo, PostgreSQLMulti-currency accountingclosed-loop fictional currenciesTransactional outboxat-least-once, idempotent consumersRisk and anti-abuse decisionsvelocity, reputation, holdsCard-first product modelvirtual cards, shared cards, receive detailsInstallable client, native-readyNext.js PWA, static export

Архітектура

  • Подвійний запис для ігрових грошей. Кожна зміна балансу - це запис у журналі, сума проводок якого дорівнює нулю, проведені рядки незмінні, а баланси - це проєкції, які можна відновити з проводок. Збережений стовпець балансу був би набагато простішим - і назавжди непояснюваним.
  • Один рахунок на картку, без гаманця. Три картки в одній валюті - це три незалежні баланси, і переміщення коштів між ними - справжній переказ. Спільний баланс на рівні користувача прямо заборонений, тож жоден сценарій не може тихо його вигадати.
  • Міжвалютні операції залишаються явними. Кожен рахунок у реєстрі й кожна проводка мають рівно одну валюту, тож жоден переказ не може непомітно конвертувати кошти. Міжвалютний рух - окрема операція, яка до підтвердження фіксує котирування, курс, версію курсу й термін дії.
  • Винагороди - ще не гроші. Кешбек нараховується балами в окремому журналі, куди лише дописують, і потрапляє до грошового реєстру тільки через підтверджене погашення. Бали зараховуються лише після закриття вікна повернення, тож повернення коштів не може вивести баланс балів у мінус.
  • Рахуються спроби, а не успіхи. Лічильники частоти операцій збільшуються під час оцінки операції, ще до рішення, тож відхилені спроби теж враховуються. Я пожертвував точністю як журналом активності заради стійкості до обходу порогів швидкими повторними спробами.

Editron

Сервіс трансформації тексту за принципом API-first. Власний вебредактор - це клієнт того самого публічного API, якому заборонено його обходити, - саме це тримає інтеграційну поверхню чесною; рушій обробки можна замінити за одним внутрішнім контрактом, мультитенантність, API-ключі, квоти й облік використання закладено з самого початку, а також є опублікований TypeScript SDK.

Lernklang

Платформа з обмеженим доступом для вивчення мов через аудіювання, з аналітичною панеллю для шкіл. Один образ, три ролі: заплановані завдання виконуються в окремому контейнері, тож перезапуск чи масштабування вебзастосунку ніколи не пропускає завдання й не запускає його двічі - а конфігурація перевіряється під час старту: процес відмовляється запускатися з некоректною змінною, замість тихо ламатися в продакшені.

Herald

Збирання, обробка й доставка новин за темами. Дедуплікація відбувається на етапі доставки: для кожного каналу за хешем вмісту, з URL як запасним ключем, у ковзному вікні, тож синдиковані статті й статті, що оновлюються наживо, ніколи не надсилаються двічі; кожна стаття дає три незалежно створені формати, і кожен позначено точною версією конвеєра, яка його створила, - для відтворюваності та обліку витрат.

Менші продукти й цілеспрямовані експерименти - частина тієї самої практики: вони дають змогу швидко перевірити ідею, патерн взаємодії чи новий робочий процес, перш ніж братися за більшу систему.