Как быстрее и качественнее читать код на языке Си?
====================================================

 Добрый день. Увлекаюсь языком Си. Знаю его не на 200%. Немного пишу и читаю программы. Хотел бы, что бы кто нибудь поделился опытом, "как он изучает программы на Си". Мне кажется, что я делаю это медленно. Иногда путаюсь и бросаю. Есть ли какие то эффективные способы чтения программ на СИ, может быть у вас какой то свой алгоритм? Или какой то хороший отладчик...  

Я делаю так:   

смотрю на структуру исходников, на хэдер файлы, на Makefile.  

какое то время смотрю содержание всех файлов. (если проект не совсем простой здесь уже начинается апатия).  

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

если совсем не понятно пытаюсь собрать программу и хожу отладчиком. (если все на макросах то не пытаюсь уже пробовать это).   

Я понимаю, что возможно мне не хватает усидчивости, но все же.  

В общем, есть ли какие то советы, полезные книги или курсы. Может кто то как то графы чертит что бы не путаться? 

> Может кто то как то графы чертит что бы не путаться?

  

Эти графы называются UML-диаграммы. И да, они могут помочь. Есть и другие типы диаграмм, да  

  

Но я бы не пытался никогда раскручивать программу именно от точки входа. Логичнее мне кажется исходить от какого то конкретного функционала и искать как он реализован. 

 Никак. Читать и думать. Нет никакой формулы счастья. Искусство неформализуемо =) К тому же какие-то сложные абстракции понять невозможно не зная при этом предметную область.  

  

Ты не поймёшь код, в котором есть какая-то структура данных или алгоритм, который ты не знаешь. Не поймёшь мультитрединг, если не знаешь как он устроен. Не поймешь как работает криптография, если не знаешь теории. И т.д. и т.п. 

 Кто то умный пошутил любая программа на C написана что бы вызвратить значение, все остальное просто преграда к ее цели.   

  

На самом деле разбивайте на блоки. Простые программы линейны как любая юникс утилита.   

  

Чуть позже придумали обьектное проектирование, именно для этого.   

Снижать сложность функций до терпимых 7 параметров и группировать все вместе.