本文目录一览:
如何快速阅读一个c++大工程 知乎
首先,有没有程序说明文档?有没有详细代码注释,没有就先看找main函数,看执行流程,依次看调用函数代码
如何阅读Android系统源码
参考如下知乎的答案:
作者:王宇龙
链接:
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
Application端和Services端都看和改了不少.
如果只是想看看一些常用类的实现, 在Android包管理器里把源码下载下来, 随便一个IDE配好Source Code的path看就行.
但如果想深入的了解Android系统, 那么可以看下我的一些简单的总结.
知识
Java
Java是AOSP的主要语言之一. 没得说, 必需熟练掌握.
熟练的Android App开发
Linux
Android基于Linux的, 并且AOSP的推荐编译环境是Ubuntu 12.04. 所以熟练的使用并了解Linux这个系统是必不可少的. 如果你想了解偏底层的代码, 那么必需了解基本的Linux环境下的程序开发. 如果再深入到驱动层, 那么Kernel相关的知识也要具备.
Make
AOSP使用Make系统进行编译. 了解基本的Makefile编写会让你更清晰了解AOSP这个庞大的项目是如何构建起来的.
Git
AOSP使用git+repo进行源码管理. 这应该是程序员必备技能吧.
C++
Android系统的一些性能敏感模块及第三方库是用C++实现的, 比如: Input系统, Chromium项目(WebView的底层实现).
硬件
流畅的国际网络
AOSP代码下载需要你拥有一个流畅的国际网络. 如果在下载代码这一步就失去耐心的话, 那你肯定没有耐心去看那乱糟糟的AOSP代码. 另外, 好程序员应该都会需要一个流畅的Google.
一台运行Ubuntu 12.04的PC.
如果只是阅读源码而不做太多修改的话, 其实不需要太高的配置.
一台Nexus设备
AOSP项目默认只支持Nexus系列设备. 没有也没关系, 你依然可以读代码. 但如果你想在大牛之路走的更远, 还是改改代码, 然后刷机调试看看吧.
高品质USB线
要刷机时线坏了, 没有更窝心的事儿了.
软件
Ubuntu 12.04
官方推荐, 没得选.
Oracle Java 1.6
注意不要用OpenJDK. 这是个坑, 官方文档虽然有写, 但还是单独提一下.
安装:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer
sudo apt-get install oracle-java6-set-default
如何阅读别人的代码?
作为初学者,我们可能经常会需要去阅读别人的代码,以求从中学到别人的设计思路,抑或是从代码中了解类库的使用。不管哪种需求,我们都需要做到快速准确地阅读。那么,究竟如何阅读呢?让我们以一个.net的项目为例:当我们打开一个.net解决方案的时候,里面通常有不止一个项目,例如一个三层架构的web项目,里面除了一个web网站外,通常还会包括诸如数据层(DAL)、逻辑层(BLL)项目,另外,一般我们会提供一个通用项目(Common类库),或者把DAL中的model部分抽取出来,这样就可能形成一个包含很多个组件的解决方案。那么我们拿到这个解决方案的时候要怎么入手呢?我的经验是,读别人的代码,由面及点和由点及面相结合的读法是最快的。所谓由面及点,就是说,首先理解整个解决方案的分工,比如叫做“web”项目是网站部分,是MVC架构中的V;名字中包括“BLL”的部分是业务代码,是MVC架构中的C;而名字中包括“DAL”的部分是数据库访问代码,是MVC架构中的M……理解每个子项目的功能,有助于我们直接进入主题,而不用花太多时间去熟悉所谓的框架部分。那么,主题在哪里呢?对于一个web项目来说,主题就是页面和业务代码。而这些,需要我们有点及面地学习。所谓由点及面,就是说,我们先进入一个页面,比如index.aspx(如果没有这个页面,一般也会有UserLogin.aspx之类的页面),打开这个页面,找到其中的功能按钮,根据按钮事件找到下一个页面,在熟悉页面流向的过程中,我们也从事件代码中了解了框架代码的调用方法。 那么,阅读一个具体的页面(包括页面本身和按钮事件,或者说,业务代码)的方法呢?1、代码包括如下部分
1)页面本身,即前台代码
2)页面后台,即各种事件
3)在页面事件中调用到的其他代码(例如数据库访问代码、多层架构中分出的其他层代码等)2、阅读顺序
1)阅读前台代码,对于初学者可以学习控件标签的使用方法,当然,事实上我们是用vs的设计工具来画页面的,察看代码只是为了更加熟悉,或者加深理解。
2)阅读页面后台事件代码,分两步走。首先,宏观理解一个事件的功能,比如点击一个登陆按钮,是要做:取得输入用户名和密码,根据用户名和密码查找数据库,根据返回结果判断页面流向,提示登陆成功或失败信息,等等。只需要理解功能即可,不需要深入理解每句代码的作用。因为这个时候我们是初次察看别人的后台代码,对于封装很好的框架,我们是很难第一次阅读就读懂所有东西的。
3)然后,在我们已经了解了一个事件的功能后,我们再次阅读,此时逐行分析。例如我们会碰到代码中定义了一个数据表对象(如User对象),然后执行数据库查询(此时我们可以熟悉项目中的数据库操作),然后对返回值进行操作(例如判断用户存在否,密码正确否)。在这些操作中我们可以(1)学习基础类库的使用,(2)熟悉框架代码的使用
注:在学习代码过程中,了解框架是意识上的进步,学习代码是技术上的进步,所以在逐步理解代码阶段,碰到人家封装好的类,例如数据库访问类,不用太执着,只要理解即可;而碰到某些编程技巧,则需要深入理解。
如何阅读一个大型项目代码
对于程序员来说,写代码永远比读代码来的舒服。但现实情况是, 程序员常常需要阅读其他人员写的代码,更多的时候这些代码可能即没 文档也没注释。不过,好象有个人说过一句话,代码之前,了无秘密。 运用适当的策略可以让阅读工作变的轻松很多。 1. 对于常用的系统函数进行追踪。 比如ReadFile,CreateDevice,CreateWindow,在这些函数处放几断点, 可以看到代码的调用过程。通过这种方式可以方便地把代码分为底层代码 和上层逻辑代码。 2.依据项目依赖关系进行阅读。 项目的依赖关系同时表明了项目的复杂程度。对于大型的项目通常都会 分割成若干子项目,根据项目的依赖关系,循序渐进的方式可以让阅读变的简单。 3.对于以lib形式提供的子项目。 在阅读时,可以先把lib的整个项目做为黑盒使用。根据_declspec(dllexport)或者 以头文件方式提供的调用接口,可以减少对于细节的阅读时间。根据模块进行大致的划分, 可以有效地对项目的结构有直接的感性认识。 4.识别项目中使用的设计模式。 对于大型项目来说,设计模式是必不可少的。在庞大的代码中识别设计模式,寻找代码 中使用相似手法的代码结构可以极大简化需要阅读的代码。 5.根据数据流程分析。 动态职责划分。 6.修改部分代码,进行调试。 修改部分常数或者饶过某些程序执行流程,或者以简化的数据对程序进行追踪。
如何阅读源代码
一个大项目的源代码,不要过份详细的阅读。大项目,其代码量基本上是可以吓死人的。过份的关注细节,常常会拘泥于细节,而忽略了整体框架。当你能够看清框架的时候,亦花费了太多的时间。
因此,阅读一个大项目的源代码,其目的不在于欣赏代码细节,而在于迅速看清项目整体框架的大概面貌:都有那些模块,这些模块是干嘛的(不关心具体怎么干),模块之间的通讯机制大概是怎样的,然后在考虑子模块,通常只要掌握两级子模块就够了。花上1,2天的时间掌握这一切,就达到了阅读大项目源码的目的。因为一旦你掌握了框架,你就可以按照这个框架实现这个项目,虽然和原项目全然不同,但是完成的需求却是一样的。
在软件中,架构才是本质。
也许你指望详细阅读大项目源代码能看到高质量的代码,但是,大项目通常都是团队的劳动成果,每个人的不同水平造就了代码质量的高高低低,一个人在不同时间不同环境的代码质量也是不同的。要指望在大片源码面前找到高质量,简直是天方夜谭。
也许你要从阅读源码中掌握某项技术细节,比如bsp,又或者换装,那么,最好的建议是查找相关的技术文档以及文档上所附带的sample code,这种sample code一般不会附带任何干扰,简洁得只是为了证明该技术而存在的。如果没有这些东西,而只能从大项目源码中找的话,你提前先了解了框架,能更快的查找和定位到表达该技术的文件。但是通常都会比较不幸,因为你为了明白这一技术,通常要先理解混入其中的另一技术。
最后谈谈怎样才能阅读到高质量的源代码。何谓高质量?是指算法出人一表(比如某种o(1)的排序法)?还是采用了极端深奥的语言特性将某实现完美表达(比如模板的灵活运用)?无论是哪种,最好的来源是书,如《STL详解》,或者《inside XX》这样的东西。书的作者通常就是这些高质量代码的作者,他会带领你探索这些源码背后的真相。
如何提高自己阅读代码的能力
理解
1
我们可以用拼图这样的游戏,来做一个比喻。一地的碎片,你如何将他们尽快的拼在一起?
1.寻找边角的块(除了四边都是凹凸的块之外,其他有一到两条边是直线的块,会少得多,也更容易辨认与拼接。)
2.将碎块按大的色块分类,从一次查找,变成二次查找。
3.一开始碎块最多的时候,是最困难的时候,需要足够的耐心、细心,以及一点点的运气。
4.如果你的记忆力足够的好,碰到的碎块能够在脑子里留下一定的印象,那么有助于你快速找到匹配的碎块。
5.经验能够帮助你提高效率,熟能生巧。
2
回到代码阅读,我们来做一个类比:
1.寻找代码中最明显的入手处,比如main函数,core文件夹,model、view、controller的三种大类等等。
2.从理解文件夹、文件名开始,而不是一上来就埋头进入源代码之中。
3.一个好的全文搜索工具,能够帮你找到相关的代码与片段,渐渐的,看起来一团乱麻的代码,就会显现出各种可以被理解的关联出来。
4.记忆力总是有用的,在脑子里绘出整个系统的架构,并且补充越来越的,越来越清晰的细节。
5.一样是熟能生巧。
3
相比拼图,代码阅读还要容易一些,你不需要理解全部的代码,有一个大致的理解以后,就可以先放过一些不太重要的细节。
END
引用较为相关的一段在下面,供参考
1
知其所以然
有一句俗语叫做:“知其然,更要知其所以然”。用在任何学习科目上,几乎都是恰当的。本章叫做《理解开源项目》,而之前的4个小节,可以说都是属于“知其然”的功夫。如何才能知其所以然呢?
2
所以然包括哪些内容?
往大了说,整个这份文档,希望帮助读者达到的,就是能够对于开源软件“知其所以然”。这样才算是真正提高了软件开发的能力。因此,我们可以将“架构决策”、“代码风格”、“领域知识”、“编程技巧”等等内容,都算作是所以然的一部分。
3
架构决策
通过深入阅读和分析源代码,理解整个项目,为何像这样,而不是那样做架构设计。其间蕴含着项目作者的经验和智慧,理解了这个,将是一种巨大的收获。
4
代码风格
每一种语言、每一个社区、每一个开发者群体,甚至每一个开源项目,都有其独特的代码风格,这种风格,有其背后的合理性,也有很多是来源于某种开 发哲学的思 考。理解一种代码风格,就是理解一种思考的模式,一种思想的体系。能够多了解一些不同种类的代码风格,对于提高软件开发能力,将有很大的帮助。
5
领域知识
有些代码不容易看懂,很重要的一个原因,是这个项目所涉及的领域,我们没有什么深入的了解。多年的程序员经验告诉我,要做好某一个行业的软件, 一定要成为 某一个行业的内行。甚至要比那个本行业的业内人士,更加精通。因此,一个优秀的程序员,通常是能够跟你聊多个不同行业的话题的。强大到你几乎无法分别他的 是不是业内人士。因此,通过理解开源项目,进而理解相关的领域知识,会有很多收获。
6
编程技巧
阅读优秀的开源项目的代码,有时候很像是看一本好书。细细品味,慢慢的体会。我们会发现一点一滴的“妙处”。这些妙处凝聚了程序员的巧思妙想,能够体会得越多,对我们的帮助也就越大。
7
个人偏好
开源作者也是普通人,他们有很多观点和取舍,未必能够说服他人,只能算是他们自己的偏好。而他们将自己的偏好表达在代码里,有些时候,我们能够 很容易理解 (因为我们也是这样想的)。有些时候,我们就会感觉很不解,而且,常常会发生的一类故事就是:某某大牛写了一个开源项目,另一个大牛有感觉不爽的地方。提 了意见建议,人家又不肯改。结果,这另外一个大牛,就一怒之下,另起炉灶,写了一个新的开源项目。
8
历史原因
有一篇很有意思的文章,解释了《为什么Vim使用HJKL键作为方向键 》,其实原因很简单。当Bill Joy创建Vi文本编辑器时,他使用的机器机器是ADM-3A终端机,这机器就是把HJKL键作为方向键的。