精通这个词估计是在简历中最常见到的词了,简历上通常都充斥着精通struts2、精通java、精通hibernate等等词语,近来经常看些比较底层的书,越来越体会到精通这个词应该具备的份量了,也越来越理解以前朋友和我说的在国外工程和研究是分的很清楚的原因了,在这篇blog里来扯扯自己对精通这个词的看法。
先来看几个面试的片段,从中也许能看出些端倪,:)
------------------------------------------------------------------------------------------------------------
片段一
背景:面试者之前做过一些网络通讯的程序。
问:对Java网络编程方面的package有了解吗?
答:因为编写过一些这样的程序,应该还是比较熟的。
问:那能说说Socket和ServerSocket中的timeout参数的具体作用吗?
答:... (忘记当时面试者答的具体是什么了,不过基本还是正确的)
问:能说说Socket中的setTcpNoDelay是拿来干什么的吗?
答:... (没答出来)
问:不知道有没有了解过例如在linux操作系统上是怎么实现网络通讯的呢,在操作系统中是个怎么样的过程呢?
答:...
由于面试者对上面的问题并没有回答到位,因此就没有再在网络编程这块继续问下去了,本来后续还打算问问tcp/ip协议、线程池、连接池、并发等等方面的一些问题。
片段二
背景:面试者之前有Load Balance方面的经验。
问:对Load balance接触过吧?
答:是的,在几个项目中都使用过,个人觉得还是比较精通的。
问:能说说在load balance通常有的几种请求方式吗?
答:... (没明白)
问:例如最常见的load balance请求的场景是所有的请求经过load balance,然后响应也通过load balance返回,你觉得还有没有其他的方式呢?
答:还有其他的方式吗?
问:跳过上面的问题,load balance方面你们一般使用什么方式来保证均衡性呢?
答:轮循方式。
问:有没有接触过其他的一些保证均衡的方式呢?
答:没有。
片段三
背景:面试者觉得自己对于java collection比较精通。
问:能说下java是怎么实现HashSet的吗?
答:基于HashMap实现,构建一个key为传入值,value也为传入值的HashMap。
问:继续聊下HashMap,java是怎么实现HashMap的呢?
答:对key进行hash,然后以数组的方式实现。
问:能说下在HashMap中当放的数据量越来越大的时候,java会做些什么动作吗?
答:当放入的数据量达到容量时,会默认增大一倍。
问:你觉得如果需要在HashMap中存放大量的数据的时候,会有些什么问题呢,例如要往一个HashMap中放100w的数据?
答:... (具体答的什么我不太记得了,不过最起码答出了冲突率会增高,效率会下降这点)
问:你觉得有什么办法能提升效率吗?
答:....(思考ing)....自己实现hashCode,尽量降低冲突率。
问:还有什么别的办法吗,或者自己来实现一个支撑100w的map结构怎么做比较好呢,主要是要优化写?
答:...(thinking...)....自己做hash,然后存放在LinkedList里。
问:如果现在要放1T的数据怎么办?肯定是不能放在单机上的了,怎么样去分布式做呢?
答:...同样做hash,然后例如0--7的放在哪些机器上,8---F开头的放在另外的机器上。
问:那么如果加机器了是不是要修改配置呢,另外加机器是否有迁移数据的问题呢?
答:...嗯,暂时是的。
这个面试过程其实我们当时是相当满意的,虽然这个面试者并没有完全答出来了,但根据他以往的经验来看,能答到这个程度真的非常不错了,而且我们最看重他的是碰到这些技术性的问题能够很有兴趣的进行思考,形象的说,简直就是双眼放光,:)
好,最后一个片段。
片段四
背景:面试者在项目中用过了java 5中的并发包。
问:觉得像ConcurrentHashMap这样的类带来了些什么好处呢?
答:将之前需要加锁自己做同步的动作做了更好的原子性的封装。
问:能讲讲CAS在这些并发数据结构中起到了些什么作用吗?
答:CAS?
问:(忽略上面的问题) 能说说Executors.newCachedThreadPool和直接new ThreadPoolExecutor的差别吗?
答:...不太清楚。
------------------------------------------------------------------------------------------------------------
好,关于面试的一些片段就回放到这了,从上面这几个面试片段中,估计也能看出一些端倪了,个人觉得精通真的很难,什么叫精通呢,我觉得应该不仅仅是会使用,熟练的使用,而且能够对其底层的实现机制、原理有较深的了解,例如java网络编程,应该了解到java网络编程package的参数细节的含义,进而应该了解操作系统是怎么去实现的,再进一步来讲,应该能够对协议也有一定的了解,例如tcp/ip、http等等,所以说要做到精通真的很难,至于是否能够解决大型场景中带来的问题,这个则受限于每个人的经历,因此不认为这点是决定性的因素。
其实我以前也很反对面试的时候问细节的,因为认为很多细节问题其实都是可以google等找到的,但现在观点在改变,我觉得如果真的精通的话,是会知道细节的,而不是靠临时的查找去学会,因此渐渐的也在面试过程中问一些非常细节的问题了,而且其实很多大型场景从架构层面来讲也是差不多的,并不会有太多的不同,加上这些东西现在在网上讲的也越来越多了(发现近来网上开始充斥着分布式、高可用性、高伸缩性这些词,开源的这类东西也迅速的在冒出,都不知道到底是好现象呢还是不那么好的现象,^_^),估计很多同学背都能背出来了,虽然也许不是很理解为什么架构是那样的。
记得很久以前和raimundox聊天,raimundox说到在国外的工程师相当专业,对于这些需要使用的技术所涉及的相关东西都会懂的比较多,例如要使用java的多线程,那么他们通常会知道操作系统是怎么来实现这块的,而这也是他们大学的教学方法,完全是针对性的,就是教需要用到的东西涉及的知识体系,至于其他的很多东西则不去教学了,因此相对来讲国外的软件质量整体是更好的,而做研究的人就更不同了,他们眼中的研究都是创新性质的,这让他们很明显的区分了工程和研究,这也许就是造成有很大差距的一点吧。