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

Например, программист, который быстро набирает текст, быстро перемещает мышь, использует ускоряющие работу сочетания клавиш и инструменты, может потратить несколько часов на выполнение конкретной задачи. А другой программист, более медленный, справится с этой же задачей за несколько минут. Более того, первому программисту может понадобиться изменить код после проверки, в то время как у второго процесс проверки кода пройдет без проблем. Чтобы стать по-настоящему быстрым программистом, мало развивать физическую скорость — необходимо освоить определенные техники программирования.

Практикуя эти техники, вы станете по-настоящему быстрым программистом, способным не только оптимально использовать свое время, но и помочь коллегам сэкономить минуты или даже часы!

Написание чистого кода, повышающего производительность 

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

Вот несколько общих советов по написанию чистого и ориентированного на производительность кода на любом языке программирования:

  • Используйте для идентификаторов короткие имена, не требующие пояснений.
  • Оптимально используйте возможности языка программирования и API без излишней детализации. Не стоит программировать со всеми расширенными возможностями языка, чтобы показать свой профессиональный уровень — простота является лучшим показателем вашего мастерства в программировании.
  • Используйте комментарии к коду только тогда, когда это необходимо — добавление избыточных комментариев (не для документирования) обычно является признаком нечитабельного кода.
  • Используйте оптимальные структуры данных и алгоритмы, ориентируясь на простоту и производительность.

Следование четко определенному руководству по оформлению кода — безупречное решение для повышения производительности каждого программиста в команде. Посмотрите, как Google использует документированное должным образом руководство по оформлению C++ в своих открытых проектах для написания чистого кода:

Исходный код Google LevelDB соответствует руководству по оформлению кода C++ от Google (скриншот автора)

Написание поддерживаемого кода (даже если это требует времени на начальном этапе)

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

Написание поддерживаемого кода — секрет упрощения сложных кодовых баз проектов. Примером может послужить исходный код браузера LadyBird, где используются локальные, общие лямбда-функции для упрощения парсера HTTP-сообщений:

В исходном коде браузера LadyBird для удобства поддерживаемости кода используются общие лямбда-функции (скриншот автора)

Поддерживаемость кода заключается не только в структурировании одного исходного файла. Необходимо оптимально разложить кодовую базу на несколько исходных файлов и каталогов, чтобы структурировать весь проект. Посмотрите, как кодовая база LadyBird создала стабильную структуру развития браузера в ближайшие десятилетия:

Структура каталогов кодовой базы LadyBird визуализируется с помощью команды tree (запись с экрана выполнена автором)

Время, которое вы потратите на обеспечение поддерживаемости кода сегодня, сэкономит часы при выполнении последующих задач программирования завтра, сделав вас по-настоящему быстрым программистом.

Программист — не только создатель кода

Создание кода — это написание исходного кода с использованием определенного низкоуровневого или высокоуровневого языка программирования. Хотя программирование и создание кода подразумевают написание кода, это разные виды деятельности, поэтому роли создателя кода и программиста в проекте отличаются.

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

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

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

Освоение концепций метапрограммирования

Программисты часто создают алгоритмы, используя синтаксис и возможности языка программирования для обработки различных элементов данных. Во время выполнения программы исходный код создает структуру программы в физической памяти с помощью фундаментальных компонентов конкретного языка программирования, таких как объекты, функции, MAP и другие структуры данных. В некоторых сценариях можно сократить объем многословного кода и написать короткий, но читабельный код, обрабатывая эти компоненты языка программирования как элементы данных.

Просмотр и обработка структуры программы во время выполнения кода как данных получили название «метапрограммирование». Этот вид программирования помогает сократить повторяющиеся и многословные сегменты кода.

Каждый современный язык программирования предлагает встроенные API на основе рефлексии для использования метапрограммирования. Рассмотрим возможности метапрограммирования по ускорению выполнения задач программирования на практическом примере.

Предположим, вам нужно написать функцию для создания команды терминала путем преобразования свойств объекта в параметры CLI. Для примера возьмем следующие входные/выходные данные:

// вход
{
  size: 100,
  configFile: 'app.conf',
  logErrors: true
}

// вывод
'--size=100 --config-file=app.conf --log-errors'

Вот как это можно реализовать без концепции метапрограммирования:

function transform(options = {}) {
    let command = 'my-command ';
    if(options.size)
        command += `--size=${options.size} `;
    if(options.configFile)
        command += `--config-file=${options.configFile} `;
    if(options.logErrors)
        command += `--log-errors `;
    return command;
}


const c = transform({
  size: 100,
  configFile: 'app.conf',
  logErrors: true
});

console.log(c);

Вышеописанный подход требует добавления каждого сопоставления параметров путем создания отдельных if-операторов. Это становится головной болью, если целевая команда поддерживает сотни CLI-аргументов.

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

function transform(options = {}) {
    let command = 'my-command ';
    for (let [key, val] of Object.entries(options)) {
        command += key.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
        if(typeof val !== 'boolean')
            command += `=${val} `;
    }
    return command;
}

Метапрограммирование волшебным образом сокращает код, но влияет на читаемость, поэтому всегда стремитесь к чистому процессу метапрограммирования.

Изучение UX с позиции программиста

Мы пишем код для машин, чтобы обеспечить работу программных систем, но машины представляют интерфейсы программных систем для людей. Поэтому программисты должны создавать программные системы, которые легко изучать и использовать, основываясь на принципах UX. В современной индустрии разработки программного обеспечения UX является областью, отдельной от программирования, и компании нанимают UI/UX-дизайнеров для разработки UX для программных продуктов. UI/UX-дизайнеры проектируют прототипы продуктов и передают их разработчикам.

Разработчики преобразуют спецификации дизайн-проектов в реальные интерфейсы продукта, снабженные функциональностью, сразу после передачи дизайна. В некоторых случаях разработчики сталкиваются с проблемными ситуациями, в которых они должны инициировать совещания с UI/UX-дизайнерами для уточнения спецификаций дизайна.

Изучение UX с позиции программиста поможет вам быстрее понять спецификации дизайна, сократив излишние совещания с UI/UX-дизайнерами. Изучение UX, несомненно, является обязательным, если вы программист-одиночка, который планирует начать работу в сфере диджитал-технологий!

Вот несколько важнейших принципов UX, которые необходимо освоить программисту:

  • основы взаимодействия человека и компьютера (HCI);
  • последовательность и согласованность;
  • дизайн взаимодействия (ID) и информационная архитектура (IA);
  • законы группировки гештальтов;
  • ориентация на пользователя и доступность.

UX — не только концепция проектирования GUI-продуктов. Знание принципов UX поможет вам писать более качественные программы для интерфейса командной строки (CLI) и минимизировать будущие запросы на функции, ориентированные на юзабилити. Так что подумайте об изучении UX с позиции программиста, чтобы создавать лучшие продукты.

Посмотрите на приведенную ниже запись с экрана, как в среде REPL Python реализован дружественный и простой в освоении CLI:

Реализация дружественного UX в среде REPL Python (запись с экрана выполнена автором) 

Автоматизирование ручных операций

Помимо написания кода, программисты вводят команды терминала, настраивают инфраструктуру системы и работают с различными инструментами. Как правило, эти задачи приходится выполнять многократно в зависимости от текущих задач программирования. Выполнение повторяющихся задач вручную, несомненно, замедляет работу.

Автоматизация помогает программистам сэкономить время, автоматизируя ручную работу с помощью скриптов. Как и вложение времени в написание поддерживаемого кода, автоматизация — инвестиция, которая приносит выгоду в долгосрочной перспективе. Концепция DevOps мотивирует программистов автоматизировать каждую SDLC-активность с помощью скриптов автоматизации.

Взгляните на пример ниже: кодовая база Lite-XL включает скрипт оболочки, позволяющий разработчикам быстро собрать проект:

Скрипт автоматизации сборки LiteXL, который оборачивает команды инструмента сборки Meson (скриншот автора)

С помощью скриптов автоматизации можно автоматизировать буквально все. В состав инструментов для разработчиков также входят хуки для автоматизации, позволяющие запускать скрипты автоматизации. Например, Git предлагает различные хуки для запуска скриптов автоматизации:

Список доступных Git-хуков для запуска шаблонных скриптов в репозитории (запись с экрана выполнена автором)

Тщательно выбирайте язык программирования для написания скрипта автоматизации. Выбор неподходящего языка может замедлить работу и потратить время коллег. Например, Bash — отличный язык для традиционных сценариев оболочки, хотя и не очень удобный для разработчиков, — может быть продуктивным и эффективным инструментом для обработки данных. Однако использование Bash для написания современных сценариев автоматизации, обрабатывающих данные, обычно непродуктивно.

Создание личного набора инструментов для программирования

Программисту необходим набор инструментов, состоящий из операционной системы, редактора кода/IDE, браузера, интерпретатора оболочки и ряда инструментов разработчика. Обычно программисты формируют свои наборы инструментов, учитывая тенденции и рекомендации старших программистов. Согласно опросам пользователей, большинство новичков начинают свой путь в программировании с VSCode на операционной системе Windows.

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

Ваш уникальный набор инструментов для разработки может включать персонализированные расширения функций. Для примера посмотрите, как можно создать персонализированную команду в Git-логе с помощью псевдонима команды:

git config --global alias.l "log --pretty=format:'%C(cyan)%h%Creset ->%C(yellow)%d%Creset %s %C(green)(%cr) %C(magenta) by %an%Creset'"
Использование пользовательской команды в Git-логе для отображения деталей коммита (запись с экрана выполнена автором) 

Производительность инструментария напрямую влияет на скорость программирования. Например, 10-секундное ожидание инициализации редактора кода сильно сказывается на производительности. Обязательно включайте в личный набор инструментов для программирования высокопроизводительные средства.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Shalitha Suranga: Things You Should Know to Become a Fast Programmer

Предыдущая статьяЯ могу назвать себя «экспертом по ИИ», а вы?
Следующая статья18 полезных скриптов автоматизации на Python. Часть 2