樱桃视频app

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

2020-08-19

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

我對于一個程序員是否優秀,也有自己的標準,那就是TA對命令行的熟悉/喜愛程度。這個特點可以很好的看出TA是否是一個優秀的(或者潛(qian)在(zai)(zai)優(you)秀的(de)(de))程序員(yuan)。我(wo)周(zhou)圍就(jiu)有很多非(fei)常(chang)牛的(de)(de)程序員(yuan),無一例(li)外都非(fei)常(chang)擅(shan)長在(zai)(zai)命(ming)令行(xing)中工作(zuo)。那什么叫熟(shu)悉命(ming)令行(xing)呢(ni)?簡單(dan)來說(shuo),就(jiu)是90%的(de)(de)日常(chang)工作(zuo)內容可以在(zai)(zai)命(ming)令行(xing)完(wan)成。

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

自動化

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

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

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

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

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

程序員的日常工作

程序員除了寫代碼之外,還(huan)有很多事情(qing)要做,比如自動化測試(shi)、基礎設(she)施的(de)配(pei)置和(he)管理(li)、持續集成(cheng)/持續發布環境,甚(shen)至(zhi)有些團隊還(huan)需要做一些與(yu)運維相關的(de)事情(qing)(線上(shang)問(wen)題監控(kong),環境監控(kong)等(deng))。

  • 開發/測試

  • 基礎設施管理

  • 持續集成/持續發布

  • 運維(監控)工作

  • 娛樂

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

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

Where there is a shell, there is a way.

UNIX編程哲學

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

  1. 小即是美

  2. 讓程序只做好一件事

  3. 盡可能(neng)早地創建原型(然后逐步演進)

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

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

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

命令行如何提升效率

一個高階計算器

在我的(de)編(bian)程(cheng)生涯(ya)早期,讀(du)(du)過(guo)(guo)的(de)最為振奮的(de)一本(ben)書(shu)(shu)是(shi),和(he)其他基本(ben)UNIX世界(jie)的(de)大(da)部頭比起來,這本(ben)書(shu)(shu)其實還是(shi)比較小(xiao)眾的(de)。我讀(du)(du)大(da)二(er)的(de)時候這本(ben)書(shu)(shu)已經(jing)出版(ban)了差不多22年(中文版(ban)也已經(jing)有(you)(you)7年了),有(you)(you)一些(xie)內容已經(jing)過(guo)(guo)時了,比如沒有(you)(you)返回值的(de)main函數、外置的(de)參數列表(biao)等(deng)等(deng),不過(guo)(guo)在學(xue)習到HOC(High Order Calculator)的(de)全(quan)部開發過(guo)(guo)程(cheng)時,我依然被深深的(de)震撼到了。

簡而言(yan)(yan)之(zhi),這(zhe)個HOC語言(yan)(yan)的開發過程需要這(zhe)樣幾個組(zu)件:

  • 詞法分析器lex

  • 語法分析器yacc

  • 標準數學庫stdlib

另外(wai)還有一(yi)些自定義的(de)函數(shu)等,最后通過make連接在(zai)一(yi)起。我跟著書上(shang)(shang)的(de)講解,對著書把所有代碼都敲了一(yi)遍。所有的(de)操作都是在(zai)一(yi)臺很老的(de)IBM的(de)ThinkPad T20上(shang)(shang)完成(cheng)的(de),而(er)且(qie)全部都在(zai)命令行中進行(當然,還在(zai)命令行里聽著歌(ge))。

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

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

  • 工具可以協作起來

  • 一切面向文本

下面是書中的Makefile腳本,通過簡單的配置,就將一些各司其職的小工具協(xie)作起來(lai),完(wan)成一個(ge)編程語言程序的預編譯、編譯、鏈接(jie)、二進制生成的動(dong)作。

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)現在來看,這本書的(de)(de)很多內容(rong)已經過(guo)期(特別是離(li)它第一(yi)次(ci)出版已經過(guo)去(qu)了(le)近30年),有興(xing)趣的(de)(de)朋友可以(yi)(yi)讀(du)一(yi)讀(du)。這里(li)有一(yi)個的(de)(de)小例(li)子,有興(xing)趣的(de)(de)朋友可以(yi)(yi)看看。

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

基礎設施自動化

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

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

而(er)且這些動作都是在GUI里完成的,每次(ci)都要做很多重復(fu)的事情:找鏡像文件,使用虛(xu)擬(ni)光驅軟(ruan)件掛載,啟(qi)動VMWare,安裝Linux,配置個人偏好,配置用戶名/密碼等(deng)(deng)等(deng)(deng)。熟練之(zhi)后,我可以在30 - 60分鐘內安裝和配置好一個新(xin)的環境。

相關新聞