🚩 Хеш-таблица — структура данных, которая хранит пары ключ-значение и даёт быстрый доступ к данным по ключу.
Операции поиска, вставки и удаления элементов в
Хеш-таблица — одна из самых популярных структур данных. Она известна как ассоциативный массив, словарь (dictionary), "мапа" (map), объект (в JS) или просто массив (в PHP).
⏳ Сложность основных операций : вставка и получение элемента — от
📚 Пример использования хэш-таблицы (словаря или
При каждом обращении к словарю по ключу, он превращается в числовой ключ с помощью хеш-функции и используется, чтобы найти область в памяти, где хранится значение.
🔗 https://ru.wikipedia.org/wiki/Хеш-таблица
Операции поиска, вставки и удаления элементов в
hashmap
почти мгновенны благодаря использованию быстрой хеш-функции.Хеш-таблица — одна из самых популярных структур данных. Она известна как ассоциативный массив, словарь (dictionary), "мапа" (map), объект (в JS) или просто массив (в PHP).
⏳ Сложность основных операций : вставка и получение элемента — от
O(1)
до O(n)
, в зависимости от выбранной функции.📚 Пример использования хэш-таблицы (словаря или
dict
в терминах python):phones = {
"Oleg": "+123456789",
"Dima": "+987654321",
"Alex": "+192837465"
}
phones["Dima"] = "+564738291"
print(phones["Alex"])
del phones["Oleg"]
if "Oleg" in phones:
print("Oleg найден в телефонной книге")
При каждом обращении к словарю по ключу, он превращается в числовой ключ с помощью хеш-функции и используется, чтобы найти область в памяти, где хранится значение.
🔗 https://ru.wikipedia.org/wiki/Хеш-таблица
👍3🔥2
🚩 Хеш-функция — алгоритм, который принимает входные данные произвольной длины и преобразует их в число фиксированной разрядности.
Это число обычно представляют как шестнадцатеричную строку:
Даже небольшое изменение входных данных приводит к значительному изменению хеша.
Хеш-функции используются в алгоритмах шифрования и цифровых подписях, в хеш-таблицах, для создания контрольных сумм и уникальных идентификаторов (UUID, например).
⏳ Сложность по времени :
💾 Сложность по памяти :
👍 Плюсы: универсальность, относительно высокая скорость.
😞 Минусы: возможность коллизий, необратимость — имея хеш, восстановить исходные данные невозможно. Только перебором.
🔍 Пример использования sha256 в python:
🔗 https://ru.wikipedia.org/wiki/Хеш-функция
Это число обычно представляют как шестнадцатеричную строку:
0xC0FFEE
.Даже небольшое изменение входных данных приводит к значительному изменению хеша.
Хеш-функции используются в алгоритмах шифрования и цифровых подписях, в хеш-таблицах, для создания контрольных сумм и уникальных идентификаторов (UUID, например).
⏳ Сложность по времени :
O(1)
для вычисления хеша.💾 Сложность по памяти :
O(n)
, где n
— размер input.👍 Плюсы: универсальность, относительно высокая скорость.
😞 Минусы: возможность коллизий, необратимость — имея хеш, восстановить исходные данные невозможно. Только перебором.
🔍 Пример использования sha256 в python:
import hashlib
h = hashlib.sha256()
h.update(b'@bitmap18 - best channel on Telegram!')
# db67ff18bdcf98ae9410dbd459c19cd79c15664e39bcc10cddb163142b084b0f
print(h.hexdigest())
🔗 https://ru.wikipedia.org/wiki/Хеш-функция
👍4🔥1
🌍 CRC32 (cyclic redundancy check, 32 бит) — алгоритм для быстрого вычисления контрольной суммы.
Принимает на вход поток данных и возвращает 32-битный
CRC32 используется для проверки целостности данных в ZIP-архивах, Ethernet, жёстких дисках.
⏳ Сложность по времени :
💾 Сложность по памяти :
🥇 Плюсы: высокая скорость вычисления, простота реализации.
👎 Минусы: не защищает от преднамеренных изменений данных (алгоритм простой, и его легко "надуть"), вероятны коллизии.
📖 Для примера, функция
🔗 https://ru.wikipedia.org/wiki/Циклический_избыточный_код
Принимает на вход поток данных и возвращает 32-битный
int
.CRC32 используется для проверки целостности данных в ZIP-архивах, Ethernet, жёстких дисках.
⏳ Сложность по времени :
O(n)
, где n
— количество байт данных.💾 Сложность по памяти :
O(1)
.🥇 Плюсы: высокая скорость вычисления, простота реализации.
👎 Минусы: не защищает от преднамеренных изменений данных (алгоритм простой, и его легко "надуть"), вероятны коллизии.
📖 Для примера, функция
CRC32
на JavaScript:function crc32(str) {
let crc = -1;
for (let i = 0; i < str.length; i++) {
crc = crc ^ str.charCodeAt(i);
for (let j = 0; j < 8; j++) {
if ((crc & 1) !== 0) {
crc = (crc >>> 1) ^ 0xedb88320;
} else {
crc = crc >>> 1;
}
}
}
return (crc ^ (-1)) >>> 0;
}
// выведет 1846494140
console.log(crc32('подпишись на @bitmap18 в телеге'));
🔗 https://ru.wikipedia.org/wiki/Циклический_избыточный_код
👍6
🌍 Минимально жизнеспособный продукт (MVP, Minimum Viable Product) — это версия продукта с самым необходимым функционалом.
🔥 Задача MVP: проверить гипотезы о продукте, понять потребности пользователей и оценить спрос без больших рисков и затрат.
🤔 Не путайте MVP и прототип: оба используются для тестирования идей, но MVP должен быть полезен пользователям — а прототип может просто показывать техническую возможность реализации задумки.
📚 Например, ваш стартап разрабатывает новое мобильное приложение для заказа еды.
Вместо приложения с множеством функций ваша команда решает выпустить MVP, включащий только самое важное: выбор ресторана, просмотр меню и оформление заказа.
Это позволяет вам закончить разработку за несколько месяцев (вместо года), а бизнесу — получить обратную связь от первых клиентов и решить, стоит ли инвестировать в полноценную разработку.
🔗 https://ru.wikipedia.org/wiki/Минимально_жизнеспособный_продукт
🔥 Задача MVP: проверить гипотезы о продукте, понять потребности пользователей и оценить спрос без больших рисков и затрат.
🤔 Не путайте MVP и прототип: оба используются для тестирования идей, но MVP должен быть полезен пользователям — а прототип может просто показывать техническую возможность реализации задумки.
📚 Например, ваш стартап разрабатывает новое мобильное приложение для заказа еды.
Вместо приложения с множеством функций ваша команда решает выпустить MVP, включащий только самое важное: выбор ресторана, просмотр меню и оформление заказа.
Это позволяет вам закончить разработку за несколько месяцев (вместо года), а бизнесу — получить обратную связь от первых клиентов и решить, стоит ли инвестировать в полноценную разработку.
🔗 https://ru.wikipedia.org/wiki/Минимально_жизнеспособный_продукт
👍4🔥1
📋 Продакт-маркет фит (PMF, product-market fit) — это важный момент в развитии стартапа, когда продукт начинает хорошо продаваться.
📌 Без PMF не будет продаж, серьёзных инвестиций, а также гарантий роста и развития бизнеса.
🧐 Не путайте продакт-маркет фит с первыми продажами. PMF — это более глубокое понятие, означающее устойчивый спрос и
📝 Скажем, вы разработали приложение для составления фитнес-программ.
После первой обратной связи от пользователей вы обнаружили, что спортсмены хоть и пользуются приложением, но не готовы платить.
В погоне за PMF вы делаете пивот в сторону платных персонализированных программ. Их покупают, но привлечение клиентов остаётся дорогим.
Тогда вы фокусируетесь на новой аудитории: профессиональных фитнес-тренерах, которым нужно приложение для разработки тренировочных программ, которые готовы за него платить.
Похоже на продакт-маркет фит 🔥
🔗 https://gopractice.ru/product/product-market-fit/
📌 Без PMF не будет продаж, серьёзных инвестиций, а также гарантий роста и развития бизнеса.
🧐 Не путайте продакт-маркет фит с первыми продажами. PMF — это более глубокое понятие, означающее устойчивый спрос и
CAC < LTV
— стоимость привлечения клиента ниже, чем выручка, которую он принесёт.📝 Скажем, вы разработали приложение для составления фитнес-программ.
После первой обратной связи от пользователей вы обнаружили, что спортсмены хоть и пользуются приложением, но не готовы платить.
В погоне за PMF вы делаете пивот в сторону платных персонализированных программ. Их покупают, но привлечение клиентов остаётся дорогим.
Тогда вы фокусируетесь на новой аудитории: профессиональных фитнес-тренерах, которым нужно приложение для разработки тренировочных программ, которые готовы за него платить.
Похоже на продакт-маркет фит 🔥
🔗 https://gopractice.ru/product/product-market-fit/
🔥6
🧩 Владение кодом — это когда разработчик или команда несёт ответственность за конкретную часть кода.
Это позволяет принимать обдуманные решения по развитию, быстро исправлять ошибки, консультировать других разработчиков.
Явное владение кодом чаще встречается в крупных компаниях.
🔥 Плюсы: улучшение качества кода, ускорение процесса разработки.
⛔️ Минусы: изоляция знаний, более сильная зависимость от одного человека или команды. Избыточность для маленьких проектов.
📖 Например, в команде разработки интернет-магазина Саша отвечает за модуль аутентификации.
Он знает все нюансы его работы и может быстро вносить изменения или исправлять баги.
Когда кто-то самостоятельно вносит изменения в эту часть системы, GitHub автоматически назначает Сашу ревьюером во все связанные пул-реквесты (если в репозитории есть
🔗 https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
Это позволяет принимать обдуманные решения по развитию, быстро исправлять ошибки, консультировать других разработчиков.
Явное владение кодом чаще встречается в крупных компаниях.
🔥 Плюсы: улучшение качества кода, ускорение процесса разработки.
⛔️ Минусы: изоляция знаний, более сильная зависимость от одного человека или команды. Избыточность для маленьких проектов.
📖 Например, в команде разработки интернет-магазина Саша отвечает за модуль аутентификации.
Он знает все нюансы его работы и может быстро вносить изменения или исправлять баги.
Когда кто-то самостоятельно вносит изменения в эту часть системы, GitHub автоматически назначает Сашу ревьюером во все связанные пул-реквесты (если в репозитории есть
.github/CODEOWNERS
).🔗 https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
👍4🔥3
🧩 Код-фриз (code freeze) — это когда разработка новых фич и внесение изменений в код временно останавливаются.
Во время код-фриза команда сосредотачивается на исправлении багов и улучшении производительности, чтобы обеспечить максимальную стабильность и качество продукта.
Так делают перед очередным крупным релизом или важным запуском.
🚀 Плюсы: повышает стабильность и качество выпускаемого продукта, особенно с нечастыми большими релизами.
❌ Минусы: может замедлить внедрение новых функций. Нет особого смысла применять в простых и понятных системах или маленьких командах.
📖 Представьте, что ваша команда разрабатывает десктоп-приложение, и вы планируете выпустить 13-ю версию через месяц.
За две недели до релиза менеджмент объявляет код-фриз.
Это означает, что все новые функции откладываются, а команда фокусируется на тестировании и исправлении ошибок, чтобы убедиться, что новая версия может быть выпущена в свет.
🔗 https://ru.wikipedia.org/wiki/Заморозка_(программное_обеспечение)
Во время код-фриза команда сосредотачивается на исправлении багов и улучшении производительности, чтобы обеспечить максимальную стабильность и качество продукта.
Так делают перед очередным крупным релизом или важным запуском.
🚀 Плюсы: повышает стабильность и качество выпускаемого продукта, особенно с нечастыми большими релизами.
❌ Минусы: может замедлить внедрение новых функций. Нет особого смысла применять в простых и понятных системах или маленьких командах.
📖 Представьте, что ваша команда разрабатывает десктоп-приложение, и вы планируете выпустить 13-ю версию через месяц.
За две недели до релиза менеджмент объявляет код-фриз.
Это означает, что все новые функции откладываются, а команда фокусируется на тестировании и исправлении ошибок, чтобы убедиться, что новая версия может быть выпущена в свет.
🔗 https://ru.wikipedia.org/wiki/Заморозка_(программное_обеспечение)
❤3
🚀 Бинарный поиск (binary search) — алгоритм поиска элемента в отсортированном массиве.
На каждом шаге он ищет элемент в центре массива, а затем делит его пополам и продолжает в левой или правой половине.
Процесс повторяется, пока элемент не будет найден или не закончится массив.
Он используется в базах данных, поисковых системах и
⏳ Сложность по времени :
💾 Сложность по памяти :
❤️ Плюсы: высокая скорость поиска в больших отсортированных массивах.
👎 Минусы: требует предварительной сортировки.
📖 Пример на python:
🔗 https://ru.wikipedia.org/wiki/Бинарный_поиск
На каждом шаге он ищет элемент в центре массива, а затем делит его пополам и продолжает в левой или правой половине.
Процесс повторяется, пока элемент не будет найден или не закончится массив.
Он используется в базах данных, поисковых системах и
git bisect
.⏳ Сложность по времени :
O(log n)
.💾 Сложность по памяти :
O(1)
.❤️ Плюсы: высокая скорость поиска в больших отсортированных массивах.
👎 Минусы: требует предварительной сортировки.
📖 Пример на python:
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
print(binary_search([1, 3, 5, 7, 9, 11, 13], 7))
🔗 https://ru.wikipedia.org/wiki/Бинарный_поиск
👍2
🌍 CDN (content delivery network, сеть доставки контента) — это распределённая сеть серверов, которая ускоряет доставку контента пользователям.
CDN кэширует статические файлы: изображения, видео, CSS, на edge-серверах, расположенных ближе к пользователям.
🏆 Плюсы: уменьшение сетевых задержек и увеличение скорости загрузки, что важно для любого мало-мальски популярного сайта. Снижение нагрузки на ваши веб-серверы.
😢 Минусы: дополнительные затраты на настройку и поддержание инфраструктуры, возможные сложности с кэшированием динамического контента.
📖 Скажем, вы разрабатываете новостной сайт на разных языках.
Понимая, что у вас будет большой объём трафика из разных стран, вы решаете использовать CDN (Cloudflare или Amazon Cloudfront), чтобы закэшировать картинки и видео.
Это позволит пользователям получать контент быстрее, так как он будет поступать с ближайшего к ним сервера, а вы не будете волноваться, что ваш
🔗 https://ru.wikipedia.org/wiki/Сеть_доставки_контента
CDN кэширует статические файлы: изображения, видео, CSS, на edge-серверах, расположенных ближе к пользователям.
🏆 Плюсы: уменьшение сетевых задержек и увеличение скорости загрузки, что важно для любого мало-мальски популярного сайта. Снижение нагрузки на ваши веб-серверы.
😢 Минусы: дополнительные затраты на настройку и поддержание инфраструктуры, возможные сложности с кэшированием динамического контента.
📖 Скажем, вы разрабатываете новостной сайт на разных языках.
Понимая, что у вас будет большой объём трафика из разных стран, вы решаете использовать CDN (Cloudflare или Amazon Cloudfront), чтобы закэшировать картинки и видео.
Это позволит пользователям получать контент быстрее, так как он будет поступать с ближайшего к ним сервера, а вы не будете волноваться, что ваш
nginx
не справится с пиковой нагрузкой.🔗 https://ru.wikipedia.org/wiki/Сеть_доставки_контента
👍1
🎯 HTTP-заголовок — часть запроса или ответа, содержащая мета-информацию о передаваемых данных или самом запросе/ответе.
Заголовки используются для передачи информации о клиенте, сервере, типе контента, методах аутентификации и т.д.
📝 Примеры заголовков:
Попробуйте скачать файл с помощью
Обратите внимание на заголовок
Это означает, что Cloudflare, который в данном случае используется в качестве CDN, "отдал" картинку из собственного кэша.
🔗 https://developer.mozilla.org/ru/docs/Web/HTTP/Headers
Заголовки используются для передачи информации о клиенте, сервере, типе контента, методах аутентификации и т.д.
📝 Примеры заголовков:
Content-Type
(MIME-тип контента), User-Agent
(идентификатор браузера и ОС), Cookie
(куки, которые браузер передаёт на сервер).Попробуйте скачать файл с помощью
curl
:> curl -I https://gromov.com/s/g/favicon.29a2003d.svg
HTTP/2 200
date: Sun, 18 Aug 2024 13:41:22 GMT
content-type: image/svg+xml
content-length: 1614
last-modified: Thu, 27 Jun 2024 10:05:42 GMT
etag: "667d3976-64e"
expires: Mon, 18 Aug 2025 13:40:51 GMT
cache-control: public, max-age=31536000
cf-cache-status: HIT
Обратите внимание на заголовок
cf-cache-status
и его значение HIT
.Это означает, что Cloudflare, который в данном случае используется в качестве CDN, "отдал" картинку из собственного кэша.
🔗 https://developer.mozilla.org/ru/docs/Web/HTTP/Headers
🔥3
🧩 curl — это утилита для передачи данных по сети, доступная в unix-подобных ОС.
Чаще всего его используют, чтобы делать HTTP-запросы из командной строки, но вообще
🔑 curl подходит для получения данных с сайтов, тестирования API или автоматизации каких-то важных действий в CI/CD: например, с помощью
🔄 Среди альтернатив
📝 Вот пример использования curl:
🔗 https://ru.wikipedia.org/wiki/CURL
Чаще всего его используют, чтобы делать HTTP-запросы из командной строки, но вообще
curl
позволяет работать и с другими протоколами, например, FTP или SMTP.🔑 curl подходит для получения данных с сайтов, тестирования API или автоматизации каких-то важных действий в CI/CD: например, с помощью
curl
можно выполнять health-check новых инстансов сервисов.🔄 Среди альтернатив
curl
можно выделить wget
или httpie
. Последний мне нравится за более удобный интерфейс — как CLI, так и GUI 👍📝 Вот пример использования curl:
# Обычный GET-запрос
curl https://example.com
# Отправка POST-запроса с JSON-данными
curl -X POST \
-H "Content-Type: application/json"\
-d '{"name":"John"}'\
https://api.example.com/users
🔗 https://ru.wikipedia.org/wiki/CURL
🔥3👍1
🎯 Непрерывная интеграция и развёртывание (CI/CD) — метод автоматизации интеграции изменений в коде и его деплоя.
👌 Постоянная интеграция (continuous integration, CI) позволяет обнаружить ошибки как можно скорее через тестовые сборки, запуск автотестов и прочие проверки.
CI не даёт гарантий, но без неё ошибки могут обнаружиться после или во время релиза.
🚀 Регулярное развёртывание (continuous deployment, CD) позволяет быстро обновлять продукт и получать важные для бизнеса результаты.
Без CD, деплои становятся ритуалом, задействующим несколько (или десятки) человек, которые вручную выполняют сотни однообразных действий.
No bueno.
📚 Представьте 2 новые фичи в музыкальном приложении, которые обновляют модуль
Чем раньше они будут смёржены в основную ветку (интегрированы), тем быстрее получится разрешить конфликт.
Благодаря регулярным деплоям новая версия приложения попадает к пользователям уже на следующий день, а не через месяц.
🔗 https://ru.wikipedia.org/wiki/CI/CD
👌 Постоянная интеграция (continuous integration, CI) позволяет обнаружить ошибки как можно скорее через тестовые сборки, запуск автотестов и прочие проверки.
CI не даёт гарантий, но без неё ошибки могут обнаружиться после или во время релиза.
🚀 Регулярное развёртывание (continuous deployment, CD) позволяет быстро обновлять продукт и получать важные для бизнеса результаты.
Без CD, деплои становятся ритуалом, задействующим несколько (или десятки) человек, которые вручную выполняют сотни однообразных действий.
No bueno.
📚 Представьте 2 новые фичи в музыкальном приложении, которые обновляют модуль
equalizer
, но каждая делает это по-своему.Чем раньше они будут смёржены в основную ветку (интегрированы), тем быстрее получится разрешить конфликт.
Благодаря регулярным деплоям новая версия приложения попадает к пользователям уже на следующий день, а не через месяц.
🔗 https://ru.wikipedia.org/wiki/CI/CD
👍2
🚀 Общие табличные выражения (Common Table Expressions) в SQL используются для упрощения сложных запросов и улучшения их читаемости.
💔 Без общих табличных выражениий сложные запросы быстро обрастают повторениями, становятся сложными для восприятия и отладки.
😁 Использование CTE позволяет разбить сложный запрос на более простые части и избежать вложенных запросов.
📝 Вот простой пример для запроса к базе данных по заказам:
🔗 https://ru.wikipedia.org/wiki/Иерархические_и_рекурсивные_запросы_в_SQL#Общее_табличное_выражение
WITH
создаёт временные результирующие наборы данных, которые можно использовать в следующих запросах, как если бы они были обычными таблицами. 💔 Без общих табличных выражениий сложные запросы быстро обрастают повторениями, становятся сложными для восприятия и отладки.
😁 Использование CTE позволяет разбить сложный запрос на более простые части и избежать вложенных запросов.
📝 Вот простой пример для запроса к базе данных по заказам:
WITH Sales_CTE AS (
SELECT
SalesPersonID,
SUM(SalesAmount) AS TotalSales
FROM Sales
GROUP BY SalesPersonID
)
SELECT SalesPersonID, TotalSales
FROM Sales_CTE
WHERE TotalSales > 10000;
🔗 https://ru.wikipedia.org/wiki/Иерархические_и_рекурсивные_запросы_в_SQL#Общее_табличное_выражение
💡 Оператор
💔 Если не использовать оператор
📚 Представьте, что вы выводите данные пользователей в цикле.
Есть зарегистрированные пользователи, а есть новые, о которых известен только их
Первый цикл сработает, а вот второй упадёт с ошибкой. Видите разницу?
🔗 https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Optional_chaining
?.
(optional chaining) в JavaScript используется для безопасного доступа к свойствам вложенных друг в друга объектов, которые могут быть undefined
или null
.💔 Если не использовать оператор
?.
, то при попытке доступа к свойству undefined
-объекта вы получите ошибку.📚 Представьте, что вы выводите данные пользователей в цикле.
Есть зарегистрированные пользователи, а есть новые, о которых известен только их
login
.const user = {
personal: {
name: 'Alice',
},
login: 'alice',
id: 23,
};
const temp_user = {
login: 'oleg',
id: -1,
};
const users = [user, temp_user];
for (const user of users) {
console.log(user.login, user.personal?.name);
}
for (const user of users) {
console.log(user.login, user.personal.name);
}
Первый цикл сработает, а вот второй упадёт с ошибкой. Видите разницу?
🔗 https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Optional_chaining
📋 Smalltalk был разработан в 70-х исследователями Adele Goldberg, Dan Ingalls, Alan Kay в центре Xerox PARC, которому мы должны быть благодарны за кучу прорывных идеи и инноваций.
💎 Этот язык ввёл в обиход массу концепций, которые сегодня воспринимаются как данность:
• всё является объектом (привет, Python)
• объекты общаются через передачу и приём сообщений (здравствуй, Objective C)
• код организован в классы и методы (привет, Java).
📅 Smalltalk достиг пика своей популярности в 80-х, когда его использовали для создания интерактивных графических интерфейсов (GUI) и образовательных программ.
📚 Пример кода на Smalltalk:
Последняя строка означает передачу сообщения.
🔗 https://ru.wikipedia.org/wiki/Smalltalk
💎 Этот язык ввёл в обиход массу концепций, которые сегодня воспринимаются как данность:
• всё является объектом (привет, Python)
• объекты общаются через передачу и приём сообщений (здравствуй, Objective C)
• код организован в классы и методы (привет, Java).
📅 Smalltalk достиг пика своей популярности в 80-х, когда его использовали для создания интерактивных графических интерфейсов (GUI) и образовательных программ.
📚 Пример кода на Smalltalk:
Object subclass: Person [
| name |
Person class >> name: n [
^self new init: n.
]
init: n [
name := n.
]
greet: g [
Transcript show: g, ', my name is ', name; cr.
]
]
| person |
person := Person name: 'Alice'.
person greet: 'Hello'.
Последняя строка означает передачу сообщения.
🔗 https://ru.wikipedia.org/wiki/Smalltalk
👍2
✨ Посты прошедшей недели:
- Технический долг
- Хейзенбаг
- Поток
- Хеш-таблица
- Хеш-функция
- CRC32
- MVP
- Продакт-маркет фит
- Владение кодом
- Код-фриз
- Бинарный поиск
- CDN
- HTTP-заголовок
- curl
- CI/CD
- WITH в SQL
- Оператор ?. в JS
- Smalltalk
💬 Вам что-то уже пригодилось?
- Технический долг
- Хейзенбаг
- Поток
- Хеш-таблица
- Хеш-функция
- CRC32
- MVP
- Продакт-маркет фит
- Владение кодом
- Код-фриз
- Бинарный поиск
- CDN
- HTTP-заголовок
- curl
- CI/CD
- WITH в SQL
- Оператор ?. в JS
- Smalltalk
💬 Вам что-то уже пригодилось?
❤5
🎨 Бас-фактор (bus factor, фактор автобуса) — метрика, используемая для оценки последствий ухода сотрудника из команды.
🚍 Чем выше бас-фактор, тем более равномерно распределены знания об определённой части системы между членами команды.
🌟 Способы снижать риск: поощряйте парное программирование, написание документации, тестов, систематические глубокие код-ревью.
⚠️ Минусы: эти практики могут снижать производительность команды. Не каждая компания может позволить себе такую роскошь.
🔍 Например, в команде checkout интернет-магазина только Иван знает способ расчёта скидок и особенности начисления НДС в разных странах. На документацию и тесты у Ивана не остаётся времени.
Бас-фактор в этой части системы равенесли Ивана собьёт автобус (отсюда название), работа замедлится или вообще встанет.
Если же с ним в паре работет Илья, они вместе пишут документацию, тесты на бизнес-логику, а также рассказывают о ней коллегам, бас-фактор будет равен
🔗 https://ru.wikipedia.org/wiki/Фактор_автобуса
🚍 Чем выше бас-фактор, тем более равномерно распределены знания об определённой части системы между членами команды.
🌟 Способы снижать риск: поощряйте парное программирование, написание документации, тестов, систематические глубокие код-ревью.
⚠️ Минусы: эти практики могут снижать производительность команды. Не каждая компания может позволить себе такую роскошь.
🔍 Например, в команде checkout интернет-магазина только Иван знает способ расчёта скидок и особенности начисления НДС в разных странах. На документацию и тесты у Ивана не остаётся времени.
Бас-фактор в этой части системы равен
1
, а Если же с ним в паре работет Илья, они вместе пишут документацию, тесты на бизнес-логику, а также рассказывают о ней коллегам, бас-фактор будет равен
2
или выше.🔗 https://ru.wikipedia.org/wiki/Фактор_автобуса
🔥2👍1
👍 OAuth2 — протокол авторизации, который используется для логина через соцсети, выдачи доступа к защищённым ресурсам.
🚀 Поддерживает разные способы авторизации: на сервере, на клиенте (implicit flow, рекомендуется не использовать), на сторонем устройстве (можно дать SmartTV доступ к вашему аккуанту, открыв URL на телефоне) и другие.
В отличие от
📚 Например, вы хотите запросить у пользователя доступ к его фотографиям в облачном сервисе:
1) Создаёте URL с для auth-cервера, включающий параметр
2) Пользователь подтверждает запрос.
3) auth-сервер делает
4) Ваше приложение использует
Уместить в короткий пост такой процесс сложно, поэтому смотрите пример по ссылке ниже 👇
🔗 https://www.oauth.com/oauth2-servers/server-side-apps/example-flow/
🚀 Поддерживает разные способы авторизации: на сервере, на клиенте (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
🎯 Рекурсия — способ определения функции через вызов самой себя.
Используется в обходе графов/деревьев, парсинге, алгоритмах поиска, вычислениях рекуррентных отношений (отсюда и название), таких как числа Фибоначчи.
Бывает простой (когда функция вызывает сама себя) и косвенной, когда
✅ Плюсы: простота реализации, возможность решать сложные задачи способом "разделяй и властвуй" (divide & conquer).
👎 Минусы: может быть непонятна, пока не выработана интуиция. Высокое потребление памяти, возможность переполнения стека (stack overflow).
Вместе с рекурсией может использоваться мемоизация, чтобы сделать алгоритм быстрее.
📝 Например, для вычисления N-го числа ряда Фибоначчи подойдёт классический код:
При задании рекурсивных функций важно всегда думать о "базовых случаях" — условиях, когда функция должна остановиться.
🔗 https://ru.wikipedia.org/wiki/Рекурсия#В_программировании
Используется в обходе графов/деревьев, парсинге, алгоритмах поиска, вычислениях рекуррентных отношений (отсюда и название), таких как числа Фибоначчи.
Бывает простой (когда функция вызывает сама себя) и косвенной, когда
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 определяются автоматически во время выполнения тестов, например, с помощью
❌ Используйте их с осторожностью, потому что многие "признаки плохого кода" очень субъективны, а реальное программирование невозможно без компромиссов.
📚 Типичные примеры включают в себя:
• слишком длинные методы
• классы с раздутой областью ответственности, у которых много методов (god objects)
• много аргументов у функций
• более частое обращение к методам и свойствам другого класса, чем к своим (feature envy)
• повторяющийся код
🔗 https://ru.wikipedia.org/wiki/Запах_кода
Эти признаки не всегда являются ошибками, но могут помочь обнаружить серьёзные проблемы, пока их ещё легко исправить.
Часто code smells определяются автоматически во время выполнения тестов, например, с помощью
rubocop
для Ruby или eslint
для JS.❌ Используйте их с осторожностью, потому что многие "признаки плохого кода" очень субъективны, а реальное программирование невозможно без компромиссов.
📚 Типичные примеры включают в себя:
• слишком длинные методы
• классы с раздутой областью ответственности, у которых много методов (god objects)
• много аргументов у функций
• более частое обращение к методам и свойствам другого класса, чем к своим (feature envy)
• повторяющийся код
🔗 https://ru.wikipedia.org/wiki/Запах_кода
🔥1
⭐ LTV, иногда CLTV (customer lifetime value, пожизненная ценность) — это выручка, которую компания ожидает получить от одного клиента в течение всего срока его взаимодействия с бизнесом.
LTV является усреднённым показателем, который используется в маркетинге и планировании для расчёта возможных затрат на привлечение (
🤷♀️ Его легко спутать с
📖 Например, если пользователь платит стримингу 1,000 руб. в месяц и остаётся в среднем на 15 месяцев, его LTV составит 15,000 рублей.
🔗 https://ru.wikipedia.org/wiki/Пожизненная_ценность_клиента
LTV является усреднённым показателем, который используется в маркетинге и планировании для расчёта возможных затрат на привлечение (
CAC
, customer acquisition cost) и удержание клиентов.🤷♀️ Его легко спутать с
ARPU
(average revenue per user) — cредней выручкой от клиента за определённый срок.📖 Например, если пользователь платит стримингу 1,000 руб. в месяц и остаётся в среднем на 15 месяцев, его LTV составит 15,000 рублей.
🔗 https://ru.wikipedia.org/wiki/Пожизненная_ценность_клиента
🔥3