Gemini по-человечески, по-братски!
Под руководством Gemini по-ошибке потратил TRX на 120$ на коммиссиях сети
Сеньор помидор. Бложек ведущего разработчика и тимлида, трансформировавшегося в менеджера проектов :-)
Под руководством Gemini по-ошибке потратил TRX на 120$ на коммиссиях сети
Cпособы оценки и планирования проектов, которые сложились в индустрии софтверной разработки для планирования: стори-поинты, футболки и числа Фибоначчи хороши для тактики (планирование на 2 недели вперед), но не подходят для стратегии (сколько денег готовить на проект длиной в квартал).
У программистов есть BigO-нотация для описания сложности алгоритмов. Обычно её используют, чтобы пообсуждать эффективность примененных алгоритмов для сферических задач в ваккууме. Там измеряют скорость исполнения и потребление памяти.
Что, если подобный подход переложить на наши прикладные инженерные задачи?
Здесь O(…) — не алгоритмическая сложность в строгом CS-смысле, а способ описать структуру роста инженерных усилий.
Например: подключение нового эквайринга в существующую систему продажи авиа-билетов.
По сути это комбинаторная задача, то есть сложность которой зависит от количества изменений, которые нужно учесть.
O(P × (S + C + M + E) + R)
Так как каждый платёжный сценарий (P) должен быть:
Часто R = 0, но иногда это большая константа, например 3DS/SCA/PCI DSS
Невозможно подключить эквайринг не реализовав хотя бы:
O(P) — абсолютный минимум
Сколько конфигураций, сколько справочников, сколько долгоживущих сущностей,
сколько вариантов правил, которые система обязана помнить
O(S + C + M + E)
Появляются:
Если всё сделано правильно:
Почему это вообще важно?
Потому что это дает ответы на вопросы: сколько времени мы будем это делать? → Time / effort
И насколько это усложнит систему навсегда? → Space / state
Это сложность, которая добавляется даже если через этот эквайринг будет проходить 0 платежей.
При плохой архитектуре трудозатраты могут зависеть от сочетаний параметров (например, сценариев × сервисов × валют), что увеличивает рост усилий:
O(P × S × C) (реально больно)
Например, если нет абстракции платежей, логика размазана по сервисам, эквайринг «вшивается» напрямую (скорее всего программисты воют об огромном техническом долге)
Каждый новый эквайринг в этом случае — это комбинаторный рост потенциальных конфликтов/интеракций между компонентами.
При хорошей архитектуре, наоборот
→ O(P) (кайф)
Если система изначально строилась для поддержки разных эквайрингов, имеется абстрактный платёжный адаптер или применяется strategy pattern, то добавление ещё одного эквайринга:
Для бизнеса важны только ответы на два вопроса:
Попробуем применить нашу формулу
O(P × (S + C + M + E) + R)
Где:
P — платёжные сценарии
S — системы интеграции
C — валюты
M — методы оплаты
E — edge-cases
R — регуляторные/комплаенс требования
Математическая функция O(…) показывает структуру сложности. Чтобы превратить её в сроки, нам нужно добавить весовые коэффициенты (сколько в среднем занимает одна интеграция).
В инженерной практике это превращается в аддитивную модель трудозатрат:
Total_days =
P × (
base_days
+ S × days_per_system
+ C × days_per_currency
+ M × days_per_method
+ E × days_per_edge_case
) + R × days_per_requirement
Функция O показывает как растёт, а коэффициенты — сколько стоит один шаг.
| параметр | значение |
| base_days | 1.0—1.5 дня |
| days_per_system | 0.5—1 день |
| days_per_currency | 0.3—0.7 дня |
| days_per_method | 0.7—1.5 дня |
| days_per_edge_case | 0.2—0.5 дня |
| days_per_requirement | 5-8 дней |
R-добавки для платежей это:
3DS / SCA → +5—10 дней
delayed capture → +3—5
split payments → +5—8
local compliance → +5—15
P (payment scenaries): payment, refund, partial refund, webhook reconciliation = 4
S (systems): orders, tickets, billing / ledger, notifications, analytics = 5
C (currencies): EUR, USD = 2
M (methods): cards, Apple Pay = 2
E (edge cases): retry, timeout, idempotency, duplicate webhook, partial capture = 5
R (regulatory): SCA, Split payments = 2
1.Базовая реализация (P=4 сценария):
2.Регуляторика (R=2 требования):
-SCA + Split payments: 2 × 7.5 дней = 15 д.
Итого: 4.8 + 16 + 4 + 8 + 6 + 15 ≈ 54 человеко-дня
Итого получается
📌 ≈ 11 календарных недель одного инженера
📌 ≈ 6 недель для команды из 2—3 человек
Это только на разработку, но когда мы говорим про продакшен-решение нельзя забывать добавить QA и DevOps:
| Блок | % от development |
| QA | +30-50% |
| DevOps / Infra | +10-20% |
| Product / Docs | +10% |
Итог 54 × 1.6 ≈ 86 человеко-дней до продакшена
Добавим коэффициент эффективности k (расширяемости) нашей архитектуры системы
T = k × P × (S + C + M + E)
| k | Архитектура | Человеко-дни | Почему такие цифры |
| 1.0 | Без абстракции | 60—100 | каждое измерение усиливает остальные |
| 0.4-0.5 | С адаптером | 25—40 | переиспользование сценариев и тестов |
| 0.2-0.3 | С shared payment core | 15—25 | линейность по сценариям + конфиг |
Формула остается той же но коэффициенты падают в 2—3 раза.
Почему k большой:
Каждое измерение — будь то системы (S) или валюты (C), методы (M) или edge-кейсы (E) → коэффициент растёт.
Что меняется:
Что НЕ решено полностью:
коэффициент падает примерно в 2 раза.
Это ключевой момент.
Что происходит архитектурно:
Фактически:
формула по факту становится ближе к: T ≈ k × P, все зависимости по-прежнему существуют, но коэффициенты при них близки к нулю. Это и есть цель любой инженерной команды — сделать так, чтобы стоимость новой фичи зависела только от её бизнес-сути (P), а не от сопротивления старой системы
Какими бы крутыми, зрелыми, осознанными сеньиорами с прокачанными софт-скиллами вы не обложились, управлять разработкой по факту возможно фиксируя только одну часть на выбор:
А. Объем работы
Б. Срок исполнения
Бюджет у вас уже и так зафиксирован по умолчанию, и, скорее всего, он уменьшается.
Прочитав данное сообщение вы прошли краткий курс подготовки по программе PMI PMP.
Интересно, что сейчас, в эпоху post-agile, когда все перестали использовать ритуалы scrum и повально канбанизировались, этот текст выглядит опередившим свое время лет на десять:
https://evil-frees.livejournal.com/290185.html
Периодически на разных проектах сталкиваюсь с тем, что у Google Cloud заблокировано создание Service Accounts. Проблема с iam.disableServiceAccountKeyCreation
Выходит сообщение:
Troubleshooting URL: console.cloud.google.com/iam-admin/troubleshooter;permissions=orgpolicy.constr
Missing permissions:
orgpolicy.constraints.list
orgpolicy.policies.listНи одно из решений через интерфейс Google Cloud не срабатывает.
Есть решение через Google Cloud Console:
cat > key-creation.yaml << ENDOFFILE
name: projects/$(gcloud config get-value project)/policies/iam.disableServiceAccountKeyCreation
spec:
rules:
- enforce: false
ENDOFFILE
gcloud org-policies set-policy key-creation.yaml
rm key-creation.yaml«У корпоративного самурая нет результата, есть только процесс».
Очень давно писал про вопрос-индикатор на собеседованиях «Два раза вовремя или один раз правильно?».
Профессионала от непрофессионала отличает способность держать слово.
В разработке это чаще всего это — выдерживание сроков плюс качественный результат. Да, иногда важнее сроки, а иногда — качество (это важно выяснять заранее, если не удается обеспечить оба показателя). Но не одно без другого.
Сказал — сделал. Пообещал — выполнил.
К человеку есть доверие, тогда, когда на его слово можно опереться.
А опереться можно тогда, когда есть подтвержденный опыт обеспечения качественными результатами в оговоренные сроки.
Если человек постоянно называет сроки, а потом они постоянно съезжают, человек — балабол (человек, дающий пустые обещания). Постоянно подводит, верить ему — нельзя.
Работать с такими не хотят. Промоутить таких не хотят. С таким работают, с отношением «так уж и быть» — просто терпят.
Почему так?
Да если до сих пор не очевидно, по тому, что на твоем слове я даю свои обещания.
А на моих обещаниях дает свое слово мой шеф. А уже на них и владелец компании.
Поэтому когда/если, это все начинает сыпаться, все бегают с «раскаленной кочергой». Потому что если не деливеришь то, что обещал — вся компания пойдет с рынка.
Короче, когда работаешь — будь молодцом!
В последнее время много попадается видео и статей о том, как кто-то успешно трудоустраивается на две работы и получает две зарплаты. Есть даже профессиональное движение, посвященное этому и ведутся споры, как правильно таких людей называть: «волки» или «шакалы»?
Есть те, кому, невероятными усилиями, получается успешно совмещать. А есть те, кто изначально идут на вторую работу, чтобы что-то минимально на ней делать, чтобы получить несколько зарплат до увольнения из-за плохого перформанса.
У меня есть несколько историй.
Лет десять назад в одном финтех-стартапе была очень молодая и задорная команда. Все работали в офисе, в редкие дни кто-то подключался и работал из дома. Работал там залихватский джун-Николай, который брался за всё что ему дают, усердно трудился. Иногда давал неплохой результат, а иногда получалась полная фигня, но в целом — терпимо. Работал он иногда из офиса, иногда из дома, бывало что пропадал из чатиков в течение дня на несколько часов, но потом объявлялся.
Уволил я его тогда по правилам «учить-лечить-мочить», после того как он второй раз уехал в отпуск, не залив в репозитарий изменения, которые команда от него ждала.
Через десять лет на одной из встреч с кипрскими айтишниками, случайно нашлись общие знакомые, которые в те далекие времена вместе с Николаем были коллегами по его второй, удаленной работе, про которую никто не знал. Рассказали примерно ту же историю про внезапные исчезновения и меняющееся качество результата.
Так что Колян делал это, еще тогда, когда это не стало мейнстримом.
Роман блестяще прошел тех. собеседование, показал пару своих книг о том как правильно проектировать архитектуру, а профиль на GitHub с кучей звезд только подогревал радость об удачном пополнении команды.
Во время испытательного срока делал огромную фичу, которой не повезло стать отмененной: крупный партнер реализовал схожий функционал. После — сделал несколько небольших полезных изменений в других частях проекта. Следующую свою крупную фичу он как-то слил, просто не коммиття ничего в репозиторий, зато изливая на рабочих созвонах свою экспертность и советы, как всем надо делать работу. В общем от него требовался код, которого не было, поэтому надолго у нас не остался. И несмотря на то, что у нас нет фактов, что Рома одновременно работал на какую-то еще компанию, у нас — просиживал штаны.
Даниил, молодой, талантливый студент, прошел интервью у рекрутера, у технического менеджера команды и меня на позицию Manual QA. Рассказал, что пару лет работал в беттинге, но не захотел переходить на новый проект по моральным принципам.
Очень быстро думал. Ответил на массу заковыристых вопросов, о том как тестировать финансовые приложения, великолепно разложил все корнер-кейсы по представленным примерам. Показал свой годовалый профиль на leet-code с кучей решенных задач. Порадовались, что наконец-то пришла свежая кровь (зумер!) с головой на плечах.
Оказалось, в дальнейшем, что в той компании и том подразделении он не работал, а сам вел личный телеграмм-канал с парой тысяч подписчиков, в котором хвастался потрясающими результатами развода компаний.
Возможно, если бы он реально начал работать QA, быстро бы вкатился и стал хорошим специалистом. Но намерение его было изначально деструктивным, так что решили с ним не продолжать.
(Интересно, кто и за сколько ему прокачивал профайл на литкоде?!)
Денис — зрелый разработчик, пришел на собеседование к нам, объясняя тем, что не сработался с коллегами в каком-то НИИ. Плюс вел курсы по программированию в ВУЗе. Наше собеседование прошел на высоком уровне и достаточно легко, очень понравился команде. За месяц вкатился в сложный проект, закрыл пять задач среднего размера. А потом позвонил мне и сказал что увольняется, т. к. не вытягивает. Оказалось, что он не уволился не только с предыдущей работы, выходя к нам. Он не уволился и с еще более ранней компании, т. е. у парня было три работы! :-)
Денис оставил очень смешанные впечатления.
Мы заплатили ему мидловую зарплату за мидловую работу — мы ничего не потеряли.
А вот те две компании, возможно, не получили того, о чем они договаривались, т. е. понесли потери.
Вообще-то, все эти признаки могут быть и связаны с тем, что у сотрудника в жизни что-то происходит, не обязательно то, что он устроился на вторую работу. Выявить это вполне возможно через приватные доверительные беседы. Важно предложить поддержку и рассмотреть различные сценарии, не делая поспешных выводов.
Вообще, рисков и последствий может быть множество, как для компаний, так и для сотрудника, который выбрал совмещать работу.
— Юридические (нарушения условий договора, конфликт интересов между компаниями)
— Риски по достижению долгосрочных целей компании (если спец сфокусирован на сторонней работе, а не на интересах работодателя)
— Влияние на командную работу (коллегам, возможно, придется компенсировать недостаток вовлеченности сотрудника)
— Возможные последствия для карьеры и репутации специалиста (ладно я про них просто так написал, а мог бы и ссылки на Linkedin приложить)
— Качество жизни (может просто не остаться времени на личную жизнь, семью или отдых)
— Выгорание и стресс (в следствие невозможности поддерживать здоровый work-life balance)
Остается открытым вопрос, о том как отсеивать таких кандидатов на входе.
Очевидно, существующие фильтры нужно еще настраивать на оценку намерений. Впрочем, вспоминая «просто Коляна», видимо, это было нужно делать давно.
Есть два вида ошибок.
1. Ошибки инноватора.
Когда ошибка, это обратная связь на проверку гипотезы.
«Не ошибается только тот, кто ничего не делает» — отсюда.
Здесь ошибки ожидаемы и приемлемы и должны превращаться в lessons learned.
"Failure is an option here. If things are not failing, you are not innovating enough" — Elon Musk pic.twitter.com/5tc7yGFAOd
— Curiosity (@MAstronomers) September 20, 2024
2. Ошибки плохого исполнения (Bad execution).
Например, не сданная вовремя платёжка или отчет. Не сделанный или не проверенный бекап. Там, где нет неизвестности и ожидается безупречное исполнение.
Здесь ошибки неприемлемы.
Если они регулярно возникают, это может быть следствием нескольких факторов: недостаток навыков, непонимание задач, плохая мотивация, отсутствие четких инструкций или перегрузка другими задачами.
— Что делать?
— Выяснить причину.
— Как?
— Спросить человека напрямую!
Если проблема в непонимании задачи, недостатке знаний или навыков — организовать обучение, передачу знаний и тренировку.
Если инструкции кривые — переписать, точнее, пусть сам и перепишет понятно.
Если сотрудник перегружен — разобраться, что там за аврал, почему он возник и решить эту проблему
Если не хочет (!) — выяснить в чем причина и найти способ чтобы сам захотел.
Вопрос со звездочкой, кстати. Что нужно, чтобы сотрудники сами хотели?