Кейси Муратори, программист из Сиэтла, начал дискуссию в мире программирования о некоторых длинных идеях о лучших практиках.
Многие «лучшие практики программирования, которым сегодня учат, — это проблемы с производительностью, которые ждут своего часа», — предупредил программист из Сиэтла Кейси Муратори на своем образовательном веб-сайте, вызвав дискуссию среди программистов.
Некоторые соглашались, некоторые не соглашались, но начались активные интернет-дискуссии, когда программисты со всего Интернета изучали или поддерживали обширные идеи о лучших практиках.
Муратори раздал бесплатное бонусное видео, в котором особое внимание уделялось штрафам за производительность из-за так называемого чистого кода или длинному списку устоявшихся правил не делать что-то определенным образом, чтобы продвигать 9-долларовую рекламу. ежемесячная серия видеороликов на YouTube под названием Программирование с учетом производительности.
По словам Муратори, эти методы не обязательно повышают эффективность конечного приложения.
Следующее обсуждение подняло тему того, какой стандарт следует использовать для оценки эффективности кода…
Муратори обнаружил следующие ограничения для некоторых людей, которые помнят лучшие методы создания кода:
Что-то изменить
Чтобы сделать код более чистым, программистам часто советуют держаться подальше от блоков кода, в которых перечисляются все потенциальные ответвления, которые может принять поток, например операторы switch в C, которые создают отдельно закодированный случай для каждого потенциального значения переменной.
Это распространенное разногласие среди сторонников чистого кода:
- Операторы Switch, по словам программиста Арнольда Абрахама, неудобны и раздувают ваш код.
- Сторонник чистого кода Роберт С. Мартин говорит о разработке операторов switch как о распространенной «проблеме в программных системах, указывая на то, что при изменении кода просто игнорировать регистр, что приводит к нестабильности систем. (Что еще более важно, результаты каждого ответвления потока обычно скрыты в модулях более низкого уровня.)
- Согласно веб-сайту Гуру рефакторинга, отказ от операторов switch улучшит вашу структуру кода.
Муратори проверил это на обычном примере, используемом сторонниками чистого кода.
В своем видео он предлагает функцию, которая подсчитывает площадь четырех форм.
Метод «чистого кода» включает в себя четыре чистых дизайна классов, которые включают код вычисления площади для каждой отдельной формы.
Muratori сравнивает свою производительность с производительностью отдельной функции, которая предоставляет строку кода для каждой из четырех возможных форм.
Каковы результаты? Тестирование производительности Muratori показывает увеличение скорости в 1,44 раза.
Тем не менее, как показывает Муратори в видео, есть еще одно преимущество.
«Когда ваш код структурирован по функциям, а не по типам, легко обнаружить и извлечь общие шаблоны».
Для сравнения, некоторые сторонники чистого кода даже выделяют код для определенных типов в отдельные файлы.
«Чем сложнее проблема, тем больше эти концепции вредят вашей работе». Кейси Муратори
В этом случае вычисление площади четырех форм всегда включает умножение ширины на высоту, но с множителем, зависящим от формы, таким как пи для круга или половина для треугольника.
Когда все четыре вычисления близки друг к другу в соседних строках кода, гораздо проще заменить в таблице быстрого поиска одну вещь, которая отличается во всех четырех случаях.
«Это не только намного быстрее, но и гораздо менее семантически сложно», — сказал Муратори в видео.
«Меньше токенов, операций и строк кода».
Тесты Muratori теперь показывают 10-кратное увеличение скорости…
«Чем сложнее становится проблема, тем больше эти идеи вредят вашей работе», — сказал Муратори.
«Когда вы пытаетесь применить «чистые» методы к реальным объектам со многими свойствами, вы увидите эти системные потери производительности во всем коде…»
Муратори считает, что это больше, чем интеллектуальный вопрос.
Если ваш код работает на сервере «в облаке, ваша ежемесячная плата прямо пропорциональна производительности вашего программного обеспечения», — сказал он в своем вступительном сообщении в блоге.
«Математика проста: чем медленнее ваша программа, тем больше серверного времени (или серверов в целом) вы должны купить…»
Тем более в видеоряде приведены случаи, но вывод Муратори ясен.
«Ответ на вопрос «почему программное обеспечение такое медленное» для определенного сегмента технологического мира в значительной степени связан с «чистым» кодом».
Идеи, лежащие в основе «чистого» стиля кодирования, почти все плохо влияют на производительность, и их следует игнорировать…».
Отвечая на вопрос New Stack, Муратори сказал, что, по его мнению, сторонники чистого кода не понимают должным образом, как работают процессоры, и не понимают «глубины затрат производительности на их идеи…».
Получение ответа
Не все верят.
Когда пост Муратори был обсужден на Hacker New, он получил 739 голосов и 907 комментариев, при этом некоторые пользователи предположили, что точка зрения Муратори была дезинформирована из-за его работы над оптимизацией игрового движка.
Графический программист Дэниел Квик также работает над оптимизацией игр и отметил, что постоянное внимание компании к производительности графического процессора еще один зверь, чем оптимизация ЦП.
А разработчик Джонатан Дикинсон утверждал, что создатели игр «имеют роскошь время от времени начинать практически с нуля…
Я предполагаю, что все было бы не так однозначно, если бы ему передали кодовую базу 10-летней давности для работы».
Тем не менее, разработчик программного обеспечения Джошуа Румбат оценил гибкость Муратори перед лицом обычно строгих правил для программистов.
«Одна из хороших сторон некоторых идей чистого кода, которые он использует, заключается в том, что, как он показывает, вы можете тактически отступить от них в ключевых, важных для производительности областях и наслаждаться этими наградами».
Хасен Джуди, веб-программист, выразил более общую проблему с этими концепциями.
«Я никогда не видел кодовую базу, созданную с учетом идей «чистого кода», которая одновременно удобна в сопровождении и проста в разработке».
«Отчасти ответ был тревожным, так как многие противоположные мнения, казалось, основывались на фактических ошибках, — сказал Муратори The New Stack, — но в целом меня вдохновило удивительно большое количество людей, которым не нравится «чистый код» и которые хотят кое-что об этом».
Это может выглядеть многообещающе…»
Муратори опубликовал весь текст своего подробного публичного ответа, а также длинную, но дружескую обсуждение GitHub, состоящее из двух частей, с Робертом С. Мартином, автором книги 2009 года Чистый код: руководство по Agile Software Craftsmanship.
Мартин согласился с тем, что примеры «Чистого кода» Муратори «неэффективны на миллисекундном уровне», но сомневался, что это важно.
— Это было бы важно давным-давно. Нас беспокоила стоимость косвенного обращения и накладные расходы на вызовы функций.
Если бы мы могли, мы бы удалили петли. Это было особенно актуально для встроенных систем реального времени.
Тем не менее среды, в которых нужна такая эффективность, становятся все реже и реже».
Муратори же прекрасно описал свою точку зрения в недавнем интервью на YouTube-канале ThePrimeTime.
«Вместе с оптимизацией кода мы также можем пессимизировать код.
Мы можем делать вещи, из-за которых процессору становится еще труднее запускать его без видимой причины…
Из-за некоторых других странных метрик, откуда они берутся, я не знаю, таких как чистый код, которые, я думаю, никто никогда не доказывал, что они действительно делают кого-то более продуктивным, но я могу доказать, что они делают процессор менее производительным, так что это кажется плохой сделкой».
Итак, что будет дальше?
«Реакция на видео была довольно положительной», — сказал Муратори New Stack.
«Я получил большое количество благодарственных писем от людей, которые не согласны с подходами к «чистому коду» не только из-за их низкой производительности, но и потому, что они не предлагают очевидных преимуществ (удобочитаемость, ремонтопригодность и т. д.) в реальность».