前言我不是什么大牛,我只是一個有八年工作經(jīng)驗的互聯(lián)網(wǎng)老兵,既沒有非常亮眼的學歷,也沒有牛逼大廠的履歷。 這個冬天,在孩子得病從急診轉(zhuǎn)住院的時候,我得到了年前將被優(yōu)化的消息,作為家里唯一經(jīng)濟來源的我整個人蒙了,一時間茫然和無助差點毀了我。 最后我還是和家人如實說了,受到了他們的極大的鼓勵,也找到了重新開始的勇氣。 可惜這場疫情來的如此兇猛,職位少、要求高、電話面試、視頻面試、在線coding、屢戰(zhàn)屢敗、屢敗屢戰(zhàn),構(gòu)成了我這兩個月的常規(guī)生活。 我一開始也焦慮、茫然,甚至對自己的能力和工作經(jīng)驗深深懷疑。 后來經(jīng)過幾個好朋友的鼓勵打氣,也看了敖丙的很多面試文章,認真總結(jié)自己面試中不足的地方,查漏補缺,終于在這周確定了offer。(這是原話,我真沒瞎加哈哈) 接下來我就我之前面過的騰訊、高德、京東、美團、餓了么、快手、字節(jié)跳動、滴滴、360金融、跟誰學、網(wǎng)聯(lián)清算、華晨寶馬、快看漫畫、陌陌、脈脈等等等公司的面試題做一下總結(jié),權(quán)當拋磚引玉,希望對大家有幫忙。 面試問題匯總基礎(chǔ)問題linux和網(wǎng)絡基礎(chǔ)(1)linux系統(tǒng)內(nèi)核態(tài)和用戶態(tài)是什么,有什么區(qū)別? (2)BIO、NIO、AIO都是什么,有什么區(qū)別? (3)TCP和UDP的區(qū)別? (4)詳細敘述TCP3次握手,TCP和HTTP的區(qū)別,其中字節(jié)面試官問的最細,他會具體問TCP底層的3次握手的具體實現(xiàn)邏輯,第三次握手如果失敗會怎樣。 建議把TCP關(guān)閉時的4次揮手也看看,敖丙的文章就有,看了至少表面的東西難不倒你們,由于這個是最基礎(chǔ)的問題,如果回答不好,面試官的印象分就你懂得。 (5)rpc和http的區(qū)別,你知道有什么rpc框架。 (6)https相對http都實現(xiàn)了什么加密方式,是對稱加密還是非對稱加密? (7)用linux命令怎么做分組求和,怎么把字符串根據(jù)分隔符變成數(shù)組(這里建議大家讀讀敖丙的linux命令篇) JVM基礎(chǔ)(1)簡要介紹一下JVM虛擬機(這個問題不是把JVM分成JMM,類加載和GC來問,一定要想好怎么描述JVM) (2)簡述一次GC的過程(Minor gc和Major gc過程還記得么) (3)JMM是什么? (4)JVM共享內(nèi)存都有什么,什么是堆外內(nèi)存? (5)GC區(qū)域,垃圾回收算法,垃圾回收器,G1、CMS、ParNew等垃圾回收器的簡介和之間的區(qū)別。 (6)類加載過程(5個過程最好能研究明白,因為還涉及到棧幀、局部表量表、操作數(shù)棧、動態(tài)鏈接和方法出口等知識,去看一下敖丙的文章就明白了) (7)一個ArrayList的兩個對象的getClass()得到的結(jié)果相同么(理解類加載和Class類類型) (8)死鎖怎么查問題(-XX:+PrintGCDetails) (9)Gc日志得會看,尤其問到怎么查OOM問題的時候,你應該知道使用jconsole,jstat,jmap,jvisualvm等的工具來查看gc狀態(tài),看看是不是年輕代設置太小了導致major gc頻繁或者內(nèi)存泄露了。 JAVA基礎(chǔ)和多線程基礎(chǔ)(1)synchronized在JDK6做了哪些優(yōu)化,synchronized和lock的區(qū)別 (2)懶漢單例用duble check是線程安全的么,為什么要加volatile (3)Volatile有什么用,什么是CAS (4)什么是happens before原則 (5)什么是AQS (6)線程sleep和wait的區(qū)別,線程join是什么意思 (7)Java都有哪幾種鎖(敖丙的文章) (8)線程池分幾種類型,其中的coreSize、maxSize、存活時間、等待隊列、拒絕策略要清楚 (9)Java樂觀鎖的實現(xiàn)(CAS+自旋) (10)阻塞隊列的實現(xiàn),至少自己會實現(xiàn)2種阻塞隊列的方法(單鎖,多鎖, ReentrantLock, Condition) (11)CountDownLatch、CyclicBarrier、Semaphore區(qū)別,使用場景 (12)HashMap是線程安全的么,底層怎么實現(xiàn)的(get,set,resize),JDK1.8之前和之后做了哪些修改,如果要使得插入kv有序需要使用哪種HashMap(LinkedHashMap,TreeMap),ConcurrentHashMap線程安全是怎么實現(xiàn)的(JDK1.8前后實現(xiàn)不同) (13)ArrayList和LinkedList的區(qū)別,棧和隊列的區(qū)別。Queue和Deque區(qū)別 (14)Netty,Jetty實現(xiàn)原理。 (15)Java 靜態(tài)代理、動態(tài)代理 (16)Forkjoin模型 (17)Java回調(diào) (18)協(xié)程和線程的區(qū)別 (19)JDK1.8有什么新特性,了解函數(shù)式編程么(不了解的看看guava) 數(shù)據(jù)結(jié)構(gòu)算法和設計模式(1)設計模式一般引申自項目或者工具底層實現(xiàn),所以需要懂一些比較常見的設計模式,工廠、單例、觀察者、命令、適配器、代理等等 (2)算法主要是查找和排序,所以至少要會手寫主流的排序算法和查找算法 (3)LSM樹是怎么實現(xiàn)的。和mysql的B+樹有什么區(qū)別(LSM樹是hbase和levelDB的底層存儲的結(jié)構(gòu),不懂不應該) (4)二叉樹,平衡查找二叉樹,紅黑樹等 (5)棧,數(shù)組,鏈表,隊列,雙端隊列,跳躍表(redis zset)等 spring系列(1)AOP,IOC概念 (2)Spring cloud組件介紹,具體問的比較多的是hytrix和eureka,hytrix主要問怎么實現(xiàn)限流和降級(線程池和信號量),兩種實現(xiàn)方式有什么區(qū)別,具體熔斷時的配置;eureka主要介紹和zookeeper的區(qū)別,以及注冊流程 (3)Spring boot配置很多都注解化了,所以常用的注解要知道 (4)過濾器和Spring攔截器的區(qū)別 消息中間件AMQP看敖丙的文章就夠了 redis緩存相關(guān)看敖丙的文章就夠了 (這兩段沒笑死我) 其他類型(1)單點登錄系統(tǒng)怎么做(SSO系統(tǒng)) (2)為什么選擇cassandra而不是hbase,兩者有什么區(qū)別 大數(shù)據(jù)問題hadoop(1)hadoop1.0的進程都有哪些,hdfs和mapreduce簡介 (2)集群初始化的時候namenode都做了哪些工作,fsimage和editslog都是什么 (3)SecondaryNamenode有什么作用。 (4)Hadoop讀文件和寫文件流程 (5)Mapreduce過程簡介(注意這個是基礎(chǔ),不會說拉低印象分),shuffle流程,jobclient提交job的流程等。 (6)Mapreduce怎么進行序列化反序列化的(inputFormat,outputFormat) (7)Jobtracker都有哪些任務調(diào)度器 (8)Hadoop YARN都做了哪些優(yōu)化,YARN都有哪些進程,YARN提交job的流程 (9)Mapreduce優(yōu)化(mapjoin,combiner,小文件合并等) (10)簡述hive表join怎么用mapreduce實現(xiàn),mapreduce二次排序,二次排序分區(qū)和分組的區(qū)別 (11)Hadoop集群HA實現(xiàn)(zookeeper實現(xiàn)主備和federation最好都弄懂概念) (12)其他框架比如spark怎么和yarn集成的 (13)Spark相比mapreduce的優(yōu)化(內(nèi)存計算,RDD等) (14)給你100億條數(shù)據(jù)的用戶表和一塊100MB內(nèi)存,怎么去重或者判斷一個用戶在不在其中(bitmap,布隆過濾器等) (15)加分項:讀過hadoop源碼么,具體哪一段源碼介紹一下。 hive(1) Hive數(shù)據(jù)倉庫的架構(gòu) (2) Hive怎么把sql轉(zhuǎn)化成mapreduce的(至少知道sql解析器解析成AST語法樹,后面解析成queryblock,進執(zhí)行隊列等等) (3) Hive基本數(shù)據(jù)類型,組合類型(當時問Hive中的int類型有幾種,蒙了) (4) Hive底層存儲類型,壓縮格式 (5) Hive UDF,UDTF,UDAF,窗口函數(shù)(row_number, rank,cube,rollup,lag,lead)(一般是跟著sql coding來問的) (6) Hive優(yōu)化(count(distinct xxx),去除null值,小文件合并,map和reduce個數(shù)優(yōu)化,解決數(shù)據(jù)傾斜) (7) Hive分區(qū)和分桶的區(qū)別。分桶主要解決什么問題。內(nèi)部表和外部表的區(qū)別。怎么動態(tài)分區(qū)。 (8) Hive怎么自動補全分區(qū)(MSCK命令,這個比較冷僻,知道有這個東西就行了) (9) HIve列存儲,rcfile和orcfile和parquet怎么存數(shù)據(jù)的 hbase(1)hbase架構(gòu)簡介 (2)Hbase怎么讀寫數(shù)據(jù)詳細流程 (3)Hbase的應用場景 (4)Hbase優(yōu)化(熱點,預分區(qū),rowKey設計,手動合并等) (5)Hbase為什么寫快讀慢(LSM樹) (6)Hbase是cp還是ap架構(gòu)?(CAP理論看懂沒有,hbase是CP的) (7)Hbase 怎么scan數(shù)據(jù)的。 kafka為什么kafka放到大數(shù)據(jù)里來說,因為kafka大部分場景下是ETL流程和流式計算流程的source端 (1)kafka架構(gòu)簡介 (2)Kafka為什么快,性能好,吞吐量大(mmap和sendfile了解一下) (3)Kafka會丟數(shù)據(jù)么,kafka消息有序么 (4)Kafka producer consumer怎么實現(xiàn)at most once和exactly once(冪等計算和事務) (5)Kafka 高可用怎么實現(xiàn)的(AR,ISR,OSR)。會不會腦裂(不會啊,參照zookeeper選舉) (6)Kafka leo(log end offset)和hw(high watermark) (7)Kafka consumer消費topic的某一個partition時,不同group和同group中的消費者有什么不同。 (8)Kafka ack有幾種,每種什么意思 (9)Kafka有什么坑,怎么改進(大腦風暴了) (10)Kafka相比rabbitMq等傳統(tǒng)消息隊列有什么區(qū)別 zookeeper(1)zookeeper簡介 (2)Zookeeper節(jié)點類型 (3)Zookeeper watcher機制 (4)Zookeeper使用場景,怎么用zk設計主備高可用,怎么用zk實現(xiàn)分布式鎖(看敖丙文章去,其實就是臨時順序znode的建立和watcher機制的妙用) (5)Zookeeper選舉機制,會不會腦裂 其他工具因為我沒有很多spark和flink的項目經(jīng)驗,所以這部分問的較少 (1)介紹一下storm,spark,flink (2)Spark RDD (3)Spark stage怎么劃分task的 (4)Spark寬窄依賴 (5)Spark shuffle (6)Spark 為什么容易OOM (7)Flink 窗口類型都有哪些 (8)Flink 水位線是什么,要解決什么問題,怎么保證消息有序 (9)Flink 怎么實現(xiàn)exactly once 項目中涉及到的mysql、redis、flume、sqoop、es等工具也會具體問的,這里我就不詳細說了,redis和mysql的可以直接看敖丙的文章就可以了。 數(shù)倉相關(guān)的問題和數(shù)據(jù)分析、算法端的問題(1)你是怎么設計數(shù)倉的 (2)數(shù)據(jù)倉庫是什么,和數(shù)據(jù)庫有什么區(qū)別 (3)你的數(shù)倉怎么分層的 (4)維度建模的流程,其他類型的建模方式 (5)Inmon模型和KimBall模型有什么區(qū)別 (6)怎么提煉業(yè)務指標 (7)怎么設計事實表和維度表 (8)數(shù)據(jù)立方體的一些概念 (9)什么是緩慢變化維,怎么處理這種緩慢變化維 (10)具體項目中會問到日志或者數(shù)據(jù)是增量存還是全量存,可能會引申到拉鏈表,甚至讓我實現(xiàn)拉鏈表(字節(jié)2面掛就是拉鏈表流程沒有正確寫出來,所以后來干脆自己在mysql上面實現(xiàn)了一把就懂了) (11)會用python,R語言進行數(shù)據(jù)分析么,會用SPSS,EXCEL,tableau之類的工具么 (12)使用過什么多維查詢引擎(impala,kylin,presto,druid等,如果沒用過別說用過,因為可能面試官很了解的話會問的很細很底層) (13)MPP的概念,clickhouse之類的工具使用 (14)調(diào)度系統(tǒng)報表系統(tǒng)元數(shù)據(jù)管理系統(tǒng)血緣分析等系統(tǒng)設計,標簽系統(tǒng)設計,AI算法實現(xiàn),用戶畫像設計等 (15)談談對數(shù)據(jù)中臺的理解,要解決什么問題(看你的思考能力和對數(shù)據(jù)部門職能的理解) (16)談談對數(shù)據(jù)治理的理解 Coding這里只給大家提供一些遇到過的簡單問題,大家應該掌握基本的查找算法、排序算法,熟練使用遞歸、貪心,能明白動態(tài)規(guī)劃更好。 Leetcode上面的題有空再去刷,因為幾千道題要花費大量的時間,對于需要準備考sql的同學,建議把??途W(wǎng)上面數(shù)據(jù)庫SQL實戰(zhàn)都做一遍,理解了就差不多了。 (1)實現(xiàn)一個函數(shù)把兩個有序的int數(shù)組結(jié)合成新的有序數(shù)組(java,遇到過2次) (2)給a[n]數(shù)組進行全排序,找到一個組合的前一個組合,比如a[3]{[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]},給出[2,3,1,],找到他的前序是[2,1,3](java) (3)給定一個正數(shù)數(shù)組arr(即數(shù)組元素全是正數(shù)),找出該數(shù)組中,兩個元素相減的最大值,其中被減數(shù)的下標不小于減數(shù)的下標。即求出: maxValue = max{arr[j]-arr[i] and j >= i} (java) (4)有8個球,其中有一個比其他7個重。給你一個天平要求2次稱重就把重的那個球找出來。(智力題) (5)求一個數(shù)組中不存在的最小正整數(shù)(java,這個好像是程序員面試指南里頭的題) (6)給定用戶登錄表,怎么查連續(xù)3天未登錄的用戶(sql) (7)給定每天收入明細數(shù)據(jù),怎么查每一天的歷史收入總和(sql) (8)Hive 表中有重復值,怎么查一共有多少個重復值(hql) (9)給定注冊表和登錄表,用一個sql求1-7天留存(sql) (10)實現(xiàn)拉鏈表(hql) (11)給定電商訂單表,字段為訂單id(order_id)和訂單組合(type_list),求這個訂單組合中每種類型商品的相關(guān)商品TOP10,即求這個商品相關(guān)的商品(下單這個商品的同時也下單其他商品)下單量TOP10(hql,行轉(zhuǎn)列) (12)給定一個廣告投放表ad,字段有aid(廣告id)和citys(投放城市city_id集合)和城市表city_info,字段有city_id和city_name(城市名稱),求具體城市名稱的投放廣告量TOP10。(hql,行轉(zhuǎn)列) 項目面試官考察項目經(jīng)驗,考察的其實不僅僅是你基礎(chǔ)的掌握,更多的是自己對業(yè)務的理解,架構(gòu)設計,自己對項目的思考。所以,除了項目中涉及到基礎(chǔ)知識的問題,還會問到諸如你覺得項目中有哪些設計比較好,或者有哪些不合理的地方,你是怎么解決的等方面的問題。 這些問題往大了去可能是架構(gòu)方面的,也可能是具體技術(shù)細節(jié)。但是只要你講出自己的思考和解決方案,有經(jīng)驗的面試官會大概了解到你的技術(shù)深度、架構(gòu)設計能力和解決問題能力的層次。 所以一定要找到有亮點的地方提前進行背書,要有層次的介紹項目,思考一下項目設計或者實現(xiàn)不完善的地方。 還有一些面試官會問到如果讓你設計一個什么什么系統(tǒng),你怎么設計。這種題我覺得也最好提前做過背書。 因為對于工作經(jīng)驗少的同學,面試官主要看他想問題的深度和廣度,但是對于工作經(jīng)驗不少于5年的人來說,面試官更關(guān)注你是否有成熟的實現(xiàn)流程和方法論。 所以一個層次化流程化的設計會極大增加面試官好感度。切記避免廢話連篇核心不明確。(這也是我的問題,因為沒有準備,所以遇到肯定說的很散,這樣面試官覺得你自己做事情沒有核心和方法) 個人價值觀一般技術(shù)面到后面,面試官都是leader或者是部門老大,他們其實很關(guān)心你的職業(yè)規(guī)劃、對待工作的態(tài)度、團隊合作的能力、自我價值實現(xiàn)方面的思考,當然還有項目實現(xiàn)的能力,過往項目經(jīng)驗和深度。所以最好自己先想想怎么用簡短的話表述清楚。注意圍繞關(guān)鍵詞去說。 寫給看到最后同學的話這些算是我作為過來人對于應屆畢業(yè)生和剛工作不久的同學的一些小小建議吧。 (1)一定要緊跟技術(shù)前進的腳步,尤其是大數(shù)據(jù)相關(guān)的技術(shù),在技術(shù)更迭的時候一定要學習熟悉新技術(shù),看源碼,哪怕自己在工作中用不到也一定要學。因為這是你下一份工作的敲門磚。 我作為一個老兵,在上一家公司工作4年,公司沒有spark和flink的業(yè)務場景,我也沒有逼迫自己學習這些新技術(shù)。 結(jié)果現(xiàn)在面試碰壁,其實大部分原因就是人家用的主流技術(shù)就是這些,你不會你就被淘汰。 (2)不要給自己設置舒適區(qū),這個就是說,一個公司待久了不要懶惰,不能荒廢自己,始終要保持清醒的頭腦和進取心,不斷學習,不斷完善自己的技術(shù),架構(gòu)設計能力,項目管理能力,交付能力等。 一定要及時從項目中總結(jié)經(jīng)驗和不足,最好落實到日記本中,最后通過不斷思考,形成自己的做事方法論。 (3)對自己的職業(yè)生涯要有一個規(guī)劃,以后要做哪一塊一定要有自己的想法,確定了就要從這個方向完善自己,多學多練。 目前大數(shù)據(jù)這一塊,有數(shù)據(jù)中臺架構(gòu)的公司不是很多,除了算法崗外,大多數(shù)人在團隊中都是1專多能的角色,今天干干ETL,明天搞數(shù)倉,后天又給BI出數(shù)據(jù),可能又搞調(diào)度系統(tǒng)、報表系統(tǒng)、標簽系統(tǒng)、反作弊平臺等平臺。 沒有人會專一做某一塊,但是自己一定要想好哪一塊是自己以后要走的方向,那么這一個方向確定了就要深入的學習這一塊的知識,多看源碼,多做練習,如果接觸到具體項目,要在項目中沉淀自己,最后形成自己的知識體系。 (4)做事情要有擔當,不要根據(jù)OKR給自己設置界限,有能力有空閑多做一定要多做,這也是別人認可你的最佳途徑之一?;ヂ?lián)網(wǎng)圈子很小,大家認可你,以后去大廠,換個好工作,也許就更容易。 敖丙的絮絮叨叨是的結(jié)尾我還是說一下吧,投稿的讀者是一個互聯(lián)網(wǎng)經(jīng)驗的老兵了,兩個月的高強度面試也讓他有了很多收獲,有一句話我很喜歡,不要給自己設立舒適區(qū),要有危機感,真的就是這樣。 我們寫代碼,真的不要單純的為了生計,單純的覺得這是一個青春飯,我們可以把它當做一個一輩子的事業(yè),30歲以后你轉(zhuǎn)型產(chǎn)品,轉(zhuǎn)型架構(gòu)師,你都是要有code的積淀的,不是說能轉(zhuǎn)就能轉(zhuǎn)的。 一個一生的事業(yè),我想是值得你付出時間去學習的,雞湯就這么多了。 對了,電話面試的那個研究生小哥還記得么,他去了阿里,也恭喜他,也恭喜這個老兵讀者,我實在沒想到我的很多文章確實能幫助到大家這么多,我會繼續(xù)寫的。 我是敖丙,一個在互聯(lián)網(wǎng)茍且偷生的工具人。 最好的關(guān)系是互相成就,各位的「三連」就是丙丙創(chuàng)作的最大動力,我們下期見!
|
|