Як читати тисячі рядків коду без будь-якої документації? [зачинено]


12

Раніше я шукав хороший контроль TimeLine для проекту WPF. Я знайшов відповідь в цьому , які направляють мене в цей проект CodePlex .

Тепер я хочу змінити код, щоб забезпечити мої потреби в культурі. Але є деякі невідповідності!

Моє запитання:

Як ви взаємодієте з такими тисячами рядків коду?

Редагувати:

Будь-який ярлик буде чудовим!


3
просити підвищення. це завжди допомагає. (вони можуть зробити мотиватор з цього приводу)
Відображайте ім'я

2
вдарившись головою об стіл, поки все не стане зрозумілим.
медуза

19
Як ви їсте слона? ... По одному укусі.
Білл

1
@Jalal Це те, що вони хочуть, щоб ти думав.
Mateen Ulhaq

2
@DisplayName, морквяний і паличний підхід до мотивації виявився поганим рішенням для будь-якої роботи, яка вимагає рудиментарних пізнавальних навичок. Наука про мотивацію є більш складною, ніж система винагород. Перевірте "Драйв: Дивовижна правда про те, що нас мотивує" Деном Розовим, це вражаюче прочитане. Або ознайомтеся з цим відео, яке ви знайдете для стислої версії. youtube.com/watch?v=u6XAPnuFjJc
Райан Тейлор

Відповіді:


37

Ви додаєте коментарі до вихідного коду, коли ви достатньо зрозуміли його, щоб мати можливість це зробити. Ці коментарі енергійно відновлюють, коли ви все більше розумієте.


3
+1 і один хороший спосіб - це фактично написати документацію під час перегляду вихідного коду. І навіщо повертати свій внесок до координаторів оперативної діяльності?

1
+1 Також якщо ви модифікуєте код, будьте впевнені, що ви також змінили свої коментарі, щоб майбутні покоління не плуталися з тим, що ви зробили. Соромно робити все, що є в документі, і люди його ненавиджу, бо це неправильно!
Майкл К

1
Якщо оригінальний проект знаходиться в розподіленій системі управління джерелами (наприклад, git), було б вигідно розкрутити його, ввести свої зміни поступово і робити це таким чином, щоб ви могли додатково об'єднати свої зміни пізніше до оригіналу

8
  1. Крок через код
  2. Перейменуйте за потребою
  3. Рефактор за потребою
  4. Повторіть, поки ви повністю не зрозумієте

... і код буде вам за це вдячний. ;-)


7
Зміна випадкових місць у виробничому коді лише тому, що це простіше, не дуже гарна ідея. Тільки запити функцій повинні викликати зміну коду, повторний факторинг - це запит на функцію. Незалежно від того, наскільки ви хороші, розбиття коду, іноді дурні побічні ефекти - це те, на що клієнти покладаються. Код лише для Refactor, в якому ви дуже впевнені. І пам’ятайте, навіть одиничні тести нічого не гарантують.
Кодер

Погоджено, але рефакторинг лише для того, щоб спробувати дизайн, може допомогти вам зрозуміти, чому код написаний таким, яким він є (або підтвердити, що ви правильні, що це робиться погано / дивно). Не потрібно зберігати ці зміни.
Рікі Кларксон

+1 Кодер. І ця відповідь наразі навіть не згадує одиничні тести. Страшно.
MarkJ

Вибачте, не означав капітального рефакторингу. Більше говорив про незначний рефакторинг, речі для очищення. Отже, зрештою, ви доходите до того, що мета коду очевидна.
Джон Макінтайр

5

Виконайте одну дію, налагодьте (знову і знову) код, щоб дізнатися, як виконана ця дія. Запишіть те саме простою мовою, щоб краще зрозуміти!


Я зазвичай це роблю, доки не стикаюся з проектом, який не може запуститися в режимі налагодження! Це завжди виходить з ладу під час запуску! :( Але він працює в режимі випуску: S
Afriza N. Arief

@afriza ЩО ФУК. Це якийсь серйозно поганий код, перевірте, які помилки він вам дає.
Daniel S

@afriza, перше, що потрібно виправити!

4

Щось, що Йоел Спольський написав ще колись у своєму блозі (зараз не можу знайти цю статтю) зі мною щодо цього:

Він сказав, що код не є природною людською мовою, але, як програмісти, ми легко вмовляємо собі думки про те, що це таке, і що ми повинні мати можливість читати його як таке. Отже, багато з нас дивляться на новий код і сподіваються, що зможуть просто «прочитати його» та зрозуміти його негайно, як ніби це блок тексту англійською мовою.

Тому я думаю, що головне - просто бути повільними, методичними та науковими. А як вже казали інші - коментуйте це (і навіть рефактор), як ви йдете. Не впадайте в думку «Я повинен просто подивитися на це і зрозуміти негайно».

О, і так, я все ще інколи потрапляю в цю пастку. "Робіть, як я кажу, не так, як я", і все це. :)


Справа в тому, що англійський текст, який ви можете "просто прочитати", як правило, лінійний, причина, чому код спочатку важко засвоюється, зазвичай, тому, що він нелінійний, а хитрість - це лише його руйнування. Безліч різних ідіом впровадження, якими розробники користуються, зазвичай не допомагає, але на першому етапі зазвичай працює запуск коду через налагоджувач та використання точок перерви, щоб побачити, що до чого. Намагатися просто прочитати це досить безглузда вправа. Серйозно, коли ви востаннє читали написаний вами код? (почати закінчувати, що є.)
ocodo

Насправді добре написаний код легко читати, але не як текст. Ви просто перегляньте, щоб побачити будівельні блоки та зрозуміти структуру ядра, не потрібно все читати. Неправильні підходи до кодування, як-от старий код Skool, або зловживання SOLID та шаблонами, можуть зробити це завдання дуже важким.
Кодер

4

SE-Radio опитало Дейва Томаса з цього приводу

Цей епізод про подкаст містить безліч порад та прийомів, щоб увійти в «культуру» проекту та зрозуміти, як жили вихідні мешканці.


Весела частина досвіду Дейва Томаса полягає в тому, що документація - поза оглядом високого рівня - (майже) без винятку гірша, ніж жодна документація. (На мій досвід, це тому, що більшість документації є котловиною, яка дає розуміння на рівні поверхні "що" чи "як", яке незмінно залишається застарілим, аж до омани.)
Михайло Кропат

2

Мені довелося це зробити нещодавно з проектом понад 100 000 LOC. Моя перша ідея полягала в тому, що легше бачити візерунки з графіків 100 або навіть 1000 вузлів, ніж із 100000 рядків тексту.

Тому я витратив 45 хвилин і написав коротку програму Python (<100LOC), щоб проаналізувати те, що мені потрібно від неї, та намалювати об'єктні відносини. Я створив джерело Graphviz , яке є дуже простою мовою. (Тут немає нічого особливого в Python: Ruby, C # або Common Lisp або все, що може зробити це так само добре.)

В інших проектах я бачив, як люди використовують Graphviz для залежності модулів, графіків викликів, історії версій, всіляких речей. Найбільший мета-інструмент візуалізації програми коли-небудь.

(Можливо, це тому, що я взяв компілятори , але мені здається дивним, що коли програміст стикається з проблемою, відповідь, як видається, завжди є "написати програму!", За винятком випадків, коли проблема стосується вихідного коду до програми.: - )


1

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


2
Це не практичний варіант, коли у вас є тисячі рядків коду (особливо коли ми говоримо про десятки чи сотні KLOC) та / або якщо частина цього коду знаходиться в шаблонах. Щоб зрозуміти нову (і погано задокументовану) кодову базу, потрібно також зайнятися бізнесом і спробувати зрозуміти контекст, в якому повинен працювати код. Якщо ви можете пройти код за допомогою налагоджувача і зрозуміти його, ця база коду була не такою великою для початку (зробивши використання налагоджувача досить непотрібним у більшості випадків.)
luis.espinal

Горе betide, якщо база коду занадто велика для налагодження в налагоджувачі. Бачити, як код реагує на відомий вхід і вихід, допомагає перетворити знання про "що" на "як". На питання "чому" ніколи не можна відповісти за допомогою налагоджувача, але можуть бути вбудовані коментарі джерела, які ви можете бачити в IDE під час налагодження.
груссель

@grrussel Я не погоджуюся, тому що це не те, що я роблю ... Я навіть не маю уявлення, чи я представник, чи ні! Я можу бачити, як використовують непарну точку розриву (але все одно явно не переступаю), і я використовую функції IDE, щоб дозволити мені співвідносити одну частину до іншої.
Мерф

1

Зрозумійте, що насправді не існує ярликів до повної витримки. (І якщо у вас виникли проблеми з цією фразою, то ваша освіта дуже нехтувала. Це з "незнайомця в чужій країні", Роберт А. Хайнлайн.)

Прочитайте його, одну сторінку за раз, одну процедуру за раз. Додати коментарі. Намалюйте зображення основних структур даних. Розпізнайте алгоритми. Спирайтеся на попередні знання.

Втримайтеся від спокуси підкрутити налагоджувач. Огляд налагодження занадто малий: ви бачите по одному рядку за раз, але насправді не бачите, де ви були чи куди їдете.


Налагоджувач пояснює деяку конвенцію оригінальним
умовами написання

2
-1 за те, що ти думаєш, що ти крутий, бо вживаєш слово "grok"
Carson63000,

1

Що б ви не писали стільки, скільки можете, так як ви йдете разом, щоб ніхто ніколи не опинявся в такому самому положенні, як у вас.


1

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

читати 14 тисяч рядків коду Java не має сенсу. Функціональність пошуку - це ваше збереження життя


0

У різних людей різні стилі навчання, тому YMMV. Перше, що я роблю в цій ситуації - це прочитати всю базу коду хоча б раз. Це дає мені загальне уявлення про те, де все є. Тоді я вибираю розділ, щоб детальніше розглянути. Структури даних були б хорошим місцем для початку. Як тільки у мене є загальне уявлення про те, що відбувається, я роблю те ж саме з іншою частиною коду, яка взаємодіє з першою. Після достатньої кількості ітерацій я добре розумію, як працює код.


0

Найкращий спосіб, як і у всіх програмування не лише великих фрагментів коментованого коду, - розбити його на частини. Це і те, що вам слід зробити в голові, і візуально в коді. Це може означати додавання великих сміливих коментарів або кілька розривів рядків. Це допомагає, прокручуючи його, побачити шматки. Спробуйте знайти логічні фрагменти коду.

Звичайно, коли ви розумієте біти, коментуйте їх за те, що ви знаєте на той час, можливо, вкладаючи примітки про щось, чого ви не розумієте.

Я також рекомендував би не намагатися зрозуміти весь твір з самого початку. Натомість спробуйте розібратися з творами, які вам потрібно знати зараз, а над рештою працюйте пізніше.


0

Я б почав з використання редактора Leo в режимі @shadow з активним використанням клонованих вузлів . Це дозволяє додавати примітки та коментарі до кожного досліджуваного розділу без зміни коду , а примітки завжди будуть у контексті, поруч із кодом, про який йдеться. Ось приклад робочого процесу документів:

Наприклад, коли я виправляю помилку в Leo, я створюю звичайний вузол, який представляє помилку. Цей вузол помилки - це моє уявлення про всі дані у вихідному коді Лео, які стосуються помилки. Коли я виявляю код, пов’язаний з помилкою, я клоную їхні вузли і переміщую їх під вузлом помилки. Я також додаю звичайні вузли як діти вузла помилок. Ці вузли містять оригінальний звіт про помилку, описи того, як я виправляв помилку, дані тесту чи будь-які інші примітки, які я можу захотіти зберегти.

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


0

Намалюйте схеми джерела: відносини даних, функціональні зв'язки, об'єктні зв’язки. Визначте агрегацію, потік даних та потік коду. Фотографії набагато кращі, ніж коментарі до цього, і їх можна зберігати окремо від коду.


0

Перш ніж щось рефактор, пишіть тести. Багато тестів. Дуже специфічні тести до невеликих блоків коду, які принаймні можуть викликати, оскільки це залежатиме від того, як записаний ваш успадкований безлад.

Перевага для написання тестів для початку полягає в тому, що вам потрібно мати певне розуміння коду, перш ніж ви зможете його перевірити, тому кожен тест, який ви пишете, сподівається, буде трохи набутих знань. Ви також можете сильно коментувати тести зі своїми припущеннями поряд із твердженнями.

Здійснюючи тест спочатку, ви не ризикуєте змінити щось у коді, що має ефекти, які ви не можете знати. У вас також з’явиться мережа безпеки, коли ви дійдете до рефакторингу коду.


0

Я використовую такі інструменти, як doxygen, для створення загальної діаграми класів, ніж додає розуміння того, що робить кожен з класів.

Потім я підбираю просту помилку з черги помилок (перш ніж мій менеджер призначить мені важкий: P), потім запускаю цю функціональність у відладчик і намагаюся генерувати грубу модель потоку даних або модель потоку коду.

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


0

Наблизиться до тривіального дефекту, наприклад, NullPointerException. Спочатку уникайте нічого, що стосується паралельності, будь-що, що за своєю природою передбачає розуміння багатьох кодів відразу.

Після виправлення декількох помилок ви, мабуть, матимете гарну ідею. Працює для мене, у будь-якому разі.


-2

В основному дії з написання чистого коду повинні починатися з дизайну. Якщо ми кодуємо мовою OOP, придумайте UML, поділіться з однолітками та переконайтесь, що дизайн не є амбітним. У будь-якому випадку ми, розробники, повинні переконатися, що дизайн вирішує проблему, а не двозначності.

Що стосується кодування, ми повинні переконатися, що дизайн перетворюється в код, тобто сутність в клас або структуру, операція для функціонування тощо.

І я переглянув документ http://queue.acm.org/detail.cfm?id=2063168, який розповідає про стиль кодування або про те, як ми можемо використовувати простір, відступ, зміну шрифту, як і більшість IDE, які ми можемо використовувати для написання СТОЛЬКО CLEANER код, де ми, люди, можемо зрозуміти стільки, скільки і машини. Більше наголошує на написанні коду для безкоштовного коментування, щоб наш код виглядав як самі абзаци.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.