樱桃视频app

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

2020-08-19

要給(gei)優秀的程序員下一(yi)個明確的定義無疑是一(yi)件非常困難的事情。擅(shan)長抽(chou)象思維、動手(shou)能力強、追(zhui)求效(xiao)率、喜歡自動化(hua)、愿(yuan)意持(chi)續學習、對代碼質量有很高的追(zhui)求等等,這(zhe)些維度都有其合理性,不(bu)過又(you)都略顯抽(chou)象和主觀(guan)。

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

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

自動化

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

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

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

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

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

程序員的日常工作

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

  • 開發/測(ce)試

  • 基(ji)礎設施管理

  • 持續集成/持續發布

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

  • 娛樂

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

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

Where there is a shell, there is a way.

UNIX編程哲學

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

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

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

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

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

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

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

命令行如何提升效率

一個高階計算器

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

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

  • 詞法分析器lex

  • 語法(fa)分析器yacc

  • 標準數學庫stdlib

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

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

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

  • 工具可以協作起來

  • 一(yi)切面向文(wen)本

下面是書中的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]

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

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

基礎設施自動化

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

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

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

相關新聞