阅读Java_如何阅读 Java 开源代码?

最近正在学习阅读源码,看到的大神许鹏的方法,感觉很有用,分享给大家

源码阅读其实是一个逆向的工程,这期间必须会遇到种种问题。一般来说,我会遵循这样一个思维范式——Problem domain→model→architecture&implementation→improvement→best practice。

1.首先搞清楚要分析的产品解决的问题是什么,这个问题在哪个大的范畴里,也就是要搞清楚problem domain。一个著名的开源产品必定在Wikipedia上有相应的条目,所以一开始去看wikipedia是破题的一种极好方式。

2.清楚要分析产品的大体框架和关键性的概念,也就是理解清楚architecture和key concept。

3.将分析的产品实实在在的运行起来,我一般选择debian或archlinux作为工作平台,它们提供了丰富的软件包,可以很快的将东西安装并运行。熟悉Linux本身对于开源项目的源码阅读还是大有裨益的。

4.修改日志级别,得到丰富的日志信息。有了这个为基础,再来开始真正的源码阅读和分析。

5.源码分析的时候,要始终问这几个问题。进程以及线程的启动顺序

搞清楚调用关系call flow这一部分代码是在同一个进程中么,同一个线程中么,运行在同一台机器中么

每一个线程都要问清楚,什么时候启动的,什么时候停止的

消息传递的路径,针对每一个函数,搞清楚,input是谁传给我的,output要传给谁,由哪个来传

搞清楚上述的问题之后,就将最开始提到的对architecture的了解做到具体而微了。有了这个基础之后,再继续往下问当前实现的性能如何,比如i/o, cpu, network 这个需要做相应的测试方面的试验

当前的解决方案还有优化空间吗,比如针对spark中的scheduling问题,就有sparrow的优化机制提出

6. 碰到具体的问题一时解决不了怎么办用好google,用好stackoverflow

将碰到的问题模型化,写一些验证性的代码,或者是写一个小的demo来验证,我在解决许多很妖的bug,也是采用类似的思路

找到相应的用户论坛,发帖虚心请教

如果还是不行,就先搁一搁,去看能看懂的地方

7. 编程语言选择源码阅读中可能遇到的一个问题就是这个语言是新近出来的,我根本没学过,我需要系统去掌握该语言之后,才能来看源码么。我的看法是可以边看边学,在掌握语言的过程中,牢牢把握住这几个问题基本语法:数据类型、控制语句、函数定义

是否支持FP

多态和继承

现代编程语言基本上都混合了面向过程,面向对象和函数式编程的特点,即便是C++或新近的java8都如此。

Storm用Clojure来编写,而Spark使用Scala,就语言的偏好来说,我更喜欢Clojure一些。

稍微总结一下,我想源码分析心中要有两幅大图,将整体与局部很好的结合起来思考一是太极图,要有整体性的思维,要对architecture有掌握,对其在整个生态系统中的定位要清楚,东方式的思维强调整体性

二是数学中常见的笛卡尔坐标体系,将大的问题拆分之后一一研究,做到具体而微,西方式的思维强调个性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网关Ocelot功能演示完结,久等了~~~

前言关于网关(Ocelot)的分享,还遗留一些功能没演示呢,接着来聊聊;这次重点针对网关Ocelot使用缓存、集成Polly做服务治理、集成IdentityServer4做认证授权来详细说说;如果对上一篇感兴趣,点这里(网关Ocelot功能演示安排…

数学课本上的几大变态

数学课本上的几大变态数据与算法之美用数据解决不可能长按扫码关注

读“苹果上周发布了Mac OS X Mountain Lion系统”新闻的感想

苹果上周发布了Mac OS X Mountain Lion系统,该系统将使得你的桌面电脑更像是一款手机。这种趋势非常明显,桌面操作系统未来将和移动系统进一步融合。 我们先从趋势本身说起。首先,相比此前的系统版本,苹果此次在Mountain Lion中更…

java 多行字符串_java字符串多行写法

有一个很长的字符串,想分成多行书写,主要为了美观。VB代码中可以将一个很长的字符串分成多行书写,例如:String str"adfasdfasdfas \asdfasdfasdfasdf \asdfasdf "Java 没有相似的处理方式。变通处理方式:Str…

牛逼顿的一生:当智商高到一定程度,情商就不重要了

牛顿老师在科学圈里曾经很有权势,被女王封了爵位成了贵族,人称牛爵爷,官至皇家造币局局长兼皇家学会会长。如果阿尔伯特没有辞了以色列总统的话和他有一拼。说他有权势并不仅是官大,主要是贡献大。如果17世纪就有诺贝尔奖的话&…

grep -A :显示匹配行和之后的几行

我经常用grep找东西,比如用户名和密码。大部分站点和用户名和密码都是在一样的,方便grep查找。有时,为了文本好看,我会放在多行。比如wikipedia多个语言版本上有多个账号,就放在wikipedia总栏目下。这时,光…

趣味图解+源码分析,轻松吃透Linux

如今的软件开发行业,服务器端市场基本被 Linux 系统占领了。移动端中的 Android 系统是基于 Linux 内核开发的,那些很火的虚拟化、消息队列、云计算、大数据等技术,都默认支持 Linux 操作系统。而对软件工程师来说,也几乎一定会遇…

java 发送tcp_Java TCP发送与接收

IP地址?端口号?主机名?什么是Socket?什么是UDP?什么是TCP?UDP和TCP区别?以上问题请自行百度,有标准解释,此处不再赘述,直接上干货!实例:发送端&a…

从零维到十维空间

事情是这样的,这周我给学生讲3dmax的课。为了让学生了解三视图我就顺便科普了一下什么是零维、一维、二维、三维空间。讲完不过瘾,感觉一支粉笔一块黑板讲维度是一件很爽的事情,那么.........接下来请同学们打开脑洞,看我用一支笔…

Linux的FHS(文件系统结构标准)剖析

Linux的FHS(文件系统结构标准)剖析 我们平时所说的Linux系统并不是说的某一个操作系统,而是指使用了由Linus Torvalds(林纳斯托瓦兹)发明并领衔开发的Linux内核的所有操作系统,Linux仅仅指的是该系统的内核…

如何更好使用多线程

说到线程相信很多开发人员都会认为只要使用了多线程技术服务性能就会提高很多,但涉及过渡使用问题就很少人去了解。在使用上更多是了解是创建,使用,销毁或使用线程池之类的。但这些资料更多是如何使用线程,但对于应用怎样针对性规…

java 接口的静态方法_Java8新特性:接口的默认方法与接口的静态方法

默认方法允许接口方法定义默认实现,子类方法不必须实现此方法而就可以拥有该方法及实现。如下:public interface DefaultFuncInter {int getInt();default String getString(){return "Default String";}}默认方法的优势默认方法主要优势是提供…

前端又一本升级版图书上市了,听说比第一版还好看

哇!听说《Node.js实战(第2版)》来了?没错!这本让读者久等了的书,终于上市啦!最近的升级版图书还是很多的,但是小伙伴对这本的期待值依旧不减!毕竟第一版在豆瓣上获得了 8…

人气TOP|当红炸子鸡「小明机器人」,出道走花路啦

在全球新一轮技术革命的时代背景下,越来越多的企业走上了数字化之路。伴随着企业对数字化转型的持续关注,各行各业对“数字化员工”即RPA(机器人流程自动化,Robotic Process Automation)的需求也越发旺盛,都…

MFC和Win32之三___CGdiObject类和windows Gdi对象

小结: 前面讲到的windows窗口对象,在windows下用句柄来代表之,并且用了一个数据结构WNDCLASS(窗口类)来描述之。同理,windows的Gdi对象也有一些句柄来代表之(比如hPen等)&#xff0c…

java io流 教程_Java基础教程:IO流与文件基础

Java:IO流与文件基础说明:本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦。走进流什么是流流:指的是从源到目的地的字节的有序序列。在Java中,可以从其中读取一个字节序列的对象称作 输入流,…

用数学模型向你解释离婚

A Mathematical Model of Sentimental Dynamics Accounting for Marital Dissolution解释离婚的情感动力学数学模型背景西方社会的离婚是普遍存在的。它提出了重大的科学和社会学问题,不管是理论上还是解决方式上。学者和问题处理专家认为存在一种情感关系热力学第二…

记一次 .NET医疗布草API程序 内存暴涨分析

一:背景 1. 讲故事我在年前写过一篇关于CPU爆高的分析文章 再记一次 应用服务器 CPU 暴高事故分析 ,当时是给同济做项目升级,看过那篇文章的朋友应该知道,最后的结论是运维人员错误的将 IIS 应用程序池设成 32bit 导致了事故的发生…

自已做的第一个autoconf程序(不断完善中)

2019独角兽企业重金招聘Python工程师标准>>> 1、先写个简单的main函数,并按如下目录结构存放: timesync-- |--conf |--include |--lib |--src 2、在最上层目录下,执行autoscan,生成configure.scan,并改名为…

3des加密 java php_php 3DES加密如何兼容Java

Java源码:import java.security.Security;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class ThreeDES {private static final String Algorithm "DESede"; //定义 加密算法,可用 DES,DES…