源码怎么学
刚参加工作那会,没想过去读源码,更没想过去改框架的源码;总想着别人的框架应该是完美的、万能的,应该不需要改;另外即使我改了源码,怎么样让我的改动生效了?项目中引用的不还是没改的jar包吗。回想起来觉得那时候的想法确实挺??
工作了一年多之后准备跳槽了,开始了一轮的面试,其中有几个面试官就问到了相关的源码问题:ArrayList、HashMap的底层实现,spring、mybatis的相关源码。问源码的面试一般就是回去等消息,然后就没然后了。
那时候开始意识到,源码这东西在之前的工作的中感受不到,但是在面试中好像面的还挺频繁的,从此有意识的开始了jdk部分源码的阅读(主要是集合)。一开始看源码,看的特别糙,知道个大概,知道ArrayList的底层实现是数组,HashMap的底层是散列表(数组+链表);更深入一点的扩容、hash碰撞等等就不知道了。
读spring源码起于工作中遇到了一个问题(spring jdbcTemplate事务,各种诡异,包你醍醐灌顶!),排查一段时间最终是解决了,但过程让我非常难受,各种上网查资料、各种尝试,感觉就像大海捞针一样,遥遥无期。我下定决心,我要看一看spring的源码,于是我买了一本《spring源码深度解析》,结合着这本书、打开着eclipse,开始了spring的源码阅读之旅。至此,读源码成了习惯,源码已经进入了我的心里。
后来,springboot的火热,让我也想蹭上一蹭,于是有了springboot的启动源码系列,虽然还在进行中,但是我相信我能将其完成;工作中用到了shiro,我又结合着《跟我学shiro》将shiro的源码看了个大概,有了shiro源码系列博文,还差一篇认证与授权(应该很快就能面世),shiro源码系列就封笔了。最近在搭建自己的后台管理系统,用到了quartz,集成的过程也遇到了一些问题,因此有了quartz的两篇文章。
慢慢的,从一味的网上找资料变成了很多时候会从源码中找答案。不求能读太多的源码,但愿自己接触的技术都能读上一读,路漫漫其修远兮,吾将上下而求索!
大家为什么要读源码?
很多人一定和我一样的感受:源码在工作中有用吗?用处大吗?很长一段时间内我也有这样的疑问,认为哪些有事没事扯源码的人就是在装,只是为了提高他们的逼格而已。
那为什么我还要读源码呢?一刚开始为了面试,后来为了解决工作中的问题,再后来就是个人喜好了。说的好听点是有匠人精神;说的委婉点是好奇(底层是怎么实现的);说的不自信点是对黑盒的东西我用的没底,怕用错;说的简单直白点是提升自我价值,为了更高的薪资待遇(这里对真正的技术迷说声抱歉)。
源码中我们可以学到很多东西,学习别人高效的代码书写、学习别人对设计模式的熟练使用、学习别人对整个架构的布局,等等。如果你还能找出其中的不足,那么恭喜你,你要飞升了!会使用固然重要,但知道为什么这么使用同样重要。从模仿中学习,从模仿中创新。
读源码不像围城(外面的人想进来,里面的人想出去),它是外面的人不想进来,里面的人不想出去;当我们跨进城内,你会发现(还是城外好,皮!)城内风光无限,源码的海洋任我们遨游!
首先我们要对我们的目标有所了解,知道她有什么特点,有些什么功能。对对方都还不了解,就想着进入别人的内心世界,那不是臭不要脸嘛,我们要做一个有着流氓心的绅士;对她有个大致的了解了,就可以发起攻势,一举拿下。
那么怎么样了解了,方式有很多,我这里提供几种,仅供参考
最好的方式就是官方参考指南,亲生父母往往对孩子是最了解的,对孩子的描述也是最详细的;比如Spring Boot Reference Guide就是对springboot最详细的描述,怎么样使用springboot、springboot特性等等,通过此指南,springboot在你面前一览无遗;
但是,springboot毕竟是外国人的孩子,如果英语不好,估计读起来有点头疼了,不过我们有google翻译呀,咬咬牙也是能看的。源码世界的丈母娘、老岳丈是非常慷慨的!
其次是书籍,国外优秀的有很多,国内也不乏好书,比较推荐此方式,自成体系,让我们掌握的知识点不至于太散。这就是好比是源码的闺蜜,对源码非常了解,重点是挺大方,会尽全力帮助我们了解源码。
再次就是博客,虽然可能觉得知识点比较散,但是针对某个知识点却特别的细,对彻底掌握非常有帮助,园子内就有很多技术大牛,写的博客自然也是非常棒,非常具有学习价值。当然还有社区、论坛、github、码云等等。这就是源码的朋友圈,我们从中也能获取到非常多关于源码的信息。
设计模式的了解
优秀的框架、技术从不乏设计模式;jdk源码中就应用了很多设计模式,比如IO流中的适配器模式与装饰模式、GUI的观察者模式、集合中的迭代器模式等等;spring源码中也是用到了大量的设计模式。设计模式有什么优点、各适用于什么场景,不是本文的内容,需要我们大家自行去了解。
我们只需要对一些常用的设计模式有个大致了解,再去读源码是比较好的;不需要将23种设计模式都通读,也不需要将常用设计模式完全理解透;对于全部通读,我们时间有限,另外有些模式确实不太好理解、用的少,性价比不高,没必要全部都读。
推荐书籍:《Head First Design Patterns》(中文版:《Head First 设计模式》)、《Java与模式》;
另外我比较推荐的一种学习设计模式的方式是读别人博客:java_my_life,刘伟技术博客,chenssy的设计模式;
设计模式之于源码,就好比逛街购物之于女人,想顺利勾搭源码,我们需要好好掌握设计模式这个套路。
配合ide进行断点追踪
我们通过源码的圈子对源码的了解终究只是停在表面,终究还是没有走进她的内心,接下来我就和大家分享下,我是如何走进她的内心的!
相信看过我的源码博客的小伙伴都知道,我非常喜欢通过idea断点来进行源码追踪,断点追踪源码是我非常推荐的一种方式。断点不仅可以用来调试我们的代码,也可以用来调试我们用到的框架源码。
面对未知的、茫茫多的源码,我们往往没有足够的时间、经历和耐心去通读所有源码,我们只需要去读我们关注的部分即可(有人可能会说我都不关心,这?)。那为什么要用断掉调试的方式来跟源码,而不是直接从源代码入手去跟我们关注的部分呢?
尝试过的小伙伴应该知道,如果我们对源码不熟悉,直接通过源码的方式去跟,一方面很容易迷路(多态,会有很多子类实现),不知道接下来跟哪一个,另一方面也很容易跟丢,当我们跟入的很深的时候,很有可能就忘记上一步跟到哪了。所以读源码的重要性浅显易懂了。
2. 一个完全入门初学者如何学代码,读代码和写代码,,我想学代码不知道方向谁能给我指明一个方向
1、学代码:前提是你的有一个比较系统的学习。认真完成每一个课程中的案例。
2、读代码:分两步走:前期能读懂自己写的代码。 后期能读懂他人写的代码和大致的知道底层的某些源码的含义。多去看开发文档(开发文档建议使用官方提供的英文版、不要使用中文自己害自己)
3、写代码:前提是你要有基础。
3. 代码如何开始学习
建议你先学习C语言,C语言是最基础的东西。
1、学代码要有信心、恒心。
2、学代码要由浅入深,从简单到复杂。
拓展资料:
代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。代码设计的原则包括唯一确定性、标准化和通用性、可扩充性与稳定性、便于识别与记忆、力求短小与格式统一以及容易修改等。源代码是代码的分支,某种意义上来说,源代码相当于代码。现代程序语言中,源代码可以书籍或磁带形式出现,但最为常用格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码最终目的是将人类可读文本翻译成为计算机可执行的二进制指令,这种过程叫编译,它由通过编译器完成。
(参考资料:代码-网络)
4. 如何学习sqlite源码
先来说说sqlite的资料.
首先sqlite的资料其实是不多不少的.
不少的原因是因为这些资料确实能够让你明白sqlite的设计原理.
说它不多的原因是也就让你明白其原理, 仅此而已.
sqlite的资料主要来自四个地方, 从简到深依次为:
1.<>, 这是一本介绍sqlite"基本原理"的小书, 只有80页左右, 介绍了sqlite的"后端"原理. 这本书在网络有下载, 纯英文版的, 链接:inside sqlite_网络知道. 在上面的github上, 我们项目的同伴对这本书做了翻译, 不过还没完成, 建议直接扫原版.
2.官方文档, 连接:SQLite Documentation. 但是里面的文档对于学习者来说也有轻重之分, 建议主要阅读 "SQLite Technical/Design Documentation" 这一栏的技术文档.
3.<<SQLite Database System: Design and Implementation>>. 这也是一本说sqlite的小书, 不到200页. 这本书的内容其实和<<inside sqlite>>有重叠, 甚至不少地方的段落是直接复制过来的... 不过这本书比<<inside sqlite>>详细很多, 也建议扫描一遍. 这本书我目前在做翻译, 做了3,4,5,6四章的翻译了. 不过是很粗翻译, 不建议直接看...
4.源码注释. sqlite的源码注释非常详细, 详细到比上面两本书说的还多... sqlite的每份.c代码内的注释差不多快比代码还多了, 而且除了将基本架构外, 很多上述资料没有提到的细节, 也在源码注释中被提了出来.
================================================================
接下来说一下本人推荐的学习方法~~
================================================================
下面是认真学习的方法, 如果想快速暴力的学习, 直接看下一段.
想要认真点学习的话.
应该先去看"Architecture of SQLite"这篇文档, 该文档详细的介绍了sqlite的7层结构, 总体被分为了"前段", "中层VM", "后端".
看完arch.html那文过后, 你就知道"前端"主要做的是语法分析, "后端"主要实现了数据库性质(ACID, 增删查改).
个人建议从后端开始学习, 毕竟学习sqlite是学习怎么实现数据库.
后端的tree, pager, os三层, 其实都不难(起码理解起来不难),
我建议OS->PAGER->TREE这样边学习, 边写demo.
简要说一下我在学习这三层过程中遇到的一些点, 希望能帮到楼主.
OS:
os是很薄的一层, 主要是为了提高可移植性而被设计出来的.
学习这一层的方法很粗暴:看"The OS Backend (VFS) To SQLite", 然后去看源码中的"test_demovfs.c".
主要搞清下面三个结构体.
sqlite3_vfs
sqlite3_io_methods
sqlite3_file
在我github中的demo1.1中, 有一个更简单的demo, 可以参考看下里面的os.c, os.h, unix_os.c三份代码.
-------------------------------------------------
Pager:
Pager主要实现了三段功能: ACID, log, cache.
先说ACID:
ACID的这部分我只看了最最基本的方法, 然后选择跳过的, sqlite实现ACID的方法可以看"Atomic Commit In SQLite",
这里是我翻译的, 能看,
"how-to-implement-a-DB-like-sqlite/SQLite怎样实现原子性.md at master · qw4990/how-to-implement-a-DB-like-sqlite · GitHub".
除了这篇最基本的文档, 推荐看<<SQLite Database System: Design and Implementation>>的3章和4章, 看完能理解sqlite实现ACID的基本方法.
接着是cache, sqlite提供了插件式的cache结构, 所以你或许会惊讶为什么sqlite里面同时有pager.c, pcache.c, pcache1.c:
cache这个部分比较简单, <<inside sqlite>>第三章, <<SQLite Database System>>第五章都有详细的介绍, 主要讲解了pager实现cache的方法.
在我github中的demo1.1中, cache的功能也已经完成了, 1 可以参考看下里面的pager.h, pager.c, pcache.c, pcahce1这四份代码.
最后是log:
这部分我现在直接选择了忽视...
----------------------------------------------------
Tree层:
sqlite的tree层就是用B+/B-树维护数据, 以达到快速"增删查改"的目的.
这一层在官方文档里没多少资料.
先是算法本身, 也就是B+/B-/B树, 没什么好说的, 很多算法书都有.
接下来重点是sqlite怎么将B树应用到自身的数据库中的.
这一点可以看<<inside sqlite>>的第5章, <<SQLite Database System>>的第6章, 都有很详细的介绍.
<<SQLite Database System>>讲得更为仔细, 除了说原理外, 还说了sqlite里btree大致被分为了几个结构体在工作.
以上就是我学习后端遇到的一些点吧.
=============================================================
如果嫌弃上面的学习方法麻烦的话,
可以先扫一下"Architecture of SQLite",
接着再看一下"Atomic Commit In SQLite",
最后简单粗暴的把推荐的那两本书扫完,
也大致知道sqlite是怎么设计的了.
不过个人认为sqlite是一个"大师级的精致的工艺品", 光看完两本书就说自己学完了它, 未免有点"暴殄天物".
除了基本的数据库设计方法(也就是那两本书的内容), sqlite的源代码中所蕴含的编程技巧, 工程设计, 以及各种小考虑, 也是非常值得吸收学习的.
=============================================================
最后总结一下
如果想简单粗暴快捷的学习, 直接扫arch.html, atomiccommit.html和那两本书, 就能明白sqlite是怎样被设计的了.
如果想深入学习, 建议从7层开始向前学, 边翻文档边看源码边写demo.
5. 如何学习Tomcat的源码
方法/步骤
第一步 下载安装fiddler,fiddler2和4的版本对电脑里面net版本有要求。
第二步 打开fiddler 2,fiddler会及时抓取正在进行网络通讯的所以信息
第三步 因为网页后台会有自动刷新的进程,所以再抓取特顶网页COOKIE时候,先按住CTRL+X清楚现在记录的网页
第四步 以小米网站为例,刷新该网站。然后就会看见fiddler已经在记录一系列的网页,选定小米官网
第五步 然后在右侧的属性详情栏,即可以找到【cookie】
6. 如何学习hibernate源码
我来分享一下查看源码的方法:
查看源码的首要任务是要有一款上手的工具,这里用的是 IDEA。IDEA 的功能比较强大,包括 查看类结构图,debug。这两个是查看源码的关键功能。
查看源码可以静态查看和动态查看,静态查看的方法是查看类图,还有 ALT + f7 查看方法在哪里被调用或者类在哪里被调用。在看 spring 源码的时候就是用这种方法,不过这种方法对阅读者的要求比较高,包括要了解这个方法的执行,设计模式的理解,以及框架是如何配置这个类的。第二种方法是 debug。debug 方法是后来才发现的一个重要的 查看源码的方法,要点是掌握执行栈,就能掌握整个执行流程。比如这个是在debug hibernate 源码的时候的截图,可以看到这个执行栈非常深,从 spring-data-jpa 到 hibernate 中间经过好几层的代理,主要完成一些适配,事务,拦截器等等操作,然后再到 hibernate 核心代码,最后就是 jdbc 的 statement。方法栈中的每一个方法都是可以查看的,里面的变量有时候是代理了好几层,所以要 F7 进去才能看到真正的执行类。
上面是简单的简述 mybatis 的 cache 机制的源码,真正想让读者明白的是,debug 如何查看源码,查看源码需要抓住一个主题,不然在阅读庞大的框架的时候会找不着北。
所以,阅读源码需要掌握工具使用,debug, 查看类图,查看方法在哪里调用,软知识是要掌握设计模式,对框架的概念有了解。
7. 如何学习TensorFlow源码
如果从源码构建TensorFlow会需要执行如下命令:
bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
对应的BUILD文件的rule为:
sh_binary(
name = "build_pip_package",
srcs = ["build_pip_package.sh"],
data = [
"MANIFEST.in",
"README",
"setup.py",
"//tensorflow/core:framework_headers",
":other_headers",
":simple_console",
"//tensorflow:tensorflow_py",
"//tensorflow/examples/tutorials/mnist:package",
"//tensorflow/models/embedding:package",
"//tensorflow/models/image/cifar10:all_files",
"//tensorflow/models/image/mnist:convolutional",
"//tensorflow/models/rnn:package",
"//tensorflow/models/rnn/ptb:package",
"//tensorflow/models/rnn/translate:package",
"//tensorflow/tensorboard",
],
)
sh_binary在这里的主要作用是生成data的这些依赖。一个一个来看,一开始的三个文件MANIFEST.in、README、setup.py是直接存在的,因此不会有什么操作。
“//tensorflow/core:framework_headers”:其对应的rule为:
filegroup(
name = "framework_headers",
srcs = [
"framework/allocator.h",
......
"util/device_name_utils.h",
8. 怎么学习Element-ui的源码
平常一直在用element的组件. 去github上看下了,就是想系统的学习一下写这种ui组件库是怎样的一个过程.(平常一直在使用es6和vue2.0)
先看老版本。两个好处:一是老版本功能少点,便于学习。二是在你觉得看的差不多的时候,可以看看新版本增加了哪些功能,然后自己来实现。
2.先看js,把所有的js看完,再看css。
3.从简单的组件开始看。在看简单的组件之前应该会有自己对这个组件的理解,比如从button开始看,会觉得button不就是emit一下click事件吗,然后你再看他是怎么做的,除了你看之前就猜到的emit click事件以外还做了些什么。总之就是带着一点点思考看。
4.故意找茬。比如发现inputnumber这个组件用了input组件,而且还支持prepend和append的slot,那么你看看加上append之后会显示成什么样子。
5.记录下你在源码里读到的,并且官方文档里面没有提及的功能。
9. 如何学习java源码
Java是一种面向对象语言,Java语言类似于C++语言,所以已熟练掌握C++语言的编程人员,再学习Java语言就容易得多!Java程序需要编译,它被放置在Internet服务器上,当用户访问服务器时,Java程序被下载到本地的用户机上,由浏览器解释运行。实际上有两种Java程序:一种Java应用程序是一个完整的程序,如Web浏览器。
另一种Java小应用程序是运行于Web浏览器中的一个程序。Java程序和它的浏览器HotJava,提供了可让你的浏览器运行程序的方法。你能从你的浏览器里直接播放声音,你还能播放页面里的动画,Java还能告诉你的浏览器怎样处理新的类型文件。当我们能在2400 baud线上传输视频图象时,HotJava将能显示这些视频。
10. 如何学习开源软件源代码 csdn
导读:对于开发者来说,社区里丰富的开源代码其实是笔极为宝贵的财富。如果能充分利用好开放源代码的资源,不仅可以掌握多种编程方法,提高实践能力,还能获得好的思想,激发编程灵感。开源代码怎么学以及怎样才能学好是大家经常关注的话题,日前,在问答网站知乎上,有人抛出了“如何更有效地学习开源项目的代码?”的话题,众技术好手各抒己见,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的网友们,你们是如何对待开源项目源代码的呢?