免费黄色网站爱啊国产精品_一级毛片久久18_亚洲成人免费在线播_看中文欧美性爱大片_天堂久久天堂AV色综合_国产无码性生活中文字幕_av影片在线观看免费韩国_黄瓜黄色视频app_免费无码高潮又爽又刺激_在线观看欧美黄色网站

為什么優(yōu)秀的程序員喜歡命令行?

2019-08-19

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

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

當(dāng)然,喜歡/習(xí)慣使用命令行可能只是表象,其背后包含的實質(zhì)才是優(yōu)秀的程序員之所以優(yōu)秀的原因。

自動化

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

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

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

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

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

程序員的日常工作

程序員除了寫代碼之外,還有很多事情要做,比如自動化測試、基礎(chǔ)設(shè)施的配置和管理、持續(xù)集成/持續(xù)發(fā)布環(huán)境,甚至有些團隊還需要做一些與運維相關(guān)的事情(線上問題監(jiān)控,環(huán)境監(jiān)控等)。

  • 開發(fā)/測試

  • 基礎(chǔ)設(shè)施管理

  • 持續(xù)集成/持續(xù)發(fā)布

  • 運維(監(jiān)控)工作

  • 娛樂

而這一系列的工作背后,都隱含了一個自動化的需求。在做上述工作時,優(yōu)秀的程序員會努力將其自動化,如果有工具就使用工具;如果沒有,就開發(fā)一個新的工具。這種努力讓一切都盡可能自動化起來的哲學(xué)起源于UNIX世界。

而UNIX哲學(xué)的實際體現(xiàn)則是通過命令行來完成的。

Where there is a shell, there is a way.

UNIX編程哲學(xué)

關(guān)于UNIX哲學(xué),其實坊間有多個版本,這里有一個比較詳細(xì)的清單。雖然有不同的版本,但是有很多一致的地方:

  1. 小即是美

  2. 讓程序只做好一件事

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

  4. 數(shù)據(jù)應(yīng)該保存為文本文件

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

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

命令行如何提升效率

一個高階計算器

在我的編程生涯早期,讀過的最為振奮的一本書是《UNIX編程環(huán)境》,和其他基本UNIX世界的大部頭比起來,這本書其實還是比較小眾的。我讀大二的時候這本書已經(jīng)出版了差不多22年(中文版也已經(jīng)有7年了),有一些內(nèi)容已經(jīng)過時了,比如沒有返回值的main函數(shù)、外置的參數(shù)列表等等,不過在學(xué)習(xí)到HOC(High Order Calculator)的全部開發(fā)過程時,我依然被深深的震撼到了。

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

  • 詞法分析器lex

  • 語法分析器yacc

  • 標(biāo)準(zhǔn)數(shù)學(xué)庫stdlib

另外還有一些自定義的函數(shù)等,最后通過make連接在一起。我跟著書上的講解,對著書把所有代碼都敲了一遍。所有的操作都是在一臺很老的IBM的ThinkPad T20上完成的,而且全部都在命令行中進行(當(dāng)然,還在命令行里聽著歌)。

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

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

  • 工具可以協(xié)作起來

  • 一切面向文本

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

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]

雖然現(xiàn)在來看,這本書的很多內(nèi)容已經(jīng)過期(特別是離它第一次出版已經(jīng)過去了近30年),有興趣的朋友可以讀一讀。這里有一個Lex/Yacc的小例子的小例子,有興趣的朋友可以看看。

當(dāng)然,如果你使用現(xiàn)在最先進的IDE(典型的GUI工具),其背后做的事情也是同樣的原理:生成一個Makefile,然后在幕后調(diào)用它。

基礎(chǔ)設(shè)施自動化

開發(fā)過程中,工程師還需要關(guān)注的一個問題是:軟件運行的環(huán)境。我在學(xué)生時代剛開始學(xué)習(xí)Linux的時候,會在Windows機器上裝一個虛擬機軟件VMWare,然后在VMWare中安裝一個Redhat Linux 9。

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

而且這些動作都是在GUI里完成的,每次都要做很多重復(fù)的事情:找鏡像文件,使用虛擬光驅(qū)軟件掛載,啟動VMWare,安裝Linux,配置個人偏好,配置用戶名/密碼等等。熟練之后,我可以在30 - 60分鐘內(nèi)安裝和配置好一個新的環(huán)境。

相關(guān)新聞