Як розібратися з чужим кодом?

Перехід на новий проєкт, код-рев’ю, міграція систем — в цих ситуаціях часто доводиться працювати з чужим кодом. Як в ньому розібратись? Які інструменти та методи допомагають швидше зрозуміти структуру та логіку незнайомого коду?

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Проблема зазвичай не в коді. Проблема зрозуміти яку саме задачу цей код вирішує і чому саме таким чином.
З кодом як таким допомагає працювати будь-яка сучасна IDE. Десь допоможуть AI інструменти якщо йдеться про технології та бібліотеки у яких в тебе небагато досвіду.

grep, зазвичай вистачає, плюс на гігабайтах коду працює швидко. Береш да читаєш чужий код, дивишся на історію комітів, ...

Просто сама задача «розібратися» виглядає неконструктивною... Зазвичай коду багато, розібрати можна хоч кожен рядок ядра Linux, але.... навіщо? Зазвичай у тебе є контект, який складається з декількох файлів, які ти просто читаєш. Цього досить для вирішення конкретної задачі.

задача «розібратися» виглядає неконструктивною

Так.
Під «розібратися» зазвичай мається на увазі якась проблема (не надто глобальна на кшталт «а давайте розпиляємо це на мікросервіси») яку треба вирішити. От таким шляхом сам онбордився на новий проект і людей онбордив.

Рішає виключно досвід, після 20+ років немає жодних проблем, а коли на здачу є нормальна IDE з копайлотом, то все стає звичайною рутиною

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

Видалити і написати свій. Не дякуйте.

У чому головна проблема розуміння? У обмеженості людської пам’яті. Я навіть це назвав «стек-пам’яті.»
«Стек» у середньої людини десь 7 позицій. Наприклад якщо на столі 10 предметів, у вас є хвилина їх роздивитися і потім назвати по пам’яті — то середня людина правильно пригадає десь 7. Тренована — може пригадати і 10.
Так само це працює і з кодом. Для розуміння строки коду, на яку зараз дивимось — потрібен контекст. Тобто: який це модуль, який клас, який метод, якщо ми всередині циклу — то якого, а може — двох, а може це рекурсія і таке інше. Умовно кажучи якщо у методі більше 7 вкладених блоків (if — else, for, case) то дивлячись код у найглибшому ми вже забуваємо щось з попереднього шляху — а отже неправильно розуміємо у якому випадку цей код буде виконуватись. Так само зі змінними: якщо інстанс класу міняється 7 разів — то далі ми вже не можемо точно пригадати що мінялося.
Тому уся теорія і практика мов програмування спрямована саме на обмеження складності — тобто контексту, який необхідно пам’ятати. Наприклад робимо 7 класів по 7 методів по 7 рядків у кожному. Ми не пам’ятаємо усе 7 методів чи 49 рядків — але нам достатньо пам’ятати назву класу аби розуміти що він робить. Тобто ми ховаємо унутрішню складність і залишаємо тільки зовнішній опис «чорного ящика».
Саме тому сучасний AI — найкорисніший інструмент для розуміння заплутаного коду. Бо він не обмежений 7 позиціями у стеку! Його можна запитати, наприклад, від яких вхідних даних і як буде залежати ціна. І він пройде по усім умовам, циклам, розгалуженням і збере до купи усе що впливає на ціну. Людині для цього скоріше за все потрібно було малювати складну схему та ходити туди-сюди по коду аби врахувати усі варіанти.
Але є нюанс: користь відповіді AI буде залежати від того, чи правильно він розуміє усі кроки. Наприклад якщо мова тільки про математичні операції — то відповідь буде максимально точна.
Але якщо, наприклад, він зустрічає метод який бере щось з таблиці у базі і додає ці данні у розрахунки? Яка інформація є у AI аби зрозуміти що відбувається? По-перше метод може називатися GetDiscountPerCount — і тоді можна здогадатися що отримані данні це знижка залежно від кількості товару. Можливо AI «бачить» структуру бази і розуміє що данні беруться з таблиці Discounts і там є поля Quantity та DiscountPercent. Але якщо це просто метод GetData і потім у формулі береться data[1]*data[2] то ніякий AI вам не здогадається що це саме знижка.
Отже проблема усіх сучасних «копайлотів» для девелоперів: якщо вони бачать увесь код аж до базових операцій — то вони можуть правильно доповісти що робить навіть заплутаний код. Якщо ж вони не бачать частину методів — то висновки можуть бути неповними або навіть хибними. Особливо якщо назви методів не відповідають тому, що вони насправді роблять.

Які інструменти та методи допомагають швидше зрозуміти структуру та логіку незнайомого коду?

Досвід?

Розбиратися з чужим кодом може бути складно, але є кілька стратегій і інструментів, які допоможуть прискорити цей процес:


  1. Документація
    • Читай документацію: Зазвичай проєкти мають README файли або інші документи, які пояснюють структуру і функціональність.
    • Коментарі в коді: Звертай увагу на коментарі, які можуть пояснити логіку та призначення конкретних частин коду.

  2. Структура проєкту
    • Ознайомся з ієрархією папок: Розглянь, як організовані файли і папки, щоб зрозуміти, які модулі чи компоненти є важливими.
    • Знайди основний вхідний файл: Це може бути файл, з якого починається виконання програми (наприклад, main.js, app.py).

  3. Інструменти
    • IDE: Використовуй інтегровані середовища розробки (напříklad Visual Studio Code, IntelliJ IDEA), які мають функції автодоповнення, навігації та пошуку по проєкту.
    • Дебагери: Використання дебагера допоможе вивчити потік виконання коду і зрозуміти, як дані передаються між функціями.

  4. Статичний аналіз
    • Linters та статичні аналізатори: Інструменти, такі як ESLint для JavaScript або Pylint для Python, можуть допомогти зрозуміти стиль і можливі проблеми в коді.
    • Графи залежностей: Інструменти, які генерують графи залежностей (наприклад, Webpack для JavaScript), можуть показати, як модулі взаємодіють між собою.

  5. Читання коду
    • Починай з маленьких частин: Не намагайся зрозуміти весь код відразу. Вибери одну функцію або клас і вивчай його логіку.
    • Став запитання: Якщо є можливість, запитай у команди або автора коду про певні частини, які викликають запитання.

  6. Практика
    • Зроби прості зміни: Спробуй внести невеликі зміни до коду, щоб подивитися, як це вплине на роботу програми.
    • Тестування: Якщо проєкт має тести, запусти їх, щоб зрозуміти, які частини коду відповідають за яку функціональність.

  7. Візуалізація
    • Графи та діаграми: Створюй візуальні схеми (наприклад, UML-діаграми) для кращого розуміння архітектури системи.

З часом, вивчаючи різні проєкти, ти розвиватимеш свою здатність швидко розбиратися в чужому коді. Удачі!

Підписатись на коментарі