简历和自我介绍上经常能够读到“ 精通 Java” 这样的话,有人和我说,精通 Java 的人太多了,精通 Java 已经不能算亮点、不能给自己加分了。可是事实真是这样吗?
对于语言的学习,我有一种观点,一是纵向,即要选择一门自己认为合适的语言学到有相当的深度。二在于横向,即要学习不同类型、不同历史和不同门派的语言:
- 既有底层的语言,也有高级语言;
- 接触一些动态语言、函数式语言;
- 了解一些不同语言的编程范型和编程方式,比如基于原型编程、面向切面编程、命令式编程等等;
- 最好能关注一门年纪尚浅,甚至小众的语言,了解一门语言的发展。
横向类比能够带来对一门语言的不同认识,但是,有广度而没有深度的专家是可笑的,深入地学习一门语言是不可缺少的。就以 Java 为例,依我看来,至少有这样几个递进的过程:
语法语义 。
这是最基础的部分,都说 Java 简单,语法容易学习,但是,真要细说起一些细节来,也真够我啰嗦了。我见过一些所谓的“ 精通 Java” 的人,他们却不知道 strictfp 关键字,说不清 volatile 和 transient 的作用,不知道怎么去定义一个注解(@interface)。你觉得这些要求苛刻吗?对这些以“ 精通” 要求自己的人。
熟悉语言的应用范围 。
不同的语言有不同的擅长应用领域。就像想用 Java 去写操作系统或底层代码是多么不靠谱一样,在这个过程中应当熟悉语言的优势劣势,这里你自己会提出自己的见解。譬如 Java 最 NB 的地方在哪里?
- 跨平台?可是很多语言都可以跨平台;
- 开源?那开源的语言多了去了;
- 高性能的虚拟机?包括先进的编译解释优化技术;
- 还是那么多用 Java 实现的类库、框架呢?
把那些用 Java 实现的类库和框架脱离出 Java 语言本身来归类,未必是恰当的。熟悉 Java 就必须阅读许多类库和框架的源码。
学习语言的实现机制 。
就像精通 Java 的程序员需要了解 Java 虚拟机一样,也许不需要对虚拟机规范一清二楚,但是起码要知道 CAFE BABE 吧?起码要了解 JIT 的机制吧?起码要明白垃圾回收策略中的 CMS 吧?起码要能尝试自己编译一把 JDK 吧?起码要能去定位那些无响应的 Java 程序问题吧? 在这个过程中,从了解一门语言,将逐渐进化到去了解一门语言所处的平台 。
整理语言发展的历史 。
为什么学习编程语言也要关注它的历史?因为去了解一门语言的发展历史(比如这篇关于 Java 多线程编程的历史),可以明白在这过程中碰了什么壁、犯过什么错、有哪些大的变更,学过别人家什么东西…… 这对于分析现今这门语言与其他语言的碰撞、展望一门语言的未来大有益处。在这个过程中,会不由自主地将其和不同时期的其他语言比较。如果给你一次重新设计这门语言的机会,你一定能够提出不少改善的意见来。
我从来不相信精通 Java 是一件容易实现的事情。有一股风潮,说搞底层研究的人看不起搞上层业务的人,写 C 的人认为写 Java 的人没水平,做后台的人觉得做前台的没技术含量…… 我说,何必呢?
技术无贵贱,只是专注的领域不同而已。
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》
“ 我见过一些所谓的’ 精通 Java‘ 的人,他们却不知道 strictfp 关键字,说不清 volatile 和 transient 的作用,不知道怎么去定义一个注解(@interface)。你觉得这些要求苛刻吗?对这些以“ 精通” 要求自己的人。”
请问你讲的这些有用吗?可以说除了会定义注解还稍微有点用以外,其余都是垃圾功能,用人单位不会因为你多知道几个关键字而多给你半分钱!什么叫精通?需要你干活用的东西全会就叫精通!连活都还干不了去学那些几乎没人用没人学的东西,不说什么了。
敢问 CAFE BABY 是啥?
CAFE BABE,笔误了,谢谢指正。
想请教一下 strictfp 导致差别的一个例子,我用的是 jdk1.7.0_02,用的是 windows7 的 eclipse3.7 下 javaw 默认选项编译,但是在给出的例子中均得到一样的结果。
1.does it actually make a difference 给出的例子,无论是否使用 strictfp 均得到:
2.Java 中的 strictfp 关键字 中的两个例子得到的结果:
和那篇博客的结果不一样。
java language specification 15.4 中没有举出相关的例子,所以向你指教!
我试了一下。和你的结果是一致的。对于你第一个链接,链接上的第一个问题其实和 strictfp 没有关系,连接上提到的第二个问题我也和你的结果是一致的。也就是说,这个例子吧并不能说明 strictfp 的作用。
使用 strictfp 只能保证 float 和 double 严格符合 IEEE-754 规范,但是并不能说如果不使用这个关键字就一定不合规范。我想差异性会和不同的硬件平台有关,所以我不知道我这样在我的机器上尝试能否尝试出结果来。
事实上,你给的帖子里面也有类似的回答,我回去再翻翻资料看:
> can anyone come up with en example that shows a difference?
An example that is found to show a difference on one machine would not
necessarily show a difference on another machine.
那就是说如果没有 strictfp 关键词,某种具体的 JVM 实现可以不按照 IEEE754 来处理浮点型,但是如果有了 strictfp 的话这种 JVM 必须按照 jls 的规定使用 IEEE74 规范处理。也就是说最终 strictfp 的作用是增强了可移植性而不是精度。不知道这样的理解是否正确?
我翻了 jsl7,只有这样的叙述:
同时,也有说到编译期的常量表达式都是 FP-strict 的,这种情况无论是不是使用了 strictfp 关键字。