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

Code smells — обзор на примере PHP

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

Hola, Amigos! Меня зовут Евгений Шмулевский, я PHP-разработчик в агентстве заказной разработки Amiga. В этой статье хотелось бы рассмотреть вопрос качества кода и что из рекомендаций по нему лично для себя использую. Статья адресована начинающим разработчикам.

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

Какую статью хочется прочитать в нашем блоге на тему C++, C# или Java?

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

Какую статью хочется прочитать


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


На данный момент контент нашего блога можно разделить на 4 основные категории:


  1. Теоретические статьи;
  2. Информационно-развлекательные статьи;
  3. Проверка открытых проектов;
  4. Всё остальное.
Читать дальше →
Всего голосов 9: ↑8 и ↓1+7
Комментарии12

Немного о гигиене Java кода

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

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

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

Современный С++ в разработке девайсов

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

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

Меня зовут Андрей Белобров. Я тимлид одной из команд, разрабатывающих приложения для умных девайсов Сбера.

На прошедшей недавно конференции Салют, OS DevConf! я выступил с докладом, в котором рассказал, как мы с командой разрабатываем приложения на С++ для умных устройств с виртуальным ассистентом. А также о том, как инструменты статического и динамического анализа помогают поддерживать единый стиль и высокое качество кода в проекте.

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

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

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

Читать далее
Всего голосов 28: ↑25 и ↓3+22
Комментарии36

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

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

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

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

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

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

Почему же мы этого не делаем?
Читать дальше →
Всего голосов 81: ↑73 и ↓8+65
Комментарии172

Бестолковые тесты versus качественное ПО. Часть 1. Бестолковые тесты

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

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


Несложно построить тест, обеспечивающий 100% покрытие, но при этом ничего не проверяющий и не гарантирующий. (См., например).


Проблемы юнит-тестов уже затрагивались на Хабре ранее:



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

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

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 1. Определяемся с качеством

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

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

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

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 2. «Распрямляем» код

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

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и как подходить к вопросу тестирования с системной точки зрения.


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

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

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 3. Ошибки

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

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и предложили "распрямлять" код.


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

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

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 4. Эквивалентность функций

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

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и предложили "распрямлять" код. Рассмотрели классификацию ошибок.


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

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

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 5. Применимость юнит-тестов

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

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и предложили "распрямлять" код и выводить программы из требований. Рассмотрели классификацию ошибок.


Видя необоснованные надежды, возлагаемые на юнит-тесты, хотелось бы понять, что в действительности можно ожидать от тестов.

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

Бестолковые тесты versus качественное ПО. Часть 3. Что получится?

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

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и предложили "распрямлять" код и выводить программы из требований. Рассмотрели классификацию ошибок. Рассмотрели те задачи, в которых тесты хорошо себя проявляют.


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

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

Распространённые паттерны опечаток при программировании

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

Распространённые паттерны опечаток при программировании


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


На чём основаны наблюдения


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


Рассматривая все эти ошибки, я постепенно замечаю различные повторяющиеся паттерны опечаток. За редким исключением они не зависят от языка программирования. По крайней мере, они одновременно свойственны коду, написанному на C, C++, C#, Java. В этой статье я опишу 7 паттернов, которые заметил к настоящему моменту:


  1. Эффект последней строки.
  2. Злополучная функция memset.
  3. Неверные функции сравнения.
  4. Неверные функции копирования.
  5. Ошибки работы с датами и временем.
  6. Несчастливые числа: 0, 1, 2.
  7. Ошибка на единицу (off-by-one error).

Заметность закономерностей в ошибках свидетельствует о том, что они крайне распространены. Полезно знать о них, чтобы избегать написания потенциально опасного кода или более эффективно находить их в процессе обзоров кода. Другим словами, вы узнаете, какой код притягивает ошибки, и будете более внимательно его проверять. Конечно, PVS-Studio способен выявить многие подобные ошибки, но не все. Поэтому дополнительное внимание не повредит.

Читать дальше →
Всего голосов 42: ↑41 и ↓1+40
Комментарии23

PVS-Studio vs CodeLite: битва за идеальный код

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

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

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

Функциональное программирование в Python: ежедневные рецепты

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

В своей команде — команде разработки инструментов для разработчиков под KasperskyOS — мы создаем разные интересные консольные утилиты, эмулятор, обеспечиваем интеграцию с IDE и так далее. И для этого мы используем разные языки — C++, C, TypeScript; но больше всего пишем на Python.



В этой статье, которая написана по следам моего выступления на конференции PiterPy, я обращаюсь к практикующим разработчикам — расскажу о том, какие функциональные приемы можно использовать в этом языке. Сконцентрируюсь на практике — на тех примерах, которые можно использовать уже буквально сейчас, не переписывая свой проект.
Читать дальше →
Всего голосов 16: ↑16 и ↓0+16
Комментарии3

Svace: фича-реквесты для отечественного статического анализатора

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

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

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

Вот наша история использования Svace в 2022 году.

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

Призыв писать компактное ПО, версия 2024 года (с примером кода)

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

Этот пост посвящён памяти Никлауса Вирта, первопроходца в сфере вычислительных наук, ушедшего от нас 1 января этого года. В 1995 году он написал важную статью A Plea for Lean Software, и в своём посте я постараюсь воспроизвести её почти тридцать лет спустя, с учётом современных кошмаров разработки ПО.

Очень короткая версия поста: современные способы разработки/сборки ПО смехотворны, они приводят к созданию пакетов на 350 МБ для рисования графиков, а простые продукты импортируют 1600 зависимостей неизвестного происхождения. Уровень безопасности ПО ужасен, ведь он зависит и от качества кода, и от его объёма. Многие из нас понимают, что ситуация нерациональна. К сожалению, многие программисты (и их руководство) никогда не работали как-то иначе. А остальным редко выделяют время, чтобы выполнять работу качественно.

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

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

Читать далее
Всего голосов 150: ↑147 и ↓3+144
Комментарии197

Где-то в дороге мы забыли о мастерстве программирования

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

«Поставляй!»

«Мы теперь Agile, детка. Двигайся быстро и ломай вещи!»

«Мы оцениваем наших инженеров по тому влиянию, которое они оказывают!»

Где‑то по пути, в разгар agilification программного обеспечения или золотой лихорадки зарплат инженеров‑программистов, мы забыли о мастерстве.

Читать далее
Всего голосов 39: ↑33 и ↓6+27
Комментарии70

Почему проверять результат вызова malloc c помощью assert плохая идея

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

malloc и assert


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

Читать дальше →
Всего голосов 29: ↑25 и ↓4+21
Комментарии117

Я уже 14 лет в отрасли, но программировать по-прежнему сложно

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

Много лет назад, учась computer science на старших курсах, я долго изучал различные вакансии онлайн, надеясь найти подходящую должность стажёра-программиста.

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

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

Время летело, не успел моргнуть глазом, как прошло больше десятка лет. Сегодня я с гордостью могу сказать, что работаю программистом уже 14 лет. Спустя годы боёв на фронтах разработки ПО я осознал, что многие её аспекты сильно отличаются от того, что я представлял на старших курсах, а именно:

С опытом программирование не становится намного проще, о «проще пареной репы» можно только мечтать.

Написание кода для множества «больших проектов» — это не только неинтересное, но и опасное занятие, гораздо менее увлекательное, чем решение алгоритмических задач в LeetCode.

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

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

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