转载请注明出处,作者:罗立树
最近有人问我怎么学习源代码?怎么分析开源代码?的确在互联网行业中,采用了很多开放源代码,互联网的发展促进了开源代码的快速发展,在项目开发过程中,为了降低成本和提升项目的质量、开发效率等等,我们的思维形式往往就会考虑,这个系统实现是否有一些成熟的开源软件可以支持。正因为是开源的,质量其实也不能得到百分百的保证,有些问题可能本身开源的作者也没有遇到过或者没考虑周全,所以在拿过来用的时候也是存在风险的,另外我们通过源代码的分析阅读,掌握技术细节,这样就更加有利于我们今后线上的稳定,当然技术本身就是存在比较高的门槛的,能够熟练掌握,对于我们工作中有很多好处,这里不多说了。
很多人看源代码,一开始就一头扎进一堆代码中,然后跟着各个类文件或者代码流程,一点一点的跟踪,结果跟来跟去,把自己搞的越来越糊涂了,这种方式是不太高效的。
下面,根据我自己的一些经验,和大家分享一些阅读源代码的技巧。
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.其它等。。。。。
关于源代码阅读的一些技巧,和学习的一些方法论,欢迎大家一起讨论,共同进步
分享到:
相关推荐
A4打印模板-画图设计设计师产品草稿图纸-网格纸A4打印模板高清待办练字模板PDF下载
ISA-95 流程圣经,描述了PLM企业资源计划、MES制造执行系统、ERP企业资源计划系统、SCM供应链管理系统、客户关系管理CRM之间的关系
颁奖领奖音乐在各种表彰、嘉奖或庆祝场合中扮演着至关重要的角色,其作用主要体现在以下几个方面: 1.营造氛围: 2.情绪引导: 3.节奏控制: 4.品牌塑造: 5.文化表达: 6.致敬与激励: 综上所述,颁奖领奖音乐在颁奖典礼中不仅作为背景音效存在,更是情感传递、氛围营造、流程把控、品牌塑造、文化展现和精神激励的重要载体,对于提升典礼的整体效果和观众体验有着不可忽视的影响。
这个项目是用于个人参加浙江大学移动创新竞赛而使用。
手绘稿模板iphone_x_wireframe_template_-_a4A4打印模板高清待办练字模板PDF下载
使用最简单的输入流和输出流实现 文件复制粘贴功能。这是第二种方式,与第一种方式的不同在于我们使用byte[]数组盛放从myFile读取到字节。比第一种方式,速度会快一些。
Web APIs-Dom获取&属性操作(理论+实战篇)-获取随机图片案例资料
免安装,无缝从Linux系统上传下载文件
apk导入手机文件夹下载
Screenshot_20240422_201618_com.ss.android.ugc.aweme.jpg
设计模式_结构型_外观模式
电气测量技术课程设计-基于STM32的电机状态检测系统 实现的功能有实时检测电机的转速、温度和姿态角度,可以通过串口或Labviwe读取 选用的模块包括霍尔传感器、DS18B20温度传感器和MPU6050陀螺仪传感器
大家找文章比较费劲的话,可以直接在这个资源里找我会持续更新的,大家冲就完事了,为了学习我的人进步的更快的方式,我可以贡献一下自己的代码,让大家观看。 心理上:希望自己分享的东西得到关注度,心里上有成就感 研究领域上:希望分享的东西可以促进同行之间的交流,加深自己的理解以及讨论中发现问题 综合来看:对自己做的东西有自信,对自己写的东西有自信 我始终坚信,推动科学与技术发展的动力之一就是分享。分享有益,何谓劳也?得自己完成开发了项目中的功能很有成就感(自我感觉牛掰),于是分享在论坛可以和大牛们一起讨论,甚至提出建议进行修改完善,就这一点来说,分享代码对项目的推进是有好处的因为可以有成就感啊,分享出去可以炫耀一下,也可以与其他人交流交流 我们不妨开放一下我们的胸怀,不要怕别人学你的,也不要怕学不到别人的,做学问始终要恭谨甚至谦卑,时间长了,总归会发现,你的进步比别人的进步更快更高更强。 这是勉励您也是勉励我自己的话。从做项目角度来说,我是很乐意share的,也在自己的博客园、csdn、GitHub中share过自己的源码和笔记。首先需要说明一点:国内外均有很多很多人喜欢分享出自己的代码、总结
计算机技术是指评价计算机系统的各种知识和技能的总称。它涵盖了计算机硬件、软件、网络和信息安全等方面。计算机技术的发展使我们能够进行高效的数据处理、信息存储和传输。现代计算机技术包括操作系统、数据库管理、编程语言、算法设计等。同时,人工智能、云计算和大数据等新兴技术也在不断推动计算机技术的进步。计算机技术的应用广泛,涵盖了各个领域,如商业、医疗、教育和娱乐等。随着计算机技术的不断革新,我们可以更加高效地实现预期自动化、标准化
建筑网页插画界面XD源文件AdobeXD源码下载设计素材UI设计
网络安全相关的RSS订阅列表.zip
智创大赛主程序,Arduino开发
tomcat安装及配置教程 Tomcat安装及配置教程与功能介绍
java Netty源码解析-服务启动过程
百度Apollo学习:Routing模块结构和源码