Все потоки
Поиск
Написать публикацию
Обновить
969.54

Программирование *

Искусство создания компьютерных программ

Сначала показывать
Порог рейтинга
Уровень сложности

Оптимизация поисковых систем: баланс между скоростью, релевантностью и масштабируемостью

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров753

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

Эта статья основана на нашем выступлении на конференции QCon San Francisco 2024, где мы рассмотрели эволюцию подходов к индексированию данных, их извлечению и ранжированию. Для платформ вроде Uber Eats, обрабатывающих сложные запросы на больших объёмах данных, оптимизация поиска — это серьёзный вызов, требующий продвинутых стратегий: индексирования, шардинга и параллельной обработки запросов.

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

Читать далее

Мы 30 лет делали сайты руками, а потом пришла нейросеть

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров19K

Привет, Хабр! Хочу поделиться опытом создания сайта с помощью ИИ. Сразу скажу — я не профессиональный разработчик. Программировал несколько лет назад, потом переключился на другие задачи. Когда понадобилось сделать новый сайт, оказалось, что многое изменилось — новые инструменты, подходы. Пришлось учиться заново, но теперь уже с ИИ в качестве помощника.

Так что не судите строго — делюсь тем, что получилось, возможно, многое можно было сделать лучше или правильнее. Буду рад вашим советам!

У меня был сайт интернет‑магазина лабораторного оборудования, который постоянно ломался. Любое изменение — и что‑то отваливалось в другом месте. В итоге я решил: хватит мучиться, надо что‑то с этим делать. И попробовал создать новый сайт через нейросеть — через Claude.

Представьте себе машину, которую ремонтировали разные мастера в течение многих лет: заводишь двигатель — отваливается колесо, прикручиваешь колесо — открывается багажник. Именно так выглядел мой старый сайт. Сайт делали разные люди в разное время, в коде невозможно было разобраться, любое изменение ломало что‑то в другом месте. SEO практически не работало, трафик постоянно падал.

Нужно было создать новый каталог для 400+ позиций лабораторного оборудования. Но это не классический интернет‑магазин с корзиной и оплатой, а каталог с формой «запросить цену» — в сфере B2B так часто работают.

Читать далее

Распознавание текста на изображении и общение с распознанным текстом. Paddle OCR + LLM

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров3.7K

Данная статья описывает процесс создания проложения для распознавания текста на изображении и общения с распознанным текстом. 

В процессе разработки используются:

Язык: Python

Оптическое Распознавание Символов(OCR): Paddle OCR

Площадка для языковой модели: Ollama

Большая языковая модель(LLM): qwen2:7b

Сетевой фреймворк для API: FastAPI

Читать далее

GIMP Script-Fu ООП. Тестирование на «РОМБЕ СМЕРТИ»

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров256

Библиотека функций к Script-fu

Написание кода на Лисп это тестирование, я не знаю(это не значит что их нет, просто я их действительно не знаю) ни одного языка программирования в котором цикл: написание код - проверка(тестирование) был бы таким коротким. Кстати в Script-fu я работаю через буфер обмена, это не удобно! Там есть возможность работать из Емакс, через сервер Scrip-fu, но я эту возможность не использую(приятно видеть консоль), а с обычной схемой или лиспом, работа в передаче кода заключается в нажатии пары клавиш. Лисперы не пишут многостраничные листинги кода, а затем его тестируют, они пишут функцию, выполняют его в интерпретаторе и сразу тестируют. Всё это благодаря наличию в системе REPL. И всё таки не смотря на это настаёт момент, когда требуются отдельные тесты, которые удобно запустить и проверить консистентное состояние программной системы, а то в процессе такого интенсивного создания-тестирования программы всё равно можно что либо опустить, и какая нибудь функциональность да отвалится.

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

Читать далее

Move-only типы и ключевое слово move в Swift

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров702

Привет, Хабр!

Сегодня рассмотрим интересную вещь из из стека Swift 6 — move-only типы, ключевое слово move и всё, что с ними связано.

Читать далее

Программа «Hello World» на машинном коде под DOS

Время на прочтение14 мин
Количество просмотров11K

Как-то раз я послушал следующее интересное выступление (по-немецки): ссылка

В нём разобрано, как написать программу «hello world» для 64-разрядного дистрибутива Linux в шестнадцатеричном редакторе. Ассемблер здесь не используется, программа пишется непосредственно на машинном коде. Правда, в ней есть издержки на использование ELF.

Мне понравилась такая идея, и я решил повторить такой опыт, но немного в иной форме — а именно под 16-разрядной DOS в реальном режиме. У меня должен был получиться файл в формате COM, а не EXE, так как (на данном этапе) меня интересовал не столько формат файла, сколько кодировка инструкций. В вышеупомянутой лекции, если честно, не сообщается почти никаких подробностей о том, как именно перейти от ассемблерного кода к машинному — поскольку в случае разбора этих тем лекция, пожалуй, растянулась бы на несколько часов. Но здесь я всё разберу подробно, и при этом собираюсь пользоваться только документацией lntel, а также дизассемблировать код в целях верификации.

Также мы коротко поговорим о сегментации.

В качестве шестнадцатеричного редактора на этот раз воспользуемся hexedit.

Читать далее

Почему стоит использовать Tagged Unions при разработке на TypeScript

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров7.6K

Почему стоит использовать Tagged Unions при разработке на TypeScript

👋 Привет! Меня зовут Александр, я работаю фронтенд-разработчиком в компании «МегаФон». Сегодня я хочу поговорить на тему Tagged Unions (размеченных объединений) и объяснить, почему они ваш секретный инструмент для написания надежного TypeScript-кода.

Читать далее

Отечественные Open Source-инструменты для ИИ-разработки

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров5K

Open Source — подход к созданию программного обеспечения, при котором исходный код программы делается доступным для всех. Это означает, что любой человек может использовать программу, изучать ее, изменять под свои нужды и делиться этими изменениями с другими.

В контексте искусственного интеллекта Open Source-инструменты включают библиотеки, фреймворки, датасеты, модели и платформы, которые помогают разработчикам создавать, обучать и тестировать ИИ-системы.

Читать далее

Семь смертных грехов IT-резюме. Взгляд рекрутера, отсмотревшего 1 млн+ кандидатов

Время на прочтение5 мин
Количество просмотров5.9K

Привет, Хабр. Меня зовут Роман Изотов. Последние 5+ лет я провел «по ту сторону баррикад» — в IT-рекрутинге. За это время через мои руки (и глаза) прошло более миллиона резюме. Да, миллиона. И 95% из них — это тихий ужас.

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

Запомните одну простую истину: рекрутер тратит на первое сканирование вашего резюме от 15 до 30 секунд. У вас нет права на ошибку. За это время он принимает бинарное решение: «мусор» или «может быть».

В этой статье я вскрою 7 самых частых, самых фатальных ошибок, которые я видел тысячи раз. Это те самые «красные флаги», заметив которые, я (и сотни моих коллег) с легким сердцем нажимал кнопку «Отказать».

Готовы посмотреть на свое резюме моими циничными глазами? Поехали.

Читать далее

JEP 511: Импорт модулей в Java 25 — как упростить работу с библиотеками

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров979

Команда Spring АйО проанализировала JEP 511: импорт модулей. Теперь можно будет одним импортом подключать все пакеты, которые экспортирует модуль. Это сильно упростит работу с большими библиотеками, особенно в прототипах и обучении.

Читать далее

Аннотация Lazy как спасение от циклических зависимостей

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров2.7K

В прошлом посте команда Spring АйО подробно разобрала, как @Lazy помогает экономить ресурсы и ускорять старт приложения. Но забыли упомянуть ещё один крайне полезный кейс применения этой аннотации — борьбу с циклическими зависимостями.

Читать далее

«Щи: симулятор жестокости» или «Как не надо делать игры»

Уровень сложностиПростой
Время на прочтение57 мин
Количество просмотров16K

Данная статья будет полезна начинающим разработчикам игр, да и вообще, любым людям, кто хочет связать свою жизнь с программированием. Я постарался сделать статью интересной и полезной тем, кто не знает программирование, но знание хотя бы основ С++ увеличит удовольствие от статьи.

Читать далее

Байки про тактические паттерны DDD

Уровень сложностиСредний
Время на прочтение25 мин
Количество просмотров8K

Если вы никогда не интересовались паттернами DDD или это было давно и неправда, эта статья, к сожалению, мало чем сможет вам помочь. Если вы никогда не читали Вернона – я настоятельно рекомендую это сделать, его объяснения прекрасны, подробны и системны.

Если же вы знакомы с трудами классиков, но сочли их оторванными от жизни, либо были когда-то ими воодушевлены, попробовали воплотить их идеи на практике, но столкнулись с проблемами и разочаровались, то, возможно, я смогу вам помочь. Не потому что я – лучший в мире архитектор, программист или технический писатель, а потому, что я применяю Domain Driven Design на практике и советы, которыми я хочу поделиться, это не «ещё один пересказ Эванса», а отражение того, как это действительно может работать (как минимум в моей практике) в реальных проектах.

Читать далее

Ближайшие события

Как устроены AI агенты: разбираемся на примере ReAct и Reflection

Уровень сложностиСредний
Время на прочтение18 мин
Количество просмотров3.4K

Привет, Хабр!

2025 стал годом AI агентов. Мы видим, как их пытаются применить повсюду: от школ до банковского сектора.

Но все ли понимают, как они работают? Или разработчики просто используют готовые реализации, как create_react_agent из langchain? В этой статье мы заглянем в устройство этих шаблонов.

Читать далее

Создание умных AI-агентов: полный курс по LangGraph от А до Я. Часть 1. Архитектура: графы, узлы и состояния

Время на прочтение22 мин
Количество просмотров21K

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

Учимся строить архитектуру будущих AI-агентов без единой строчки ML-кода — только чистая логика и понятные примеры. От простого калькулятора возраста до сложных циклических процессов с визуализацией графов. Готовим фундамент для интеграции с нейросетями в следующих частях.

Читать далее

GIMP Script-Fu ООП. Основной дизайн (а-ля CLOS)

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров355

Библиотека функций к Script-fu

Итак, теперь наша система позволяет описывать классы с иерархиями множественного наследования и описывать обобщённые функции(generic function) и они придают динамику, придают жизнь создаваемым в системе объектам. Но так ли хороши описанные нами обобщённые функции? Да с точки зрения широко распространённых("классических") ООП систем, они полностью повторяют функциональность методов объектов. При вызове обобщённой функции, происходит диспетчеризация вызова и выбирается наиболее подходящий по типам аргументов метод обобщённой функции. НО в CLOS это НЕ ТАК!!! Да в простейшем случае это так, НО..! CLOS предоставляет более гибкий способ организации кода, когда выполняемый при вызове обобщённой функции код представляет собой не один метод, а целую группу методов. Причём создаётся эта группа динамически в момент вызова, в зависимости от текущих аргументов обобщённой функции(вернее их типов/классов). А в основе такой организации кода лежит спецификация методов обобщённой функции различными квалификаторами.

Читать далее

Теорема о разделяющей оси при обнаружениях столкновений

Время на прочтение11 мин
Количество просмотров4.4K

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

Несколько лет назад я посмотрел отличную презентацию от Дирка. В ней он описывал теорему о разделяющей оси, пролегающей между выпуклыми многогранниками (видеослайды). Примерно на 18 минуте (слайд 29) он заводит речь о наложении гауссовых отображений выпуклых многогранников — как они помогают найти грани разности Минковского для этих многогранников.

Читать далее

GIMP Script-Fu ООП. Обобщённые функции

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров689

Библиотека функций к Script-fu

Готовя эту статью я интересовался, что там в других языках, что там за «дженерики»? Все языки разбирать не буду, но скажу одно: Generic function использующиеся в ЛИСПе и современные дженерики различаются как НЕБО и ЗЕМЛЯ. За дженерики в современных языках в основном ратуют строго типизированные языки, всем понятно, что писать кучу однотипного кода просто глупо. Не скажу точно, кто стоит у истоков современных «дженериков», но пожалуй одним из ранних их проявлений это ШАБЛОНЫ в С++. Почему все остальные языки типа явы и ей подобных, решили назвать свои шаблоны дженериками мне не понятно. (у меня есть язвительное замечание, что хотели как в лиспе, но получилось как всегда). Но дело в том что в ПОДОБНЫХ дженериках языки с динамической типизацией просто не нуждаются. Функция list работает с любыми типами данных, ШАБЛОНЫ не нужны! А в С++ именно контейнеры стали основной побудительной силой использования дженериков, это просто хранилища которые хранят значения, если Си мы можем обойтись (void *) и потом привести тип к нужному, то С++ решил пойти по типобезопасному пути, ну немного "потолстев" в коде. Ну а что же там у современных его последователей?

Рассмотрим Go. Пытаясь избавиться от типа, вводят обобщённую переменную T, но понимая, что сделать то с ней ничего нельзя(кроме как хранить и выдать обратно), пытаются как то её ТИПИЗИРОВАТЬ!!! Вводят КОНТРАКТ! А что делать когда в функции надо будет делать сложение? Надо будет к этому контракту добавить ещё контракт аддитиве? а умножение? или ещё что то? в любом случае код функции БЕДЕН! именно в силу того что мы не знаем что может прилететь нам в типе Т. Я вам расскажу, что такое НАСТОЯЩИЕ ДЖЕНЕРИКИ.

Читать далее

Throw — это новый goto

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров33K

Помните ли вы о существовании goto?

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

Но почему-то я не встречал никакого негатива насчёт throw. А ведь это точно такая же фигня, если даже не хуже.

Читать далее

Операционка как пет-проект — подборка «экспериментов»

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров4.7K

Написание собственной операционки — серьезный челендж для системных разработчиков. Мы собрали несколько проектов, авторы которых исследуют устройство ОС и предлагают свои решения, опираясь на проверенные идеи.

Читать далее

Вклад авторов