年薪100萬和10萬程序員的差距
我們看武俠大片,經常有那種本來可以練就絕世武功的大蝦。
陰差陽錯練的走火入魔。
一開始還可以硬撐,還能打敗一些蝦兵蟹將。遇見真正的高手,這些大蝦們立馬就敗下陣來。其實程序員的職業生涯,如同練功一般。先學馬步,再學輕功,最后用氣功各種殺怪制敵。這個過程中,很多程序員一不小心走火入魔了。
時間一長,不僅內力毫無長進、甚至連已經會的招式也慢慢荒廢。今天和大家聊聊蹩足程序員和優秀程序員的差距。
一、復制粘貼哥
不少程序員喜好復制網上的各種實現。又或者扒拉同事的代碼功能,原封不動的粘貼過來。他們長期靠著復制粘貼行走于程序江湖。運氣好的時候,快速弄完上線居然還沒有Bug。運氣不好的時候呢?編譯問題就夠吃一壺了。更絕的是不少復制的錯誤代碼一直伴隨著線上系統的整個生命周期。曾經有兩個巨頭公司,扯皮打官司。原因是某巨頭指責另一家抄襲代碼。巨頭的證據很充分,反編譯對手的代碼后,發現了完全一致的注釋彩蛋。
不用懷疑,這一定是「復制粘貼程序員」的卓絕貢獻。在商業大戰的關鍵時刻,給競爭對手遞了把好刀子。這類程序員還有一個特點:喜好吹噓自己碼代碼能力一流,諸如一天能寫2000行!其實做過程序員的都知道,正兒八經一天幾百行代碼,基本就是極限了。但是「復制粘貼程序員」可就不一樣了。幾分鐘2000行都不是不可能的事。甚至一天給你干出上萬行代碼,也不在話下。洋哥為什么這么清楚?吃他們的虧,真不少。
以至于最后形成了條件反射,面試程序員的時候,我都會問一句:請問你一天能寫多少行代碼呀?回答明顯不靠譜的,一律PASS...!這還讓我養成了一個習慣,只要是程序員崗位,甭管你多高級。
手寫一段算法代碼是必須的,完全寫不出來也PASS。除了對團隊的危害,長期依賴「復制粘貼」的程序員,個人成長也會受到極大影響。
用這種方式來實現功能就像鴉片一般,會上癮。別人絞盡腦汁寫一天,他5分鐘就搞定了,你說爽不爽?長期舒爽的代價是失去裸編程能力、代碼結構化能力、分析能力,進而失去了職場競爭力。讓他寫一個冒泡算法的實現,他都需要去網上搬救兵。遇見沒有現成代碼能搞定的工程,直接傻眼。
二、輪子哥
每個程序員在成長初期,都會經歷過造輪子的階段。
我們學習編碼的時候,都會照書上的示范造一個又一個的小輪子。
我們學習某些新技術,拿到源碼拆解重寫的過程,也是在造輪子。
這些「無用勞動」讓我們真正掌握了編碼的精髓,這是拆解-重建-掌握的過程。
多年前,拿到google的大量源碼,我也是照貓畫虎,挨個功能實現一遍。
但不少程序員在做業務的過程中,瘋狂造輪子,這就是很大問題了。
在業務開發中,明知道你做的組件或功能不可能比已經存在的組件做得更好,卻仍然堅持要做,并應用到業務中。
簡單點說:業界已經有公認的軟件或者庫了,卻還要自己實現一個勉強運行的山寨版。
每個造輪子的程序員都有自己“不得不造”的理由。比如:
- 我的需求獨一無二,現有的庫就是在某些方面上滿足不了
- 用老輪子太麻煩,還要看接口文檔,文檔寫的太狗屎
- 別人已經有輪子了?我不管,我就要自己實現,這樣才有掌控感
- 造輪子的過程能鍛煉我的能力,讓我提升編碼水平
- 自己干多有成就感,我不想當一個搭積木的工程師!
遇見這樣的程序員,滿足了他自己,坑了一個團隊。
尤其是在互聯網行業,時間就是商機、迭代速度就是擊敗對手的武器。
更別提有人放著圓形的輪子不用,非造出個方形輪子,直接導致翻車。
很多時候,造輪子程序員其實是在拿團隊的資源,提升自己。
在我看來,這是一種高級摸魚行為,但危害程度遠大于低級摸魚。公司和老板都不是傻子,識破后,輪子程序員也就失去了在公司的發展前景。最可怕的是那種進化到架構師的輪子程序員,搖身一變成為輪子架構師。那么這種危害就從一個工程團隊擴大到整個公司。比如曾經帶過的一個輪子架構師,不顧業務發展的階段和公司體量,上來就要設計一個類KFK的日志系統。
不讓他做,還會跟你分析各種KFK的硬傷。無論是輪子程序員還是輪子架構師,如果不改變瘋狂造輪子的習慣,被淘汰只是時間問題。
三、布道哥
技術布道師本身是個很高大的職業。
很多公司的CTO同時也擔任技術布道的工作。
這是個對技術深度理解和溝通能力都有極高要求的崗位。
很遺憾的是,不少程序員代碼寫的無比蹩足、溝通能力也很一般,但偏偏喜歡上了布道的感覺。
用了點新技術就急不可耐的到處宣傳,資深同事忽悠不了,就去忽悠剛入職的小年輕。
又或者是手撕產品經理的時候,不自覺的蹦出各種聽不懂的技術名稱,還假模假樣的給人解釋技術細節。
業內出現了新的語言,他們一定會急吼吼的去學習。
剛寫了個"Hellow World”,就急不可耐的到處宣稱掌握了這門語言的精髓和真理。
他們經常號稱掌握10種編程語言,且對每一種語言的優缺點都能分析的頭頭是道。
你讓他們在工程中應用起來?那是不可能的,他們只負責布道。
一般來說,團隊里有一個這種類型的工程師,就夠吃一壺了。
要是有好幾個,他們還會抱團進行學習交流,甚至組織研討會。
各種新技術、新名詞、新動向,在他們這,都被安排的明明白白的。
但絕不產生任何業務價值!
— 4 —優秀程序員
三類蹩足程序員就說完了。
程序員行業有一個特點:優秀程序員的產出是普通程序員的好多倍,甚至是10倍!這是因為編程不是一門「線性科學」,而是一門「非線性科學」。
「線性科學」,比如跑步的速度就是,世界冠軍的速度也不可能是普通人的10倍。「非線性科學」是指很多種因素交匯在一起,極大增加了系統的復雜度。
而蹩足的程序員實際上還有副作用,不少團隊光是處理前人埋下的坑,就耗費了全部精力。
成為優秀程序員不易,我們首先要避開「復制粘貼」、「造輪子」、「布道」這三個陷阱。
進一步,我們要做到以下7點:
1.具備裸編程能力
處理程序實際實現部分的子任務,實現函數或者算法之類的能力。
聽起來很簡單對吧?實際上很多程序員缺失這樣的能力。
2.具備強悍的調試能力
調試能力某種程度上比編碼能力更重要。查找和解決BUG會占用程序員大量的時間。
查找BUG產生的根源不是一件簡單的事情,需要整體的分析和經驗的沉淀,同時還需要對各種調試工具熟練應用。
3.追求簡悅
代碼的注釋是否恰到好處、函數模塊和類的結構是否能讓其他人直接秒懂、架構的設計是否足夠清晰等等,都屬于程序員追求簡約的范疇。
4.準確預計工期的能力
老板想了個idea授意產品經理估工期。產品經理原型都沒畫出來,只有個大概想法,就找技術排工期。
這個時候,技術的內心大概多了幾道菜式:清蒸產品經理、紅燒產品總監、油炸CTO。其實準確預測技術工期是程序員一項非常重要的能力。為什么這么說?只有具備這項能力,才能讓開發工作游刃有余、可進可退。
5.理解底層系統原理
比如數據結構、網絡協議、操作系統相關知識,等等。
程序的很多問題都是源于對計算機工作原理的誤解,即使是使用高級語言開發的程序也一樣。
另外,一些更偏應用層的架構或框架,基礎一定是更底層的系統。
6.嚴格把控關鍵設計
無論是大的系統還是小的模塊,一定都有最關鍵的功能。要在最關鍵功能上投入大量設計時間,才能規避開發過程中的各種坑。
7.拒絕完美主義
完美主義包含兩種情況,一種是追求極致性能的工程師文化、還有一種是個人性格使然。無論哪一種,過分追求完美都會對業務交付產生影響。
程序員之間的差距,恐怕要比人類和猿猴之間的差距,還要大。
程序員讀者朋友們,留言說說你是哪類程序員吧?