Я работал со множеством разработчиков программного обеспечения. Некоторые из них только закончили колледж, другие — уже профессионалы. В этой статье я перечислил общие привычки этих людей.
Не пишите код, который не нужен вам прямо сейчас. Соблазнительно писать код, который, как вам кажется, пригодится в дальнейшем. Проблема двоякая:
Берегите своё время. Этот код вам не пригодится!
Как и в первом случае, заманчиво оптимизировать код как можно раньше. Вот риски:
Давайте уточним эти два момента.
Во-первых, оптимизация кода для скорости зачастую затрудняет его понимание. Вместо того, чтобы идти по очевидному и простому маршруту, вы внедряете такие вещи, как кэширование, развёртывание циклов или другие навороченные приёмы там, где это не нужно.
Вы усложняете код, а у сложности есть множество недостатков (смотрите пункт KISS).
Во-вторых, вы не знаете, как будет работать код, пока не запустите его. Так что не тратьте время на оптимизацию до возникновения реальных проблем.
Вы обнаружите, что чаще всего не имеет значения, насколько быстр ваш код. Циклы процессора дёшевы в отличие от рабочих часов. Вы можете избежать сложности и потенциальных ошибок, просто добавив процессорные мощности или подождав чуть дольше.
Отдавайте предпочтение ясности, а не заумности. Некоторые однострочные технические уловки прекрасно подходят, чтобы покрасоваться, но для людей, читающих ваш код, могут стать проблемой. Не будьте позёром, лучше пишите о таких уловках в блоге.
Ниже прекрасный пример подобного кода. Сколько времени вам потребовалось, чтобы понять, что он делает?
test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4]
print(max(set(test), key = test.count))
# 4
Этот код станет намного понятнее, если разбить его на несколько строк с одним-двумя комментариями с пояснениями к аргументам функции max()
.
Делайте код понятным, насколько это возможно. Предполагайте, что он должен быть понятен другому программисту, которому срочно нужно исправить ваши ошибки год спустя.
И давайте будем честны. Этим другим программистом можете оказаться вы сами, поскольку через год вы уже забудете этот классный приём.
Как сказал Ван Россум:
“Поддерживаемый код важнее, чем умный код.”
Начинающие разработчики часто повторяют код, делая то же самое или почти то же самое. Скажем, вы хотите открыть файл и прочитать его содержимое. Это легко сделать, написав несколько строк.
Но если вам нужно прочитать другой файл и его содержимое, не пишите такой же код. Или ещё хуже — не копируйте!
Вместо этого можно создать функцию, что дает два важных преимущества:
Продвинутый совет: некоторые IDE обнаруживают дублирующий код и предупреждают об этом, а некоторые даже помогают выделить методы или функции из дубликатов.
Многие упускают из виду модульное тестирование, и я, увы, не исключение. Зачастую я обнаруживаю, что создаю модульные тесты по факту, если вообще создаю. Но это лучше, чем вообще не использовать их.
В наиболее экстремальной форме вы применяете практику, называемую разработка через тестирование (TDD). Применяя этот подход, вы сперва создаёте модульный тест, а потом реализуете функцию.
Таким образом, тестируя каждую создаваемую функцию, вы тщательно обдумываете, какие действия она должна выполнять и каков ожидаемый вывод. Существует прекрасная книга на эту тему: Экстремальное программирование: разработка через тестирование.
Ещё одним преимуществом модульных тестов является то, что вы или другие разработчики можете увереннее менять код. После изменений вы просто запускаете все тесты. Если ошибок нет, то шансы, что вы внесли критические изменения, невелики.
Создание модульных тестов помогает вам:
Эта мощная мантра используется не только в разработке. По сути она означает “не усложняйте” или “старайтесь придумывать наиболее простое решение из возможных”.
Эдсгер Вибе Дейкстра, один из пионеров компьютерной науки, однажды сказал: “Простота является необходимым условием надёжности”. Чем проще ваше решение, тем труднее внедрение ошибки. Всё просто.
“Простота является необходимым условием надёжности.”
Придерживайтесь стиля, особенно, когда работаете в команде. Например, некоторые предпочитают подобное оформление:
while (true)
{
// делает что-то
}
В то время как другие предпочитают более лаконичный стиль:
while (true) {
// делает что-то
}
У обоих подходов есть свои плюсы и минусы. Но во чтобы то ни стало придерживайтесь одного. Если вы работаете в команде, это может означать, что вам понадобится придерживаться не того стиля, который вы предпочитаете.
В каждом языке есть свои инструменты и стандарты в этом отношении. Стоит поискать наилучшие решения для выбранного вами языка. Вот несколько полезных ссылок, с которых можно начать:
Существует три способа документирования кода:
Начнём с комментариев: старайтесь использовать их реже. Используйте их только там, где пояснения действительно нужны, не комментируйте очевидное.
Документация может быть очень полезной. Подумайте обо всех этих репозиториях на GitHub. Включать файл README.md
в корневой каталог проекта фактически стало стандартом.
Этот файл описывает несколько важных вещей:
Наиболее важно писать самодокументированный код. И это сложнее всего, потому что требует опыта и наработанных методов. Чтобы подробнее проиллюстрировать это, вот несколько дополнительных пунктов:
wm
, к примеру, используйте windowManager
, вместо rf
— readFileToString
. Эти имена очень помогут, когда кто-то другой — или вы сами — спустя несколько месяцев попытается понять, что происходит. readFileToString(String fileName)
. Люди будут знать, что она делает, без детального знакомства с кодом. В идеале ваш код выглядит как последовательность вызовов функций, подобных этой, читающийся почти как человеческий язык. Только при необходимости читатель погружается глубже. Этот код документирует себя сам! Профессионал просит о помощи только после тщательных попыток найти решение другими способами. Перед тем как задать вопрос:
Если это не поможет, подумайте, куда обратиться за помощью:
И последнее, прежде чем задать вопрос, имейте в виду следующее:
В общем, уважайте чужое время.
Рефакторинг — это реструктуризация кода без изменения его поведения.
И зачем же это делать? Чтобы улучшить код, конечно! Существует несколько фактов, делающих рефакторинг необходимым:
При работе с новым проектом сначала нужно внести значительные изменения, например, переупорядочить исходный черновик в классы. Хотя на этом рефакторинг не заканчивается.
Выработайте привычку улучшать код каждый раз, когда работаете с ним.
Небольшие улучшения, которые вы вносите, постепенно складываются в кодовую базу, которую легко читать и поддерживать.
Не превращайте ваш код в минное поле.Постоянный рефакторинг уменьшает вероятность того, что ваш код превратится в минное поле для других разработчиков.
Возможно вы видели подобный код прежде. Вроде тех, где при изменении одной строки всё становится непонятным.
Вы — профессионал. Мы — профессионалы. Мы работаем в сфере деятельности, пользующейся большим спросом. Не позволяйте никому и никогда унижать вас. В ИТ всё ещё существует незаслуженная стигматизация, поэтому позвольте чётко заявить:
Вы разработчик программного обеспечения, инженер по данным, возможно, учёный, работающий с данными. Как бы вы себя не называли, вы такой же профессионал, как юрист или стоматолог.
Вы много учились, чтобы делать свою работу. У вас есть опыт, который используется практически в каждой отрасли. Ведите себя как профессионал, которым вы и являетесь. Не бойтесь бросать вызов тем, кто не относится к нашей профессии с заслуженным уважением.
Профессиональный инженер-программист продолжает учиться на протяжении всей своей карьеры. В мире ИТ существует только одна константа, и эта константа — изменение.
Новые языки появляются каждый год. А новые фреймворки JavaScript, кажется, появляются каждый день. Вы должны учиться, чтобы поддерживать актуальность ваших знаний.
Если вам понравилась эта статья, вот три книги, которые помогут вам стать лучшим разработчиком ПО. Эти книги стали настольными для многих (включая меня), и все они написаны Робертом С. Мартином:
Перевод статьи Erik-Jan van Baaren: The 12 Habits of Highly Effective Software Developers
Комментарии