今日乃實習離職首日,福毅吼蚁、宏銘同學便紛紛前來尋我解惑。問道:你跟我們說了校招需要準備的知識點粒蜈,我們也按照你說的用思維導圖整理了所有的知識點旗国?可是那么多知識點還要研究源碼,在下可謂有心而無力度硝,眼看時間不斷流逝且秋招即將來臨,我們真的是心力交瘁椒袍,比考研同學起得早睡得晚恐怕都難把這些問題解決通透驹暑,你說的是不是謬論辨赐?
疑問
1肖油、在準備校招基礎知識復習的時候森枪,是否做到面面俱、這樣做會感覺時間不夠用呀浑娜?集合為例筋遭,抽象類暴拄、具體實現(xiàn)類他們之間的關系以及各自優(yōu)缺點乖篷?我們是否要每一個類都要去精讀它的源碼?新版本的JDK10的是否有必要去研究豁鲤?
2琳骡、在準備理解某個模塊知識的的時候楣号,是否需要精讀一本書去解決一個版塊的學習?并發(fā)編程為例耘纱,深入研究并發(fā)編程實踐這本書直到對并發(fā)編程的每個鎖毕荐、并發(fā)容器憎亚、線程池的來龍去脈全部了解一清二楚弄慰,否則感覺掌握還是不太徹底(鉆牛角尖做法)?
3什往、在準備校招項目的時候别威,是否要重新運用市場上主流技術做一個完整的項目省古?感覺以前做的項目在技術緯度亮點不足豺妓,更加偏向于業(yè)務琳拭?
4白嘁、在準備校招面試的時候挠乳,重點考察那些方面睡扬?計算機基礎(數(shù)據結構/算法卖怜、計算機網絡、操作系統(tǒng)奄抽、數(shù)據庫)逞度、Java基礎(設計模式、源碼研究)俊戳、互聯(lián)網技術棧(SpringBoot抑胎、Mybatis阿逃、緩存恃锉、消息隊列、RPC框架)焊虏、大并發(fā)與大數(shù)據的處理淡喜。是不是這幾個方面都研究完,我再去投簡歷诵闭、筆面試炼团?
解決思維的共性闡述
1、世間萬物無非都分為深度和廣度疏尿。
廣度:緯度思維瘟芝,它是知識面的全局把控,能夠清晰展現(xiàn)所有知識點的內在聯(lián)系褥琐。對于廣度來說是一張藍圖或者目錄锌俱,而不需要care它的具體實現(xiàn),只需要了解知識點之間的關系敌呈。
深度:線性思維贸宏,它是知識點的深度挖掘,能夠清晰展示某個知識點的來龍去脈。對于深度來說這個不用贅述锦聊,因為我們從小到達刷題做數(shù)學題大家都有了解。
2史飞、校招面試中對深度和廣度的要求是什么陨簇?該怎么去把控唉窃?
我剛剛解釋了我對于寬度與廣度的理解苟跪,從知識角度來說分為知識寬度如計算機科學元暴、心理學、知識管理铜秆,知識深度如在計算機科學面中的分布式架構有深入研究梅屉。
那對于校招面試中對于深度和寬度該怎么去闡述呢?
假設我畢業(yè)校招目標應聘的崗位是Java后臺工程師的崗位,在我另外的文章有說過需要掌握哪些知識面和知識點是需要我們掌握的杆故。
從寬度來說,以Java基礎為例無非就是分為語言基礎用法、容器家肯、IO/NIO值依、網絡价说、反射、JVM碍沐、并發(fā)編程。
從深度來說置吓,以容器中的HashMap來說?我們怎么從深度解釋它原理呢?比如讓你闡述HashMap這個問題你怎么說呢符糊?
日衬O校回答:
HashMap是一個容器实夹,它以key和value的形式存儲,key不能重復......。這樣回答是非常的平庸的叼旋,且顯得深度和條理極度欠缺详民。
深度回答:
(1)HashMap的數(shù)據結構是什么?數(shù)據+鏈表(畫圖)
(2)Key涧窒、Value是通過什么方式存儲進去的?解釋hashcode、取余拴疤、去重等操作组橄。
問題:Key在HashCode取余以后,它可能全部堆積在某幾個Key對應的鏈表上翰萨,這樣就會造成該數(shù)據結構存儲或者查詢低效赡磅,那怎么解決呢诽里?
拋出問題:
(3)怎么保證Key用hashcode取余以后能夠均勻分布到數(shù)組對應的鏈表上位置捕仔?......
問題:等存儲的數(shù)據逐漸增加票顾,那也會造成鏈表過長,導致查詢變慢贷帮,那怎么解決呢撵枢?
拋出問題:
(4)為什么會鏈表要變成紅黑樹潜必,什么時候從鏈表變成紅黑樹垂攘,什么時候從紅黑樹變回鏈表陨仅?
問題:假設多個線程并發(fā)訪問孔祸,那可能造成容器更新或者操作出現(xiàn)問題玄货,可能會說synchronized加同步鎖皇钞,有沒有其他辦法解決呢?
拋出問題:
(5)為什么采用CAS松捉,能說一下ConcurrentHashMap的具體實現(xiàn)嗎夹界?
不知道大家發(fā)現(xiàn)問題的共性沒有?任何事物都可以分為深度和廣度兩個方面隘世,甚至是有條理說出HashMap的實現(xiàn)可柿,也是從廣度與深度。
橫向問題:數(shù)據結構+算法丙者、存儲查詢方式复斥、存儲效率、安全性械媒?
縱向問題:具體邏輯實現(xiàn)流程目锭。
具體問題的解決辦法
問題1:不需要,寬度深度不可兼得纷捞,集合為例痢虹。
(1)用類圖或者思維導圖展示出整體輪廓、掌握集合類之間的關系主儡。(廣度視角)
(2)通過面試題+攀婪郑客面經,洞悉集合中比較重要常問的集合缀辩,標記重點研究,非重點了解即可踪央。(深度視角)
問題2:需看書系統(tǒng)學習臀玄,但有側重點,以深入理解JVM為例畅蹂。
這書枯燥且難懂健无,若想把這本書的來龍去脈精讀通透確實太難。
(1)看書目錄和粗看了解整體的知識與內在聯(lián)系液斜。
(2)通過看視頻+博客+面經累贤,標記這本書需要精讀的重要章節(jié)叠穆。
(3)系統(tǒng)讀這本書,重要的地方必須精讀直到理解為止臼膏,不重要的地方可戰(zhàn)略性放棄或者略讀硼被。
問題3:項目沒有l(wèi)ow或者不low之分,應該是思考原項目的不足渗磅,你該怎么去優(yōu)化嚷硫,而不是推倒重新去做另一個項目。
(1)提取你項目的亮點始鱼,你在這項目中獲得什么仔掸?包括業(yè)務經驗、代碼設計医清,而不是就感覺就是增刪改查很low起暮。
(2)根據你現(xiàn)在的認知,假設讓你重新再做会烙,你該怎么設計负懦?系統(tǒng)健壯性、擴展性持搜、并發(fā)性密似,甚至可以添加一些新的沒有在項目用到的技術棧,但是你講清楚且會怎么用也可以葫盼?
(3)不需要推倒重做一個新的項目残腌,而是做一個模塊或者什么去反襯你的技術棧(nginx、redis贫导、消息隊列等)抛猫?這時候,你就應該去做一個模塊孩灯,就如簡單的秒殺系統(tǒng)闺金,你該怎么去設計?為什么要用到這些技術峰档,每一種技術主要解決的問題是什么败匹?
問題4:任何事情都不可能等你準備齊全才行動,最好的方式就是想好了馬上行動讥巡,多嘗試與實踐掀亩,形成自己獨特面試風格。
一般面試的要求無非就是就是基礎扎實(研究的深入寬度問題)欢顷、技術視野開闊(廣度問題)槽棍,不用把面試弄的緊張兮兮,就是一個“約會”的經歷,只是不能開車炼七。
(1)面試考察:基礎扎實缆巧、項目/實習經驗豐富、技術視野開闊豌拙。
(2)面試期望:短時間培養(yǎng)內能夠干活陕悬,能夠有潛力承擔更多職責。
(3)面試結果:面試官主要是引導你回答問題姆蘸,而不是讓你把所有東西都能做到最完美墩莫,這也不可能。主要你在面試中展現(xiàn)出你1-2個特長認為你可培養(yǎng)那么將會被錄用逞敷,例如你表現(xiàn)出基礎扎實算法好狂秦?項目/實習經驗豐富團隊配合能力強、快速學習能力強推捐?技術視野廣裂问、發(fā)散性思維強、code能力強牛柒?
實踐案例圖
1堪簿、看容器章節(jié)總結
2、讀深入理解JVM總結