Обновить
157.71

Качество кода *

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

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

Code review — улучшаем процесс

Время на прочтение7 мин
Охват и читатели18K
image

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

Как этого можно избежать?
Читать дальше →

Сканирующее окно по массивам NumPy

Время на прочтение9 мин
Охват и читатели24K

CoLab блокнот с примерами.


Возможно сделать скользящее окно (rolling window, sliding window, moving window) по массивам NumPy на языке программирования Python без явных циклов. В данной статье рассматривается создание одно-, двух-, трех- и N-мерных скользящих окон по массивам NumPy. В результате скорость обработки данных увеличивается в несколько тысяч раз и сравнима по скорости с языком программирования С.


Cкользящее окно применяется в: обработке изображений, искусственных нейронных сетях, интернет протоколе TCP, обработке геномных данных, прогнозировании временных рядов и т.д.


Отказ от ответственности: в исходном коде могут быть ошибки! Если вы видите ошибку, пожалуйста, напишите мне.


Читать дальше →

Добавляем статические файлы вне проекта ангуляр

Время на прочтение2 мин
Охват и читатели9.2K

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



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

Читать дальше →

Расшифровка моего интервью с автором Ruby

Время на прочтение7 мин
Охват и читатели7.9K

Во время осенней конференции Ruby Russia я, на правах организатора, поймал в кулуарах автора Ruby и устроил ему часовой допрос интервью. Вопросы старался выбирать незаезженные, чтобы ответы были нам полезны, а не “за все хорошее против всего плохого”. И дедушка таки смог меня, старого плюсового разработчика, удивить! Под катом — расшифровка интервью, нетривиальное мнение Юкихиро Мацумото про типы вообще и руби в частности, а также возможность все это обсудить в комментах. На связи я с руби-командой Evrone наперевес. Мацумото мы приглашаем в Москву регулярно, есть возможность заранее придумать интересные вопросы для будущих интервью.

Чему я научился, пока работал над своим первым масштабным проектом

Время на прочтение6 мин
Охват и читатели4.2K
Восемь месяцев назад я начал писать приложение на Electron. Чтобы осилить эту задачу, мне пришлось разработать три отдельных суб-приложения, которые запускаются в разных средах. Ниже я расскажу о том, что вынес для себя по ходу дела.



Binder в исходном виде

Контекст


Прежде чем углубляться в подробности, начну с того, что приведу некоторые общие сведения, необходимые для понимания ситуации. В начале 2019 года я стал искать, где бы пройти интернатуру, как того требовала программа co-op для моей степени. К апрелю я разослал несколько десятков резюме, причем каждое было подогнано под конкретного работодателя, и в общей сложности получил ровно ноль ответов. Можете себе представить, как я на это отреагировал – у меня опустились руки, казалось, что я ни на что не гожусь и не стою вообще никакой работы. Но вместо того, чтобы дать этим чувствам одержать верх, я решил доказать самому себе, что кое-что все-таки знаю и на какие-то должности могу претендовать. В конечном итоге, я выяснил, что на деле знаю меньше, чем предполагал.
Читать дальше →

Как сократить накладные расходы при обработке исключений в С++

Время на прочтение8 мин
Охват и читатели6.6K


Обработка ошибок времени выполнения (runtime error) очень важна во многих ситуациях, с которыми мы сталкиваемся при разработке софта — от некорректного пользовательского ввода, до поврежденных сетевых пакетов. Приложение не должно падать, если пользователь вдруг загрузил PNG вместо PDF, или отключил сетевой кабель при обновлении ПО. Пользователь рассчитывает, что программа будет работать, чтобы ни случилось и, либо обрабатывать внештатные ситуации в фоновом режиме, либо предлагать ему выбрать вариант решения проблемы посредством сообщения, отправленного через дружественный интерфейс.

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

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

Валидация данных: другой подход

Время на прочтение5 мин
Охват и читатели9K
Проверка данных в приложении введённых пользователем или полученных другим путём в классическом понимании подразумевает использование всего лишь двух выражений в коде: TRUE и FALSE. В другом варианте используют исключения которые явно не предназначены для этого. Есть ли вариант получше?
Читать дальше →

Чистое зло Python

Время на прочтение7 мин
Охват и читатели32K

Темные силы не дремлют. Они пробираются в дивное королевство Python и используют черную магию, чтобы осквернить главную реликвию — чистый код. Однако опасны не только злые чары.


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



Читать дальше →

PHP Code Style Conventions

Время на прочтение6 мин
Охват и читатели43K

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

Читать дальше →

Нет, динамические системы типов по своей сути не более открыты

Время на прочтение19 мин
Охват и читатели26K

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


Читать дальше →

Когда код становится legacy и как с ним жить

Время на прочтение17 мин
Охват и читатели20K
Много лет назад, я пришел в один legacy-проект, который разрабатывал Владимир Филонов (pyhoster). Так я и познакомился с одним из организаторов MoscowPython, любителем копаться во внутренностях библиотек, а потом рассказывать об этом. Иронично, что теперь он собирается рассказывать, как выжить, если вам достался legacy. Это еще раз доказывает, что legacy порождают даже те, кто потом учит, как с этим жить. Мне очень хочется расспросить Владимира о том, что такое legacy, как им поменьше зарастать, как бороться, когда уже по уши в legacy, а когда всё бросать и писать заново (спойлер: никогда).

Но сперва посмотрите ролик, чтобы прочувствовать всю боль погружения в legacy…

Почему translit в именовании это плохо и другие интересные особенности нашего восприятия кода

Время на прочтение7 мин
Охват и читатели16K
image

Есть неожиданно много людей, считающих, что писать код можно как угодно, а все эти правила и рекомендации просто занудство. Что же, у каждого каждого человека есть право на своё мнение.

Однако, код написаный таким образом читать, почему-то, большинство людей отказывается.

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

Код это тоже текст. И написать его можно так, что чтение станет крайне неприятным и энергозатратным занятием. Если вам вдруг во время работы с особенно ужасными фрагментами корпоративного портала хочется закрыть редактор и посмотреть котиков, то дело, скорее всего, не в том, что вам лень или внезапно случилось то самое выгорание. Всё дело в том, что именно вы читаете.
Читать дальше →

Как перестать растрачивать время разработчиков на технический долг

Время на прочтение5 мин
Охват и читатели10K


Вы знаете, каково это. Впихнуть всё необходимое в спринт и так весьма непросто, а ведь ещё нужно где-то найти дополнительные 10–20% времени разработчиков на возврат технического долга. Если вы когда-либо отстаивали необходимость выкраивания времени на это, то вы знаете, что это походит на крестовый поход эпических масштабов.


Но сделать это можно, и в этом руководстве мы выясним, как именно.

Читать дальше →

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

Чистые тесты на PHP и PHPUnit

Время на прочтение11 мин
Охват и читатели36K

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

Тесты — это особая разновидность документации. Как я ранее писал о TDD на PHP, тест всегда будет (или хотя бы должен) ясно говорить о том, в чём заключается задача конкретной части кода.

Если один тест не может выразить эту идею, то тест плохой.

Я подготовил набор методик, которые станут подспорьем для PHP-разработчиков в написании хороших, удобочитаемых и полезных тестов.
Читать дальше →

«Чистый код» Роберт Мартин. Конспект. Как писать понятный и красивый код?

Время на прочтение9 мин
Охват и читатели85K
Я решил написать конспект книги, которая всем известна, а сам автор называет ее «Школой учителей Чистого кода». Пристальный взгляд Мартина как бы говорит:

«Я тебя насквозь вижу. Ты опять не следуешь принципам чистого кода?»

image
Читать дальше →

Прощай, чистый код

Время на прочтение6 мин
Охват и читатели67K


Был поздний вечер.

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

Код работал.

Но в нём было много повторяющихся однотипных конструкций. Каждая фигура (вроде того же прямоугольника или овала) обладала различным набором маркеров. Перемещение этих маркеров в разных направлениях по-разному влияло на позицию и размер фигуры. А если пользователь, двигая маркеры, удерживал нажатой клавишу Shift, нам, кроме того, надо было сохранять пропорции фигуры при изменении её размера. В общем — в коде было много вычислений.
Читать дальше →

Недочёты, часто встречающиеся в программировании, которых стоит избегать

Время на прочтение4 мин
Охват и читатели25K
Люди, по своей природе, склонны к совершению ошибок. Однако множества недочётов, характерных для разработчиков, можно избежать. Если программист способен избавиться от распространённых оплошностей, о которых речь пойдёт в этом материале, он сможет писать более качественный и чистый код.



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

Вот некоторые распространённые недочёты, которых стоит избегать программисту.
Читать дальше →

Публикация кода VVVVVV показала, насколько грубо устроены игры внутри

Время на прочтение4 мин
Охват и читатели56K
image

На прошлой неделе создатель Dicey Dungeons Терри Кавана отпраздновал десятую годовщину своей давней игры VVVVVV, by опубликовав её исходный код [перевод на Хабре]. Если объяснять просто, то это значит, что любой человек может теперь посмотреть, как создавалась игра, потому что каждую строку кода можно внимательно изучить.

Такое нечасто случается и поэтому ценность публикации этой информации очень велика. Люди могут учиться по ней или улучшать код. Некоторые отзывы на исходный код VVVVVV были ужасными — исследователи увидели вещи, которые можно было написать лучше. Возможно, Кавана предвидел это — в своём посте, где он объявил о публикации кода, Терри признаёт, что «технически игра VVVVVV не очень хорошо продумана! Даже по стандартам инди-разработчиков-самоучек, код довольно хаотичен».

Существует заблуждение, что написание кода само по себе является изящным и продуманным, ведь в конечном итоге, это своего рода написание логики, не так ли? Не зря ведь это называется компьютерными НАУКАМИ? Но в реальности всё гораздо сложнее. Очень часто истории разработки видеоигр показывают, что поскольку в играх есть так много элементов, от геймдизайна до звука, что часто собираются в единое целое только в последний момент, если вообще когда-нибудь собираются.

Гибридные сортировки

Время на прочтение9 мин
Охват и читатели17K


Как все уже знают, в основу сортировки могут быть положены обмены, вставки, выбор, слияние и распределение.

Но если в алгоритме комбинируются разные методы, то тогда он относится к классу гибридных сортировок.
Читать дальше →

Статическая типизация не обязательно требует церемоний

Время на прочтение5 мин
Охват и читатели20K

Примечание переводчика: в текущий момент я подготавливаю материалы для обещанной статьи по монадам. К сожалению, это занимает довольно много времени, не говоря о том, что я всё же должен заниматься основной работой и уделять время семье, но процесс идёт. А пока представляю вам перевод небольшой свежей заметки от замечательного товарища Mark Seemann'а, которая мне показалась любопытной.


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


Церемонность


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


Церемония — это то, что вы делаете до того, как начнете делать то, что вы действительно собирались сделать.

Venkat Subramaniam

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


Это привело меня к мысли о том, что существует злосчастная Зона Церемонности:



Конечно же, эта диаграмма всего лишь упрощение, но я надеюсь, что она демонстрирует суть. C++, Java и C♯ — языки, которые требуют церемонности. Справа от них находятся языки, которые мы могли бы назвать транс-церемониальными, включая F♯ и Haskell.

Читать дальше →