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