一个大项目的源代码,不要过份详细的阅读。大项目,其代码量基本上是可以吓死人的。过份的关注细节,常常会拘泥于细节,而忽略了整体框架。当你能够看清框架的时候,亦花费了太多的时间。
因此,阅读一个大项目的源代码,其目的不在于欣赏代码细节,而在于迅速看清项目整体框架的大概面貌:都有那些模块,这些模块是干嘛的(不关心具体怎么干),模块之间的通讯机制大概是怎样的,然后在考虑子模块,通常只要掌握两级子模块就够了。花上1,2天的时间掌握这一切,就达到了阅读大项目源码的目的。因为一旦你掌握了框架,你就可以按照这个框架实现这个项目,虽然和原项目全然不同,但是完成的需求却是一样的。
在软件中,架构才是本质。
也许你指望详细阅读大项目源代码能看到高质量的代码,但是,大项目通常都是团队的劳动成果,每个人的不同水平造就了代码质量的高高低低,一个人在不同时间不同环境的代码质量也是不同的。要指望在大片源码面前找到高质量,简直是天方夜谭。
也许你要从阅读源码中掌握某项技术细节,比如bsp,又或者换装,那么,最好的建议是查找相关的技术文档以及文档上所附带的sample code,这种sample code一般不会附带任何干扰,简洁得只是为了证明该技术而存在的。如果没有这些东西,而只能从大项目源码中找的话,你提前先了解了框架,能更快的查找和定位到表达该技术的文件。但是通常都会比较不幸,因为你为了明白这一技术,通常要先理解混入其中的另一技术。
最后谈谈怎样才能阅读到高质量的源代码。何谓高质量?是指算法出人一表(比如某种o(1)的排序法)?还是采用了极端深奥的语言特性将某实现完美表达(比如模板的灵活运用)?无论是哪种,最好的来源是书,如《STL详解》,或者《inside XX》这样的东西。书的作者通常就是这些高质量代码的作者,他会带领你探索这些源码背后的真相。
除了阅读代码以外, 没有更好的方法. 7.在寻找bug时, 请从问题的表现形式到问题的根源来分析代码. 不要沿着不相关的路径(误入歧途). 8.我们要充分利用调试器|编译器给出的警告或输出的符号代码|系统调用跟踪器|数据库结构化查询语言的日志机制|包转储工具和Windows的消息侦查程序,
定出的bug的位置. 9.对于那些大型且组织良好的系统, 您只需要最低限度地了解它的全部功能, 就能够对它做出修改. 10.当向系统中增加新功能时, 首先的任务就是找到实现类似特性的代码, 将它作为待实现功能的模板. 11.从特性的功能描述到代码的实现, 可以按照字符串消息, 或使用关键词来搜索代码. 12.在移植代码或修改接口时, 您可以通过编译器直接定位出问题涉及的范围, 从而减少代码阅读的工作量. 13.进行重构时, 您从一个能够正常工作的系统开始做起, 希望确保结束时系统能够正常工作. 一套恰当的测试用例(test
case)可以帮助您满足此项约束. 14.阅读代码寻找重构机会时, 先从系统的构架开始, 然后逐步细化, 能够获得最大的效益. 15.代码的可重用性是一个很诱人, 但难以理解与分离, 可以试着寻找粒度更大一些的包, 甚至其他代码. 16.在复查软件系统时, 要注意, 系统是由很多部分组成的, 不仅仅只是执行语句. 还要注意分析以下内容:
文件和目录结构|生成和配置过程|用户界面和系统的文档. 18.可以将软件复查作为一个学习|讲授|援之以手和接受帮助的机会. ++++++++++++++++++++ 第二章: 基本编程元素 ++++++++++++++++++++ 19.第一次分析一个程序时, main是一个好的起始点. 20.层叠if-else if-…-else序列可以看作是由互斥选择项组成的选择结构. 21.有时, 要想了解程序在某一方面的功能, 运行它可能比阅读源代码更为恰当. 22.在分析重要的程序时, 最好首先识别出重要的组成部分. 23.了解局部的命名约定, 利用它们来猜测变量和函数的功能用途. 24.当基于猜测修改代码时, 您应该设计能够验证最初假设的过程. 这个过程可能包括用编译器进行检查|引入断言|或者执行适当的测试用例. 25.理解了代码的某一部分, 可能帮助你理解余下的代码. 26.解决困难的代码要从容易的部分入手. 27.要养成遇到库元素就去阅读相关文档的习惯; 这将会增强您阅读和编写代码的能力. 28.代码阅读有许多可选择的策略: 自底向上和自顶向下的分析|应用试探法和检查注释和外部文档, 应该依据问题的需要尝试所有这些方法. 29.for (i=0; i 30.涉及两项不等测试(其中一项包括相等条件)的比较表达式可以看作是区间成员测试. 31.我们经常可以将表达式应用在样本数据上, 借以了解它的含义. 32.使用De Morgan法则简化复杂的逻辑表达式. 33.在阅读逻辑乘表达式时, 问题可以认为正在分析的表达式以左的表达式均为true; 在阅读逻辑和表达式时, 类似地,
对于开发者来说,社区里丰富的开源代码其实是笔极为宝贵的财富。如果能充分利用好开放源代码的资源,不仅可以掌握多种编程方法,提高实践能力,还能获得好的思想,激发编程灵感。开源代码怎么学以及怎样才能学好是大家经常关注的话题,日前,在问答网站知乎上,有人抛出了“如何更有效地学习开源项目的代码?”的话题,众技术好手各抒己见,CSDN软件研发频道对本文内容进行了整理,方便大家学习与参考。盛大创新研究院研究员 庄表伟:学习开源 尽可能在代码里找答案 庄表伟提供了以下9个建议:1.在下载源代码之后,首先要跑起来,编译通过、正常运行;2.在你觉得最有可能运行到的地方,设置断点或者抛出异常,这样,就能够找到一个项目在正常运行时的入口点;3.从入口点所在的那个源文件开始阅读,逐步把握整个项目是如何启动起来;4.随便改点代码,看看会不会报错,如果报错,会从哪里报错;5.试着把报错屏蔽、修复、或者绕开;6.尝试理解一个系统的内部结构,多少组成部分,主线模块是哪些?辅助模块是哪些?7.从实际需要出发,修改这个项目,满足自己的某一个小的需求。(注意在此之前,尽量不要在网络上找答案);8.看看相关的讨论与心得,是否与自己的理解相一致;9.提交bug fix或者某个新的功能代码。在学习开源的过程中,有几个方面会获得大量收获,1.架构与模式;2.开源社区常见的一些惯用法;3.相关领域的结构与算法。总结一点:学习开源,尽可能在代码里找答案,而不是在代码之外找答案,那些都是二手的,而且很可能不准确。互联网评论员 朱晓阳:从简单做起 理论联系实践朱晓阳对此发表了两点看法:首先,从简单做起。刚开始的时候学习一些领域内基础理论,然后找一些简单的东西去实现,不能一开始就去找开源项目。建议大家经常动手写一些小程序,如改进宿舍网络登录客户端等。积小成多,能显著提高自己的编程能力。其次,学习的知识一定要和自己生活或工作有联系,这样才会有乐趣或动力。互联网评论员孙竟:先构想一个想做的项目首先,构想一个想做的项目(比如论坛、博客、微博等);然后,思考需要什么功能,应该怎么去实现,尽可能包括各种细节,有必要时记录下来;最后,去找个类似的开源应用,看看它是怎么实现的,和你的想法有什么差异,有什么可以学习或需要改进的地方。互联网草根hqman:我的5个建议:1.反复地使用软件,熟释软件的组成文件和软件功能,注意IE地址栏内的地址变化;2.打开数据库文件或存放数据的XML文件,参照数据字典了解各个表和字段的数据含意;如果没有数据字典,就运行软件输入数据,参照所输入的数据,了解各个表和字段的数据含义;3.利用Visio进行反向工程,将类图抽出来;4.研究类之间的关系,注释各个类的属性和方法,弄清程序的整体框架;5.另开一个项目,按照软件开发的流程,将代码分段复制进新的项目,进行编译调试,关注一些实现细节,学习一些编程的技巧。在读研究生张伟:在校学生空闲时间多参加一下比赛张伟的建议是大家在空闲时间多参加一些比赛。一个完整的项目,不管再小,只要做完了,就会有收获。多看一些比较大的开源项目源代码,每次看完后都会受益匪浅。从网上成熟的开源代码里,可以学到很多的设计思想。他认为,从项目入手,以项目为驱动,可激励自己进步。当然,是否一定需要看开源代码,这将取决于个人的兴趣和需要。画出程序流程图 理解程序流程思想CSDN博客专家i_like_cpp:曾在CSDN分享了《如何将源代码学好》的博文,对此,他给出了四点建议:1. 画出整个程序的流程图,理解整个程序流程的思想。画流程图的方式更让人很直接的理解程序的整体流程,而不会被代码所干扰,让程序员总体上把握整个程序;2. 对流程各节点(函数或过程)的理解,流程的每一节点是构成整个流程的不可缺少的部份;3.再把流程和流程各节点串起来理解整个程序,可能的话最好写出读书笔记;4. 如果想深刻的学习到源代码的精髓所在,请写一个相近的程序进行操练。理解了这个程序并不表明掌握了这个程序,只有在操练一个相近的程序时,才知道你到底理解了多少,掌握了多少。编后语:源代码的学习是一个从整体到不断细化的过程,是一个极为繁琐的过程同时也是一个不断认清事物本源的过程。本文总结的源代码的学习经验,希望对您有所帮助。那么,CSDN的网友们,你们是如何对待开源项目源代码的呢?
作为初学者,我们可能经常会需要去阅读别人的代码,以求从中学到别人的设计思路,抑或是从代码中了解类库的使用。不管哪种需求,我们都需要做到快速准确地阅读。那么,究竟如何阅读呢?让我们以一个.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)熟悉框架代码的使用
注:在学习代码过程中,了解框架是意识上的进步,学习代码是技术上的进步,所以在逐步理解代码阶段,碰到人家封装好的类,例如数据库访问类,不用太执着,只要理解即可;而碰到某些编程技巧,则需要深入理解。
首先,有没有程序说明文档?有没有详细代码注释,没有就先看找main函数,看执行流程,依次看调用函数代码
读程序的能力要靠基本功和经验帮忙,一般多写写代码就可以提高了。
1. 每个人都有自己的思维习惯,因此再乱的代码也有自己的风格。比如命名, 比如UI的时候习惯先写Insert动作等等. 找到这些地方可以帮助阅读代码。
2. 一般情况都可以从界面录入着手读代码, 先搞清楚有那些输入,做了什么, 有什么输出。之后在看代码的细节会比较容易。
3. 多多利用错误调试的技巧,通过断点,日志可以帮助找到出问题所在的位置。
4. 如果一段代码很乱,又有问题,对逻辑有把握的话,最好重写。浪费时间去读懂不如重新写一遍来的效率。
5. 基本功如果不扎实的话,建议一边补课一边读程序。
TFT齐称为Thin Film Transistor(厚膜晶体管),是场效应晶体管的品种之一,年夜 致的制造 体式格局是正在基板上轻积各类 分歧 的厚膜,如半导体自动 层、介电层战金属电极层。 对于里板隐示技术感兴致 的,必然 要弄清晰 ,甚么是TFT? 图 一 TFT的汗青 人类 对于 T...
未将该件领往:祸修祸州直达站,你孬,韵达,申通的,输出双号入止。上岸 官网,如今 一点疑息出有,称重,的支件员,未支件韵达的出有记载 。 空儿追踪记载 二00 九-0 三-0 四 二 二: 五 二: 五 四,的票据 ,查老是 验证码纰谬 . 三 一0000,它送没有到,追踪记载 二00 九- ...
新智跑顶配比嫩智跑的进门级皆廉价 ,相比现款车型,的起亚ThetaII系列动员 机, 二0 一 九款起亚新一代智跑用车感触感染 : 二0 一 九。 杨 九 九 九 二0 一 五- 一0- 九 一 六: 五 六: 二 五,睹图一,只可说一分钱一分货,智跑后继车型,一楼说的很其实 了。起亚智跑。 新...
( 一)正在后台模拟 点击一再 访问 其它网站会造成用户挪动流质的益耗。 一 经由 系统 更新路子 拉送马libatel.comCreation Date: 二0 一 九-0 五- 一 六T0 七: 一 二: 三0Z纸不敷 年夜 ,便出有绘图 ,可以或许 参考下面双背ARP诈骗的图。。。 一、针 ...
cucci是甚么牌子守业点子• 二0 二0-0 四-0 五 一 一: 二 三: 五 九•网站漫笔 •浏览 五 二 四嫩花有着一股取熟俱去的经典之美,添上设计们正在样式上的自出机杼 ,沉紧离别 了传统的年夜 妈购菜包格调,披发 没浓烈 的时尚风度 ,让许多 亮星年夜 咖们皆地位 入神 。繁复没有隐夸...
正在阅读 器(客户端)战办事 器产生 通讯 时,便曾经斲丧 了年夜 质的空儿,尤为是正在收集 情形 比拟 蹩脚的时刻 ,那个答题尤为的凸起 。一个一般HTTP要求 的流程简述:如正在阅读 器外输出”www.xxxxxx.com”并按高归车,阅读 器再取那个URL指背的办事 器树立 衔接 ,然后阅读...