你應該知道的10種軟體工具

奇風餘谷發表於2013-05-11

除非你是設計小型類比電子電路,不然這年頭離開了計算機的幫助,在嵌入式系統設計中很難做成什麼事。我覺得我應該分享一個能幫助我完成工作的軟體工具列表。它們大多數都是免費的或者比較便宜的。它們大多數也和軟體一起工作。如果你向來不需要設計,閱讀或者編輯任何軟體,那麼你屬於讀了這篇文章不會從中受益的那一小部分人。

免責宣告:“最佳”軟體工具通常是一種主張。你可能不同意我的主張,那就取其精華吧。

 

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.orgSourceForgeGoogle CodeGitHub。它們全都為公開版本庫提供免費的主機服務。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 Notepadfirstobject的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程式而言,標準工具是antmaven。它們讓事情更容易,還可以用來構建Java程式之外的其他系統,但是在一般開發環境下不經常用到。

還有很多其他的構建工具。過去的幾年裡,我開始將我的偏好從陳述性語法(如makefile和ant指令碼)的工具轉移到更加多用途的語法的工具上。這樣的想法是因為對於大多數簡單的任務,你可以描述得非常簡明,但是如果你想要做點複雜的事,你擁有多用途程式語言的全部威力。(舉個例子,如果你想在一個特殊的構建任務裡啟用命令列選項“-On”,這裡“n”是一個數字,等於檔案的大小模以7。你可以寫一個自動做這個的方法)這些工具包括rake(基於Ruby),gradle(基於Groovy),sconswaf(它倆都基於Python)。我用了scons三年,因為我懂Python。是一個同事給我推薦的scons。它在某些地方工作的很好,並且極其靈活,但是在其他地方真的難以去修改scons的預設行為,讓它做你真正要做的。最近我剛開始用waf。我發現更容易讓它做我需要做的,因此如果你有一個新專案,我推薦你看看waf,儘管我希望它有一個不這麼神祕的名字。

 

5. 指令碼工具 有時候你需要快速組裝一段軟體來做某件事。通常很難用C或者C++來實現,因為你必須花費精力寫程式碼來解析字串,或者讀檔案,或者任何別的什麼。然後你得為每個計算機平臺把這個C/C++程式編譯成可執行檔案。啊…

更好的解決方案是使用指令碼語言。它們通常都是解釋性的計算機語言,直譯器提供了大多數作業系統的版本。所以如果你寫了一個指令碼,應該可以用在不同的作業系統上。

現代指令碼語言的例子是PythonRubyGroovy。(我更喜歡Python。)早期的指令碼語言包括awk和Perl。我有一些避免使用Perl的理由:它的語法非常奇特和神祕,不同的型別有不同的字首($foo是一個單變數,但是@foo是一個陣列),還有它鼓勵使用“偽變數”(<>$_),它的一些副作用隱含地依賴於程式裡其他被執行的動作。這些造就了不良的程式設計風格:編寫簡短而神祕的指令碼,它可以用幾行標點符號聰明地完成一些事,但是別人閱讀和維護都不易。我慚愧地承認10年前我大量使用awk,因為它比perl簡單。awk是一種古老的文字處理指令碼語言,曾經有它的地位,但是在某些角度和Perl一樣糟糕,都鼓勵不好的程式設計實踐。

不管你喜歡哪個,我會強烈建議你用一種能夠在偵錯程式裡測試的語言。我用awk的經歷很糟糕,除錯程式的時候我不得不放一些列印語句在裡面,告訴我發生什麼了。用Python就很開心,因為有一個很好的Eclipse的外掛叫做pydev。用它你可以在指令碼任何地方設定斷點和單步除錯。

我時不時也用一個叫做JSDB的程式。JSDB是一個獨立的JavaScript的外殼程式,用創立於Firefox網頁瀏覽器的SpiderMonkey JavaScript引擎構建。它還有一些訪問檔案,資料庫,網路流和串列埠等等的工具類。它沒有解釋性的偵錯程式(儘管有一個奇怪的偵錯程式。該偵錯程式有一種即時網路伺服器,你可以把你的網頁瀏覽器指向你計算機上的一個埠,它就可以讓你除錯程式),並且有時候有一點詭異,但是它比起Python更輕量級,對於有些事情,我發現我能更快著手。

我在這節所提到的所有指令碼語言都是免費的。

 

6. 數值分析工具 除非你做的東西像能夠聯網的交通燈這種真的很簡單,否則有這種可能就是你在嵌入式系統專案裡的做某種數學部分。你也許要給資料作圖,或者為資料擬合曲線,或者解方程,或者設計一個低通濾波器,或者觀察當你修改引數後你的系統改變了多少。在這些任務上數值分析工具可以幫到你。它們包括MATLABMathematica,和MathCAD這樣的程式。它們都不是免費的。完全版的MATLAB還有它的全套工具箱會花掉你數千美元,不過它們提供了大量的功能。MATLAB擅長於資料分析,Mathematica擅長符號代數。MathCAD介於兩者之間,是所見即所得的處理方式:用來得到你在MathCAD的工作表(worksheet)裡所見到的輸出的每個運算,在該工作表上你都能看到。因此它一目瞭然。如果你給誰列印這個工作表,他/她能看到要去複製你的工作成果所需的所有計算步驟。例如和Excel工作表比較,你看到的是運算的結果。要想看的運算步驟,你需要到每一個單元格里去看是否有公式。

MATLAB也有一些“山寨”免費軟體:SciLabOctavePyLab。它們都提供了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是一個很基本而又可以幫助你畫這些圖的工具。
  • “排版”工具(不是生產文件的所見即所得的軟體)——docutilssphinx都能根據ReStructured Text(一種維基風格的標記語言)生成Python風格的文件。所需的生成程式碼文件的工作量是很少的,儘管兩者都能為Python縮排,將它們用於任何其他文件也不難。我前不久放棄了Tex和LaTex,但那是我個人的怪癖,這兩個在科研圈子裡大量用到。所以你能在那裡找到很多支援。還有DocBook。或者你可以尋求所見即所得軟體,但是要小心。
  • “自文件化”程式碼工具:Doxygen是其中最常見的,把你程式碼裡的註釋轉為文件。Javadoc是專門用於Java的文件工具。

 

8. 終端和通訊軟體:當你需要經由串列埠通訊時,到了該用終端軟體的時候了。在網頁瀏覽器之前,這更加常見。哪個軟體好?朋友不會讓朋友使用繫結Windows的超級終端版本——它不是那麼健壯——而且微軟最終釋出Vista時不再捎上它了。我最喜歡的是PuTTYtelTeraTerm 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
  • headtail——這兩個讓你列印出檔案的頭N行或後N行
  • uniq——過濾輸出,移除連續的相同行
  • du——列印一個目錄的磁碟使用率(總佔用空間)
  • wc——統計檔案的行數,單詞數和字元數。(當我給編輯寫信時我會用它,這樣我可以保持我的字數在新聞能允許的最大字數內)
  • cp,rm,mv,ls,cat——這些都有DOS下的等價命令(copy,delete,rename,dir,type),但是這些UNIX的等價命令有時候在指令碼里用到,所以我把它們安裝到我的path下。
  • md5sum——在對通過計算檔案的MD5雜湊碼來驗證檔案完整性時有用
  • gzip和gunzip——這兩個是壓縮和解壓縮單個檔案的。.gz格式較.zip普及程度低一點,但是你偶爾能見到它。
  • wgetcurl——這兩個程式可以讓你下載網頁。

 

英文原文:Jason Sachs,編譯:奇風餘谷

譯文連結:http://blog.jobbole.com/39783/

【非特殊說明,轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊,謝謝合作!】

相關文章