櫻桃視頻app下載

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

2020-08-19

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

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

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

自動化

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

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

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

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

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

程序員的日常工作

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

  • 開發/測試(shi)

  • 基礎設施管(guan)理

  • 持續集成/持續發布

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

  • 娛樂

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

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

Where there is a shell, there is a way.

UNIX編程哲學

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

  1. 小即(ji)是美

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

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

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

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

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

命令行如何提升效率

一個高階計算器

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

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

  • 詞法分析(xi)器(qi)lex

  • 語法分(fen)析器yacc

  • 標準數學庫stdlib

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

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

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

  • 工具可以協作起來

  • 一切面向文本(ben)

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

雖然(ran)現(xian)在(zai)來看,這本書的很多內(nei)容(rong)已(yi)(yi)經(jing)過期(特別是離它(ta)第一次出版已(yi)(yi)經(jing)過去了近30年),有(you)興(xing)趣的朋友(you)可以讀一讀。這里有(you)一個的小例(li)子,有(you)興(xing)趣的朋友(you)可以看看。

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

基礎設施自動化

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

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

而且這些(xie)動(dong)作都是在GUI里(li)完成的(de),每次都要做(zuo)很(hen)多(duo)重復(fu)的(de)事情:找(zhao)鏡像(xiang)文件,使(shi)用虛擬光(guang)驅軟(ruan)件掛(gua)載(zai),啟動(dong)VMWare,安(an)裝Linux,配(pei)置個人(ren)偏(pian)好,配(pei)置用戶名(ming)/密(mi)碼等(deng)等(deng)。熟練之后(hou),我可(ke)以在30 - 60分鐘內安(an)裝和配(pei)置好一個新(xin)的(de)環境。

相關新聞