量產型炮灰工程師
在嗎
寫這篇文章之前我的顧慮非常多,因為它很得罪人而我卻撈不到一點好處。但反過來說我寫這篇文章並不是針對說「達○」這樣的培訓機構,或者「李○○」老師的一些言論,也不是針對說 Ruby China 上最新一些類似的培訓帖。我是說在座的,都是○○。
我要針對的甚至都不是培訓行業,反過來,我認為對於整個軟體行業而言,培訓整件事情就不靠譜。這不是說我心血來潮,我想諸位的公司只要不是沙丁魚罐頭類型的外包公司,對於培訓這件事本身都多少抵觸。至於高端的培訓班,我想你們也有自己的看法,只是有時候不方便說出來。但我最近了解了一些底層勞苦人民悲慘的事實,使我實在看不下去,只能出來批判一番了。
丟人玩意,退群吧
我們先拋開培訓班的問題,我們先來討論一個經典的面試題,它叫做「FizzBuzz」。輸出數字 1-100,逢 3 的整倍數輸出 Fizz,逢 5 的整倍數輸出 Buzz,又是 3 又是 5 的整倍數輸出 FizzBuzz。那麼稍有常識的人都知道,無論你學習什麼語言,學的水平有多糟糕,這道題都很容易實現。但我們來看一下最常見的一些錯誤是怎麼出現的:
for i in 1..100n if i / 3 == # 寫不下去了n
for i in 1..100n if i % 3 == 0n puts Fizzn elsif i % 5 == 0n puts Buzzn elsif i % 15 # 寫不下去了...n
for i in 1..100n if i % 3 == 0n puts Fizzn elsif i % 5 == 0n puts Buzzn elsif i % 15 == 0n puts FizzBuzzn elsen puts in endn
很多培訓班會告訴你這些演算法的基礎知識毫不重要,但事實上嚴格來說這都算不上是一道演算法題,這沒有任何已有的演算法模板來解決,這只是一個最簡單的循環和條件分支語句,有超過 9 成的開發者沒法正確寫對這道題。我認為,這些人壓根就不該也不適合來寫代碼。
令人驚訝的是,這些人並非不能寫業務邏輯,比如說讓他們寫個 CRUD,他們甚至不比你寫得慢。但它們的問題在於連理解文字、理解需求的基本能力都不具備。當你說「整倍數」的時候他們無法想到用餘數,當你先提到 3 和 5 的整倍數時,他們無法想到 15 應該放在他們兩個之前判斷。
對程序最基本的邏輯的考察沒有通過,並不代表他們無法進行日常的開發,就好像數學應用題不會做也不一定會掛科一樣。他們通常會寫出非常糟糕的抽象,常見的例如在一個社交網路里給每種類型的 UGC 內容單獨建表,然後再為每種類型單獨建回復和點贊的表;將用戶重置密碼和管理員重置密碼完全拆成兩個方法來實現;無法正確判斷自己方法在邊界條件下的情況等等。
培訓班對於培訓這樣的程序員來說是容易的,而且市場上需要這些程序員。各位可能很難相信,今天的互聯網應用大多都沒有什麼魯棒性可言,市面上至少一半的產品都存在高危的漏洞只不過是沒有人想要攻擊他們而已。市場需要這些能用的垃圾來建一個原型、騙一筆投資或者交付一筆外包。
培訓班能教你的歸根結底解決的問題是「如何使用一個工具」,而不是「解決問題的方法」。然而在使用工具這件事上,你無論如何都無法描述清所有的場景,就好像你在通過人為地輸入一些邏輯,來讓汽車學會自動駕駛一樣是不完整的。然而在這層嘴臉上,無論是低端的還是所謂的高端的培訓班都會用一種方式來糊弄過去,那就是「老師教給你的東西是有限的,更重要的是,你從老師這學到了代碼的基本方法,你要上進才能更好學習」。但我們平心而論,老師真的教你們代碼的基本方法了嗎?他帶著你們去學習如何閱讀官方文檔了?還是教你們程序背後的基本原理了?都沒有,他明明在教你語法和一些非常弱智的場景。「解決問題的方法」是學不來的,是你大量日常的工作積累的,所以什麼號稱兩個月掌握別人兩年知識的都是騙子,你以為人家兩年都在那裡划水呢?你以為你兩個月真能幹出來什麼嗎?
承認吧,如果有人真的寫好了代碼,就算他沒報班,自學也不會比現在差。
暗示了,明搶了
我覺得從某種角度來說所謂低端的培訓班和高端的培訓班都是一丘之貉,都在宣傳時給你過高的期望,而畢業後這個期望永遠是落空的。低端的培訓班告訴你培訓後你們就可以月入上萬的工程師,主要面向的是二線和是三線城市學業失敗的人。畢業後通常需要通過偽造簡歷才能進入一家沙丁魚罐頭外包公司,拿著三四千的薪水,成天干著重複而無用的最底層的編碼工作。
而高端的培訓班則面對一線城市的中產階級,宣傳時讓他們認為通過培訓後他們能大大改善現在的生活,甚至利用自己的技術成為創業公司的 CTO,成為自己財務自由的墊腳石。然而畢業後他們能找到的工作也不過如此,根本沒有脫離他們中產階級的生活。
如果單單是這樣,我其實並不會寫今天這篇文章,因為他們至少是無害的。但事實上,低端的培訓班通常伴隨貸款出現,可以先上課後付款,學員因此被賣身;而高端培訓班高昂的學費常常消耗掉一個中產家庭的全部積蓄,使其最少的財富積累化為烏有。可以說,培訓班是坐莊穩賺,而學員們在培訓後大多都變得更拮据和悲慘。這種資本驅動下的套路,就和賣老年保健品的那些灰色產業一樣灰色。他們通過給你看到一個事物的片面使你盲信,從而滿足了他們自己的利益。
放棄吧,如果你沒有能力自學,培訓班根本幫不了你。
黑暗劍,不存在的
如果反過來回憶一下我們自己學習代碼的歷程,你會發現都是類似的,是螺旋上升的,是循序漸進的。你是從先會一些最簡單的邏輯,到開始寫一些能用但不好的代碼,慢慢自己通過閱讀文檔、閱讀別人的源碼來慢慢提升。如果你一上來就來看 Rails 的實現,你肯定根本看不懂嘛。你對於一項技術的理解,也一定是先認為這是黑盒,這是魔法,再到了解其技術細節,最後和人說這東西其實很簡單。
我相信不少 Ruby 程序員都是從 Java 程序員過來的,對於這些程序員來說,他們很容易理解 Ruby 的面向對象的機制,但對於開類和模塊注入的一些方法卻覺得很魔法。而如果你是從一門 FP 語言過來的程序員,比如說 Lisp,那你會對 Ruby 的 Block 機制感到很親切,對於開類和注入覺得很容易理解。相反對於一些面向對象的一些手段感到不是很熟練。
這些都是人類「遷移學習」的能力,你將已知的東西來做類比從而理解新的未知的技術。全棧工程師之所以成為全棧工程師,是因為他一開始精通一部分,隨著不斷學習新技術,不斷將已知的遷移上去,從而對技術棧擁有非常全面的大局的認識。然而一些培訓班甚至能號稱自己能培訓「全棧工程師」,你連基礎都沒有,就相當於同時學習操作十台機器,你想想那可能嗎?所以出來的那個不叫全棧工程師,那個叫全棧 Hello World 工程師。你可以在簡歷上寫上:精通各種語言 Hello World 寫法、掌握各種資料庫的安裝、熟練各種操作系統開機。你其實什麼都不會。
寫代碼一方面需要靈性,需要實踐經驗的積累,另一方面需要打好基礎。這些東西本應該是由本科教育提供給你的,但不得不說國內大多數大學的本科教育也沒有提供合適的基礎教育,而培訓班在拮据的時間內也不可能教你這些基礎教育的部分。舉例來說,如何計算一段程序的時間複雜度、空間複雜度,如何理解棧、隊列等數據結構,了解網路協議的基礎。這些東西就像是 RTS 或者 MOBA 遊戲的經濟一樣,當前的經濟並不會直接影響到當前的局勢,但發展一段時間之後,特別是後期和大後期就會立刻成為你的局限之處。如果你連時間複雜度都不會算,你怎麼知道兩段程序誰的性能更好,又是甚至性能差到根本不能工作的時候你又去求助誰。
醒醒吧,寫代碼沒有捷徑,如果你希望在這條路上繼續走下去,你必須打好基礎,不斷學習新的知識才有可能。
RUA
有位大佬曾告誡我,如果不是觸及到自己的利益,那麼就不要去斷別人的財路。但也就是這樣,業界和學界都充斥著一股藥丸的氣息。所有人做教育都是想著幫你賣出去,而你自己學習的目的也是把自己賣出去。所以大學連「SICP」都不上了,培訓班才越來越猖狂;所以越來越多的人相信基礎知識無用,認為存在讓自己成功的捷徑;所以加班昏天黑,干不到 35 歲就被退休了;所以發的 paper 申請的專利都是為了完成指標;所以學術上造假,商業上抄襲,技術上停滯;所以你只有跑不起來的代碼,快不起來的程序,加不上的薪資,屆不到的戀。
與其說這些培訓機構在騙你,不如說是你貪小便宜的心態正中了這些培訓機構的計。
願世界少一些套路。
更新
在此篇文章發出後的幾個小時內,我的微信上已收到了 9 篇不同公司對於某價格不菲的 Ruby 培訓營的吐槽,內容竟還高度重合。現整理如下:
連 SQL 是什麼都不知道
不知道什麼是 group_by 和 count
MVP 模式的 CRUD 寫得很熟練
面試面到無話可問
寫一個簡單的循環都寫不出,並稱是該屆優秀的學生
已加入該公司面試的黑名單
在未經允許的情況下,將錄取學員的公司的 Logo 掛至其官網進行宣傳
給一個月時間寫一個最簡單的 Rack 中間件,最後回復不會寫
雖然此貼不是針對這個培訓營,但這個營確實是在收智商稅,並且暴露出來的問題還是很明顯的。很多人報名的時候考慮到這個營是李○○辦的,老師是 xd○○○。便認為這些背書可以成為幫助他們找到好工作的捷徑。然而事實上這些背書確實起了作用,在第一批學員剛畢業的時候,社區里大多數的公司都抱著非常友好和鼓勵的態度歡迎他們。但是隨著時間的發展,大家越發認識到這些畢業生基礎知識薄弱、學習能力低下的特點,哪怕一些已錄取的員工也被轉崗,開始出現了不少牢騷,對於這個營畢業的學生開始抵觸。可見也就是這些人自己已經徹底毀掉了這個背書本身的價值了。
評論里還有反應這個營在培訓時曾主張通過不斷練習形成「肌肉記憶」。我從未在編程這件事上聽說過這種詞,如果說一件事情是「重複性」的,那當然就把它封裝抽想起來,或者注入進腳手架,哪裡有形成「肌肉記憶」這種說法。而這種錯誤的訓練方式也解釋了上述企業對於這些人的印象。
當然也不少人質疑說,光罵培訓班,那受過高等教育畢業的學生技術就一定好了嗎?當然也不是這樣的,事實上我國大多數高等學府的計算機教育也是無用的,甚至是有害的。中國大學在多次擴招後,除了少數幾個學校,專業教育的大部分也不靠譜。許多學校安排了四年的課程,確實涉及了不少基礎知識,但結果卻本末倒置,覺得學生聽不懂課上得簡單,學生也沒有好好學好。我甚至見到過某 985 學校演算法課期末考默寫,因為好好考試會有太多人掛科。我也很難相信這種專業畢業的學生究竟是在給行業輸送人才還是壓力。
希望所有在這行業里奮鬥的同學們能沉下心多鑽研,不要相信有所謂的捷徑。
推薦閱讀:
※使用Ruby實現七牛同步盤(一)
※參加 RubyConf China 2017 是種怎樣的體驗?
※《面向對象設計實踐指南:Ruby語言描述》
※windows10下用gem安裝jekyll失敗,怎麼辦?(已解決)
※brew升級後ruby報錯怎麼辦?