怎樣的後台項目才算是有深度的呢?

最近在面試實習生校招,面試官都會問到項目的難點重點等。

我做的是Java後台開發,項目中都是接收請求,存儲數據,查詢資料庫,返回結果等,大部分的工作框架都已經做好了可以直接使用,就是寫DAO層,Service層等,感覺連要自己寫多線程的地方都沒有。

那麼要怎麼去加深項目的深度呢,或者說面試官問這個問題是期望我有什麼回答呢?


嘗試解決以下的問題中的一到兩個:

1、一個最簡單的業務讀介面,例如拉取好友列表,直接跑壓測看目前峰值是多少,在不加機器的話如何提高?

關鍵詞 緩存

就緩存需要考慮 如何進行多級緩存,冷熱數據如何分布,超時管理,緩存爆掉怎麼辦等等問題(所謂用最少的機器抗住最多的請求)

2、一個普通的寫介面,例如搶紅包,如何頂過峰值並發請求?

關鍵詞 隊列

隊列要如何落地與恢復,寫操作的數據一致性非常重要,隊列進程掛了怎麼辦,插入資料庫失敗了怎麼辦,網卡擁塞/CPU過載/內存爆掉/磁碟寫壞掉 等等情況下給出合理應對方法。

3 在允許加機器的情況下服務如何做到平行擴展?

關鍵詞 無狀態服務 資料庫拆分設計

平行擴展之後用戶會話如何保持,如何做到對用戶透明的斷線重連(比如遊戲中切換WiFi和4G)

4 跨機房/城市/國家的數據同步如何解決?

關鍵詞 非同步同步 跨IDC網路調用

如何分流用戶請求,資料庫主和備採取何種同步策略,主庫掛掉後的自動容災方案(微信有很多公開出來的架構文章可以參考)

有些問題在 學校/小公司 裡面可能你完全沒有機會碰到和接觸,但還是建議多思考多嘗試,申請個兩台VPS玩玩看呢? 有的坑真的是實操之後才能踩到。


緩存,讀寫分離,分散式事務,2PC,3PC,最終一致性,paxos,一致性hash……


寫個證券交易所


update--------------

多說兩句。

以下問題是針對學生或者剛畢業的學生,個人感覺沒必要動不動就上分散式、高可用、大數據這些東西。思考沒錯,但先打好基礎,切勿忽略了最重要、最基礎的東西。

不管是校招還是實習生剛進入公司都要報以學習的心態,而不是所謂「展示」自己。做一些簡單的項目,能把代碼寫的漂亮、穩定、無 bug 是第一要素。

帶過畢業生的人都應該深有體會他們最缺乏的是什麼吧,如果不清楚,看看題主對項目的描述。

對了,順帶推薦本書《代碼大全》,剛畢業的人值得靜下心看看。

-----------------------

我提幾個問題:
安全問題考慮了嗎,sql注入/xss/csrf/劫持?

數據一致性能保證嗎,某個步驟失敗了怎麼辦

資料庫優化考慮了嗎,索引/查詢/事務

項目代碼規範嗎,結構怎麼樣的,命名?

充分利用Java特性了嗎,了解過自己使用框架的原理嗎,設計模式?

GC問題考慮過嗎

如何處理異常呢,出異常怎麼辦,返回給用戶什麼信息

有打log嗎,格式呢,出錯了怎麼快速定位

系統有緩存嗎,redis/memcached,緩存失效怎麼辦

Web系統有用nginx之類做代理嗎,應用伺服器有考慮多台嗎,性能有調優嗎

有搭建到伺服器上嗎,自己用工具做過壓測嗎

最重要一點,有用戶流暢用過嗎(自己用不算),別人用會發現很多問題的


刷題吧,演算法題,在校期間搞緩存,rpc,這些東西,,,可能事倍功半,你如果想進知名大公司,一學校985.211,二,牛逼大獎,三,牛逼的作品(或者特別了解一個開源產品,內部特性如數家珍)四,演算法特彆強編碼能力強,五,運氣超級好。這幾點五最不可控,想進最起碼滿足其中一到兩個要求。一點感受而已。


代碼規範 資料庫優化 測試 先把這三樣做好


嘗試進行技術挑戰。

簡單的例子比如

- 怎樣負載均衡解決某秒殺系統2w峰值並發(本校教務選課系統

- 複雜系統分拆,為什麼分拆,系統間怎麼通信(比如 dubbo)

- SQL 查詢數據量很大很頻繁,怎麼用 redis 等內存資料庫做緩存,還要保證命中率

- 日誌,怎麼輸出便於後期分析

- 部署方案,不妨嘗試 docker?

- CI,測試、部署自動化

- Java VM 層面理解優化方案?廣義上還會涉及到很多計算機基礎課


我也遇到了題主一樣的問題。還有個問題是,寫的都是某某某系統,這些系統寫出來也沒人用。而且問題都是能百度或者調試出來的,這些問題又太淺。


試著從系統架構者的角度去思考,不要把目光局限在模塊代碼的編寫上。比如,可以借鑒前人的設計,自己在業餘時間模仿著寫一個出來,你會發現不只是你描述的那樣簡單。


推薦閱讀:

第一次做生意什麼項目比較好?
現在有沒有什麼好的項目可以運作的?
遊戲行業有潛力的項目有哪些?
項目經理是不是應該和產品經理分開?
做一個圖片版的知乎,這個項目可行嗎?

TAG:項目 | Java | 面試問題 | 後台開發 | 伺服器開發 |