Приоритеты написания кода
Я уже некоторое время слежу за SO, и каждый раз часто вижу, как люди спрашивают о самом быстром способе что-то сделать. Я, конечно, признаю, что код должен быть хорошо написан и даже настроен время от времени, но в моей повседневной работе меня гораздо больше беспокоит ремонтопригодность кода, и только изредка мне приходится набирать код, чтобы он ускорялся.
Поэтому я хотел бы знать, какие приоритеты следуют при написании кода. Итак, другими словами: Каковы наиболее важные атрибуты кода? И в качестве последующих вопросов я хотел бы знать, кто принял это решение (руководство или разработчики)?
Ответы
Ответ 1
Код должен выполнять свою предполагаемую задачу в течение короткого периода времени, достаточного для использования. Это сильно варьирует между приложениями. Стремясь сделать ваш код "быстрым", когда вы не понимаете, насколько быстро он должен быть, это пустая трата времени; в то же время, стремление сделать ваш код "ремонтопригодным", когда вам не хватает четкой, высокоуровневой идеи о том, что означает ваш код, обречен на провал. Поэтому первостепенное значение должно быть уделено пониманию проблемы, которую вы хотите решить; из этого понимания следует все остальное.
См. также: Когда оптимизация преждевременна?
Ответ 2
ответ mdbritt довольно близок к моему отношению, но несколько других вещей:
- Я лично ценю читаемость по правильности. Легче (IME) перейти от читаемого, но некорректного кода к читабельному и правильному коду, чем получить от правильного, но нечитаемого кода.
- Я знаю, что это звучит как данность, но я думаю, что очень важно понять, что вы на самом деле пытаетесь сделать, прежде чем начинать кодирование. Я не говорю, что вам нужно знать все о своем приложении перед тем, как вы начнете - и вы, безусловно, сможете улучшить дизайн некоторых областей, когда идете; но когда дело доходит до одного класса, вы должны хотя бы знать, какие результаты вы ищете, и почему вы это делаете.
- Производительность важна для архитектуры, но тем более для реализации. Если вы ошиблись в архитектуре, чтобы она не масштабировалась, у вас проблемы, но если архитектура права, вы можете исправить ее позже. Я знаю, что это хорошо изнашиваемая поговорка, но на самом деле имеет смысл написать простейший рабочий код, а затем профилировать приложение и оптимизировать только узкие места, пока вы не будете удовлетворены. (Это делает простоту выше эффективности в моей версии ответа mdbritt - для большей части кода.)
Ответ 3
Качество программного обеспечения должно быть в верхней части каждого списка приоритетов написания кода...
- ремонтопригодность
- Гибкость
- Портативность
- Повторное использование
- читабельность
- Тестируемость
- Понятность
Ответ 4
Мои приоритеты:
-
Код должен быть доступен для чтения.
-
Код должен делать что-то полезное.
-
Во многих случаях он должен быстро выйти из дома, и в этом случае я могу рассказать о вещах ниже.
-
Код должен быть хорошо разбит на модули.
-
Он должен быть достаточно быстрым.
В прошлый раз у меня был код, который был недостаточно быстрым, когда я писал решатель уравнений и нуждался в преобразовании уравнений в код, что означало замену имен произвольных переменных допустимыми идентификаторами программ. Оказывается, последовательность из 30 одиночных замен была не очень умной - слишком много выделения. Выполнение одной подстановки всех 30 переменных за один проход спасло день.
Ответ 5
При кодировании:
- Правильность,
- Считываемость,
- Эффективность,
- Простота
В этом порядке.
При проектировании:
- Организация (многие вещи, включая ООП и проблемы с одной задачей),
- Чистота (без избыточного кода),
- Проверка (включая разделение проблем).
В этом порядке.
Ответ 6
Тесты относятся к моему списку важных атрибутов. Делает жизнь намного легче по дороге. Это было мое решение делать, где я работаю, поскольку никто другой не делает TDD.
Ответ 7
Разделение забот очень важно для меня. Если каждый класс имеет ограниченное число целей (надеюсь, один), то, когда код необходимо поддерживать, у вас меньше мест для поиска. Это также позволяет избежать многотысячной линейной чудовищности, которую может исправить или поработать только Боб. В сочетании с надлежащим модульным тестированием объем каждого класса и тест снижаются, гарантируя, что каждый раздел кода легче понять и диагностировать.
Ответ 8
Это действительно зависит от того, какое программное обеспечение вы разрабатываете и для кого оно предназначено.
Если вы пишете веб-приложение LOB для предприятия, где все используют одну и ту же версию IE для всех веб-браузеров, тогда ошибка, которая приводит к ужасному прорыву вашего приложения в Fire Fox, не имеет значения.
Если вы разрабатываете Google Gmail, такая ошибка становится намного более важной.
Иногда производительность может выдержать правильность взвешивания. Например, если у вас есть ошибка, которая влияет на 0,1% ваших клиентов, и для ее исправления потребуется значительно снизить скорость приложения на 99,9%, тогда производительность станет более важной.
Итак, я бы сказал, что это действительно зависит от ваших индивидуальных обстоятельств.
Ответ 9
Самый быстрый способ разработки чего-то IME состоит в том, чтобы собрать столько частей решений, которые в большинстве случаев легко собираются в новую проблему. Например, у меня есть механизм данных, который я всегда использую, у меня есть базовый класс службы, планировщик, функции для копирования файлов и проверки их хэшей и т.д. Я обычно могу быстро вырвать программу только потому, что у меня есть эти ранее разработанные и проверенный код под рукой.
Ответ 10
Производительность обычно не является проблемой, за исключением того, что вы выполняете пакетную обработку тысяч файлов данных. Большая часть производительности связана с простотой, которая является одним из моих приоритетов. Я бы посмотрел мои приоритеты примерно в следующем порядке:
- Надежность
- Простота (в алгоритмах, интерфейсах и т.д.)
- Genericity (могу ли я сделать свою программу для решения проблемы более общим способом, чтобы будущие изменения были проще?)
- Надёжность
- Повторяемость (могу ли я заставить мою программу также решать другие проблемы?)
Ответ 11
Мои приоритеты LTFCE: L egible, T, F, lexible, C ompliant и E в этом порядке. Более подробное обсуждение этих приоритетов опубликовано в ответ на этот вопрос.
Как вы можете видеть, я согласен с вами в том, что почти всегда скорость нигде не приближается к главной проблеме.
Ответ 12
Мой приоритет номер один выше всего остального заключается в том, что изменения в требованиях, независимо от того, насколько велики, требуют лишь небольших изменений кода. Независимо от того, что вы думаете или что они говорят вам, они собираются изменить требования. И никто из них не в безопасности.
- Предположим, что все изменится.
- Параметрирование E V E R Y T H я N G.
- Устранить зависимости.
Если требование меняется, и я должен изменить код в нескольких местах, я чувствую, что я потерпел неудачу. Но потом я выясню, как переписать этот код, поэтому, когда требование изменится во второй раз (вы знаете, что это произойдет), я могу изменить его в одном месте.
Есть причина, по которой люди изобретают такие вещи, как n-уровень и MVC и другие методы де-связи.
- Страница
BMB