Как стать автором
Обновить
868.25

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

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

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

Становится ли ПО хуже?

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

Недавно я наткнулся на пост Никиты Прокопова Software disenchantment. Он заставил меня вспомнить пост Мацея Цегловски The Website Obesity Crisis и множество других статей подобного типа. Среди людей, пишущих о разработке ПО, возникает всё более широкий консенсус о том, что приложения становятся больше, медленнее и забагованнее. И это в эпоху, когда оборудование должно позволить нам писать быстрее, меньше и надёжнее. DOOM, вышедший в 1996 году, можно запустить в тесте на беременность и на сотне других неожиданных устройств. Тем временем, современные чат-приложения, работая в фоновом режиме, занимают полгигабайта ОЗУ (или больше), а иногда полностью зависают даже на самом мощном ПО.

Вышеупомянутые посты по этой теме состоят примерно на 80% из справедливой и разумной критики, а на 20% из оторванного от реальности ворчания.

Большинство разработчиков понимает, что глупо спрашивать «это ОС для смартфонов, что в ней может быть сложного?» или «моё приложение для работы с электронными таблицами в 90-х занимало 10 килобайт, тогда почему Factorio весит целый гигабайт?» Если вы не присутствовали при разработке, то не сможете оценить все её проблемы и сложности.

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

Почему же мы этого не делаем?
Читать дальше →
Всего голосов 55: ↑50 и ↓5 +45
Комментарии 86

Новости

Чем заняться на каникулах? 5 идей для пет-проектов, которые можно сделать за новогодние праздники

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

Привет, Хабр! В 2023 году наши коллеги создали много интересных проектов: виртуальную девушку в Telegram, нетипичную игру на Flipper Zero и бота для заказа шавермы. Под катом собрали лучшие инструкции и разделили их по времени разработки. Сохраняйте подборку в закладки: пригодится всем, кто хочет провести новогодние праздники с пользой.
Читать дальше →
Всего голосов 26: ↑17 и ↓9 +8
Комментарии 4

Техсобесы — это просто, но есть нюанс… Часть 2: Зазеркалье

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

Эта статья является некоторым логическим продолжением предыдущей — «Техсобесы — это просто, но есть нюанс…». Я делился своим опытом прохождения технических собеседований, и в комментариях отметили, что это очередная статья о том, как соискатель должен выполнить всю работу за рекрутера. Поэтому сегодня я постараюсь взглянуть на процесс с другой стороны стола.

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

TL;DR: Знайте границы. Не расслабляйтесь. Готовьтесь и не тратьте время впустую. Понимайте зачем. Ищите релевантное. Проверяйте базу, а не частности. Понимание важнее знания. Задачи совсем не про код. Будьте открыты. Будьте таким интервьюером, которого хотели бы видеть с той стороны стола. Успехов!

Читать далее
Всего голосов 9: ↑5 и ↓4 +1
Комментарии 0

Маг молний

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

Когда-нибудь задумывались над тем, чем, в сущности, является программирование?

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

Читать далее
Всего голосов 9: ↑8 и ↓1 +7
Комментарии 7

Истории

Агрегатор личных финансов со всех счетов

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

Всем привет!

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

Читать далее
Всего голосов 14: ↑14 и ↓0 +14
Комментарии 15

Dependency Injection контейнеры .NET, допускающие полиморфное поведение

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


Иногда случается так, что при разработке приложения на платформе .NET с внедрением зависимостей и сервисами от контейнера требуется поддержка полиморфного поведения.

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

Однако стандартный DI контейнер платформы долгое время не давал этой возможности.

В рамках этой статьи я решил напомнить альтернативы для решения этой задачи на тот случай, если вы ещё не успели переехать на .NET 8 или работаете в каком-нибудь Иннотехе, где в наличии только зеркало NuGet-пакетов, выпущенных до начала 2022 года.
Читать дальше →
Всего голосов 41: ↑38 и ↓3 +35
Комментарии 143

Генерация ответов с расширенным поиском в техподдержке на основе YandexGPT, ChatGPT

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

Статья посвящена рассмотрению процесса создания системы генерации ответов службы технической поддержки. Для этого используется методика с расширенным поиском, известная как Retrieval-Augmented Generation (RAG). Процесс основан на использовании шаблонов и реальных вопросов-ответов техподдержки. В качестве основных инструментов применяются YandexGPT / ChatGPT и ChromaDB.

Читать далее
Всего голосов 2: ↑2 и ↓0 +2
Комментарии 2

Мой вам подарок к Новому году или как наконец запустил то, что надо было давно запустить…

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

КДПВ


Немножко истории


Начну с истории вопроса.


Очень давно я написал Fresh IDE – навороченнoe IDE для программирования на ассемблере, а точнее на FlatAssembler.


Fresh IDE долгие годы меня полностью устраивал, поэтому я с перерывами выпустил 2 главные версии и начал просто его использовать, время от времени внося какие-то исправления и изредка новые функции.


Когда перешел полностью на Linux, оказалось, что Fresh IDE прекрасно работает под WINE, и я продолжил им пользоваться без угрызений совести. В процессе даже удалось исправить несколько багов WINE (вот, вот и вот).


Как бы то ни было, но я начал писать библиотеку для переносимости ассемблерных программ между Linux и Windows (и KolibriOS). Одновременно с этим задумался и над тем, чтобы сделать Fresh IDE переносимым. Из-за архитектуры библиотеки, огромная часть кода уже и так была переносимой. А точнее все, что не касалось GUI. К сожалению, GUI был полностью написан на Win32 API и его нельзя просто так перенести на другие платформы.


Поэтому и пришлось начинать все сначала. И третья версия Fresh IDE писалась почти с нуля.

Читать дальше →
Всего голосов 237: ↑237 и ↓0 +237
Комментарии 91

11lc — инновационный компилятор для нового языка программирования

Время на прочтение 22 мин
Количество просмотров 16K
Данная статья посвящена находящемуся на стадии проектирования компилятору 11lc. В ней перечисляются наиболее яркие особенности этого компилятора.

Отсутствие скрытой неэффективности


Это свойство скорее языка программирования 11l, нежели компилятора. Однако оно настолько важно и настолько отличает язык 11l от C++, D или даже Nim, что я решил разобрать его подробно в данной статье.

Уолтер Брайт, создатель языка D, писал:
Templates in C++ have evolved from little more than token substitution into a programming language in itself. Many useful aspects of C++ templates have been discovered rather than designed.

Так вот, как я считаю, нечто похожее произошло и с семантикой перемещения (move semantics). И в C++ и в D она появилась достаточно поздно, и если бы эти языки проектировались с опорой на семантику перемещения изначально, то в них было бы гораздо меньше скрытой неэффективности (hidden inefficiency). О чём идёт речь? Рассмотрю это на примере C++.
Читать дальше →
Всего голосов 38: ↑36 и ↓2 +34
Комментарии 51

Чтение Micro QR Code версии М3 (байтовый режим)

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

Задание: необходимо прочитать Micro QR Code версии М3, содержащий кодовое слово, на примере закодированных слов – Hello, Knowledge и KaDaBrAOK, на основе алгоритма, приведенного в ГОСТ Р ИСО/МЭК 18004-2015 (п. 7.4.5). Аналогично версии М2 данный режим невозможно прочитать стандартными ресурсами мобильных устройств, производимых GAFAM (как оказалось, свободно распространяемые библиотеки страшно глючат, поэтому Ассоциация отказалась и от этого режима)

Читать далее
Всего голосов 3: ↑3 и ↓0 +3
Комментарии 2

Чтение Micro QR Code версии М3 (алфавитно-цифровой режим)

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

Задание: необходимо прочитать Micro QR Code версии М3, содержащий кодовое слово, состоящее из символов верхнего регистра (на примере закодированных слов – SAFEBOX, Q1W2E3R4T5Y6U и EFB QWG WIFI 7; почему выбрано именно такое количество символов будет также расшифровано) на основе алгоритма, приведенного в ГОСТ Р ИСО/МЭК 18004-2015 (п. 7.4.4). Аналогично версии М2 данный режим невозможно прочитать стандартными ресурсами мобильных устройств, производимых GAFAM (как оказалось, свободно распространяемые библиотеки страшно глючат, поэтому Ассоциация отказалась и от этого режима).

Читать далее
Всего голосов 5: ↑5 и ↓0 +5
Комментарии 0

Размышления о структурном программировании

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


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


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


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

Читать дальше →
Всего голосов 47: ↑40 и ↓7 +33
Комментарии 70

Чтение Micro QR Code версии М3 (числовой режим)

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

Задание: необходимо прочитать Micro QR Code версии М3, содержащий кодовое слово, состоящее из цифр (на примере – 777777777777777777 (18 цифр) и максимальном кодовом расстоянии (23 цифры) – 77777777777777777777777; почему выбрано именно такое количество цифр будет также расшифровано) на основе алгоритма, приведенного в ГОСТ Р ИСО/МЭК 18004-2015 (п. 7.4.3, пример 2). Аналогично версии М2 данный режим невозможно прочитать стандартными ресурсами мобильных устройств, производимых GAFAM (как оказалось, свободно распространяемые библиотеки страшно глючат, поэтому Ассоциация отказалась и от этого режима)

Читать далее
Всего голосов 4: ↑4 и ↓0 +4
Комментарии 0

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

Создание простого и работоспособного генетического алгоритма для нейросети с Python и NumPy

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

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

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

Вначале нам потребуется импортировать модули.

Читать далее
Всего голосов 6: ↑3 и ↓3 0
Комментарии 4

Управление памятью и разделяемыми ресурсами без ошибок

Уровень сложности Сложный
Время на прочтение 7 мин
Количество просмотров 2.6K


Мельком пробежал статью Синхронизация операций в .NET на примерах / Хабр, после чего захотелось поделиться с пользователями Хабра некоторыми мыслями насчет синхронизации доступа к объектам в различных языках программирования.


Если честно, то большая часть моей статьи уже давно лежала в черновиках, но все не доходили руки её доработать, а тут такой хороший повод поделиться своими размышлениями на эту тему, оставалось просто дописать эту вводную часть :-)

Читать дальше →
Всего голосов 4: ↑3 и ↓1 +2
Комментарии 11

Паттерн Unit of Work в разрезе чистой архитектуры DDD на языке Golang

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

Всем привет! Недавно мне выпала возможность разработать шаблон сервиса, который можно было бы использовать как для монолитной, так и для микро‑сервисной архитектуры. Шаблон должен был придерживаться принципов Domain‑Driven Design (DDD). В этом процессе, я столкнулся с двумя интересными проблемами:

Проблема 1: Сложности обеспечения транзакционности базы данных

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

Проблема 2: Нарушение изолированности слоя

В попытке решить первую проблему, некоторые разработчики переносят работу с транзакциями на уровень слоя приложения, чтобы избежать прямой зависимости от базы данных. Однако, такой подход, несмотря на его обоснование, может нарушить изолированность слоев и противоречить принципам DDD и чистой архитектуры. Это, в конечном итоге, затрудняет поддержку приложения и усложняет его масштабирование.
Эти две проблемы стали отправной точкой для исследования применения паттерна Unit of Work и его роли в обеспечении надежности и консистентности данных в контексте Golang и DDD.

В статье я расскажу о своем подходе к решению этих задач.

Читать далее
Всего голосов 7: ↑5 и ↓2 +3
Комментарии 6

Синхронизация операций в .NET на примерах

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

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

При параллельной работе с каким-то ресурсом, нам нужно синхронизировать доступ к нему, чтобы не попасть в состояние годнки или банально не перегрузить его. Для этого в .NET существуют следующие вещи:

Читать далее
Всего голосов 13: ↑9 и ↓4 +5
Комментарии 21

Быстрый парсинг 8-битных целых чисел

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

Допустим, вам нужно быстро распарсить 8-битные целые числа (0, 1, 2, …, 254, 255) из строки ASCII/UTF-8. Задача взята из проекта simdzone под руководством Йероена Коеккоека (NLnet Labs). Дана строка и её длина: например, ’22’ и длина 2. Наивное решение на C может выглядеть так:

Читать далее
Всего голосов 27: ↑27 и ↓0 +27
Комментарии 21

Rust 1.75.0: API адресной арифметики, async fn и impl Trait в трейтах, уcкорение rustc

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

Команда Rust рада сообщить о новой версии языка — 1.75.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.


Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.75.0 вам достаточно выполнить команду:


rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.


Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (rustup default beta) или nightly (rustup default nightly). Пожалуйста, сообщайте обо всех встреченных вами ошибках.

Читать дальше →
Всего голосов 17: ↑16 и ↓1 +15
Комментарии 1

Параллельные вычисления — Все дело в контексте-синхронизации (SynchronizationContext)

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

Чтобы до конца разобраться с содержанием Поста: How Async/Await Really Works in C#, который мы начали анализировать в предыдущей статье, неплохо бы познакомиться с изначальным определением концепции SynchronizationContext, на которую ссылается автор этого поста, без которой, по мнению того же автора, нельзя понять реализацию Async/Await.

Это перевод Поста: Parallel Computing - It's All About the SynchronizationContext

Читать далее
Всего голосов 7: ↑7 и ↓0 +7
Комментарии 21

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