Ⅰ 如何阅读源代码
最近有做源码阅读的事情,觉得有些费尽,做了一些思考。 一个大项目的源代码,不要过份详细的阅读。大项目,其代码量基本上是可以吓死人的。过份的关注细节,常常会拘泥于细节,而忽略了整体框架。当你能够看清框架的时候,亦花费了太多的时间。 因此,阅读一个大项目的源代码,其目的不在于欣赏代码细节,而在于迅速看清项目整体框架的大概面貌:都有那些模块,这些模块是干嘛的(不关心具体怎么干),模块之间的通讯机制大概是怎样的,然后在考虑子模块,通常只要掌握两级子模块就够了。花上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键作为方向键的。
Ⅲ 我有阅读障碍症,读文章很吃力,对我的学习也造成了影响,怎么解决
有些人对生疏的语句就是这样,你常练习就会好的,相信你平时说话和读文章的时候肯定不一样!
Ⅳ 学编程很吃力怎么办
万事开头难。编程要靠理解的。同时要加强上机操作的。加油吧。
Ⅳ 如何有效地阅读PyTorch的源代码
最近刚开始使用theano, 经验不多,连个基本的模型都跑不通,于是去看了下Keras,源码比较简洁,可以当作theano的示例教程来看,感受如下:
文档看似很全,每个layer是干啥的,每个参数是啥都写了,但是不去读代码,实际很多人是无法从文档理解其具体用法的。这点看issue里的讨论里可以看出。同样,example似乎很多,而且都能直接run,还都是real world的数据集,看似很好,但是实际上,对于新手,如果需要的模型跟example里的不完全一样,不容易搞懂到底需要把输入输出的数据搞成啥格式。举个例子,example都是做的classification的,没有做sequence labeling的例子,如果想拿来做个pos tagging,不知道数据如何组织。当然,这些其实花一天读下代码或者好好翻翻issue讨论就可以解决了,但我相信不少人不会去认真读代码或者看讨论,而是直接换个工具。我感觉目前的doc只有懂了代码的人才能看懂,不懂得看文档还是没啥用。
2.项目很简单所以开发者不多,但是很活跃,每天都有新东西加进去。今天增加了一个新的分支后端可以用theano或者tensorflow了,不过貌似由于不支持scan,backend用tensorflow的没实现recurrent layer。他们也意识到文档的问题,觉得需要为小白用户多加点tutorial而不是光给develop看。
我没用过其他的framework,仅说keras拿来学习theano基本用法,很不错
库本身的代码,比较简单易读,我作为python菜鸟,也能看懂。目前model有sequential和grapgh两种,前者并不是指recurrent而是说网络是一层层堆的(也包括recurrent).其他的主要概念包括layer,regularizer, optimizer,objective都分离开。layer用于build每层的输出函数,model会用最后一层的输出,根据objective和每个layer的regularizer来确定最终的cost,然后在update时用optimizer来更新参数。把这四个看下加上model里的fit函数,就会用theano啦。很多模型都能cover,seq2seq这种也有现成的可用。建议不要光看example,多看看github上的 issues讨论,实在找不到,直接提问。效率方面,我不懂theano怎么优化,感觉keras的这种封装,没什么成本,跟自己用原生theano是一样的。当然,theano本身就好慢啊。。估计是我不懂用吧。。
用于测试函数式返回的数值是否有错。如果有错,该函数返回
Ⅵ 我觉得学习很吃力很累怎么办··
调整好自己的心态,劳逸结合,根据自身安排好学习和休息的时间。以最好的状态来面对学习。 一定会有压力的,有压力不是一件坏事 ,可是使你有更足的动力来克服学习中遇到的困难,这一点你要自己学会调节,你要明白,爸妈无论怎么说你,初衷都是希望你能好不懂的地方,不要怕丢脸,一定要找老师或者同学问清楚。 所有的问题都是一点一点积累起来的,现在你不问 ,以后问题就会堆积如山,让你无从下手。所以,你要及时弄清不明白的地方,不然你会后悔的。
至于附加题,相信你在弄明白你不懂的地方,加上你聪明的头脑,就OK了!
爱默生说,伟大人物最明显的标识,就是他具有坚韧不拔的精神,不管环境变化到何种程度,他的初衷和希望,仍然不会有丝毫的改变,而终至克服障碍,达到所期望的目的。 那为何 坚韧不拔 呢? 在我看来,有两个含义 一是:坚定 ,二是:坚忍。
Ⅶ 为什么以及如何阅读源码
对于这些问题,说到底主要是因为经验不够,而经验主要从项目实践中积累,所以招聘单位一般都会限定工作时间大于 3 年,因为这些人的项目经验相对较丰富,项目中遇到的场景相对较多。
工作经验的积累来自于年限与实践,然而看源码可以扩展我们的思路,这是变相增加我们经验的不错方法。虽然不能短时间内通过时间积累经验,但是可以通过学习开源框架、开源项目来获取。
另外进职场后一般都要先熟悉现有系统,如果有文档还好,没文档的话就得自己去翻代码研究。如果大家之前对阅读源码有经验,那么在研究新系统的代码逻辑时就不会那么费劲了。
Ⅷ 怎样提高阅读源代码的效率
1、一边阅读代码一边写注释。这是我用过的最好的方法,对代码理解得更深入,看一些重要代码或者特别难懂的代码时挺有用。更何况,注释也是一种文档嘛。
2、一边阅读代码一边绘制UML。这个方法适用于类之间的关系较复杂和调用层次较深的情况,我一般都是先绘制顺序图,然后为顺序图中的类绘制关系图。
3、通过Debug来跟踪程序的主要执行过程,这样就可以分清主次了,阅读的时候更有针对性。
4、类的快速阅读。先弄清楚它在继承链中的位置,看看它的内部状态,也就是成员变量,一般来说,类的对外接口都是对成员变量的访问、加工、代理等,然后看看它的对外接口,也就是公有成员函数,识别核心的一个或多个函数,这时候你应该可以大概了解这个类的职责或作用了。可能这个类是某个设计模式中的一个组成部分,所以,设计模式的掌握对代码的快速阅读也是很有帮助的。
5、带着问题去阅读。比如想了解android中的消息机制,那么看看Looper、Handler、MessegeQueue这几个类就可以了,其他的不要去看,要不然就跑题了。
Ⅸ 我阅读速度很慢,理解能力差怎么办
我的语文高考成绩128,我有一个很深的体会就是---背诵,不要一看就说我胡说,记忆好的句子,不是名人名言啊,就是读的文章中的写得优美的或是很有哲理的,就记下来,这样久而久之,你会在不知不觉中提高自己的文学素养,对文字就敏感起来,当然,这真的是一个长久的过程,就看你能不能坚持了,再说,还没上初三,时间足够了。
Ⅹ 做英语阅读很吃力怎么办
1、扩大词汇量,培养词义推断理解能力。
词汇是语言的三大要素之一,是阅读的基础,
近几年的阅读短文的词汇量都在2200个单词左右,就要求学生不但要积累足够的词汇量,而且要学会构词法(转化、派生、合成)来丰富自身的词汇量;常见词缀有:①表反义的前缀词dis-, im-, un-,in-等,例如:disappear,disagree, impossible,unvisible, inexpensive,unable等;②加后缀转化为形容词有:-able, -sive, -less,-ful等,例如:reasonable, unknowable, effective等;③名词加ly或y转化为形容词,如month→monthly,year→yearly, salt→salty等;④“non-”表示“没有”“否定”之意,如non-stop,non-sleep,non-recyclable等;⑤“over-”表示“超过、超额、超量”之意,如:overwork,oversleep等。
加强训练,让学生学会根据构词法(根据词根、前缀、后缀等推断出生词的词义)、上下文(例子、定义、对比、同义词、反义词、语境)、逻辑关系等方法来推断生词的词义。
2、提高阅读速度
首先要克服不良的阅读习惯:一次一个单词,用手指着读,一遇到生词就停下来,“声读”(小声朗读或心里默读)等等,加强限时阅读训练。
3、加强训练,培养学生剖析结构,分析解读长难句能力。近年来,高考阅读的长句、难句的数量逐年增多,大大地加大了学生阅读难度,影响阅读速度和效果。这些句子结构复杂、修饰语叠缀、信息容量大,有时一个句子占几行甚至一个自然段。其实,这类句子并不可怕,只要善于理清其基本结构和各语段之间的关系,在分层理解内容的基础上整合全句语义,难句也就迎刃而解。
4、选好阅读材料,扩大阅读量,丰富学生英语文化背景知识
近几年绝大多数高考阅读材料是介绍英语国家的文化、人文、生活、人生观、科普、习俗、历史、人物等。学生除了看懂文章外,具备一定的背景知识也极为重要,它是阅读理解的催化剂。因为语言是文化的载体,话语不能脱离文化背景而独立存在。文化背景知识的获取,除了教材课文阅读外,更多的是通过课外阅读英文读物,而课外阅读材料的选取要注意以下二个方面:①、体裁多样,题材广泛,包含记叙文、应用文、议论文。涉及人文、历史、生活、人生观、习俗、科普等,趋向现代化、生活化、知识化,突出实用性与时代性、趣味性。②、尽量选用原汁原味的英文读物,而且这些读物应具有一定的生词量(具有一定的生词量的英文读物是今后高考选材的一种趋势)。