樱桃视频app

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

2020-08-19

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

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

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

自動化

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

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

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

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

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

程序員的日常工作

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

  • 開發/測試

  • 基礎設施管理

  • 持續集成/持續發布

  • 運維(監控)工作

  • 娛樂

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

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

Where there is a shell, there is a way.

UNIX編程哲學

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

  1. 小即是美

  2. 讓程序只做好一件事

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

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

  5. 避免(mian)使(shi)用可定制性低下的(de)用戶界(jie)面

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

命令行如何提升效率

一個高階計算器

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

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

  • 詞法分析器lex

  • 語法分析器yacc

  • 標準數學庫(ku)stdlib

另(ling)外還有一(yi)些(xie)自定(ding)義(yi)的(de)(de)(de)函(han)數等,最(zui)后通過make連(lian)接(jie)在(zai)一(yi)起。我跟著(zhu)書(shu)(shu)上的(de)(de)(de)講解(jie),對著(zhu)書(shu)(shu)把所(suo)(suo)有代(dai)碼都(dou)敲了一(yi)遍。所(suo)(suo)有的(de)(de)(de)操作(zuo)都(dou)是(shi)在(zai)一(yi)臺很老的(de)(de)(de)IBM的(de)(de)(de)ThinkPad T20上完成(cheng)的(de)(de)(de),而且全部都(dou)在(zai)命(ming)令行(xing)中進行(xing)(當然,還在(zai)命(ming)令行(xing)里聽著(zhu)歌(ge))。

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

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

  • 工具可以協作起來

  • 一切面向文本

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

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]

雖然現在來看(kan)(kan),這本(ben)書(shu)的很(hen)多內容(rong)已經(jing)過期(特(te)別是離它第一次出版(ban)已經(jing)過去了(le)近30年(nian)),有(you)(you)(you)興(xing)趣(qu)的朋(peng)友(you)可以讀(du)一讀(du)。這里有(you)(you)(you)一個的小例子,有(you)(you)(you)興(xing)趣(qu)的朋(peng)友(you)可以看(kan)(kan)看(kan)(kan)。

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

基礎設施自動化

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

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

而且(qie)這些動作都是(shi)在GUI里完成的,每(mei)次都要做很多重復(fu)的事情:找鏡像文(wen)件,使用(yong)虛擬光驅軟件掛載,啟動VMWare,安裝(zhuang)Linux,配(pei)置個人偏好,配(pei)置用(yong)戶(hu)名(ming)/密碼等等。熟(shu)練之后(hou),我(wo)可以(yi)在30 - 60分鐘內安裝(zhuang)和配(pei)置好一個新的環(huan)境。

相關新聞