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

Совершенный код *

Как Макконнелл завещал

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

Генеративная графика — не только ИИ

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

Привет, Хабр! В прошлый раз мы с вами создавали «Игру жизни» на Godot. Движок показал себя отлично, но для такой простой задачи это всё равно что забивать микроскопом гвозди. Особенно когда речь идёт о веб‑экспорте.

В последнее время стоит заикнуться про генерацию изображений, как все сразу вспоминают про нейросети. Stable Diffusion, Midjourney и прочие модели впечатляют, не спорю. Но давайте взглянем на другую сторону генеративного искусства. Ту, где картинки создаются не гигабайтами весов нейронной сети, а несколькими килобайтами JavaScript-кода.

И кстати раз уж речь зашла про красоту в коде: мы как раз запустили «Конкурс красоты кода 2.0». Самое время показать, что даже простые алгоритмы могут создавать нечто впечатляющее. Именно такие работы, где за внешней простотой скрывается математическая элегантность, часто оказываются самыми интересными.

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

Новости

Философия чистого кода: эмпатия гораздо важнее мастерства

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

«Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям», — сказал культовый британский разработчик программного обеспечения Мартин Фаулер и в этом утверждении присутствует доля правды. То есть, когда разработчик пишет код, он должен фокусироваться не только на том, чтобы тот был рабочим, но и понятным будущим «читателям».

Кстати, сейчас у нас проходит «Конкурс красоты кода». Регистрируйтесь и покажите, как должен выглядеть по‑настоящему чистый код — лаконичный, эффективный и понятный. 

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

К чистому коду через рефакторинг

Время на прочтение13 мин
Количество просмотров4.9K
Чистые функции — это такие методы, при выполнении которых не возникает побочных эффектов. В функциональном программировании чистые функции — скорее правило, чем исключение. Но в большинстве объектно-ориентированных языков с ними приходится сталкиваться нечасто, или, как минимум, они редко считаются предпочтительным вариантом. В дотнет-среде серьёзный акцент делается на внедрении зависимостей и более-менее обширных абстракциях, использующих интерфейсы.

В данной статье будет продемонстрировано, как перейти от базы кода, характеризующейся значительной опосредованностью такого рода, к более простой версии, из которой большей частью удалена избыточная сложность.
Читать дальше →
Всего голосов 8: ↑5 и ↓3+6
Комментарии1

Красивый код — живой код. Делаем клеточный автомат на Godot и экспортируем в HTML

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

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

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

Истории

PPSSPP или всё же psp? Смотрим баги в коде из будущего

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

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

Читать далее
Всего голосов 13: ↑12 и ↓1+14
Комментарии10

Этическая идентичность программистов: как навигация в мире эко-программирования в условиях технологического прогресса

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

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

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

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

Читать далее
Всего голосов 18: ↑3 и ↓15-9
Комментарии25

Чистый код: Начало

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

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

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

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

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

Писать код для компьютеров сложно, ещё сложнее — писать код для людей

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

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

А теперь немного усложним задачу. Будем писать код для людей!

Объясню, что я имею в виду: я говорю о коде, с которым смогут взаимодействовать другие люди. В частности, я имею в виду искусство создания удобных фреймворков, библиотек, API, SDK, DSL, встроенных DSL или даже языков программирования.

Писать такой код гораздо сложнее, потому что ты не только говоришь компьютеру, что делать, но и вступаешь в борьбу с ментальной моделью твоего кода в глазах другого пользователя. Это в равной степени computer science и психология мышления. Как сделать так, чтобы этот человек понял твой код?

Ричард Фейнман как-то сказал: «Представьте, насколько сложнее была бы физика, если бы электроны имели чувства». Он говорил это в другом контексте, но мне кажется, это частично описывает и программирование для людей. У человека, интерпретирующего твой код, есть чувства!

Давайте поговорим о том, как упростить ему задачу.
Читать дальше →
Всего голосов 43: ↑40 и ↓3+57
Комментарии6

Как устранить первопричину уязвимостей безопасности памяти

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

Уязвимости безопасности памяти остаются серьёзной угрозой для защиты ПО. Мы, работники Google, считаем, что путь к крупномасштабному устранению этого класса уязвимостей и к защищённому ПО заключается в Safe Coding — подходе secure-by-design, отдающем приоритет переходу на безопасные по памяти языки.

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

Также мы приведём обновлённую статистику того, как благодаря переходу на безопасные по памяти языки, процент уязвимостей безопасности памяти в Android упал за шесть лет с 76% до 24%.
Читать дальше →
Всего голосов 26: ↑26 и ↓0+40
Комментарии3

Чистый код: Аргументы командной строки

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

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

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

Разработку модуля начнем с определения цели, очень тривиально, но правильно поставленная цель, значительно упрощает реализацию. Основной целью модуля будет создание инструмента удобного для пользователя. Легко добавлять, изменять значения аргументов, легко перебирать значения.

Опишем функционал модуля.

Читать далее
Всего голосов 10: ↑1 и ↓9-6
Комментарии3

Чистый код: инверсия зависимостей (DIP)

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

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

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

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

Конструкторы разделили светильник на части, в программировании они называются модулями. Каждую из этих частей снабдили интерфейсами. Для лампы сделали интерфейс — патрон. Для плафона интерфейс — держатели и так далее. Теперь есть возможность извлечь лампу и заменить ее на другую, если у этих ламп интерфейсы совместимые. А что если светильник не разборный. Нам придется его разрушить, или выкинуть и купить новый.

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

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

Деконструкция монолита: Максимально производительный подход к проектированию программ

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

Как и почему компания Shopify перешла от монолитной архитектуры к модульно-монолитной.


image

У компании Shopify одна из крупнейших баз кода на Ruby on Rails. Над ней трудились более десяти лет свыше тысячи разработчиков. Она включает множество разнообразных функций, например, выставление счетов продавцам, управление сторонними приложениями, обновление информации о товарах, обработка доставки и так далее.

Изначально система была построена как монолит, то есть все эти разные функциональные возможности были встроены в одну кодовую базу без каких-либо разграничений между ними. В течение многих лет эта архитектура работала нормально, но в конце концов мы достигли точки, когда недостатки монолита перевесили преимущества. Нам предстояло сделать выбор, как действовать дальше.
Читать дальше →
Всего голосов 12: ↑12 и ↓0+19
Комментарии4

Чистый код — дар или проклятие? Акт II. Компромисс

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

Что важнее — производительность или гибкость кода? Стоит ли отказаться от философии чистого кода ради перфоманса? Отвечаем на эти и многие другие вопросы вместе с командой разработчиков PVS-Studio.

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

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

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань

Почему я предпочитаю исключения, а не значения ошибок

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

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

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

Давайте рассмотрим пример, в котором применено защищённое от ошибок целочисленное деление:

int safeDiv(int a, int b) {
   if (b == 0)
      throw Div0(); // Исключения передаются особым образом
   return a / b; // Теперь-то всё абсолютно безопасно, ведь так?
}

Новые языки программирования склонны применять сообщения об ошибках в функциональном стиле и кодировать ошибки в возвращаемый тип. Например, Go кодирует ошибку в возвращаемый тип при помощи кортежа (res, err), а Rust возвращает Result<T, E> — тип-сумму результата и ошибки.
Читать дальше →
Всего голосов 65: ↑57 и ↓8+67
Комментарии214

Чистый код: Принцип разделения интерфейса (ISP)

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

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

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

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

Прежде чем создавать свой пример, давайте рассмотрим пару участков кода из интернета. Из кода удалены приватные части классов, а так же конструкторы и параметры методов. Исключительно для экономии места.

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

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

Функциональные опции в Go

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

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

Читать далее
Всего голосов 20: ↑19 и ↓1+19
Комментарии45

Проект «Статистика дрифта». Часть 2. Базовые сущности

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

Первая часть серии - Проект «Статистика дрифта». Часть 1. Настройка
Паблик во ВКонтакте с новыми сериями без задержек выпуска на habr - Пихта DEV

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

Чистый код: Принцип подстановки Барбары Лисков (LSP)

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

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

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

Рассмотрим тонкости соблюдения этого принципа, на довольно сложном примере. Начнем с класса хранения данных.

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

Проект «Статистика дрифта». Часть 1. Настройка

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

Разработка PHP/VueJS пет-проекта "Статистика дрифта" в формате лайф-тайм блога.
Первая часть лфай-тайм блога написана про базовую настройку будущего приложения.

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

Грепабельность — важная метрика кода

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

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

Читать далее
Всего голосов 35: ↑32 и ↓3+42
Комментарии31
1
23 ...

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