Софт, на якому працює ваш бізнес
Правила вашого процесу, записані так, що їх не можна порушити непомітно: записи, стани, переходи, ролі — і тести, які падають, коли одне з правил змінилося.
Діапазон
Масштаб: від однієї таблиці до системи доменів
Чотири масштаби за зростанням: одна сутність із валідацією та ролями; стани й переходи; конкурентний доступ із блокуваннями та журналом змін; домени зі своїми таблицями, правами й тестами.
Один екран, що замінює електронну таблицю
Одна таблиця, форма з фактичною перевіркою, відфільтрований список, експорт і дві-три ролі. Дні, а не місяці. Екран не є цінністю — електронна таблиця не має обмежень, історії та уявлення про те, хто може що змінювати, тому дві її копії непомітно розходяться, і ніхто не може сказати, яка з них правильна.
Процес зі станами й переходами
Запис, який переміщується: від котирування до замовлення, від заявки до рішення, від справи до закриття. Стани – це перелік, кожен перехід охороняється політикою, яка знає, хто запитує, і те, що відбувається на цьому шляху – наданий документ, надіслане повідомлення, записаний рух запасів – залежить від події, а не від того контролера, який її ініціював.
Бек-офіс, у якому одночасно працюють кілька людей
Дозволи, обмежені рядками, а не елементами меню, сліди того, хто що і коли змінював, документи, згенеровані з даних, а не передруковані, та системи, що вже використовуються, доступні через чергу, тож їхній поганий день не є вашим. Це сходинка, де двоє людей, які редагують один і той самий рядок одночасно, перестають бути гіпотетичними та починають потребувати блокування.
Багато модулів, одна система
Акції, гроші, люди та робота в одній кодовій базі, де кожен домен має власні таблиці, політики та тести, а також шар плагінів, тому новий постачальник платежів або доставки є скоріше випадковим, ніж основним редагуванням. Один із них знаходиться за цією сторінкою, а наступний розділ показує, як він виглядає зсередини.
Трудомісткість іде не за кількістю правил, а за тим, як вони перетинаються. Одне правило на мільйон рядків — це дні. Чотири правила, які наприкінці місяця суперечать одне одному, — це тижні, скільки б екранів над ними не було.
Схвалення
Стан-шлюз: запис не проходить далі без підтвердження, а політика вирішує, чиє підтвердження потрібне.
Ролі та дозволи
Контроль доступу на рівні рядків, а не пунктів меню. Приховане посилання — це не авторизація.
Планування та бронювання
Приміщення, співробітники, слоти. Правило неперетину — обмеження цілісності в базі, а не перевірка у формі.
Правила ціноутворення
За клієнтом, обсягом, договором — обчислюється один раз і фіксується в рядку документа: старе замовлення зберігає ціну продажу.
Документи
Рахунки, акти й офери генеруються з даних. Наскрізна нумерація без пропусків і дублів — гарантія на рівні бази.
Системи, що вже використовуються
Бухгалтерія, банк, месенджер — асинхронні інтеграції через чергу, з повторами та ідемпотентністю. Їхній простій не зупиняє ваш процес.
Звіти
Агрегація чанками за індексованими колонками: закриття місяця не тримає блокувань на таблицях, у які йде запис.
Запаси як бухгалтерська книга
Журнал рухів append-only: кожна операція — незмінний запис, залишок — агрегат за журналом, а не поле, яке перезаписують.
Облік персоналу
Прийоми, відсутності й табелі — події; підсумки — похідні агрегати, що перераховуються з журналу, а не зберігаються вручну.
Трубопровід
Ліди, угоди, звернення — скінченний автомат; строки — тригери планувальника, а не поля для відображення.
API
Версіонування, автентифікація на клієнта, rate limiting. Специфікація генерується з тих самих визначень, з яких зібрані маршрути.
Успадкований код
Приймання чужої кодової бази на Laravel: характеризаційні тести фіксують поточну поведінку до будь-яких змін.
Довідкова збірка
Система, побудована, щоб знайти межу
ERP-платформа: склад, фінанси, кадри, продажі та клієнти в одній кодовій базі на Laravel. Вона власна, а не клієнтська, і поки не обслуговує нічий бізнес — саме тому її можна розбирати тут до рівня, який у клієнтському проєкті закритий договором.
В архіві 2 опубліковані проєкти на Laravel, і на кожному з них вказане авторство розробки належить іншій людині — я був там арт-директором, це написано на сторінках проєктів. Система вище — та, де код мій; на ній ця сторінка й стоїть.
Правильність
Коли двоє натиснули одночасно
Чотири механізми з цієї кодової бази; кожен написаний після реального збою. Розробник упізнає їх з першого погляду. Для решти: це те, через що софт, бездоганний на демонстрації, губить запис, списує гроші двічі або запускає один імпорт два рази.
Приклад дрібніший. Адреса Telegram-бота містить його власний токен, тому з'єднання, що впало, цитує живий секрет у тексті помилки, а стандартний звіт пише його прямо в лог. Рішення — редактор, який вмикається лише тоді, коли збій справді несе токен; усе інше зберігає початковий stack trace. Більша частина цієї роботи — такого розміру.
Стек
На чому написано і що запускається на кожен пуш
Названо прямо, з версіями. Кожен рядок прочитано з конфігурації референсної системи — composer.json, налаштувань черг, CI-сценарію — і будь-який можна перевірити, попросивши файл-джерело.
Усе, що далі — де це працює, як викочується, хто за цим стежить і що бекапиться, — друга половина роботи, і в неї своя сторінка. Цей розділ навмисно зупиняється на машині збірки.
Як це влаштовано
Спочатку правила, потім код
Розмова про процес, а не про софт
Що відбувається зараз, хто це робить, де ламається і скільки коштує кожна поломка. Тут ухвалюється більшість корисних рішень, і жодному з них не потрібна назва технології.
Записано й погоджено
Записи, їхні стани, хто має право їх рухати і що має бути виконано до переходу. За цим документом рахується оцінка, і він залишається вашим незалежно від того, чи почнеться збірка.
Перший зріз: одна операція від початку до кінця
Один запис, один маршрут, один екран — у руках тих, хто цим користуватиметься. Усе, що не так із правилами, вилазить тут, поки їх правка ще дешева.
Далі — модулями, у порядку окупності
Модулі здаються по одному, і кожен робочий у момент здачі. Ніщо не чекає всього іншого.
Передача — список, а не переговори
Репозиторій, облікові записи та записані правила ваші з першого дня. Останній крок — перевірка, що ви впораєтеся без мене, а не влаштування так, щоб не впоралися.
Питання
Перед зверненням
Одне чесне застереження, бо від нього залежить, чи стосується вас усе вище. Замовний софт — найдорожчий спосіб розвʼязати задачу, яку вже розвʼязує готове, і у двох найчастіших випадків відповідь в іншому місці цього сайту.
Сайт, сторінки якого ваші люди продовжуватимуть редагувати, це сторінці про WordPress.Магазин з каталогом, кошиком та оплатою сторінка про інтернет-магазини.
Старт
Заповнити бриф
Це перший прохід по правилах вашого процесу — кліками, а не твором. Обовʼязкові лише контакти; решту можна пропустити, і тоді я спитаю це голосом. Відповісте на все — дзвінок почнеться з середини розмови.