Обновить
128K+

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

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

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

Holy C++

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

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

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

1 - union - сумм тип из 70х, в С идея хранения одного типа из нескольких в одном участке памяти выглядит неплохо и сейчас, ведь там все типы это набор байт с заданным размером.

В С++ же использование union это автоматическое undefined behavior, например:

Читать далее!

Инспекция кода: заводим врагов

Время на прочтение4 мин
Охват и читатели2.8K
Бывает такое, что коллеги на работе вас раздражают и вызывают чувство, что надо бы как-то с ними расквитаться, отплатить за все те воображаемые обиды, которые они вам нанесли. Многим не представляется такой возможности. Однако если вы с ними – разработчики, то всегда есть верный способ. И этот способ – инспекция кода.

Когда всё делается правильно, инспекция кода – отличный инструмент для улучшения качества кода и распространения базовых знаний внутри команды. Но если делать всё неправильно, она может отравить человеку существование. Так что это отличный полигон для отмщения через пассивную агрессию. У коллеги всё слишком хорошо получается? Или он вечно выливает себе остатки кофе, а новый не заваривает? Или как-то раз три гола назад не поздоровался с вами, потому что не заметил, что вы в офисе? Пришло время отплатить за всё сполна при помощи инспекции кода!
Читать дальше →

Модульное тестирование унаследованного кода

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

Если вы уже устали читать статьи о том, как применять модульное тестирование в новых приложениях, в то время как ваша жизнь в основном занята расширением и улучшением унаследованного кода – изложу вам план, который (наконец-то) поможет воспользоваться возможностями автоматизированного тестирования при работе с имеющимися приложениями. Это проще, чем кажется, особенно, если вы переложите на Visual Studio и JustMock всю тяжелую работу.

Люблю читать статьи о том, как приступить к автоматизированному модульному тестированию, потому что они полностью оторваны от реальности. Во всех таких статьях предполагается, что вы выстраиваете некое свежее приложение с чистого листа, но такого – будем честны – практически не бывает. Все мы знаем, что от 70% до 90% времени разработчика тратится на улучшение, расширение, модификацию и (иногда) исправление приложений, которые уже работают в продакшене. А я еще я добавлю, что никто не захочет вам платить за обвязку модульными тестами таких «уже существующих/унаследованных» приложений.

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

Читать далее

Добавляйте единицы измерения в имена

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

Есть одна ловушка читаемости кода, которой легко избежать, если вы о ней знаете; тем не менее она встречается постоянно: это отсутствующие единицы измерения. Рассмотрим три фрагмента кода на Python, Java и Haskell:

time.sleep(300)

Thread.sleep(300)

threadDelay 300

Сколько «спят» эти программы? Программа на Python выполняет задержку на пять минут, программа на Java — на 0,3 секунды, а программа на Haskell — на 0,3 миллисекунды.

Как это можно понять из кода? А никак. Вам просто нужно знать, что аргументом time.sleep являются секунды, а threadDelay — микросекунды. Если вы часто ищете эту информацию, то рано или поздно её запомните, но как сохранить читаемость кода для людей, никогда не встречавшихся с time.sleep?
Читать дальше →

Объектно-ориентированный антипаттерн

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

Довольно часто у студентов, изучающих C++ в определённых учебных кругах, складывается мировоззрение о том, что всё должно быть объектами. Попросите их написать программу, которая считает некоторое значение - и они начнут с создания объекта ValueComputer и метода vc.computeResult().

Например: дана задача с помощью динамического программирования посчитать количество способов замостить костяшками домино прямоугольник w \times h. Студент пишет:

Читать далее

Контроль переполнения. Как уменьшить длину, увеличивая путь

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

Я уже упоминал, каким неприятным сюрпризом оказалось исключение команды INTO из системы команд x86-64, когда я переводил компилятор на эти команды. Давайте разберемся, нужна ли сейчас команда, которая отвечала за контроль целочисленного переполнения еще со времен процессора 8086.

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

Читать далее

Как помочь компилятору повысить быстродействие вашей программы

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

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

Под катом старший разработчик ПО компании Google, Minhaz A V*, рассказывает об оптимизации производительности кода. Менее чем за час работы автор ускорил код на 18%, добавив в него всего пару строк. Несмотря на то, что в большинстве примеров этого материала используется C++, статья может быть полезна широкому кругу читателей.

*Обращаем ваше внимание: позиция автора не всегда может совпадать с мнением МойОфис.

Читать далее

Пирамида инспекции кода

Время на прочтение3 мин
Охват и читатели8.3K
При инспекции кода часто складывается такая ситуация: какие-то обыденные моменты вроде форматирования или стиля рассматриваются очень тщательно, вокруг них ведутся бесконечные обсуждения, в то время как важным аспектам (выполняет ли код те функции, на которые рассчитан, производителен ли он, есть ли у него обратная совместимость с существующими клиентами и многое другое) уделяется гораздо меньше внимания.

Недавно я разместил в своем Твиттере небольшую иллюстрацию, которая проливает свет на эту проблему и дает наводку, на каких аспектах следует сосредоточиться прежде всего, и назвал ее «Пирамида инспекции кода». Ее назначение – помочь держать в приоритете составляющие инспекции кода, имеющие первостепенную важность (по крайней мере, на мой взгляд), а так же указать, какие составляющие можно и нужно автоматизировать.

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



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

SOLID – это не правила, а гайдлайны

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

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

Читать далее

Когда разница адресов имеет значение

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

Среди бесчисленных режимов адресации архитектуры х86 существует один такой…
Впрочем, почему «бесчисленных» режимов? Если разобраться, то их немного. Со времен первого процессора 8086 адресация укладывалась в байт, который имел аббревиатуру MODRM, где «MOD» - это собственно режим адресации (т.е. mode), «R» - регистр и «M» - очевидно, память (memory).
Если не рассматривать дальнейшее совершенствование системы адресации с помощью SIB-байта, то, поскольку под MODE в MODRM-байте выделено всего два бита, получается, что возможны всего-навсего четыре режима адресации.

Читать далее

Есть ли жизнь без тестов?

Время на прочтение15 мин
Охват и читатели13K
Это история про то, как нам удалось написать довольно сложную business-critical систему, и добиться, чтобы она была стабильной даже без юнит-тестов (WAT?!).
Читать дальше →

О чем вы даже не подозреваете, решая стать программистом

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

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

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

Читать далее

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

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

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

Почему ты выбрал такой подход к решению?

  • Не знаю. Прочитал в какой-то статье.
  • Не знаю. Скопипастил его из X.
  • Не знаю. Такой же подход я использовал в предыдущем проекте.
  • Не знаю. Кто-то мне посоветовал.

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

Я видела разработчиков, берущих решение других людей как должное. Без малейших раздумий о выбранном подходе, не заморачиваясь анализом. Да, конечно, когда Дэн Абрамов говорит мне, как правильно использовать React, или в документации написано, что это единственный способ применения API, то с этим нужно согласиться. Тем не менее, когда вы используете какой-то технический контент без хотя бы доли скептицизма, то вы всё равно сможете продвинуться в своей карьере, но есть вероятность, что это вам помешает.
Читать дальше →

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

10 вредных привычек в программировании, с которыми нужно покончить прямо сейчас

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

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

Читать далее

Приглашаем на онлайновый митап про системы сборки С++ кодовой базы

Время на прочтение1 мин
Охват и читатели1.7K
В четверг, 28 апреля, в 16 часов (МСК) мы проведем онлайновый митап под названием «Kaspersky Tech: Из CMake в Bazel. Переход для большой кодовой базы С++». Наши C++-разработчики из команд Engineering Productivity, которые используют системы сборки плюсового кода CMake и Bazel и переводят большие проекты с одной на другую, расскажут о своем опыте и проблемах, с которыми им довелось столкнуться.



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

Баги в Hello World

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

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

Конечно же эта простая программа не должна иметь баги. Верно?

Читать далее

Scala: Гексагональная архитектура и DDD на Free Monad в функциональном программировании

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

Привет Хабр! Пятничного тру ФП хардкора с Free Monad, Таглес Финал, Монад трансформерами, Refined Types, Smart Constructors и прочим таким вам в ленту. Хардкор сам себя в ленту не принесет так что погнали.

Гексагональная архитектура делит наш код на три основные части.

1) Primary Adapters,

2) Secondary Adapter

3) Logic aka Domain.

Читать далее

Mapper Contexts и Supercontexts: Разделение domain-specific и domain-generic ограниченных контекстов

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

Эта статья является переводом материала «Mapper Contexts & Supercontexts: Decoupling Domain-Specific and Domain-Generic Bounded Contexts».

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

Первый разработчик предлагает модель push: ограниченный контекст должен дать указание Notifications отправить уведомление. Notifications должен просто подчиняться командам и отправлять указанные уведомления.

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

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

Читать далее

Способы переписать логические параметры в С++

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

Программисты читают код намного чаще, чем пишут его, поэтому важно писать понятный, последовательный, однозначный код. Автор книги С++17 in detail написал о способах избегать путаницы. Делимся его материалом к старту курса по разработке на С++.

Читать далее

Почему я начал использовать аннотации типов в Python – и вам тоже советую

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

С появлением подсказок типов (type hints) в Python 3.5+ добавилась опциональная статическая типизация – поэтому эти подсказки так мне нравятся. Теперь я аннотирую ими все мои проекты.

Читать далее