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