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