樱桃视频app下载

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

2020-08-19

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

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

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

自動化

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

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

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

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

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

程序員的日常工作

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

  • 開發/測試

  • 基礎設施管理

  • 持續集成/持續發布

  • 運維(監控)工作

  • 娛樂

而這一(yi)系列的工(gong)作背后,都隱(yin)含(han)了一(yi)個自(zi)動(dong)化的需(xu)求。在做上(shang)述工(gong)作時,優秀的程序員會努力(li)將其自(zi)動(dong)化,如果有工(gong)具(ju)就(jiu)使用工(gong)具(ju);如果沒有,就(jiu)開發一(yi)個新(xin)的工(gong)具(ju)。這種(zhong)努力(li)讓(rang)一(yi)切都盡可能(neng)自(zi)動(dong)化起來(lai)的哲學起源于(yu)UNIX世界。

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

Where there is a shell, there is a way.

UNIX編程哲學

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

  1. 小即是美

  2. 讓程序只做好一件事

  3. 盡(jin)可能早地(di)創建(jian)原型(xing)(然(ran)后逐(zhu)步演進(jin))

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

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

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

命令行如何提升效率

一個高階計算器

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

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

  • 詞法分析器lex

  • 語法分析器yacc

  • 標準數學庫stdlib

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

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

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

  • 工具可以協作起來

  • 一切面向文本

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

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

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

基礎設施自動化

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

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

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

相關新聞