`
lishu-luo
  • 浏览: 3635 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

阅读开源代码的一些技巧分享

阅读更多
                                      转载请注明出处,作者:罗立树

    最近有人问我怎么学习源代码?怎么分析开源代码?的确在互联网行业中,采用了很多开放源代码,互联网的发展促进了开源代码的快速发展,在项目开发过程中,为了降低成本和提升项目的质量、开发效率等等,我们的思维形式往往就会考虑,这个系统实现是否有一些成熟的开源软件可以支持。正因为是开源的,质量其实也不能得到百分百的保证,有些问题可能本身开源的作者也没有遇到过或者没考虑周全,所以在拿过来用的时候也是存在风险的,另外我们通过源代码的分析阅读,掌握技术细节,这样就更加有利于我们今后线上的稳定,当然技术本身就是存在比较高的门槛的,能够熟练掌握,对于我们工作中有很多好处,这里不多说了。

很多人看源代码,一开始就一头扎进一堆代码中,然后跟着各个类文件或者代码流程,一点一点的跟踪,结果跟来跟去,把自己搞的越来越糊涂了,这种方式是不太高效的。

下面,根据我自己的一些经验,和大家分享一些阅读源代码的技巧。

1.阅读源代码前必须要有扎实的基础知识,没有扎实的基础知识,很难能够了解代码的实现细节。譬如阅读一个NIO框架必须要了解NIO的实现原理和细节,阅读Tomcat代码必须要知道JVM内存管理、Servlet标准、http协议、java类加载策略、线程池、网络IO等等知识。阅读Redis得掌握C语言编程、常用的数据结构、网络IO、系统内存管理、系统线程管理、libevent(知道redis为什么不用,和memcached做一些比较)等等,这里不一一列举了。所以即使不会,我们必须要在阅读源代码前做好准备,做好理论上的支持,没有理论的支持很多东西理解起来都是比较困难的。
2.先了解源代码都有哪些功能特性,在熟练使用的时候,再去深入挖掘。我们常说,知其然,再知道其所以然的一个过程。
3.先网上搜索一下相关开源框架的介绍,学习别人对该框架的评价和使用、分析等,分析出开源软件的设计思想,这是站在别人的基础上,牛顿说:站在巨人的肩膀上。
4.掌握软件工程,得学会软件设计的一些原则,什么依赖倒转原则、开闭原则、里氏代换原则等等,假如实现上采用面向对象的语言的话,还得学会设计模式,懂得变与不变分离的思想。
5.学会使用工具,精通debug技巧,先分析出各个子工程或者代码模块的依赖关系,然后将依赖关系理清楚,整理它的先后顺序和优先级,当我们把依赖关系弄明白了,自然入手也更加方便。
6.学会总体概括思维,理解好抽象,把握其总体架构,抓关键点,
  譬如学习Spring源代码,那Spring的核心功能就是IOC和AOP,那基于IOC的实现来说,是BeanFactory,而BeanFactory是通过分层的模式来对不同的运行环境进行隔离的,IOC的支持是通过BeanDefinition来进行管理的,而Bean的配置通过命名空间的支持。而AOP来说,它的入口是AopProxy(实现方式有Cglib和AopProxy),一方面是通过AOP来实现事务,支持Aspectj的面向切面编程,基于Aop实现一些不通过非入侵性编码就可以实现的功能。
Spring的哲学就是面向接口的,相互之间的调用关系可以通过接口分析就可以明确。
7.多动手应用实践和测试,根据以上的总体了解,然后构建相应的应用场景,边实践边debug,因为在软件设计过程中,代码量是非常大的,不做试验很难知道它到底是怎么回事。
8.学会总结、归纳,对所学的知识进行系统化概括,然后不仅局限于当前技术,学会比较,将多个同类产品之间的优缺点比较一下,譬如:redis和memcached都有什么优缺点,各自的应用场景在哪里更加好一些。在什么样的场景更加适合。
9.学会以审视的眼光来看,开源代码不一定就是最好的,在一些特别重要的关键设计中,看看该代码是否存在缺陷,假如自己来设计的话,是否有改进的地方。
10.技术码农是一个很苦很累的活,一定要有兴趣,需要坚持的去做,没有兴趣的话学什么都想急于求成,这样在理解过程中是有所遗漏和不全的,要学会在技术上进行多交流、多分享,这样才能更多的了解自己哪里存在不足。

好了,做了这么多总结,在今后的时间中,我会给大家带来一些源代码方面的分析的分享,短期的目标是以下内容:
1.《Spring源代码解读》
2.《Struts2源代码解读》
3.《Redis源代码解读》
4.其它等。。。。。

关于源代码阅读的一些技巧,和学习的一些方法论,欢迎大家一起讨论,共同进步
分享到:
评论

相关推荐

    吃透源代码——完整篇

    最近看了很多关于阅读源代码的技巧,但是都不是那么全面,近来闲暇,总结一下,分享给大家,希望对大家有帮助。

    larbin开源代码

    这是开源的Linux源代工具原码,用于网络获取资源,分享的原因是它各种技巧的用法,包括一个简单的webserver,文件上传工具,他的高效性很很被认同。

    Android 植物大战僵尸源码分享.rar

    开源源码Android 植物大战僵尸分享,前几年当时大家玩的很疯的游戏,早在几年前就推出了android片和IOS版,不过我看上去,这应该是仿写的植物大战僵尸,因为我觉得这么热的游戏官方怎么可能开源呢?  呵呵,通过这...

    JAVA上百实例源码以及开源项目

    百度云盘分享 简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    电赛历年试题&经验分享&代码程序资源

    通过阅读这些经验分享,参赛者可以学习到更多的解题策略、电路设计技巧以及项目管理经验,从而更快地提升自己的实践能力。 最后,代码程序资源是电赛中不可或缺的一部分。在竞赛过程中,参赛者需要编写大量的代码来...

    ACM-NOI-CSP比赛经验分享&代码程序资源

    这些资源包括开源社区、编程论坛以及一些优秀的代码实现和解题思路。通过利用这些资源,参赛者可以拓宽视野,学习他人的经验技巧,提高自己的编程水平。同时,文章也鼓励参赛者参加线上模拟赛和编程培训机构的课程,...

    Java开源项目之「自学编程之路」:学习指南+面试指南+资源分享+技术文章.zip

    面试经验和技巧:整理了常见的Java面试问题,并给出了答题建议和技巧。 代码和项目实例:提供了多个Java项目的源代码,方便学习者参考和实践。 学习笔记和心得:记录了学习过程中的重点难点和心得体会,有助于学习者...

    大创(大学生创新创业训练计划)经验分享&项目资源&代码程序资源

    开源社区上有大量的开源项目和代码库,同学们可以根据自己的需求找到合适的代码资源进行学习和借鉴。在线课程和教程则提供了系统的编程知识和实战经验,帮助同学们掌握更多的编程技巧。而学长学姐的经验则是一份宝贵...

    国外开源-太阳能动力FM Bug制作分享-电路方案

    输出电容的调整会使振荡器的频率稍微下降一些,因此必须在振荡器和输出调整之间切换,以使电路完全对准。 使用将PV面板放在阳光下,将您的接收器调整到错误信号,在户外聆听世界。模拟接收器最适合拾取信号,因为与...

    您好GitHub:在开放源代码的海滨上找到珍珠分享GitHub上有趣,入门级的开源项目

    中文| HelloGitHub分享GitHub上有趣,入门级的开源项目。兴趣是最好的老师,这里能够帮你找到编程的兴趣! 简介 这是一个面向编程新手,热爱编程,对开源社区关注人群的项目,内容每月28号以月刊的形式更新发布。...

    程序员简历模版资源.MD

    程序员论坛:在一些程序员论坛或社区中,可以找到其他程序员分享的简历模板和制作技巧,可以从中获得灵感。 招聘网站:一些招聘网站,如智联招聘、前程无忧等,也提供简历模板,可以直接在网站上填写和上传简历。 ...

    PHP+MariaDB数据库操作基本技巧备忘总结

    PHP+MySQL是比较常见的搭配,由于我主观上不太喜欢Oracle,而MySQL被它收购后,骨子里也发生了一些变化,因此我更换了MariaDB,仍然坚持MySQL当初开源信念的亲兄弟。本质上都是MySQL的内核,因此下面所有的数据库...

    leetcode信封-Reading_ecording:loveandshare总结项目冷技巧和分享刷题

    leetcode信封 项目介绍 项目 项目介绍 收集的设计模式 进行数据结构的刷题,代码是相关的 加密解密的一些方法 sock5协议的分解 fastapi的尝试 ...的一些冷技巧,非常实用 Django websocket与celery的结合 验证码

    leetcode中文版-algorithm:leetcode一些示例代码

    纷纷搞起了算法面试题,在这里分享一些我做题的经验, 先声明我自己也是一个菜鸡,我个人的算法能力局限于 二分查找 快速排序 图搜索 生成树 skip-list 等简易中等难度的范畴, 仅能应付常规面试题。 为应付算法面试...

    gongzhiq.github.io:IOS技术,原始码,Xcode技巧,国外优质技术文章,最新技术分享园地

    gongzhiq.github.io:IOS技术,原始码,Xcode技巧,国外优质技术文章,最新技术分享园地

    2018最新OA办公系统需求分析说明书

    本公众号将秉持活到老学到老学习无休止的交流分享开源精神,汇聚于互联网和个人学习工作的精华干货知识,一切来于互联网,反馈回互联网。 目前研究领域:大数据、机器学习、深度学习、人工智能、数据挖掘、数据分析...

    jQuery页面左侧伸缩下拉导航菜单

    本公众号将秉持活到老学到老学习无休止的交流分享开源精神,汇聚于互联网和个人学习工作的精华干货知识,一切来于互联网,反馈回互联网。 目前研究领域:大数据、机器学习、深度学习、人工智能、数据挖掘、数据分析...

    订单管理系统JAVASSM

    本公众号将秉持活到老学到老学习无休止的交流分享开源精神,汇聚于互联网和个人学习工作的精华干货知识,一切来于互联网,反馈回互联网。 目前研究领域:大数据、机器学习、深度学习、人工智能、数据挖掘、数据分析...

    Python-3.5.6linux压缩包

    本公众号将秉持活到老学到老学习无休止的交流分享开源精神,汇聚于互联网和个人学习工作的精华干货知识,一切来于互联网,反馈回互联网。 目前研究领域:大数据、机器学习、深度学习、人工智能、数据挖掘、数据分析...

Global site tag (gtag.js) - Google Analytics