Приоритеты написания кода

Я уже некоторое время слежу за 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