閑話CLI和GUI
在網工這個圈子裡,一直盛傳著一些誤導人的觀點,而這些觀點,大部分時候,都是那些半吊子散播的,其中關於CLI和GUI的觀點,真的是毒害了不少人的思維,以至於我見到很多人張口閉口就問廠家要GUI,以自己「很懂協議原理」和「不屑於做一個使用CLI的操作員」為標籤,到處去跟人佈道說,「哎呀,會CLI沒什麼牛逼的,操作員而已,以後都是WEB上點點點就好啦,懂協議原理最重要blablabla……」
如果你聽到這樣的言論,不用懷疑,給你佈道的這個人肯定不怎麼懂協議原理。連CLI和WEB的差別都分不清楚的人,怎麼可能有心去研究協議原理呢?不存在的。
什麼是WEB管理?
通常我們所說的WEB管理其實就是通過瀏覽器來管理設備,其本質不過就是網路設備內置了一個HTTP&HTTPS Server而已。在管理方式上,我們可以將其算作是GUI,也就是圖形化界面。選擇WEB作為GUI的一個表象形式,無非是因為用WEB可以使用很多現成的框架甚至是模板,君不見很多廠家的WEB管理界面看上去都一個樣子?
所以你以為開發個WEB界面給你是有良心,而實際上可能恰恰相反,很多設備商提供WEB管理的本質並不是有良心,而是為了降低成本,並屏蔽自己的設備細節。要我說,真的想表現自己有良心,那就開發一個Windows/Mac/Androird/iOS,至少支持4個平台的桌面GUI管理程序啊,那多好。
CLI和GUI的本質
現代網路設備的NOS,基本上都是基於Linux的,大廠商會自己從頭到尾做一個特殊的Linux,如C記的IOS-XE,IOS-XR,NX-OS都是這種性質,小廠商直接拿一個發行版的Linux改一下的也不是沒有。
所以對於Linux高手來說,如果拿到了root許可權,確實可以操作大部分網路設備了,但並非所有人都是Linux的高手,不如說在很長一段時間內,網工們撐死了只是個熟練的Linux使用者,更何況,設備商也不會輕易把root許可權開給你就是了。
而CLI和GUI都只是在Linux系統上層的一個邏輯封裝,目的都是為了簡化大家操作網路設備,但是,這並不等於,做個GUI就是有良心,不提供GUI就是不好,不是這樣的道理的。
CLI的意義
不要以為CLI只對網路工程師有意義。
對於大廠商來說,每一個設備平台上都會支持各種各樣的功能和協議,而這些協議都是由不同的部門設計和開發的,完善的CLI首先不是設計給用戶的,很多功能的CLI會在推向市場後根據用戶的request而作修改,所以CLI誕生之初首先是為了便於開發和測試的。
設備上的CLI遠不止你平時配置的那幾條命令那麼簡單,那個很長很長的Configuration Guide所代表的意義是——每一個功能都給你留好了調優的介面,每一個功能都給你提供了維護和排錯的可能。
說句難聽的,你連某個功能的某個參數都不知道怎麼調,你還好意思吹噓說你懂協議原理?(這句話的邏輯也很簡單,比方說如果你不懂IKEv2的交互過程,你就不可能知道在出現故障時應該調節哪個參數)
所以如果要我類比CLI的話,那麼CLI就是一台機器上密密麻麻的按鈕和調節閥,每一個選項或多或少的都會影響這個設備的運行狀態,你可以選擇一切按照設備商的最佳實踐來調整,但我們也不能保證實際上會不會發生一些預料之外,實驗室不會遇到的情況,所以把調整的旋鈕都給你留好了,你隨時可以來調。
如果設備商已經做好了豐富的CLI,那麼也就有能力做好豐富的API,換種方式再抽象一次就是了。
GUI是個什麼?
前面說了,CLI和GUI都只是這些特殊的Linux系統抽象給用戶的界面。如果你但凡仔細思考過你平時使用的各種圖形化軟體,你就會清楚地意識到一件事——用GUI來製造所有的調節旋鈕是非常非常難的一件事,這裡面的交互邏輯,遠不是點點點那麼簡單,而且無論怎麼做,學習成本都避免不了。
舉幾個例子吧,一個是Windows系統,從XP到WIN10,GUI做了很多改變,但微軟還是不敢刪除傳統的控制面板界面,刪了估計會被罵死,另一個是Office,請各位問問自己,你花了多長時間,才學會了Office?
即便設備商有心設計一套效率很高的GUI界面,還是要考慮工程師願不願意學對不對?本來學協議原理挺累的了,還得學界面怎麼用,ISE不就是個反面例子么,看原理大家都覺得TrustSec好用,拿到ISE,都罵這玩意的GUI怎麼這麼傻逼。當然,ISE並沒有一套效率很高的GUI,從一開始,它的GUI設計就很反人類。
所以,如果設備商要給大家做GUI界面,基本上只有兩個選擇:
- 少量的功能,屏蔽細節,看上去簡單
- 大量的功能,大量的細節,以及由於根本沒有人懂交互所以做的一坨翔
其中第一個選擇,會因為用戶不斷地request,而逐漸演進為第二個選擇
GUI的第三個選擇
GUI界面這個東西,天生就不可能兼顧複雜和好用,不如說,GUI要好用,就得不複雜,但網路是複雜的,那麼GUI要想不複雜,就得在實際生效的網路功能和呈現給大家的GUI界面之間再做一次封裝,其實這件事,就是網路工程師寫的腳本,只不過一直以來,這件事都是工程師來做,而現在卻慢慢地變成了廠家幫大家做好,甚至連腳本都不讓你看到,只給你看到一個按鈕,實現的效果最好是「點一下,欸通了,好開心~O(∩_∩)O」這樣子……
看來工程師們真是越活越回去了,業界藥丸,業界藥丸……
回過頭來看這件事,點一下就生效,難嗎?
如果我已經提供給你足夠多的旋鈕,你也理解這些CLI的邏輯,那麼把它做成GUI就只差一個好的前端了。
那為什麼廠家不做呢?不,其實做了,比如C家現在在推廣的SDA方案就是這個樣子,點幾下,所有設備上的VRF啊路由啊什麼的都給你配好了。但是毫無疑問,這是有局限性的,為了實現這個結果,我們必須把網路場景化,把網路設計固定成模板,所有用戶都按照這個方式來設計。
說白了,個性化需求就要有個性化的GUI設計,而個性化的GUI設計,就需要專門懂GUI的人來做。
最後
我希望你在看完這篇文章後明白一件事,CLI不是用來背的,也不是用來記的,你可以把它寫成Note,用到的時候再去查,但是如果你以為這個東西需要你記,那就真的是敲版本敲傻了。
真正會用CLI的人,是去理解那些CLI所代表的含義,有的時候,即使沒有文檔,只是靠TAB鍵補完,也可以「蒙」出某個功能的配法,但這是因為,各位的大腦,人的大腦,比代碼聰明多了,只要CLI合乎邏輯並且你也理解這個邏輯,自然就可以順勢推斷出配置的方法。
我希望你還能明白第二件事,WEB不會取代CLI,API倒是有可能。只要數據格式基本可讀,雖然做不到CLI那麼好看,但API確實可以彌補CLI的一些不足,但是,這裡還有個隱藏的問題——如果一個設備商從來都只是給你提供GUI而不提供好的CLI,相信我,十有八九API他們做的也不怎麼樣。
推薦閱讀:
※Windows 和 Unix 下的命令操作有什麼迷人之處?
※怎麼同時用不同的顏色輸出同一內容?
※如何善加利用 Mac 下的 Terminal ?
※為什麼命令行界面(CLI)並未隨著命令行操作系統(如 DOS)的淘汰而消亡?
※有哪些高效但是不常見的CLI命令?