作者 | unixsheikh
譯者 | 核子可樂
策劃 | 李冬梅
如今,一批所謂的專家只知道無腦上馬那些炒作工具,但對其更深層次的運作方式卻一無所知。這是個大問題,甚至正在毀掉我們的未來發(fā)展空間。
方向盤就是個抽象概念,卻能幫助我們輕松駕馭車輛。動力轉(zhuǎn)向又是另一個抽象層次,用于進一步改善駕控體驗。所以抽象本身并沒有錯,只是在丹麥流傳著這樣一句諺語:
“無論太少還是太多,都會毀掉一切”。
如果抽象過度泛濫,那么如果有一天再沒人理解其底層實現(xiàn)邏輯,我們又該如何應(yīng)對呢?
自動化和信息化讓程序員們變懶了
科技行業(yè)的一切其實都是以利潤為核心進行驅(qū)動,人們對其他任何事情都沒有興趣。所以廠商必須要盡快發(fā)布新的產(chǎn)品或者服務(wù),也就必須采取更多的抽象和自動化元素、努力壓縮人手,對于整個系統(tǒng)底層的理解自然愈發(fā)淺薄。
如今,早就不存在什么程序員和系統(tǒng)管理員了,取而代之的是 DevOps 甚至是 DevSecOps。行業(yè)正努力把每項任務(wù)都塞進同一個職能角色的日常工作當(dāng)中,就是說技術(shù)人員需要獨力完成開發(fā)(Dev)、安全(Sec)和運營(Ops),即整個系統(tǒng)管理流程。但由于沒有哪個人敢自稱真正的通才,所以我們只能匆忙上馬自動化方案,在節(jié)約資金的同時避免不同技術(shù)部門間的成員在復(fù)雜的交互中迷失方向。于是乎,現(xiàn)代技術(shù)人員被教導(dǎo)只使用特定的工具,而對其底層實現(xiàn)知之甚少。
所以一方面技術(shù)正變得越來越難以理解,另一方面我們的現(xiàn)代生活正越來越多地依賴于這些技術(shù)。那么,當(dāng)科技行業(yè)的理解水平不斷下滑,大多數(shù)人甚至根本不知道該如何修復(fù)自己手頭的工具時,會引發(fā)怎樣的后果?
換言之,人們已經(jīng)習(xí)慣了高度抽象的狀態(tài),并認(rèn)為這才是正確的方式。他們也很樂意添加更多抽象來加劇這種混亂。
也許會有傲慢的開發(fā)者嘲諷道:既然這樣,那咱們直接用回匯編語言得了!
毫無疑問,我們是需要抽象的,但每一個層次的抽象都有相應(yīng)的代價。而且諷刺的是,出于利潤追求抽象最終可能引發(fā)巨大的收益損失。
現(xiàn)在,大多數(shù)“安全人員”對于安全知之甚少,只曉得如何使用某種預(yù)制的滲透測試工具。滲透測試工具的 Web GUI 板上顯示了一大堆綠燈,就代表系統(tǒng)運行良好。但也許某位心存惡意的技術(shù)大牛早就入侵了該系統(tǒng),并不斷把有價值數(shù)據(jù)賣到暗網(wǎng)上去。整個過程看似毫無異常,也許會持續(xù)數(shù)年而無人發(fā)現(xiàn),畢竟 GUI 儀表板說沒問題的嘛。
過度依賴抽象,埋得不深的真相永遠(yuǎn)不會有人發(fā)現(xiàn)
我曾為一家公司推薦過第三方開發(fā)伙伴,那邊的開發(fā)人員知道怎么使用“現(xiàn)代框架”把網(wǎng)站和 API 組合起來,但對框架自身的編碼了解不多,對安全性更是一無所知。一旦出現(xiàn)問題,沒人能判斷到底發(fā)生了什么。于是在遇到問題并掙扎了幾個月后,他們最終放棄并選擇對外求助。
其實只要看看系統(tǒng)的真實運行情況,就能知道肯定是出了問題。我復(fù)制了所有內(nèi)容來進行離線檢查,之后花了一個晚上直接查看系統(tǒng)文件中的各個代碼行,并把公司主機上運行的文件跟原始框架文件進行了簡單比較。
其實我并不是建議大家手動檢查所有內(nèi)容,但保持這種手動檢查習(xí)慣能讓我們學(xué)到很多東西。真相往往埋得并不深,只要有點耐心就肯定可以找到。當(dāng)然,這也要求我們對技術(shù)原理有基本的了解。
長話短說,我最終發(fā)現(xiàn)他們已經(jīng)遭到黑客入侵,其系統(tǒng)被用作某種色情內(nèi)容的后端分發(fā)數(shù)據(jù)庫。但性能問題并非源自黑客攻擊,而是由框架本身所引發(fā),因為該框架速度極慢。另外,這次黑客攻擊也是高度離散,要不是我決定“四下打探”并認(rèn)真查看了文件和代碼,很可能永遠(yuǎn)發(fā)現(xiàn)不了。
寫給技術(shù)人們的建議:別跟風(fēng)、保持好奇、不斷學(xué)習(xí)
- 別總跟著炒作話題或熱門趨勢跑。
- 保持好奇心。不要單純學(xué)習(xí)工具,更要了解其底層技術(shù)是如何起效的。
- 如果可能,至少試著手動執(zhí)行操作,例如如何配置工具來滿足實際需求。
- 如果可能,請嘗試查看當(dāng)前工具的代碼。對這些代碼的基本了解將非常有價值。
- 培養(yǎng)良好的求知習(xí)慣、保持學(xué)習(xí)、不斷實驗,深入鉆研你感興趣的技術(shù)。最好能建立一個家庭實驗室,在這里探索并嘗試剖析一切。
記得質(zhì)疑一切,特別是那些看似沒有意義的事情。不要簡單假設(shè)“我不懂的,總有人懂”——這只會讓你變成盲目的追隨者。有時候其他人確實懂,但這是不夠的。我們要勇敢起來,堅持追尋自己的理念和客觀事實,哪怕這會顯得跟其他同行格格不入。
我想在本文中強調(diào)的,并不是每個人都要從第一原理出發(fā)認(rèn)識一切,或者說就不該使用便利的自動化工具。文章開頭我就提到,抽象當(dāng)然是好的。而且不同的專業(yè)事務(wù)當(dāng)然要由不同的專家來做,比如駕駛卡車有司機,修理卡車有技師。
我真正要說的,是工程師到底該用怎樣的態(tài)度對待技術(shù)工作,以及這種態(tài)度對于技術(shù)從業(yè)者們的重要意義。
以軟件開發(fā)為例,有太多的專業(yè)知識都被抽象了出來,進而被工具和自動化所取代。了解整個體系的人越來越少,很多人甚至連當(dāng)前工作的往下一層都不愿深挖。
這已經(jīng)是個嚴(yán)重問題,導(dǎo)致很少有人能夠修復(fù)垂直領(lǐng)域中的技術(shù)細(xì)節(jié)。沒錯,大家捫心自問,究竟是不是這樣?
大約半年前,我偶然發(fā)現(xiàn)有些前端 Web 開發(fā)者根本不知道無需部署工具就能創(chuàng)建網(wǎng)站,甚至連 JavaScript 都可以不用。他們開發(fā)的可是賺錢的商業(yè)網(wǎng)站!帶著驚訝之情,我詢問了一位教授 Python 編程課的朋友,他的反應(yīng)倒是很平靜:
別那么吃驚,這就是如今的常態(tài)。技術(shù)行業(yè)希望我們培養(yǎng)更多只知道“按按鈕”的從業(yè)者,而不是把專業(yè)學(xué)深、學(xué)透的人。
我知道,總會有人想要把專業(yè)學(xué)深、學(xué)透,但這不是重點。關(guān)鍵在于,我們的軟件開發(fā)行業(yè)已經(jīng)開始扭曲變形:由于加入了太多的抽象層,大家已經(jīng)看不懂整個體系在如何運作。最終,這個行業(yè)一定會搬起石頭砸了自己的腳。
我敢肯定,當(dāng)一位 Web 開發(fā)者——無論是前端、后端還是“整合工作”——在制作網(wǎng)站時,完全不需要編碼、TCP/IP、DNS、HTTP、TLS 或者安全性知識,而只靠預(yù)制的工具和框架就能搞定的時候,那大麻煩恐怕就離我們不遠(yuǎn)了。
網(wǎng)友怎么看?
這篇貼文在 Hacker News 上發(fā)布后,引來了諸多圍觀者。不少開發(fā)者在下方留言發(fā)表了自己的觀點。
有網(wǎng)友稱,文中提到的現(xiàn)象的確存在,但這不能完全怪開發(fā)者不去主動學(xué)習(xí),因為一項優(yōu)秀、可靠的技術(shù)需要很長時間的積累才能出現(xiàn),開發(fā)者實際上不需要理解它就能操作它。
舉個例子,文中提到了“是的,讓我們都回到匯編編碼吧!” 事實是:在高級語言成為主流之后的很長一段時間里,開發(fā)者仍然必須了解匯編才能成為一名開發(fā)者員,即使你的大部分工作是用 C 或 C 語言完成的。這是因為高級語言的編譯器及其調(diào)試工具最初是一個“有漏洞的”抽象。當(dāng)你的程序失敗時,你必須了解匯編才能找出問題所在。如今,編譯器和調(diào)試工具已經(jīng)變得如此出色,那些日子已經(jīng)一去不復(fù)返了,你真的不需要再了解匯編了。
但我們今天面臨的問題是:我們一層又一層地堆積有漏洞的抽象,卻沒有給它成熟所需的時間。我們的設(shè)計是為了縮短開發(fā)人員完成某件事所花費的時間,但其實這是個錯誤的假設(shè),因為開發(fā)者只想要一切按計劃進行,不想花費大部分時間來調(diào)試計劃之外的工作。這些抽象就是復(fù)雜且無意義的。
ID 名為 figassis 的網(wǎng)友稱,自己一直不理解那些沒上過大學(xué)就能從事編程工作的開發(fā)者。figassis 表示自己看到了一個怪象:過去幾年還是十幾年間,不需要上大學(xué)就可以成為程序員似乎成為一種趨勢。figassis 稱:
“確實,我的大部分技能都是在大學(xué)畢業(yè)后獲得的,但是你從大學(xué)中獲得了某種全球系統(tǒng)的理解(在我的例子中是計算機+軟件+網(wǎng)絡(luò)工程),掌握了這些基礎(chǔ)技能,你可以快速縮小問題的潛在根源,包括 TCP/IP 堆棧、CPU 架構(gòu)、內(nèi)存管理,以及編譯器如何錯誤地優(yōu)化某些代碼。它對于提出正確的問題也有很大幫助。如果你所知道的只是最新的框架/語言/工具,那么當(dāng)出現(xiàn)問題時,周圍的整個世界都會'咬你一口’。關(guān)于抽象:我總是逃避那些鼓勵抽象的語言。Java 就是其中之一,即使在大學(xué)里,整個 OOP 趨勢對我來說也只是平淡無奇。我對框架(尤其是 JS)最大的恐懼是它們被抽象到這樣的程度,以至于我無法希望在不尋求論壇或 Github 幫助的情況下在合理的時間內(nèi)解決問題,因為我甚至不理解這些概念。什么是效果?反應(yīng)如何工作?等等?!?/span>
原文鏈接:
https://unixsheikh.com/articles/we-have-used-too-many-levels-of-abstractions-and-now-the-future-looks-bleak.html