发展方向

吐槽:

还没来得及回忆,大学就已经过去了一半。

两年里,接触了很多计算机方面的知识,C/C++、汇编、oracle、java、linux、数据库、数据结构、jsp、php、ssh、设计模式、个人网站搭建、安卓、微信……以及最近在学的.net、单片机、网络安全、加密解密、软件破解、软件工程等等。太多的方向,涉猎算是足够了,是时候选择一个方向深入研究了!毕竟全才几乎等于庸才!

经过一段时间的思考,我决定选择深入研究java,这门业界公认的最优美语言。原因嘛,很充分!最重要的一点是,学习java,让我感觉很流畅,很舒服;其次,它开源,可以让我深入研究学习,直到我可以自己设计出java;然后,java应用范围广,就业前景很好,以后转安卓、大数据、云计算也方便;还有,它拥有最多的开源项目,开源框架,可供我一直学习下去!也许还有其他原因,暂时就想到这些,嗯,就这样。

决定了方向,全世界都会为我让路?NO!那就自己开路!

目标:

可以自己设计出java,设计出类似ssh的开源框架!

途径:

阅读源码,思考,写demo!

近期计划:

重新思考做过的项目 –> 读java源码 –> 读ssh框架源码 –> 写出类似ssh的框架。


参考文档:

开源项目阅读步骤

来源:javaeye

开源项目已阅读了不少,总结下来按照下面的steps来操作比较恰当:

1)阅读features。以此来搞清楚该项目有哪些特性

2)思考。想想如果自己来做有这些features的项目该如何构架

3)下载并安装demo或sample。通过demo或sample直观地感受这个项目

4)搜集能得到的doc,尽快地掌握如何使用这个项目

5)如果有介绍项目架构的文档,通过它了解项目的总体架构,如果没有,通过api-doc了解源码包的结构

6)分两遍来阅读源码。第一遍以应用为线索,以总体结构为基础,阅读在应用中使用到的类和方法,但不用过深挖掘细节,对于嵌套调用,只用通过函数名了解最上层函数的意义,这一遍的目的在于把大致结构了然于心。第二遍就是阅读类和方法的实现细节,以第一遍的阅读为基础,带着疑问去阅读那些自己难以实现的模块。

7)总结。回味这个项目设计上的精妙,用到了哪些设计模式,能在哪些领域可以借鉴等等。


源码阅读思考

来源:360doc
最近有做源码阅读的事情,觉得有些费尽,做了一些思考。

一个大项目的源代码,不要过份详细的阅读。大项目,其代码量基本上是可以吓死人的。过份的关注细节,常常会拘泥于细节,而忽略了整体框架。当你能够看清框架的时候,亦花费了太多的时间。

因此,阅读一个大项目的源代码,其目的不在于欣赏代码细节,而在于迅速看清项目整体框架的大概面貌:都有那些模块,这些模块是干嘛的(不关心具体怎么干),模块之间的通讯机制大概是怎样的,然后在考虑子模块,通常只要掌握两级子模块就够了。花上1,2天的时间掌握这一切,就达到了阅读大项目源码的目的。因为一旦你掌握了框架,你就可以按照这个框架实现这个项目,虽然和原项目全然不同,但是完成的需求却是一样的。

在软件中,架构才是本质。

也许你指望详细阅读大项目源代码能看到高质量的代码,但是,大项目通常都是团队的劳动成果,每个人的不同水平造就了代码质量的高高低低,一个人在不同时间不同环境的代码质量也是不同的。要指望在大片源码面前找到高质量,简直是天方夜谭。

也许你要从阅读源码中掌握某项技术细节,比如bsp,又或者换装,那么,最好的建议是查找相关的技术文档以及文档上所附带的samplecode,这种samplecode一般不会附带任何干扰,简洁得只是为了证明该技术而存在的。如果没有这些东西,而只能从大项目源码中找的话,你提前先了解了框架,能更快的查找和定位到表达该技术的文件。但是通常都会比较不幸,因为你为了明白这一技术,通常要先理解混入其中的另一技术。

最后谈谈怎样才能阅读到高质量的源代码。何谓高质量?是指算法出人一表(比如某种o(1)的排序法)?还是采用了极端深奥的语言特性将某实现完美表达(比如模板的灵活运用)?无论是哪种,最好的来源是书,如《STL详解》,或者《inside XX》这样的东西。书的作者通常就是这些高质量代码的作者,他会带领你探索这些源码背后的真相。


如何阅读Java源码 阅读java的真实体会

来源:中国互联

刚才在论坛不经意间,看到有关源码阅读的帖子。回想自己前几年,阅读源码那种兴奋和成就感,不禁又有一种激动。

源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心。

说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃《Core Java》,你是很难从中吸收到营养的,特别是《深入Java虚拟机》这类书,别人觉得好,未必适合现在的你。

虽然Tomcat的源码很漂亮,但我绝不建议你一开始就读它。我文中会专门谈到这个,暂时不展开。

强烈的求知欲,我认为是阅读源码的最核心驱动力。我见到绝大多数程序员,对学习的态度,基本上就是这几个层次(很偏激哦):
1、只关注项目本身,不懂就baidu一下。
2、除了做好项目,还会阅读和项目有关的技术书籍,看wikipedia。
3、除了阅读和项目相关的书外,还会阅读IT行业的书,比如学Java时,还会去了解函数语言,如LISP。
4、找一些开源项目看看,大量试用第三方框架,还会写写demo。
5、阅读基础框架、J2EE规范、Debug服务器内核。
大多数程序都是第1种,到第5种不光需要浓厚的兴趣,还需要勇气:我能读懂吗?其实,你能够读懂的。

耐心,真的很重要。因为你极少看到阅读源码的指导性文章或书籍,也没有人要求或建议你读。你读的过程中经常会卡住,而一卡主可能就陷进了迷宫。这时,你需要做的,可能是暂时中断一下,再从外围看看它:如API结构、框架的设计图。

我就说说如何读Java源码,以及我曾经的阅读感悟。

Java源码初接触
如果你进行过一年左右的开发,喜欢用eclipse的debug功能。好了,你现在就有阅读源码的技术基础。

我建议从JDK源码开始读起,这个直接和eclipse集成,不需要任何配置。

可以从JDK的工具包开始,也就是我们学的《数据结构和算法》Java版,如List接口和ArrayList、LinkedList实现,HashMap和TreeMap等。这些数据结构里也涉及到排序等算法,一举两得。

面试时,考官总喜欢问ArrayList和Vector的区别,你花10分钟读读源码,估计一辈子都忘不了。

然后是core包,也就是String、StringBuffer等。

如果你有一定的Java IO基础,那么不妨读读FileReader等类。我建议大家看看《Java In A Nutshell》,里面有整个Java IO的架构图。Java IO类库,如果不理解其各接口和继承关系,则阅读始终是一头雾水。

Java IO 包,我认为是对继承和接口运用得最优雅的案例。如果你将来做架构师,你一定会经常和它打交道,如项目中部署和配置相关的核心类开发。

读这些源码时,只需要读懂一些核心类即可,如和ArrayList类似的二三十个类,对于每一个类,也不一定要每个方法都读懂。像String有些方法已经到虚拟机层了(native方法),如hashCode方法。

当然,如果有兴趣,可以对照看看JRockit的源码,同一套API,两种实现,很有意思的。

如果你再想钻的话,不妨看看针对虚拟机的那套代码,如System ClassLoader的原理,它不在JDK包里,JDK是基于它的。JDK的源码Zip包只有10来M,它像是有50来M,Sun公司有下载的,不过很隐秘。我曾经为自己找到、读过它很兴奋了一阵。

Java Web开发源码
在阅读Tomcat等源码前,一定要有一定的积累。我的切实体会,也可以说是比较好的阶梯是:
1、写过一些Servlet和JSP代码。注意,不是用什么Struts,它是很难接触到Servlet精髓的。用好Struts只是皮毛。
2、看过《Servlet和JSP核心编程》
3、看过Sun公司的Servlet规范
4、看过http协议的rfc,debug过http的数据包

如果有以上基础,我也不建议你开始读Tomcat源码。

我建议你在阅读Tomcat源码前,读过Struts源码,Struts源码比WebWork要简单得多。这个框架是可以100%读懂的,至少WebWork我没有100%读懂。我曾经因为读懂了Struts源码,自己写过一个 Web框架。

当然,在读Struts框架前,最好看过它的MailReader等demo,非常非常不错的。

如果你做过一些Struts项目,那么读它时就更得心应手了。

在读Struts前,建议看看mvnforum的源码,它部分实现了Struts的功能,虽然这个BBS做得不敢恭维。

如果你读过Struts,再开始考虑Tomcat源码阅读吧。

不过,我还是不建议直接读它,先读读onJava网站上的系列文章《How Tomcat Works》吧,它才是Tomcat的最最简易版。它告诉你HttpServletRequest如何在容器内部实现的,Tomcat如何通过Socket来接受外面的请求,你的Servlet代码如何被Tomcat容器调用的(回调)。

学习JSP,一定要研读容器将JSP编译后的Servlet源码。

为什么我总是称呼Tomcat为容器,而不是服务器?这个疑问留给大家吧。

如果你一定要读Tomcat,那么就读Jetty吧。至少它是嵌入式,可以直接在eclispe里面设置断点debug。虽然Tomcat也有嵌入式版本。

Java数据库源码阅读
我建议,先读读Sun的JDBC规范。

我想你一定写过JDBC的代码,那么这时候可以开始阅读源码了。

如果了解JDBC规范(接口),那么它的实现,JDBC Driver就一定要开始了解,我的建议是,读读mysql的jdbc驱动,因为它开源、设计优雅。在读mysql的JDBC驱动源码时,建议看看 mysql的内幕,官方正好有本书,《Mysql Internals》,我五年前读过一部分。比如你可以知道mysql的JDBC驱动,如何通过socket数据包(connect、query),给这个C++开发的mysql服务器交互的。

通过上面的阅读,你可以知道,你的业务代码、JDBC规范、JDBC驱动、以及数据库,它们是如何一起协作的。

如果你了解这些内幕,那么你再学习Hibernate、iBatis等持久化框架时,就会得心应手的。

读过JDBC驱动,那么下一步一定要读读数据库了。而正好有一个强大的数据库是用Java开发的,Hsqldb。它是嵌入式数据库,比如用在桌面客户端软件里,如Mail Client。

Java通讯及客户端软件
我强烈推荐即时通讯软件wildfire和Spark。你可以把wildfire理解成MSN服务器,Spark理解成MSN客户端。它们是通过XMPP协议通讯的。

我曾经在一个项目中,定制过Spark,当然也包括服务端的一些改动。所以它们的源码我都读过。

我之所以推荐它们。是因为:
1、XMPP够轻量级,好理解
2、学习Socket通讯实现,特别是C/S架构设计
3、模块化设计。它们都是基于module的,你既可以了解模块化架构,还可以了解模块化的技术支撑:Java虚拟机的ClassLoader的应用场景。
4、Event Driven架构。虽然GUI都是Event驱动的,但Spark的设计尤其优雅
这么说吧,读它们的源码,你会为做一名程序员而自豪,因为无论是他们
的架构设计还是代码,都太漂亮了。

Java企业级应用
当然了,就是Hibernate、Spring这类框架。

在读Spring源码前,一定要先看看Rod Johnson写的那边《J2EE Design and Development》,它是Spring的设计思路。注意,不是中文版,中文版完全被糟蹋了。

在读Hibernate源码前,一定要读读Gavin King写的那本《Hibernate in Action》,同时,应该再读读Martin Fowler写的《企业应用架构模式》,它专门谈到持久化框架的设计思路。当你觉得这两本书读透了,再去看它们源码吧。

而且,在读源码前,你会发现它们用到很多第三方Jar包,二三十个,你最好把那些Jar包先一个个搞明白。

说到企业应用,一定会涉及到工作流。我当年读过jBPM的源码,网上有介绍jBPM内核的文章(银狐)。我感觉它的内核也就两千行,不要害怕。我曾经阅读jBPM源码的博客。

当然了,读工作流源码,前提是一定要对其理论模型有深入的了解,以及写过一些demo、或做过一些项目。

我上面介绍的这些,是我自己读过的,也适合一般人阅读。

我也读过一些非Java源码,感觉不错,也推荐给大家:

dojo源码 它的架构设计得很优雅,仿Java的import和extends。但实际应用起来一塌糊涂。我们当年基于这个开发了自己的框架,不过我不是主力。

Flex源码 Flex 08年底刚刚开源后,我就用它做过一个中型项目,应该说是国内的技术先行者。当时市面没有有深度的书,也没有开源项目。我纯粹是看Flex的Help文档和源码,把项目搞定的。两三年过去了,现在觉得系统设计得蛮优雅的。

好了,先介绍到这里。

上面说到的这些Java源码,我都是4年前、甚至更早读过的。技术变化这么快,像互联网的高速发展,催生很多高性能、分布式数据库,如hadoop。我一看,发现自己已经落伍了。

这几年,想必已经出现了很多优秀的框架,大家不妨分享出来。


阅读开源项目源代码的方法

来源:IT宅

最近在研究一个开源项目的源代码,庞大的类库和复杂的调用关系,看的有毫无头绪。

偶然间从网上看到了一篇不错的介绍如何读懂他人写的代码的文章,觉得非常不错,IT宅在这里分享给大家:阅读他人的程式码
以下是内容的摘录

1、读懂程式码,使心法皆为我所用
程式码是别人写的,只有原作者才真的了解程式码的用途及涵义。许多程式人心里都有一种不自觉的恐惧感,深怕被迫去碰触其他人所写的程式码。但是,与其抗拒接收别人的程式码,不如彻底了解相关的语言和惯例,当成是培养自我实力的基石。

1.1、读懂别人写的程式码,让你收获满满

1.2、先了解系统架构与行为模式,再细读
倘若撰写程式码是程式人的重要技艺之一,那么读懂别人的程式码,接着加以修改,也势必是另一个重要的技艺。
从程式码的启始点开始读起,一来要循序读完所有的程式码旷日费时,二来透过这种方式来了解系统,很难在脑中构建出系统的面貌,进而了解到系统真正的行为。所以,阅读程式码的重点,不在于读完每一行程式码,而是在于有效率地透过探索及阅读,从而了解系统的架构及行为模式。以便在你需要了解任何片段的细节实作时,能够很快在脑上对映到具体的程式码位置,直到那一刻,才是细读的时机。

1.3、熟悉沟通语言与惯例用语

1.4、掌握程式码撰写者的心态与习惯

2、摸清架构,便可轻松掌握全貌
在本文中,我们的重点放在:要了解一个系统,最好是采取由上至下的方式。先试着捕捉系统架构性的观念,不要过早钻进细节,因为那通常对于你了解全貌,没有多大的帮助。阅读程式码不需要从第一行读起,我们的目的并不是在于读遍每一段程式码。
学会分析绘制系统架构图。

2.1、阅读程式码的目的,在于了解全貌而非细节
我们在阅读文学作品通常是采循序的方式,也就是从第一页开始,一行一行地读下去,依循作者为你铺陈的步调,逐渐进到他为你准备好的世界里。阅读程式码却大大不同。我们很少从第一行开始读起,因为除非它是很简单的单执行绪程式,否则很少这么做。因为要是这么做,就很难了解整个系统的全貌。是的,我们这边提到了一个重点,阅读程式码的目的在于了解系统的全貌,而不是在于只是为了地毯式的读遍每一段程式码。

2.2、由上而下厘清架构后,便可轻易理解组成关系
如果你想要跳脱困境,不想浪费大量时间阅读程式码,却始终只能捕捉到对系统片段认识,就必须转换到另一种观点来看待系统。从个别的类别行为着手,是由下至上(自下而上)的方法;在阅读程式码时,却应该先采由上至下(自上而下)的方式。对程式码的阅读来说,由上至下意谓着,你得先了解整个系统架构。

2.3、了解架构,必须要加上层次感
不要忘了,我们采取的是由上而下的方式,要先摸清楚主建筑结构,至于壁纸的花色怎么处理,那是到了尾声时才会做的事。

2.4、探索架构的第一件事:找出系统如何初始化
系统如何初始化是很重要的一件事,因为初始化是为了接下来的所有事物而做的准备。
要了解一个系统,最好是采取由上至下的方式。先试着捕捉系统架构性的观念,不要过早钻进细节,因为那通常对于你了解全貌,没有多大的帮助。

3、优质工具在手,读懂程式非难事
系统的复杂度往往超过人脑的负荷。阅读程式码的时候,你会需要更多工具提供协助。使用好的整合式开发环境( IDE)的或文字编辑器,就能提供最基本的帮助。

善于使用各种优秀的IDE,方便跟踪阅读。
3.1、善用文字编辑器或IDE中,加速解读程式码
3.2、grep是一个基本而极为有用的工具
3.3、gtags可建立索引,让搜寻更有效率
3.4、再搭配htags制作的HTML文件,更是如虎添翼

4、望文生义,进而推敲组件的作用
先建立系统的架构性认识,然后透过名称及命名惯例,就可以推测出各组件的作用。
例如:当Winamp尝试着初始化一个插件时,它会呼叫这个结构中的初始化函式,以便让每个插件程式有机会初始化自己。当Winamp打算结束自己或结束某个插件的执行时,便会呼叫退出函式。
必须熟悉常用的软件词汇,熟悉各种命名习惯,方便推敲类或者方法的含义。学会阅读和使用UML类图。

4.1、好的说明文件难求,拼凑故事的能力很重要
你可以利用熟悉或者自己发明的表示工具,描述你所找到的情境。甚至可以只利用简单的列表,直接将它们列出。只要能够达到记录的目的,对程式码阅读来说,都能够提供帮助。或者,你也可以利用基于UML中的类别图,合作图,循序图之类的表示方法,做出更详细的描述。

4.2、探索架构的第一步─ ─找到程式的入口

4.3、系统多会采用相同的架构处理插件程式

4.4、随着实务经验,归纳常见的架构模式

4.5、善用名称可加速了解
“望文生义”很重要,我们看到函式的名称,就可以猜想到它所代表的作用。

5、找到程式入口,再由上而下抽丝剥茧
根据需要决定展开的层数,或展开特定节点,并记录树状结构,然后适度忽略不需要了解的细节─这是一个很重要的态度。因为你不会一次就需要所有的细节,阅读都是有目的的,每次的阅读也许都在探索程式中不同的区域。
探索系统架构的第一步,就是找到程式的入口点。找到入口点后,多半采取由上而下(自上而下)的方式,由最外层的结构,一层一层逐渐探索越来越多的细节。

5.1、展开的同时,随手记录树状结构

5.2、无法望文生义的函式,先试着预看一层
对于某些不明作用的函式叫用,不是望其文便能生其义的。当我们看到“
itunesdb_init_cc ( ) ”这个名称时,我们或许能从“ itunesdb_init ”的字眼意识到这个函式和苹果所采用的的iTunes数据库的初始化有关,但“循环”却实在令人费解。为了理解这一层某个子动作的真实意义,有时免不了要往前多看一层。

5.3、根据需要了解的粒度,决定展开的层数
适度地忽略不需要了解的细节,是一个很重要的态度,因为你不会一次就需要所有的细节,阅读都是有目的的。每次的阅读也许都在探索程式中不同的区域;而每次探索时,你都可以增补树状结构中的某个子结构。渐渐地,你就会对这个程式更加的了解。

6、阅读的乐趣:透过程式码认识作者
即便每个人的写作模式多半受到他人的影响,程式人通常还是会融合多种风格,而成为自己独有的特色,如果你知道作者程式设计的偏好,阅读他的程式码就更得心应手。
建立架构观点的认识是最重要的事情。虽然这一系列的文章前提为“阅读他人的程式码” ,但我们真正想做的工作,并不在于彻底地详读每一行程式码的细节,而是想要透过重点式的程式码“摘读” ,达到对系统所需程度的了解。

6.1、阅读程式码是新时代程式人必备的重要技能
由上而下的阅读方式,是因为我们重视架构更胜于细节。

6.2、好的名称能够摘要性地点出实体的作用

6.3、转换立场,理解作者的思考方式

6.4、从程式码着手认识作者独有的风格,进而见贤思齐

0%