掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
除非你是設(shè)計(jì)小型模擬電子電路,不然這年頭離開了計(jì)算機(jī)的幫助,在嵌入式系統(tǒng)設(shè)計(jì)中很難做成什么事。我覺得我應(yīng)該分享一個(gè)能幫助我完成工作的軟件工具列表。它們大多數(shù)都是免費(fèi)的或者比較便宜的。它們大多數(shù)也和軟件一起工作。如果你向來不需要設(shè)計(jì),閱讀或者編輯任何軟件,那么你屬于讀了這篇文章不會(huì)從中受益的那一小部分人。

上林ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
免責(zé)聲明:“最佳”軟件工具通常是一種主張。你可能不同意我的主張,那就取其精華吧。
1. 版本控制系統(tǒng) 不管你工作在一個(gè)100人的團(tuán)隊(duì),還是獨(dú)自一人干活,如果你從事設(shè)計(jì),你應(yīng)該會(huì)用到版本控制軟件。這是一種可以管理文檔的不同版本的軟件,不管是圖表還是源代碼。像源代碼或配置文件這樣的文本文檔尤其適合于版本控制,因?yàn)楹苋菀撞榭窗姹鹃g的差異,合并兩個(gè)版本之間的改動(dòng),特別是多個(gè)人工作在一組文檔上。
版本控制里的文檔集合稱為版本庫(repository)。版本庫所在的位置某種程度上取決于你用什么樣的版本控制系統(tǒng)——基本上有兩類版本控制系統(tǒng):集中式和分布式。集中式版本控制包含一個(gè)存放版本庫的服務(wù)器。當(dāng)你方便的時(shí)候,你提交你的修改到版本庫里。分布式版本控制系統(tǒng)(DVCS)不需要中央服務(wù)器:每個(gè)人工作在有他們自己的本地緩存的版本庫上(包括整個(gè)歷史記錄),可能會(huì)從一個(gè)版本庫傳送新的提交到另一個(gè)版本庫,通過在原版本庫上 “push”或者在目標(biāo)版本庫上“pull”完成。
2012年開源社區(qū)里最流行的三個(gè)版本控制系統(tǒng)是Subversion(SVN),Mercurial(hg)和Git。Subversion是集中式的,而Mercurial和Git是分布式的。
我用Mercurial開發(fā)個(gè)人軟件。建立版本庫很簡(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í),有幾種方法來協(xié)調(diào)。就是所謂的“合并”。對(duì)于文本文檔,只要你經(jīng)常這樣做,通常很容易。對(duì)于二進(jìn)制文件,幾乎不可能。比較合適的處理方式是在庫里的文件上放置一道鎖,清楚地聲明你工作在一個(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)那樣易用。我們工作中用過SurroundSCM,當(dāng)我有點(diǎn)不太喜歡后端的行為方式時(shí),我發(fā)現(xiàn)Surround UI在協(xié)調(diào)分支間的差異上更加好用。
還值得注意的是有很多版本庫在線主機(jī)系統(tǒng),有bitbucket.org,SourceForge,Google Code和GitHub。它們?nèi)紴楣_版本庫提供免費(fèi)的主機(jī)服務(wù)。bitbucket免費(fèi)為項(xiàng)目成員不超過5人的私有版本庫提供主機(jī)服務(wù)。我強(qiáng)烈推薦使用像Mercurial或者Git這樣的分布式版本控制系統(tǒng),因?yàn)檫@意味著你可以把項(xiàng)目從一個(gè)主機(jī)站點(diǎn)轉(zhuǎn)到另一個(gè)上,并且即使站點(diǎn)臨時(shí)宕機(jī),你依舊可以使用本地的版本庫的拷貝。
2. 文件比較工具 在將代碼合并到版本控制系統(tǒng)中,或者僅僅是想看看一個(gè)文件同另一個(gè)文件之間的差異時(shí),你會(huì)需要文件比較工具。有命令行的工具如“diff”,還有圖形用戶界面的文件比較工具。我喜歡叫Beyond Compare的程序——不是免費(fèi)的,但是不貴,并且易用。它還可以比較兩個(gè)文件夾,可以讓你做3-way文件比較。Beyond Compare有Windows和Linux的,OSX版本的正在開發(fā)但是現(xiàn)在還沒有。其他的還有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那樣的集成開發(fā)環(huán)境(IDE)。假如你用特定的軟件工具和在特殊的處理器上編程,那么它們很出色。但是有時(shí)候你需要的只是快速編輯文件。操作系統(tǒng)自帶的基本編輯器(像Windows上的記事本,Mac上的TextEdit)是輕量級(jí)的,但他們沒有多少功能。我喜歡有中量級(jí)的編輯器可以用:這個(gè)類目里有一些好的免費(fèi)編輯器,如Windows上的Notepad++,Mac上的TextWrangler。我還用過非免費(fèi)的UltraEdit,它更強(qiáng)大一點(diǎn),而且在Windows,OSX,Linux上都可以用。SlickEdit是專業(yè)級(jí)的編輯器,要價(jià)數(shù)百美元,可能對(duì)絕大多數(shù)任務(wù)殺傷力過大,但我的一些同事卻很忠于它。(希望他們沒有吐槽它)
提到編輯器不提GNU emacs就不公平了——它是免費(fèi)的開源的編輯器,誕生于當(dāng)大多數(shù)操作系統(tǒng)還是基于終端的時(shí)候。它的大多數(shù)命令都是用一串難以理解的按鍵發(fā)出。你喜歡這樣的方式就行,我是不喜歡的。它是一個(gè)非常強(qiáng)大的編輯器,可以通過Lisp語言編程定制。你可以在emacs里做任何事,只要它是可以在終端顯示的。
我要找的編輯器的兩大功能如下:
你可能還需要在十六進(jìn)制編輯器里編輯二進(jìn)制文件——可以讓你查看和編輯那些不可打印字符的字符碼。Notepad++和UltraEdit都有十六進(jìn)制編輯模式。如果你用Mac,試試單機(jī)版的Hex Fiend——它很不錯(cuò)。
還有用于XML文件的特殊編輯器——在免費(fèi)類目里,有XML Notepad和firstobject的XML編輯器“foxe”。foxe的用戶界面有點(diǎn)笨拙,但是用來編輯大型文件非常非常不錯(cuò)。
4. Build 工具 如果你開始在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如何通過執(zhí)行程序(這個(gè)例子里是“cc”)把源文件(例如上面的“foo.c”)變成目標(biāo)文件(例如 “foo.obj”)來構(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。這可能看起來微不足道,但是在任何項(xiàng)目里,除了那種微型軟件項(xiàng)目,這都是相當(dāng)重要的。我從事的是相對(duì)簡(jiǎn)單的軟件項(xiàng)目,它只有數(shù)十個(gè)源文件,但是全部編譯需要5分鐘。有合適的構(gòu)建工具正確的捕獲依賴關(guān)系,根據(jù)你做的修改,讓你只增量編譯那些有需要的文件。
make有很多短板。別的不說,makefile的語法很含糊,你在編譯時(shí)需要做特殊處理的地方,它難以處理這種特殊情況,你不去為此寫一些單獨(dú)的腳本是不行的。
對(duì)于Java程序而言,標(biāo)準(zhǔn)工具是ant和maven。它們讓事情更容易,還可以用來構(gòu)建Java程序之外的其他系統(tǒng),但是在一般開發(fā)環(huán)境下不經(jīng)常用到。
還有很多其他的構(gòu)建工具。過去的幾年里,我開始將我的偏好從陳述性語法(如makefile和ant腳本)的工具轉(zhuǎn)移到更加多用途的語法的工具上。這樣的想法是因?yàn)閷?duì)于大多數(shù)簡(jiǎn)單的任務(wù),你可以描述得非常簡(jiǎn)明,但是如果你想要做點(diǎn)復(fù)雜的事,你擁有多用途編程語言的全部威力。(舉個(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)行為,讓它做你真正要做的。最近我剛開始用waf。我發(fā)現(xiàn)更容易讓它做我需要做的,因此如果你有一個(gè)新項(xiàng)目,我推薦你看看waf,盡管我希望它有一個(gè)不這么神秘的名字。
5. 腳本工具 有時(shí)候你需要快速組裝一段軟件來做某件事。通常很難用C或者C++來實(shí)現(xiàn),因?yàn)槟惚仨毣ㄙM(fèi)精力寫代碼來解析字符串,或者讀文件,或者任何別的什么。然后你得為每個(gè)計(jì)算機(jī)平臺(tái)把這個(gè)C/C++程序編譯成可執(zhí)行文件。啊…
更好的解決方案是使用腳本語言。它們通常都是解釋性的計(jì)算機(jī)語言,解釋器提供了大多數(shù)操作系統(tǒng)的版本。所以如果你寫了一個(gè)腳本,應(yīng)該可以用在不同的操作系統(tǒng)上。
現(xiàn)代腳本語言的例子是Python,Ruby和Groovy。(我更喜歡Python。)早期的腳本語言包括awk和Perl。我有一些避免使用Perl的理由:它的語法非常奇特和神秘,不同的類型有不同的前綴($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是一種古老的文本處理腳本語言,曾經(jīng)有它的地位,但是在某些角度和Perl一樣糟糕,都鼓勵(lì)不好的編程實(shí)踐。
不管你喜歡哪個(gè),我會(huì)強(qiáng)烈建議你用一種能夠在調(diào)試器里測(cè)試的語言。我用awk的經(jīng)歷很糟糕,調(diào)試程序的時(shí)候我不得不放一些打印語句在里面,告訴我發(fā)生什么了。用Python就很開心,因?yàn)橛幸粋€(gè)很好的Eclipse的插件叫做pydev。用它你可以在腳本任何地方設(shè)置斷點(diǎn)和單步調(diào)試。
我時(shí)不時(shí)也用一個(gè)叫做JSDB的程序。JSDB是一個(gè)獨(dú)立的JavaScript的外殼程序,用創(chuàng)立于Firefox網(wǎng)頁瀏覽器的SpiderMonkey JavaScript引擎構(gòu)建。它還有一些訪問文件,數(shù)據(jù)庫,網(wǎng)絡(luò)流和串行端口等等的工具類。它沒有解釋性的調(diào)試器(盡管有一個(gè)奇怪的調(diào)試器。該調(diào)試器有一種即時(shí)網(wǎng)絡(luò)服務(wù)器,你可以把你的網(wǎng)頁瀏覽器指向你計(jì)算機(jī)上的一個(gè)端口,它就可以讓你調(diào)試程序),并且有時(shí)候有一點(diǎn)詭異,但是它比起Python更輕量級(jí),對(duì)于有些事情,我發(fā)現(xiàn)我能更快著手。
我在這節(jié)所提到的所有腳本語言都是免費(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ù)千美元,不過它們提供了大量的功能。MATLAB擅長于數(shù)據(jù)分析,Mathematica擅長符號(hào)代數(shù)。MathCAD介于兩者之間,是所見即所得的處理方式:用來得到你在MathCAD的工作表(worksheet)里所見到的輸出的每個(gè)運(yùn)算,在該工作表上你都能看到。因此它一目了然。如果你給誰打印這個(gè)工作表,他/她能看到要去復(fù)制你的工作成果所需的所有計(jì)算步驟。例如和Excel工作表比較,你看到的是運(yùn)算的結(jié)果。要想看的運(yùn)算步驟,你需要到每一個(gè)單元格里去看是否有公式。
MATLAB也有一些“山寨”免費(fèi)軟件:SciLab,Octave和PyLab。它們都提供了MATLAB提供的基本功能,語法也要么一樣,要么很相似。但是沒有一個(gè)像MATLAB那樣優(yōu)美和專業(yè)。PyLab的額外的賣點(diǎn)是用 Python語言實(shí)現(xiàn),還有為Python提供了科學(xué)計(jì)算和作圖的庫。因此如果你懂Python,你可以利用這些知識(shí)去進(jìn)行科學(xué)計(jì)算。
我對(duì)MATLAB是愛恨交加的關(guān)系。一方面,它是如此美麗的軟件,讓你做數(shù)值分析,可視化,還有額外的包羅萬象的工具箱(信號(hào)處理,濾波器設(shè)計(jì),控制回路仿真,等等)。另一方面,它不便宜,在MathWorks里的那些出售MATLAB的人們?cè)陟乓麄冏钚碌墓δ軙r(shí)樂呵呵的好像價(jià)格是不需要考慮的。
關(guān)于數(shù)值分析工具,我有最后一句懇求的咆哮體
不要用Excel進(jìn)行數(shù)值分析?。?!
1996年我開始工作時(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è)頁面上做多個(gè)圖,并對(duì)齊坐標(biāo)軸時(shí)我就這么做過。但是接著你會(huì)發(fā)現(xiàn)你所知道的對(duì)象模型既變態(tài)又古怪,可能不能讓你做你想要做的。然后你便開始對(duì)住在華盛頓雷德蒙的某些人起了壞念頭。在Excel里如果你遇到了要寫宏代碼的時(shí)候,停下來想想你的情況。那些你投入在讓Excel做你要做的事情的時(shí)間,你可以花在學(xué)習(xí)其他能更容易繪圖和分析數(shù)據(jù)的,用于科研而不是商業(yè)的軟件上。記住,在微軟的那些人試圖制作能銷售和上市的軟件,人們用這樣的軟件可以解決他們的問題。而作為工程師,我們得到的不管什么樣的功能剛好是在給自己增加困難。
7. 文檔工具 你經(jīng)常會(huì)和其他人交流你的想法,有很多不同類型的軟件可以幫助你做這個(gè)。是的,有不免費(fèi)的微軟程序像用于流程圖/繪圖的Visio,寫文檔的Word,還有演講用的PowerPoint。但是有時(shí)候你想要免費(fèi)的或者更專門的東西,用于特殊類型的文檔。
8. 終端和通訊軟件:當(dāng)你需要經(jīng)由串口通訊時(shí),到了該用終端軟件的時(shí)候了。在網(wǎng)頁瀏覽器之前,這更加常見。哪個(gè)軟件好?朋友不會(huì)讓朋友使用綁定Windows的超級(jí)終端版本——它不是那么健壯——而且微軟最終發(fā)布Vista時(shí)不再捎上它了。我最喜歡的是PuTTYtel和TeraTerm Pro。
其他通訊軟件處理FTP和其安全變種SFTP以及SCP。照我看Cyberduck無疑是勝者——非常易用,最開始只在Mac上,現(xiàn)在OSX和Windows上都有。(此外,你如何能不喜歡上一個(gè)將橡皮鴨作為logo的軟件呢)
9. 軟件質(zhì)量保證(QA)工具:如果你寫軟件,并認(rèn)為自己的軟件沒有bug的,那是自己騙自己。有很多軟件工具可以幫你在bug找你之前先找到它們。好了,此處我不得不承認(rèn)我還只是個(gè)新手,我還不是特別熟悉這塊有些什么。(太不好意思了?。┑俏掖_實(shí)足夠了解該建議看什么地方。一些主要的類別如下:
10. 基本命令行應(yīng)用工具
下面的很多程序都是UNIX的命令行應(yīng)用工具,它們出生在還沒有圖形用戶界面,事情都需要靠手動(dòng)去完成的日子。除非現(xiàn)在圖形用戶界面有革命性的改進(jìn),否則通過命令行,你能做的總是更多些,因?yàn)槟阃ㄟ^腳本可以完成更多種事情的組合。如果你運(yùn)行的是OSX或者Linux,你已經(jīng)有這些工具了。如果你運(yùn)行的是Windows,你可以去 http://unxutils.sourceforge.net/ 或 http://sourceforge.net/projects/unxutils/下載能運(yùn)行在你的操作系統(tǒng)上的二進(jìn)制版本。
someprog | tee logfile)讓你復(fù)制那個(gè)命令的輸出到文件,并同時(shí)在終端打印輸出。which foo.exe英文原文:Jason Sachs
譯文鏈接:http://blog.jobbole.com/39783/

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流