Почему всё тормозит: про производительность простыми словами
Сайт грузится 5 секунд. Бот отвечает через раз. Скрипт выполняется вечность. Знакомо?
Что чаще всего виновато:
• База данных. Самый частый убийца скорости. Запросы без индексов, огромные таблицы, выборка "звёздочкой" всего подряд.
• Сеть. Пока один сервис ждёт ответ от другого — время идёт. А если цепочка из пяти вызовов — привет, 3 секунды ожидания.
• Память. Если приложение жрёт всё подряд и не отдаёт — начнутся тормоза и падения.
Что можно сделать прямо сейчас:
• Посмотреть логи. Там видно, на чём время уходит больше всего. Не гадать — смотреть.
• Настроить мониторинг. Хотя бы простой, чтобы знать, когда всё начинает сыпаться.
• Добавить кеш. Самый быстрый способ ускорить что угодно — перестать вычислять одно и то же 100 раз.
Принцип, который работает:
Сначала сделай работающим. Потом — быстрым. И только потом — красивым. В этом порядке.
Сайт грузится 5 секунд. Бот отвечает через раз. Скрипт выполняется вечность. Знакомо?
Что чаще всего виновато:
• База данных. Самый частый убийца скорости. Запросы без индексов, огромные таблицы, выборка "звёздочкой" всего подряд.
• Сеть. Пока один сервис ждёт ответ от другого — время идёт. А если цепочка из пяти вызовов — привет, 3 секунды ожидания.
• Память. Если приложение жрёт всё подряд и не отдаёт — начнутся тормоза и падения.
Что можно сделать прямо сейчас:
• Посмотреть логи. Там видно, на чём время уходит больше всего. Не гадать — смотреть.
• Настроить мониторинг. Хотя бы простой, чтобы знать, когда всё начинает сыпаться.
• Добавить кеш. Самый быстрый способ ускорить что угодно — перестать вычислять одно и то же 100 раз.
Принцип, который работает:
Сначала сделай работающим. Потом — быстрым. И только потом — красивым. В этом порядке.
🔥2
Про имена переменных: боль, которая лечится
Назвал переменную x, через два дня сам не понял, что там лежит. Знакомо?
Как надо:
· user вместо us.
· getUserById вместо getUsr.
· isActive вместо activeFlag.
Три простых принципа:
· Имя должно быть понятно без контекста. Если читаешь строчку через месяц — всё должно быть ясно.
· Одно слово — одна идея. Не впихивай всё в одно название.
· Используй глаголы для функций: get, send, calculate, validate.
Пример разницы:
Было: d — непонятно.
Стало: deliveryDate — понятно.
Было: procData() — что значит proc?
Стало: processUserOrders() — сразу ясно.
Почему это важно:
Ты пишешь код для людей. Компьютеру всё равно. Человек тратит время на чтение. Облегчи ему это.
Назвал переменную x, через два дня сам не понял, что там лежит. Знакомо?
Как надо:
· user вместо us.
· getUserById вместо getUsr.
· isActive вместо activeFlag.
Три простых принципа:
· Имя должно быть понятно без контекста. Если читаешь строчку через месяц — всё должно быть ясно.
· Одно слово — одна идея. Не впихивай всё в одно название.
· Используй глаголы для функций: get, send, calculate, validate.
Пример разницы:
Было: d — непонятно.
Стало: deliveryDate — понятно.
Было: procData() — что значит proc?
Стало: processUserOrders() — сразу ясно.
Почему это важно:
Ты пишешь код для людей. Компьютеру всё равно. Человек тратит время на чтение. Облегчи ему это.
👍2
Вопрос дня 🧐
Если бы вы могли удалить одну технологию из мира IT, что бы это было?
Если бы вы могли удалить одну технологию из мира IT, что бы это было?
🤔1
Прошла уже неделя учебы 🫠
Делитесь: кто жив, кто поступил, или уже закончил и работает по полной
Делитесь: кто жив, кто поступил, или уже закончил и работает по полной
Про отладку: как найти баг и не сойти с ума
Баг есть, но не понятно где.
Что делать по шагам:
· Воспроизведи баг. Если не можешь повторить — не можешь починить. Запиши шаги: что нажал, что ввёл, что получил.
· Сузь круг. Баг в одном месте или везде? Работает на локалке, но не на сервере? Это уже подсказка.
· Читай логи. В логах часто написано прямо: какая ошибка, в каком файле, на какой строке.
· Ставь точки останова. Пройди по коду шаг за шагом. Смотри, где значение становится не тем, каким должно быть.
· Меняй одну вещь за раз. Поменял два параметра сразу — не поймёшь, что помогло.
Частые причины багов:
· Данные пришли не те, что ожидал.
· Не учёл пустое значение или null.
· Гонка: два процесса лезут в одно и то же.
· Работает у тебя, но не работает у другого — разные версии, настройки, окружение.
Что не помогает:
· Менять код наугад и надеяться.
· Писать print через каждую строчку и потом их забывать удалять.
Баг есть, но не понятно где.
Что делать по шагам:
· Воспроизведи баг. Если не можешь повторить — не можешь починить. Запиши шаги: что нажал, что ввёл, что получил.
· Сузь круг. Баг в одном месте или везде? Работает на локалке, но не на сервере? Это уже подсказка.
· Читай логи. В логах часто написано прямо: какая ошибка, в каком файле, на какой строке.
· Ставь точки останова. Пройди по коду шаг за шагом. Смотри, где значение становится не тем, каким должно быть.
· Меняй одну вещь за раз. Поменял два параметра сразу — не поймёшь, что помогло.
Частые причины багов:
· Данные пришли не те, что ожидал.
· Не учёл пустое значение или null.
· Гонка: два процесса лезут в одно и то же.
· Работает у тебя, но не работает у другого — разные версии, настройки, окружение.
Что не помогает:
· Менять код наугад и надеяться.
· Писать print через каждую строчку и потом их забывать удалять.
❤1
С 256-м днём года.
Пусть код работает, дедлайны не горят, а багов в проде не будет.
С праздником💻🥳
Пусть код работает, дедлайны не горят, а багов в проде не будет.
С праздником💻🥳
🎉3
Про базы данных: что нужно знать каждому
База — это сердце приложения. Если она тормозит — тормозит всё.
Что важно понимать:
· Индексы. Без них поиск по большой таблице — это перебор всех строк. С ними — быстро. Но не ставь индекс на всё подряд. Каждый индекс замедляет запись.
· Запросы. Не тяни SELECT *, если нужны две колонки. Не делай запрос в цикле, если можно одним запросом получить всё.
· Связи. Если данные связаны — используй внешние ключи. Иначе получишь заказы без пользователей и мусор в базе.
· Транзакции. Если делаешь несколько операций, которые должны выполниться вместе — оборачивай в транзакцию. Иначе половина пройдёт, половина нет.
Что убивает базу:
· N+1 запросов. Когда в цикле по 100 элементов делаешь 100 запросов вместо одного.
· Отсутствие лимитов. SELECT * FROM users без ограничений на миллионе строк.
· Долгие транзакции. Держишь блокировку — все ждут.
База — это сердце приложения. Если она тормозит — тормозит всё.
Что важно понимать:
· Индексы. Без них поиск по большой таблице — это перебор всех строк. С ними — быстро. Но не ставь индекс на всё подряд. Каждый индекс замедляет запись.
· Запросы. Не тяни SELECT *, если нужны две колонки. Не делай запрос в цикле, если можно одним запросом получить всё.
· Связи. Если данные связаны — используй внешние ключи. Иначе получишь заказы без пользователей и мусор в базе.
· Транзакции. Если делаешь несколько операций, которые должны выполниться вместе — оборачивай в транзакцию. Иначе половина пройдёт, половина нет.
Что убивает базу:
· N+1 запросов. Когда в цикле по 100 элементов делаешь 100 запросов вместо одного.
· Отсутствие лимитов. SELECT * FROM users без ограничений на миллионе строк.
· Долгие транзакции. Держишь блокировку — все ждут.
❤1👍1
Про тесты: зачем они нужны на самом деле
Три причины писать тесты:
· Чтобы не бояться менять код.
· Чтобы не ловить баги на продакшене.
· Чтобы помнить, как всё должно работать.
Какие бывают:
· Модульные.
Проверяют одну маленькую функцию. Быстрые, запускаются за секунды.
· Интеграционные.
Проверяют, как части системы работают вместе.
· Сквозные.
Проверяют весь путь от начала до конца.
Что тестировать не надо:
· Геттеры и сеттеры.
· Код, который просто вызывает чужую библиотеку.
· Всё подряд.
Три причины писать тесты:
· Чтобы не бояться менять код.
· Чтобы не ловить баги на продакшене.
· Чтобы помнить, как всё должно работать.
Какие бывают:
· Модульные.
Проверяют одну маленькую функцию. Быстрые, запускаются за секунды.
· Интеграционные.
Проверяют, как части системы работают вместе.
· Сквозные.
Проверяют весь путь от начала до конца.
Что тестировать не надо:
· Геттеры и сеттеры.
· Код, который просто вызывает чужую библиотеку.
· Всё подряд.