Skip to content

四火的唠叨

一个纯正程序员的啰嗦

Menu
  • 所有文章
  • About Me
  • 关于四火
  • 旅行映像
  • 独立游戏
  • 资源链接
Menu

你真的精通 Java 吗?

Posted on 08/01/201206/23/2019 by 四火

java 简历和自我介绍上经常能够读到“ 精通 Java” 这样的话,有人和我说,精通 Java 的人太多了,精通 Java 已经不能算亮点、不能给自己加分了。可是事实真是这样吗?

对于语言的学习,我有一种观点,一是纵向,即要选择一门自己认为合适的语言学到有相当的深度。二在于横向,即要学习不同类型、不同历史和不同门派的语言:

  1. 既有底层的语言,也有高级语言;
  2. 接触一些动态语言、函数式语言;
  3. 了解一些不同语言的编程范型和编程方式,比如基于原型编程、面向切面编程、命令式编程等等;
  4. 最好能关注一门年纪尚浅,甚至小众的语言,了解一门语言的发展。

横向类比能够带来对一门语言的不同认识,但是,有广度而没有深度的专家是可笑的,深入地学习一门语言是不可缺少的。就以 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 的人没水平,做后台的人觉得做前台的没技术含量…… 我说,何必呢?

技术无贵贱,只是专注的领域不同而已。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》

×Scan to share with WeChat

你可能也喜欢看:

  1. java.util.concurrent 并发包诸类概览
  2. Java 的日期 API 真烂
  3. 看 JDK 源码,解几个疑问
  4. 动手实现随机验证码
  5. Java8 集合中的 Lambda 表达式

7 thoughts on “你真的精通 Java 吗?”

  1. 没用 says:
    11/24/2012 at 1:48 PM

    “ 我见过一些所谓的’ 精通 Java‘ 的人,他们却不知道 strictfp 关键字,说不清 volatile 和 transient 的作用,不知道怎么去定义一个注解(@interface)。你觉得这些要求苛刻吗?对这些以“ 精通” 要求自己的人。”
    请问你讲的这些有用吗?可以说除了会定义注解还稍微有点用以外,其余都是垃圾功能,用人单位不会因为你多知道几个关键字而多给你半分钱!什么叫精通?需要你干活用的东西全会就叫精通!连活都还干不了去学那些几乎没人用没人学的东西,不说什么了。

    Reply
  2. javaer says:
    10/14/2012 at 9:58 PM

    敢问 CAFE BABY 是啥?

    Reply
    1. 四火 says:
      10/14/2012 at 11:49 PM

      CAFE BABE,笔误了,谢谢指正。

      Reply
  3. nonoob says:
    10/02/2012 at 9:27 PM

    想请教一下 strictfp 导致差别的一个例子,我用的是 jdk1.7.0_02,用的是 windows7 的 eclipse3.7 下 javaw 默认选项编译,但是在给出的例子中均得到一样的结果。
    1.does it actually make a difference 给出的例子,无论是否使用 strictfp 均得到:
     

    Infinity
    1.6E308
    Before loop
    Calling calc(d): Infinity
    Repeating call to calc(d) 100000000 times
    After loop
    Last value in loop: Infinity
    Calling calc(d): Infinity

    2.Java 中的 strictfp 关键字中的两个例子得到的结果:

    float: 0.6710339
    double: 0.04150553411984792
    sum: 0.7125394529774224
    quotient: 16.167336

    和那篇博客的结果不一样。
    java language specification 15.4 中没有举出相关的例子,所以向你指教!

     

    Reply
    1. 四火 says:
      10/03/2012 at 4:03 PM

      我试了一下。和你的结果是一致的。对于你第一个链接,链接上的第一个问题其实和 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.

      Reply
      1. nonoob says:
        10/03/2012 at 4:45 PM

        那就是说如果没有 strictfp 关键词,某种具体的 JVM 实现可以不按照 IEEE754 来处理浮点型,但是如果有了 strictfp 的话这种 JVM 必须按照 jls 的规定使用 IEEE74 规范处理。也就是说最终 strictfp 的作用是增强了可移植性而不是精度。不知道这样的理解是否正确?

        Reply
        1. 四火 says:
          10/03/2012 at 8:22 PM

          我翻了 jsl7,只有这样的叙述:

           

          A widening primitive conversion from an integral type to another integral type, or from float to double in a strictfp expression, does not lose any information at all; the numeric value is preserved exactly.
          A widening primitive conversion from float to double that is not strictfp may lose information about the overall magnitude of the converted value.

          同时,也有说到编译期的常量表达式都是 FP-strict 的,这种情况无论是不是使用了 strictfp 关键字。

           

          It follows that an expression is not FP-strict if and only if it is not a compile-time constant expression and it does not appear within any declaration that has the strictfp modifier.
          也就是说,编译期间常量表达式,或者由 strictfp 修饰,都具备满足 IEEE-745 的条件。
           
          文档里面也没有找到一个给定的实例以体现 strictfp 的区别效果。
          Reply

Leave a Reply to nonoob Cancel reply

Your email address will not be published. Required fields are marked *

订阅·联系

四火,啰嗦的程序员一枚,现居西雅图

Amazon Google Groovy Hadoop Haskell Java JavaScript LeetCode Oracle Python Spark 互联网 前端 华为 历史 同步 团队 图解笔记 基础设施 工作 工作流 工具 工程师 应用系统 异步 微博 思考 技术 数据库 曼联 测试 生活 程序员 管理 系统设计 缓存 编码 编程范型 英语 西雅图 设计 评审 问题 面试 项目

分类

  • Algorithm and Data Structure (30)
  • Concurrency and Asynchronization (6)
  • System Architecture and Design (43)
  • Distributed System (18)
  • Tools Frameworks and Libs (13)
  • Storage and Data Access (8)
  • Front-end Development (33)
  • Programming Languages and Paradigms (55)
  • Testing and Quality Assurance (4)
  • Network and Communication (6)
  • Authentication and Authorization (6)
  • Automation and Operation Excellence (13)
  • Big Data and Machine Learning (5)
  • Product Design (7)
  • Hiring and Interviews (14)
  • Project and Team Management (14)
  • Engineering Culture (17)
  • Critical Thinking (25)
  • Career Growth (57)
  • Life Experience and Thoughts (45)

推荐文章

  • 谈谈分布式锁
  • 常见分布式系统设计图解(汇总)
  • 系统设计中的快速估算技巧
  • 从链表存在环的问题说起
  • 技术面试中,什么样的问题才是好问题?
  • 从物理时钟到逻辑时钟
  • 近期面试观摩的一些思考
  • RSA 背后的算法
  • 谈谈 Ops(汇总 + 最终篇):工具和实践
  • 不要让业务牵着鼻子走
  • 倔强的程序员
  • 谈谈微信的信息流
  • 评审的艺术——谈谈现实中的代码评审
  • Blog 安全问题小记
  • 求第 K 个数的问题
  • 一些前端框架的比较(下)——Ember.js 和 React
  • 一些前端框架的比较(上)——GWT、AngularJS 和 Backbone.js
  • 工作流系统的设计
  • Spark 的性能调优
  • “残酷” 的事实
  • 七年工作,几个故事
  • 从 Java 和 JavaScript 来学习 Haskell 和 Groovy(汇总)
  • 一道随机数题目的求解
  • 层次
  • Dynamo 的实现技术和去中心化
  • 也谈谈全栈工程师
  • 多重继承的演变
  • 编程范型:工具的选择
  • GWT 初体验
  • java.util.concurrent 并发包诸类概览
  • 从 DCL 的对象安全发布谈起
  • 不同团队的困惑
  • 不适合 Hadoop 解决的问题
  • 留心那些潜在的系统设计问题
  • 再谈大楼扔鸡蛋的问题
  • 几种华丽无比的开发方式
  • 我眼中的工程师文化
  • 观点的碰撞
  • 谈谈盗版软件问题
  • 对几个软件开发传统观点的质疑和反驳
  • MVC 框架的映射和解耦
  • 编程的未来
  • DAO 的演进
  • 致那些自嘲码农的苦逼程序员
  • Java 多线程发展简史
  • 珍爱生命,远离微博
  • 网站性能优化的三重境界
  • OSCache 框架源码解析
  • “ 你不适合做程序员”
  • 画圆画方的故事

近期评论

  • + 1.943624 BTC.NEXT - https://graph.org/Ticket--58146-05-02?hs=9a9c6f8dfe3cdbe0074006e3e640b19b& on 所有文章
  • Anonymous on 闲聊投资:亲自体验和护城河
  • 四火 on 关于近期求职的近况和思考
  • YC on 关于近期求职的近况和思考
  • mafulong on 常见分布式基础设施系统设计图解(四):分布式工作流系统
  • 四火 on 常见分布式基础设施系统设计图解(八):分布式键值存储系统
  • Anonymous on 我裸辞了
  • https://umlcn.com on 资源链接
  • Anonymous on 我裸辞了
  • Dylan on 我裸辞了
© 2025 四火的唠叨 | Powered by Minimalist Blog WordPress Theme
Menu
  • 所有文章
  • About Me
  • 关于四火
  • 旅行映像
  • 独立游戏
  • 资源链接