沒錯,沒那個現成的計算器好用,前者開箱即用,算賬全靠它;後者……對不懂計算機的你來說,它和一塊磚頭沒多大區別——還不如磚頭好用呢,起碼墊腳啦拍人啦拿來就用。這樹莓派啊,吃不能吃喝不能喝梳頭髮都別彆扭扭不好用……
但是樹莓派有無限可能。
對工具使用者來說,他總是有兩個選擇方向:方向一是只能做一樣的專用工具,方向二則是泛用型的基本工具 。
專用工具單件 學習成本低,使用方便;泛用工具學習成本高,使用不便,甚至常常伴隨著危險。
作為生產廠家,你可能會買椅子生產線;但作為一個高級木匠,你肯定選擇帶鋸機、木工機床。因為只有後者才允許你發揮自己全部的專業才能——生產線?我造生產線。
作為木匠,藉助木工機床,他是萬能的;買條生產線他就只能像沒有技術的農民工一樣接收半月培訓坐生產線旁邊當螺絲釘,然後只造同一個型號的椅子(的一個零件的一個面、一個孔)。
換句話說,對專業玩家,學習使用更接近根本、泛用型更強的工具,效率反而是更高的 。
就好像我們程序員,說白了只會順序分支循環三種控制結構和與或非三種邏輯——然後藉助某種編程語言幾十個關鍵字/運算符表達出來——經過四年學習,便可宣布計算機領域我全能 。
反之,你要只會玩war3地圖編輯器,這個圖形界面可強大了——給你八年時間,你能用它清理磁碟嗎?
欲速則不達 。
單件學習效率高的工具,在面對一整個大領域的問題時,往往反而是更難學難用的。
因為做100種傢具你就不得不學習使用一百條生產線,每條生產線又有100個位置……你得掌握一萬個知識點才可能做出100種不同傢具。
再多一種傢具?從頭學吧。
但如果你學鋸刨鑽斧,學木工機床,只需掌握至多幾十個知識點,你就是萬能的。
沒錯。這裡就是圖形界面和字元界面設計著重點上的根本不同了。
圖形界面就像計算器,你需要什麼功能,它就給你什麼功能;無論供電、顯示甚至長時間不用自動關機節約電量等等,都用不著你操心。
Do not make me think——這是圖形界面設計者對它的用戶特徵的總結。
當然,一旦認為用戶需要「Do not make me think」,那麼結果必然要走向「禁止用戶思考」 ——除了按鈕,你什麼都不要知道。讓你知道了就說明我「封裝」沒做好,又勞駕您動腦子了。
久而久之,哪怕你清清楚楚知道後台的一切,你也沒辦法控制它了——就好像win10飽受詬病的強制更新等機制一樣:我筆記本網卡很奇葩,win10驅動下它就是上不了網,只有win7驅動可用;但為了使用win7驅動,我不得不和它那噁心人的「傻瓜機制」鬥智斗勇一整天!因為從調查排錯到替換驅動,它時時處處拿我這專業人員當傻逼,時時處處給我製造麻煩。最後,強制關閉完整性檢查、建立win10版驅動同名目錄並給這個目錄設置極高訪問權, 這才阻止了win10做蠢事, 使得它不再強制把正常的win7換成錯誤的win10驅動。
如果你確信自己不需要了解背後的原理,確信自己永不必處理軟體作者沒有想到的奇葩狀況,那麼傻瓜式的圖形界面顯然最為適合你。
而字元界面類似樹莓派。它不僅給你現成的功能,還給你完成任何功能所必需的基礎——你可以把任何現成的功能當成基礎組件,用來搭建更酷更炫的東西。
最最極端的例子就是圖靈機,或者各種編程語言——沒錯,這些玩意兒功能簡單,簡單到了醜陋的地步。以至於仨數字排個序都需要自己寫程序才能搞定。
事實上,最最「簡單」的機器語言,你得自己做二進位轉換;彙編語言可以幫你把「助記符」轉換到二進位;C/Java等高級語言可以讓你用if/for/class等更為高級的概念直接編程;而更「高級」的腳本語言……你只需像膠水一樣把它提供的半成品往一塊一粘就好——要什麼你就能「粘」出什麼。
而命令行的設計思想,就是「搞一種比腳本更高、但比計算器更低的東西」——不,它實際上是把計算器本身都當成一種組件、一個工具,從而允許你自由組合它們。
比如,我可以這樣:
call 自動打蛋器 //打出雞蛋液
call 自動麵條機 //加入雞蛋液做成雞蛋面
call 電磁爐 //煮麵
call iPhone //喊你家的小懶蟲起來吃飯
添加細節,調試通過,存成「一鍵做雞蛋面.sh」,然後在桌面建立個快捷方式——該吃飯了滑鼠一點,一會兒電話打過來你就可以去吃麵條了。
如何?酷吧?
N年前,我有張光碟劃傷了,數據怎麼都讀不出來。有個文件時多時少,總是讀若干位元組就出錯。用了當時流行的很多數據恢復軟體都讀不出來。
但這個故障我很清楚,就是表面稍微擦傷,導致數據難以讀出。每次根據激光聚焦點位置的不同,能夠讀取的數據也各有不同:近一些能讀前4k,遠一些能讀後4k;偏左點能多讀接下來的4k,再偏右點又能把尾部4k讀出來……總之只要多試,利用激光頭的隨機誤差,就有一定概率能救出全部數據。可是很遺憾,我找遍了當時各種數據恢復軟體,包括很多商業數據恢復工具的破解版,全都無能為力。後來我都打算自己寫程序fseek一把了,忽然想起個主意。於是把光碟路徑設定為ftp服務目錄,然後用斷點續傳工具從這個自建ftp站點下載,重試次數無限——這樣實際發生的物理行為就是我所期望的場景——果然,僅僅消耗了4、5分鐘,就把完整內容讀出來了。當然了,這個其實是用圖形界面軟體做的。但是這裡面有個思想很可貴,就是工具是可以組合起來用的,並不需要別人全給你做出來 。有一些基礎功能,然後再允許你組合,那麼絕大多數任務你自己就可以通過組合搞定。命令行鼓勵你組合使用各種軟體——當年的DOS甚至把它們統稱「外部命令」——從而得到無限的功能。只不過,window的命令行是個閹割品,你實際上很難很難藉助它粘合各種軟體。這樣也好。各種各樣的標榜自己可以「數據恢復」的劣質品就可以上架賣了(當然,專業的數據恢復軟體還是很強的,只是它可能恰好沒有我想要的功能而已)。
再來個例子。
我的筆記本自帶硬碟只有320G。對我這種重度使用者來說顯然不夠。後來又買個1T的希捷deskjet移動硬碟作為補充。但沒多久,50G容量的C盤已經滿了(當時大部分人分給C盤的容量只有10G左右,很少捨得給20G的,我直接給50G)。實在忍受不了,買個新硬碟打算升級。但這個筆記本上有我已經配置好的全套環境,原有的windows還是正版。重新安裝實在勞民傷財。很多高人馬上就會想到ghost:把C盤用ghost做個影像,然後把影像寫到新硬碟第一個分區;寫完用PQ Magic擴大這個分區;然後再在新硬碟上分出D、E區,繼續用ghost把舊硬碟其它分區做成映像複製過來——同時按需要用PQ magic擴大分區。簡單說,你得下載(很可能是盜版的)ghost和PQ Magic(其實PQ magic當時已經不支持win7的ntfs分區擴容了,所以你得滿世界找替代的、可支持ntfs的軟體);然後等著ghost一個個做映像;然後一個個寫入映像、修改分區大小……總之,起碼5、6個小時離不開電腦。我的做法是,找個U盤,在上面做Linux live CD。把新老硬碟同時安裝到電腦上(當時就打算用老硬碟做移動硬碟的,所以同時買了移動硬碟盒);使用U盤啟動,打開Linux終端,su切換到超級用戶(root)。使用fdisk為新硬碟分區,其中C盤分200G,D、E等分區同樣放大;另外又給linux分了幾個區,打算做雙啟動。然後執行如下命令:dd if=/dev/sda0 of=/dev/sdb0 bs=16Mdd是Linux下一個強大的數據複製工具;Linux下一切皆文件,因此sata介面上的磁碟a的第0個分區同樣可看作一個普通文件,磁碟b情況類似;if=/dev/sda0意思就是以老硬碟最前面的分區為輸入;of=/dev/sdb0意思就是以新硬碟最前面的分區為輸出;bs=16M意思是一次拷貝16M的數據,這個不同的系統有各自最合適的值,你可以多試幾次,看看選用哪個值拷貝速度最快。因為這個命令是把整個分區當文件順序讀寫,因此無需頻繁尋道,數據複製速度可以一直壓著硬碟理論最大值飆車。dd (Unix) - Wikipedia還有N個區?很簡單,繼續往下寫dd if=/dev/sda1 of=/dev/sdb1 bs=16M就好了。然後,繼續敲resize2fs /dev/sdb0,它會自動把該分區的文件系統大小調整到和分區實際大小相符。其它分區依此類推。敲完,存為cpsys.sh,chmod +x,然後多檢查幾遍,確認沒問題,執行./cpsys.sh &> cpsys.log接下來出去逛商場,逛到中午回來,cat cpsys.log | grep Error確認沒發生任何錯誤,關機,拔U盤,拔移動硬碟,啟動,一切就和原來一模一樣——除了磁碟空間變大之外。——對不會命令行的你來說,你得知道ghost、知道pqmagic,知道它們是幹嘛的、知道它們怎麼用(pqmagic不支持了你還得重新找重新學);但對我來說,dd是個日常使用的、熟的不能再熟的普通工具,其它一切一切也都是老熟人。在整個過程中,我不需要學習任何額外知識,「吃老本」就足夠了。因為它們都是泛用型工具。一次投資,終身受益。說什麼IT行業千變萬化,說什麼IT一日千里,說什麼搞IT必須終身學習……但對掌握了泛用型基礎知識的人來說,所謂「日新月異」多半只是新瓶裝舊酒——比如說,我敢把ghost叫做「用圖形界面打包的、功能單一的dd命令劣化版」,而且的確可以隨手用三五行命令把它秒的渣都不剩。PQ Magic同理。你呢?什麼叫自由?你所掌握的知識都是你的,可以隨意的流淌於指尖,可以輕鬆愜意的達成你需要的任何目標,這才是自由。受制於商業軟體,人家不給你寫你就只能乖乖在電腦前坐5、6個小時;人家不支持了你好不容易死記硬背下來的一切就打了水漂——不會有人真有這麼大臉,敢把這個叫「自由」吧?
當然了,我們都知道,麵條機是不可能這樣組合的。
很簡單,並沒有一個標準的、為了得到這種自動化而做出的輸入輸出約定。
因此,哪怕你集齊了打蛋器、麵條機、電磁爐、iPhone,你還是召喚不出神龍……哦不,服務不好你家的小懶蟲。
圖形界面有著同樣的窘境:你可以一鍵做麵條、一鍵煮麵;但你必須自己把麵粉+水倒入麵條機,然後自己把麵條放進電磁爐……
這就是我在評論區提到的:你可以勉強用按鍵精靈去組合圖形界面程序,但是你必須考慮界面卡死等等可能。浪費更多機器時間,功能還不穩定。
因為它們壓根就沒考慮過「程序之間的介面問題」。
而如果你玩的稍微深一些,就知道Windows下的rar、7z等壓縮軟體,都同時給你安裝了個非GUI版本,允許你在命令行通過參數使用它們——允許你把它組合進你的處理流程,這本身就是個極為重要的功能(事實上,很多GUI軟體都能接收命令行參數。越是偏工具性的軟體就越是不敢忽視這點) 。
而命令行(特指bash等真正有管道、作業控制等支持的命令行,並不是Windows上那個李蓮英……哦不,cmd)從一開始,就考慮了這個協作問題。
學過C語言的,大概都知道main函數有一個返回值,這個值就是給命令行用的(其它編程語言都有類似支持)——0表示成功執行,非零是各種錯誤碼(不同的返回碼代表什麼也有統一的標準)。
*nix的shell不僅能捕獲這個返回值,它甚至還允許你捕獲、分析其它軟體在標準輸出/標準錯誤上的輸出內容,從而達到更深層次的配合。
尤其php、python之類腳本語言,它甚至允許你輕易的把「通過命令行調用其它程序」集成進你的代碼(其實C也很容易做到這些,它們甚至有專門的庫提供支持)——你完全不必操作字元串、也不必自己寫代碼完成http下載,丟給grep/wget即可:它們那麼強大,你再自己一點點敲一遍,不累嗎?
現在,當你買了麵條機,你就可以輕易把它們組合起來,從「一鍵做麵條」衍生出「一鍵做西紅柿打滷麵」、「一鍵做酸菜肉絲麵」等無窮無盡的功能。
換句話說,命令行犧牲了工具的易用性,提高了入門門檻,以保證其泛用性;而圖形界面通過犧牲泛用性,突出了其入門門檻低、易用程度高的優點 。
當然,理想很豐滿,現實很骨感。
命令行的確給「腦子裡充滿奇思妙想又喜歡搗鼓」的人帶來了極大方便;但它本身卻因此顯得有些複雜了,入門門檻較高。這就使得它成了「專業人員」的玩物,缺乏計算機基礎的普通用戶只得敬而遠之。
很多時候,你必須先是一名程序員,才可能解放命令行的威能;但更多時候,哪怕你就是一名程序員——我只是想做碗麵條啊,為什麼一定要我先看完這一千多頁的鬼手冊?
人,總是喜歡偷懶的。
這時候,「點開即用」的圖形界面就顯得更強大、更方便了。
——我只需要把代碼編譯成APP,然後掛出去賣就行了;具體的編譯步驟、參數什麼的,隨便選一個不好嗎?
——什麼破光碟要組合這個組合那個,真有那需求我敲段C/Java代碼不就搞定了?
——更多更詭異的需求?買買買!都不掏錢買寫程序的不得餓死?
你看,也有道理,對吧。
你呢,你會如何選擇?
總之,不同人有不同的需求。單獨的一個個圖形界面程序足以解決80%以上的問題,而且還不斷有新的程序被寫出來,覆蓋更多的「痛點」。
也許,命令行所致力於解決的那額外20%的問題並不是你的需求;或者你可以忍受一定的不完美、或者你可以等更完美的成品上市。
不過,總有人,總有公司,總有一些業務場景,會遇到「不得不解決20%問題」的時候。
如果你善於組合,那麼很可能就能花一兩天時間(也可能更長或更短)解決問題;否則,或許你就不得不花十倍百倍的時間從頭寫出那些基礎功能、然後再組合出解決方案——再或者,你也可以提出需求,讓軟體公司給你定製軟體:這個世界上,絕大多數的軟體都是組合他人現成的庫/程序完成的,不怕多這一個。
這也是為什麼office為什麼要支持VBA以及微軟為何要從OLE到COM到COM+無限次推倒重來……從而把一些「可怕的細節」通過「可怕的編程語言」暴露給無助的非程序員們的根本原因——哪怕因此而導致宏病毒泛濫。
並且,現在Windows也搞power shell了。
沒有免費的午餐 。
要麼犧牲易用性來保證泛用性,要麼犧牲泛用性來保證易用性——有些困難是本質上的。錢再多,你也不可能兩者兼顧。
如果你只需要解決「敲鍵盤時坐的舒服」的問題,那麼千萬別理什麼椅子生產線什麼製造生產線的工具,挑一把讓自己感覺最舒服的椅子就行了。
反之,如果你打算自己開家木器廠和別人競爭……你猜如果你這輩子都沒見過椅子是怎麼生產出來的,幾個「小目標」夠你賠?
但是,又一個轉折,你個做木器廠的,研究汽車發動機幹嘛?
當然,這裡討論的是「合理利用手頭一切資源」的問題。
也有人覺得敲命令便於裝B,另一些人則選擇懟這些裝X犯。這就是另一回事了。
因為所有的系統都有命令行,先有命令行後有圖形界面
而且很多程序員懶,你也沒給錢,懶得也沒空給你做什麼圖形界面
沒有圖形界面你就不會寫代碼了?
從資本家,不,企業家角度出發,雇一個員工,難道還要額外搞一個圖形界面?
這沒有成本嘛?開玩笑,哪有免費的午餐,雖然有盜版,但是盜版也是風險
被告了也是要賠錢的,這裡風險預算要留出來
所以對於不會命令行的開發人員,建議直接從工資里扣除50%作為圖形界面的費用
國外一個上過com 101的文科生都比這些偽開發頂用
不信隨便找個國外的com 101課程syllabus看看,看是不是都是從命令行開始
先說界面,不懂命令行的,不熟悉命令行普通用戶有多少,對圖形界面需求就有多大。
所以,我們可以只討論全球的普通用戶有多少了。
所以,你感覺到了有人「極力推薦」命令行,這又是另一個問題,這個取決於你的環境,你的職業,你打交道的人。站在一個更大的群體範圍內去看,我並不感覺到有人「極力推薦」,並且圖形化是趨勢。比如,你在一個全是程序員或運維人員的技術公司里部,他們大多數會說命令行好用,但是你在你們村裡問,他們會反問命令行是啥?讓我簡單直觀好用就行。所以你這個問題的問法讓我感覺是引戰,但是這個戰場很少人關注,應該不會成為熱門。
換個角度說命令行,圖形化不代表沒有命令行,命令行是底層,而要做一個好的圖形化操作界面,則是因為有更專業的人員將底層的命令行執行邏輯處理好了,同時也徹底消除普通用戶可能操作失敗,出現故障的機會,讓整個業務更完整流暢的運行,讓使用者專心去關注自己的特長業務,而不是什麼命令行。但是!轉折來了,界面做的好的軟體和應用不多了。。。好的都是公司產品級別的,要說個人軟體,基本上,太少了。原生GUI開發會的都不多了,JS類GUI開發倒是慢慢變多了,但是也只是給企業開發用的多。
任何事物都沒有絕對這樣,絕對哪樣,只有佔有比例的區別,按目前世界上的專業技術人中和普通用戶的比例來說,希望操作圖形化的人明顯是比命令行多的,其實在可預見的未來,專業技術人員是一定比普通用戶少的。所以在一定時間範圍內,存在就是合理,我們只關注要做什麼用途,就用什麼方式,這樣就都合理了,何必爭執。
PS1,另外說一下程序員,我們程序員喜歡用命令行嗎?也不全是吧,這個原因是因為,幾乎所有操作,需要命令行的操作,是完全沒有圖形界面!是沒有選擇餘地只能用命令行啊! 比如:執行tomcat啟動關閉重啟及設置優化,如果有一個好用的圖形界面,我肯定不會用命令行! 等等,這裡出現了一個「不好用」的圖形界面的反例,其實tomcat win下是有一個界面的,但是,這東西並不好用,長的丑也罷了,功能也弱,重要的優化配置功能根本沒有,有的功能也沒有必要圖形化,完全屬於可以忽略的東西。當然我可以另寫一個,總之還是我太懶。。。而且還要考慮更大範圍的周邊應用的使用,因為tomcat使用肯定是關聯一些其它工具。
還有一個反面教材的界面化,我記的是gradle,這個東西我記的某個版本是有圖形界面的,但是同樣,不好用,我想要的功能一個沒有,而且啟動運行非常緩慢,界面設計一看就是程序員設計的,沒有美感,沒有用戶體驗。。。在最近的幾個版本里,我已經找不到這個界面了。
PS2,想到一個事,外包中,甲方一些運維人員在接收項目時,有一些有界面要求,比如展示數據,管理等。另一些運維人員則不要,只要提供命令行。我們問,給你們提供一個界面產品可以操作唄,他們不要,只需要每次有項目更新,配置修改時,我們提供shell腳本。後來其它人告訴我們,如果你提供了界面操作,就必須保證界面操作的絕對!注意是絕對正確性,不能出現意外,不能出現錯誤無法解決的情況。如果使用了你的界面產品(如果我們提供了一個操作界面,這個界面就會做為一個產品功能,如果通過了甲方測試團隊,哪就認為我們的產品是合格的,我們只是交付,給出使用文檔就可以),出現了問題,哪就成了運維人員的責任了。但是,如果使用你提供的shell腳本,出錯了,嗯哼哼,這個責任就是你的了。。。到時候叫你來解決還是怎麼的,都是你的事。。
說的是程序員吧
程序員經常要重複做一些冷門操作(比如最簡單的批量改名然後再提取數據啥的),難道你要給每個操作寫一個 GUI?
這個問題已經長期存在並將繼續長期存在下去。在可預見的將來都不會消失。
GUI分兩種,好用的和不好用的。廢話,但標準因人而異吧,那我們換一種分類方法,高效的和低效的。還是廢話,但因人而異吧,那我們再換一種分法,滿足需求的和不滿足需求的。。。別打我,我不分了還不行
那我們來看一些可能屬於滿足需求且好用高效的GUI界面吧,超市收銀系統?銀行櫃員系統和火車票售票系統?銀行ATM系統和電視遙控系統? 能滿足你的標準的系統是哪個?
說到底就是個滿足場景需求且訓練出習慣的問題。
好用高效的GUI都符合這麼些條件,適用範圍窄,僅封裝了少部分操作或者僅在部分操作上高效。
這就是螺絲起子和流水線機器人的差別而已,各有各的適用場景。實驗室里用螺絲刀組裝樣機而在工廠里用流水線生產成品。
我們可以投入更多的GUI設備來滿足特定的場景,我們還能發明語音手勢等拓展我們的GUI,但是凡事總有邊界,越過一定的邊界,看似笨拙的命令行反而效率高到天際。
就拿程序員和運維來講,有相當的工具支持一鍵發布,但是這個一鍵系統能一鍵處理異常故障么?不能。
那個滿足你的需求且高效你就用哪個,邊界處會變,會發生取代現象,但是總體上,這個邊界不可能消失,問題將永遠存在下去。
熟練之後CLI平均來說比GUI方便
絕大多數情況下CLI比GUI穩定一部分小眾工具只有CLI,因為開發CLI比開發GUI容易CLI更利於自動化運行,GUI則是直觀地人機交互不知道為什麼,有的時候CLI真的運行的比GUI快一點…CLI的輸入一眼就能看出來,並用程序模擬,GUI的話…反正我看不出來滑鼠坐標…CLI的輸出可以直接重定向到日誌文件…很多GUI沒提供這種功能…當然,最主要的原因是遠程伺服器帶不動GUI話說回來,即使最極端的命令行推崇者,也不會認為完全不需要圖形界面吧…
至少用CLI推gal感覺還是有點奇怪就是了…
效率。專業人員以效率優先,盲打速度大大高於滑鼠操作。
重複。一個複雜操作寫一次腳本可以多次復用。而GUI很難。
自動化。輸入輸出都是文本,便於自動處理。
傳輸速度。遠程操作中,處理文本傳輸所需的帶寬和傳輸的信息量均優於圖像。
如果有以上需求,命令行操作則優於圖形界面。正好這幾天我自己就遇到一個實例,做個註解。最近我的網站需要一個處理,要把裡面各種插件里所引用的 ajax.googleapi.com 地址替換成國內源。如果用GUI工具則非常繁瑣還容易出現疏漏。用命令行只要一行就解決了。我還計劃再寫個批處理每日自動運行,在插件更新後將需要替換的內容每日自動運行,自動處理替換內容。而本人基本不懂代碼,查查linux命令指南和google一下也就寫出來了。最終大大節約了自己的時間。
命令行玩的溜的人不會去鼓吹別人使用命令行,因為他們知道什麼時候該用什麼能最大提高效率
鼓吹的人多半是學會了一點命令行覺得自己很屌想要裝一下逼
因為gui的生產性極差。
首先是可重複性。
gui幾乎無可重複性可言,比如你可以打開畫筆,看能不能用滑鼠畫兩條一模一樣的線?不能吧?
假設一項操作需要點100下滑鼠,你是沒法保證每次操作都點在相同的位置的。也許你覺得這不是大問題,因為每次點擊之前你都可以用眼睛修正,雖然不能保證完全相同的位置,卻可以保證每次都點在正確的按鈕上。
而每次點擊之前的眼睛修正就是巨大的人力成本。
你做一次倒是無所謂,做1000次呢?你有1000台伺服器是你自己一遍一遍做1000次還是找1000個人來做呢?
而命令行就要方便的多。因為它有極好的可重複性,同樣的命令輸入一千次一萬次也是一樣的結果。假設同樣100下滑鼠點擊的操作需要30條命令行的命令,那麼我只要在做第一次的輸入一遍,剩下的999次我就算是手動做也是複製粘貼一下就ok。這比你一下一下點效率要高多少?
你說我可以錄製宏啊。
可是宏同樣不靠譜。
就算宏可以完美的再現你點擊的位置和間隔(我們暫且忽略不同解析度帶來的影響),但點擊的時機也是無法再現的。比如電腦抽風卡了幾秒,該出對話框的地方沒來得及出,或者因為其他程序彈窗擋住了該點的地方,宏就直接點過去了,你猜後果是啥?
輕則操作失敗,重則重大事故。稍微嚴肅一點的環境是絕對不能這麼幹活的。
那宏要想靠譜一點呢?至少要在點擊前確認該點的地方已經出現在目標位置,最好點擊之後再能確認一下成功點上了。說實話這可是大工程,100次點擊每次都得這麼檢查一下,往少了說也得寫個300行的宏腳本才有戲。
可我明明30行命令就可以搞定。
接下來我們再說歸檔的能力。
對於大工程來說,詳盡的文檔必不可少。命令行可以非常容易的整理成文檔,比如出現xxx情況,則應輸入以下yyy命令。30行命令1,2頁也就搞定了。
你用gui要怎樣搞文檔?很多時候除了一頁一截屏還真沒有太好的辦法,100下點擊的操作你可能2,30頁也搞不定。
命令行的命令亦可以非常容易的整理成腳本。gui做腳本跟操作差太大,很難把操作直接轉化成腳本或者宏,如果需要腳本得單獨製作。這部分折算成人力也是大量的成本。
最後我們再說誤操作的問題。
前面已經說了,相對於命令行,gui的操作需要更多的人工參與。而人工操作越多則越容易引起誤操作。
一行命令乾的活你滑鼠點三下搞不定吧?那人家出問題的幾率就是你的三分之一,人家一條沒命令10幾個20幾個字元又不是現敲進去的,人家可以複製粘貼。
而且高度的可重複性就代表命令行可以事先在實驗室環境試好,落在紙面上由不同的人多重審核之後一個粘貼貼進去。你gui事前準備的再好也需要你一下一下按進去,更容易出問題。
而事後檢查人家命令行可以diff配置文件,gui只能把點過的地方一一打開,挨個看挨個查。
最後,出現問題了,回滾檢查,人家只要查終端的日誌就行了。輸的什麼命令,出的什麼結果一清二楚,你用gui操作還能每次都錄屏嗎?
綜合下來,gui出問題的幾率比命令行來說是差量級的,而且可能不止一個量級。
所以並不是鼓吹命令行,而是真幹活的時候命令行比gui好用很多。
命令行操作直接,對環境要求低。
這對於伺服器來說很方便。尤其是可以簡單的複製粘貼命令就能搞定很多事情。還有各種方便的特殊功能,比如管道,直接可以提高執行效率。更不用說還有腳本化帶來的便捷性了。
我不鼓吹用命令行。但有的時候不得不用命令行。
在Linux系統上,很多圖形界面實際上是在背後調用命令行工具,並且通過管道接收命令行執行的輸出,解析後再以圖形界面呈現給用戶。比如很多IDE的git插件/工具。命令行工具有很多參數和選項,組合起來有很多種用法,通常圖形界面只會實現其中一部分常用的,更高級的功能,比如要串聯好幾個命令行命令的操作,就只能手動輸入來執行了。
另外,這些圖形界面通常無法很好地處理所有可能的錯誤信息。不少工具只能顯示一個操作失敗,或者最後的錯誤信息。如果要診斷故障的原因,很有可能需要手動運行對應的命令來觀察中間的輸出。
我用了這麼多年命令行,現在傾向於認為,除去極端情況,大部分時候用命令行只是因為gui替代品的交互設計不行,或者人力不足以做出好的gui,沒有例外。
比如說我在小公司上班用的命令行工具,模糊搜索的時候fzf彈出搜索框,zsh命令補全的選項面板,以及tmux橫豎各種切分窗口,vim各種摺疊代碼和補全窗口,終究不是在命令行參數,而是在交互設計上下工夫,況且折騰半天也不過是一個poor mens gui,君不見Google微微一笑,掏出了自產的webide全家桶。
很多人舉例說「我需要遠程登錄xxx機器然後用終端編程」,本質上是因為linux的遠程桌面功能做的太差,開個x forward就卡成翔,遠不如rdp方便,所以只好刀耕火種而已。真正涉及到集群管理的時候,各種monitor panel還是用的web console,大家都是用瀏覽器點進去,圖表動畫一應俱全,放大縮小一目了然,哪有什麼命令行的事。
至於「用pipe組合各種命令行而不復用組件庫」本質上是一個糟糕的實踐,只是因為這麼多年來習慣成自然,改不了了,大家只好將錯就錯而已。各種bash自動化腳本配合sed awk鬼畫符毫無可維護性而言,歷史負擔越來越重,誰也不敢動,只好奉為圭臬,老人們再教導下一代的命令行使用者,這是一種循環。
圖形界面提供的都是一些大多數用戶需要的常用操作。對於一些特定的操作或者操作組合,圖形界面在效率上比命令行差太遠了。比如 Windows 更新總是失敗,嘗試刪除更新緩存。圖形界面要這麼操作:1) 右鍵【開始】按鈕→計算機管理→左側欄【服務】2) 在右側的服務列表找到【Windows Update】右擊它,選【停止】3) 打開資源管理器,進入 C:WindowsSoftwareDistribution 文件夾4) 按 Ctrl+A 選中所有文件,然後按 Shift+Delete,在彈出的對話框里選擇「是」,清除所有的緩存5) 右鍵【開始】按鈕→計算機管理→左側欄【服務】6) 在右側的服務列表找到【Windows Update】右擊它,選【啟動】而命令行的話,這麼操作:1) 右鍵【開始】按鈕→【命令提示符(管理員)】→UAC 點【是】2) net stop wuauserv3) cd C:WindowsSoftwareDistribution4) del /a /f /s /q *5) net start wuauserv
有些操作圖形界面沒有提供,只有命令行提供了。當然這是因為沒得選擇。比如清除多餘的 Windows 更新卸載程序只有命令行輸入 dism /online /cleanup-image /startcomponentcleanup /resetbase這樣的方法可以解決,圖形界面貌似是沒法解決,或者只能是麻煩得多的方法。再比如去掉開機密碼但仍然保留鎖屏密碼只有命令行輸入 netplwiz,然後在彈出的對話框里操作,去掉【要使用本計算機,用戶必須輸入用戶名和密碼】的勾。
命令行可以用計劃任務來實現定期執行相應的任務,而圖形界面除非開發者有意設計相應的計劃任務功能,否則是做不到的。比如每晚 10 點定時關機,我可以在任務計劃程序里添加一個每晚 10 點運行的C:WindowsSystem32shutdown.exe -s -t 0命令行任務就行了。再比如我添加一個每月執行一次的C:WindowsSystem32dism.exe /online /cleanup-image /startcomponentcleanup /resetbase任務,再也不怕 Windows 更新將我的 C 盤佔滿啦。
最後,我並不是【極力推薦】使用命令行的,我只是在說哪些時候命令行相比圖形界面有優勢。
個人來說,喜歡是喜歡,但鼓吹不至於。
我是從mac上慢慢開始學會用命令行的。最初的原因是因為mac的Finder,對於一個從小就使用Windows資源管理器的人來說,一點都不好用。後來由於工作原因學會了一點命令行,便再也回不去。越用,回不去的原因越多,但其實仔細想想也都不是什麼大事:
命令行很方便。每個*nix上都有。
包管理和腳本。我是一個有系統潔癖的人,從WindowsXP時代開始會因為系統多出了太多自己不認識的東西就重裝系統。而一直以來,裝系統從來都不是最耗時的。最耗時的是折騰環境,一個個網站的去下載自己需要的東西,完了還需要配置。常常一折騰就是一下午。包管理配合腳本,裝機配置就是一鍵搞定。
像高贊說的那樣,GUI軟體多數不爭氣。這兩年,我也漸漸不常折騰系統了。而唯一讓我留在命令行里的就是「小而專」的軟體。從13年開始主力使用mac,花了很多錢在App Store裡面尋找應用。但最後用了命令行才知道,App Store裡面的99%的軟體,功能上都只是命令行工具套了層華美的GUI而已。這些工具專是專,但一點都不小。真正麻煩的是,因為沒有pipe和redirection的支持,「專」反而變成了缺點,用起來束手束腳的。
其實也就這些了。實際上,用命令行的人何嘗不想滑鼠點點點,沒人在用CLI瀏覽器不是嗎?
知乎軟吹多(我也被忽悠過),自然黑 *nix 下 bash、管道那一套的也多。雖然 PowerShell 作為下一代 shell 更加牛逼,但是在這個時候總會被選擇性無視掉(不要誤會,我很喜歡 pwsh 的理念,也認為這是進化的方向)。
我很好奇,無腦吹 GUI 的那些人里是不是完全不需要自動化,也不需要組合現有工具以得到符合自己需求的結果。本來各有擅長之處,又不是非此即彼,非要搞得像黨派清算一樣,也不知道這個頭是誰帶起來的。
……管道了解一下。
圖形界面暫時還沒有能匹敵的設計。
命令行的優點需要場景來決定。多媒體編輯還是圖形的天下。
推薦閱讀: