前言
首先說明一下博主是一個大三的學(xué)生,專業(yè)計算機(jī)科學(xué)與技術(shù),主學(xué)的方向是Web后臺開發(fā),主語言是Java。前幾天看到CVTE有校園招聘實習(xí)生,就報名參加了,做了CVTE的筆試題,前面的選擇題不難,后面的編程題稍微難一些,而且切換出去調(diào)試,做完之后,本來想著沒報希望了,就沒理了,后來周四晚上短信通知我說過了筆試,讓我周六過去面試。
面試地點是在一個酒店里面,當(dāng)時也是蠻多人的,CVTE招的崗位也很多,嵌入式開發(fā),前端,Android/IOS等都有,排了沒一會隊就到我了。總結(jié)一下面試的題目吧。
問題一:項目
面試官:最近有沒有做過什么項目?
我:最近做過一個關(guān)于充電電車的電樁管理的項目。
面試官:個系統(tǒng)主要是干什么的,有什么功能?
我就跟面試官描述了一些這個系統(tǒng)的大致功能和流程,這里就先省略了。
面試官:假設(shè)有一天,這個電車非常好用,很多人都在使用,數(shù)據(jù)變得很大的時候,你的數(shù)據(jù)庫要怎么設(shè)計?
我:盡量單表查詢,建數(shù)據(jù)庫索引,使用緩存。
面試官:那索引有哪幾種索引?
因為我對數(shù)據(jù)庫這方面比較薄弱,不過自己以前看過一些文章,只能努力回憶,
我:有主鍵索引、普通索引……剩下的想不太起來了。
面試官:那我如何知道一張表是不是有索引,或者說我用什么查詢語句可以知道我的數(shù)據(jù)庫表中是否有索引?
我:
這里比較尷尬,因為我對于數(shù)據(jù)庫建立索引,優(yōu)化這方面了解的并不是很多,平時用數(shù)據(jù)庫只用考慮了增刪查改,并沒有考慮到優(yōu)化問題。
后面自己惡補(bǔ)了索引的知識,我平時MySQL用的比較多,就以MySQL為例:
- MySQL的索引有普通索引,唯一索引,全文索引,單列索引,多列索引,組合索引。
- 索引算法有b-tree,hash。
- 創(chuàng)建索引可以建表時創(chuàng)建還有通過修改表的方式增加索引。
- 使用explain語句可以查詢查詢記錄和是否使用到索引
- 盡量單表查詢可以使用一些反范式,也就是增加一些冗余字段,減少多表查詢
- 緩存的話要熟悉Redis和Memcached
問題二:語言
面試官:你的主學(xué)語言是什么?
我:Java。
面試官:在Java中有哪些異常?
我:異常分可檢查的異常和非檢查的異常,可檢查的異常有IO異常,非檢查的異常有空指針異常,數(shù)組越界異常……等
面試官:那我們平時怎么防止空指針異常?
我:使用if條件判斷該對象是否為空?
面試官:好的,這個是可以的,在Java8中有一種更優(yōu)雅的實現(xiàn)方式,你有了解過嗎?
我:
面試官:java8中optional實現(xiàn)了這個功能。
面試官:了解過Java中的集合接口嗎?
我:Collection接口,List,Set,Map接口
面試官:ArrayList和LinkedList有什么區(qū)別
我:ArrayList的是用基于數(shù)組的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的,LinkedList是基于鏈表實現(xiàn)的
面試官:這兩個的add()方法有什么區(qū)別?
我:ArrayList的add方法,將對象插入到數(shù)組當(dāng)中,并且將數(shù)組當(dāng)前位置的索引+1,LinkedList的add方法將上一個結(jié)點的指針指向要加入的對象。
面試官:了解過序列化和反序列化嗎?Java中是怎么實現(xiàn)的
我:通過實現(xiàn)Serializable接口
面試官:拿出一張紙,寫了一個類A,里面有一些屬性,int a=1;String b = “123”
讓我寫出將這個類序列化到文件的代碼。
我:回憶了一下,用了FileInputStream和ObjectOutStream,寫了出來。
面試官:如果我將這個對象序列化到了硬盤,現(xiàn)在我將這個類增加了一個屬性,然后再將這個對象反序列出來,會發(fā)生什么情況?
我:會報錯。
面試官:如果我刪除這個屬性呢?
我:也會。
面試官:如果我在這個類里面,對serialVersionUID進(jìn)行了初始化呢,還會報錯嗎?
我:不會。
面試官:為什么?
- 我后面也將Java8的新特性重新學(xué)習(xí)了一遍,包括lambda表達(dá)式,函數(shù)式接口,方法引用,更好的類型推斷,stream,base64編碼,javascript引擎,更好的時間格式,jvm移除永久區(qū)增加metaspace等。Java9頁快出了,也要去學(xué)習(xí)一下。
- 還有就是集合類中的各種數(shù)據(jù)結(jié)構(gòu)都要過一遍,最好全部源碼都看一遍,包括List,Set,Map接口下的幾個實現(xiàn)類比如ArrrayList,HashSet,HashMap,重點是HashMap,HashMap的實現(xiàn)原理,這里面試官可能會問到是否是線程安全的,如果不是,有什么解決方法,又可以引申到其他方面,比如CopyOnWriteArrayList,ConcurrentHashMap,又可以深入問下去了。
- 關(guān)于序列化這一方面,的確自己當(dāng)時沒有復(fù)習(xí)好,現(xiàn)在很多項目都是分布式的,分布式的話就會有RPC,也就要求對象在網(wǎng)絡(luò)中傳輸,所以序列化也是很重要的一部分,serialVersionUID是用來保證序列化版本的序號,如果不指定,就會隨機(jī)生成一個序列號,改動類的任意一個地方,都會改變這個序號,將對象重新反序列化回來后就會報錯。這次面試也只問了JDK自帶的序列化,實際上還有其他序列化協(xié)議,比如xml,json也是一種序列化的方式,還有protobuff和protostuff。
3. 問題三:網(wǎng)絡(luò)協(xié)議
面試官:說下TCP和UDP的區(qū)別
我:TCP面向連接,UDP無連接,TCP提供可靠的連接,UDP是盡最大努力交付
面試官:說下TCP建立連接三次握手過程
我:
面試官:斷開連接時的四次握手,為什么需要四次而不是三次?
我:
面試官:兩個不同局域網(wǎng)內(nèi)的主機(jī)要通訊需要使用到什么協(xié)議
我:NAT協(xié)議
面試官:如果一個局域網(wǎng)內(nèi)的主機(jī)要向另一個局域網(wǎng)內(nèi)的主機(jī)發(fā)送消息,傳輸?shù)膱笪氖窃趺礃拥模?br>
我:
面試官:HTTP協(xié)議有哪些狀態(tài)碼?
我:200 302 404 500
面試官:302代表什么意思
我:重定向
面試官:瀏覽器是怎么處理重定向的,客戶端訪問服務(wù)器,服務(wù)器通過response響應(yīng),重定向的url放在response的什么地方?
我:
實際上,如果做web開發(fā)的話,對計算機(jī)網(wǎng)絡(luò)也要非常的熟悉,OSI 7層協(xié)議,TCP 5層協(xié)議,TCP/UDP的區(qū)別,TCP如何實現(xiàn)可靠傳輸,三次握手四次揮手,擁塞機(jī)制。HTTP的各種頭,狀態(tài)碼,HTTPS和HTTP2.0都要去了解。
302重定向的rul是放在Header的Location屬性中
4. 問題四:其他
面試官:除了Java,你有了解過其他技術(shù)嗎?
我:學(xué)過一些JavaScript
面試官:是前端還是node.js?
我:前端
面試官:js如何過濾一些敏感字符
我:正則表達(dá)式。
面試官:原生JS發(fā)送ajax的四個步驟有哪些?
我:
面試官:了解什么是XSS漏洞嗎?
我:
面試官:如何防止表單重復(fù)提交
我:表單提交后將提交按鈕disable掉
提交表單后重定向到另一個頁面
服務(wù)器端使用token技術(shù)
做后端開發(fā)的對于前端的技術(shù),了解就好了,會前端加分項,不會也不扣分,一般大公司的分工都是比較明確的,每個崗位都有自己負(fù)責(zé)的工作,如果一家公司讓你前后端通吃,那可能是外包公司,分工不明確,可能什么都要你來的那種。這個看個人吧,不過對于后端的話,可以學(xué)一下現(xiàn)在前端熱門的三個框架Angular/React/Vue中的一個。
5.總結(jié):
首先面試官第一個問的就是你有沒有做過什么項目,說明項目是很重要的,出去找工作一定要有項目經(jīng)驗。然后面試官問的問題都是有一些規(guī)律的,從你的回答中去引申,比如一開始的項目,項目中遇到了什么,如果使用這個項目的人變得很多了,需要怎么設(shè)計表。然后再根據(jù)你的回答繼續(xù)深入問你,所以,如果對某些方面一直半解,就不要胡亂說,直接說這個方面我還暫時還沒有了解。我們知道面試官會一層一層地深入追問,那么我們也可以引導(dǎo)面試官往往我們擅長的地方去詢問,回答的時候盡量答得周全一些,可以突出一些你知道別人不知道的點,這樣可以給自己加分。
整個面試過程中,沒有問到任何框架的問題,其實想想也可以明白,框架這個東西,會用其實很簡答,你學(xué)個幾天,照著文檔寫demo,很容易就學(xué)會了的,所以一些大的公司往往更加注重基礎(chǔ)。除了自己所學(xué)的主要語言方面,還可以掌握一些其他的技能,也是給自己加分的項。還有計算機(jī)網(wǎng)絡(luò),網(wǎng)絡(luò)層,傳輸層,應(yīng)用層的熟悉一定要非常的熟悉,web開發(fā)肯定要對這些協(xié)議掌握的非常透徹,TCP/UDP、Http。現(xiàn)在語言有很多種,不單單只是Java,Python、Node.js、Ruby這些都可以用來開發(fā)Web,只不過每個語言有自己的優(yōu)點和特色。
最后在當(dāng)天晚上得出了結(jié)果,也在自己的意料之中,自己的回答的確也是挺差的。這次面試也讓我學(xué)到了很多東西,感謝這位面試官。機(jī)會總是留給有準(zhǔn)備的人的,Java基礎(chǔ)也還需要再進(jìn)一步鞏,重點關(guān)注IO/NIO,線程,并發(fā)包,集合,Java8新特性,計算機(jī)網(wǎng)絡(luò)相關(guān)知識。對學(xué)過的知識要進(jìn)行分類整理,形成自己的知識體系,這樣你的邏輯才會清晰。路還長,坑還很多,剩下的時間好好把握,努力學(xué)習(xí),充實自己!