軟件工程師不可不知的10個概念

出色的軟件工程師善用設計模式,勤於代碼重構,編寫單元測試,並對簡單有宗教般的追求。除了這些,優秀的軟件工程師還要通曉10個概念,這10個概念超越了編程語言與設計模式,軟件工程師應當從更廣的範圍內明白這些道理php

  1. 界面 (Interfaces )html

  2. 慣例與模板 (Conventions and Templates)java

  3. 分層 (Layering )web

  4. 算法的複雜性 (Algorithmic Complexity)算法

  5. 散列法 (Hashing )數據庫

  6. 緩存 (Caching )編程

  7. 併發 (Concurrency )設計模式

  8. 雲計算(Cloud Computing )api

  9. 安全(Security )數組

  10. 關係數據庫 (Relational Databases )

10. 關係數據庫 (Relational Databases) 
關係數據庫由於在大規模 Web 服務上缺少可擴充性而頗受微詞,然而,關係數據庫仍然是近20年來計算機技術中最偉大的成就。關係數據庫對處理訂單,公司數據方面有着出色的表現。

關係數據庫的核心是以記錄表示數據,記錄存放在數據庫表,數據庫使用查詢語言(SQL)對數據進行搜索與查詢,同時,數據庫對各個數據表進行關聯。

數據庫的標準化技術(normalization)講的是使用正確的方式對數據進行分存以下降冗餘,並加快存取速度。
 
9. 安全 (Security) 
隨着黑客的崛起與數據敏感性的上升,安全http://www.ijiami.cn/treg變得很是重要。安全是個廣義的概念,涉及驗證,受權與信息傳輸。

驗證是對用戶的身份進行檢查,如要求用戶輸入密碼。驗證一般須要結合 SSL (secure socket layer)進行;受權在公司業務系統中很是重要,尤爲是一些工做流系統。最近開發的 OAuth 協議能夠幫助 Web 服務將相應信息向相應用戶開放。Flickr 便使用這種方式管理私人照片和數據的訪問權限。

另一個安全領域是網絡設防,這關係到操做系統,配置與監控。不只網絡危險重重,任何軟件都是。Firefox 被稱爲最安全的瀏覽器,仍然須要頻頻發佈安全補丁。要爲你的系統編寫安全代碼就須要明白各類潛在的問題。
 
8. 雲計算 (Cloud Computing) 
RWW 最近的關於雲計算的文章 Reaching For The Sky Through Compute Clouds 講到了雲計算如何改變大規模 Web 應用的發佈。大規模的並行,低成本,與快速投入市場。

並 行算法發明以來,首先迎來的是網格計算,網格計算是藉助空閒的桌面計算機資源進行並行計算。最著名的例子是 Berkley 大學的 SETI@home 計劃,該計劃使用空閒的 CPU 資源分析太空數據。金融機構也大規模實施網格計算進行風險分析。空閒的資源,加上 J2EE 平臺的崛起,迎來了雲計算的概念:應用服務虛擬化。就是應用按需運行,並能夠隨着時間和用戶規模而實時改變。

雲計算最生動的例子是 Amazon 的 Web 服務,一組能夠經過 API 進行調用的應用,如雲服務(EC2),一個用來存儲大型媒體文件的數據庫(S3),索引服務(SimpleDB),序列服務(SQS)。

7. 併發 (Concurrency) 
併發是軟件工程師最容易犯錯的地方,這能夠理解,由於咱們一直聽從線形思惟,然而併發在現代系統中很是重要。

並 發是程序中的並行處理,多數現代編程語言包含內置的併發能力,在 Java,指的是線程。關於併發,最經典的例子是「生產/消費」模式,生產方生產數據和任務,並放入工做線程消費或執行。併發的複雜性在於,線程須要常常 訪問共同數據,每一個線程都有本身的執行順序,但須要訪問共同數據。Doug Lea 曾寫過一個最複雜的併發類,如今是 core Java 的一部分。

6. 緩存(Caching) 
緩 存對現代 Web 程序不可或缺,緩存是從數據庫取回,並存放在內存中的數據。由於數據庫直接存取的代價很是高,將數據從數據庫取回並放在緩存中訪問就變得十分必要。好比, 你有一個網站,要顯示上週的暢銷書,你能夠從數據將暢銷書榜一次性取回放在緩存中,而沒必要在每次訪問時都去數據庫讀數據。

緩存須要代價,只有最經常使用的內容才能夠放入緩存。不少現代程序,包括 Facebook,依靠一種叫作 Memcached 的分佈式緩存系統,該系統是 Brad Firzpatrick 在工做於 LiveJournal 項目時開發的,Memcached 使用網絡中空閒的內存資源創建緩存機制,Memcached 類庫在不少流行編程語言,包括 Java 和 PHP 中都有。

5. 散列法(Hashing)
Hashing 的目的是加速訪問速度。若是數據是序列存儲的,從中查詢一個項的時間取決於數據列的大小。而散列法對每個項計算一個數字做爲索引,在一個好的 Hashing 算法下,數據查找的速度是同樣的。

除了存儲數據,散列法對分佈式系統也很重要。統一散列法(uniform hash )用來在雲數據庫環境下,在不一樣計算機之間分存數據。Google 的索引服務就是這種方法的體現,每個 URL 都被散列分佈到特定計算機。

散列函數很是複雜,但現代類庫中都有現成的類,重要的是,如何對散列法進行細調以得到最好的性能。

4. 算法的複雜性 (Algorithmic Complexity) 
關於算法的複雜性,軟件工程師須要理解這樣幾件事。第一,大O標記法(big O notation); 第二,你永遠都不該該使用嵌套式循環(循環裏面套循環),你應該使用 Hash 表,數組或單一循環;第三,現在優秀類庫比比皆是,咱們沒必要過度糾纏於這些庫的效能的差異,咱們之後還有機會進行細調;最後,不要忽視算法的優雅及性能, 編寫緊湊的,可讀的代碼可讓你的算法更簡單,更乾淨。

3. 分層 (Layering) 
用分層來討論軟件架構是最容易的。John Lakos 曾出版過一本關於大型 C++ 系統的書。Lakos 認爲軟件包含了層,書中介紹了層的概念,方法是,對每一個軟件組件,數一下它所依賴的組件數目就能夠知道它的複雜程度。

Lakos 認爲,一個好的軟件擁有金字塔結構,就是說,軟件組件擁有層層積累的複雜度,但每一個組件自己必須簡單,一個優秀的軟件包含不少小的,可重複使用的模塊,每 個模塊有本身的職責。一個好的系統中,組件之間的依賴性不可交叉,整個系統是各類各樣的組件堆積起來,造成一個金字塔。

Lakos 在軟件工程的不少方面都是先驅,最著名的是 Refactoring (代碼重構)。代碼重構指的是,在編程過程當中須要不斷地對代碼進行改造以保證其結構的健壯與靈活。

2. 慣例與模板 (Conventions and Templates) 
命 名慣例和基礎模板在編程模式中常被忽視,然而它多是最強大的方法。命名慣例使軟件自動化成爲可能,如,Java Beans 框架在 getter 和 setter 方法中,使用簡單的命名慣例。del.icio.us 網站的 URL 命名也使用統一的格式,如http://del.icio.us/tag/software 會將用戶帶到全部標籤爲 software 的頁。

不少社會網絡均使用簡單命名,如,你的名字是 johnsmith ,那你的頭像可能命名爲 johnsmith.jpg,而你的 rss 聚合文件的命名極可能是 johnsmith.xml 。命名慣例還用於單元測試,如,JUnit 單元測試工具會辨認全部以 test 開頭的類。咱們這裏說的模板(templates )指的並非  C++ 或 Java 語言中的 constructs,咱們說的是一些包含變量的模板文件,用戶能夠替換變量並輸出最終結果。Cold Fusion 是最早使用模板的程序之一,後來,Java 使用 JSP 實現模板功能。Apache 近來爲 Java 開發了很是好用的通用模板, Velocity。PHP 自己就是基於模板的,由於它支持 eval 函數。1. 界面(Interfaces) 軟件工程中最重要的概念是界面。任何軟件都是一個真實系統的模型。如何使用簡單的用戶界面進行模型化相當重要。不少軟件系統走這樣的極端,缺少抽象的冗長代碼,或者過度設計而致使無謂的複雜。在衆多軟件工程書籍中,Robert Martin 寫的《敏捷編程》值得一讀。關於模型化,如下方法對你會有幫助。首先,去掉那些只有在未來纔可能用得着的方法,代碼越精練越好。第二,不要總認爲之前的東西是對的,要善於改變。第三,要有耐心並享受過程。

相關文章
相關標籤/搜索