軟體工程師不可不知的概念

2022-12-03 20:15:05 字數 3559 閱讀 2096

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

10. 關聯式資料庫 (relational databases)

關聯式資料庫因為在大規模 web 服務上缺乏可擴充性而頗受微詞,然而,關聯式資料庫仍然是近20年來計算機技術中最偉大的成就。關聯式資料庫對處理訂單,公司資料方面有著出色的表現。

關聯式資料庫的核心是以記錄表示資料,記錄存放在資料庫表,資料庫使用查詢語言(sql)對資料進行搜尋與查詢,同時,資料庫對各個資料表進行關聯。

資料庫的標準化技術(normalization)講的是使用正確的方式對資料進行分存以降低冗餘,並加快訪問速度。

9. 安全 (security)

隨著黑客的崛起與資料敏感性的上公升,安全變得非常重要。安全是個廣義的概念,涉及驗證,授權與資訊傳輸。

驗證是對使用者的身份進行檢查,如要求使用者輸入密碼。驗證通常需要結合 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),索引服務(******db),序列服務(sqs)。

7. 併發 (concurrency)

併發是軟體工程師最容易犯錯的地方,這可以理解,因為我們一直遵從線形思維,然而併發在現代系統中非常重要。

併發是程式中的並行處理,多數現代程式語言包含內建的併發能力,在 j**a,指的是執行緒。關於併發,最經典的例子是「生產/消費」模式,生產方生產資料和任務,並放入工作執行緒消費或執行。併發的複雜性在於,執行緒需要經常訪問共同資料,每個執行緒都有自己的執行順序,但需要訪問共同資料。

doug lea 曾寫過乙個最複雜的併發類,現在是 core j**a 的一部分。

6. 快取(caching)

快取對現代 web 程式不可或缺,快取是從資料庫取回,並存放在記憶體中的資料。因為資料庫直接訪問的代價非常高,將資料從資料庫取回並放在快取中訪問就變得十分必要。比如,你有乙個**,要顯示上週的暢銷書,你可以從資料將暢銷書榜一次性取回放在快取中,而不必在每次訪問時都去資料庫讀資料。

快取需要代價,只有最常用的內容才可以放入快取。很多現代程式,包括 facebook,依靠一種叫做 memcached 的分布式快取系統,該系統是 brad firzpatrick 在工作於 livejournal 專案時開發的,memcached 使用網路中空閒的記憶體資源建立快取機制,memcached 類庫在很多流行程式語言,包括 j**a 和 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)

命名慣例和基礎模板在程式設計模式中常被忽視,然而它可能是最強大的方法。命名慣例使軟體自動化成為可能,如,j**a beans 框架在 getter 和 setter 方法中,使用簡單的命名慣例。 **的 url 命名也使用統一的格式,如 會將使用者帶到所有標籤為 software 的頁。

很多社會網路均使用簡單命名,如,你的名字是 johnsmith ,那你的頭像可能命名為 而你的 rss 聚合檔案的命名很可能是 。

命名慣例還用於單元測試,如,junit 單元測試工具會辨認所有以 test 開頭的類。

我們這裡說的模板(templates )指的並不是 c++ 或 j**a 語言中的 constructs,我們說的是一些包含變數的模板檔案,使用者可以替換變數並輸出最終結果。

cold fusion 是最先使用模板的程式之一,後來,j**a 使用 jsp 實現模板功能。apache 近來為 j**a 開發了非常好用的通用模板, velocity。php 本身就是基於模板的,因為它支援 eval 函式。

1. 介面(inte***ces)

軟體工程中最重要的概念是介面。任何軟體都是乙個真實系統的模型。如何使用簡單的使用者介面進行模型化至關重要。

很多軟體系統走這樣的極端,缺乏抽象的冗長**,或者過分設計而導致無謂的複雜。

在眾多軟體工程書籍中,robert martin 寫的《敏捷程式設計》值得一讀。

關於模型化,以下方法對你會有幫助。首先,去掉那些只有在將來才可能用得著的方法,**越精練越好。第二,不要總認為以前的東西是對的,要善於改變。第三,要有耐心並享受過程。

不可不知的電梯禮儀

電梯是大多數人生活中密不可分的交通工具,但懂得電梯禮儀和乘坐電梯注意電梯禮儀的人並不多,新加坡前 吳作棟在他發起的全民禮儀運動中強調,講禮儀要從乘電梯這樣的小事做起,下面就教大家一些電梯禮儀,讓你在乘坐電梯的時候既安全又得體,給對方對下美好的印象!同時也能感染更多人遵守電梯禮儀。一 搭乘電梯的一般禮...

不可不知的PHP符號

註解符號 單行註解 多行註解 引號的使用 單引號,沒有任何意義,不經任何處理直接拿過來 雙引號,php動態處理然後輸出,一般用於變數.變數形態 一種是true 即真的 另一種是false 即假的 常見變數形態 string 字串 數字 漢字 等等 integer 整數 1 2 3 4 5 0 1 2...

不可不知的語文知識

一 作者作品 1 唐宋八大家 韓愈 柳宗元 歐陽修 蘇洵 蘇軾 蘇轍 王安石 曾鞏 2 並稱 韓柳 的是韓愈和柳宗元,他們是唐朝古文運動的倡導者。3 一門父子三詞客 蘇洵 老蘇 蘇軾 大蘇 蘇轍 小蘇 4 豪放派詞人 蘇軾 辛棄疾,並稱 蘇辛 婉約派詞人 李清照 女詞人 5 李杜 李白 杜甫。小李杜...