Когда я только начинал программировать, я был уверен: если код запускается и делает то, что нужно, — работа сделана. Но через пару лет работы в реальных проектах я понял, насколько ошибался. Оказалось, что код, который невозможно прочитать, — это мина замедленного действия.
Особенно сильно это прочувствовалось, когда я наткнулся на модуль, написанный коллегой. Переменные с именами a, b, tmp1, тройные вложенные циклы без единого комментария и логика, размазанная по сотням строк. Мне понадобилось три дня, чтобы просто понять, что там происходит, и переписать всё так, чтобы это можно было поддерживать. Это не просто неудобно — это дорого, и это реальная боль.
В этой статье я разберу три фундаментальные вещи, которые делают код читаемым: именование, форматирование и стиль. Это не просто «правила для галочки» из Style Guide. Это инструменты, которые позволяют вам писать код, который легко поддерживать, легко тестировать и легко передавать другим разработчикам. Мы посмотрим на конкретные примеры, типовые ошибки и практические советы, которые вы сможете применить сразу же, даже если вы пишете свой первый проект на Python или JavaScript.
Читаемый код — это код, который понимает не только тот, кто его написал, но и любой другой человек, зашедший в проект. В мире, где разработчики меняются, команды растут, а проекты живут годами, это критически важно.
Почему читаемость кода важнее, чем вы думаете
Хочется сразу прояснить главный момент: код пишется для людей, а не для компилятора. Компьютеру не важно, как вы назвали переменную, где поставили пробелы и используете ли вы else вместо if not. Ему важно только, чтобы инструкция была выполнена. Но человеку критически важно понимать, что эта инструкция делает и зачем она там нужна.
В современной разработке время, потраченное на чтение и осмысление кода, часто в разы превышает время, затраченное на его написание. Вы пишете функцию один раз, но читаете её десятки, сотни, иногда тысячи раз:
- Когда возвращаетесь к старому проекту, чтобы исправить баг;
- Когда коллега просит помочь разобраться в логике модуля;
- Когда пишете тесты и нужно понять, что именно проверять;
- Когда проводите рефакторинг и заменяете часть логики.
Если код нечитаемый, каждое такое действие превращается в квест. Вы начинаете догадываться, что делает переменная x, пытаетесь по имени функции calc() восстановить логику, и в итоге рискуете внести ошибку, потому что контекст был понят неверно. Я не раз ловил себя на том, что после рефакторинга чужого «творчества» я случайно ломал смежную функциональность — просто потому, что не мог до конца прочитать намерения автора.
Стоимость нечитаемого кода
С точки зрения бизнеса нечитаемый код — это прямые убытки, которые нарастают снежным комом. Вот как это проявляется на практике:
- Резкое увеличение времени разработки. Если разработчик не может быстро въехать в код, он тратит часы на анализ вместо реализации новых функций. Это время оплачивается, но не приносит ценности продукту.
- Постоянный риск багов. Непонятный код провоцирует ошибки. Вы меняете одну строку, не осознавая, как она влияет на остальную систему, и всё разваливается. Я не раз наблюдал, как правка в одном месте ломала отчётность в другом — и виной тому была невнятная связность, замаскированная «грязным» кодом.
- Сложность найма и онбординга. В компанию с нечитаемым легаси сложно заманить толковых специалистов. Они приходят, открывают репозиторий, ужасаются и либо увольняются через месяц, либо остаются, но их продуктивность месяцами остаётся на нуле.
- Проблемы с масштабным рефакторингом. Без чистого кода невозможно безопасно обновлять систему. Рефакторинг превращается в ручной и крайне рискованный процесс, в ходе которого команда боится трогать «священные коровы».
Формула простая: Читаемый код = Быстрая разработка + Низкий риск ошибок + Лёгкая поддержка. Это инвестиция, которая окупается сторицей.
Интент читателя: что вы получите из этой статьи
Если вы читаете эту статью, скорее всего, перед вами стоят такие задачи:
- Научиться писать код, который легко читать и понимать сходу;
- Разобраться, как правильно именовать переменные, функции и классы, чтобы имя раскрывало суть;
- Узнать, какие правила форматирования делают код визуально чистым и удобным для навигации;
- Освоить принципы стиля, которые помогают писать единообразно в рамках всей команды;
- Избежать типовых ошибок, делающих код «грязным» и трудным для поддержки.
Мы не ограничимся перечислением правил из PEP 8 или Google Style Guide. Я объясню, почему эти правила работают, приведу примеры из реальной практики и дам конкретные инструменты, которые вы сможете внедрить хоть сегодня. Дальше вас ждут таблицы сравнений «плохо/хорошо», чек-листы для самопроверки и честные ответы на частые вопросы.
Принципы именования: как называть переменные, функции и классы
Именование — это сердце читаемости. Сильное имя переменной или функции рассказывает, что это и зачем, не заставляя лезть в реализацию. Плохое имя вынуждает гадать, а догадки в программировании — прямой путь к багам. Я не раз тратил на код-ревью львиную долю времени лишь на то, чтобы объяснить, почему usrLst — это не ок.
Общие правила именования
Прежде чем погружаться в детали по каждому типу элементов, давайте зафиксируем универсальные принципы:
- Осмысленность. Никаких левых сокращений.
userвсегда лучше, чемusr, аcalculate_totalпонятнее, чемcalc. - Смысл вместо типа. Переменная
users_listкричит о том, что это список, но если контекст и так ясен,usersдостаточно. Не нужно городитьmy_list_of_users. - Однозначность. Избегайте имён, которые могут означать что угодно. Я видел десятки багов из-за переменной
data, которая в одном месте хранила заказ, в другом — пользователя, а в третьем — вообще json-строку. - Английский язык. Даже если вся команда русскоязычная, код — на английском. Это индустриальный стандарт, и все инструменты заточены под него.
- Согласованность. Если в проекте принят
get_user, не должно появлятьсяfetchUserгде‑то рядом. Выберите один стиль и следуйте ему фанатично.
Именование переменных
Переменные хранят данные, и их имя должно сразу отвечать на вопрос «Что здесь лежит?». Казалось бы, тривиально, но на практике я постоянно сталкиваюсь с нарушением этого правила.
Типовые ошибки при именовании переменных
| Плохо | Почему плохо | Хорошо | Почему хорошо |
|---|---|---|---|
a, b, x, y |
Слишком общие, не несут смысловой нагрузки | user_id, max_price |
Чётко описывают, что хранится |
tmp, data, info |
Неоднозначные: непонятно, что именно | temp_user, user_data, error_info |
Конкретные и понятные сходу |
my_list, my_string |
«Мой» не добавляет смысла, тип не важен в имени | users, username |
Короткие, но осмысленные |
is_valid_user_name |
Слишком длинное, можно смело сократить | is_valid (если контекст понятен) |
Кратко и ясно |
userList (в Python) |
Нарушение стиля (snake_case) | user_list |
Соответствует стилю языка |
Практические советы
- Префиксы/суффиксы для коллекций. Если переменная хранит список, смело используйте суффикс
_list(Python) илиList(Java/C#). Но не переусердствуйте: если из контекста ясно, чтоusers— это коллекция, лишнее слово только загромождает код. - Булевы переменные. Префиксы
is_,has_,can_мгновенно дают понять, что перед нами флаг. Например,is_active,has_permission,can_edit— я сразу вижу, что вернётся true/false. - Не пересекайтесь с типами. Например,
list— это встроенный тип в Python; не используйте его как имя переменной. Лучшеitems_listили простоitems. - Временные переменные могут быть краткими (
temp), если живут в пределах одного блока и их смысл очевиден. Но если они хранят важные промежуточные данные, дайте им осмысленное имя —temp_user_data.
Примеры именования переменных в разных языках
Python (snake_case):
user_name = "Alex"
max_retry_count = 5
is_active = True
user_list = ["alice", "bob"]
JavaScript (camelCase):
let userName = "Alex";
let maxRetryCount = 5;
let isActive = true;
let userList = ["alice", "bob"];
Java/C# (camelCase):
String userName = "Alex";
int maxRetryCount = 5;
boolean isActive = true;
List<String> userList = Arrays.asList("alice", "bob");
Именование функций
Функции выполняют действия, поэтому их имя должно быть глаголом, который отвечает на вопрос «Что делает?». Я не устаю повторять это на ревью: функция — это действие, и имя обязано его отражать.
Общие правила для функций
- Имя — глагол.
get_user,calculate_total,send_email— сразу понятно, что происходит. - Краткость при полноте.
get_user_by_id_from_database_table— перебор.get_userилиfind_userобычно достаточно. - Отражение результата. Для функций, возвращающих данные, используйте
get_,find_,fetch_. Для изменяющих состояние —set_,update_,create_,delete_. - Не путайте с переменной.
user— переменная,get_user— функция. Разница должна быть очевидна.
Типовые ошибки при именовании функций
| Плохо | Почему плохо | Хорошо | Почему хорошо |
|---|---|---|---|
do_stuff, process |
Неясно, что именно делается | calculate_total, send_email |
Действие чётко определено |
get, set |
Слишком общие, непонятен объект | get_user, set_password |
Конкретные и понятные |
handle_user, manage_data |
Абстрактные, не раскрывают результат | validate_user, update_data |
Ясно, что произойдёт |
processUser, handleData (в Python) |
Нарушение snake_case | process_user, handle_data |
Стиль языка соблюдён |
is_user_valid |
Это имя переменной, не функции | validate_user |
Глагол чётко задаёт действие |
Практические советы
- Группировка префиксами. Если много функций работает с сущностью «пользователь», используйте единый префикс:
get_user,update_user,delete_user. Это формирует естественное пространство имён и снижает когнитивную нагрузку. - Булевы функции. Если функция возвращает булево значение, начинайте имя с
is_,has_илиcan_:is_valid_user,has_permission,can_edit. Читается как вопрос, и это прекрасно. - Избегайте конфликтов с типами. Не используйте
listкак имя функции, если это встроенный тип. Взгляните наget_listилиcreate_list. - Боязнь длинных имён. Если функция выполняет сложное составное действие, длинное имя оправдано.
process_user_registrationлучше, чем загадочноеproc.
Примеры именования функций
Python:
def get_user(user_id):
...
def calculate_total(price, quantity):
...
def is_valid_email(email):
...
JavaScript:
function getUser(userId) {
...
}
function calculateTotal(price, quantity) {
...
}
function isValidEmail(email) {
...
}
Именование классов и модулей
Классы и модули описывают сущности и контейнеры логики, поэтому их имена — существительные, которые говорят «Что это?». Это аксиома объектно-ориентированного проектирования.
Общие правила
- Имя — существительное.
User,Order,Database— это объекты или понятия предметной области. - Краткость и полнота. Не пишите
UserClassилиOrderObject. ДостаточноUserиOrder. - Отражение сути. Если класс отвечает за управление заказами, назовите его
OrderManager. Если он просто хранит данные —Order. - Модули. Имена модулей описывают содержимое:
user_module,order_module.
Типовые ошибки
| Плохо | Почему плохо | Хорошо | Почему хорошо |
|---|---|---|---|
Class1, Class2 |
Неясно, что это | User, Order |
Конкретные и понятные |
MyClass, MyObject |
«Мой» не несёт смысла | User, Order |
Чистые имена сущностей |
user_class, order_object (Python) |
Стиль snake_case, а для классов нужен CamelCase | User, Order |
Соответствует стилю языка |
UserManager, OrderHandler (если класс просто хранит данные) |
Избыточно; лишние ролевые суффиксы | User, Order |
Простота и ясность |
Примеры
Python:
class User:
pass
class OrderManager:
pass
JavaScript:
class User {
}
class OrderManager {
}
Форматирование кода: пробелы, отступы и структура
Форматирование — это визуальный слой кода. Хорошее форматирование делает код удобным для чтения, быстро выявляет ошибки структуры и помогает мозгу не отвлекаться на визуальный шум. Это не просто «красиво», это функционально. Когда я на код-ревью вижу сбитые отступы или отсутствие пробелов вокруг оператора, у меня сразу возникает вопрос: «А автор вообще думал о том, кто будет это читать?»
Общие правила форматирования
- Отступы (indentation). Показывают вложенность. В Python они синтаксически обязательны, в других языках — негласный стандарт.
- Пробелы (spaces). Разделяют логические элементы и повышают читаемость. Без них всё сливается в кашу.
- Пустые строки (blank lines). Группируют логические блоки и дают глазу передышку.
- Выравнивание. Когда аргументы функций или списки выровнены аккуратно, это резко упрощает восприятие.
- Длина строки. Длинные строки заставляют скроллить по горизонтали и убивают концентрацию. Старайтесь укладываться в 80–120 символов, а длинное разбивайте.
Отступы и вложенность
Отступы — это фундамент. Они дают мгновенную картину иерархии кода. К сожалению, я часто вижу файлы, где отступы гуляют, и это превращает чтение в пытку.
Типовые ошибки с отступами
| Плохо | Почему плохо | Хорошо | Почему хорошо |
|---|---|---|---|
| Отсутствие отступов | Границы блоков не читаются | 4 пробела (Python) или 2 пробела (JS) | Вложенность очевидна |
| Отступ 1 пробел | Слишком мелко, глаз срывается | 4 пробела (Python) | Оптимально для чтения |
| Отступ 8 пробелов | Слишком широко, код уползает вправо | 4 пробела (Python) | Баланс компактности и читаемости |
| Разные отступы в одном файле | Хаос, непонятно, какой код к какому блоку относится | Единый размер отступа в файле | Структурированность |
Практические советы
- Стандартные размеры. Python — только 4 пробела. JavaScript — 2 пробела. Java/C# — 4 пробела. Не отходите от этого, даже если «так красивее».
- Никаких табов. Табы отображаются по‑разному в разных редакторах. Используйте пробелы и настройте IDE на вставку пробелов при нажатии Tab.
- Автоформатирование. В VS Code, PyCharm, IntelliJ IDEA есть встроенные форматтеры. Настройте их на стандарт команды и привыкайте жать Ctrl+Shift+L (или аналоги) перед коммитом. Это снимает кучу споров на ревью.
- Разбивка длинных строк. Если строка выходит за лимит, разбивайте её логически: после запятой, перед оператором. Так код остаётся читаемым и не требует горизонтальной прокрутки.
Примеры отступов
Python:
def example():
if condition:
do_something()
if another_condition:
do_more()
JavaScript:
function example() {
if (condition) {
doSomething();
if (anotherCondition) {
doMore();
}
}
}
Пробелы и операторы
Пробелы вокруг операторов — это как знаки препинания в тексте: без них фраза превращается в невнятный поток. Правильно расставленные пробелы делают код «дышащим».
Типовые ошибки с пробелами
| Плохо | Почему плохо | Хорошо | Почему хорошо |
|---|---|---|---|
a=b+c |
Нет пробелов, всё слиплось | a = b + c |
Операторы визуально разделены |
if(a==b) |
Пробелы вокруг скобок и условия отсутствуют | if (a == b) |
Условие чётко отделено |
func(a,b) |
Нет пробела после запятой | func(a, b) |
Аргументы легко читаются |
list=[1,2,3] |
Нет пробелов вокруг присваивания и в списке | list = [1, 2, 3] |
Визуальная ясность |
Практические советы
- Вокруг операторов. Всегда ставьте пробелы вокруг
=,+,-,*,/,==,!=,>,<и т.д. - После ключевых слов.
if,for,while,function,class— после них пробел обязателен. - В вызовах функций. После запятой между аргументами ставьте пробел:
func(a, b). - В списках и литералах.
[1, 2, 3],{"key": "value"}— пробелы внутри скобок улучшают читаемость. - Не перебарщивайте. Не нужно окружать пробелами всё подряд. Например, в слайсах
a[1:2]пробелы перед двоеточием не ставятся. Следуйте руководству по стилю.
Примеры пробелов
Python:
if (user.age > 18 and user.has_permission):
result = calculate_total(price, tax)
JavaScript:
if (user.age > 18 && user.hasPermission) {
let result = calculateTotal(price, tax);
}
Пустые строки и структура
Пустые строки — это мощный инструмент группировки. Они разбивают код на логические параграфы, и читатель интуитивно понимает, где заканчивается одна мысль и начинается другая. Без них код превращается в монолитную стену текста.
Типовые ошибки с пустыми строками
| Плохо | Почему плохо | Хорошо | Почему хорошо |
|---|---|---|---|
| Отсутствие пустых строк | Логические блоки не разделены, трудно ориентироваться | Пустые строки между функциями, классами и разделами | Чёткая структура |
| Слишком много пустых строк (по 3–4 подряд) | Код «растягивается», глазам тяжело | 1–2 пустые строки между крупными блоками | Оптимальная плотность информации |
| Пустая строка внутри логического блока (например, между двумя тесно связанными строками) | Разрывает связанный код, сбивает с толку | Пустые строки только на границах блоков | Связные части остаются вместе |
Практические советы
- Между функциями и классами ставьте две пустые строки (Python) или одну (другие языки — смотрите style guide).
- Внутри функции одна пустая строка может отделить логические шаги: инициализацию, обработку, возврат.
- Перед комментарием, который относится к следующему блоку, уместно вставить пустую строку, чтобы визуально связать комментарий с этим блоком.
- Не дробите слишком мелко. Если блок состоит из трёх строк, не нужно окружать каждую строку пустыми строками.
Примеры пустых строк
Python:
class User:
def __init__(self, name):
self.name = name
def greet(self):
print(f"Hello, {self.name}")
def calculate_total(price, tax):
if price < 0:
raise ValueError("Price cannot be negative")
return price + tax
Принципы стиля кода: единообразие, простота и логика
Стиль — это свод договорённостей, которые делают код предсказуемым. Когда весь проект написан в одном стиле, я могу открыть любой файл и мгновенно понять его структуру, даже не вчитываясь в логику. Это гигантская экономия времени и нервов.
Общие правила стиля
- Единообразие. Один стиль на весь проект. Никакой самодеятельности в отдельных файлах.
- Простота. Не умничайте. Если задачу можно решить в лоб без ущерба для ясности — решайте в лоб.
- Логичность. Код должен следовать естественному ходу мыслей. Если я читаю функцию и вынужден постоянно перепрыгивать туда-сюда — стиль нарушен.
- Комментарии. Они дополняют код там, где намерения не очевидны. Но не дублируют его.
- Тесты. Хотя тесты напрямую не про стиль, они — часть культуры чистого кода. Хорошие тесты документируют ожидаемое поведение.
Единообразие стиля
Единообразие — это когда вы не замечаете стиль. Он настолько ровный, что мозг перестаёт отвлекаться на форматирование и сосредотачивается на сути. На практике я добивался этого только через автоматизацию.
Типовые ошибки с единообразием
| Плохо | Почему плохо | Хорошо | Почему хорошо |
|---|---|---|---|
| В одном файле отступы 2 пробела, в другом — 4 | Глаз постоянно перестраивается, читать тяжело | Единые отступы во всём проекте | Предсказуемость |
Где‑то fetch_user, где‑то getUser |
Неясно, разные ли это действия и почему разный стиль | Единый глагол и регистр для однотипных операций | Мгновенное узнавание |
Разное оформление комментариев: // vs /* */ как попало |
Захламляет визуальное восприятие | Единый стиль комментариев в проекте | Чистота и порядок |
| Произвольное использование пустых строк в разных модулях | Код выглядит неопрятно, трудно сравнивать файлы | Согласованные правила по пустым строкам | Профессиональный вид кодовой базы |
Практические советы
- Примите Style Guide. PEP 8 для Python, Google Style Guide для Java, Airbnb Style Guide для JavaScript — не выдумывайте велосипед. Это готовая проверенная база.
- Автоформаттеры в CI/CD. Настройте pre-commit хуки или шаги в пайплайне, которые проверяют форматирование. Если код не соответствует — сборка падает. Это жёстко, но дисциплинирует.
- Линтеры.
flake8,eslint,SonarQube— они не только следят за форматированием, но и ловят потенциальные баги и антипаттерны. - Team Agreement. Даже если вы выбрали готовый стайлгайд, обсудите в команде спорные моменты (длина строки, правила для react-компонентов и т.д.) и зафиксируйте в CONTRIBUTING.md.
Простота кода
Простота — это не примитивность, а умение выразить сложную логику ясными конструкциями. Простой код дебажится быстрее и реже содержит скрытые ошибки. Я часто вспоминаю принцип: «Если твой код кажется слишком хитрым, скорее всего, его можно упростить».
Типовые ошибки с простотой
| Плохо | Почему плохо | Хорошо | Почему хорошо |
|---|---|---|---|
| Многоуровневые вложенные тернарные операторы | Неясно, что условие вообще проверяет | Простое if-else | Очевидно при чтении |
| Строка с десятком вызовов методов в цепочке без переносов | Нечитаемая «колбаса» | Разбивка на отдельные шаги с промежуточными переменными | Каждый шаг понятен |
| Вложенные циклы ради обхода многомерного массива без объяснений | Трудно уловить логику обхода | Выделение вложенного цикла в функцию с понятным именем | Инкапсуляция сложности |
Избыточные комментарии // это счётчик |
Захламляют код, не несут пользы | Комментарии только там, где код неговорящий | Суть остаётся чистой |
Практические советы
- Дробите сложные условия. Если в
ifбольше двух частей, вынесите условие в отдельную функцию или переменную с красноречивым именем. Например,is_eligible_for_discountвместо тройногоif. - Короткие строки и методы. Если метод не умещается на экран — это кандидат на разбивку.
- Извлекайте вложенные циклы. Вынос внутреннего цикла в отдельную функцию делает верхний уровень потрясающе читаемым.
- Комментируйте «почему», а не «что». «Что» должно быть ясно из кода.
Логичность кода
Логичный код течёт как рассказ: подготовка данных, обработка, результат. Когда последовательность действий нарушена или перегружена, читатель теряет нить. Я не раз ловил джуниоров на том, что они сначала объявляют переменные, которые используются через 50 строк, — и это сбивает с толку.
Типовые ошибки с логичностью
| Плохо | Почему плохо | Хорошо | Почему хорошо |
|---|---|---|---|
| Переменная инициализируется в одном месте, а используется через сотню строк | Читатель должен держать в голове лишнее | Объявление максимально близко к использованию | Логика линейна |
| Серия вложенных if без чёткого основного потока | Неясно, какое условие главное | Ранний выход из функции (early return) | Поток очевиден |
| Избыточные флаги и состояния, которые дублируют друг друга | Путаница, баги из-за рассинхронизации | Одно каноничное состояние | Минимум когнитивной нагрузки |
| Мутация глобального состояния в разных концах модуля | Невозможно предсказать побочные эффекты | Явная передача данных через параметры | Прозрачность |
Практические советы
- Принцип наименьшего удивления. Код должен вести себя так, как ожидает читатель. Если не получается — добавьте комментарий, объясняющий, почему здесь нестандартное решение.
- Минимизируйте зону видимости. Переменные должны жить как можно ближе к месту использования.
- Early return. Вместо леса вложенных
ifпроверяйте крайние случаи в начале и выходите. Основной поток остаётся чистым. - Избегайте ненужного состояния. Каждый лишний флаг — потенциальный баг. Пересматривайте, действительно ли все переменные нужны.
Комментарии в коде
Комментарий — это палочка-выручалочка, когда код не может говорить сам за себя. Но он же может стать мусором, если дублирует очевидное. Я видел проекты, где комментарии занимали треть объёма файлов, и толку от них было ноль.
Типовые ошибки с комментариями
| Плохо | Почему плохо | Хорошо | Почему хорошо |
|---|---|---|---|
Комментарий // увеличиваем i на 1 к строке i++ |
Дублирует код, зашумляет | Нет комментария (код сам себя объясняет) | Чистота |
Комментарий // исправляем баг |
Не объясняет, что за баг и почему такое решение | Комментарий со ссылкой на задачу и пояснением неочевидного хака | Контекст сохранён |
| Закомментированный кусок кода «на всякий случай» | Захламляет файл, вызывает вопросы | Удаление мёртвого кода (он всегда останется в истории git) | Актуальность и порядок |
| Комментарий в середине длинной строки | Разрывает строку, читать неудобно | Комментарий над строкой или после её завершения | Строка читается цельно |
Практические советы
- Пишите «почему», а не «что». Если вы выбрали нестандартный алгоритм, объясните причину. Это бесценно при рефакторинге через полгода.
- Удаляйте мёртвый код. Не бойтесь: Git помнит всё. Закомментированные блоки только сбивают с толку новых разработчиков.
- Обновляйте комментарии. При изменении кода сразу правьте соответствующие комментарии. Устаревший комментарий опаснее его отсутствия.
- Используйте специальные метки.
TODO,FIXME,HACK— они помогают отделить временные решения от постоянных и легко ищутся по проекту.
Чек-лист для проверки читаемости кода
Чтобы убедиться, что ваш код не стыдно показать на ревью, пройдитесь по этому чек-листу. Я использую похожий список, когда обучаю джуниоров: он превращает абстрактные «пиши чисто» в конкретные измеримые пункты.
Чек-лист: Именование
- Все имена переменных, функций и классов осмысленные?
- Все имена на английском языке?
- Все имена однозначные?
- Все имена согласованы (один стиль в проекте)?
- Все имена переменных описывают смысл, а не тип?
- Все имена функций в форме действия (глаголы)?
- Все имена классов в форме существительного?
- Все имена модулей описывают их содержимое?
Чек-лист: Форматирование
- Все отступы стандартные (4 пробела в Python, 2 в JS)?
- Все пробелы вокруг операторов?
- Все пробелы после ключевых слов?
- Все пробелы в вызовах функций?
- Все пробелы в списках?
- Все пустые строки между логическими блоками?
- Все строки короткие (не больше 80 символов)?
- Все отступы единообразные в файле?
Чек-лист: Стиль
- Все имена единообразны в проекте?
- Все условия простые?
- Все строки короткие?
- Все циклы простые?
- Все комментарии минимальные?
- Все комментарии объясняют код?
- Все комментарии в начале строки?
