О разработке и не только
308 subscribers
18 photos
3 videos
935 links
Делюсь годными материалами, которые нахожу в сети. В основном по программированию, немного научпопа, софт-скилам и менеджменту.
Download Telegram
А тем временем вышла новая мажорная версия Django. У меня к этому фреймворку давняя любовь; я умею его готовить и надеюсь к нему вернуться :)

Заметил, что он вобрал в себя много сторонних пакетов, которые доказали свою полезность. Итак, из интересного:
- выполнение отложенных задач
- улучшение Content Security Policy
- автоимпорт пакетов в ./manage.py shell
- встроенный тип поля модели StringAgg

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

UPD. Нашёл перевод

https://adamj.eu/tech/2025/12/03/django-whats-new-6.0/ #python
2👍2🔥1
А ведь я до сих пор не публиковал ссылку на замечательный сайт, в котором есть роадмапы по разным направлениям в IT. Например, что нужно знать фронтендеру, девопсу, млщику и т.п. Они очень подробны, расписаны какие технологии обязательны, а для каких есть альтернативы.

Проверил свой курс по linux, и он почти полностью совпадает :) По модулю работы с сетями — их студенты изучают только в следующем семестре.

https://roadmap.sh/ #dev
🔥81👍1
Случайно натолкнулся на статью о том, как устроена разработка в AWS (в частности, в CloudFlare). Человека хватило аж на 3 года, но с последствиями для здоровья.

Если вы хотите работать в крупной компании, то готовьтесь не видеть своих результатов. Проталкивать свои идеи что-то из ряда невозможного. Расти на рабочих задачах — очень меееедленно. Менять мир — фантастика. Именно из-за этого я избегал раобты в энтерпрайзе. С другой стороны сидеть на попе ровно можно очень комфортно. Но в таком случае где вы окажитесь через 5 лет?

https://nekrolm.github.io/post.html?post=posts%2Fleaving-aws.md #dev
👍3
Если вы себя сегодня чувтсвуете котиком с этой картинки, то значит хорого отдохнули 🤪

У большинства наших органов есть свойство реципрокности: делать в один момент времени только одну какую-то задачу. Например, печень может или накапливать гликоген, или расщеплять алкоголь - но не одновременно! Вот с мозгом также. Ярко выражены 3 фазы, я их называю:
- "творец" - если надо придумать какой-то алгоритм или сделать презентацию
- "ученик" - подсистема выявления значимости
- "рефлексия" - переосмысление себя, отдых и т.п.
И переключаться между ними очень сложно. Но необходимо, т.к. нервные клетки одной подсети могут и не успевать восстанавливаться за ночь. Так что поболтайте у кулера, поразгребайте почту, почитайте Хабр - и мозг сам втянется в рабочий ритм 😉

Я, конечно, сильно утрирую. Гораздо лучше про работу мозга вам расскажет Вадим Макишвили. Есть текстовая расшифровка, но я настоятельно рекомендую именно видео. Спикер отлично рассказывает.
👍161
Ха-ха, вот и в Go появилась необходимость в определении заимствовании и владении. Спасибо rust, удобную концепцию ввели.

Суть в том, что вот такой код приводит к выделению огромного количества объектов на стеке, где никакого GC нет. И следовательно, приложение падает по OOM:

package main

type Node struct {
next *Node
payload [64]byte
}

func main() {
curr := new(Node)
for {
curr.next = new(Node)
curr = curr.next
}
}


Я хоть и не работаю с Go, но понимаю где здесь утечка памяти. И чисто с продуктовой стороны я бы это поведение за баг не считал. Да, это особенность языка, что new тут выделяет структуру на стеке, и это надо учитывать. Но уж точно не надо городить ещё один костыль в виде GC для стека. Это настолько редкая история, что он почти всегда будет работать в холостую. ИМХО, крайне странное архитектурное решение; впрочем, "вотэтоповоротов" в Go хватает и без этого.

К чему это я... Самый лучший код тот, который решает проблему будучи не написанным :) Попробуйте в своих продуктах убрать вариативность: возможность обработки разных типов параметров, не городите костыли для обработки очень редких случаев и т.п. - и увидите насколько проще станет поддерживать основной функционал.

https://habr.com/ru/articles/983622/ #go
7
И эти люди ещё гонят на Linux 🙄

А вообще наглядный пример насколько сложно улучшать хороший продукт. Вместо реального исправления проблем делают то, что легко и показывает изменения сразу. Премию-то хочется, а за "просто хорошо работал" её не дают. Вот и приходится что-то придумывать, пусть даже от этого сам продукт пострадает. Такой вот конфликт интересов. Причём это просматривается не только в Apple.

Мне прям жалко дизайнера, который вынужден придумывать иконку для "Make plain text" или "Edit permissions". Ну потому что нет в этом неободимости!

https://habr.com/ru/companies/ruvds/articles/985818/ #dev
4👍2
"Когда показатель становится целью, он перестает быть хорошим показателем." (c) закон Гудхарта

Раньше в программисты шли, чтобы ковыряться с кодом и железяками; сейчас приходится заниматься саморекламой и работать на метрики. Всё потому, что бизнес сам не умеет оценивать вашу эффективность, а перекладывает на вас. Увы, ничего лучше опроса 360 или performance review он не придумал 🤷 В саму эту систему я перестал верить после того, как получил фидбэк "пишет сложный код" от вечного джуна. Да-да, фидбэк ещё надо фильтровать...

Если у вас на работе есть практики performance review, то настоятельно советую поставить себе регулярную задачу записывать чем же вы занимались в течение недели. Потом будет гораздо проще восстановить что же вообще было сделано и доказать какие вы зайки.

https://habr.com/ru/articles/987238/
👍64🔥1
Не так всё однозначно ©️

Подоспел очередной бенчмарк версий CPython (3.10 - 3.14). В целом, конечно, производительность улучшилась, но есть и деградация. Например, pickle/unpickle (что может быть важно для ML), работа с json и корутинами.

https://en.lewoniewski.info/2025/python-314-vs-313-312-311-310-performance-testing-video/ #python
👍31
Впервые вижу, чтобы O-асимптоматику считали с мат. ожиданием. Но звучит интересно по крайней мере...

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

Создаём log2(N) массивов длиной 1, 2, 4, 8 и т.д. При добавлении элемента помещаем его в первый массив с длиной 1. Если там уже что-то есть, то объединяем по merge sort и вставляем в массив длиной 2; если в нём уже что-то есть, то повторить пока не найдём пустой. Обратите внимание, что массивы получаются или пустые или полностью заполненные.

Если нужно найти k среди 10 элементов (битовое представление 10 = 1010), то будем искать в тех, у кого длина 2 и 8, т.к. остальные будут пустые. Каждый из массивов отсортирован, так что поиск в нём O(log(N)). Мат ожидание нахождения элемента в каждом массиве будет <длина массива>/N, и если начинать с самого длинного, то вероятность им же и закончить будет 1/2.

https://habr.com/ru/articles/984184/ #dev
👍42
Обстоятельная статья на тему "Android исчерпал свои возможности". Я не особо специалист в AOSP, но в Linux действительно много шлака, который стоило бы выбросить. Но сову продолжают натягивать на глобус. Google же предлагает свою новую ОС на базе Fuchsia (ядро Zircon, десктоп-версия Aluminium) с фокусом на стабильность и безопасность. Из основных моментов:
- микроядро (для упрощения портирования на кучу устройств)
- больше capabilities
- гибкий ABI через контракты (упрощение поддержки драйверов)
- Flutter вместо Electron
- MicroFuchsia уже в Android

Вот это мне особенно понравилось: Google публично заявила: цель Fuchsia — поддерживать устройства 10+ лет. ☺️ Viva la Revolución!

https://habr.com/ru/articles/984090/ #android
🔥83
Новая концепция engram от DeepSeek (молодцы китайцы!). Суть в том, чтобы оперировать образами из памяти, а не вычислять каждый раз при инференсе. Это позволит схлопнуть трансформеры и освободить существенное количество вычислительных ресурсов. В общем, жду продолжения 🍿

Я не являюсь специалистом в LLM, но наработка выглядит перспективно.

https://habr.com/ru/companies/bothub/articles/989538/ #LLM
👍7
А казахи неплохо так ворвались в GeoPuzzle 😳 Зашёл ради интереса на сервер посмотреть загрузку — всего 6%. Видимо, придётся продолжать развивать проект, раз им пользуются 🤔
7🔥2👍1
В процессе настройки headscale (об этом будет отдельная статья) обратил внимание, что подсеть жёстко задана как 100.64.0.0/10. Т.е. не 192.168.0.0/16, не 172.16.0.0/12, и даже не 10.0.0.0/8. Казалось бы — она должна конфликтовать с каким-то публичным хостером. Но не всё так просто. Помимо multihomed networks (перечислены выше, RFC 3704) есть ещё special-use (192.0.2.0/24, 192.88.99.0/24, ... RFC 3330). Но и там подсети 100.64.0.0/10 нет. Оказывается, есть ещё один список IPv4 Special-Purpose Address Space, и вот там уже она присутствует как Shared Address Space с отметкой о глобальной недоступности.

Так что ребята из Tailscale всё норм сделали. Это можно сказать "домашняя" подсеть, которая недоступна извне. А в статье автор вычисляет все диапазоны публичных подсетей. Просто материал для информации.

https://habr.com/ru/companies/ruvds/articles/986878/ #network
4🤯4👍3
PEP 822 – Dedented Multiline String (d-string) Остапа было уже не остановить. d-strings должны убирать пробелы в началах строк. ИМХО, так себе идея; но Гвидо вписался за это в плане обработки docstrings. Честно - вот лучше б это реализовали в самом парсере docstrings, а не тащили в стандарт.

Кстати, fun fact - даже Гвидо не знает всего, чего наворотили в CPython.
5
Сегодня немного про вайбкодинг. Не так давно генеральный директор Cursor заявил, что агенты ИИ написали браузер, правда компания ни разу не заявила, что этот браузер работает и выполняет свои функции 😄 А вот тут разбор вакханалии в самом репозитории.

На этой неделе Anthropic подсуетился и написал C-компилятор, который, правда, не смог скомпилировать hello world. Ладно, резолвы путей к стандартным библиотекам для CCC не очевидны, но результат работы компилятора выглядит пугающим. Если хотите защитить от реверса своё приложение, то CCC вам в этом поможет о минусах тактично умолчим.

Что следующее? Ядро ОС, LibreOffice, мессенджер? А смысл, если этот код никто не берётся развивать и дорабатывать? Если каждый новый коммит это переписывание примерно половины проекта? Насколько это масштабируется и окупается? Поговорка, что сотни обезьян в итоге смогут написать "Войну и Мир" стала реальностью 😕

Ладно, вспоминая цикл Гартнера, мне кажется, что человечество только ищет возможность применения LLM. Возможно, творческие профессии будут во многом ими заменены, но и не удалены полностью. В конце концов, бум закончится, а рельсы останутся.

А нам работа будет всегда 😔 Но об этом в следующей заметке.
👍62🔥1
Вторая заметка за день про вайбкодинг - это уже перебор. Но не могу пройти мимо :)

Понятно, что в мире будет появляться всё больше софта, сделанного с помощью вайб-кодинга. И это нормально с точки зрения продуктового подхода - дешёвая проверка гипотезы. Которую в случае успеха можно развить и продавать. Вот только отношение к сгенерированному коду должно поменяться с "чуть доработать и запустить" на "выкинуть MVP и сделать нормально".

Автор статьи занимается консалтингом и заказной разработкой уже лет 30. У него много опыта в общении с клиентами, но этот цирк достоин ваших 🔥 И вот чем нам предстоит заниматься уже в самом ближайшем будущем.

https://habr.com/ru/articles/993904/ #vibe
🔥102
Очередной обзор от Энди Павло что же происходит в мире баз данных. Краткое саммари:
- PostgreSQL 18 теперь использует асинхронный I/O и не полагается (читай зависит) от кеша ОС
- разрабатывается горизонтальный шардинг для Postgres
- SaaS на базе Postgres развелось прям очень много
- MCP есть теперь, кажется, у всех БД
- скоро все скажем "пока-пока" MongoDB

Но я всё равно рекомендую прочитать статью, т.к. там есть именно мнение Энди Павло, которое достойно доверия.

https://habr.com/ru/companies/postgrespro/articles/985698/ #database
5👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Что-то за последнюю неделю было много задач по профилированию python приложений. Делюсь тем, что раскопал.

1. Профилировку по памяти удобней всего делать через memray. Всего python3 -m memray run example.py, а потом memray flamegraph memray-example.py.11235.bin. А он сам строит красивые графички, таблицы и пр. Умеет также цепляться к работающему процессу. Прям настоятельно рекомендую - после всех предыдущих оставил приятное впечатление.
2. В 3.15 обещают завезти сэмплирующий профайлер Tachyon. Он будет уметь цепляться к работающему процессу python -m profiling.sampling attach --subprocesses 12345, замерять разные тайминги (CPU, GIL, exception), что более чем хватило бы для решения большинства задач. Интерактивный пример результата. А ещё он умеет красиво выводить в real-time в терминал (см gif). Правда, не знаю зачем это может пригодится. Но красивое.
3. Но до 3.15 ещё дожить надо 😕 Так что воспользовался библиотекой tprof, которая умеет профилировать не всю программу, а только заданные функции. Удобно в коде держать и старую, и новую и итеративно оптимизировать.
4. Не забываем про классику py-spy, хотя её вывод для меня показался сложноватым.

Получился вот такой краткий обзор современных профилировщиков :) А если захотите написать свой, то вот статейка как они работают под капотом.

#python
👍94🔥2
В ноябре выступал на Krasnodar Dev Days с докладом "Эволюция CPython". Это чуть более доработанный вариант темы, что я рассказывал в прошлом году на PyCon. Своим выступлением я хотел показать разработку CPython с продуктовой точки зрения: какие архитектурные решения были сделаны и как они повлияли на язык и сообщество. Мне Python близок именно из-за экосистемы и подходов. Они более спокойные и академические что ли... Гвидо не пытается сделать сразу как можно больше фич, но в первую очередь старается понять их необходимость через PEP. В общем, есть чему поучиться.

P.S. Кода на C в докладе намного больше, чем на самом python 😁

https://www.youtube.com/watch?v=F3mj5CXp7lA&list=PL1irPRp3Ng9ZriMMmHfy47eVsGfK3DOPF&index=1 #tyvik
👍106🔥3
Небольшая заметка про использование LLM в консоли, но меня зацепила двумя моментами:
1. Вместо понимания команд отношение становится к ним как к магии. А я не люблю магию — не угадаешь когда и как она может больно стрельнуть по тебе. Если бы автор-девопсер полез чуть глубже в историю возникновения синтаксиса tar, то узнал, что эта команда появилась ещё до того, как договорились о записи коротких ключей через минус. Во-вторых, короткие ключи можно записывать в любом порядке, если у них нет аргументов. Таким образом, не надо знать — надо понимать.
2. Ваша память деградирует. Для такой мелочи не страшно, но где гарантии, что вы по-прежнему сможете делать более сложные вещи? Декомпозиция средней задачки уже не помещается в кошелёк Миллера, и память надо тренировать. Да-да, не зря комбинаторику на первом курсе проходят. Я уже молчу про возрастные изменения — отсутствие когнитивной нагрузки чаще приводит к проблемам с мозгом в старости.

Звучит так, будто я против использования LLM? Отнюдь, сам ими пользуюсь :) Но не хочу бросаться с головой и заменять ими всё вокруг.

А скрипт хороший, правда. Утащу его себе :)

https://habr.com/ru/articles/1001214/ #llm
9