Обновить
256K+

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

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

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

Абстрактные войны: public interface IAbstraction против абстракции

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

Почти 30 лет назад в классической книге по шаблонам проектирования Design Patterns: Elements of Reusable Object-Oriented Software, авторы сформулировали один из самых известных, но недопонятых принципов в истории программирования:

Program to an interface, not an implementation.

— Erich Gamma et. al, Design Patterns: Elements of Reusable Object-Oriented Software

Зачем "программировать в интерфейсы"?

Давайте разбираться

Немного о «мертвом коде»

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

Термин «мертвый код» - это, скорее, жаргонное, чем научное название участков программы, на которые не может попасть управление и, таким образом, они никогда не выполняются. Разумеется, в нормальных программах таких участков быть не должно. Но поскольку языки программирования становятся все сложнее и сложнее (а программисты все тупее и тупее, шутка!) в кодах программ может быть все, что угодно.

Читать далее

Разработчик с мозгом груга

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

Введение


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

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

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

разработчиков с большим мозгом много, некоторым страница не понравится, скривят кислая рожа

Ещё больше-больше ДУМАЮТ, что они разработчики с большим мозгом и им она тоже не понравится

(груг раньше думал груг с большим мозгом, но потом всё понял)

это ладно!

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

Антипаттерны в написании учебных пособий или откуда растут ноги плохого кода?

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

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

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

Важно: пример из статьи не является вымыслом или шуткой!

Ещё важней: статья не является критикой математики, математику я люблю.

Мучаемся вместе

Как защищать границы массива без команды BOUND

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

Я уже плакался по поводу исключения в x86-64 команд двоично-десятичной арифметики DAA/DAS и плакался по поводу отмены команды проверки целочисленного переполнения INTO. Теперь настала очередь плакаться по поводу выброшенной команды BOUND. Как говорится, леди и джентльмены, подставляйте свои жилетки и декольте. Начинаю плач.

Читать далее

Что такое «Разделение ответственности» в коде

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

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

Многие не осознают, что написание кода во многом напоминает написание эссе или книги. Насколько же я был уверен, что умение писать эссе мне «в жизни не пригодится» - но позже я узнал, что писать эссе – значит гораздо больше, чем укладываться в число слов и соответствовать критериям оценки.

Читать далее

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.5K

Среди бесчисленных режимов адресации архитектуры х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 привычках, которых должен избегать каждый программист.

Читать далее