Читаемый код: принципы именования, форматирования и стиля

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

Особенно сильно это прочувствовалось, когда я наткнулся на модуль, написанный коллегой. Переменные с именами a, b, tmp1, тройные вложенные циклы без единого комментария и логика, размазанная по сотням строк. Мне понадобилось три дня, чтобы просто понять, что там происходит, и переписать всё так, чтобы это можно было поддерживать. Это не просто неудобно — это дорого, и это реальная боль.

В этой статье я разберу три фундаментальные вещи, которые делают код читаемым: именование, форматирование и стиль. Это не просто «правила для галочки» из Style Guide. Это инструменты, которые позволяют вам писать код, который легко поддерживать, легко тестировать и легко передавать другим разработчикам. Мы посмотрим на конкретные примеры, типовые ошибки и практические советы, которые вы сможете применить сразу же, даже если вы пишете свой первый проект на Python или JavaScript.

Читаемый код — это код, который понимает не только тот, кто его написал, но и любой другой человек, зашедший в проект. В мире, где разработчики меняются, команды растут, а проекты живут годами, это критически важно.

Почему читаемость кода важнее, чем вы думаете

Хочется сразу прояснить главный момент: код пишется для людей, а не для компилятора. Компьютеру не важно, как вы назвали переменную, где поставили пробелы и используете ли вы else вместо if not. Ему важно только, чтобы инструкция была выполнена. Но человеку критически важно понимать, что эта инструкция делает и зачем она там нужна.

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

  • Когда возвращаетесь к старому проекту, чтобы исправить баг;
  • Когда коллега просит помочь разобраться в логике модуля;
  • Когда пишете тесты и нужно понять, что именно проверять;
  • Когда проводите рефакторинг и заменяете часть логики.

Если код нечитаемый, каждое такое действие превращается в квест. Вы начинаете догадываться, что делает переменная x, пытаетесь по имени функции calc() восстановить логику, и в итоге рискуете внести ошибку, потому что контекст был понят неверно. Я не раз ловил себя на том, что после рефакторинга чужого «творчества» я случайно ломал смежную функциональность — просто потому, что не мог до конца прочитать намерения автора.

Стоимость нечитаемого кода

С точки зрения бизнеса нечитаемый код — это прямые убытки, которые нарастают снежным комом. Вот как это проявляется на практике:

  1. Резкое увеличение времени разработки. Если разработчик не может быстро въехать в код, он тратит часы на анализ вместо реализации новых функций. Это время оплачивается, но не приносит ценности продукту.
  2. Постоянный риск багов. Непонятный код провоцирует ошибки. Вы меняете одну строку, не осознавая, как она влияет на остальную систему, и всё разваливается. Я не раз наблюдал, как правка в одном месте ломала отчётность в другом — и виной тому была невнятная связность, замаскированная «грязным» кодом.
  3. Сложность найма и онбординга. В компанию с нечитаемым легаси сложно заманить толковых специалистов. Они приходят, открывают репозиторий, ужасаются и либо увольняются через месяц, либо остаются, но их продуктивность месяцами остаётся на нуле.
  4. Проблемы с масштабным рефакторингом. Без чистого кода невозможно безопасно обновлять систему. Рефакторинг превращается в ручной и крайне рискованный процесс, в ходе которого команда боится трогать «священные коровы».

Формула простая: Читаемый код = Быстрая разработка + Низкий риск ошибок + Лёгкая поддержка. Это инвестиция, которая окупается сторицей.

Интент читателя: что вы получите из этой статьи

Если вы читаете эту статью, скорее всего, перед вами стоят такие задачи:

  • Научиться писать код, который легко читать и понимать сходу;
  • Разобраться, как правильно именовать переменные, функции и классы, чтобы имя раскрывало суть;
  • Узнать, какие правила форматирования делают код визуально чистым и удобным для навигации;
  • Освоить принципы стиля, которые помогают писать единообразно в рамках всей команды;
  • Избежать типовых ошибок, делающих код «грязным» и трудным для поддержки.

Мы не ограничимся перечислением правил из PEP 8 или Google Style Guide. Я объясню, почему эти правила работают, приведу примеры из реальной практики и дам конкретные инструменты, которые вы сможете внедрить хоть сегодня. Дальше вас ждут таблицы сравнений «плохо/хорошо», чек-листы для самопроверки и честные ответы на частые вопросы.

Принципы именования: как называть переменные, функции и классы

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

Общие правила именования

Прежде чем погружаться в детали по каждому типу элементов, давайте зафиксируем универсальные принципы:

  1. Осмысленность. Никаких левых сокращений. user всегда лучше, чем usr, а calculate_total понятнее, чем calc.
  2. Смысл вместо типа. Переменная users_list кричит о том, что это список, но если контекст и так ясен, users достаточно. Не нужно городить my_list_of_users.
  3. Однозначность. Избегайте имён, которые могут означать что угодно. Я видел десятки багов из-за переменной data, которая в одном месте хранила заказ, в другом — пользователя, а в третьем — вообще json-строку.
  4. Английский язык. Даже если вся команда русскоязычная, код — на английском. Это индустриальный стандарт, и все инструменты заточены под него.
  5. Согласованность. Если в проекте принят 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");

Именование функций

Функции выполняют действия, поэтому их имя должно быть глаголом, который отвечает на вопрос «Что делает?». Я не устаю повторять это на ревью: функция — это действие, и имя обязано его отражать.

Общие правила для функций

  1. Имя — глагол. get_user, calculate_total, send_email — сразу понятно, что происходит.
  2. Краткость при полноте. get_user_by_id_from_database_table — перебор. get_user или find_user обычно достаточно.
  3. Отражение результата. Для функций, возвращающих данные, используйте get_, find_, fetch_. Для изменяющих состояние — set_, update_, create_, delete_.
  4. Не путайте с переменной. 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) {
    ...
}

Именование классов и модулей

Классы и модули описывают сущности и контейнеры логики, поэтому их имена — существительные, которые говорят «Что это?». Это аксиома объектно-ориентированного проектирования.

Общие правила

  1. Имя — существительное. User, Order, Database — это объекты или понятия предметной области.
  2. Краткость и полнота. Не пишите UserClass или OrderObject. Достаточно User и Order.
  3. Отражение сути. Если класс отвечает за управление заказами, назовите его OrderManager. Если он просто хранит данные — Order.
  4. Модули. Имена модулей описывают содержимое: 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 {
}

Форматирование кода: пробелы, отступы и структура

Форматирование — это визуальный слой кода. Хорошее форматирование делает код удобным для чтения, быстро выявляет ошибки структуры и помогает мозгу не отвлекаться на визуальный шум. Это не просто «красиво», это функционально. Когда я на код-ревью вижу сбитые отступы или отсутствие пробелов вокруг оператора, у меня сразу возникает вопрос: «А автор вообще думал о том, кто будет это читать?»

Общие правила форматирования

  1. Отступы (indentation). Показывают вложенность. В Python они синтаксически обязательны, в других языках — негласный стандарт.
  2. Пробелы (spaces). Разделяют логические элементы и повышают читаемость. Без них всё сливается в кашу.
  3. Пустые строки (blank lines). Группируют логические блоки и дают глазу передышку.
  4. Выравнивание. Когда аргументы функций или списки выровнены аккуратно, это резко упрощает восприятие.
  5. Длина строки. Длинные строки заставляют скроллить по горизонтали и убивают концентрацию. Старайтесь укладываться в 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

Принципы стиля кода: единообразие, простота и логика

Стиль — это свод договорённостей, которые делают код предсказуемым. Когда весь проект написан в одном стиле, я могу открыть любой файл и мгновенно понять его структуру, даже не вчитываясь в логику. Это гигантская экономия времени и нервов.

Общие правила стиля

  1. Единообразие. Один стиль на весь проект. Никакой самодеятельности в отдельных файлах.
  2. Простота. Не умничайте. Если задачу можно решить в лоб без ущерба для ясности — решайте в лоб.
  3. Логичность. Код должен следовать естественному ходу мыслей. Если я читаю функцию и вынужден постоянно перепрыгивать туда-сюда — стиль нарушен.
  4. Комментарии. Они дополняют код там, где намерения не очевидны. Но не дублируют его.
  5. Тесты. Хотя тесты напрямую не про стиль, они — часть культуры чистого кода. Хорошие тесты документируют ожидаемое поведение.

Единообразие стиля

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

Типовые ошибки с единообразием

Плохо Почему плохо Хорошо Почему хорошо
В одном файле отступы 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 символов)?
  • Все отступы единообразные в файле?

Чек-лист: Стиль

  • Все имена единообразны в проекте?
  • Все условия простые?
  • Все строки короткие?
  • Все циклы простые?
  • Все комментарии минимальные?
  • Все комментарии объясняют код?
  • Все комментарии в начале строки?