`
lqixv
  • 浏览: 218275 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

我读源码的一点体会

    博客分类:
  • java
阅读更多

刚才读到了一篇推荐源码阅读的文章,不禁非常佩服那位牛哥。他3年时间读了很多的源码项目,让我不禁浮想联翩。我也介绍一下我个人读源码的一点体会。

 

我自己读过的是 ant 的源码,断断续续大约读了半年时间。从中我学到了非常多的东西,里面实在太多的东西值得回味!我是这样读的,先找到ant的入口,然后从主类开始阅读(其实主类非常简单的)。然后再从点到面,细细地往下读。对于自己想深入了解的,就进入接口内部,继续往下读。阅读的时候,我发现,ant 并没有我想象中的那么复杂,而是非常简单。给我的感觉是,你只要写过一些 java 程序,估计就差不多都能读懂。ant 的程序结构非常清晰,类名、方法名写的很好,你看类名和函数名,就知道它做了什么,注释也写得不错。有时候,有一些源码比较难懂,我就把那部分代码打印出来,一边阅读,一边标注,这样慢慢的也就搞懂了。不过,我也没有读全,只读了ant 的整体构架及部分细节,很多细节没有深入研究。原因是,我对我想了解的内容基本搞清楚了,对整体构架也能看得很清楚了,没必要或不想再了解其余部分细节了。其实,读 ant 的源码给我的感觉就像在读一颗树,先读根与主干,想深入,再读树枝,再想深入,最后就可以读到树叶,整体结构非常清晰。在阅读的过程中,如果你读到某根“树枝”了,不想继续深入读里面的“枝叶”了,就可以回来继续读其他的东西,也不影响你理解整棵“树”。因为 ant 的结构组织得非常合理,注释也写的很好,就不会像盲人摸象那样,一时象根柱子,一时象堵墙。因此读起来就感觉容易很多。

 

不过那篇推荐阅读源码的文章中介绍的那位牛哥,3年竟然读了很多的源码项目,让我佩服不已!不过也让我稍感疑惑,3年真的能阅读如此多的源码项目吗?于是,我妄自猜测,他可能是精读了一些个项目,而泛读了一些项目。我觉得这才比较合理一些。不过即使如此,也让人非常佩服了。其实,我个人觉得,看源码项目不需要多,只精读一两个,就已经足够你回味无穷了!其它的,只是泛泛读一部分,也可以了。

 

我也非常推崇大家去读一两个优秀的源码项目。其实读一些优秀的源码,并没有我们想象中的那么困难。尤其是你对其工作原理了解之后,读起来就更顺手一些。因为你只要去了解,这个项目是如何实现它所要实现的那些功能的,又是如何组织这个项目的,这样去组织这个项目有什么好处等等,这就差不多了。那样读过之后,即使没有读全,都会让人有非常大的收获!对个人能力的提高是非常有帮助的。

 

一点浅见,与大家共享。

分享到:
评论
34 楼 hobitton 2010-12-31  
别读ant了,里面的代码就是一坨,,不要把人给读废了,读代码找点好代码来读嘛。
33 楼 little_bill 2010-12-31  
听完楼主一席话。使我也想试试读一下源码了。
32 楼 findhappy7 2010-12-31  
1、功力不够不要硬着头皮去专,,没必要,,
2、不要为读源码而读源码,,,

代码见多了,,写多了,自然,,到时候就能读懂了,,
31 楼 躁动的绵羊 2010-12-31  
lqixv 写道
iq527 写道
keanu196492 写道
unika_ly12 写道
传送门,兄弟


同求传送门。


给学习J2EE的朋友一些值得研究的开源项目
http://miaoxiaodong78.blog.163.com/blog/static/187651362006111325440165/


应该是这篇


是的,就是这篇。

在看了一些回复,在这里给出两点建议:

1、建议刚开始阅读源码的时候,挑一些简单,但会使用的 源码项目 来读。我看有些朋友直接推荐去读 tomcat、去阅读 spring ,我不禁一头暴汗!原因是我个人觉得,这些东东太大了,可能不适合一般人阅读。举个例子,就像假如我说,爬山很好,上面空气清新。这时一位大牛过来说,兄弟,我推荐你爬珠穆朗玛,在上面不仅风光无限,而且你能体会到站在地球巅峰的感觉……

2、第二个建议是,建议读代码时,先从低版本的、功能相对单一一些的版本开始阅读。阅读完第一个版本后,通过版本比较工具(如 cvs 之类的),查找高一点的版本代码,做比对,看看作者做了哪些改进,同时最关键的是要思考,作者为什么要这么改(注意这一点特别特别重要)!最后,再看最新的版本。当在看完最新版本后,也许,你莫名会产生一个想法:“我是不是要造个轮子呢?……”

这两个建议只对普通人且之前没读过或很少阅读源码的人有效,不包括牛人。

另,感慨一下,俺只是个普通人 ,是个遇到困难可能就会放弃、遇到挫折可能会哭泣的普通人。只是见过些牛人后,不敢随便开口,所以只敢对一些和我差不多的普通朋友建议。我有个牛人兄弟,现在在淘宝里混的,在上学的时候,他学了2个月的汇编后,就直接去读 ms-dos 的3个启动文件了(那时还是dos 3.0 的时代),一个学期下来后,写了个病毒,当年最牛的杀毒软件 kv300,必须单独写一个专杀这个病毒的程序,才能杀他的病毒。2000年左右的时候,学了段时间 c/c++,然后又去把 apache 源码搞了个通透。对这些牛人,他们的专劲、他们的韧性,俺们只能仰望,心里小小地自卑了一把后,然后跟他们绝口不谈技术……嘿嘿



我想问一句,你同事退休了吗?或是还活着吗?
30 楼 lxs647 2010-12-30  
深有同感,只有出问题了才会想到去读源码、、、、、、、、
29 楼 lqixv 2010-12-30  
yuaoi 写道
看lz的文章,挺受益的。
不过lz也该更进一步把那个牛人兄的链接一起送上啊。嘿嘿。。。
但是,我想搜的时候了,藕断丝连反反复复搜出了不少超级有用的东西:
全都说到一部分人包括我在内的心坎去了,
祛除浮躁,建立体系迫在眉睫呢。。。
看来“网络阅读”很重要啊,真该重视起来,难怪无头苍蝇一样乱撞的,收获甚微。
我先google“3年 读源码项目”,选第二个:
http://www.iteye.com/wiki/topic/854647
然后je里的zwchen牛的文章:
网络阅读,为什么人会浮躁?
http://www.iteye.com/topic/698774
觉得讲得真好,相见恨晚的感觉。
当然zwchen牛的很多文章都是挺不错的,上次那个求职经历尤为坎坷。详细可以去看他的博客。
特此分享。





谢谢这位兄弟发分享!!!我刚才跑到里面看了后不禁悔恨不已,自己在 je 时间也不短了,竟然还不知道他,实在应该早点去读他的博客的!

再一次说声多谢你的分享!!!
28 楼 hastune 2010-12-30  
要是为了读懂整个框架的没一处源码,难度有点太大了。
分开部分读比较好啊
27 楼 hastune 2010-12-30  
源码写得那么棒。
去找一些代码去学学,日积月累就懂得多了。
26 楼 ahuango 2010-12-30  
断断续续花了2个月时间去读H2的源码,发现才读了1/N。实在是入不了门啊
25 楼 lqixv 2010-12-30  
iq527 写道
keanu196492 写道
unika_ly12 写道
传送门,兄弟


同求传送门。


给学习J2EE的朋友一些值得研究的开源项目
http://miaoxiaodong78.blog.163.com/blog/static/187651362006111325440165/


应该是这篇


是的,就是这篇。

在看了一些回复,在这里给出两点建议:

1、建议刚开始阅读源码的时候,挑一些简单,但会使用的 源码项目 来读。我看有些朋友直接推荐去读 tomcat、去阅读 spring ,我不禁一头暴汗!原因是我个人觉得,这些东东太大了,可能不适合一般人阅读。举个例子,就像假如我说,爬山很好,上面空气清新。这时一位大牛过来说,兄弟,我推荐你爬珠穆朗玛,在上面不仅风光无限,而且你能体会到站在地球巅峰的感觉……

2、第二个建议是,建议读代码时,先从低版本的、功能相对单一一些的版本开始阅读。阅读完第一个版本后,通过版本比较工具(如 cvs 之类的),查找高一点的版本代码,做比对,看看作者做了哪些改进,同时最关键的是要思考,作者为什么要这么改(注意这一点特别特别重要)!最后,再看最新的版本。当在看完最新版本后,也许,你莫名会产生一个想法:“我是不是要造个轮子呢?……”

这两个建议只对普通人且之前没读过或很少阅读源码的人有效,不包括牛人。

另,感慨一下,俺只是个普通人 ,是个遇到困难可能就会放弃、遇到挫折可能会哭泣的普通人。只是见过些牛人后,不敢随便开口,所以只敢对一些和我差不多的普通朋友建议。我有个牛人兄弟,现在在淘宝里混的,在上学的时候,他学了2个月的汇编后,就直接去读 ms-dos 的3个启动文件了(那时还是dos 3.0 的时代),一个学期下来后,写了个病毒,当年最牛的杀毒软件 kv300,必须单独写一个专杀这个病毒的程序,才能杀他的病毒。2000年左右的时候,学了段时间 c/c++,然后又去把 apache 源码搞了个通透。对这些牛人,他们的专劲、他们的韧性,俺们只能仰望,心里小小地自卑了一把后,然后跟他们绝口不谈技术……嘿嘿
24 楼 生活小丑 2010-12-30  
我最近在看Spring的源码,感觉需要从整体上看比较好,这样可能收获会比较大一些,一开始就钻进里面的细节里去看,只见树木不见森林,感觉有点盲目或者是其他,呵呵,不太会说,反正就是感觉这样不太好。求指点.....
23 楼 jacksv123 2010-12-30  
想当初为了了解EXTjs,我都去读了一些源代码,当时对javascript不是很了解,感觉很痛苦
22 楼 whiletrue 2010-12-30  
parwin2 写道
nullpoint 写道
想读源码的时候一般都是项目出问题的时候

赞同此想法,因为我工作中就是这样干的,项目出问题的时候想读源码然后解决问题。

赞同,精力有限啊
21 楼 michael.softtech 2010-12-30  
先认真读一个框架的源代码,然后其他的就变得非常容易了。
像我,是先从tomca和spring开始的。一个代表了web server,一个代表了
应用框架。 两个框架都非常有代表性。我觉得想读的兄弟也可以从这两个入手,
花点时间读个大概,然后慢慢啃....
20 楼 iq527 2010-12-30  
keanu196492 写道
unika_ly12 写道
传送门,兄弟


同求传送门。


给学习J2EE的朋友一些值得研究的开源项目
http://miaoxiaodong78.blog.163.com/blog/static/187651362006111325440165/


应该是这篇
19 楼 keanu196492 2010-12-30  
unika_ly12 写道
传送门,兄弟


同求传送门。
18 楼 dengtl 2010-12-30  
初学者源码学习路线:java logging 框架 -> JAAS -> Spring Security
                    Spring其它源码,看你兴趣了,Spring-WS不错。
                    HSQLDB数据库方面的,相当不错,易理解。
17 楼 aq1sw2 2010-12-29  
最近羡慕需要,在读HQ的源码,看了一个半月了,有兴趣的一起讨论讨论
16 楼 java_mike 2010-12-29  
piao_bo_yi 写道
我的经验是,读源代码之前最好熟练使用系统。构思一下如果是你,该怎么样设计,再看源代码。一般的情况是,如果你没有接触过类似的程序,很有可能你读不出来整体的逻辑。当你经过很长时间后,你才明白整体逻辑。有时候你虽然觉得代码简单,但其实是错觉。只是看出来每个单个零件,没有看出来整体。毕竟面向对象的代码,最起码类名得是人类得容易理解的。最好再调试一下,有助于理解。
P.S.读过的代码:Minix(OS), Tomcat... 

+1
15 楼 piao_bo_yi 2010-12-29  
我的经验是,读源代码之前最好熟练使用系统。构思一下如果是你,该怎么样设计,再看源代码。一般的情况是,如果你没有接触过类似的程序,很有可能你读不出来整体的逻辑。当你经过很长时间后,你才明白整体逻辑。有时候你虽然觉得代码简单,但其实是错觉。只是看出来每个单个零件,没有看出来整体。毕竟面向对象的代码,最起码类名得是人类得容易理解的。最好再调试一下,有助于理解。
P.S.读过的代码:Minix(OS), Tomcat... 

相关推荐

    MongoDB分片集群搭建教程:副本集创建与数据分片

    内容概要:本文提供了详细的MongoDB分片集群的搭建指导,涵盖了从环境准备、配置文件编写、副本集的建立、主节点的选择、配置服务器和数据分片服务器的配置到最后的路由节点的搭建与操作整个流程,以及对数据库的哈希与范围两种分片策略的应用介绍和具体命令执行。 适合人群:熟悉NoSQL数据库概念并对MongoDB有一定了解的技术人员,尤其是在大型数据管理和分布式数据库架构设计中有需求的开发者。 使用场景及目标:帮助技术人员掌握构建高效能、高可用性的MongoDB分片集群的方法,适用于处理大规模、实时性强的数据存储与读取场景。 其他说明:文中通过实例演示了每个步骤的具体操作方法,便于跟随文档实操,同时也介绍了可能遇到的问题及其解决方案,如在没有正确配置的情况下试图写入数据时出现错误等情况的处理。

    CPPC++_嵌入式硬件的物联网解决方案blinker库与Arduino ESP8266 ESP32一起工作.zip

    CPPC++_嵌入式硬件的物联网解决方案blinker库与Arduino ESP8266 ESP32一起工作

    CPPC++_逆向调用QQ Mojo IPC与WeChat XPlugin.zip

    CPPC++_逆向调用QQ Mojo IPC与WeChat XPlugin

    CPPC++_现代活动指标.zip

    CPPC++_现代活动指标

    CPPC++_Xournal是一款手写笔记软件,支持PDF注释,使用C语言编写,支持GTK3,支持Linux,如Ubu.zip

    CPPC++_Xournal是一款手写笔记软件,支持PDF注释,使用C语言编写,支持GTK3,支持Linux,如Ubu

    基于SSM学生实习管理系统前台小程序与后台管理系统开发实践

    资源概述: 本资源提供了一套完整的学生实习管理系统解决方案,涵盖了前台小程序页面与后台管理系统两大模块。前台小程序页面设计简洁直观,用户可根据不同身份(学生或企业)进行登录。学生用户能够方便地浏览并投递感兴趣的实习岗位,而企业用户则能轻松发布实习信息,吸引优秀人才。后台管理系统功能全面,包括个人中心、首页、学生管理、教师管理、企业管理、招聘管理、评分管理以及实习管理等多个方面,为管理员提供了强大的数据管理和操作工具。 技术栈亮点: SSM框架:系统后台采用Spring、Spring MVC和MyBatis Plus(简称SSM)作为核心开发框架,确保了系统的稳定性、可扩展性和可维护性。Spring作为控制反转(IoC)和面向切面编程(AOP)的容器,为系统提供了强大的业务逻辑处理能力;Spring MVC则负责处理Web请求和响应,实现了前后端的分离;MyBatis Plus作为持久层框架,简化了数据库操作,提高了开发效率。 MySQL数据库:系统采用MySQL作为数据库存储解决方案,支持大数据量的存储和高效查询。 如有侵权请联系我删除,谢谢

    微服务闪聚支付项目.zip

    微服务闪聚支付项目

    Rust 与 Java 互调实战示例

    博客链接 https://blog.csdn.net/weixin_47560078/article/details/143714557 文章从原理介绍出发,实现了 Rust 与 Java 的互调。利用 JNI 技术,可以充分发挥 Rust 的性能优势,同时保持 Java 的跨平台特性。这种技术组合适用于对性能要求较高的应用场景,如图像处理、数据分析和系统级编程等。

    CPPC++_这是我翻译的艾根中文文档.zip

    cppc++

    Matlab实现斑马优化算法ZOA-TCN-Multihead-Attention多输入单输出回归预测算法研究.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    Matlab实现雪融优化算法SAO-TCN-Multihead-Attention多输入单输出回归预测算法研究.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    分布式事务lcn.zip

    分布式事务lcn

    基于Simulink的正弦波PWM技术和三次谐波注入PWM技术研究.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    【风电功率预测】基于BiTCN的风电功率多变量输入预测研究附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    CPPC++_这是由一块迷你带OV2640双DRV8833驱动TypeC接口PSRAM的ESP32PicoD4开发板驱.zip

    cppc++

    JAVA安卓手机与电脑的socket通信源码数据库 其他源码类型 WinForm

    安卓手机与电脑的socket通信源码

    Anaconda:JupyterNotebook使用教程.docx

    Anaconda:JupyterNotebook使用教程.docx

    Amazon S3:S3静态网站托管教程.docx

    Amazon S3:S3静态网站托管教程.docx

    Python商品销售数据分析可视化项目源码(期末大作业).zip

    Python商品销售数据分析可视化项目源码(期末大作业).zip,个人经导师指导并认可通过的98分大作业设计项目。主要针对计算机相关专业的正在做期末大作业设计的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,代码资料完整下载可用。 Python商品销售数据分析可视化项目源码(期末大作业).zip,个人经导师指导并认可通过的98分大作业设计项目。主要针对计算机相关专业的正在做期末大作业设计的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,代码资料完整下载可用。Python商品销售数据分析可视化项目源码(期末大作业).zip,个人经导师指导并认可通过的98分大作业设计项目。主要针对计算机相关专业的正在做期末大作业设计的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,代码资料完整下载可用。Python商品销售数据分析可视化项目源码(期末大作业).zip,个人经导师指导并认可通过的98分大作业设计项目。主要针对计算机相关专业的正在做期末大作业设计的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,代码资料完整下载可用。Python商品销售数据分析

    CPPC++_wechathookWeChatApi微信Api微信hook微信接口python微信接口java微信Ap.zip

    CPPC++_wechathookWeChatApi微信Api微信hook微信接口python微信接口java微信Ap

Global site tag (gtag.js) - Google Analytics