樱桃视频app

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

2020-08-19

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

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

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

自動化

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

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

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

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

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

程序員的日常工作

程序員(yuan)除了(le)寫代碼(ma)之外,還有(you)很多事情要做,比如自(zi)動化測試、基礎設施的配(pei)置和管理、持(chi)(chi)續(xu)(xu)集(ji)成/持(chi)(chi)續(xu)(xu)發布環(huan)境,甚(shen)至有(you)些(xie)團隊還需要做一些(xie)與運維相關的事情(線上問題(ti)監控,環(huan)境監控等)。

  • 開發/測試(shi)

  • 基礎設施管理

  • 持續(xu)集成/持續(xu)發布

  • 運維(監控)工作(zuo)

  • 娛樂

而這(zhe)一(yi)系列的(de)(de)工(gong)(gong)作背(bei)后,都隱含了一(yi)個(ge)自動(dong)(dong)化(hua)(hua)的(de)(de)需求。在做(zuo)上述(shu)工(gong)(gong)作時,優秀的(de)(de)程序員會努力將其自動(dong)(dong)化(hua)(hua),如(ru)果有工(gong)(gong)具(ju)就使用工(gong)(gong)具(ju);如(ru)果沒有,就開發一(yi)個(ge)新的(de)(de)工(gong)(gong)具(ju)。這(zhe)種努力讓一(yi)切都盡可能自動(dong)(dong)化(hua)(hua)起(qi)來的(de)(de)哲(zhe)學起(qi)源于UNIX世(shi)界。

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

Where there is a shell, there is a way.

UNIX編程哲學

關于(yu)UNIX哲(zhe)學,其實(shi)坊間有多(duo)個版本(ben),這里有一個比較。雖然有不同的版本(ben),但是有很(hen)多(duo)一致的地(di)方:

  1. 小(xiao)即是(shi)美

  2. 讓(rang)程序只做好一件事

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

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

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

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

命令行如何提升效率

一個高階計算器

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

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

  • 詞法分析(xi)器lex

  • 語法分(fen)析器(qi)yacc

  • 標準數學庫stdlib

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

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

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

  • 工具可以協作起(qi)來

  • 一切面向文本

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

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]

雖然現在來(lai)看,這(zhe)(zhe)本書的(de)(de)很多內(nei)容已經(jing)過期(特別是離(li)它第(di)一次(ci)出版(ban)已經(jing)過去了近30年),有(you)興趣的(de)(de)朋(peng)友可以讀一讀。這(zhe)(zhe)里有(you)一個的(de)(de)小例子,有(you)興趣的(de)(de)朋(peng)友可以看看。

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

基礎設施自動化

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

這樣當我不(bu)小心把Linux玩壞了(le)之后,只需要重裝(zhuang)(zhuang)一下(xia)就行了(le),不(bu)影響我的(de)其他數(shu)據(比如課(ke)程(cheng)作(zuo)業、文(wen)檔之類)。不(bu)過每次重裝(zhuang)(zhuang)也挺麻煩,需要找到iso鏡像(xiang)文(wen)件,再(zai)掛載到本地的(de)虛擬光驅上(shang),然后再(zai)用VMWare來安裝(zhuang)(zhuang)。

而且這(zhe)些動作都是在GUI里(li)完成的(de),每次都要做很多(duo)重復的(de)事情:找(zhao)鏡像文(wen)件(jian),使用虛(xu)擬(ni)光驅軟件(jian)掛載,啟動VMWare,安裝Linux,配(pei)(pei)置(zhi)個人偏好(hao),配(pei)(pei)置(zhi)用戶(hu)名/密(mi)碼等等。熟練(lian)之(zhi)后,我(wo)可以在30 - 60分鐘內安裝和配(pei)(pei)置(zhi)好(hao)一個新的(de)環境(jing)。

相關新聞