Как читать чужой код и понимать его: гайд, как не разбить экран компьютера
Рассказываем, как поймать дзен, сесть за компьютер и спокойно разобраться в чужом коде. Ну, или в своем.
1К открытий6К показов

Представьте себе ситуацию: вы пришли в новую компанию, и вам сказали переписать чужой код. Ну, по крайней мере, сделать так, чтобы он работал. И вот вы сидите, ухватившись руками за голову, и пытаетесь понять, что делает эта функция и зачем нужна эта кнопка. Еще хуже — если нет документации. Рано или поздно с этим сталкиваются почти все прогеры, но без паники: прочесть, а, главное, понять чужой код — задача сложная, но выполнимая.
Разбираться в чужом коде — очень крутой навык, поскольку в нем вы можете найти новые приемы и подходы, посмотреть на логику решения конкретной задачи (можете сравнивать со своей), плюс быстрее адаптироваться к процессам в компании.
В статье расскажем, как читать чужой код без стресса, а еще рассмотрим типичные ошибки и посоветуем крутые лайфхаки.
Разбираемся на практике
Поскольку автор этой статьи — филолог по образованию и айтишник в душе, мы не придумали ничего лучше, чем создать код для библиотечной системы. Проект довольно сложный, поскольку в нем много файлов. В общем, давайте копаться.
Структура проекта:
Library_project/
├── Library/
│ ├── models/
│ │ ├── book.py
│ │ └── catalog.py
│ ├── utils/
│ │ ├── search.py
│ │ └── reports.py
│ └── tests/
│ └── test_catalog.py
└── main.py
Код проекта:
Представление о проекте есть, а теперь давайте по шагам читать чужой код.
Шаг 1: Поймите, что в принципе делает код
Первое, что нужно сделать при анализе чужого кода — понять его цель. Вместо того, чтобы сразу погружаться в реализацию, начните с конца: что делает программа и какую проблему она решает?
Давайте посмотрим на файл main.py:
Из него понимаем, что:
- Проект связан с библиотекой (судя по названию модуля);
- Есть тестовый сценарий, в котором видно основную функциональность;
- Код организован в пакеты и модули.
Если запустим тесты, увидим следующее:
Теперь мы знаем, что система как минимум умеет:
- Выдавать книги;
- Искать книги по названию;
- Показывать статус.
Шаг 2: Изучите общую структуру кода
Когда вы поняли, что делает программа, нужно разобраться в ее архитектуре, и здесь важно задавать правильные вопросы:
Вопрос 1: Как организованы данные?
Помним, что у проекта есть четкая структура:
Library_project/
├── Library/
│ ├── models/
│ │ ├── book.py # Данные о книгах
│ │ └── catalog.py # Управление каталогом
│ ├── utils/
│ │ ├── search.py # Поиск
│ │ └── reports.py # Генерация отчетов
│ └── tests/
│ └── test_catalog.py # Тесты
└── main.py # Точка входа в приложение
Она говорит нам о том, что:
- Данные о книгах и каталоге разделены;
- Дополнительные функции лежат в отдельном модуле;
- Есть модуль для тестов;
- Система в целом следует принципам модульности.
Вопрос 2: Как взаимодействуют компоненты?
Посмотрим на импорты в catalog.py
:
Это показывает, что:
- Каталог зависит от класса Book;
- Приложение подтягивает даты (чтобы проверять сроки).
Вопрос 3: Какие главные операции выполняются в системе?
В классе LibraryCatalog
видим:
Отсюда понятно, что система может:
- Выдавать книги на конкретный срок;
- Возвращать книги;
- Делать поиск по каталогу.
Шаг 3: Изучите документацию и комментарии
При чтении чужого кода документация и комментарии — ваши лучшие друзья. Например:
Здесь мы видим docstring, который кратко описывает назначение класса. Более наглядный пример — метод borrow_book
из файла /models/catalog.py:
Шаг 4: Проанализируйте главную точку входа в программу
Точка входа — место, с которого начинается выполнение программы. В нашем случае это main.py, но давайте посмотрим внимательнее, на что он ссылается:
Из этого кода видно, что первым делом импортируются классы: LibraryCatalog
из файла /models/catalog.py, BookSearch
из файла /utils/search.py и класс ReportGenerator
из файла /utils/reports.py.
Далее — функция run_basic_tests
, в которой создается экземляр класса LibraryCatalog. В переменную status
записывается значение вызова метода borrow_book, который возвращает статус выдачи книги.
Затем выводится информация о тесте выдачи книги. По аналогии, в переменные search_results
, return_status
, overdue_report
записываются значения вызова методов search_by_title
, return_book
и generate_overdue_report
соответственно.
Шаг 5: Определите ключевые функции и классы
В любом проекте есть основные компоненты, вокруг которых строится вся логика. В нашем случае это:
LibraryCatalog — центральный класс. В нем реализованы основные методы управления библиотекой, такие как: добавление новой книги (add_book
), выдача книги читателю (borrow_book
), возврат книги в библиотеку (return_book
), получение списка всех выданных книг (get_borrowed_books
) и поиск книги (find_book
).
BookSearch — утилитный класс. В нем реализованы методы поиска книги по автору и по названию.
Шаг 6: Используйте инструменты IDE для навигации и анализа
В современных IDE есть мощные инструменты для анализа кода. Рассмотрим несколько основных на примере нашего «чужого» кода.
- Find Usages:
Здесь мы ищем метод borrow.book и видим, как он используется в тестах и других частях кода.
- Go to Definition — видим, как создается объект:
- Structure View — позволяет увидеть все методы и свойства классов в одном месте:
Шаг 7: Отладка и запуск — пошаговое выполнение кода
Один из лучших способов понять, как работает чужой код — пройтись по нему в отладчике.
С помощью отладчика можно видеть значения всех переменных на момент исполнения, проверять различные условия в реальном времени, а также понимать последовательность выполнения кода.
1. Установим breakpoint в методе borrow_book:
2. Запустим тест и пошагово посмотрим:
Этот скриншот показывает значения переменных:
3. Затем можно посмотреть пошаговое выполнение кода с помощью функций Step Over, Step Into, Step Out:
4. Теперь можно попробовать выдать 2 раза одну книгу разным людям и запустить отладку:
На этом скриншоте мы видим, что книга с этим id доступна для выдачи. Продолжим выполнять код, нажимаем на кнопку Resume Program:
Теперь мы можем увидеть, что книга уже была выдана. То же самое появляется и в выводе при завершении программы. Так мы пошагово отслеживаем проверку выдачи книги и изменение статуса ее доступности. В общем, полезная штука, если в коде сложная логика, плюс можно найти потенциальные проблемы.
Несколько советов, чтобы не сойти с ума, читая чужой код
Рисуйте диаграммы
Будущая версия вас обязательно скажет спасибо за то, что этот хаос переменных и циклов вы оформили в виде понятной схемы — что, зачем и куда ведет; а еще оставляли комментарии типа «Вот это не трогай, оно тебя сожрет». На самом деле, визуально представлять чужой код — огромный плюс, особенно если вам потом придется работать над ним вместе с коллегами.
Создайте мини-документацию для себя
Представьте, что ведете личный дневник по горячим следам. Если в коде вы наткнулись на нечто неочевидное, сделайте краткую запись: что это за модуль, зачем он тут, и как он связан с другими частями. Через неделю, когда вы снова откроете проект, сами себе скажете: «Ого, какой я молодец, всё прописал!».
Не пытайтесь понять весь код целиком
Если вы считаете, что сядете и поймете весь код за один присест — пересчитайте. Это наш код с библиотекой не такой мудреный, а бывают и проекты, где десятки файлов, подключение API и сотни циклов. Даже опытные разработчики начинают с малого: выбирают один модуль, функцию или файл, и разбираются в них, а уже потом переходят к остальному.
Оставайтесь в контексте
Если вы изучаете код без понимания, где и как он применяется, это всё равно что настраивать выключенный монитор. Понять контекст можно через вопросы, например: «Что за проект? Какая целевая аудитория? Какие задачи решает этот код?». Например, вы понимаете, что этот модуль связан с оплатами, значит, нужно разобраться, как работает система транзакций.
Не забывайте про библиотеки
Если в чужом коде много сторонних библиотек и фреймворков, о которых вы могли даже не слышать, обязательно их изучите — именно здесь появляется много багов. И в целом, узнавать новые инструменты — полезно и весело, поскольку они могут выполнять за вас большую часть работы.
Поздравляем, вы прошли игру. Читать чужой код — практически искусство. Самое важное помнить, что миллионы разработчиков по всему миру с вами в одной лодке. Рассказывайте в комментах, какие проблемы возникали у вас при чтении чужого кода.
Кстати! Хочешь разбираться в коде быстрее и эффективнее? Собрали для тебя полезные советы тут.
1К открытий6К показов