你應(yīng)該知道的10種軟件工具
除非你是設(shè)計(jì)小型模擬電子電路,不然這年頭離開(kāi)了計(jì)算機(jī)的幫助,在嵌入式系統(tǒng)設(shè)計(jì)中很難做成什么事。我覺(jué)得我應(yīng)該分享一個(gè)能幫助我完成工作的軟件工具列表。它們大多數(shù)都是免費(fèi)的或者比較便宜的。它們大多數(shù)也和軟件一起工作。如果你向來(lái)不需要設(shè)計(jì),閱讀或者編輯任何軟件,那么你屬于讀了這篇文章不會(huì)從中受益的那一小部分人。
免責(zé)聲明:“最佳”軟件工具通常是一種主張。你可能不同意我的主張,那就取其精華吧。
1. 版本控制系統(tǒng) 不管你工作在一個(gè)100人的團(tuán)隊(duì),還是獨(dú)自一人干活,如果你從事設(shè)計(jì),你應(yīng)該會(huì)用到版本控制軟件。這是一種可以管理文檔的不同版本的軟件,不管是圖表還是源代碼。像源代碼或配置文件這樣的文本文檔尤其適合于版本控制,因?yàn)楹苋菀撞榭窗姹鹃g的差異,合并兩個(gè)版本之間的改動(dòng),特別是多個(gè)人工作在一組文檔上。
版本控制里的文檔集合稱為版本庫(kù)(repository)。版本庫(kù)所在的位置某種程度上取決于你用什么樣的版本控制系統(tǒng)——基本上有兩類版本控制系統(tǒng):集中式和分布式。集中式版本控制包含一個(gè)存放版本庫(kù)的服務(wù)器。當(dāng)你方便的時(shí)候,你提交你的修改到版本庫(kù)里。分布式版本控制系統(tǒng)(DVCS)不需要中央服務(wù)器:每個(gè)人工作在有他們自己的本地緩存的版本庫(kù)上(包括整個(gè)歷史記錄),可能會(huì)從一個(gè)版本庫(kù)傳送新的提交到另一個(gè)版本庫(kù),通過(guò)在原版本庫(kù)上 “push”或者在目標(biāo)版本庫(kù)上“pull”完成。
2012年開(kāi)源社區(qū)里最流行的三個(gè)版本控制系統(tǒng)是Subversion(SVN),Mercurial(hg)和Git。Subversion是集中式的,而Mercurial和Git是分布式的。
我用Mercurial開(kāi)發(fā)個(gè)人軟件。建立版本庫(kù)很簡(jiǎn)單。到你工作的根目錄下輸入hg init
,然后用hg add
添加你喜歡的文件,然后用hg commit
提交。我只需要花幾分鐘,立馬就能夠回退到某個(gè)文件的早期版本。我會(huì)專門為我家里PC機(jī)上的服務(wù)配置文件(例如Apache網(wǎng)站服務(wù)器)這樣做——如果我修改了一個(gè)文件,并且這個(gè)修改引起了一個(gè)bug,我只用回退到該文件的早期版本就可以了。
如果項(xiàng)目只有你一個(gè)人在做,管理版本控制系統(tǒng)容易得不可思議——只需要在較好的暫停點(diǎn)時(shí)不時(shí)進(jìn)行提交。如果你和別人一起工作,當(dāng)你們中的一個(gè)人做出修改而另一個(gè)人做出不同的修改產(chǎn)生沖突時(shí),有幾種方法來(lái)協(xié)調(diào)。就是所謂的“合并”。對(duì)于文本文檔,只要你經(jīng)常這樣做,通常很容易。對(duì)于二進(jìn)制文件,幾乎不可能。比較合適的處理方式是在庫(kù)里的文件上放置一道鎖,清楚地聲明你工作在一個(gè)特殊的文件上,并且其他人不應(yīng)該工作在這個(gè)文件上。
這三個(gè)系統(tǒng)(svn,hg和git)起先全都是命令行工具,但是它們都有各式各樣的圖形用戶界面前端,包括Tortoise系列的用戶界面。那是一個(gè)在你的操作系統(tǒng)的文件瀏覽器(如 Windows Explorer或者M(jìn)ac OSX Finder)上擴(kuò)展的輕量級(jí)組件。它們不如非免費(fèi)的版本控制系統(tǒng)那樣易用。我們工作中用過(guò)SurroundSCM,當(dāng)我有點(diǎn)不太喜歡后端的行為方式時(shí),我發(fā)現(xiàn)Surround UI在協(xié)調(diào)分支間的差異上更加好用。
還值得注意的是有很多版本庫(kù)在線主機(jī)系統(tǒng),有bitbucket.org,SourceForge,Google Code和GitHub。它們?nèi)紴楣_(kāi)版本庫(kù)提供免費(fèi)的主機(jī)服務(wù)。bitbucket免費(fèi)為項(xiàng)目成員不超過(guò)5人的私有版本庫(kù)提供主機(jī)服務(wù)。我強(qiáng)烈推薦使用像Mercurial或者Git這樣的分布式版本控制系統(tǒng),因?yàn)檫@意味著你可以把項(xiàng)目從一個(gè)主機(jī)站點(diǎn)轉(zhuǎn)到另一個(gè)上,并且即使站點(diǎn)臨時(shí)宕機(jī),你依舊可以使用本地的版本庫(kù)的拷貝。
2. 文件比較工具 在將代碼合并到版本控制系統(tǒng)中,或者僅僅是想看看一個(gè)文件同另一個(gè)文件之間的差異時(shí),你會(huì)需要文件比較工具。有命令行的工具如“diff”,還有圖形用戶界面的文件比較工具。我喜歡叫Beyond Compare的程序——不是免費(fèi)的,但是不貴,并且易用。它還可以比較兩個(gè)文件夾,可以讓你做3-way文件比較。Beyond Compare有Windows和Linux的,OSX版本的正在開(kāi)發(fā)但是現(xiàn)在還沒(méi)有。其他的還有SourceGear DiffMerge(免費(fèi),跨平臺(tái) Win/OSX/Linux),Compare It!(便宜,只有Windows的),DeltaWalker(價(jià)格適中,OSX)和UltraCompare(價(jià)格適中,跨平臺(tái))。
3. 編輯器 和文本文件打交道可難可易,這取決于你用的軟件。重量級(jí)的編輯器是像Eclipse,NetBeans或者Visual Studio那樣的集成開(kāi)發(fā)環(huán)境(IDE)。假如你用特定的軟件工具和在特殊的處理器上編程,那么它們很出色。但是有時(shí)候你需要的只是快速編輯文件。操作系統(tǒng)自帶的基本編輯器(像Windows上的記事本,Mac上的TextEdit)是輕量級(jí)的,但他們沒(méi)有多少功能。我喜歡有中量級(jí)的編輯器可以用:這個(gè)類目里有一些好的免費(fèi)編輯器,如Windows上的Notepad++,Mac上的TextWrangler。我還用過(guò)非免費(fèi)的UltraEdit,它更強(qiáng)大一點(diǎn),而且在Windows,OSX,Linux上都可以用。SlickEdit是專業(yè)級(jí)的編輯器,要價(jià)數(shù)百美元,可能對(duì)絕大多數(shù)任務(wù)殺傷力過(guò)大,但我的一些同事卻很忠于它。(希望他們沒(méi)有吐槽它)
提到編輯器不提GNU emacs就不公平了——它是免費(fèi)的開(kāi)源的編輯器,誕生于當(dāng)大多數(shù)操作系統(tǒng)還是基于終端的時(shí)候。它的大多數(shù)命令都是用一串難以理解的按鍵發(fā)出。你喜歡這樣的方式就行,我是不喜歡的。它是一個(gè)非常強(qiáng)大的編輯器,可以通過(guò)Lisp語(yǔ)言編程定制。你可以在emacs里做任何事,只要它是可以在終端顯示的。
我要找的編輯器的兩大功能如下:
- 大文件支持。如果很大的文件(若干兆),確保你的編輯器可以在不用把文件全部加載到內(nèi)存就能打開(kāi)它。記事本不行,但是Notepad++和UltraEdit可以。
- “多文件查找”功能 典型的源代碼樹(shù)包含多個(gè)文件,你經(jīng)常會(huì)忘記把東西放哪了。(好吧,至少我會(huì)忘記把東西放哪了!)在多個(gè)文件里搜索一個(gè)單詞或模式的能力是無(wú)價(jià)的。Unix 的“grep”允許你用命令行做這樣的事,但是編輯器里的“多文件查找”功能可以讓你雙擊查找結(jié)果,然后跳到編輯器里的該行上。
你可能還需要在十六進(jìn)制編輯器里編輯二進(jìn)制文件——可以讓你查看和編輯那些不可打印字符的字符碼。Notepad++和UltraEdit都有十六進(jìn)制編輯模式。如果你用Mac,試試單機(jī)版的Hex Fiend——它很不錯(cuò)。
還有用于XML文件的特殊編輯器——在免費(fèi)類目里,有XML Notepad和firstobject的XML編輯器“foxe”。foxe的用戶界面有點(diǎn)笨拙,但是用來(lái)編輯大型文件非常非常不錯(cuò)。
4. Build 工具 如果你開(kāi)始在IDE里寫軟件,只用點(diǎn)擊”構(gòu)建“,然后程序就給你編譯你的源代碼。這樣做要注意,它意味著你在讓IDE去操心那些細(xì)節(jié)。對(duì)于你正在其中學(xué)習(xí)某個(gè)東西的小系統(tǒng)倒還好。但是有大量的選項(xiàng)可以改變軟件的編譯方式,在IDE里它們被埋藏在菜單里,并且也不容易從一個(gè)項(xiàng)目轉(zhuǎn)移到另一個(gè)項(xiàng)目。運(yùn)氣好的話,你可以識(shí)別出用于存儲(chǔ)構(gòu)建配置的那些文件,然后可以檢入到版本控制系統(tǒng),因?yàn)椴蝗坏脑捘惚4娴牟皇峭暾捻?xiàng)目源碼。
專業(yè)的軟件工程師——重申,這是一家之言——應(yīng)該用一種明確的構(gòu)建工具。標(biāo)準(zhǔn)的原味的(plain-vanilla)解決方案(我寧愿錯(cuò)打成痛苦味的pain-vanilla,并這樣保持下去)是一個(gè)在70年代引入的叫做make的程序。不幸的是它現(xiàn)在仍被在用。makefile由像這樣若干行構(gòu)成:
- foo.obj: foo.c
- cc -o $@ $<
它們是一些規(guī)則,告訴make如何通過(guò)執(zhí)行程序(這個(gè)例子里是“cc”)把源文件(例如上面的“foo.c”)變成目標(biāo)文件(例如 “foo.obj”)來(lái)構(gòu)建你的軟件。它們還指示依賴關(guān)系:假設(shè)文件F3依賴于運(yùn)行命令X從文件F2生成文件F3,文件F2依賴于運(yùn)行命令Y從文件F1生成文件F2——構(gòu)建工具要能夠推斷出依賴關(guān)系圖,這樣如果你改變了文件F1,它能夠知道必須相應(yīng)地重新構(gòu)建文件F2和文件F3。這可能看起來(lái)微不足道,但是在任何項(xiàng)目里,除了那種微型軟件項(xiàng)目,這都是相當(dāng)重要的。我從事的是相對(duì)簡(jiǎn)單的軟件項(xiàng)目,它只有數(shù)十個(gè)源文件,但是全部編譯需要5分鐘。有合適的構(gòu)建工具正確的捕獲依賴關(guān)系,根據(jù)你做的修改,讓你只增量編譯那些有需要的文件。
make有很多短板。別的不說(shuō),makefile的語(yǔ)法很含糊,你在編譯時(shí)需要做特殊處理的地方,它難以處理這種特殊情況,你不去為此寫一些單獨(dú)的腳本是不行的。
對(duì)于Java程序而言,標(biāo)準(zhǔn)工具是ant和maven。它們讓事情更容易,還可以用來(lái)構(gòu)建Java程序之外的其他系統(tǒng),但是在一般開(kāi)發(fā)環(huán)境下不經(jīng)常用到。
還有很多其他的構(gòu)建工具。過(guò)去的幾年里,我開(kāi)始將我的偏好從陳述性語(yǔ)法(如makefile和ant腳本)的工具轉(zhuǎn)移到更加多用途的語(yǔ)法的工具上。這樣的想法是因?yàn)閷?duì)于大多數(shù)簡(jiǎn)單的任務(wù),你可以描述得非常簡(jiǎn)明,但是如果你想要做點(diǎn)復(fù)雜的事,你擁有多用途編程語(yǔ)言的全部威力。(舉個(gè)例子,如果你想在一個(gè)特殊的構(gòu)建任務(wù)里啟用命令行選項(xiàng)“-On”,這里“n”是一個(gè)數(shù)字,等于文件的大小模以7。你可以寫一個(gè)自動(dòng)做這個(gè)的方法)這些工具包括rake(基于Ruby),gradle(基于Groovy),scons和waf(它倆都基于Python)。我用了scons三年,因?yàn)槲叶甈ython。是一個(gè)同事給我推薦的scons。它在某些地方工作的很好,并且極其靈活,但是在其他地方真的難以去修改scons的默認(rèn)行為,讓它做你真正要做的。最近我剛開(kāi)始用waf。我發(fā)現(xiàn)更容易讓它做我需要做的,因此如果你有一個(gè)新項(xiàng)目,我推薦你看看waf,盡管我希望它有一個(gè)不這么神秘的名字。
5. 腳本工具 有時(shí)候你需要快速組裝一段軟件來(lái)做某件事。通常很難用C或者C++來(lái)實(shí)現(xiàn),因?yàn)槟惚仨毣ㄙM(fèi)精力寫代碼來(lái)解析字符串,或者讀文件,或者任何別的什么。然后你得為每個(gè)計(jì)算機(jī)平臺(tái)把這個(gè)C/C++程序編譯成可執(zhí)行文件。啊…
更好的解決方案是使用腳本語(yǔ)言。它們通常都是解釋性的計(jì)算機(jī)語(yǔ)言,解釋器提供了大多數(shù)操作系統(tǒng)的版本。所以如果你寫了一個(gè)腳本,應(yīng)該可以用在不同的操作系統(tǒng)上。
現(xiàn)代腳本語(yǔ)言的例子是Python,Ruby和Groovy。(我更喜歡Python。)早期的腳本語(yǔ)言包括awk和Perl。我有一些避免使用Perl的理由:它的語(yǔ)法非常奇特和神秘,不同的類型有不同的前綴($foo
是一個(gè)單變量,但是@foo
是一個(gè)數(shù)組),還有它鼓勵(lì)使用“偽變量”(<>
和$_
),它的一些副作用隱含地依賴于程序里其他被執(zhí)行的動(dòng)作。這些造就了不良的編程風(fēng)格:編寫簡(jiǎn)短而神秘的腳本,它可以用幾行標(biāo)點(diǎn)符號(hào)聰明地完成一些事,但是別人閱讀和維護(hù)都不易。我慚愧地承認(rèn)10年前我大量使用awk,因?yàn)樗萷erl簡(jiǎn)單。awk是一種古老的文本處理腳本語(yǔ)言,曾經(jīng)有它的地位,但是在某些角度和Perl一樣糟糕,都鼓勵(lì)不好的編程實(shí)踐。
不管你喜歡哪個(gè),我會(huì)強(qiáng)烈建議你用一種能夠在調(diào)試器里測(cè)試的語(yǔ)言。我用awk的經(jīng)歷很糟糕,調(diào)試程序的時(shí)候我不得不放一些打印語(yǔ)句在里面,告訴我發(fā)生什么了。用Python就很開(kāi)心,因?yàn)橛幸粋€(gè)很好的Eclipse的插件叫做pydev。用它你可以在腳本任何地方設(shè)置斷點(diǎn)和單步調(diào)試。
我時(shí)不時(shí)也用一個(gè)叫做JSDB的程序。JSDB是一個(gè)獨(dú)立的JavaScript的外殼程序,用創(chuàng)立于Firefox網(wǎng)頁(yè)瀏覽器的SpiderMonkey JavaScript引擎構(gòu)建。它還有一些訪問(wèn)文件,數(shù)據(jù)庫(kù),網(wǎng)絡(luò)流和串行端口等等的工具類。它沒(méi)有解釋性的調(diào)試器(盡管有一個(gè)奇怪的調(diào)試器。該調(diào)試器有一種即時(shí)網(wǎng)絡(luò)服務(wù)器,你可以把你的網(wǎng)頁(yè)瀏覽器指向你計(jì)算機(jī)上的一個(gè)端口,它就可以讓你調(diào)試程序),并且有時(shí)候有一點(diǎn)詭異,但是它比起Python更輕量級(jí),對(duì)于有些事情,我發(fā)現(xiàn)我能更快著手。
我在這節(jié)所提到的所有腳本語(yǔ)言都是免費(fèi)的。
6. 數(shù)值分析工具 除非你做的東西像能夠聯(lián)網(wǎng)的交通燈這種真的很簡(jiǎn)單,否則有這種可能就是你在嵌入式系統(tǒng)項(xiàng)目里的做某種數(shù)學(xué)部分。你也許要給數(shù)據(jù)作圖,或者為數(shù)據(jù)擬合曲線,或者解方程,或者設(shè)計(jì)一個(gè)低通濾波器,或者觀察當(dāng)你修改參數(shù)后你的系統(tǒng)改變了多少。在這些任務(wù)上數(shù)值分析工具可以幫到你。它們包括MATLAB,Mathematica,和MathCAD這樣的程序。它們都不是免費(fèi)的。完全版的MATLAB還有它的全套工具箱會(huì)花掉你數(shù)千美元,不過(guò)它們提供了大量的功能。MATLAB擅長(zhǎng)于數(shù)據(jù)分析,Mathematica擅長(zhǎng)符號(hào)代數(shù)。MathCAD介于兩者之間,是所見(jiàn)即所得的處理方式:用來(lái)得到你在MathCAD的工作表(worksheet)里所見(jiàn)到的輸出的每個(gè)運(yùn)算,在該工作表上你都能看到。因此它一目了然。如果你給誰(shuí)打印這個(gè)工作表,他/她能看到要去復(fù)制你的工作成果所需的所有計(jì)算步驟。例如和Excel工作表比較,你看到的是運(yùn)算的結(jié)果。要想看的運(yùn)算步驟,你需要到每一個(gè)單元格里去看是否有公式。
MATLAB也有一些“山寨”免費(fèi)軟件:SciLab,Octave和PyLab。它們都提供了MATLAB提供的基本功能,語(yǔ)法也要么一樣,要么很相似。但是沒(méi)有一個(gè)像MATLAB那樣優(yōu)美和專業(yè)。PyLab的額外的賣點(diǎn)是用 Python語(yǔ)言實(shí)現(xiàn),還有為Python提供了科學(xué)計(jì)算和作圖的庫(kù)。因此如果你懂Python,你可以利用這些知識(shí)去進(jìn)行科學(xué)計(jì)算。
我對(duì)MATLAB是愛(ài)恨交加的關(guān)系。一方面,它是如此美麗的軟件,讓你做數(shù)值分析,可視化,還有額外的包羅萬(wàn)象的工具箱(信號(hào)處理,濾波器設(shè)計(jì),控制回路仿真,等等)。另一方面,它不便宜,在MathWorks里的那些出售MATLAB的人們?cè)陟乓麄冏钚碌墓δ軙r(shí)樂(lè)呵呵的好像價(jià)格是不需要考慮的。
關(guān)于數(shù)值分析工具,我有最后一句懇求的咆哮體
不要用Excel進(jìn)行數(shù)值分析?。。?/strong>
1996年我開(kāi)始工作時(shí)還是一個(gè)電氣工程師,我還不懂MATLAB,所以當(dāng)我要給數(shù)據(jù)作圖時(shí),我用我所知道的:微軟Excel。Excel是主要針對(duì)商業(yè)應(yīng)用的電子表格軟件,但是它可以讀文字分割文件(如逗號(hào)分隔值CSV文件),有某種控制繪圖的方式能讓你給結(jié)果作圖,因此它可以用于給數(shù)據(jù)圖像化。但是如果要做任何超出基本繪制的事情,你會(huì)發(fā)現(xiàn)要這樣非常困難,并且很快就會(huì)令人沮喪。如果你有一組數(shù)據(jù)要圖像化,或許不是那么糟糕,而且你可以交互式的讓它變成你想要的樣子。如果你有一批數(shù)據(jù)文件想要用同樣的方式繪圖,真的是個(gè)很大的麻煩,你要手動(dòng)地反反復(fù)復(fù)去做同樣的事情直到結(jié)束。當(dāng)然,你可以用 Visual Basic編寫宏代碼。當(dāng)我想要在一個(gè)頁(yè)面上做多個(gè)圖,并對(duì)齊坐標(biāo)軸時(shí)我就這么做過(guò)。但是接著你會(huì)發(fā)現(xiàn)你所知道的對(duì)象模型既變態(tài)又古怪,可能不能讓你做你想要做的。然后你便開(kāi)始對(duì)住在華盛頓雷德蒙的某些人起了壞念頭。在Excel里如果你遇到了要寫宏代碼的時(shí)候,停下來(lái)想想你的情況。那些你投入在讓Excel做你要做的事情的時(shí)間,你可以花在學(xué)習(xí)其他能更容易繪圖和分析數(shù)據(jù)的,用于科研而不是商業(yè)的軟件上。記住,在微軟的那些人試圖制作能銷售和上市的軟件,人們用這樣的軟件可以解決他們的問(wèn)題。而作為工程師,我們得到的不管什么樣的功能剛好是在給自己增加困難。
7. 文檔工具 你經(jīng)常會(huì)和其他人交流你的想法,有很多不同類型的軟件可以幫助你做這個(gè)。是的,有不免費(fèi)的微軟程序像用于流程圖/繪圖的Visio,寫文檔的Word,還有演講用的PowerPoint。但是有時(shí)候你想要免費(fèi)的或者更專門的東西,用于特殊類型的文檔。
- 圖形可視化 我們不是在此談x-y圖,而是能夠可視化帶有節(jié)點(diǎn)和邊的網(wǎng)絡(luò)。我用graphviz(基于命令行的)和yEd(交互式的)。這兩個(gè)我都推薦。
- 序列圖 他們讓你可視化用例,即一串引起軟件組件交互的事件。Quick Sequence Diagram Editor是一個(gè)很基本而又可以幫助你畫這些圖的工具。
- “排版”工具(不是生產(chǎn)文檔的所見(jiàn)即所得的軟件)——docutils和sphinx都能根據(jù)ReStructured Text(一種維基風(fēng)格的標(biāo)記語(yǔ)言)生成Python風(fēng)格的文檔。所需的生成代碼文檔的工作量是很少的,盡管兩者都能為Python縮進(jìn),將它們用于任何其他文檔也不難。我前不久放棄了Tex和LaTex,但那是我個(gè)人的怪癖,這兩個(gè)在科研圈子里大量用到。所以你能在那里找到很多支持。還有DocBook?;蛘吣憧梢詫で笏?jiàn)即所得軟件,但是要小心。
- “自文檔化”代碼工具:Doxygen是其中最常見(jiàn)的,把你代碼里的注釋轉(zhuǎn)為文檔。Javadoc是專門用于Java的文檔工具。
8. 終端和通訊軟件:當(dāng)你需要經(jīng)由串口通訊時(shí),到了該用終端軟件的時(shí)候了。在網(wǎng)頁(yè)瀏覽器之前,這更加常見(jiàn)。哪個(gè)軟件好?朋友不會(huì)讓朋友使用綁定Windows的超級(jí)終端版本——它不是那么健壯——而且微軟最終發(fā)布Vista時(shí)不再捎上它了。我最喜歡的是PuTTYtel和TeraTerm Pro。
其他通訊軟件處理FTP和其安全變種SFTP以及SCP。照我看Cyberduck無(wú)疑是勝者——非常易用,最開(kāi)始只在Mac上,現(xiàn)在OSX和Windows上都有。(此外,你如何能不喜歡上一個(gè)將橡皮鴨作為logo的軟件呢)
9. 軟件質(zhì)量保證(QA)工具:如果你寫軟件,并認(rèn)為自己的軟件沒(méi)有bug的,那是自己騙自己。有很多軟件工具可以幫你在bug找你之前先找到它們。好了,此處我不得不承認(rèn)我還只是個(gè)新手,我還不是特別熟悉這塊有些什么。(太不好意思了?。┑俏掖_實(shí)足夠了解該建議看什么地方。一些主要的類別如下:
- 靜態(tài)分析工具。這類軟件解析你的軟件,或者通過(guò)未處理的源碼,或者通過(guò)編譯后的對(duì)象文件。最著名的例子是C的lint。lint像是你高中的英語(yǔ)老師,他/她在你的試卷上到處畫紅叉,抱怨你用“who”代替了“whom”,或者句子里你用的介詞結(jié)尾。要用英語(yǔ)有效地交流,你用得著嚴(yán)格遵循這些規(guī)則嗎?不,但是這樣做有助于你預(yù)防錯(cuò)誤。C語(yǔ)言里也是如此——避免寫某種差勁的模式的代碼可以幫助你預(yù)防錯(cuò)誤,而lint是幫你找到那些模式的。Java有FindBugs,而其他的編程語(yǔ)言也有類似的程序。在這類軟件里同樣會(huì)計(jì)算代碼復(fù)雜度——好的軟件設(shè)計(jì)通常使函數(shù)保持短小。如果你發(fā)現(xiàn)你寫的函數(shù)超過(guò)20-30行,你或許可以把它們分成更小的單元,這樣更容易設(shè)計(jì)和調(diào)試。
- 單元測(cè)試和代碼覆蓋率。通常認(rèn)為測(cè)試大型軟件包是及其困難的,而在單個(gè)代碼模塊上寫嘗試各種輸入模式的單元測(cè)試來(lái)測(cè)試較小的軟件模塊比較容易。在嵌入式系統(tǒng)里單元測(cè)試可以很難。一種方法是在PC上交叉編譯軟件,并寄希望于你的軟件里的任何bug可以在PC編譯版本里被檢測(cè)到。當(dāng)你能夠?qū)懽詣?dòng)測(cè)試腳本也是有希望的。這樣當(dāng)你對(duì)你的軟件做了修改,你可以運(yùn)行自動(dòng)測(cè)試腳本,檢查是否引入了新bug。對(duì)于代碼覆蓋率,我在醫(yī)療工業(yè)里的同事使用Cantata++。它不便宜,但是這些可是醫(yī)療設(shè)備。
- 代碼“美化器”——如果你和同事都使用相同的代碼,那你可以更容易的找到低級(jí)的語(yǔ)法bug。正常情況我們都有自己的風(fēng)格,但是這里就有軟件可以自動(dòng)縮進(jìn),把制表符轉(zhuǎn)為空格或等價(jià)的東西。我考慮過(guò)的有一個(gè)叫做Uncrustify,附有一個(gè)圖形用戶界面叫做UniversalIndentGUI。
10. 基本命令行應(yīng)用工具
下面的很多程序都是UNIX的命令行應(yīng)用工具,它們出生在還沒(méi)有圖形用戶界面,事情都需要靠手動(dòng)去完成的日子。除非現(xiàn)在圖形用戶界面有革命性的改進(jìn),否則通過(guò)命令行,你能做的總是更多些,因?yàn)槟阃ㄟ^(guò)腳本可以完成更多種事情的組合。如果你運(yùn)行的是OSX或者Linux,你已經(jīng)有這些工具了。如果你運(yùn)行的是Windows,你可以去 http://unxutils.sourceforge.net/ 或 http://sourceforge.net/projects/unxutils/下載能運(yùn)行在你的操作系統(tǒng)上的二進(jìn)制版本。
- less——這也許是我用的最多的。它能夠顯示文件逐頁(yè)顯示文件內(nèi)容。你還可以查找文本內(nèi)容,或者如果你在看一個(gè)正在不斷更新的日志文件,你可以按下F,然后它會(huì)給你顯示最新加入的行。
- grep——能用正則表達(dá)式搜索一組文件。
- touch——更新文件的最近修改時(shí)間為當(dāng)前日期/時(shí)間,或者如果文件不存在,它會(huì)創(chuàng)建一個(gè)空文件。
- tee——通過(guò)tee傳送管道命令(例如
someprog | tee logfile
)讓你復(fù)制那個(gè)命令的輸出到文件,并同時(shí)在終端打印輸出。 - which——如果你在終端運(yùn)行一個(gè)程序foo.exe,你想要知道該程序在什么位置,只需要輸入
which foo.exe
- head和tail——這兩個(gè)讓你打印出文件的頭N行或后N行
- uniq——過(guò)濾輸出,移除連續(xù)的相同行
- du——打印一個(gè)目錄的磁盤使用率(總占用空間)
- wc——統(tǒng)計(jì)文件的行數(shù),單詞數(shù)和字符數(shù)。(當(dāng)我給編輯寫信時(shí)我會(huì)用它,這樣我可以保持我的字?jǐn)?shù)在新聞能允許的最大字?jǐn)?shù)內(nèi))
- cp,rm,mv,ls,cat——這些都有DOS下的等價(jià)命令(copy,delete,rename,dir,type),但是這些UNIX的等價(jià)命令有時(shí)候在腳本里用到,所以我把它們安裝到我的path下。
- md5sum——在對(duì)通過(guò)計(jì)算文件的MD5哈希碼來(lái)驗(yàn)證文件完整性時(shí)有用
- gzip和gunzip——這兩個(gè)是壓縮和解壓縮單個(gè)文件的。.gz格式較.zip普及程度低一點(diǎn),但是你偶爾能見(jiàn)到它。
- wget和curl——這兩個(gè)程序可以讓你下載網(wǎng)頁(yè)。
英文原文:Jason Sachs