1. 程式人生 > >0308 軟體系統的非功能需求

0308 軟體系統的非功能需求

![image.png](https://img2020.cnblogs.com/blog/268922/202003/268922-20200305232605454-1247497152.png) 故事開始。 > 小李是一個一線的java程式設計師,做軟體開發多年,有一天,被邀請去參加一個大廠的面試,面試前他做了各種準備,有軟體原理方面的,軟體設計方面的,還有軟體架構方面的知識。並不斷總結提煉成了一張知識圖譜。想著即使不成功,也是一次不錯的技術交流,至少可以知道目前大廠需要的程式設計師具備的技能深度和廣度,給自己定定位。下面是技術一面。 小李:你好,我是李x,今年y歲,做一線開發z年,我來面試。 大廠牛逼架構師:你好,小李。我是a廠的面試官b,我來給你面試。直接開門見山了。**問題1,簡單說一下軟體研發的過程?** 小李:按照軟體工程的瀑布模型. 軟體研發分為可行性分析,需求分析,概要設計,詳細設計,編碼,測試,釋出,交付,維護,下線等節點。但是這些流程比較重,往往當軟體開發完成交付的時候,客戶的需求已經發生了變更,軟體需要重新打回需求分析和概要設計階段開始,導致軟體的工期遠遠超出預期,而且開發方耗時間耗人力,客戶方並不滿意。 那麼怎麼破呢? 按照當下流行的敏捷研發模式,軟體在需求分析階段,按照優先級別分批次設定釋出計劃,然後基於釋出計劃規劃迭代,針對單個小迭代,開發,測試同一時間點參與,研發完成立馬釋出交付客戶驗收,客戶快速反饋,針對反饋的問題,及時調整規劃的需求,這樣小步快跑,快速迭代的而方式去管理軟體的研發過程,解決研發方研發的時間和人力成本高,客戶還不滿意的難題。 ![image.png](https://img2020.cnblogs.com/blog/268922/202003/268922-20200305232608858-1314539652.png) 大廠牛逼架構師:**問題2:系統概要設計階段的非功能需求有哪幾種?** 小李:軟體除了實現客戶的基本功能需求之外,還要滿足預設的非功能性需求,好比冰山下的龐大底座,看不見的東西往往最耗費和考驗軟體工程師的功力,對架構能力,編碼能力要求比較高。主要包含高效能,安全,高可用等。 ![冰山](https://img2020.cnblogs.com/blog/268922/202003/268922-20200305232609369-1602160547.webp) # 高效能 大廠牛逼架構師:**問題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步驟; ![image.png](https://img2020.cnblogs.com/blog/268922/202003/268922-20200305232614813-1556863796.png) # 安全 大廠牛逼架構師:**問題4:簡單介紹一下資料加密的種類?以及常見的軟體安全漏洞?最後講講實際工作中應該如何保證軟體的系統安全?** 小李:軟體系統系統只有被攻擊,資料洩漏之後才意識到安全的重要性。 資料加密的種類有3種: 1,單向加密,比如常用的md5,一般使用的時候還要加個salt,並增加輸入的密碼複雜性檢查,防止彩虹表破解密碼; 2,對稱加密,常見的比如RSA加密,通過一個祕鑰進行加密和解密,只要祕鑰不洩漏就是安全的; 3,非對稱加密,常見的比如公鑰私鑰對,數字簽名是非對稱加密的應用,使用私鑰加密獲得密文,傳送出去,只有配對的公鑰才能解密,以此來驗證資料來源的合法性。但是效能比較差。 除了資料加密,還需要保證資料在傳輸過程加密,那就要說到https協議了,它是結合使用了對稱加密和非對稱加密,首先使用非對稱加密,產生一個祕鑰,客戶端拿到祕鑰之後,對資料進行對稱加密,服務端根據生成的祕鑰進行資料解密。充分保證了資料處理的效能和傳輸資料的安全。 常見的安全漏洞: HTTP安全漏洞: 1,  SQL注入,解決方法使用Preparestatement替代statement處理傳輸過來的引數; 2,xss攻擊,上傳攻擊指令碼到伺服器,別的使用者獲取資料的時候會解析這個攻擊指令碼,達成攻擊目的,解決方式是字串轉義; 可以通過在閘道器中增加web防火牆或者在程式碼中增加過濾器來處理。 此外還有硬體和作業系統的安全漏洞,使用軟體和元件的安全漏洞等。 實際工作中,應該應該及時升級依賴的軟體和元件的版本, 升級版本一般修復了對應的安全漏洞,此外我們應該在程式中做好引數過濾, 最後,應該對最終儲存的資料和傳輸的資料進行加密,提高黑客攻擊的難度。 ![image.png](https://img2020.cnblogs.com/blog/268922/202003/268922-20200305232615894-138497262.png) # 高可用 大廠牛逼架構師:**問題5:簡單說一下如何保證軟體系統的高可用?** 小李:高可用即要求軟體系統在各種故障發生的時候做到可用或者大部分可用,軟體系統的可用率一般採用N個9的方式來衡量。 各種故障都可能影響軟體系統的可用性,比如: 1,自然災害 2,人為原因 3,高併發訪問 4,硬體故障 5,軟體故障 保證系統的高可用有5種方法: 1,冗餘備份,即多準備幾個伺服器,比如多個web伺服器(故障轉移),資料庫伺服器(多主模式叢集); 2,異地多活,即通過域名的方式,把請求分發到多個地域的不同機房; 3,限流降級,限流即限制HPS,降級即關閉非核心功能讓出有限資源; 4,失敗隔離:訊息佇列削峰填谷,轉移寫壓力,隔離失敗; 5,運維方法:自動測試,自動監控,灰度,預釋出等; ![image.png](https://img2020.cnblogs.com/blog/268922/202003/268922-20200305232617325-1451864244.png) # 小結 大廠牛逼架構師: 小李架構功夫很紮實。簡單的點評一下。 1,不愧是多年的一線開發人員,軟體研發流程非常熟悉,而且敏捷研發模式有一定經驗; 2,高效能是非常重要的非功能需求,調優方式7中都答的很到位; 3,安全性也是非常重要的,資料加密分類清晰,http的攻擊防護手段有所瞭解; 4,高可用的手段總結的很到位; 小李:感謝您的評價,希望有機會合作,為企業打造數字化產品帝國。 故事講完。 > 原創不易,轉載請註明