#Programming #Education
Инструменты анализа кода
Вы же не просто пишете код, вы его профилируете, дебажите и смотрите где он сосёт ресурсы. Анализ кода это следующая ступень: поиск плохого кода до того как он попадёт в продакшен.
Речь не про «ах, тут отступ не тот». Речь про то, что ваш код по умолчанию потенциальная дыра в безопасности, точка отказа и будущий техдолг.
Платформенные анализаторы
Это не просто линтеры, а системные средства которые смотрят на проект свысока.
Что это: мозги их IDE, вынесенные в отдельный продукт, тот самый ReSharper/Rider/IntelliJ IDEA, который орал на вас в редакторе, но теперь в виде CI-плагина.
Фишка: беспрецедентно глубокий анализ для JVM-языков, PHP, Python, Go. Понимает их экосистемы изнутри, не просто находит ошибки, а предлагает умные исправления — ровно те что вы видели в IDE.
Где: в любом CI (TeamCity, GitHub Actions, и другие). Ловит то, что вы могли пропустить прежде чем пул-реквест уйдет на ревью.
Что это: такой же как и Qodana, но в виде «швейцарского ножа» т.к. охватывает 30+ языков.
Фишка: проверяет не только на баги, но и на уязвимости и «запахи кода» (code smells). Выдает сводную метрику качества + «статус» вашего проекта. Покажет не только где ошибка, но и насколько она критична.
Где: SonarQube — самописный сервер, SonarCloud — SaaS, де-факто стандарт для многих корпораций.
Эти ребята не пытаются объять необъятное, они берут одну задачу и делают ее лучше всех.
PVS-Studio: гроза Си++, C# и Java. Специализируется на глубоких, сложных багах которые часто пропускают компиляторы и другие анализаторы. Диагностирует утечки, неопределенное поведение, ошибки в условиях. Это не просто проверка стилей, а анализ вшивости ядра вашего приложения.
Snyk Code / Checkmarx: фокусируются на безопасности (SAST). Их не волнуют ваши отступы, они ищут уязвимости в виде SQL-инъекций, XSS-атак, проблем с аутентификацией. Очень необходимы если ваш код хоть как-то взаимодействует с внешним миром.
Вы с ними общаетесь каждый день, даже не замечая.
ReSharper (JetBrains для Visual Studio): по сути дедушка Qodana. В реальном времени подсвечивает мусор, предлагает рефакторинги.
Встроенный анализатор в IntelliJ IDEA / PyCharm: тот же движок что и в Qodana, но работает прямо в редакторе.
Встроенный анализатор в Visual Studio: для C# и C++ там своя, весьма продвинутая система статического анализа.
SonarLint: плагин для IDE, который подтягивает правила из вашего SonarQube, чтобы вы ловили проблемы еще до коммита.
Так кто круче? Qodana или SonarQube?
Вопрос из разряда «отвёртка или шуруповёрт?»
Qodana это глубокая интеграция и «родное» понимание конкретных языков от JetBrains. Если ваш стэк это их IDE, то Qodana говорит с вами на одном языке.
SonarQube это широта охвата и универсальность. Один инструмент на всю компанию, от JavaScript до COBOL.
В идеальном случае лучше использовать их вместе: SonarQube как единый дашборд для руководства и общих метрик, а Qodana/PVS-Studio как глубокие эксперты на этапе CI, которые не дадут просочиться никакому говну.
Современная разработка — это когда ваш код проверяют не только вы и тимлид, но и армия ботов, каждый со своей специализацией. Настройте этот конвейер и вы будете спать спокойнее, а ваш репозиторий станет чище.
Инструменты анализа кода
Вы же не просто пишете код, вы его профилируете, дебажите и смотрите где он сосёт ресурсы. Анализ кода это следующая ступень: поиск плохого кода до того как он попадёт в продакшен.
Речь не про «ах, тут отступ не тот». Речь про то, что ваш код по умолчанию потенциальная дыра в безопасности, точка отказа и будущий техдолг.
Платформенные анализаторы
Это не просто линтеры, а системные средства которые смотрят на проект свысока.
Qodana (JetBrains)
Что это: мозги их IDE, вынесенные в отдельный продукт, тот самый ReSharper/Rider/IntelliJ IDEA, который орал на вас в редакторе, но теперь в виде CI-плагина.
Фишка: беспрецедентно глубокий анализ для JVM-языков, PHP, Python, Go. Понимает их экосистемы изнутри, не просто находит ошибки, а предлагает умные исправления — ровно те что вы видели в IDE.
Где: в любом CI (TeamCity, GitHub Actions, и другие). Ловит то, что вы могли пропустить прежде чем пул-реквест уйдет на ревью.
SonarQube/SonarCloud (SonarSource)
Что это: такой же как и Qodana, но в виде «швейцарского ножа» т.к. охватывает 30+ языков.
Фишка: проверяет не только на баги, но и на уязвимости и «запахи кода» (code smells). Выдает сводную метрику качества + «статус» вашего проекта. Покажет не только где ошибка, но и насколько она критична.
Где: SonarQube — самописный сервер, SonarCloud — SaaS, де-факто стандарт для многих корпораций.
Узкоспециализированные бойцы
Эти ребята не пытаются объять необъятное, они берут одну задачу и делают ее лучше всех.
PVS-Studio: гроза Си++, C# и Java. Специализируется на глубоких, сложных багах которые часто пропускают компиляторы и другие анализаторы. Диагностирует утечки, неопределенное поведение, ошибки в условиях. Это не просто проверка стилей, а анализ вшивости ядра вашего приложения.
Snyk Code / Checkmarx: фокусируются на безопасности (SAST). Их не волнуют ваши отступы, они ищут уязвимости в виде SQL-инъекций, XSS-атак, проблем с аутентификацией. Очень необходимы если ваш код хоть как-то взаимодействует с внешним миром.
Анализаторы в IDE
Вы с ними общаетесь каждый день, даже не замечая.
ReSharper (JetBrains для Visual Studio): по сути дедушка Qodana. В реальном времени подсвечивает мусор, предлагает рефакторинги.
Встроенный анализатор в IntelliJ IDEA / PyCharm: тот же движок что и в Qodana, но работает прямо в редакторе.
Встроенный анализатор в Visual Studio: для C# и C++ там своя, весьма продвинутая система статического анализа.
SonarLint: плагин для IDE, который подтягивает правила из вашего SonarQube, чтобы вы ловили проблемы еще до коммита.
Так кто круче? Qodana или SonarQube?
Вопрос из разряда «отвёртка или шуруповёрт?»
Qodana это глубокая интеграция и «родное» понимание конкретных языков от JetBrains. Если ваш стэк это их IDE, то Qodana говорит с вами на одном языке.
SonarQube это широта охвата и универсальность. Один инструмент на всю компанию, от JavaScript до COBOL.
В идеальном случае лучше использовать их вместе: SonarQube как единый дашборд для руководства и общих метрик, а Qodana/PVS-Studio как глубокие эксперты на этапе CI, которые не дадут просочиться никакому говну.
Современная разработка — это когда ваш код проверяют не только вы и тимлид, но и армия ботов, каждый со своей специализацией. Настройте этот конвейер и вы будете спать спокойнее, а ваш репозиторий станет чище.
#Programming
Лямбда-функции
Вы наверняка видели эту странную стрелочку
Лямбда — это анонимная функция, без привычного нам имени. Как тот самый лом в руках Фримана.
Разберём на понятном для масляток примере:
Представим что вы начальник «ООО ХлебЖуй». Вам нужно чтобы ваш подчиненный (функция) сходил в магазин за хлебом.
1. Вы нанимаете постоянного сотрудника, даете ему имя и должность:
2. Потом вызываете его по имени:
Это нормально если «сходить за хлебом» сложная процедура, которая повторяется каждый день.
Но если вам необходимо чтобы кто-то один раз нажал на кнопку
Вы берете лямбду и сами вскрываете щель. Сделали дело — лом отложили.
В коде это выглядит так:
Видите?
Так зачем это надо?
1. Локальность и скорость. Вам не нужно прыгать взглядом в другое место файла чтобы понять, что делает
2. Код становится декларативным. Вы говорите «сделай ТАКОЕ с каждым элементом»
3. Удобно для колбэков. Когда вы передаете функцию в другую функцию (например, «вызови этот код, когда произойдет клик»), лямбда идеальна. Зачем давать имя одноразовому действию?
Можно сказать даже так:
Лом (лямбда) это инструмент, который закреплен за кем-то одним (у него нет имени). Он просто делает свою работу здесь и сейчас.
Он универсален, ломом можно и дверь вскрыть, и голову снести, и число умножить, и условие проверить.
Он решает проблему прямо на месте. Не нужно бегать и искать нужного специалиста (поиск по коду объявленной функции). Все делается в точке возникновения задачи.
Лямбда — это не какая-то магия высшего программирования. Это просто инструмент для одноразовых операций, который делает код компактнее и зачастую читаемее. Конечно, не стоит тыкать лямбдой везде где нужно и не нужно. Если операция сложная и используется много раз — заведите нормальную функцию. Но для мелких, локальных действий это оружие массового поражения говнокода.
Лямбда-функции
Вы наверняка видели эту странную стрелочку
=> в коде и слышали как какие-то умники щеголяют словом «лямбда». А потом кто-то сказанул: «Это как лом Гордона Фримана!». И все такие: «Ага, понятно...». А на деле нихера не понятно.Лямбда — это анонимная функция, без привычного нам имени. Как тот самый лом в руках Фримана.
Разберём на понятном для масляток примере:
Представим что вы начальник «ООО ХлебЖуй». Вам нужно чтобы ваш подчиненный (функция) сходил в магазин за хлебом.
1. Вы нанимаете постоянного сотрудника, даете ему имя и должность:
function сходитьЗаХлебом() { ... }.2. Потом вызываете его по имени:
сходитьЗаХлебом().Это нормально если «сходить за хлебом» сложная процедура, которая повторяется каждый день.
Но если вам необходимо чтобы кто-то один раз нажал на кнопку
сходитьЗаХлебом()? Вы же не будете для этого нанимать человека в штат, давать ему имя, трудовую и соцпакет, так ведь?Вы берете лямбду и сами вскрываете щель. Сделали дело — лом отложили.
В коде это выглядит так:
# Вместо того чтобы объявлять целую функцию...
def умножить_на_два(x):
return x * 2
# ...можно взять и сделать это на месте.
result = list(map(lambda x: x * 2, [1, 2, 3]))
# Получится [2, 4, 6]
Видите?
lambda x: x * 2 это и есть тот самый лом. У него нет имени, он создан прямо здесь для одной конкретной операции внутри map() и после этого его как бы не существует.Так зачем это надо?
1. Локальность и скорость. Вам не нужно прыгать взглядом в другое место файла чтобы понять, что делает
умножить_на_два. Всё описано в одну строчку прямо на месте.2. Код становится декларативным. Вы говорите «сделай ТАКОЕ с каждым элементом»
(map(lambda x: x+1)), вместо того чтобы писать цикл, объявлять переменную, и т.д. Фокус смещается с процесса на результат.3. Удобно для колбэков. Когда вы передаете функцию в другую функцию (например, «вызови этот код, когда произойдет клик»), лямбда идеальна. Зачем давать имя одноразовому действию?
Можно сказать даже так:
Лом (лямбда) это инструмент, который закреплен за кем-то одним (у него нет имени). Он просто делает свою работу здесь и сейчас.
Он универсален, ломом можно и дверь вскрыть, и голову снести, и число умножить, и условие проверить.
Он решает проблему прямо на месте. Не нужно бегать и искать нужного специалиста (поиск по коду объявленной функции). Все делается в точке возникновения задачи.
Лямбда — это не какая-то магия высшего программирования. Это просто инструмент для одноразовых операций, который делает код компактнее и зачастую читаемее. Конечно, не стоит тыкать лямбдой везде где нужно и не нужно. Если операция сложная и используется много раз — заведите нормальную функцию. Но для мелких, локальных действий это оружие массового поражения говнокода.
3
#Programming #Education
Корутины
Представьте что вы официант в очень модном MacBook-кафе. У вас есть два способа работать:
Способ первый, обычный (как потоки): вы подходите к первому столику, принимаете заказ, бежите на кухню и... Стоите там пока повар готовит бургер. Вы не можете отлучиться, вы просто ждёте. Потом несёте бургер, подходите ко второму столику и снова стоите на кухне, пока заваривают кофе. Все клиенты злые, вы уставший и кафе обслуживает человек пять за вечер. Это — блокирующие операции. Поток (официант) блокируется на время ожидания.
Способ второй, волшебный (как корутины): вы подходите к первому столику, принимаете заказ и, прежде чем побежать на кухню, ставите себе в уме флажок: «Жду бургер». Затем вы идёте ко второму столику, принимаете заказ на кофе и ставите флажок: «Жду кофе». Потом к третьему. Вы не стоите без дела! Вы возвращаетесь на кухню и если какой-то заказ готов то сразу его несёте. Вы управляете множеством задач одновременно, не разрываясь на части и не заставляя никого долго ждать вашего возвращения.
Вот эти «флажки» и есть корутины.
Корутина — это функция, у которой есть суперспособность: она умеет ставить себя на паузу (
Обычная функция когда её вызывают работает от начала до конца и забывает о своём состоянии. Корутина же, встретив операцию которая требует ожидания (например запрос в сеть или чтение файла), вежливо говорит: «Знаете, я тут подожду, а вы пока займитесь другими делами». Она не блокирует весь процесс, а просто «засыпает», освобождая ресурсы для других корутин.
Когда её заказ готов (пришел ответ из сети), она «просыпается» ровно в том месте где остановилась, со всеми своими локальными переменными и состоянием, и продолжает работу.
Так в чём же главная магия? Зачем это всё?
1. Экономия ресурсов. Потоки в компьютере — это как настоящие официанты. Каждому новому нужно своё рабочее место (стек), их переключение отнимает силы у системы процессора. А корутины это как один супер-официант с феноменальной памятью. Они невероятно легковесны и их можно запускать тысячи в рамках одного потока.
2. Отзывчивость. Представьте что вы скачиваете десять файлов одновременно. В старом подходе интерфейс бы завис до конца закачки. С корутинами — пока один файл качается (аналог
3. Читаемость кода. Раньше асинхронность делали через адские цепочки колбэков (callback hell), где можно было утонуть. Теперь код выглядит почти как обычный, последовательный, просто расставлены ключевые слова
Где это применяется в реальной жизни?
Корутины не какая-то нишевая магия, а современный и уже обязательный для понимания инструмент. Они не делают вычисления быстрее, они делают ожидание — тем, чем оно и должно быть: паузой, а не остановкой всего процесса.
Корутины
Представьте что вы официант в очень модном MacBook-кафе. У вас есть два способа работать:
Способ первый, обычный (как потоки): вы подходите к первому столику, принимаете заказ, бежите на кухню и... Стоите там пока повар готовит бургер. Вы не можете отлучиться, вы просто ждёте. Потом несёте бургер, подходите ко второму столику и снова стоите на кухне, пока заваривают кофе. Все клиенты злые, вы уставший и кафе обслуживает человек пять за вечер. Это — блокирующие операции. Поток (официант) блокируется на время ожидания.
Способ второй, волшебный (как корутины): вы подходите к первому столику, принимаете заказ и, прежде чем побежать на кухню, ставите себе в уме флажок: «Жду бургер». Затем вы идёте ко второму столику, принимаете заказ на кофе и ставите флажок: «Жду кофе». Потом к третьему. Вы не стоите без дела! Вы возвращаетесь на кухню и если какой-то заказ готов то сразу его несёте. Вы управляете множеством задач одновременно, не разрываясь на части и не заставляя никого долго ждать вашего возвращения.
Вот эти «флажки» и есть корутины.
Корутина — это функция, у которой есть суперспособность: она умеет ставить себя на паузу (
yield или await) и потом возобновлять работу с того же места.Обычная функция когда её вызывают работает от начала до конца и забывает о своём состоянии. Корутина же, встретив операцию которая требует ожидания (например запрос в сеть или чтение файла), вежливо говорит: «Знаете, я тут подожду, а вы пока займитесь другими делами». Она не блокирует весь процесс, а просто «засыпает», освобождая ресурсы для других корутин.
Когда её заказ готов (пришел ответ из сети), она «просыпается» ровно в том месте где остановилась, со всеми своими локальными переменными и состоянием, и продолжает работу.
Так в чём же главная магия? Зачем это всё?
1. Экономия ресурсов. Потоки в компьютере — это как настоящие официанты. Каждому новому нужно своё рабочее место (стек), их переключение отнимает силы у системы процессора. А корутины это как один супер-официант с феноменальной памятью. Они невероятно легковесны и их можно запускать тысячи в рамках одного потока.
2. Отзывчивость. Представьте что вы скачиваете десять файлов одновременно. В старом подходе интерфейс бы завис до конца закачки. С корутинами — пока один файл качается (аналог
await), программа может обрабатывать ваши клики, анимацию и другие задачи.3. Читаемость кода. Раньше асинхронность делали через адские цепочки колбэков (callback hell), где можно было утонуть. Теперь код выглядит почти как обычный, последовательный, просто расставлены ключевые слова
async и await. Вот пример на Python:async def скачать_картинку(ссылка):
# На этом моменте корутина "засыпает", пока данные качаются,
# и программа может делать что-то ещё
response = await aiohttp.get(ссылка)
# "Просыпается" здесь, когда данные уже пришли
данные = await response.read()
return записать_в_файл(данные)
# И мы можем легко запустить много таких задач
задачи = [скачать_картинку(url) for url in списко_ссылок]
await asyncio.gather(*задачи)
Где это применяется в реальной жизни?
Веб-серверы, которые держат десятки тысяч одновременных подключений.
Игры, где одновременно движутся сотни объектов, каждый со своей логикой.
Мобильные приложения, где нельзя чтобы интерфейс замирал при загрузке данных.
Любые программы, которые много общаются с сетью или диском.
Корутины не какая-то нишевая магия, а современный и уже обязательный для понимания инструмент. Они не делают вычисления быстрее, они делают ожидание — тем, чем оно и должно быть: паузой, а не остановкой всего процесса.
#ITLife #Other
Рабочее место: чтобы не уставать, а кайфовать
Есть одна странная вещь: мы можем выбирать идеальный стек технологий для проекта, но годами миримся с неудобным столом, от которого затекает спина и светом, который режет глаза. Мы терпим, считая это мелочью, а потом удивляемся вечерней усталости, туману в голове и ноющей шее.
Ваше рабочее место не просто стол и стул, это интерфейс между вами и миром, в котором вы создаёте код. И если этот интерфейс глючный, то и работа даётся тяжелее. Организовать его такая же важная часть как и выбор архитектуры вашего проекта
Главное не следовать всем советам подряд, а найти то что работает лично для вас. Вот на что стоит обратить внимание:
Основа это положение тела. Стул и стол должны позволять сидеть так чтобы спина чувствовала опору, а не напрягалась, пытаясь удержать равновесие. Локти под углом, ступни на полу или на подставке. Монитор нужно поставить так, чтобы смотреть на него прямо, не задирая и не опуская голову, это снимет нагрузку с шеи.
Свет под настроение. Резкий световой луч от настольной лампы в темноте или блик на экране от окна незаметно утомляют. Мягкий рассеянные фотоны сбоку и отсутствие контраста между экраном и комнатой делают работу спокойнее. Экран не должен быть ярче всего вокруг.
Движения (не в Бристоль). Сидеть неподвижно часами противоестественно для человека: тело затекает, внимание притупляется. Просто встать, пройтись, посмотреть вдаль уже хорошая перезагрузка не только для мышц, но и для мыслей. Не нужно сложной гимнастики, достаточно не превращаться в статую.
Порядок на столе создаёт гармонию в голове. Хаос из бумаг, проводов и банок энергетиков создаёт фоновый шум для сознания. Не обязательно стремиться к минимализму, но стоит убрать то, что точно не нужно прямо сейчас. Свободное пространство помогает думать.
В итоге смысл не в том чтобы купить самое дорогое кресло или идеально всё организовать с понедельника. Смысл — постепенно приходить к тому чтобы ваше пространство работало на вас, а не против вас. Прислушиваться к телу: если через час начинает болеть спина, значит нужно что-то менять в посадке. Если глаза устают, то возможно дело в свете или в настройках монитора.
Это такой же процесс настройки как и поиск удобного инструмента для работы. Только в данном случае вы настраиваете главный инструмент который никакими костылями не фиксится — себя. И это самая важная задача.
Рабочее место: чтобы не уставать, а кайфовать
Есть одна странная вещь: мы можем выбирать идеальный стек технологий для проекта, но годами миримся с неудобным столом, от которого затекает спина и светом, который режет глаза. Мы терпим, считая это мелочью, а потом удивляемся вечерней усталости, туману в голове и ноющей шее.
Ваше рабочее место не просто стол и стул, это интерфейс между вами и миром, в котором вы создаёте код. И если этот интерфейс глючный, то и работа даётся тяжелее. Организовать его такая же важная часть как и выбор архитектуры вашего проекта
hello world.Главное не следовать всем советам подряд, а найти то что работает лично для вас. Вот на что стоит обратить внимание:
Основа это положение тела. Стул и стол должны позволять сидеть так чтобы спина чувствовала опору, а не напрягалась, пытаясь удержать равновесие. Локти под углом, ступни на полу или на подставке. Монитор нужно поставить так, чтобы смотреть на него прямо, не задирая и не опуская голову, это снимет нагрузку с шеи.
Свет под настроение. Резкий световой луч от настольной лампы в темноте или блик на экране от окна незаметно утомляют. Мягкий рассеянные фотоны сбоку и отсутствие контраста между экраном и комнатой делают работу спокойнее. Экран не должен быть ярче всего вокруг.
Движения (не в Бристоль). Сидеть неподвижно часами противоестественно для человека: тело затекает, внимание притупляется. Просто встать, пройтись, посмотреть вдаль уже хорошая перезагрузка не только для мышц, но и для мыслей. Не нужно сложной гимнастики, достаточно не превращаться в статую.
Порядок на столе создаёт гармонию в голове. Хаос из бумаг, проводов и банок энергетиков создаёт фоновый шум для сознания. Не обязательно стремиться к минимализму, но стоит убрать то, что точно не нужно прямо сейчас. Свободное пространство помогает думать.
В итоге смысл не в том чтобы купить самое дорогое кресло или идеально всё организовать с понедельника. Смысл — постепенно приходить к тому чтобы ваше пространство работало на вас, а не против вас. Прислушиваться к телу: если через час начинает болеть спина, значит нужно что-то менять в посадке. Если глаза устают, то возможно дело в свете или в настройках монитора.
Это такой же процесс настройки как и поиск удобного инструмента для работы. Только в данном случае вы настраиваете главный инструмент который никакими костылями не фиксится — себя. И это самая важная задача.
#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