樱桃视频app

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

2020-08-19

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

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

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

自動化

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

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

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

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

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

程序員的日常工作

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

  • 開發/測試

  • 基礎(chu)設(she)施管理

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

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

  • 娛樂

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

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

Where there is a shell, there is a way.

UNIX編程哲學

關于UNIX哲學,其(qi)實(shi)坊間有(you)多個版(ban)本(ben),這(zhe)里有(you)一個比較(jiao)。雖然有(you)不(bu)同的版(ban)本(ben),但是有(you)很多一致的地方(fang):

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

  2. 讓程序只做好一件事

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

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

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

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

命令行如何提升效率

一個高階計算器

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

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

  • 詞法分(fen)析器lex

  • 語法分析器(qi)yacc

  • 標準數(shu)學(xue)庫stdlib

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

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

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

  • 工具(ju)可以協(xie)作起來

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

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

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

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

基礎設施自動化

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

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

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

相關新聞