#Education #Programming
Стэк: что это и почему из него всё вываливается
Если объяснять на пальцах, то стэк (stack) — это как стопка тарелок в баре. Тарелку можно класть только сверху и брать тоже только сверху. Первая положенная тарелка будет взята последней, это принцип LIFO (Last In, First Out). Программистский стэк в памяти работает так же, только вместо тарелок там локальные переменные и адреса возврата из функций.
Зачем это создано?
Это гениально, потому что:
Почему он переполняется?
Стэк не бесконечный. Это выделенный кусок оперативки (обычно 1-8 МБ) и если класть тарелки без остановки, то рано или поздно они упрутся в потолок. В программировании это происходит в двух случаях:
1. Бесконечная или очень глубокая рекурсия
Каждый новый вызов кладёт в стэк новый слой данных. Через миллион вызовов (а на самом деле гораздо раньше) место кончится. Stack Overflow.
2. Огромные локальные переменные
Попытка выделить мегабайты данных не в куче (heap), а в стеке может убить его с одного захода. Аналогия, которая всё ставит на свои места:
Представь револьвер. Стэк — это обойма.
Стэк — это быстрый и чёткий механизм для управления ходом программы. Его переполнение почти всегда ошибка программиста: либо бесконечная рекурсия, либо попытка работать с данными как с локальными переменными, когда им место в куче.
Понимание стека это как понимание, куда в машине заливать бензин, а куда тормозную жидкость. Без этого далеко не уедешь, а если перепутать — будет бабах.
Стэк: что это и почему из него всё вываливается
Если объяснять на пальцах, то стэк (stack) — это как стопка тарелок в баре. Тарелку можно класть только сверху и брать тоже только сверху. Первая положенная тарелка будет взята последней, это принцип LIFO (Last In, First Out). Программистский стэк в памяти работает так же, только вместо тарелок там локальные переменные и адреса возврата из функций.
Зачем это создано?
Вызов функции? Процессор кладёт в стэк адрес, куда нужно вернуться после её выполнения, и все локальные переменные этой функции.
Функция завершилась? Всё, что она положила в стэк (свой «слой»), снимается. Освобождается память, процессор смотрит на верхний адрес возврата и прыгает обратно в предыдущую функцию.
Вызвана новая функция? На старый слой сверху кладётся новый. И так далее.
Это гениально, потому что:
Быстро. Добавление и удаление происходит только с одного конца (вершины стека), не нужно ничего сдвигать в памяти.
Предсказуемо. У каждого вызова функции есть свой изолированный контекст.
Естественно для вложенности. Функция А вызывает Б, Б вызывает В и стэк идеально отражает слои: А → Б → В.
Почему он переполняется?
Стэк не бесконечный. Это выделенный кусок оперативки (обычно 1-8 МБ) и если класть тарелки без остановки, то рано или поздно они упрутся в потолок. В программировании это происходит в двух случаях:
1. Бесконечная или очень глубокая рекурсия
def скажи_привет_вечно():
return скажи_привет_вечно() # Вызов себя же, без выхода
Каждый новый вызов кладёт в стэк новый слой данных. Через миллион вызовов (а на самом деле гораздо раньше) место кончится. Stack Overflow.
2. Огромные локальные переменные
void съесть_память() {
int огромный_массив[1000000]; // Выделится в стеке, не в куче
// ...
}Попытка выделить мегабайты данных не в куче (heap), а в стеке может убить его с одного захода. Аналогия, которая всё ставит на свои места:
Представь револьвер. Стэк — это обойма.
1. Патрон (вызов функции) можно дослать только в верх обоймы.
2. Чтобы выстрелить (завершить функцию), нужно вынуть верхний патрон.
3. Если пихать патроны не стреляя, то в какой-то момент обойма переполнится. Защёлкнешь, а лишний патрон уже не лезет — заклинило.
Стэк — это быстрый и чёткий механизм для управления ходом программы. Его переполнение почти всегда ошибка программиста: либо бесконечная рекурсия, либо попытка работать с данными как с локальными переменными, когда им место в куче.
Понимание стека это как понимание, куда в машине заливать бензин, а куда тормозную жидкость. Без этого далеко не уедешь, а если перепутать — будет бабах.
#Programming #Cs
Делегаты: что за такие посредники
Если говорить грубо то, делегат это профессиональный «стрелочник». Такой типобезопасный указатель на функцию, которая умеет делать одну простую вещь: передавать выполнение задачи кому-то другому, не завязываясь на конкретную реализацию.
Представь: ты — менеджер (основной код). Тебе нужно выполнить задачу, допустим «обработать данные». Но как именно обрабатывать ты не знаешь и знать не хочешь. Это решает кто-то другой, ты просто говоришь: «Эй, вот тебе данные, сделай с ними что надо» и передаёшь вызов через делегата.
Как это выглядит в коде (на C#)?
И зачем?
1. Чтобы не зависеть от конкретного кода, мой пирожочек (инверсии зависимостей). Твой класс не должен знать
2. Для событийной модели (event handling). Это основное применение так как Делегаты основа событий в C#. Ты подписываешь свой метод на кнопку
3. Для колбэков и асинхронных операций «Вот выполни эту задачу, а когда закончишь вызови тот метод, который я тебе дам». Классика:
А что за Action, Func и прочие generic-делегаты?
Это готовые шаблоны делегатов, чтобы не объявлять свои каждый раз:
Делегаты это контракты на выполнение работы такой способ сказать: «Мне нужен кто-то, кто умеет делать ВОТ ЭТО (сигнатура). Кто именно мне уже не важно». Это фундамент для:
1. Гибкого кода, который можно переконфигурировать на лету.
2. Событий и реактивного программирования.
3. Паттернов вроде Strategy или Observer.
Без делегатов мы бы до сих пор клеили скотчем костыли из
Делегаты твои легальные, типобезопасные указатели на функции, которые делают код не просто рабочим, а архитектурно красивым. И да, их стоит освоить, даже если поначалу кажется, что можно обойтись без них.
Делегаты: что за такие посредники
Если говорить грубо то, делегат это профессиональный «стрелочник». Такой типобезопасный указатель на функцию, которая умеет делать одну простую вещь: передавать выполнение задачи кому-то другому, не завязываясь на конкретную реализацию.
Представь: ты — менеджер (основной код). Тебе нужно выполнить задачу, допустим «обработать данные». Но как именно обрабатывать ты не знаешь и знать не хочешь. Это решает кто-то другой, ты просто говоришь: «Эй, вот тебе данные, сделай с ними что надо» и передаёшь вызов через делегата.
Как это выглядит в коде (на C#)?
// Объявляем делегат — это как шаблон для всех, кто сможет выполнить роль
delegate string МанипуляторСтрокой(string text);
class Program
{
// Метод, который соответствует шаблону делегата
static string ДобавитьВосклицания(string s) => s + "!!!";
static void Main()
{
// Создаём экземпляр делегата и "целим" его на метод
МанипуляторСтрокой обработчик = ДобавитьВосклицания;
// Вызов через делегат — как будто вызываем сам метод
string результат = обработчик("Привет");
Console.WriteLine(результат); // Вывод: Привет!!!
}
}
И зачем?
1. Чтобы не зависеть от конкретного кода, мой пирожочек (инверсии зависимостей). Твой класс не должен знать
проДобавитьВосклицания, УдалитьПробелы или Зашифровать. Он знает только про делегат МанипуляторСтрокой. Что именно будет делать этот манипулятор — решает тот, кто использует твой класс. Ты предоставляешь крючок, на который другие могут вешать свою логику.2. Для событийной модели (event handling). Это основное применение так как Делегаты основа событий в C#. Ты подписываешь свой метод на кнопку
Click и когда пользователь жмёт на неё, вызываются все методы прицепленные к делегату этого события. Без делегатов пришлось бы городить безумные switch-case или ещё более убогие конструкции.button.Click += НажалиКнопку; // Подписали метод на событие через делегат
3. Для колбэков и асинхронных операций «Вот выполни эту задачу, а когда закончишь вызови тот метод, который я тебе дам». Классика:
BeginInvoke, задачи с продолжениями. Делегат здесь это адрес куда нужно «отзвониться» о результатах.А что за Action, Func и прочие generic-делегаты?
Это готовые шаблоны делегатов, чтобы не объявлять свои каждый раз:
Action — делегат для метода, который не возвращает ничего (void).
Action<int, string> — то же, но принимает параметры.
Func<string, int> — делегат для метода, который возвращает значение (последний generic-параметр — тип возврата).
Func<string, string> обработчик = s => s.ToUpper(); // Лямбда прямо в делегат
Делегаты это контракты на выполнение работы такой способ сказать: «Мне нужен кто-то, кто умеет делать ВОТ ЭТО (сигнатура). Кто именно мне уже не важно». Это фундамент для:
1. Гибкого кода, который можно переконфигурировать на лету.
2. Событий и реактивного программирования.
3. Паттернов вроде Strategy или Observer.
Без делегатов мы бы до сих пор клеили скотчем костыли из
switch-ей и гигантских интерфейсов с одним методом. Это один из тех инструментов, который будучи понятым, начинает применяться почти везде потому что это элегантное решение для проблемы «как не превратить код в монолит».Делегаты твои легальные, типобезопасные указатели на функции, которые делают код не просто рабочим, а архитектурно красивым. И да, их стоит освоить, даже если поначалу кажется, что можно обойтись без них.
1 1
Media is too big
VIEW IN TELEGRAM
#Other #ItLife
Иногда мне хочется выключить всё нахер и молчаливо бдеть. Не постить в соцсетях, не отвечать в рабочих чатах, не грузить базу данных или компилятор. Просто сесть и смотреть в потухший экран, как в чёрное зеркало где нет ни одного уведомления.
Я смотрю на людей вокруг, вроде и такие же — сидят за компьютерами, пьют кофе, смеются. Но у них есть какая-то… простота, они могут отвлечься. У меня же в голове вечно крутятся мысли: почему падает БД, как переписать тот легаси-модуль, каким образом закрыть 4 проекта и какой костыль я оставил в проде три месяца назад.
Выхожу на улицу, а мир жёлтый. Потому что забыл снять очки с синим светофильтром. И кажется это не просто защита для глаз, а постоянный фильтр восприятия. Весь мир видится через этот оттенок, немного неестественный, но привычный.
В моём рюкзаке лежит всё, чтобы починить почти что угодно:
Но нет там одного — чувства что где-то ты нужен не потому что умеешь поднять сервер или откатить билд, а просто так. Потому что ты это ты, не набор компетенций в резюме, а человек который устаёт, сомневается и иногда просто хочет молчать.
100 вкладок в VSCode, четыре разные СУБД на локальной машине, виртуалки, удалённые десктопы — всё это не заменяет простого «Как дела?», сказанного не формально, а с настоящим интересом. Не заменяет той минуты когда тебя слушают не чтобы найти
Мы строим сложные системы, пишем код который управляет процессами, деньгами, людьми. Но иногда кажется что самый сложный и недокументированный легаси-код это мы сами. Со всеми своими внутренними костылями, незакрытыми тасками и необработанными исключениями.
И ладно, пусть мир иногда жёлтый. Пусть в рюкзаке нет волшебного гаджета от одиночества. Пусть за спиной тянется шлейф из незавершённых дел и техдолга. Всё равно где-то там, за всеми этими интерфейсами и абстракциями, бьётся что-то живое. Что-то что не коммитится в Git, не логируется и не мониторится, но оно есть. И наверное, ради этого и стоит иногда просто выключать всё нахер и смотреть в тёмный экран. Молча.
Иногда мне хочется выключить всё нахер и молчаливо бдеть. Не постить в соцсетях, не отвечать в рабочих чатах, не грузить базу данных или компилятор. Просто сесть и смотреть в потухший экран, как в чёрное зеркало где нет ни одного уведомления.
Я смотрю на людей вокруг, вроде и такие же — сидят за компьютерами, пьют кофе, смеются. Но у них есть какая-то… простота, они могут отвлечься. У меня же в голове вечно крутятся мысли: почему падает БД, как переписать тот легаси-модуль, каким образом закрыть 4 проекта и какой костыль я оставил в проде три месяца назад.
Выхожу на улицу, а мир жёлтый. Потому что забыл снять очки с синим светофильтром. И кажется это не просто защита для глаз, а постоянный фильтр восприятия. Весь мир видится через этот оттенок, немного неестественный, но привычный.
В моём рюкзаке лежит всё, чтобы починить почти что угодно:
1. Флешки со всеми сборками восстановления, от Windows до Red
2. Ноутбук, который не потянет только косчические программы
3. Кабели и адаптеры на все случаи жизни
4. Гаджеты, стоимостью как чья-то зарплата
Но нет там одного — чувства что где-то ты нужен не потому что умеешь поднять сервер или откатить билд, а просто так. Потому что ты это ты, не набор компетенций в резюме, а человек который устаёт, сомневается и иногда просто хочет молчать.
100 вкладок в VSCode, четыре разные СУБД на локальной машине, виртуалки, удалённые десктопы — всё это не заменяет простого «Как дела?», сказанного не формально, а с настоящим интересом. Не заменяет той минуты когда тебя слушают не чтобы найти
root проблемы, а чтобы услышать твой голос.Мы строим сложные системы, пишем код который управляет процессами, деньгами, людьми. Но иногда кажется что самый сложный и недокументированный легаси-код это мы сами. Со всеми своими внутренними костылями, незакрытыми тасками и необработанными исключениями.
И ладно, пусть мир иногда жёлтый. Пусть в рюкзаке нет волшебного гаджета от одиночества. Пусть за спиной тянется шлейф из незавершённых дел и техдолга. Всё равно где-то там, за всеми этими интерфейсами и абстракциями, бьётся что-то живое. Что-то что не коммитится в Git, не логируется и не мониторится, но оно есть. И наверное, ради этого и стоит иногда просто выключать всё нахер и смотреть в тёмный экран. Молча.
1 4 2 2
#DevOPS #Programming
Микросервисы
В мире айтишной моды микросервисная архитектура это как дорогой швейцарский часовой механизм: все говорят что это круто, но мало кто реально понимает как это работает внутри и уж тем более кому это действительно нужно.
Если грубо: микросервисы это когда ваше огромное монолитное приложение разбивается на кучу маленьких, независимых сервисов. Каждый сервис — отдельная программа, которая:
Ну а теперь неоспоримые факты + и -:
Мнимые:
Реальная причина:
Независимость команд и скорость. Представьте что одна команда хочет обновить библиотеку для платежей, а другая грезит переписать модуль пользователей на новом фреймворке. В монолите это хождение по минному полю. С микросервисами — каждая команда полностью владеет своим сервисом: пишет, тестирует, деплоит когда хочет и как хочет, не спрашивая разрешения у соседей. Это главный кайф.
Цена вопроса
1. Сложность. Вместо одного приложения у вас теперь оркестр из десятков сервисов. Нужны: система обнаружения сервисов, API-шлюз, централизованное логирование, распределённый трейсинг, балансировщики, контейнеризация, оркестратор. Вы из программистов превращаетесь в сисадминов Вселенной.
2. Сетевая связность вместо модульной. Раньше у вас был вызов метода, теперь — HTTP-запрос по сети. Сеть не всегда бывает надёжна: таймауты, обрывы, задержки. Ваша логика теперь должна быть устойчивой к отказам. Добавьте сюда проблемы консистентности данных и необходимость идемпотентности операций.
3. Отладка превращается в квест. Ошибка пользователя «Не могу оплатить заказ» теперь может быть где угодно: в сервисе заказов, в платежном шлюзе, в очереди сообщений, в сервисе нотификаций. Придётся собирать лог-пазл по десятку разных систем. Без ELK-стека и Jaeger/Zipkin вы слепой.
4. Тестирование. Чтобы протестировать один сценарий, нужно поднять пол-архитектуры. На помощь приходят интеграционные и контрактные тесты, но они сложнее и медленнее.
Когда это НЕ НАДО делать?
Микросервисы это эволюция, а не революция. Это ответ на проблему масштаба и скорости больших команд, а не волшебная таблетка от плохого кода. Если ваша команда не может написать хорошо структурированный монолит, то микросервисы превратятся в распределённый монолит — самое страшное чудовище, где все недостатки обеих архитектур собраны воедино.
Начинайте с монолита, разделяйте его на чёткие модули, а когда боль от изменений и деплоев станет невыносимой, то тогда, возможно, вы дозрели до того чтобы аккуратно откалывать от него первые сервисы, а не потому что «так сейчас все делают».
Микросервисы
В мире айтишной моды микросервисная архитектура это как дорогой швейцарский часовой механизм: все говорят что это круто, но мало кто реально понимает как это работает внутри и уж тем более кому это действительно нужно.
Если грубо: микросервисы это когда ваше огромное монолитное приложение разбивается на кучу маленьких, независимых сервисов. Каждый сервис — отдельная программа, которая:
1. Отвечает за одну бизнес-способность (пользователи, платежи, нотификации, поиск).
2. Имеет свою отдельную базу данных (да, это важно!).
3. Общается с другими через чёткий API (чаще всего HTTP/REST или сообщения в очередях).
4. Развёртывается и масштабируется независимо.
Ну а теперь неоспоримые факты + и -:
Мнимые:
1. «Это модно и у всех крутых ребят».
2. «Мы же как Netflix и Amazon!». (Забывая, что у них 5000 инженеров и свой дата-центр).
3. «Это решит все наши проблемы!». (Чаще всего создаст в два раза больше).
Реальная причина:
Независимость команд и скорость. Представьте что одна команда хочет обновить библиотеку для платежей, а другая грезит переписать модуль пользователей на новом фреймворке. В монолите это хождение по минному полю. С микросервисами — каждая команда полностью владеет своим сервисом: пишет, тестирует, деплоит когда хочет и как хочет, не спрашивая разрешения у соседей. Это главный кайф.
Цена вопроса
1. Сложность. Вместо одного приложения у вас теперь оркестр из десятков сервисов. Нужны: система обнаружения сервисов, API-шлюз, централизованное логирование, распределённый трейсинг, балансировщики, контейнеризация, оркестратор. Вы из программистов превращаетесь в сисадминов Вселенной.
2. Сетевая связность вместо модульной. Раньше у вас был вызов метода, теперь — HTTP-запрос по сети. Сеть не всегда бывает надёжна: таймауты, обрывы, задержки. Ваша логика теперь должна быть устойчивой к отказам. Добавьте сюда проблемы консистентности данных и необходимость идемпотентности операций.
3. Отладка превращается в квест. Ошибка пользователя «Не могу оплатить заказ» теперь может быть где угодно: в сервисе заказов, в платежном шлюзе, в очереди сообщений, в сервисе нотификаций. Придётся собирать лог-пазл по десятку разных систем. Без ELK-стека и Jaeger/Zipkin вы слепой.
4. Тестирование. Чтобы протестировать один сценарий, нужно поднять пол-архитектуры. На помощь приходят интеграционные и контрактные тесты, но они сложнее и медленнее.
Когда это НЕ НАДО делать?
У вас стартап и нужно быстро проверить гипотезу.
Ваша команда состоит из 5 человек в гараже.
Ваше приложение простое и будет таким всегда.
Вы не готовы содержать отдельную команду DevOps из 3+ человек.
Микросервисы это эволюция, а не революция. Это ответ на проблему масштаба и скорости больших команд, а не волшебная таблетка от плохого кода. Если ваша команда не может написать хорошо структурированный монолит, то микросервисы превратятся в распределённый монолит — самое страшное чудовище, где все недостатки обеих архитектур собраны воедино.
Начинайте с монолита, разделяйте его на чёткие модули, а когда боль от изменений и деплоев станет невыносимой, то тогда, возможно, вы дозрели до того чтобы аккуратно откалывать от него первые сервисы, а не потому что «так сейчас все делают».
#Kotlin #Programming
Kotlin Multiplatform (KMP): Наконец-то один код для всех платформ?
Если вы когда-нибудь пилили один и тот же набор фич на Android (Kotlin/Java), под iOS (Swift) и ещё для десктопа (Kotlin/JVM), то вы наверное знаете ад дублирования. Один баг фиксишь в трёх местах, логику синхронизируешь через силу воли, а про тесты вообще молчу.
Kotlin Multiplatform (KMP) — это попытка JetBrains и сообщества дать нам, разработчикам, законное право написать общую бизнес-логику один раз, а потом использовать её везде.
Как это работает?
Представьте, что Kotlin это универсальный переводчик. Вы пишете код на нём, а компилятор транслирует его в нужный формат:
Ключевой момент: KMP не заставляет вас писать весь код один раз. Он делит код на три части:
1. Common (Общий код). Тут живёт ваша бизнес-логика, модели данных, репозитории. Всё, что не зависит от платформы.
2. Platform-Specific (Платформенно-зависимый код). Всё что касается UI, работы с сенсорами, файловой системой, нативными API. Для каждой платформы идёт своя реализация.
3. Expect/Actual механизм. Это мосты между мирами. В common вы объявляете ожидаемую функциональность, а в каждом платформенном модуле предоставляете реальную реализацию.
Какие от этого плюсы?
Где вас ждёт основная боль?
Итоги:
KMP для вас, если:
1. У вас есть приложение на Android и iOS с общей сложной бизнес-логикой.
2. У вас есть команда Kotlin-разработчиков, которые не хотят учить Swift, но хотят закрывать задачи под iOS.
3. Вы цените нативный UI и производительность, но устали от дублирования функционала.
Обходите стороной, если:
1. У вас простое приложение или всего одна платформа.
2. Вы ждёте волшебную таблетку «пишем один раз — работает везде». KMP так не умеет, он требует дисциплины и понимания архитектуры.
3. Вам нужно быстро сделать прототип. Настройка KMP-проекта — это огромное время для разработчиков.
По сути, KMP это мост между мирами, который позволяет Kotlin говорить на всех языках экосистемы. Не идеально, иногда с помехами, но это рабочий и элегантный способ перестать плодить одинаковый код и сосредоточиться на уникальных фичах каждой платформы.
Kotlin Multiplatform (KMP): Наконец-то один код для всех платформ?
Если вы когда-нибудь пилили один и тот же набор фич на Android (Kotlin/Java), под iOS (Swift) и ещё для десктопа (Kotlin/JVM), то вы наверное знаете ад дублирования. Один баг фиксишь в трёх местах, логику синхронизируешь через силу воли, а про тесты вообще молчу.
Kotlin Multiplatform (KMP) — это попытка JetBrains и сообщества дать нам, разработчикам, законное право написать общую бизнес-логику один раз, а потом использовать её везде.
Как это работает?
Представьте, что Kotlin это универсальный переводчик. Вы пишете код на нём, а компилятор транслирует его в нужный формат:
Для Android в байткод JVM (как обычный Kotlin).
Для iOS в нативный байткод (через LLVM), который понимает Swift/Objective-C.
Для браузера в JavaScript (Kotlin/JS).
Для сервера/десктопа снова в JVM.
Ключевой момент: KMP не заставляет вас писать весь код один раз. Он делит код на три части:
1. Common (Общий код). Тут живёт ваша бизнес-логика, модели данных, репозитории. Всё, что не зависит от платформы.
2. Platform-Specific (Платформенно-зависимый код). Всё что касается UI, работы с сенсорами, файловой системой, нативными API. Для каждой платформы идёт своя реализация.
3. Expect/Actual механизм. Это мосты между мирами. В common вы объявляете ожидаемую функциональность, а в каждом платформенном модуле предоставляете реальную реализацию.
// COMMON
expect fun getCurrentTime(): Long
// ANDROID
actual fun getCurrentTime(): Long {
return System.currentTimeMillis()
}
// iOS
import platform.Foundation.*
actual fun getCurrentTime(): Long {
return NSDate().timeIntervalSince1970.toLong() * 1000
}
Какие от этого плюсы?
Везде одна логика. Баг в расчёте скидки? Чините в common-модуле. Он исправится на всех платформах сразу.
Единый источник истины. Модели данных, валидация, сетевые запросы, кэширование — всё это живёт в одном месте.
Не «убивает» нативный UI. В отличие от Flutter или React Native, KMP не навязывает свои виджеты. Вы по-прежнему пишете UI на SwiftUI/Jetpack Compose/UIKit/XML. Это главный аргумент для команд, которые ценят нативный опыт.
Плавная миграция. Можно внедрять постепенно, начав с общей логики для двух платформ, не переписывая всё приложение.
Где вас ждёт основная боль?
Мультиплатформенные библиотеки. Их пока мало, для многих вещей (работа с БД, криптография) вам придётся либо искать expect/actual-обёртки, либо писать их самому.
iOS-тонкости. Компиляция под iOS идёт через фреймворк, который нужно правильно слинковать. Поддержка новых фич Apple (например, функции новых чипов) может появляться с небольшой задержкой. Отладка на стороне iOS иногда требует танцев с бубном.
Двойная нагрузка на архитектуру. Нужно продумать, что выносить в common, а что оставлять в нативной платформе. Плохое разделение приведёт к уродливым expect/actual костылям.
Compose Multiplatform. Это уже надстройка, которая позволяет делить и UI-код. Но это совсем другая история, почти как Flutter, но на Kotlin. Пока она в активной разработке и для продакшена нужна смелость.
Итоги:
KMP для вас, если:
1. У вас есть приложение на Android и iOS с общей сложной бизнес-логикой.
2. У вас есть команда Kotlin-разработчиков, которые не хотят учить Swift, но хотят закрывать задачи под iOS.
3. Вы цените нативный UI и производительность, но устали от дублирования функционала.
Обходите стороной, если:
1. У вас простое приложение или всего одна платформа.
2. Вы ждёте волшебную таблетку «пишем один раз — работает везде». KMP так не умеет, он требует дисциплины и понимания архитектуры.
3. Вам нужно быстро сделать прототип. Настройка KMP-проекта — это огромное время для разработчиков.
По сути, KMP это мост между мирами, который позволяет Kotlin говорить на всех языках экосистемы. Не идеально, иногда с помехами, но это рабочий и элегантный способ перестать плодить одинаковый код и сосредоточиться на уникальных фичах каждой платформы.
2 3 2
#Frontend #JavaScript
Как мы чуть не просрали весь современный web
Было время когда мир стоял на развилке: с одной стороны JavaScript, кривой, торопливый, сделанный за 10 дней парнем, которому просто нужно было «сделать что-то похожее на Java», с другой стороны VBScript, аккуратный, чистый, родной язык от Microsoft, интегрированный в Windows так, как никогда не сможет ни один другой скриптовый яп.
И знаете что? Мы были в одном шаге от ада, где весь веб писался бы на VBScript.
Что такое VBScript и почему Microsoft его продвигала?
VBScript (Visual Basic Scripting Edition) это облегчённый диалект Visual Basic, созданный Microsoft для написания скриптов. Он был частью экосистемы Windows: работал в Internet Explorer, в административных скриптах (WSH), в классическом ASP на сервере.
Его преимущества для Microsoft:
Почему это была бы катастрофа?
1. Только Internet Explorer. VBScript работал только в IE, ни Firefox, ни Opera, ни тем более что-то на Mac или Linux. Веб тут же делился на два лагеря: «сайты для IE» (полнофункциональные) и «сайты для всех остальных» (урезанные). Фрагментация наступила бы мгновенно.
2. Безопасность? Зачем? VBScript через ActiveX имел доступ к файловой системе и реестру. Представьте: заходите на сайт, а он через скрипт форматирует вам диск или крадёт документы. Мечта хакера.
3. Закрытая экосистема. VBScript — проприетарная технология Microsoft. Никакого открытого стандарта, сообщества, которое могло бы влиять на развитие. Веб стал бы заложником одной компании.
Как JavaScript выжил и победил?
А что было бы, если бы победил VBScript?
Веб выжил не потому что JavaScript был хорош. А потому что он был МЕНЬШИМ ЗЛОМ.
Он был достаточно открытым, чтобы его могли улучшать все. Он был достаточно убогим, чтобы закалить тех, кто на нём писал. И он был достаточно гибким чтобы пережить взрывной рост сложности веб-приложений, где его создатели не могли даже представить.
В следующий раз, когда будете ругать
Как мы чуть не просрали весь современный web
Было время когда мир стоял на развилке: с одной стороны JavaScript, кривой, торопливый, сделанный за 10 дней парнем, которому просто нужно было «сделать что-то похожее на Java», с другой стороны VBScript, аккуратный, чистый, родной язык от Microsoft, интегрированный в Windows так, как никогда не сможет ни один другой скриптовый яп.
И знаете что? Мы были в одном шаге от ада, где весь веб писался бы на VBScript.
Что такое VBScript и почему Microsoft его продвигала?
VBScript (Visual Basic Scripting Edition) это облегчённый диалект Visual Basic, созданный Microsoft для написания скриптов. Он был частью экосистемы Windows: работал в Internet Explorer, в административных скриптах (WSH), в классическом ASP на сервере.
Его преимущества для Microsoft:
Знакомый синтаксис для армии разработчиков выросших на VB.
Прямая интеграция с ActiveX и COM-объектами, можно было дергать что угодно из системы.
Контроль. Если бы веб строился на VBScript, то Microsoft контролировала бы его де-факто.
Почему это была бы катастрофа?
1. Только Internet Explorer. VBScript работал только в IE, ни Firefox, ни Opera, ни тем более что-то на Mac или Linux. Веб тут же делился на два лагеря: «сайты для IE» (полнофункциональные) и «сайты для всех остальных» (урезанные). Фрагментация наступила бы мгновенно.
2. Безопасность? Зачем? VBScript через ActiveX имел доступ к файловой системе и реестру. Представьте: заходите на сайт, а он через скрипт форматирует вам диск или крадёт документы. Мечта хакера.
3. Закрытая экосистема. VBScript — проприетарная технология Microsoft. Никакого открытого стандарта, сообщества, которое могло бы влиять на развитие. Веб стал бы заложником одной компании.
Как JavaScript выжил и победил?
Netscape сыграла ва-банк. Они сделали JavaScript открытым и передали его для стандартизации в ECMA. Это был ключевой ход, язык перестал быть игрушкой одной компании.
«Достаточно хорош». JavaScript был кривым, но кроссплатформенным. Он работал везде, где был браузер, даже если с небольшими ошибками.
Сообщество. Разработчики, несмотря на все недостатки JS, начали копать в его сторону. Появились библиотеки вроде jQuery, которые скрывали ужасы нативной разработки под IE и другими браузерами.
Microsoft сдалась. Они увидели, что мир выбирает открытость, поэтому они создали JScript (свою, чуть изменённую, но в целом совместимую реализацию ECMAScript) и начали постепенно двигаться в сторону стандартов.
А что было бы, если бы победил VBScript?
Веб-разработка сегодня — это Visual Studio и только Windows.
React, Vue, SPA? Забудьте. Вместо Node.js у нас был бы IIS + ASP + VBScript.
Писать скрипты для автоматизации на Mac или Linux? Мечтайте.
Браузерные войны закончились бы полной победой IE, а значит — стагнацией на 15 лет.
Веб выжил не потому что JavaScript был хорош. А потому что он был МЕНЬШИМ ЗЛОМ.
Он был достаточно открытым, чтобы его могли улучшать все. Он был достаточно убогим, чтобы закалить тех, кто на нём писал. И он был достаточно гибким чтобы пережить взрывной рост сложности веб-приложений, где его создатели не могли даже представить.
В следующий раз, когда будете ругать
undefined, NaN или странности this, вспомните: это цена, которую мы заплатили за то, чтобы веб остался свободным и открытым. Или просто скажите: «Спасибо, что не VBScript».
Niwe Code
#ITLife Новый год, новые цели. Итак, салаты доедены, шампанское допито и пора поделиться тем что я хочу сделать в 2025 году. Это не строгое руководство к действию, а скорее список того к чему я буду стремиться. Посмотрим, что из этого получится воплотить:…
#ItLife
И так, каждый уважающий себя телеграм канал подводит свои итоги года чтобы было чем гордиться передпацанами на зоне аудиторией.
1. Я не смог бросить родной город по причинам того что нашел людей, которые помогли выбраться из трясины и посмотреть на мир под другим углом, спасибо вам❤️
2. JavaScript-зёром я не стал, но получился охуенным php-шником крудошлёпом.
3. Я смог найти прекрасную работу, на которой получаю наверное больше удовольствия, чем при половом контакте (пока не сравнивал так как I use Arch btw ).
4. На данный момент все мои проекты завершены и работают в проде как часы, скоро буду обновлять некоторые составляющие.
5. Как оказалось, некоторые люди настолько мрази, что не видят даже вселенной в своём глазу. Я кинул в ЧС/ограничил отправку сообщений всем кто пользовался мной и не давай ничего в замен. Особенно отличились некоторые персоны, но если вы не в курсе кто они — значит вам пока и знать не надо🙂
Разработку телеграм ботов я забросил по причине нехватки текущих возможностей API Telegram. Легче свою ии-шку сделать чем заставить общаться с ней через чат.
Я обрел MacBook 14 pro и кайфую от жизни. Больше ничего не тормозит и открыты все двери для разработки ПО.
Выживите в новом году и какая бы херня в жизни не случилась, кто-то с точно такой же ситуацией справился, и выжил❤️ ❤️
🍹
И так, каждый уважающий себя телеграм канал подводит свои итоги года чтобы было чем гордиться перед
1. Я не смог бросить родной город по причинам того что нашел людей, которые помогли выбраться из трясины и посмотреть на мир под другим углом, спасибо вам
2. JavaScript-зёром я не стал, но получился охуенным php-шником крудошлёпом.
3. Я смог найти прекрасную работу, на которой получаю наверное больше удовольствия, чем при половом контакте (
4. На данный момент все мои проекты завершены и работают в проде как часы, скоро буду обновлять некоторые составляющие.
5. Как оказалось, некоторые люди настолько мрази, что не видят даже вселенной в своём глазу. Я кинул в ЧС/ограничил отправку сообщений всем кто пользовался мной и не давай ничего в замен. Особенно отличились некоторые персоны, но если вы не в курсе кто они — значит вам пока и знать не надо
Разработку телеграм ботов я забросил по причине нехватки текущих возможностей API Telegram. Легче свою ии-шку сделать чем заставить общаться с ней через чат.
Я обрел MacBook 14 pro и кайфую от жизни. Больше ничего не тормозит и открыты все двери для разработки ПО.
Выживите в новом году и какая бы херня в жизни не случилась, кто-то с точно такой же ситуацией справился, и выжил
Please open Telegram to view this post
VIEW IN TELEGRAM
10 4
#Other
У меня сердце в пятки ушло когда вышло окончательное продолжение госпожи Кагуи (31 декабря, дверь во взрослую жизнь)
А после просмотра, эйфория и радость поднялись до пиковых значений ❤️ ❤️ ❤️ 🤩 🤩 😊 🤩 🤩 😊 🤩 🤩 🤩 😊 😊 😊 🤩 ❤️
А после просмотра, эйфория и радость поднялись до пиковых значений
Please open Telegram to view this post
VIEW IN TELEGRAM
1 3 1
#Education
Кристаллы на процессоре
Когда смотришь на новенький Ryzen или Core i9, видишь лишь металлическую крышку и логотип. Но под ней, в самом сердце, лежит не просто «камень», там искусственно выращенная вселенная, самый совершенный кристалл на планете. И от его качества зависит будет ли твой процессор летать или едва ползти.
Что это вообще такое — «кристалл»?
Это не магический кварц для медитации, речь о монокристаллической структуре кремния — идеально упорядоченной решётке атомов, выращенной в лабораторных условиях. Представь сахар-рафинад: весь кусок это один кристалл, где молекулы выстроены в стройные ряды, а обычный песок это хаотичная масса кристалликов. Процессору нужен именно «рафинад» — огромный, безупречный цилиндр-заготовка, который потом режут на тончайшие пластины-вафли. На этой чистой, полированной до зеркала поверхности и рисуют нано-чертежи процессоров.
Что на нём «делают»?
Каждый кристалл это целый мегаполис, спроектированный с точностью до атома.
Почему это так сложно?
А зачем там несколько кристаллов?
Раньше один процессор был одним большим кристаллом, но делать огромные, идеальные кристаллы дорого: один дефект и весь чип в утиль. Теперь используют чиплеты: несколько маленьких, идеально сделанных кристаллов помещают на одну общую подложку (интерпозер), и они общаются друг с другом по сверхбыстрой шине. Это как вместо одного огромного завода построить промышленный парк из нескольких цехов, связанных скоростными конвейерами. Дешевле, гибче, выше выход годных.
Кристалл процессора не просто «железо», а вершина человеческой инженерии, граничащая с алхимией и квантовой механикой. Мы буквально строим миры из песка, заставляя его думать и каждый раз, когда ты запускаешь игру или компилируешь код, ты заставляешь целый город атомов танцевать под твою дудку.
Кристаллы на процессоре
Когда смотришь на новенький Ryzen или Core i9, видишь лишь металлическую крышку и логотип. Но под ней, в самом сердце, лежит не просто «камень», там искусственно выращенная вселенная, самый совершенный кристалл на планете. И от его качества зависит будет ли твой процессор летать или едва ползти.
Что это вообще такое — «кристалл»?
Это не магический кварц для медитации, речь о монокристаллической структуре кремния — идеально упорядоченной решётке атомов, выращенной в лабораторных условиях. Представь сахар-рафинад: весь кусок это один кристалл, где молекулы выстроены в стройные ряды, а обычный песок это хаотичная масса кристалликов. Процессору нужен именно «рафинад» — огромный, безупречный цилиндр-заготовка, который потом режут на тончайшие пластины-вафли. На этой чистой, полированной до зеркала поверхности и рисуют нано-чертежи процессоров.
Что на нём «делают»?
Каждый кристалл это целый мегаполис, спроектированный с точностью до атома.
Транзисторы это здания. Каждое по-сути микроскопический переключатель, который либо пропускает ток (1), либо нет (0). Современный 3нм техпроцесс это когда «здание» настолько мало, что для его постройки используют пучки единичных атомов.
Слои металлизации это дороги и электросети. Транзисторы нужно соединить в схемы. Над кремнием создают до 15-20 слоёв микроскопических «проводов» из меди или кобальта. Это многоуровневая развязка, где каждый «проспект» и «переулок» подведён к нужному «зданию»-транзистору. Чем совершеннее процесс, тем тоньше и плотнее эти дороги, соответственно меньше задержки, выше скорости.
Кэш это сверхбыстрые склады прямо в городе. Чтобы процессор не бегал за каждой инструкцией в медленную оперативную память, прямо на кристалле встраивают сверхбыструю статическую память (SRAM). L1, L2, L3 кэш это как полки, холодильник и кладовая прямо на кухне, чтобы не ходить в магазин через дорогу каждый раз.
Почему это так сложно?
Чистота. Одна пылинка, попавшая на пластину во время производства, убьёт десятки тысяч транзисторов. Заводы чище, чем операционная, а воздух фильтруется до класса 1 (менее 1 частицы на куб. фут).
Точность. Линии на кристалле сегодня тоньше длины волны видимого света. Чтобы их нарисовать, используют хитрости вроде EUV-литографии — «печатают» лазером, бьющим по каплям олова, чтобы создать плазму с излучением в 13.5 нм. Это одна из самых сложных машин, созданных человечеством.
Мощность и тепло. В миллиарде переключающихся ворох раз в секунду транзисторов выделяется колоссальная энергия на крохотной площади. Современный кристалл это самая плотная печь в мире. Всё искусство охлаждения — это борьба с концентрацией энергии в точке.
А зачем там несколько кристаллов?
Раньше один процессор был одним большим кристаллом, но делать огромные, идеальные кристаллы дорого: один дефект и весь чип в утиль. Теперь используют чиплеты: несколько маленьких, идеально сделанных кристаллов помещают на одну общую подложку (интерпозер), и они общаются друг с другом по сверхбыстрой шине. Это как вместо одного огромного завода построить промышленный парк из нескольких цехов, связанных скоростными конвейерами. Дешевле, гибче, выше выход годных.
Кристалл процессора не просто «железо», а вершина человеческой инженерии, граничащая с алхимией и квантовой механикой. Мы буквально строим миры из песка, заставляя его думать и каждый раз, когда ты запускаешь игру или компилируешь код, ты заставляешь целый город атомов танцевать под твою дудку.
#Programming #Kotlin #Dart #KMP #Flutter
KMP vs Flutter
Если вы думаете что это выбор между двумя фреймворками, вы ошибаетесь. Это два лагеря, два видения мира, где каждый искренне убеждён, что оппоненты недалёкие анунаки, не понимающие очевидных вещей.
Посадите в одну комнату Senior Android-разработчика, который три года пилит KMP и Flutter-энтузиаста, который с нуля сделал пять приложений. Они не договорятся и в лучшем случае порвут друг друга в клочья.
Основная философия
Лагерь Flutter: «Ребята, какой нативный UI? Мы живём в 2026 году, у нас везде одни и те же дизайн-системы Material и Cupertino, которые пользователи уже давно не отличают от родных. Наша миссия убить дублирование кода насовсем: одна кодобаза, один язык, одна команда и приложение на iOS, Android, Web и даже на десктопе как с конвейера. Мы строим кроссплатформенный монолит и это прекрасно, а вы с вашими танцами с бубнами, вокруг двух кодобаз, просто застряли в 2010-х».
Лагерь KMP: «Вы, флаттеровцы, как дети которые радуются фломастеру, рисуя поверх шедевра. Ваша философия это вандализм, ведь вы берёте сложнейшие, отточенные годами платформенные UI-киты UIKit, Jetpack Compose и просто заменяете их своим самопальным рендерером на Skia. Да, он быстрый, но он чужой. Наш путь это путь архитектурной чистоты, потому что мы не трогаем святое — UI. Мы берём то, что действительно должно быть общим: логику, бизнес-правила, состояние, данные. Пишем это один раз на Kotlin и встраиваем в нативные приложения, которые пользователи ожидают получить. Мы не строим стену между юзером и его телефоном, Мы творим проход между разумными командами».
Язык и экосистема
Flutter-отряд: «Вы хотите заставить моих iOS-разработчиков, которые 10 лет дышали Swift и Xcode, учить Kotlin? Это бред, а Dart это современный, строгий, предсказуемый язык. У него потрясающий тулинг: hot reload, который реально работает, а не та унылая поделка что у вас. Вся экосистема заточена под фронтенд. Pub.dev это рай где на любой случай жизни есть три пакета. Ваш
KMP-защитники: «Дарт? Серьёзно? Язык-зомби, который оживили только чтобы толкать Flutter? Его нигде кроме как у вас не используют. А Kotlin это стандарт для Android, язык для бэкенда (Ktor) и соответственно Multiplatform. Мои разработчики уже знают его и могут взять существующую тонну бизнес-логики из нашего бэкенда или Android-приложения, и засунуть её в iOS почти без изменений. Мои iOS-ребята учат не Kotlin, а архитектуру. Они получают готовые, протестированные модули и просто рисуют под них вьюхи. А ваша экосистема это свалка из тысячи пакетов, половина из которых заброшена потому что каждый школьник, сделав виджет-кнопку, выкладывает её на pub.dev».
Разработка кода
Flutter-инженер, тыкая пальцем в экран: «Смотри: вот у меня список, мне нужно добавить сложную
KMP-архитектор, хладнокровно поправляя очки: «Ты описал не проблему, а её решение. Да, UI должен быть разным на разных платформах, потому что UX на iOS и Android разный. И да, мы платим за эту гибкость сложностью координации, но теперь опиши мою задачу: у меня есть сложный модуль расчёта кредитов с десятком правил, интеграцией с банковским API и кэшированием. В Flutter ты будешь писать его на Dart и молиться, чтобы пакет для работы с gRPC был стабильным, а на iOS не отваливалась сборка из-за какой-нибудь проблемы с
KMP vs Flutter
Если вы думаете что это выбор между двумя фреймворками, вы ошибаетесь. Это два лагеря, два видения мира, где каждый искренне убеждён, что оппоненты недалёкие анунаки, не понимающие очевидных вещей.
Посадите в одну комнату Senior Android-разработчика, который три года пилит KMP и Flutter-энтузиаста, который с нуля сделал пять приложений. Они не договорятся и в лучшем случае порвут друг друга в клочья.
Основная философия
Лагерь Flutter: «Ребята, какой нативный UI? Мы живём в 2026 году, у нас везде одни и те же дизайн-системы Material и Cupertino, которые пользователи уже давно не отличают от родных. Наша миссия убить дублирование кода насовсем: одна кодобаза, один язык, одна команда и приложение на iOS, Android, Web и даже на десктопе как с конвейера. Мы строим кроссплатформенный монолит и это прекрасно, а вы с вашими танцами с бубнами, вокруг двух кодобаз, просто застряли в 2010-х».
Лагерь KMP: «Вы, флаттеровцы, как дети которые радуются фломастеру, рисуя поверх шедевра. Ваша философия это вандализм, ведь вы берёте сложнейшие, отточенные годами платформенные UI-киты UIKit, Jetpack Compose и просто заменяете их своим самопальным рендерером на Skia. Да, он быстрый, но он чужой. Наш путь это путь архитектурной чистоты, потому что мы не трогаем святое — UI. Мы берём то, что действительно должно быть общим: логику, бизнес-правила, состояние, данные. Пишем это один раз на Kotlin и встраиваем в нативные приложения, которые пользователи ожидают получить. Мы не строим стену между юзером и его телефоном, Мы творим проход между разумными командами».
Язык и экосистема
Flutter-отряд: «Вы хотите заставить моих iOS-разработчиков, которые 10 лет дышали Swift и Xcode, учить Kotlin? Это бред, а Dart это современный, строгий, предсказуемый язык. У него потрясающий тулинг: hot reload, который реально работает, а не та унылая поделка что у вас. Вся экосистема заточена под фронтенд. Pub.dev это рай где на любой случай жизни есть три пакета. Ваш
expect/actual это костыль уровня #ifdef из 90-х за который должно быть стыдно».KMP-защитники: «Дарт? Серьёзно? Язык-зомби, который оживили только чтобы толкать Flutter? Его нигде кроме как у вас не используют. А Kotlin это стандарт для Android, язык для бэкенда (Ktor) и соответственно Multiplatform. Мои разработчики уже знают его и могут взять существующую тонну бизнес-логики из нашего бэкенда или Android-приложения, и засунуть её в iOS почти без изменений. Мои iOS-ребята учат не Kotlin, а архитектуру. Они получают готовые, протестированные модули и просто рисуют под них вьюхи. А ваша экосистема это свалка из тысячи пакетов, половина из которых заброшена потому что каждый школьник, сделав виджет-кнопку, выкладывает её на pub.dev».
Разработка кода
Flutter-инженер, тыкая пальцем в экран: «Смотри: вот у меня список, мне нужно добавить сложную
pull-to-refresh анимацию с параллаксом, кастомным индикатором и изменением цвета. В Flutter это 30 минут работы. Один пакет, или даже самописный CustomScrollView. А теперь расскажи, как ты это будешь делать в KMP? Ах да, сначала ты три дня будешь писать общий expect-класс с данными, потом твой Android-разработчик неделю будет имплементировать это на Compose, а еще позже iOS-разработчик две недели будет втыкать в документацию SwiftUI, проклиная всё на свете, потому что анимации там другие. И в конце вы получите два разных поведения и втрое больше кода. Гениально».KMP-архитектор, хладнокровно поправляя очки: «Ты описал не проблему, а её решение. Да, UI должен быть разным на разных платформах, потому что UX на iOS и Android разный. И да, мы платим за эту гибкость сложностью координации, но теперь опиши мою задачу: у меня есть сложный модуль расчёта кредитов с десятком правил, интеграцией с банковским API и кэшированием. В Flutter ты будешь писать его на Dart и молиться, чтобы пакет для работы с gRPC был стабильным, а на iOS не отваливалась сборка из-за какой-нибудь проблемы с
Carthage. А я возьму проверенную, юнит-тестированную годами библиотеку на Kotlin, которая уже работает на бэкенде....оберну её в KMP-модуль и она заработает на обоих платформах идентично и без сюрпризов. Ваша «простота» иллюзорна. Она работает, пока ты в песочнице. Когда приходит реальный, сложный бизнес вы начинаете городить
Кто ты по масти?
Вы Flutter-boy если:
В мире не бывает серебряной пули. Flutter это феноменальная скорость и единство на начальном и среднем уровне сложности. KMP это стратегическая точность и контроль для сложных, долгоживущих проектов с устоявшимися командами. Один лагерь кричит: «Смотрите, какой у меня красивый единый интерфейс!». Другой парирует: «А мой интерфейс — родной для пользователя и логика у меня выверена алмазом».
Глуп тот, кто спорит не видя контекста, истинный же программист это тот, кто имея конкретную цель и задачи, выбирает оптимальную технологию, а не потому что за него так решил ютуб-блогер. Технологии это инструменты, а не футбольные клубы, но если уж выбирать сторону в этой священной войне — выбирайте ту, боль от которой вам ближе по духу.
#Programming #Kotlin #Dart #KMP #Flutter
Platform Channels, что по сути есть признание поражения вашей «универсальности»».Кто ты по масти?
Вы Flutter-boy если:
Вам критически важна бешеная производительность и нативное ощущение (интерактивные карты, сложный скролл 60fps).Вы Kotlin-org если:
У вас уже есть большие нативные команды, которые не хотят и не будут учить Dart.
Ваше приложение — это по сути нативный системный компонент, глубоко интегрированный в ОС.
У вас стартап из трёх человек, которым нужно за месяц выкатить MVP на все платформы.
Ваше приложение это простой CRUD с формочками, где бизнес-логики на 50 строк.
Вам плевать на нативный UX, вам нужен один дизайн везде, и вы готовы за него бороться.
В мире не бывает серебряной пули. Flutter это феноменальная скорость и единство на начальном и среднем уровне сложности. KMP это стратегическая точность и контроль для сложных, долгоживущих проектов с устоявшимися командами. Один лагерь кричит: «Смотрите, какой у меня красивый единый интерфейс!». Другой парирует: «А мой интерфейс — родной для пользователя и логика у меня выверена алмазом».
Глуп тот, кто спорит не видя контекста, истинный же программист это тот, кто имея конкретную цель и задачи, выбирает оптимальную технологию, а не потому что за него так решил ютуб-блогер. Технологии это инструменты, а не футбольные клубы, но если уж выбирать сторону в этой священной войне — выбирайте ту, боль от которой вам ближе по духу.
#News
Блокировки, белые списки...
История про то, как благие намерения превращаются в идиотизм, который бьет по тем, кого якобы должны защищать.
Ситуация: Загород, Сибирь. Нет никакой оптики, только мобильный интернет через антенну с усилителем. Новый год, хочется посмотреть кино на телике. И тут бац — «В целях безопасности» интернет ограничили, оставили только белые списки. Спасибо, конечно.
Но возникает чисто технический вопрос: где здесь безопасность? И прикол в том что сам белый список это ловушка. Разрешили, допустим, «Кинопоиск». У меня телевизор на Tizen (Samsung). Чтобы поставить приложение, нужно зайти в магазин приложений Samsung, которого, сюрприз, в белом списке нет😊 . То есть разрешили сервис, но забрали ключи от двери, чтобы им воспользоваться.
«Раздай с телефона через VPN!» — скажут умные горожане с пятью палками связи. На даче одна палка и то если у окна стоять, телефон ловит хуй без масла. Подключить телефон к роутеру по Wi-Fi и раздать с телефона? Нельзя раздавать Wi-Fi, будучи подключенным к Wi-Fi. Так не работает.
В итоге пришлось перепрошивать роутер, тратить час новогодней ночи чтобы просто скачать разрешенное приложение. И это я — человек который умеет это делать, а что делать моей маме или бабушке или любому кто просто хочет посмотреть фильм?
Я не против безопасности, я был бы не против, если бы в этом был смысл, если бы была четкая цель, рабочий механизм и видимый результат, но его нет. Есть только рубильник, отчет наверх «меры приняты» и куча людей у которых сломалась нормальная жизнь.
И это даже не смешно
Люди, которые это придумывают, похоже, не понимают как работает современный интернет. Это не «один сайт один адрес». Это CDN, облака, общие IP. Один IP-адрес может обслуживать сотни сайтов одновременно и разрешенные, и запрещенные. Белый список разрешает домен, но домен тянет данные с десятка других сервисов, которых в списке нет. В итоге приложение открывается, но не логинится, сайт грузится без картинок, сервис работает через раз и хромая.
«Но у них же DPI! Они всё видят!» — Нет. DPI смотрит шаблоны, если трафик зашифрован, то он видит только что что-то передаётся, а чтобы анализировать всё в реальном времени нужны мощности которых нет. Люди обходят блокировки, просто перенося трафик на нестандартный порт и 80% пакетов проходит, потому что система не успевает всё проверять.
А главный миф, что это для борьбы с дронами. Управление дроном это не только LTE, это GPS/GLONASS, инерциальная навигация, заранее загруженный маршрут. Выруби интернет полностью и дрон всё равно полетит. Даже в России делают системы навигации для дронов, вообще не требующие связи с сетями. Мы сами создаем технологии, которые рвут в клочья логику этих «защитных мер».
И по итогу данные ограничения не безопасность, а её симулятор: отключили рубильник, написали отчёт, отчитались. Пока чиновники празднуют победу над «угрозами», школьники обходят их систему за 15 минут, а у обычных людей ломается работа, бизнес и простой быт.
Лицемерная показуха, за которую расплачиваемся мы все. И самое горькое, что те кто это придумал, вероятно, сами ни разу не пытались воспользоваться своим «белым списком» в условиях, для которых его вводят.
Блокировки, белые списки...
История про то, как благие намерения превращаются в идиотизм, который бьет по тем, кого якобы должны защищать.
Ситуация: Загород, Сибирь. Нет никакой оптики, только мобильный интернет через антенну с усилителем. Новый год, хочется посмотреть кино на телике. И тут бац — «В целях безопасности» интернет ограничили, оставили только белые списки. Спасибо, конечно.
Но возникает чисто технический вопрос: где здесь безопасность? И прикол в том что сам белый список это ловушка. Разрешили, допустим, «Кинопоиск». У меня телевизор на Tizen (Samsung). Чтобы поставить приложение, нужно зайти в магазин приложений Samsung, которого, сюрприз, в белом списке нет
«Раздай с телефона через VPN!» — скажут умные горожане с пятью палками связи. На даче одна палка и то если у окна стоять, телефон ловит хуй без масла. Подключить телефон к роутеру по Wi-Fi и раздать с телефона? Нельзя раздавать Wi-Fi, будучи подключенным к Wi-Fi. Так не работает.
В итоге пришлось перепрошивать роутер, тратить час новогодней ночи чтобы просто скачать разрешенное приложение. И это я — человек который умеет это делать, а что делать моей маме или бабушке или любому кто просто хочет посмотреть фильм?
Я не против безопасности, я был бы не против, если бы в этом был смысл, если бы была четкая цель, рабочий механизм и видимый результат, но его нет. Есть только рубильник, отчет наверх «меры приняты» и куча людей у которых сломалась нормальная жизнь.
И это даже не смешно
Люди, которые это придумывают, похоже, не понимают как работает современный интернет. Это не «один сайт один адрес». Это CDN, облака, общие IP. Один IP-адрес может обслуживать сотни сайтов одновременно и разрешенные, и запрещенные. Белый список разрешает домен, но домен тянет данные с десятка других сервисов, которых в списке нет. В итоге приложение открывается, но не логинится, сайт грузится без картинок, сервис работает через раз и хромая.
«Но у них же DPI! Они всё видят!» — Нет. DPI смотрит шаблоны, если трафик зашифрован, то он видит только что что-то передаётся, а чтобы анализировать всё в реальном времени нужны мощности которых нет. Люди обходят блокировки, просто перенося трафик на нестандартный порт и 80% пакетов проходит, потому что система не успевает всё проверять.
Если девятилетний ребенок ради «Роблокса» находит обход за 15 минут по гайду из интернета — вы серьёзно думаете, что это остановит кого-то с реальными ресурсами и мотивацией?
А главный миф, что это для борьбы с дронами. Управление дроном это не только LTE, это GPS/GLONASS, инерциальная навигация, заранее загруженный маршрут. Выруби интернет полностью и дрон всё равно полетит. Даже в России делают системы навигации для дронов, вообще не требующие связи с сетями. Мы сами создаем технологии, которые рвут в клочья логику этих «защитных мер».
И по итогу данные ограничения не безопасность, а её симулятор: отключили рубильник, написали отчёт, отчитались. Пока чиновники празднуют победу над «угрозами», школьники обходят их систему за 15 минут, а у обычных людей ломается работа, бизнес и простой быт.
Лицемерная показуха, за которую расплачиваемся мы все. И самое горькое, что те кто это придумал, вероятно, сами ни разу не пытались воспользоваться своим «белым списком» в условиях, для которых его вводят.
Please open Telegram to view this post
VIEW IN TELEGRAM
#Programming #Cs
Эволюция .NET
Если вы хоть раз слышали эти три названия и путались, то вы не одиноки. Microsoft сама создала эту путаницу, но в итоге пришла к элегантному решению, как обычно в своём стилеубить адаптировать старую технологию.
1.
Родился в 2002 году и проектировался как монолит от Microsoft, который жил бы только на Windows и неразрывно связывался с системой. Он дал нам
Почему он не стал доминировать?
2. .NET Core
Появился в 2016 как ответ на требования времени: облака, микросервисы, контейнеры, кроссплатформенность.
Его главные принципы:
Что он принёс?
3. .NET 5 / 6 / 7 / 8+
В 2020 году Microsoft объединила лучшее из
Что это значит на практике?
Что лучше взять для разработки?
В новый веб-проект (бэкенд API, микросервис)? Только .NET 8+
Новое кроссплатформенное десктоп-приложение на
Поддержка старого корпоративного проекта на
Работаете с легаси-сервисами
А что такое .NET Standard?
Это не реализация, а спецификация (контракт API). Появилась как мост между
Итог:
Выбирать сегодня для нового проекта стоит только современный
Эволюция .NET
Если вы хоть раз слышали эти три названия и путались, то вы не одиноки. Microsoft сама создала эту путаницу, но в итоге пришла к элегантному решению, как обычно в своём стиле
1.
.NET FrameworkРодился в 2002 году и проектировался как монолит от Microsoft, который жил бы только на Windows и неразрывно связывался с системой. Он дал нам
WinForms, WPF, ASP.NET, Web Forms (последнее мертво). Данные технологии подняли корпоративную разработку под Windows на невероятный уровень.Почему он не стал доминировать?
Только Windows. Хочешь попрогать под какой-нибудь Ubunt'ой? Ну что же, удачи с настройкой Wine и не спалить комп.Сейчас данное произведение лежит в легаси-проектах, которые слишком дорого переписать и там где критически важны технологии вроде
Закрытость. Развивался только Microsoft, по их щучьему велению.
Жёсткая привязка к ОС. Обновить версию.NET Frameworkчасто означало ждать обновления Windows, так некоторые версии не работали на казалось бы одной архитектуре: 4.7 есть под 7, но 4.8 нет😊
Медленный и тяжёлый, но для своего времени пойдёт.
WCF или старых версий ASP.NET, которые не перенесли на новую платформу. Писать на нем новые проекты чистое самоубийство.2. .NET Core
Появился в 2016 как ответ на требования времени: облака, микросервисы, контейнеры, кроссплатформенность.
Его главные принципы:
Кроссплатформенность: работает одинаково на всех системах Windows, Linux, macOS.
Открытый исходный код: развивается сообществом на GitHub где даже Microsoft вынуждена считаться.
Модульность и высокая производительность: лёгкий, быстрый, идеальный для микросервисов и контейнеров в Docker.
Side-by-side установка: можно иметь десять разных версий на одной машине без конфликтов.
Что он принёс?
ASP.NET Core (современный веб), Entity Framework Core, поддержку ML.NET. Это была полная перезагрузка философии .NET.3. .NET 5 / 6 / 7 / 8+
В 2020 году Microsoft объединила лучшее из
.NET Framework и .NET Core в одну платформу и убрала из названия слово «Core».Что это значит на практике?
Единая кодобаза для всех типов приложений: облако, десктоп, мобильные, игры.
Наследник.NET Core: сохранил всю его скорость, открытость и кроссплатформенность.
Вобрал в себя фичиFramework: постепенно портируются лучшие технологии (частьWPF,WinFormsтеперь работает на Linux/macOS черезMAUI).
Стратегия LTS: Версии с долгосрочной поддержкой (.NET 6, 8) выходят раз в 4 года (в среднем).
Что лучше взять для разработки?
В новый веб-проект (бэкенд API, микросервис)? Только .NET 8+
Новое кроссплатформенное десктоп-приложение на
Avalonia, MAUI? Лучше взять .NET10.Поддержка старого корпоративного проекта на
WPF/WinForms? Пока .NET Framework 4.8, но можно мигрировать на .NET 8.Работаете с легаси-сервисами
WCF, удалённым рабочим столом? Пока останьтесь на Framework или ищете альтернативы.А что такое .NET Standard?
Это не реализация, а спецификация (контракт API). Появилась как мост между
Framework, Core и Xamarin, которая позволяла писать библиотеки работающие везде. С появлением единого .NET 5+ его важность упала, теперь вы просто пишете библиотеки под последний .NET и они работают везде где он есть.Итог:
.NET Framework это почтенное прошлое с закрытым миром Windows..NET Core былая революция которая доказала, что .NET может быть быстрым и открытым..NET (5+) — будущее и настоящее. Единая, открытая, супер-быстрая платформа для любого типа приложений на любой ОС.Выбирать сегодня для нового проекта стоит только современный
.NET. Всё остальное это легаси, с которым рано или поздно придётся прощаться.Please open Telegram to view this post
VIEW IN TELEGRAM
#Programming #Python
Flask позволяет быстро создавать сайты, оказывается
Бывает такое: месяцами работаешь с монструозными enterprise-фреймворками, где нужно 10 конфигов, 5 скриптов инициализации и ритуал с бубном, чтобы поднять
Моё откровение было простым до смешного: Хотел наскоро сделать сайт с размером в 10 эндпоинтов, логикой на 500 строк, обработкой файлов и отдать JSON. По привычке полез настраивать Laravel и нырять в дебри PHP, но я вспомнил про python и подумал: «А почему бы во второй раз не попробовать»? (До этого был печальный опыт с ним )
Через сутки у меня работало то, на что в других фреймворках я потратил бы неделю.
Вот весь код приложения, которое уже можно запустить и оно ответит по HTTP:
И это не игрушка, а рабочий инструмент без настройки миллиарда конфигов, никаких обязательных папок
В чём фокус? Flask это микрофреймворк, его философия заключается в том чтобы дать самый минимум для старта, а всё остальное ты добавишь сам если нужно. Необходима работа с базой? Ставишь
Конечно, у этого подхода есть обратная сторона. Для большого проекта с командой из 10 человек можно наворотить таких костылей,что потом будет больно поддерживать. Flask не диктует архитектуру, он даёт свободу, а свобода это ответственность. Можно написать монстра на 5000 строк в одном файле, и Flask это проглотит и это будет твой выбор, и твоя проблема.
Я понимал Flask как «игрушку для новичков», но моё мнение оказалось ошибочным: это инструмент для профессионалов которые понимают, что им нужно. Он убивает перегруженные фреймворки на корню и показывает, что сложность часто придумываем мы сами. Иногда нужно не «правильно» с точки зрения архитектурных паттернов, а быстро и по делу. И в этом его гениальная, почти вызывающая простота.
После Flask начинаешь с подозрением смотреть на все эти «промышленные» фреймворки и задаёшься вопросом: «А действительно ли мне нужны все эти слои абстракции или я просто следую модному тренду?».
Попробуйте, возможно и для вас это станет таким же небольшим, но важным открытием.
Flask позволяет быстро создавать сайты, оказывается
Бывает такое: месяцами работаешь с монструозными enterprise-фреймворками, где нужно 10 конфигов, 5 скриптов инициализации и ритуал с бубном, чтобы поднять
Hello, World. Ты погружён в инъекции зависимостей, слои абстракций и философию «сначала архитектура, потом код» и кажется что иначе нельзя. А потом случайно открываешь Flask и понимаешь что всё это время тебя просто водили за нос.Моё откровение было простым до смешного: Хотел наскоро сделать сайт с размером в 10 эндпоинтов, логикой на 500 строк, обработкой файлов и отдать JSON. По привычке полез настраивать Laravel и нырять в дебри PHP, но я вспомнил про python и подумал: «А почему бы во второй раз не попробовать»? (
Через сутки у меня работало то, на что в других фреймворках я потратил бы неделю.
Вот весь код приложения, которое уже можно запустить и оно ответит по HTTP:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return {'message': 'Hello, World!'}
if __name__ == '__main__':
app.run(debug=True)
И это не игрушка, а рабочий инструмент без настройки миллиарда конфигов, никаких обязательных папок
controllers/, services/, repositories/. Никакого кодогенератора, который создаёт 20 файлов, просто пишешь функцию и говоришь: «Эй, эта функция будет отвечать на запросы по этому адресу».В чём фокус? Flask это микрофреймворк, его философия заключается в том чтобы дать самый минимум для старта, а всё остальное ты добавишь сам если нужно. Необходима работа с базой? Ставишь
Flask-SQLAlchemy. Нужна аутентификация? Flask-Login. Нужны миграции? Flask-Migrate. Но если не нужно — не ставишь, никто не заставляет тебя тащить за собой килограммы зависимостей «на всякий случай».Конечно, у этого подхода есть обратная сторона. Для большого проекта с командой из 10 человек можно наворотить таких костылей,что потом будет больно поддерживать. Flask не диктует архитектуру, он даёт свободу, а свобода это ответственность. Можно написать монстра на 5000 строк в одном файле, и Flask это проглотит и это будет твой выбор, и твоя проблема.
Я понимал Flask как «игрушку для новичков», но моё мнение оказалось ошибочным: это инструмент для профессионалов которые понимают, что им нужно. Он убивает перегруженные фреймворки на корню и показывает, что сложность часто придумываем мы сами. Иногда нужно не «правильно» с точки зрения архитектурных паттернов, а быстро и по делу. И в этом его гениальная, почти вызывающая простота.
После Flask начинаешь с подозрением смотреть на все эти «промышленные» фреймворки и задаёшься вопросом: «А действительно ли мне нужны все эти слои абстракции или я просто следую модному тренду?».
Попробуйте, возможно и для вас это станет таким же небольшим, но важным открытием.
Почему PlayStation 5 лучше современного PC-гейминга?
Знаете в чём главное преимущество PS5 перед PC? Она не даёт тебе выбора и в этой диктатуре заключается её сила.
Ты не выбираешь видеокарту, не копаешься в настройках драйверов, не сравниваешь тайминги ОЗУ и не ломаешь голову, почему в одной игре 140 FPS, а в другой 40, хотя железо одно и то же. Ты просто вставляешь диск (или кликаешь «купить») и игра запускается.
1. Цена входа:
Ща понабегут в комменты мамкины математики и начнут танцевать своей попкой что-то типа: «аря-я-я, консоль дорогая и вообще держи смайлик клоуна🤡 »
Ну, давайте посчитаем, чтобы собрать PC который будет тянуть новинки так же, как PS5 (4K, 60 FPS с учётом апскейлинга, трассировкой лучей), нужно иметь:
По итогу получается что качественная сборка «в уровень PS5» тянет на 200 000+ рублей (😳 ) Цена самой PS5 начинается от 60 000. Во сколько раз дешевле уважаемые математики? Поэтому унижены, разъёбаны и обоссаны по фактам. Да, к консоли ещё желательно купить второй геймпад и зарядку, но они выйдут вместе в максимум 12 000 рублей.
2. Оптимизация:
У разработчиков PS5 одна конфигурация, один тип SSD, один чипсет, одна архитектура. Они могут выжимать из этой коробки максимум, оптимизируя всё до последнего цикла. На PC игра запускается на тысяче комбинаций видеокарт, процессоров, драйверов и версий Windows. Результат? На PC чаще выходят костыльные порты которые годами патчат, а на PS5 игра с первого дня часто работает как отполированный алмаз.
Тот самый SSD с проприетарной архитектурой является ярким примером. Игры вроде Returnal или Ratchet & Clank используют мгновенную загрузку миров как геймплейный элемент. На PC, даже с быстрым NVMe, такого эффекта часто нет так как это ограничение API и разношёрстного «железа».
3. Никакого геморроя
God of War: Ragnarök, The Last of Us Part II, Spider-Man 2, Final Fantasy VII Rebirth. Да, многие позже выходят на PC, но позже это год, два, три, а некоторые не выходят никогда в полной мере. Это игры, которые делаются с расчётом только на эту платформу. Они главный аргумент «за» покупку PS.
Но где PC бьёт PS5?
PS5 это идеальный специализированный инструмент. Она не «лучше» PC, она другая. PS5 выбор для того кто хочет играть, а не собирать, настраивать, твикать и бороться с драйверами. Это плата за свободу выбора — простотой и предсказуемостью и иногда, после 10-часового рабочего дня за тем же PC, эта простота стоит каждого рубля.
Включаешь, садишься на диван, контроллер в руки и ты уже в игре. Не в настройках графики, не в лаунчере, не в очереди на компиляцию шейдеров, в игре. И иногда этого достаточно.
Знаете в чём главное преимущество PS5 перед PC? Она не даёт тебе выбора и в этой диктатуре заключается её сила.
Ты не выбираешь видеокарту, не копаешься в настройках драйверов, не сравниваешь тайминги ОЗУ и не ломаешь голову, почему в одной игре 140 FPS, а в другой 40, хотя железо одно и то же. Ты просто вставляешь диск (или кликаешь «купить») и игра запускается.
1. Цена входа:
Ща понабегут в комменты мамкины математики и начнут танцевать своей попкой что-то типа: «аря-я-я, консоль дорогая и вообще держи смайлик клоуна
Ну, давайте посчитаем, чтобы собрать PC который будет тянуть новинки так же, как PS5 (4K, 60 FPS с учётом апскейлинга, трассировкой лучей), нужно иметь:
Видеокарту уровня RTX 4070 / RX 7800 XT. Это уже 60+ тысяч рублей, если не больше.
Процессор, который её будет держать. Ещё 35-40 тысяч.
32 ГБ ОЗУ DDR5 только для браузера и Windows 11, в идеале 64 ГБ. Попробуйте урвать за 40 тысяч и это окажется еще дёшево.
Материнка, SSD, блок питания, корпус, охлаждение... (Примерно всё в 50 тысяч)
По итогу получается что качественная сборка «в уровень PS5» тянет на 200 000+ рублей (
2. Оптимизация:
У разработчиков PS5 одна конфигурация, один тип SSD, один чипсет, одна архитектура. Они могут выжимать из этой коробки максимум, оптимизируя всё до последнего цикла. На PC игра запускается на тысяче комбинаций видеокарт, процессоров, драйверов и версий Windows. Результат? На PC чаще выходят костыльные порты которые годами патчат, а на PS5 игра с первого дня часто работает как отполированный алмаз.
Тот самый SSD с проприетарной архитектурой является ярким примером. Игры вроде Returnal или Ratchet & Clank используют мгновенную загрузку миров как геймплейный элемент. На PC, даже с быстрым NVMe, такого эффекта часто нет так как это ограничение API и разношёрстного «железа».
3. Никакого геморроя
Не надо ждать шейдеры, запустил игру и играешь. На PC в Unreal Engine 4/5 играх первые 10 минут это слайд-шоу из «компиляции шейдеров».4. Эксклюзивы (ещё одна разрывная PC-школоты)
Не надо настраивать графику. Сбалансированный режим «Производительность» (60 FPS) или «Качество» (4K, рэйтрейсинг). Ты не сидишь подкручивая «ультра» тени, чтобы выиграть 3% FPS.
Спишь спокойно. Не будет ситуации, когда новый драйвер Nvidia ломает старую игру, а откатить не выйдет.
Всё работает из коробки. Геймпад, 3D-звук Tempest, мгновенное переключение между играми являются единой экосистемой, а не набором купленных отдельно компонентов.
God of War: Ragnarök, The Last of Us Part II, Spider-Man 2, Final Fantasy VII Rebirth. Да, многие позже выходят на PC, но позже это год, два, три, а некоторые не выходят никогда в полной мере. Это игры, которые делаются с расчётом только на эту платформу. Они главный аргумент «за» покупку PS.
Но где PC бьёт PS5?
Мультизадачность. На PC ты играешь, а в фоне Discord, стрим, браузер с гайдом, музыка. PS5 это исключительно игровая консоль.
Модификации и свобода. Хочешь заменить всех NPC на Томаса Шелби в Skyrim? Пожалуйста. На консоли только официальный Creations Club.
Эпикентр легаси-гейминга. На PC ты запустишь игру 1998 года и она, скорее всего, заработает. На консоли только то, что Sony разрешила продавать в PS Store.
Многоцелевая машина. PC это ещё и работа, творчество, учёба. Консоль предполагает только игры.
PS5 это идеальный специализированный инструмент. Она не «лучше» PC, она другая. PS5 выбор для того кто хочет играть, а не собирать, настраивать, твикать и бороться с драйверами. Это плата за свободу выбора — простотой и предсказуемостью и иногда, после 10-часового рабочего дня за тем же PC, эта простота стоит каждого рубля.
Включаешь, садишься на диван, контроллер в руки и ты уже в игре. Не в настройках графики, не в лаунчере, не в очереди на компиляцию шейдеров, в игре. И иногда этого достаточно.
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Stud-Informer
2. irkpo-events
Оба проекта будут закрыты на неопределённый срок. Общий доступ (open source) сменится на проприетарную лицензию из-за невозможности продажи.
2. irkpo-events
Оба проекта будут закрыты на неопределённый срок. Общий доступ (open source) сменится на проприетарную лицензию из-за невозможности продажи.
У каждого уважающего себя программиста должны быть следующие вещи:
1. Два MacBook'а
2. Кофеёк
3. Длинные волосы
4. Аниме-девочка на аватарке
Ну и замечательный человек рядом😊
1. Два MacBook'а
2. Кофеёк
3. Длинные волосы
4. Аниме-девочка на аватарке
Ну и замечательный человек рядом
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
#DevOPS
Deploy проекта
Знаете этот трепет в пальцах когда вы делаете залив своей сборки на продакшен-сервер в 3 ночи, молясь чтобы не забыть какую-нибудь переменную окружения? А потом просыпаетесь от звонков потому что что-то пошло не так и вы не помните что именно залили?
Пора заканчивать с этим средневековьем. Deploy pipeline (пайплайн развертывания) это ваша автоматическая линия по сборке, проверке и доставке кода из гита на сервер. Это когда вы просто пушите в ветку, а дальше работает бездушная машина, которая делает всё за вас и вы не можете её отвлечь или заставить забыть шаг.
Зачем это нужно?
1. Повторяемость. Никаких «ой, я забыл запустить миграции». Если ты настроил пайплайн правильно, то он всегда выполнит все шаги.
2. Скорость. Автоматика делает всё быстрее и без твоих кофе-брейков.
3. Откат. Если после деплоя всё пошло по пизде, то одна команда откатит тебе приложение на предыдущую и стабильную версию.
4. Доверие. Ты знаешь что каждый коммит, который прошёл через пайплайн, был собран, протестирован и развёрнут одинаково.
Из чего состоит типичный пайплайн
1. Сборка (Build): твой код превращается в артефакт благодаря
2. Тестирование (Test): запускаются автоматические тесты из юнитов, интеграционных и других. Если падают — не повезло.
3. Деплой на тестовое окружение (Deploy to Staging): артефакт летит на среду, максимально похожую на продакшен. Здесь можно провести ручное тестирование.
4. Деплой на продакшен (Deploy to Production): если всё окей, значит можно выкатывать на боевые сервера. Часто делается с ручным подтверждением (approval) или автоматически, если настроены canary-деплои/постепенное развертывание.
Инструменты: какие бывают конвейеры
Пример простейшего пайплайна на GitHub Actions для Node.js приложения
Файл
Что происходит: при пуше в
Зачем всё это, если можно вручную?
Чтобы не быть заложником своего же процесса и любой разработчик в команде мог сделать деплой, не имея паролей от сервера в голове. Никому в 3 ночи не хочется гадать что сломалось, желательно иметь в логах пайплайна: «Упал на этапе тестов, потому что херня в коде».
Пайплайн это базовый уровень гигиены разработки.
Настройте его один раз и спите спокойно, или хотя бы спите.
Deploy проекта
Знаете этот трепет в пальцах когда вы делаете залив своей сборки на продакшен-сервер в 3 ночи, молясь чтобы не забыть какую-нибудь переменную окружения? А потом просыпаетесь от звонков потому что что-то пошло не так и вы не помните что именно залили?
Пора заканчивать с этим средневековьем. Deploy pipeline (пайплайн развертывания) это ваша автоматическая линия по сборке, проверке и доставке кода из гита на сервер. Это когда вы просто пушите в ветку, а дальше работает бездушная машина, которая делает всё за вас и вы не можете её отвлечь или заставить забыть шаг.
Зачем это нужно?
1. Повторяемость. Никаких «ой, я забыл запустить миграции». Если ты настроил пайплайн правильно, то он всегда выполнит все шаги.
2. Скорость. Автоматика делает всё быстрее и без твоих кофе-брейков.
3. Откат. Если после деплоя всё пошло по пизде, то одна команда откатит тебе приложение на предыдущую и стабильную версию.
4. Доверие. Ты знаешь что каждый коммит, который прошёл через пайплайн, был собран, протестирован и развёрнут одинаково.
Из чего состоит типичный пайплайн
1. Сборка (Build): твой код превращается в артефакт благодаря
npm run build, docker build, mvn package. Если не собирается значит дальше не идём.2. Тестирование (Test): запускаются автоматические тесты из юнитов, интеграционных и других. Если падают — не повезло.
3. Деплой на тестовое окружение (Deploy to Staging): артефакт летит на среду, максимально похожую на продакшен. Здесь можно провести ручное тестирование.
4. Деплой на продакшен (Deploy to Production): если всё окей, значит можно выкатывать на боевые сервера. Часто делается с ручным подтверждением (approval) или автоматически, если настроены canary-деплои/постепенное развертывание.
Инструменты: какие бывают конвейеры
Jenkins: старый, но могучий монстр. Гибкий, с кучей плагинов, но требует отдельного сервера и любви к настройке.
GitHub Actions / GitLab CI: модные, встроенные прямо в Git-платформу. Конфиг пишется в YAML-файле прямо в репозитории. Идеально для стартапов и большинства проектов.
TeamCity, CircleCI, Travis CI: другие облачные и self-hosted варианты. Выбор зависит от стека и бюджета.
Пример простейшего пайплайна на GitHub Actions для Node.js приложения
Файл
.github/workflows/deploy.yml:name: Deploy to Production
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build project
run: npm run build
- name: Deploy to server via SSH
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/myapp
git pull origin main
npm ci --only=production
pm2 restart myapp
Что происходит: при пуше в
main запускается виртуальная машина на Ubuntu, ставится Node.js, ставятся зависимости, прогоняются тесты, собирается проект и, если всё успешно, по SSH на боевой сервер отправляется команда на обновление.Зачем всё это, если можно вручную?
Чтобы не быть заложником своего же процесса и любой разработчик в команде мог сделать деплой, не имея паролей от сервера в голове. Никому в 3 ночи не хочется гадать что сломалось, желательно иметь в логах пайплайна: «Упал на этапе тестов, потому что херня в коде».
Пайплайн это базовый уровень гигиены разработки.
Настройте его один раз и спите спокойно, или хотя бы спите.