樱桃视频app

為什么優秀的程序員喜歡命令行?

2020-08-19

要給(gei)優秀的(de)程序(xu)員下一個明確的(de)定義無疑是一件非常(chang)困難的(de)事情。擅長抽象思維、動(dong)手能力強、追求效率(lv)、喜歡自動(dong)化(hua)、愿意(yi)持續學(xue)習、對代碼(ma)質量有很高的(de)追求等(deng)等(deng),這些維度都有其合理性(xing),不過又都略顯(xian)抽象和主觀。

我對于一個程序員是否優秀,也有自己的標準,那就是TA對命令行的熟悉/喜愛程度。這個特點可以很好的看出TA是否是一個優秀的(或者潛在優秀的)程(cheng)序員(yuan)。我周圍就有很多非常(chang)牛的程(cheng)序員(yuan),無(wu)一例外都非常(chang)擅長在命令行中工作。那什么叫熟(shu)悉命令行呢(ni)?簡單來說,就是90%的日常(chang)工作內(nei)容可(ke)以(yi)在命令行完成(cheng)。

當然,喜歡/習慣使用命令行可能只是表象,其背后包含的實質才是優秀的程序員之所以優秀的原因。

自動化

Perl語言的發(fa)明(ming)者Larry Wall有一句名言:

The three chief virtues of a programmer are: Laziness, Impatience and Hubris. – Larry Wall

懶惰(Laziness)這個特點位于程序員的三大美德之首:唯有懶惰才會驅動程序員盡可能的將日常工作自動化起來,解放自己的雙手,節省自己的時間。相比較而言,不得不說,GUI應用天然就是為了讓自動化變(bian)得(de)困難的一種(zhong)設計(此處并(bing)非(fei)貶義,GUI有著自己完全不同(tong)的目標(biao)群體)。

GUI更強調的(de)是與人類的(de)直接(jie)交互:通過(guo)視覺手段將(jiang)信(xin)息以多(duo)層(ceng)次的(de)方式(shi)呈(cheng)現,使用視覺元素(su)進行(xing)指引,最后系統在后臺進行(xing)實際(ji)的(de)處理,并將(jiang)最終結果以視覺手段展現出來。

這種更強調交互過程的設計初衷使得自動化變得(de)非常困難。另一方面,由于GUI是為交互而設計(ji)的(de),它的(de)響應(ying)(ying)就(jiu)不能(neng)太(tai)快,至少要(yao)留給操(cao)作者反應(ying)(ying)時間(甚至有(you)些用(yong)戶(hu)操(cao)作需(xu)要(yao)人為的(de)加入一些延遲,以提升用(yong)戶(hu)體驗(yan))。

程序員的日常工作

程序員除了寫代碼(ma)之外,還有(you)很(hen)多事(shi)情要做,比如自動化測試(shi)、基礎設施的(de)配置和管理、持續集成(cheng)/持續發布環境,甚至有(you)些(xie)團隊(dui)還需要做一(yi)些(xie)與運維相(xiang)關的(de)事(shi)情(線上問(wen)題監(jian)控(kong),環境監(jian)控(kong)等)。

  • 開發/測試

  • 基礎設施管理

  • 持續集成/持續發布

  • 運維(監控)工作

  • 娛樂

而這一系(xi)列的(de)工(gong)作背(bei)后,都隱含了一個自(zi)(zi)動化(hua)的(de)需求(qiu)。在做上述工(gong)作時,優(you)秀的(de)程序員會努(nu)力將其自(zi)(zi)動化(hua),如果(guo)有工(gong)具就(jiu)使用工(gong)具;如果(guo)沒有,就(jiu)開發一個新的(de)工(gong)具。這種(zhong)努(nu)力讓一切(qie)都盡可能(neng)自(zi)(zi)動化(hua)起來的(de)哲學起源于UNIX世(shi)界。

而UNIX哲學的實際體現則是通過命令行來完成的。

Where there is a shell, there is a way.

UNIX編程哲學

關于UNIX哲學,其實坊間(jian)有(you)多個版本,這里有(you)一個比較。雖然有(you)不(bu)同的(de)(de)版本,但是有(you)很多一致(zhi)的(de)(de)地方:

  1. 小即是美

  2. 讓程序只做好一件事

  3. 盡(jin)可能早地創建原型(xing)(然后逐(zhu)步演(yan)進)

  4. 數據應該保(bao)存為文本文件

  5. 避免使用可定制(zhi)性低下的用戶界面

審視這些條目,我們會發現它們事實上促成了自動化一切的可能性。這里列舉一些小的例子,我們來看看命令行工具是如(ru)何通過(guo)應用這些哲學來簡化工作(zuo)、提高效率的。一旦你(ni)熟練掌握這些技能,就再也(ye)(ye)無法離開它(ta),也(ye)(ye)再也(ye)(ye)忍受不了(le)低效而復雜(za)的各種GUI工具了(le)。

命令行如何提升效率

一個高階計算器

在我(wo)的(de)編程(cheng)生涯早期,讀(du)過的(de)最為振奮的(de)一本(ben)書(shu)是,和其他(ta)基本(ben)UNIX世界的(de)大部(bu)頭比(bi)(bi)起來,這本(ben)書(shu)其實還是比(bi)(bi)較小眾(zhong)的(de)。我(wo)讀(du)大二的(de)時候這本(ben)書(shu)已經出(chu)版(ban)了差不(bu)多22年(nian)(中文(wen)版(ban)也已經有7年(nian)了),有一些內容已經過時了,比(bi)(bi)如(ru)沒有返(fan)回值的(de)main函(han)數(shu)、外置的(de)參數(shu)列表等等,不(bu)過在學習到HOC(High Order Calculator)的(de)全(quan)部(bu)開(kai)發過程(cheng)時,我(wo)依然(ran)被(bei)深深的(de)震撼到了。

簡而言之,這個HOC語(yu)言的(de)開發過程(cheng)需要(yao)這樣幾個組件:

  • 詞法分析器lex

  • 語法分析器yacc

  • 標準數學(xue)庫stdlib

另外(wai)還有(you)一(yi)些自定(ding)義的(de)函數等,最后通過make連(lian)接在(zai)一(yi)起。我跟著(zhu)書上(shang)的(de)講(jiang)解,對(dui)著(zhu)書把所(suo)有(you)代碼(ma)都(dou)敲了(le)一(yi)遍。所(suo)有(you)的(de)操作都(dou)是在(zai)一(yi)臺很老的(de)IBM的(de)ThinkPad T20上(shang)完(wan)成的(de),而且(qie)全(quan)部(bu)都(dou)在(zai)命(ming)令行中進行(當然(ran),還在(zai)命(ming)令行里聽(ting)著(zhu)歌)。

這也是我第一(yi)次(ci)徹底被UNIX的哲學(xue)所折服的體驗:

  • 每個工具只做且(qie)做好一件事

  • 工具可以協作起來

  • 一切面向文本

下面是書中的Makefile腳本,通過簡單的配置,就將一些各司其職的(de)小(xiao)工具(ju)協作(zuo)起來,完成一(yi)個編(bian)(bian)程語言程序的(de)預編(bian)(bian)譯、編(bian)(bian)譯、鏈(lian)接、二(er)進制生(sheng)成的(de)動作(zuo)。

YFLAGS = dOBJS = hoc.o code.o init.o math.o symbol.ohoc5:    $(OBJS)
    cc $(OBJS) lm o hoc5hoc.o code.o init.o symbol.o: hoc.hcode.o init.o symbol.o: x.tab.hx.tab.h: y.tab.h
    cmp s x.tab.h y.tab.h || cp y.tab.h x.tab.hpr:    hoc.y hoc.h code.c init.c math.c symbol.c
    @pr $?
    @touch prclean:
    rm f $(OBJS) [xy].tab.[ch]

雖然(ran)現在來(lai)看(kan),這本書(shu)的(de)很多內(nei)容已(yi)經(jing)過期(特(te)別(bie)是離(li)它(ta)第一(yi)次出(chu)版已(yi)經(jing)過去了近30年),有興(xing)趣的(de)朋友可(ke)以讀(du)一(yi)讀(du)。這里有一(yi)個的(de)小(xiao)例(li)子,有興(xing)趣的(de)朋友可(ke)以看(kan)看(kan)。

當然(ran),如果你使用現在最先進的IDE(典型的GUI工具),其背后做的事情(qing)也是(shi)同樣(yang)的原理:生成一個Makefile,然(ran)后在幕后調用它。

基礎設施自動化

開(kai)發過(guo)程(cheng)中,工程(cheng)師還(huan)需(xu)要關注的(de)(de)一個問題是:軟(ruan)件運行的(de)(de)環境。我在(zai)(zai)學生(sheng)時代剛開(kai)始學習Linux的(de)(de)時候,會在(zai)(zai)Windows機器上裝(zhuang)一個虛(xu)擬機軟(ruan)件VMWare,然后在(zai)(zai)VMWare中安(an)裝(zhuang)一個Redhat Linux 9。

這(zhe)樣(yang)當(dang)我不小心把Linux玩壞了之(zhi)后,只需要(yao)(yao)重裝一下就(jiu)行了,不影響(xiang)我的(de)其(qi)他數據(比(bi)如課程(cheng)作業、文檔之(zhi)類)。不過每次重裝也挺(ting)麻煩,需要(yao)(yao)找到(dao)iso鏡像文件,再掛載到(dao)本(ben)地(di)的(de)虛擬光驅上,然后再用VMWare來安裝。

而且這些動(dong)(dong)作都是(shi)在(zai)(zai)GUI里完(wan)成的,每(mei)次(ci)都要做很多(duo)重復的事(shi)情:找鏡(jing)像(xiang)文(wen)件(jian),使用虛擬(ni)光驅(qu)軟件(jian)掛載(zai),啟動(dong)(dong)VMWare,安(an)裝Linux,配(pei)置(zhi)(zhi)個人偏好(hao)(hao),配(pei)置(zhi)(zhi)用戶名(ming)/密碼(ma)等等。熟練之后,我可(ke)以在(zai)(zai)30 - 60分(fen)鐘內安(an)裝和(he)配(pei)置(zhi)(zhi)好(hao)(hao)一個新的環(huan)境。

相關新聞