精通這個詞估計是在簡歷中最常見到的詞了,簡歷上通常都充斥著精通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的多線程,那么他們通常會知道操作系統是怎么來實現這塊的,而這也是他們大學的教學方法,完全是針對性的,就是教需要用到的東西涉及的知識體系,至于其他的很多東西則不去教學了,因此相對來講國外的軟件質量整體是更好的,而做研究的人就更不同了,他們眼中的研究都是創新性質的,這讓他們很明顯的區分了工程和研究,這也許就是造成有很大差距的一點吧。