故事開始。
小李是一個一線的java程序員,做軟件開發(fā)多年,有一天,被邀請去參加一個大廠的面試,面試前他做了各種準備,有軟件原理方面的,軟件設計方面的,還有軟件架構(gòu)方面的知識。并不斷總結(jié)提煉成了一張知識圖譜。想著即使不成功,也是一次不錯的技術交流,至少可以知道目前大廠需要的程序員具備的技能深度和廣度,給自己定定位。下面是技術一面。
小李:你好,我是李x,今年y歲,做一線開發(fā)z年,我來面試。
大廠牛逼架構(gòu)師:你好,小李。我是a廠的面試官b,我來給你面試。直接開門見山了。問題1,簡單說一下軟件研發(fā)的過程?
小李:按照軟件工程的瀑布模型.
軟件研發(fā)分為可行性分析,需求分析,概要設計,詳細設計,編碼,測試,發(fā)布,交付,維護,下線等節(jié)點。但是這些流程比較重,往往當軟件開發(fā)完成交付的時候,客戶的需求已經(jīng)發(fā)生了變更,軟件需要重新打回需求分析和概要設計階段開始,導致軟件的工期遠遠超出預期,而且開發(fā)方耗時間耗人力,客戶方并不滿意。
那么怎么破呢?
按照當下流行的敏捷研發(fā)模式,軟件在需求分析階段,按照優(yōu)先級別分批次設定發(fā)布計劃,然后基于發(fā)布計劃規(guī)劃迭代,針對單個小迭代,開發(fā),測試同一時間點參與,研發(fā)完成立馬發(fā)布交付客戶驗收,客戶快速反饋,針對反饋的問題,及時調(diào)整規(guī)劃的需求,這樣小步快跑,快速迭代的而方式去管理軟件的研發(fā)過程,解決研發(fā)方研發(fā)的時間和人力成本高,客戶還不滿意的難題。
大廠牛逼架構(gòu)師:問題2:系統(tǒng)概要設計階段的非功能需求有哪幾種?
小李:軟件除了實現(xiàn)客戶的基本功能需求之外,還要滿足預設的非功能性需求,好比冰山下的龐大底座,看不見的東西往往最耗費和考驗軟件工程師的功力,對架構(gòu)能力,編碼能力要求比較高。主要包含高性能,安全,高可用等。
高性能
大廠牛逼架構(gòu)師:問題3:簡單介紹一下高性能的指標?你使用過的性能調(diào)優(yōu)方法?以及你的一個性能調(diào)優(yōu)經(jīng)歷?
小李:高性能是軟件系統(tǒng)的核心非功能需求,性能調(diào)優(yōu)是軟件架構(gòu)師的核心職責,一般由高并發(fā)引起性能問題。要進行系統(tǒng)的性能優(yōu)化,必須先進行性能測試。
軟件系統(tǒng)的性能指標如下。
第一,響應時間,即用戶發(fā)出請求到獲得響應的總時間;
第二,并發(fā)數(shù),即軟件系統(tǒng)可以同時處理的請求數(shù)量,即HPS;
第三,吞吐量,有兩個個基本指標,TPS(每秒處理事物數(shù)),QPS(每秒處理查詢數(shù));
第四,操作系統(tǒng)的性能計數(shù)器,比如CPU,內(nèi)存的使用率,磁盤IO,系統(tǒng)負載,對象數(shù)和線程數(shù)量;
性能調(diào)優(yōu)的原動力是提升用戶體驗,比如在異步顯示資源,等待的時候可以轉(zhuǎn)菊花;
性能調(diào)優(yōu)的客觀方法分為7種:
從軟件系統(tǒng)的范圍由大到小分別說明。
1,多數(shù)據(jù)中心,讓用戶訪問離他最近的數(shù)據(jù)中心,可以顯著降低響應時間。
2,使用高配置的硬件,比如更高的cpu,內(nèi)存,對系統(tǒng)進行垂直擴展。
3,操作系統(tǒng)的參數(shù)調(diào)優(yōu),比如調(diào)大TCP的連接數(shù),調(diào)小TCP的默認等待時間等;
4,JVM調(diào)優(yōu),設置合適的jvm的存儲參數(shù),選擇合適的垃圾回收算法等;
5,軟件系統(tǒng)的依賴組件調(diào)優(yōu),比如web服務器的配置調(diào)優(yōu),數(shù)據(jù)庫的調(diào)優(yōu)等;
6,軟件架構(gòu)調(diào)優(yōu),比如可以引入集群,緩存,消息隊列等;
7,代碼層面的優(yōu)化,比如使用更優(yōu)的數(shù)據(jù)結(jié)構(gòu),使用線程池連接池,sql語句調(diào)優(yōu),反應式框架,異步io,設計模式寫出更簡潔易讀的代碼等;
性能調(diào)優(yōu)的流程是:
1,對要調(diào)優(yōu)的軟件系統(tǒng)進行性能測試,工具有很多比如jmeter,loadrunner等,使用多線程的方式模擬用戶并發(fā)訪問系統(tǒng);
2,觀察軟件系統(tǒng)的性能指標,分析得到產(chǎn)生性能的問題的瓶頸點,需要非常了解整個系統(tǒng)的結(jié)構(gòu),然后解決這個瓶頸點;
3,然后繼續(xù)跑性能測試,對比調(diào)優(yōu)前后的性能指標。如果提高了則結(jié)束,沒有提高則重復1步驟;
安全
大廠牛逼架構(gòu)師:問題4:簡單介紹一下數(shù)據(jù)加密的種類?以及常見的軟件安全漏洞?最后講講實際工作中應該如何保證軟件的系統(tǒng)安全?
小李:軟件系統(tǒng)系統(tǒng)只有被攻擊,數(shù)據(jù)泄漏之后才意識到安全的重要性。
數(shù)據(jù)加密的種類有3種:
1,單向加密,比如常用的md5,一般使用的時候還要加個salt,并增加輸入的密碼復雜性檢查,防止彩虹表破解密碼;
2,對稱加密,常見的比如RSA加密,通過一個秘鑰進行加密和解密,只要秘鑰不泄漏就是安全的;
3,非對稱加密,常見的比如公鑰私鑰對,數(shù)字簽名是非對稱加密的應用,使用私鑰加密獲得密文,發(fā)送出去,只有配對的公鑰才能解密,以此來驗證數(shù)據(jù)來源的合法性。但是性能比較差。
除了數(shù)據(jù)加密,還需要保證數(shù)據(jù)在傳輸過程加密,那就要說到https協(xié)議了,它是結(jié)合使用了對稱加密和非對稱加密,首先使用非對稱加密,產(chǎn)生一個秘鑰,客戶端拿到秘鑰之后,對數(shù)據(jù)進行對稱加密,服務端根據(jù)生成的秘鑰進行數(shù)據(jù)解密。充分保證了數(shù)據(jù)處理的性能和傳輸數(shù)據(jù)的安全。
常見的安全漏洞:
HTTP安全漏洞:
1, SQL注入,解決方法使用Preparestatement替代statement處理傳輸過來的參數(shù);
2,xss攻擊,上傳攻擊腳本到服務器,別的用戶獲取數(shù)據(jù)的時候會解析這個攻擊腳本,達成攻擊目的,解決方式是字符串轉(zhuǎn)義;
可以通過在網(wǎng)關中增加web防火墻或者在代碼中增加過濾器來處理。
此外還有硬件和操作系統(tǒng)的安全漏洞,使用軟件和組件的安全漏洞等。
實際工作中,應該應該及時升級依賴的軟件和組件的版本,
升級版本一般修復了對應的安全漏洞,此外我們應該在程序中做好參數(shù)過濾,
最后,應該對最終存儲的數(shù)據(jù)和傳輸?shù)臄?shù)據(jù)進行加密,提高黑客攻擊的難度。
高可用
大廠牛逼架構(gòu)師:問題5:簡單說一下如何保證軟件系統(tǒng)的高可用?
小李:高可用即要求軟件系統(tǒng)在各種故障發(fā)生的時候做到可用或者大部分可用,軟件系統(tǒng)的可用率一般采用N個9的方式來衡量。
各種故障都可能影響軟件系統(tǒng)的可用性,比如:
1,自然災害
2,人為原因
3,高并發(fā)訪問
4,硬件故障
5,軟件故障
保證系統(tǒng)的高可用有5種方法:
1,冗余備份,即多準備幾個服務器,比如多個web服務器(故障轉(zhuǎn)移),數(shù)據(jù)庫服務器(多主模式集群);
2,異地多活,即通過域名的方式,把請求分發(fā)到多個地域的不同機房;
3,限流降級,限流即限制HPS,降級即關閉非核心功能讓出有限資源;
4,失敗隔離:消息隊列削峰填谷,轉(zhuǎn)移寫壓力,隔離失??;
5,運維方法:自動測試,自動監(jiān)控,灰度,預發(fā)布等;
小結(jié)
大廠牛逼架構(gòu)師:
小李架構(gòu)功夫很扎實。簡單的點評一下。
1,不愧是多年的一線開發(fā)人員,軟件研發(fā)流程非常熟悉,而且敏捷研發(fā)模式有一定經(jīng)驗;
2,高性能是非常重要的非功能需求,調(diào)優(yōu)方式7中都答的很到位;
3,安全性也是非常重要的,數(shù)據(jù)加密分類清晰,http的攻擊防護手段有所了解;
4,高可用的手段總結(jié)的很到位;
小李:感謝您的評價,希望有機會合作,為企業(yè)打造數(shù)字化產(chǎn)品帝國。
故事講完。
原創(chuàng)不易,轉(zhuǎn)載請注明出處。