百姓大小事,一呼百应!

百姓网 | 百姓知道

软件开发

如何判断 Java 工程师的基础知识是否扎实?

抛开工作经验,项目经验,学历背景,单从技术点分析,哪些方面可以判断一人java程序员的技术扎实程度

2 个回答

  • 二大王 | 2017-10-15 09:45:10

    已经有很多答案说得挺好的了。

    但是,有好多纸上谈兵的马谡后代是很厉害的,我就曾经深受其害。你如果只问例如HashMap是否线程安全之类的问题,很容易就被糊弄了。即便问实现细节,有些理论控也能搞定,因为有些书写得蛮详尽的,只要是会背书的人,就可以搞定这种问题了,甚至可以没有任何编码经验。

    本着理论结合实践的方法,我一般都不问上面这种纯知识和理论性问题,而是让他写一段程序来证明HashMap是线程不安全的。然后,再让改一下这个程序,使之线程安全。

    在面试等情况下,如果有条件,最好能给被考核人一台可以上Google的电脑,然后给其一段自己的空间和时间,比如一个人在小会议室里10-20分钟。然后,另接一台显示器,同步观察他在电脑上是怎么做的。由此可以看出他解决问题的方法、思路。当然,另接显示器这事儿,得提前知会对方。

    或者,如果为了省时间,拿出写好的线程不安全的程序,让其说出为啥会有这样奇怪的现象。

    以此类推,可以让写证明List里存储的是引用还是对象实体的程序,写证明弱引用强引用区别的程序,写证明某种设计模式效果的程序…………
    这方法,不仅可以检查基础知识,还可以检查思维能力。如果对知识理解得不够透彻,这种证明程序其实是挺难写的……

    这方法更有威力的地方在于,你可以不是很懂Java,仍然可以大致衡量出对方的水平。
    比如,你看不懂对方的程序,你完全可以作为一个学生去请教。真正对概念理解透彻的人,是懂得如何用浅显易懂的方式把一个知识讲明白的,他可以将空中浮动的概念一目了然地告诉你,让你觉得唾手可得。能把概念讲到这种程度的人,通常在相关领域不是一般的高手。
    我面试的时候,有时候会装傻,故意看看对方能否讲明白。遇到一知半解的,会把他自己绕进去,很好玩;遇到高手,真的获益匪浅。当然,也有时候是真不懂,虚心学习,但一边学习一边提问,基本就可以知道对方的水平了。
    从面试的角度讲,一个能找到比自己强的人才的方法才是最有前途的方法。否则,只能招到比自己水平低的人,那公司的未来就只能局限于领导的能力水平了……

    === 高手可忽略部分分割线 ===
    看到评论区有人说我这个方法太狠,很难过关。
    我估计这么说的人还是学生吧。一个真正用心工作的有几年工作经验的人,不能说我让写的这类程序都会信手拈来,但至少在比较熟悉的领域里,还是可以略加思索就可以写成的。
    比如,关于说明线程安全的例子,我十几年前就写过一个(基于List,而非Map的):
    https://github.com/programus/java-experiments/blob/master/refs/JavaTraining/src/com/ibm/javacore/collections/threadsafe/ThreadSafeDemo.java
    总共不到50行的代码,有兴趣的可以参考一下。
    这类问题,没有标准答案,也往往没有最佳答案。我这个也不见得是什么很好的答案,只是当年为了给公司做新人培训,随便写的一个。(我写的那个时候,还是Java 1.4,List什么的都没有generic支持呢……所以,new ArrayList()也不会有警报……)

    本问答由二大王提供

  • 二大王 | 2017-10-15 08:55:27

    其实这里可以抛开java语言,通过以下几个方面就可以考查一个技术人员的基础如何:
    比如:
    操作系统层面:进程与线程,进程如何创建,线程如何创建。内存与换页的概念,进程通信,锁等等。
    网络通信层面:7/5层模型,ip分片重组,ip路由,tcp握手,udp的重组,网络风暴的原因等等。
    编程语言层面:面向对象,重载与重写,多态。对象创建模式,继承和组合, 语言的特点等等。
    数据结构与算法:数组链表,Map应用场景。基本的排序算法,算法分析等等。
    数据库层面:索引,SQL,事务隔离级别等等。
    数据方面:二进制运算,各类型占用的字节数,各类型数字的最大值,最小值等等。
    ...
    以上基本上都是大学专业课程,都是开放问题,你就跟他聊,聊得越深越见水平。

    本问答由二大王提供

* 本站部分内容来源自网络,仅作分享之用,侵删。