Дитер Рамс, пожалуй, самый знаменитый и влиятельный дизайнер продукции прошлого века. Его десять принципов хорошего дизайна повлияли на дизайн продуктов во всем мире. Часть того, что сделало десять принципов Ram такими убедительными, - это их способность адаптироваться практически ко всему, что создается, от носков до программного обеспечения.
И именно это мы и собираемся делать. Мы собираемся применить десять принципов хорошего дизайна Дитера Рама к программному обеспечению. Не продукт для конечного пользователя - об этом можно многое узнать, - а исходный код.
Хороший дизайн - новаторский
«Возможности для развития никоим образом не исчерпаны. Технологическое развитие всегда открывает новые возможности для оригинального дизайна. Но творческий дизайн всегда развивается вместе с совершенствованием технологий и никогда не может быть самоцелью ».
Исходный код нашего программного обеспечения не обязательно должен быть диковинным или сложным, чтобы быть инновационным. На самом деле все наоборот. Инновационный исходный код стремится выявить закономерность проблемы и элегантным способом решить всю категорию. a² + b² = c²
инновационен. Это имеет огромное значение, но это не сложно.
Точно так же функции высшего порядка, такие как map
или reduce
, представляют собой новаторские решения проблемы преобразования списка вещей во что-то другое. Они решают категорию итераций, оставаясь при этом достаточно гибкими, чтобы делать практически все в рамках этой итерации.
React - еще одно инновационное дизайнерское решение в коде. Бен Алман (@cowboy в твиттере) однажды случайно придумал очень удачное описание: Переосмысление установленных передовых практик. С тех пор это оказало огромное влияние на сообщество Front-end, заставив нас пересмотреть, что означает разделение задач для front-end, и что мы можем рассматривать пользовательские интерфейсы как чисто функцию состояния.
В каждом из этих достижений использовались лучшие технологии и идеи, позволяющие сделать следующий шаг в плане интерфейсов для разработчиков. Есть еще много примеров инновационного дизайна в программном обеспечении, и все они имеют общую нить. Каждому из них удалось творчески и доступно упростить концепцию.
Хороший дизайн делает продукт полезным
« Продукт покупается для использования. Он должен удовлетворять не только функциональным, но и психологическим и эстетическим критериям. Хороший дизайн подчеркивает полезность продукта, не обращая внимания на все, что может его отвлечь. ”
Из всех десяти принципов Дитера Рама именно этого, вероятно, придерживаются наиболее естественно, по крайней мере, на первый взгляд. Рыночные силы стремятся гарантировать, что продукты, которые мы создаем, в целом полезны в том смысле, что они удовлетворяют функциональные потребности потребителей. Однако Рамс перечисляет психологические и эстетические аспекты полезности, которые привлекают пользователей к одному продукту, а не к другому. UX-дизайнеры иногда говорят о восторге, и при этом обращаются именно к этим психологическим и эстетическим аспектам.
Очевидно, что при разработке программного обеспечения код должен быть функциональным в том смысле, что он должен функционировать. Но наш исходный код может и должен быть психологически полезным и эстетически полезным. Код, который чрезмерно сложен или объемен, психологически огорчает и не особенно полезен. Лучшие практики, такие как ограничение объема файла, функции или класса одной целью, помогают ограничить психологический стресс, а использование таких инструментов, как цикломатическая сложность линтеров, поможет убедиться, что новички кодовая база может быстро освоиться.
Хороший дизайн эстетичен
« Эстетическое качество продукта является неотъемлемой частью его полезности, потому что продукты используются каждый день и влияют на людей и их благополучие. Красивыми могут быть только хорошо выполненные объекты. ”
Когда мы говорим о полезности исходного кода, мы обычно говорим о способности разработчиков работать с ним. Рамс говорит, что эстетическое качество продукта является неотъемлемой частью его полезности. Так что же тогда такое эстетический исходный код? «Красивыми могут быть только хорошо выполненные изделия», - говорит он.
Обычно говорят, что код читают гораздо чаще, чем пишут. Мы читаем код, чтобы понять его. Как хорошо написанная книга, хорошо написанный код рассказывает историю. Но более того, хорошо написанный, эстетичный код ясен, лаконичен и недвусмысленен. Он акцентирует внимание на важном и направлен на устранение шума.
Средства форматирования кода имеют большое значение, помогая создавать эстетически приятный код. Инструмент форматирования кода Prettier даже имеет это в названии. Это обещает сделать ваш код красивее. Красота, как говорится, в глазах смотрящего, но некоторые вещи более объективны, чем другие, и последовательно и продуманно отформатированный код всегда предпочтительнее неформатированного, непоследовательного кода.
Однако форматирование только доходит до нас. Точно так же, как любой может применить набор критериев дизайна, чтобы что-то выглядело менее плохим, нужны мысли и навыки, чтобы создать что-то красивое, элегантно удовлетворяющее нашим требованиям.
Один из способов сделать это - сдвинуть обработку крайних регистров к краям приложения. Операторы if / else, проверка типа, попытка / ловушка. Это не эстетично. Такие конструкции потока управления нарушают поток чтения. Их следует избегать, когда это возможно, и минимизировать, когда нет. Многие шаблоны существуют, чтобы помочь инкапсулировать и уменьшить необходимость прерывания потока управления, такие как Promises и Monads.
Хороший дизайн делает продукт понятным
« Он проясняет структуру продукта. Более того, он может заставить продукт четко выражать свою функцию, используя интуицию пользователя. В лучшем случае это говорит само за себя. ”
Все мы стремимся писать понятный код. Мы часто называем понятный код поддерживаемым. Код, который трудно понять, еще труднее поддерживать. Страх растет пропорционально понятности кода, который мы пытаемся изменить. Многие книги были написаны на тему понятного кода в попытке упростить трюк для его последовательного воспроизведения. Некоторые из них полезны. Многие нет. Настоящая уловка в том, что уловки нет. Как и многие другие вещи в жизни, это требует усилий, практики и намерения.
Все, что мы делаем, - это документируем наш код комментариями, которые описывают, что наш код пытается выполнить. Иногда это необходимо, но когда это необходимо, это также дает возможность для улучшения. В конце концов, «в лучшем случае [наш код] не требует пояснений». Стремление написать понятный код - это практика хорошего дизайна.
Хороший дизайн ненавязчивый
« Продукты, выполняющие цель, подобны инструментам. Они не являются ни декоративными предметами, ни произведениями искусства. Поэтому их дизайн должен быть нейтральным и сдержанным, чтобы оставлять место для самовыражения пользователя. ”
Ненавязчивый код не мешает. Код может быть навязчивым для инженеров по-разному. Он может быть перегружен ненужным синтаксическим шумом, чрезмерным количеством аннотаций, шаблонами, усталостью от концепций или магией. Но, пожалуй, самая распространенная форма навязчивости - плохие абстракции. Непонятна плохая абстракция. Это кусок головоломки, который почти не подходит. Таким образом, каждое использование требует немного наращивания здесь или немного сбривания там. Верным признаком плохой абстракции является потребность в растущем наборе параметров или аргументов конфигурации. Хорошие абстракции, как и хороший код в целом, не мешают вам выполнять свою работу. Он представляет собой полезный инструмент, который позволяет вам выразить то, что необходимо сделать, а не препятствие, которое необходимо преодолеть. Всегда есть элемент обучения, но если вы регулярно боретесь со своим кодом, он будет слишком навязчивым.
Хороший дизайн - это честный
« Это не делает продукт более инновационным, мощным или ценным, чем он есть на самом деле. Он не пытается манипулировать потребителем невыполнимыми обещаниями. ”
Приходилось ли вам когда-нибудь работать с новой базой кода, на создание которой уходили месяцы? Навигация по непонятным, неясным или тупым шаблонам и практикам, которые, казалось бы, требуют секретных знаний магических заклинаний, чтобы заставить вещи работать? Я испытываю гораздо чаще, чем мне хотелось бы признаться. Очень часто в наших попытках упростить все, что мы в конечном итоге делаем, - это создание магии. Магия - враг хорошего дизайна. Он привлекает внимание к себе, а не к работе. Это форма заблуждения и обмана, активно препятствующих пониманию происходящего под видом продуктивности. Это ложь. Честному кодексу можно следовать. Он ведет от одного звонка к другому. Нечестный код маскирует свою функциональность за этапами сборки, созданными файлами и побочными эффектами. Нечестный код удобен-волнист.
Хороший дизайн долговечен
« Он избегает быть модным и поэтому никогда не выглядит устаревшим. В отличие от модного дизайна, он длится долгие годы - даже в сегодняшнем обществе одноразового использования. ”
У нас проблема с дисциплиной. Мы одержимы новым и ярким. Что такое новый фреймворк, библиотека, паттерн? Мы гонимся за этими вещами, как если бы это был воздух, которым дышим, но мало о них думаем. Мы передаем свое мышление лидерам мнений или крупным организациям. Кажется, что усталость от фреймворков JavaScript несколько в последнее время поутихла, но не так уж редко полные переписывания в новых технологиях происходили почти ежегодно.
Продукты меняются. Бизнес нуждается в изменении. Это данность. Код, который мы пишем, должен строить это ожидание с самого начала. Наша архитектура, философия, паттерны и принципы не должны меняться под воздействием рыночных ветров, они должны быть способны их приспосабливать. Как это ни парадоксально, код, оптимизированный для изменений, должен меняться реже, чем код, не ожидающий изменений. Если задуматься, это очевидно. Если мы ожидаем изменений, мы делаем меньше жестких предположений. Поскольку предположения неизбежно меняются, код уже может адаптироваться к ним без предварительного разрушения основ. Долговечный код построен с учетом регулярно меняющихся предположений.
Хороший дизайн продуман до мелочей
« Ничто не должно быть произвольным или оставленным на волю случая. Внимательность и аккуратность в процессе разработки демонстрируют уважение к потребителю. ”
Намерение и цель во всем - вызов. Есть столько же способов завершить код, сколько инженеров. Для написания хорошо продуманного кода недостаточно знать, что словари, кортежи, карты, связанные списки и деревья являются структурами данных. Также нужно уметь выбрать лучший в зависимости от обстоятельств. Кроме того, нужно уметь сформулировать, почему это лучший выбор.
«Если вы не можете объяснить это шестилетнему ребенку, вы сами этого не понимаете». - Альберт Эйнштейн
Вы импортируете библиотеку или пишете свою? Почему именно этот образец, а не тот? Вы используете точку с запятой или полагаетесь на автоматическую вставку точки с запятой? Вы принимаете значения по умолчанию для вашего модуля форматирования кода? Вы знаете, почему они по умолчанию? Вы знаете, что применяется? Хорошо продуманный код не является произвольным. Это намеренно от его архитектуры до его форматирования. Нет ничего плохого в том, чтобы принять значения по умолчанию, если вы знаете, что это за значения по умолчанию и почему они есть.
Чем больше людей задействовано, тем сложнее становится это задание. Больше людей неизбежно ведет к противоречивым точкам зрения. Практически никогда не бывает «правильного» выбора, есть только компромиссы. Преднамеренные решения признают компромиссы и делают выбор с широко открытыми глазами.
Хороший дизайн экологичен
Дизайн вносит важный вклад в сохранение окружающей среды. Это экономит ресурсы и сводит к минимуму физическое и «визуальное загрязнение на протяжении всего жизненного цикла продукта. ”
Конечно, сам код является полностью цифровым, но код предназначен для выполнения, и за это выполнение приходится платить. Мало того, затраты распределяются неравномерно. Серверы должны быть запущены, что требует сильного охлаждения. Код загружается в браузеры через сети с разной скоростью и надежностью - часто по прямой цене за МБ по сравнению с тем, кто его загружает. Хорошо спроектированный код учитывает эти затраты
Также следует учитывать визуальное загрязнение. Это шум, окружающий сигнал. Как упоминалось ранее, код читается гораздо чаще, чем пишется. Чем плотнее общение, тем лучше. Там, где много информации, не относящейся к делу или которую можно легко извлечь из контекста, возникает шум. Шум отвлекает нас от сообщения, логики кода, который мы пытаемся понять. Следовательно, хорошо разработанный код - это хорошо организованный код. Хорошо разработанный код аннотируется комментариями или типами только там, где это необходимо, и ровно столько, сколько необходимо. Разумно выбирать модели, которые максимизируют общение и сводят к минимуму отвлекающие факторы. Декларативный код - это плотное общение, императивный код - это шумное общение. «Отвези меня в аэропорт» передает водителю Uber ту же информацию, что и длинный список пошаговых инструкций.
Хороший дизайн - это как можно меньше дизайна
« Меньше, но лучше - потому что он концентрируется на важных аспектах, а продукты не обременены второстепенным. Назад к чистоте, к простоте. ”
E=MC²
Уравнение эквивалентности массы и энергии Эйнштейна, несомненно, просто. Он красивый, элегантный, функциональный и понятный. Это все потому, что он описывает свое намерение самым простым способом, но при этом остается завершенным. Нет if
заявлений. Никаких switch
операторов, временных переменных или состояния. Это настолько просто, что ребенок может это понять, но для того, чтобы это понять, потребовался один из самых ярких умов 20-го века.
Простое - трудное. Но это тоже красиво. Хорошо продуманный код прост. Чтобы прийти к этому, требуются размышления, переработка, рефакторинг и безжалостное устранение ненужного. Но, оказавшись там, проблема, которую решает код, была переработана до самой сути. Это полно.