出色的軟件工程師善用設(shè)計模式,勤于代碼重構(gòu),編寫單元測試,并對簡單有宗教般的追求。除了這些,優(yōu)秀的軟件工程師還要通曉10個概念,這10個概念超越了編程語言與設(shè)計模式,軟件工程師應(yīng)當(dāng)從更廣的范圍內(nèi)明白這些道理。
關(guān)系數(shù)據(jù)庫 (Relational Databases)
關(guān)系數(shù)據(jù)庫因為在大規(guī)模 Web 服務(wù)上缺乏可擴(kuò)充性而頗受微詞,然而,關(guān)系數(shù)據(jù)庫仍然是近20年來計算機(jī)技術(shù)中最偉大的成就。關(guān)系數(shù)據(jù)庫對處理訂單,公司數(shù)據(jù)方面有著出色的表現(xiàn)。
關(guān)系數(shù)據(jù)庫的核心是以記錄表示數(shù)據(jù),記錄存放在數(shù)據(jù)庫表,數(shù)據(jù)庫使用查詢語言(SQL)對數(shù)據(jù)進(jìn)行搜索與查詢,同時,數(shù)據(jù)庫對各個數(shù)據(jù)表進(jìn)行關(guān)聯(lián)。
數(shù)據(jù)庫的標(biāo)準(zhǔn)化技術(shù)(normalization)講的是使用正確的方式對數(shù)據(jù)進(jìn)行分存以降低冗余,并加快存取速度。
安全 (Security)
隨著黑客的崛起與數(shù)據(jù)敏感性的上升,安全變得非常重要。安全是個廣義的概念,涉及驗證,授權(quán)與信息傳輸。
驗證是對用戶的身份進(jìn)行檢查,如要求用戶輸入密碼。驗證通常需要結(jié)合 SSL (secure socket layer)進(jìn)行;授權(quán)在公司業(yè)務(wù)系統(tǒng)中非常重要,尤其是一些工作流系統(tǒng)。最近開發(fā)的 OAuth 協(xié)議可以幫助 Web 服務(wù)將相應(yīng)信息向相應(yīng)用戶開放。Flickr 便使用這種方式管理私人照片和數(shù)據(jù)的訪問權(quán)限。
另外一個安全領(lǐng)域是網(wǎng)絡(luò)設(shè)防,這關(guān)系到操作系統(tǒng),配置與監(jiān)控。不僅網(wǎng)絡(luò)危險重重,任何軟件都是。Firefox 被稱為最安全的瀏覽器,仍然需要頻頻發(fā)布安全補(bǔ)丁。要為你的系統(tǒng)編寫安全代碼就需要明白各種潛在的問題。
云計算 (Cloud Computing)
RWW 最近的關(guān)于云計算的文章 Reaching For The Sky Through Compute Clouds 講到了云計算如何改變大規(guī)模 Web 應(yīng)用的發(fā)布。大規(guī)模的并行,低成本,與快速投入市場。
并行算法發(fā)明以來,首先迎來的是網(wǎng)格計算,網(wǎng)格計算是借助空閑的桌面計算機(jī)資源進(jìn)行并行計算。最著名的例子是 Berkley 大學(xué)的 SETI@home 計劃,該計劃使用空閑的 CPU 資源分析太空數(shù)據(jù)。金融機(jī)構(gòu)也大規(guī)模實施網(wǎng)格計算進(jìn)行風(fēng)險分析??臻e的資源,加上 J2EE 平臺的崛起,迎來了云計算的概念:應(yīng)用服務(wù)虛擬化。就是應(yīng)用按需運(yùn)行,并可以隨著時間和用戶規(guī)模而實時改變。
云計算最生動的例子是 Amazon 的 Web 服務(wù),一組可以通過 API 進(jìn)行調(diào)用的應(yīng)用,如云服務(wù)(EC2),一個用來存儲大型媒體文件的數(shù)據(jù)庫(S3),索引服務(wù)(SimpleDB),序列服務(wù)(SQS)。
并發(fā) (Concurrency)
并發(fā)是軟件工程師最容易犯錯的地方,這可以理解,因為我們一直遵從線形思維,然而并發(fā)在現(xiàn)代系統(tǒng)中非常重要。
并發(fā)是程序中的并行處理,多數(shù)現(xiàn)代編程語言包含內(nèi)置的并發(fā)能力,在 Java,指的是線程。關(guān)于并發(fā),最經(jīng)典的例子是“生產(chǎn)/消費(fèi)”模式,生產(chǎn)方生產(chǎn)數(shù)據(jù)和任務(wù),并放入工作線程消費(fèi)或執(zhí)行。并發(fā)的復(fù)雜性在于,線程需要經(jīng)常訪問共同數(shù)據(jù),每個線程都有自己的執(zhí)行順序,但需要訪問共同數(shù)據(jù)。Doug Lea 曾寫過一個最復(fù)雜的并發(fā)類,現(xiàn)在是 core Java 的一部分。
緩存(Caching)
緩存對現(xiàn)代 Web 程序不可或缺,緩存是從數(shù)據(jù)庫取回,并存放在內(nèi)存中的數(shù)據(jù)。因為數(shù)據(jù)庫直接存取的代價非常高,將數(shù)據(jù)從數(shù)據(jù)庫取回并放在緩存中訪問就變得十分必要。比如,你有一個網(wǎng)站,要顯示上周的暢銷書,你可以從數(shù)據(jù)將暢銷書榜一次性取回放在緩存中,而不必在每次訪問時都去數(shù)據(jù)庫讀數(shù)據(jù)。
緩存需要代價,只有最常用的內(nèi)容才可以放入緩存。很多現(xiàn)代程序,包括 Facebook,依靠一種叫做 Memcached 的分布式緩存系統(tǒng),該系統(tǒng)是 Brad Firzpatrick 在工作于 LiveJournal 項目時開發(fā)的,Memcached 使用網(wǎng)絡(luò)中空閑的內(nèi)存資源建立緩存機(jī)制,Memcached 類庫在很多流行編程語言,包括 Java 和 PHP 中都有。
散列法(Hashing)
Hashing 的目的是加速訪問速度。如果數(shù)據(jù)是序列存儲的,從中查詢一個項的時間取決于數(shù)據(jù)列的大小。而散列法對每一個項計算一個數(shù)字作為索引,在一個好的 Hashing 算法下,數(shù)據(jù)查找的速度是一樣的。
除了存儲數(shù)據(jù),散列法對分布式系統(tǒng)也很重要。統(tǒng)一散列法(uniform hash )用來在云數(shù)據(jù)庫環(huán)境下,在不同計算機(jī)之間分存數(shù)據(jù)。Google 的索引服務(wù)就是這種方法的體現(xiàn),每一個 URL 都被散列分布到特定計算機(jī)。
散列函數(shù)非常復(fù)雜,但現(xiàn)代類庫中都有現(xiàn)成的類,重要的是,如何對散列法進(jìn)行細(xì)調(diào)以獲得最好的性能。
算法的復(fù)雜性 (Algorithmic Complexity)
關(guān)于算法的復(fù)雜性,軟件工程師需要理解這樣幾件事。第一,大O標(biāo)記法(big O notation);第二,你永遠(yuǎn)都不應(yīng)該使用嵌套式循環(huán)(循環(huán)里面套循環(huán)),你應(yīng)該使用 Hash 表,數(shù)組或單一循環(huán);第三,如今優(yōu)秀類庫比比皆是,我們不必過分糾纏于這些庫的效能的差別,我們以后還有機(jī)會進(jìn)行細(xì)調(diào);最后,不要忽視算法的優(yōu)雅及性能,編寫緊湊的,可讀的代碼可以讓你的算法更簡單,更干凈。
分層 (Layering)
用分層來討論軟件架構(gòu)是最容易的。John Lakos 曾出版過一本關(guān)于大型 C++ 系統(tǒng)的書。Lakos 認(rèn)為軟件包含了層,書中介紹了層的概念,方法是,對每個軟件組件,數(shù)一下它所依賴的組件數(shù)目就可以知道它的復(fù)雜程度。
Lakos 認(rèn)為,一個好的軟件擁有金字塔結(jié)構(gòu),就是說,軟件組件擁有層層積累的復(fù)雜度,但每個組件本身必須簡單,一個優(yōu)秀的軟件包含很多小的,可重復(fù)使用的模塊,每個模塊有自己的職責(zé)。一個好的系統(tǒng)中,組件之間的依賴性不可交叉,整個系統(tǒng)是各種各樣的組件堆積起來,形成一個金字塔。
Lakos 在軟件工程的很多方面都是先驅(qū),最著名的是 Refactoring (代碼重構(gòu))。代碼重構(gòu)指的是,在編程過程中需要不斷地對代碼進(jìn)行改造以保證其結(jié)構(gòu)的健壯與靈活。
慣例與模板 (Conventions and Templates)
命名慣例和基礎(chǔ)模板在編程模式中常被忽視,然而它可能是最強(qiáng)大的方法。命名慣例使軟件自動化成為可能,如,Java Beans 框架在 getter 和 setter 方法中,使用簡單的命名慣例。del.icio.us 網(wǎng)站的 URL 命名也使用統(tǒng)一的格式,如 http://del.icio.us/tag/software 會將用戶帶到所有標(biāo)簽為 software 的頁。
很多社會網(wǎng)絡(luò)均使用簡單命名,如,你的名字是 johnsmith ,那你的頭像可能命名為 johnsmith.jpg,而你的 rss 聚合文件的命名很可能是 johnsmith.xml 。
命名慣例還用于單元測試,如,JUnit 單元測試工具會辨認(rèn)所有以 test 開頭的類。
我們這里說的模板(templates )指的并不是 C++ 或 Java 語言中的 constructs,我們說的是一些包含變量的模板文件,用戶可以替換變量并輸出最終結(jié)果。
Cold Fusion 是最先使用模板的程序之一,后來,Java 使用 JSP 實現(xiàn)模板功能。Apache 近來為 Java 開發(fā)了非常好用的通用模板, Velocity。PHP 本身就是基于模板的,因為它支持 eval 函數(shù)。
界面(Interfaces)
軟件工程中最重要的概念是界面。任何軟件都是一個真實系統(tǒng)的模型。
如何使用簡單的用戶界面進(jìn)行模型化至關(guān)重要。很多軟件系統(tǒng)走這樣的極端,缺乏抽象的冗長代碼,或者過分設(shè)計而導(dǎo)致無謂的復(fù)雜。
在眾多軟件工程書籍中,Robert Martin 寫的《敏捷編程》值得一讀。
關(guān)于模型化,以下方法對你會有幫助。首先,去掉那些只有在將來才可能用得著的方法,代碼越精練越好。第二,不要總認(rèn)為以前的東西是對的,要善于改變。第三,要有耐心并享受過程。
2021-07-09
2021-07-08
2021-07-08
2021-07-08
2021-07-08
2021-07-08
2021-07-07
2021-07-07
2021-07-07
2021-07-07
2021-07-07
2021-07-06
2021-07-06
2021-07-06
工作態(tài)度怎么寫 具有穩(wěn)定的工作心態(tài)
2021-07-06
該文觀點僅代表作者本人,查查吧平臺系信息發(fā)布平臺,僅提供信息存儲空間服務(wù),不承擔(dān)相關(guān)法律責(zé)任。圖片涉及侵權(quán)行為,請發(fā)送郵件至85868317@qq.com舉報,一經(jīng)查實,本站將立刻刪除。