Битмап / словарь разработчика
510 subscribers
71 photos
1 video
71 links
Всё, что должен знать настоящий сеньор — короткие, но ёмкие заметки о разработке, инструментах, практиках, бизнесе. Выходят каждый день. Подписывайся!
加入频道
🎨 Бас-фактор (bus factor, фактор автобуса) — метрика, используемая для оценки последствий ухода сотрудника из команды.

🚍 Чем выше бас-фактор, тем более равномерно распределены знания об определённой части системы между членами команды.

🌟 Способы снижать риск: поощряйте парное программирование, написание документации, тестов, систематические глубокие код-ревью.

⚠️ Минусы: эти практики могут снижать производительность команды. Не каждая компания может позволить себе такую роскошь.

🔍 Например, в команде checkout интернет-магазина только Иван знает способ расчёта скидок и особенности начисления НДС в разных странах. На документацию и тесты у Ивана не остаётся времени.

Бас-фактор в этой части системы равен 1, а если Ивана собьёт автобус (отсюда название), работа замедлится или вообще встанет.

Если же с ним в паре работет Илья, они вместе пишут документацию, тесты на бизнес-логику, а также рассказывают о ней коллегам, бас-фактор будет равен 2 или выше.

🔗 https://ru.wikipedia.org/wiki/Фактор_автобуса
🔥2👍1
👍 OAuth2 — протокол авторизации, который используется для логина через соцсети, выдачи доступа к защищённым ресурсам.

🚀 Поддерживает разные способы авторизации: на сервере, на клиенте (implicit flow, рекомендуется не использовать), на сторонем устройстве (можно дать SmartTV доступ к вашему аккуанту, открыв URL на телефоне) и другие.

В отличие от OAuth использует короткоживущие токены доступа и является более простым в реализации.

📚 Например, вы хотите запросить у пользователя доступ к его фотографиям в облачном сервисе:

1) Создаёте URL с для auth-cервера, включающий параметр scope=photos, и перенаправляете туда пользователя.

2) Пользователь подтверждает запрос.

3) auth-сервер делает redirect пользователя назад с кодом авторизации (auth code).

4) Ваше приложение использует auth code для получения access token и refresh token.

Уместить в короткий пост такой процесс сложно, поэтому смотрите пример по ссылке ниже 👇

🔗 https://www.oauth.com/oauth2-servers/server-side-apps/example-flow/
👍4
🎯 Рекурсия — способ определения функции через вызов самой себя.

Используется в обходе графов/деревьев, парсинге, алгоритмах поиска, вычислениях рекуррентных отношений (отсюда и название), таких как числа Фибоначчи.

Бывает простой (когда функция вызывает сама себя) и косвенной, когда a() вызывает b(), а b() вызывает a().

Плюсы: простота реализации, возможность решать сложные задачи способом "разделяй и властвуй" (divide & conquer).

👎 Минусы: может быть непонятна, пока не выработана интуиция. Высокое потребление памяти, возможность переполнения стека (stack overflow).

Вместе с рекурсией может использоваться мемоизация, чтобы сделать алгоритм быстрее.

📝 Например, для вычисления N-го числа ряда Фибоначчи подойдёт классический код:
def fib(n):
if n in (0, 1):
return n
return fib(n - 1) + fib(n - 2)

print(fib(13))

При задании рекурсивных функций важно всегда думать о "базовых случаях" — условиях, когда функция должна остановиться.

🔗 https://ru.wikipedia.org/wiki/Рекурсия#В_программировании
🛡️ Code smell (код с душком) — это когда в коде есть признаки вероятно более глубоких проблем, например, с проектированием системы.

Эти признаки не всегда являются ошибками, но могут помочь обнаружить серьёзные проблемы, пока их ещё легко исправить.

Часто code smells определяются автоматически во время выполнения тестов, например, с помощью rubocop для Ruby или eslint для JS.

Используйте их с осторожностью, потому что многие "признаки плохого кода" очень субъективны, а реальное программирование невозможно без компромиссов.

📚 Типичные примеры включают в себя:

• слишком длинные методы
• классы с раздутой областью ответственности, у которых много методов (god objects)
• много аргументов у функций
• более частое обращение к методам и свойствам другого класса, чем к своим (feature envy)
• повторяющийся код

🔗 https://ru.wikipedia.org/wiki/Запах_кода
🔥1
LTV, иногда CLTV (customer lifetime value, пожизненная ценность) — это выручка, которую компания ожидает получить от одного клиента в течение всего срока его взаимодействия с бизнесом.

LTV является усреднённым показателем, который используется в маркетинге и планировании для расчёта возможных затрат на привлечение (CAC, customer acquisition cost) и удержание клиентов.

🤷‍♀️ Его легко спутать с ARPU (average revenue per user) — cредней выручкой от клиента за определённый срок.

📖 Например, если пользователь платит стримингу 1,000 руб. в месяц и остаётся в среднем на 15 месяцев, его LTV составит 15,000 рублей.

🔗 https://ru.wikipedia.org/wiki/Пожизненная_ценность_клиента
🔥3
💡 Отток клиентов (customer churn rate) — показатель количества клиентов, которые бизнес теряет за данный период времени, обычно месяц или год. Измеряется в процентах.

Важен для бизнесов с подписочной моделью: SaaS (sofware as a service), телекомов (операторы сотовой связи и интернет-провайдеры), стримингов.

🎯 Чем выше отток, тем хуже продукт или услуга решают задачу пользователей и соответствуют их ожиданиям.

🤔 Churn может мяняться и под влиянием внешних обстоятельств: кризисов, войн и т.п.

Не путайте customer churn с revenue churn, оттоком выручки.

🔍 Представьте, что оператор сотовой связи обслуживает 1,000 клиентов зарабатывает 1,000,000 руб в месяц.

Каждый месяц он теряет 1% клиентов, то есть 10 человек.

Отток выручки составляет 15,000 руб против ожидаемых 10,000 руб (10 x 1,000 руб в среднем на клиента).

Такое возможно, если некоторые из клиентов переключаются на более дешёвые тарифы, например.

🔗 https://ru.wikipedia.org/wiki/Отток_клиентов
👍2
🌍 REST API (Representational State Transfer) — это способ построения API для веб-сервисов.

Обычно работает поверх протокола HTTP и использует методы GET, POST, PUT и DELETE для выполнения CRUD-операций над ресурсами.

Важные свойства REST:

1️⃣ отсутствие состояния (stateless) — ни сервер, ни клиент не обязаны знать о прежних запросах.

2️⃣ операции над ресурсами, а не выполнение команд — в этом отличие от RPC-протоколов.

REST API — это один из способов сделать API на основе HTTP с использованием JSON.

🧐 Вокруг этих терминов часто возникает путаница: не каждый веб-сервис с HTTP API является RESTful, а REST API не обязан исползовать HTTP для транспорта или JSON для сериализации данных.

📖 Например, так может выглядеть ответ на запрос GET /users/1

{
"links": {
"self": "http://api.app.com/users/1",
"friends": "http://api.app.com/users/1/friends"
},
"data": {
"id": "1",
"type": "user",
"attributes": {
"name": "Oleg Gromov"
}
}
}


🔗 https://ru.wikipedia.org/wiki/REST
👍5🔥21
🔍 HATEOAS (Hypermedia as the Engine of Application State) — это одно из важных ограничений RESTful архитектуры.

Означает, что сервер отвечает данными не только о запрошенном ресурсе, но и о связанных с ним ресурсах.

🏆 По сути, это адаптация идеи WWW для HTTP API.

Как пользователь открывает страницу и дальше переходит по ссылкам, так и API-клиент может узнавать о возможностях cервера прямо из его ответов, а не хардкодить урлы его "ручек".

Благодаря этому клиент и сервер могут развиваться отдельно друг от друга, что может быть полезно для публичных API.

👎 Минусы: ограничение достаточно абстрактное и теоретическое, его сложно встретить в "дикой природе" и ещё сложнее правильно реализовать.

Обычному веб-приложению совсем не нужны эти премудрости, т.к. несмотря на деление на клиент-сервер, оно развивается и обновляется как монолит.

📚 Например, HATEOAS используется в REST API системы управления задачами Genie от Netflix 👇

🔗 https://netflix.github.io/genie/docs/3.0.0/rest/#_hateoas_links_4
🤔2👍1
🚩 Мемоизация (memoization) — это ускорение долгой функции, которая вызывается несколько раз, c помощью кэширования результатов.

Часто используется вместе с рекурсией.

Для мемоизации обычно используется cловарь, где ключом являются параметры фукнкции, а значением — её результат.

Плюсы: ускорение выполнения за счёт уменьшения количества повторных вычислений.

⛔️ Минусы: увеличение потребления памяти из-за хранения промежуточных результатов.

Даёт ускорение только при наличии частых повторных вычислений, иначе может просто сожрать память.

📚 Например, запустите эту программу на python и сравните количество вызовов fib_memo с fib.
def fib(n):
if n <= 1:
return n
print(n)
return fib(n-1) + fib(n-2)

def fib_memo(n, memo):
if n in memo:
return memo[n]
if n <= 1:
return n
print(n)
memo[n] = fib_memo(n-1, memo) + fib_memo(n-2, memo)
return memo[n]

print('memoized: %d' % fib_memo(10, {}))
print('recursive: %d' % fib(10))


🔗 https://ru.wikipedia.org/wiki/Мемоизация
👍3
Пятница-пятница. А вы деплоили сегодня? 😁
🔥10👍1
Сине-зелёные деплои (blue-green depoyments) — это метод развёртывания приложений без даунтайма (downtime, простой).

Есть 2 идентичные среды: "синяя" и "зелёная". "Синяя" обслуживает пользователей, а "зелёная" используется для развертывания и тестирования новой версии.

Если релиз успешный, трафик переключается с синего на зелёное окружение, а они меняются местами.

🔥 Плюсы: деплои проходят без простоя (zero-downtime deployment), можно быстро откатить релиз.

😢 Минусы: требует работы двух идентичных сред, а это накладно для сложных приложений. Нужен reverse-proxy или load balancer для роутинга трафика.

📚 Скажем, вы выкатываете новый бэкенд сервиса такси.

Релиз проходит без простоя, потому что новый код попадает только на серверы в "зелёном" окружении, где он тестируется и запускается.

Пользователи не замечают деплоя и плавно "перетекают" из одной копии в другую благодаря использованию reverse-proxy, например, traefik или haproxy.

🔗 https://yandex.cloud/ru/docs/tutorials/web/blue-green-canary-deployment
🔥3👍1
👍 COALESCE() — это SQL-функция, которая возвращает первое не-NULL значение из списка аргументов.

🤗 Её полезно использовать при работе с данными, где могут встречаться NULL.

📚 Например, есть таблица с заказами, и вы хотите посчитать стоимость каждого заказа.

При этом NULL и 0 в колонке tax отличаются: при NULL вам не нужно подавать отчёт по НДС, а при 0 всё равно нужно.
| order_id | subtotal | tax    |
|----------|----------|--------|
| 201 | 120.00 | NULL |
| 202 | 45.75 | 3.50 |
| 203 | 89.99 | NULL |
| 204 | 150.00 | 12.00 |

Наивный запрос вернёт неправильные значения total для tax = NULL.
SELECT 
order_id,
subtotal + tax AS total
FROM orders;

Чтобы получить правильные результаты, используйте COALESCE:
SELECT 
order_id,
subtotal + COALESCE(tax, 0) AS total
FROM orders;


🔗 https://ru.wikipedia.org/wiki/NULL_(SQL)#Операции_с_NULL
👍7
👍 git bisect — это способ найти коммит с ошибкой в git-репозитории.

👌 Он ускоряет процесс перебора благодаря использованию бинарного поиска, а также автоматически переключается между коммитами.

Особенно полезен в больших проектах и при работе с чужим кодом, когда искать ошибку вручную будет очень долго.

🔍 Например, вы знаете, что в текущем HEAD-коммите баг есть, а в версии 3.5 его не было.
git bisect start
git bisect bad
git bisect good v3.5

Потом, на каждом шаге, проверяйте наличие бага в данной версии и используйте git bisect good или git bisect bad.

Остановить процесс в любой момент поможет git bisect reset.

🔗 https://git-scm.com/book/ru/v2/Инструменты-Git-Обнаружение-ошибок-с-помощью-Git#r_binary_search
🔥92
🚩 Xerox Alto — это первый компьютер, который предложил пользователям графический интерфейс.

Он произвёл настоящую революцию: вместе с GUI (graphic user interface) появилась концепция окон и пиктограмм (иконок), с которыми можно взаимодействовать с помощью мышки.

Его разработали в 1973 году в исследовательском центре Xerox PARC, а одним из главных разработчиков был Alan Key (снова он!).

В момент выхода на рынок компьютер стоил от $32,000, что в те годы было относительно невысокой ценой для персонального компьютера — размером с комод, на минуточку.

P.S. Любопытно, что Xerox произносится по-английски "зиракс", с ударением на первый слог, а вовсе не "ксерокс" 🤪

🔗 https://www.youtube.com/watch?v=M0zgj2p7Ww4
🔥5
Спагетти-кодом называют плохо структурированный код, в котором сложно проследить порядок исполнения, взаимосвязи, отделить важное от неважного.

У него есть множество разных признаков:

1️⃣ перемешаны бизнес-логика и представление, "чистая" и императивная часть

2️⃣ взаимозависимость компонентов: всё зависит от всего, нет явной иерархии и слоёв

3️⃣ нарушена инкапсуляция, отсутствуют или неправильно созданы абстракции (типичный PHP)

4️⃣ состояние разбросано по всей программе, не получается изолировать разные компоненты

5️⃣ глубоко вложенные условия, циклы, callback-функции (классический jQuery)

Этот код невозможно тестировать автоматически, а любое изменение приводит к каскаду последствий, которые иногда сложно даже обнаружить.

📝 Например, вот кусочек jQuery-кода, который подходит под описание спагетти-кода.

Или вот чей-то кусок кода для Wordpress, который выводит комментарии к посту.

Общее у них то, что ничего невозможно понять 💩 Не пишите так.

🔗 https://ru.wikipedia.org/wiki/Спагетти-код
👍4🤔1
Amazon S3 (Simple Storage Service) — сервис хранения "объектов".

В отличие от файлов в иерархической файловой системе, объекты хранятся в key-value хранилище с определённым именем (bucket).

В нём нет каталогов, а "пути" являются частью ключа-строки.

🤌 Объекты нельзя модифицировать, только заменить новой копией. Например, не получится открыть текстовый файл и изменить в нём один символ.

S3 является де-факто стандартом для хранения разной статики: видео, фото, аудио, бэкапов. Его API также поддерживается большинством аналогов.

❤️ Плюсы: надёжность, практически бесконечная масштабируемость.

⛔️ Минусы: S3 может оказаться очень дорогим для хранения данных большого объёма, особенно при неверном исплоьзовании. Зависимость (вендор-лок) от AWS.

Чтобы сэкономить, рассмотрите более "холодные" классы хранения (storage classes), а также взгляните на Backblaze B2.

Используйте CDN, например, Cloudfront или Cloudflare, чтобы уменьшить egress fees.

🔗 https://yandex.cloud/ru/docs/storage/s3/api-ref/
4👍1
CORS (Cross-Origin Resource Sharing) — это способ ограничения доступа к ресурсам веб-сервера (картинкам и пр.).

Включает в себя набор HTTP-заголовков, которые можно использовать в ответе, например:

Access-Control-Allow-Origin для указания разрешённого домена
Access-Control-Allow-Methods для разрешённых HTTP-методов

📌 Только современные браузеры учитывают CORS-ограничения.

CORS нужен, чтобы разрешить кросс-доменные XHR-запросы, например, в API, а также ограничить нагрузку на сервер.

🧐 Не путайте CORS и CSP, Content Security Policy, которые используется для ограничения со стороны страницы (см. следующий пост).

📚 Например, вы делаете редактор мемов и загружаете картинку https://i.chzbgr.com/full/9699850496/h4640AF11 через XHR, чтобы вставить в canvas.

Браузер делает запрос, и получает следующий заголовок в ответе:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: i.chzbgr.com

У вашего сайта другой домен, поэтому картника не загрузится.

🔗 https://ru.wikipedia.org/wiki/Cross-origin_resource_sharing
🔥6👍4
CSP (Content Security Policy) — это способ разрешить странице загружать только определённые ресурсы.

Ограничения выставляются через HTTP-заголовок Content-Security-Policy или meta-теги.

CSP нужен, чтобы защитить пользователей от XSS-атак, а также чтобы явно указать, какие картинки, скрипты, стили и т.п. и откуда может загружать страница.

Так же, как и CORS, CSP учитываются только современными браузерами.

🤔 Но, в отличие от CORS, CSP-ограничения работают наоборот: они указываются для страницы, а не ресурса.

📚 Скажем, вы работаете над новостным сайтом, и сейчас все его страницы отдаются со следующим заголовком:


Вы хотите начать показывать рекламу Яндекса, которая грузится с an.yandex.ru, поэтому вам нужно обновить заголовок:


⚠️ Лучше явно указывать директивы script-src, style-src, img-src и подобные вместо default-src.

🔗 https://developer.mozilla.org/ru/docs/Web/HTTP/CSP
👍10🤔1
CAC (Customer Acquisition Cost) — стоимость привлечения клиента.

Расчитывается по формуле: CAC = затраты на маркетинг и продажи / кол-во привлечённых клиентов.

🧩 Используется при планировании и анализе маркетинговых кампаний, в юнит-экономике.

Также полезно держать в уме CAC при планировании cтоимости сетки продуктов.

Для стартапов важно отношение CAC:LTV (life-time value, сколько денег принесёт клиент компании за всё время) — чем оно меньше, тем лучше.

Если CAC > LTV, то юнит-экономика не сходится, а значит бизнес нестабилен, не может расти и, скорее всего, долго не протянет.

🔍 Допустим, SaaS-компания тратит в месяц на маркетинг и отдел продаж $50,000.

В среднем ей удаётся привлекать 200 новых клиентов в месяц, то есть:
CAC = $50,000 / 200 = $250

Если при этом средний чек cоставляет $1000, то у компании всё в порядке.

Если же они продают B2C продукт со стоимостью подписки в $10, то всё очень плохо ☠️

🔗 https://en.wikipedia.org/wiki/Customer_acquisition_cost
👍5