暮然回首:我的10年軟體開發生涯
阿新 • • 發佈:2019-02-20
前言
我是個碼農,在職場幹了多年,在超過10個公司服務過,遇到過各種怪現狀,拍案驚奇葩,不吐不快,太想寫篇文章吐槽一下。這篇文章彙集了我10多年來的工作中遇到的各種經歷,總結的心得,分別討論了團隊與協作(同事/領導/客戶的交流)、技術與質量(學習、技術選擇、質量)、職業與事業(現實、追求、老油條、職業道德、典故、事業/經驗)、找工作(獵頭/中介、應聘、簡歷、面試別人)、辭職(原因/理由、信任)等,乾貨滿滿的,裡面還夾帶了我的很多祕密和典故,如果你認真看,會回來找我讚的!!!如果你非要叫我跑龍套碼農,請不要在前面加個死字,謝謝。本文是我的個人經歷和意見,請取濾網三錢,溫水煎,和著服用,謝謝。協作與交流
入職
不管你在以前多厲害,有多豐富的經驗,去到新公司,都要重新學習,撇開業務邏輯,我們還需要學新的編碼規範(不管你是否認同)、開發流程與守則、工具等等,更耗時的,是理解他們的開發框架,每個公司都有自己的一套(很多可能重複發明了了輪子)。心態很重要,沒有端正心態,很容易造成失衡。一些人一夜暴富(如中獎),然後大肆揮霍,最後比暴富前更窮困潦倒。入職新公司,可以放低身段,畢竟你掌握的技術是一回事,學習公司各種文化、流程、規範、業務邏輯等等都要花一段時間,不能一蹴而就,否則落差太大,事與願違,如牛入泥潭,強烈的無力感。一張廁紙,都有它的作用。每個技術公司都有過人之處,我們要關注的,不是那些不行的地方(有待後續解決),而是尋找那些有營養的乾貨,學習之,提高自己。20/80法則,20%的公司牛,那就算差的公司裡,也有20%的人尤為突出的,要向他們學習,看他們寫的高質量程式碼。從一個公司角度來看,評估員工的表現,不是看他以前多厲害,經驗多豐富,而是看現在為公司的貢獻。所以,一些時候出現的情況是:“我自認水平很好,為什麼公司給我的回報沒有我想象中那麼多?”去到一個新公司,心態要擺好,低頭做人,努力學習。或許,有一些同事,覺得你空降過來,不會持有熱烈歡迎的態度,所以,做好本分的事情,不需要奉承別人,也更加不要得罪別人,平常心看待。每去到一家公司,我會嘗試笑著面對每個遇到的人,甚至說一聲Hi,如果對方沒興趣,那沒關係,我不會因此臉黑或者不爽。笑著面對各種問題,自己寫的爛程式碼,含著淚也得把它重構好。同事/領導/職場
客戶
技術與質量
學習
只為一家公司賣命一輩子的,少數。即便只為一家公司幹活,始終會有產品改進甚至更新換代的一刻,不管是使用者量上去了,還是使用者需求變更了,那總要學習新技術。一些公司,系統多年不改進,員工就無慾無求了。等離開公司的一刻,才發現自己與社會脫節了,這種如溫水煮蛙,所以早就了很多養老心態的老油條 。公司C,一個資深碼農,離職之前,考高階程式設計師證,惡補,拿到證之後,離職了。我不是喜鵲碼農(The Magpie Developer),不貪新厭舊,確實太多東西需要學,資料量太大了,每天太多東西可以學,時間不夠。舉個例子,基本的日常使用的工具,如開發工具,譬如Visual Studio,即便你每天用,很多有用的東西我就是沒留意,舉個栗子:你知道怎麼快速複製、剪下、刪除整行程式碼嗎?刪除一個詞呢?再舉個粒子,SSMS(SQL Server Management Studio)裡面,怎麼快速檢視一個物件的相關資訊,如一個表,顯示所有欄位、主鍵、索引、約束等等?最近看越來越多的網路資源,一些要收費,如一個網站提供了專業面試國際大公司的一對一指導服務,全程真題,還有全球20多個著名Web2.0公司的系統設計詳解,也就幾十刀,值得買。說到這裡也給大家推薦一個架構方面的交流學習群:650385180,也是聽之前的同事提起過的,看了一下,內容技術點講解還不錯,裡面也會分享一些資深架構師錄製的視訊錄影:有Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能優化這些成為架構師必備的知識體系。還能領取免費的學習資源,相信對於已經工作和遇到技術瓶頸的碼友,在這個群裡會有你需要的內容。看過很多技術文章,一些網站追求一些非常入門的內容,譬如怎麼做個多級選單,動畫效果,等等,放在首頁,而一些乾貨文章卻被忽視了,悲哀。大部分碼農都只擅長一種技術,所以選擇的時候應該選擇一種不容易被淘汰的技術(中期還是主流的),譬如.net,現在各大平臺都能用而且生命力很強,在上升階段。前端,髒亂差,但學好JavaScript不愁吃穿,圍繞js的各種框架可以學一下主流的。技術是相通的,不同的技術棧,技術思想是相仿甚至一樣的,所謂一理通百理明,所以,有全棧的開發人員,從Web前端一直到後臺、資料儲存,還有所有之間的技術如安全、日誌、佇列等等。即便不睡覺,也不夠時間學習可以學的東西。所以,只能挑食,籠統地學一下大部分新技術,最關鍵核心的,可以深入學一下。技術選擇
爆棧
最近的爭論,懂一個Web前端框架,然後試圖搞定後臺和資料儲存,還有之間存在的各種資料交換、流程處理、安全、擴充套件性、潛在效能問題(各級cache、sharding)等等,很難。因為每個都有太多太多的坑,不把這些坑踩過就說可以搞定全端,有點難度啊。我之前反覆強調我不僅僅是全棧,我還是#爆棧#。技術體系,需要時間去構建,融會貫通。聽過、會寫Hello Kitty、懂用、掌握和精通是不同的,需要多讀多動手,把坑踩了,跌得越痛,認識越深入。上大學的時候,導師用跟我們說過赫胥黎的名言:“learn something of everything, learn everything of something" (儘可能廣泛地涉獵各門學問,並且儘可能深入地擇一鑽研)。我們可以全棧,但起碼有一樣是研究的特別通透的。質量
在程式設計的時候,我們一定要想象一下,以後維護我們自己的程式碼的那個人會成為一個暴力的精神病人,並且,他還知道我們住在哪裡。MVP,對體育運動來說,是most valuable player(最有價值運動員/球員);對開發人員來說,是most valuable professional (最有價值專家);對產品開發來說,是minimum viable product (最簡可行產品)。一些公司開發系統,一開始就勾畫巨集大的願景,幾個月甚至幾年之後,產品還是沒有見蹤影。相反,一些公司追求最小化的可行產品,每個版本只發佈一個新功能。產品質量、功能和時間這三者裡是互斥的。要質量和功能,那麼時間就得延長;追求質量和時間,那麼功能就要砍;趕時間和功能,那麼質量必然下降。看了很多公司的系統,就像在吃蒼蠅。大家看過少林足球,吳孟達樣子和口吻:“程式碼,不是這樣寫的!”怎麼給垃圾系統擦屁股:你被扔了一坨熱氣騰騰的爛程式碼,幸運的話只有幾百萬行,沒有註釋,僅可能有的就是早已過時的文件,寫這些程式碼的爛碼農早已去逍遙快活。公司X,第一天,下班了,累癱,腰痠背痛。首兩週都是各個部門的不同人來介紹公司、各種業務、各個系統,找了幾個機會跟開發團隊聊了一下,順手看了一下他們的開發,具體就不談了。公司業務成功,和開發不是正相關 。很特別是那些行業系統,只要銷售人員足夠強,不管多爛的系統都可以大賣,所以,很多公司的銷售人員收入很高。公司E,硬度公司,公司絕大部分是硬度菊苣,部門都是硬度碼農,除了我。主系統登入頁,老闆要放一個配合公司LOGO的動畫,硬度菊苣就設計了個gif動畫,彩虹波浪線不斷翻滾,但頁面載入很慢,整個視窗響應也很差,滑鼠挪動都有問題,我一查,原來那個gif大小是全螢幕的,超過5兆。。。公司B,客戶端用OLEDB從Visual FoxPro讀到DataTable,序列化到JSON,壓縮,存到Azure BLOB,然後寫相關記錄到Azure Service Bus Queue,伺服器端Service Bus接收到資訊,取相關BLOB,解壓,反序列化,再Bulk Copy到Azure SQL Server的臨時表,再轉換格式化各欄位讀關聯表,最終到達目標表。。。蛋疼的感覺?公司B,巴西碼農,為了格式化法國人名常見的組合名(就是名字中間有-、·、空格等符號後面第一個字母要大寫),他洋洋灑灑寫了80多行程式碼,逐個字母替換,而且為了應付空格,又重複了一遍。。。。公司B, 又優化另一報表,初步加了索引重構邏輯後,從原來超時到現在1分26秒,再分析,發現另外一個瓶頸是引用了這函式,報表先呼叫一個主的人名格式化函式,這函式再多次呼叫上述那函式,重構後,只需要6秒。公司B,挺無語的,部門一碼農,一個流量值(位元組)要格式化顯示成兆,他直接/(1024*1024),根本不明白那些小數就不能顯示了,然後呢,還Round兩位小數,問和尚借梳子啊。公司B,資料庫那塊,簡單地說,就是資料庫規範裡面的第1/2/3正規化都完美地忽略了 。。。前端介面對一些欄位沒有做校驗,所以系統跑的時候各種爆,譬如期望是數值但裡面有各種詭異字元,期望是郵箱地址但是文字。。。日誌那塊,每個方法執行都做一下開始/結束日誌,隨便點幾下介面,幾百K的日誌內容[攤手]我發現,懶/爛碼農,很喜歡複製貼上。公司S,部門一開發人員,擅長複製貼上程式碼,原本幾百行的程式碼,硬生生搞成1萬多行。他說:“我寫程式碼,瘋起來,我自己都害怕!”某天,這個碼農在看自己的程式碼的時候,迷茫了,看不懂了,程式碼邏輯流程太亂。所以,他只能開啟Visio,逐步把邏輯畫出來了。。。[攤手]公司S,系統是asp.net webform + vb.net + 大量第三方重量級UI控制元件,前端、後臺和資料庫效能都很爛,根本不是SaaS,也不支援多伺服器,各種各樣的錯誤。我躊躇滿志地來到公司,第一天就跟大家說:“做開發這麼多年,爛程式碼我看慣了,所以大家放心,不管多爛的程式碼我都可以重構改造的”,3個月後,我歇斯底里地指著螢幕上的爛程式碼,狂叫道:“你們這樣寫程式碼是不人道的!!!”公司S,系統各種問題,效能表現差強人意。其中一個表現是,越越來越慢,譬如同一個功能,所以引數一樣,今天跑5秒,後天6秒,大後天7秒這樣。。。最後發現還是跟我之前優化的日誌有關,雖然改成非同步批處理,但是日誌基於檔案,每個最大2M,不斷翻滾,日誌檔名邏輯是掃描所有檔案來取下一個檔名。公司S,一天,分析了一下資料庫,一個客戶7天做了150萬次資料庫讀操作,約讀取了200G資料,加上前端那些Web Form冗餘HTML,實際從伺服器上走出的資料是很誇張的(按我司的規模),資料庫請求延遲更厲害,一個客戶每次請求都要等0.2秒。公司S,存在多個業務邏輯錯誤問題。客戶反映資料有問題,部門的同事分析資料和程式碼,最後發現關鍵邏輯是讀的配置檔案,而這個配置是應該按具體客戶的設定來的,但變數寫成了static。公司S,系統執行時大量日誌生成,同步寫入日誌檔案,我改成了非同步。還有,每個頁面載入完成,都記錄一下使用者的IP、載入開始時間、載入結束時間等資訊,也是同步的,加上其它業務邏輯寫得不行,所以很忙,我也改成了非同步,定時批量寫入日誌。一些公司的碼農,不把警告當警告,完全無視之。公司S,主系統,編譯的時候,顯示254個警告,不能再顯示更多了。公司S,下班前,每週五全員工公司例會中,一個IT部的同事問我:“Wilson,你們部門是否會把機器學習應用起來”,我心想:“你們連資料倉庫都沒做,所謂商業智慧這只是做了些基本報表,資料量也不是很大,我以前隨便處理都是幾十億起跳的,還想機器學習???” 然而,我還是老實說:“大家知道Google alphago嗎?就是最近打敗了最牛的圍棋手的人工智慧系統?”。沒人回答。我繼續“我們寫程式,是直接解決問題。機器學習,是我們寫一個邏輯,讓機器其去利用現有的資料進行分析找出最優方案,這是非直接解決問題,”資料從使用者在介面輸入開始生命週期,經過傳輸到達網站,經過處理(譬如ETL),再存到資料庫,後續還可能有資料倉庫二次處理等,最後資料失效被刪除。這中間很多事情需要做,但,最重要的第一步,是確保使用者輸入是校驗過的合法資料,否則進入系統後造成連鎖反應,修復成本太高。我服務過的很多公司,介面輸入缺乏基本的校驗,譬如長度,使用者輸入長一點就爆了。郵件格式也不判斷,系統傳送郵件的時候各種爆。公司S,系統設計有問題,實現有問題,運作有問題。拿各種通知客戶的定期報表郵件,地址完全不校驗,同一個客戶出現幾十種的郵箱域名,譬如正確的是foo.com.au,實際出現:foocoma.u, foo.com,foa.com.au, foo.com.....,一些明顯是不合法的格式,一些是不存在的域名,等等,傳送的時候也不校驗[攤手]公司X,系統各種安全漏洞,SQL注入輕而易舉。遇到過各種奇葩軟體/系統設計,譬如LinkedIn Android版,經常告訴你無法傳送內容,不告訴你為什麼,之前打的長長內容都丟了,根本草稿等臨存功能。一些銀行的app,允許你增加、減少每日轉賬額度,但根本不告訴你要增加到多少或者減少到多少[攤手]。公司S,現有的系統10多年前開始寫的,技術陳腐,其中一個功能是根據不同客戶不同產品從可自定義模板那裡動態生成表單,這個功能是用的第三方的,本來不復雜,但隨著業務發展,現在單純渲染介面的程式碼行超過10,000。我在用angular改造,目前程式碼行200,可以顯示了,接下來就是做一些互動[攤手] 。公司S,Web系統性能差,有幾個原因,其中一個,是HTTP壓縮都沒有啟用,頁面/資源載入都要用較長時間,我發現之後,順手啟用了[攤手]公司K,系統的資料庫設計很多奇葩的事情,就命名這塊就看不下,使用者標識(UserId)這個,同一個資料庫裡有以下各種形式:UserId、UserID、user_id、userid、iduser、USERID、id_user等,而且大部分是同一個人搞的 。公司E,隔三差五發現公司印度菊苣們寫的程式碼好多坑,譬如前端js肯定就不判斷物件是否null,直接取屬性,然後後續的程式碼都無法跑了。後端的程式碼更奇葩,直接try/catch抑制錯誤(catch無任何邏輯),今天發現一功能無法跑,分析後發現,資料庫表字段型別是nvarchar,程式碼裡定義是int,菊苣不解決抑制錯誤就完了這麼多年來,各種平臺,看見過各種軟體的奇葩實現。公司Z,現在的業務系統,一個複雜的申請流程,所有資料都暫時儲存到cookies,今天終於爆了,客戶的一個下單JSON後超過4k,boooom!寫爛程式碼的人多用舊版本的語言,這樣他們就能名正言順地不用新版本的語法糖來精簡程式碼。譬如c♯的自動屬性,expression body、LINQ等,他們都不會用。更噁心的是重新發明更爛的輪子,數值TryParse、DayOfWeek等重搞,最噁心的是壓制錯誤:一個物件幾十個屬性,不判斷null,幾十個try/catch逐個屬性輪 。公司A,資料庫這塊,因為某GIS產品Web服務的特點,把資料庫分割為:每個客戶3個數據庫,然後呢。。。然後伺服器就幾十個資料庫。。。。其實做到一個數據庫是沒有什麼難度的。。。。可以預見以後各種血淚 。公司A, 開發這塊。。。之前弄過Windows Mobile,後來用Sharepoint(怨念!) + Silverlight(怨念!!)。。。。。加上某GIS產品+.NET外掛(啊啊啊),現在在上馬#WPF#(怨念!!!),然後準備招聘iOS開發人員和Android開發人員(啊啊啊啊。。。公司A, 做的產品主要是基於GIS的產品,給服務人員提供地理任務標註/指示,然後開展工作。然後呢。。。。#沒有自己寫的伺服器端#,#不直接存取資料庫#,完全用某GIS產品提供的Web服務。。。。然後效能各種爆。。。。。。。公司A,是典型的傳統使用微軟產品的企業,IT/基礎設施這塊都是AD/exchange server/SCCM等,最近弄了個JSP寫的helpdesk系統,所有東西都往那裡扔,連新產品/新專案/改進都放那裡,還包括bug管理。。。公司B, 系統是Web應用,引用了大量的第三方Web前端程式碼,超過2500個JavaScript、CSS檔案。。。。每次釋出要等好久好久。。。其實絕大部分都不需要用到,就是硬度碼農買1送10地狂塞進去,而且grunt build那套也不用,開啟首頁的時間都夠我去找菲律賓妹子了公司B, 相比上一家公司,這公司的產品狀況要好很多(儘管很多問題)。上一家公司的產品我接手之前只是基於第三方產品做擴充套件,完全不是自主智慧財產權,午飯商業化,我從頭寫,大半年完成,比第三方產品還好很多功能多很多。好歹現在的直接自主產權,技術較新,但坑多。公司B, 這公司是和這行業的領先者之一合股搞的SaaS解決方案,軟體+硬體結合,市場很大,不過,合股公司總部就是倉庫,大家繞著會議桌開發,旁邊的沙發坐了一堆五湖四海的合股公司員工吃各種風味的午飯。。。新公司的工作場所還在裝修,隔壁,其實還是倉庫改造。。。公司B, 需要使用的第三方系統,其市場佔有率超過50%,但用的Visual FoxPro開發。。。。。。。。因為官方沒提供API,我們的玩法是直接逆向工程資料結構然後自行山寨業務邏輯玩弄資料。。。。。、、公司B, 8個硬度碼農(已經炒掉5個)做出來的web系統,後臺ASP.NET MVC+nhibernate。。。每個controller都automapper create一次map。。。還直接資料CRUD。。。前端angularjs,每個controller直接http req。。。各種null ref問題。。。公司A, 我發現了,程式碼的質量很差,主要原因是:大量複製貼上、反覆操作(譬如反覆的獲取同一個值做而不是讀一次做變數)、冗餘的迴圈、沒有使用較新的語法糖(譬如lambda)而自行弄10多行程式碼實現一行LINQ搞定的、很多情況都沒考慮大小寫敏感,強行catch異常而不是判斷公司A, 入職一個半月,發現前任挖了很多很大的坑,一些短期內無法填,一些長期也無法填,怎麼辦?逐步填,一天填一個唄。公司A, 開發,是典型的四無:無設計、無文件、無規範、無流程,無法無天(噢,五無了)。資料庫設計亂七八糟,效能極渣,處理幾百萬資料的ETL也要跑幾個小時,還會記憶體耗盡(32G)。。。。程式碼那個更無法吐槽。公司A, 產品用的C#開發,Visual Studio做IDE,程式碼管理用的SVN,陳腐得很。產品開發還是waterfall,新版本釋出用windows登入觸發複製更新,無力吐槽。。。給CIO建議,改用Visual Studio Online,搭配scrum,專案管理/程式碼控制關聯起來,這只是第一步,還有很多需要做。公司A, 雖然不同州不同客戶不同的業務需求,但絕大部分業務/邏輯是一樣的,完全可以把基礎部分標準化,但是呢,現在的做法是每個客戶單獨有3個數據庫。。。每次基礎功能/邏輯更新,就要更新幾十個資料庫。。。公司A, 資料庫的更新允許通過sharepoint修改任意記錄,然後呢,沒有後臺邏輯封裝,然後呢,一些表大量觸發器,一些觸發器幾百行程式碼。。。公司A,產品的日常資料檢視/修改,除了專門的管理工具/客戶端,還可以通過sharepoint來,有一個自定義的資料列表WebPart來繫結一個數據源,還有一個數據編輯WebPart,根據PK來更新資料,竟然允許直接修改任意記錄。。。。。沒有後臺邏輯,沒有儲存過程。。。我靠公司A, 系統的部分資料匯出和通知是用的python指令碼,質量放一邊(容錯、複製/貼上等),產品環境根本就沒成功跑動過,一個月多月了,沒有人去排錯。。。今天開會,我一下子就找到問題了,print組合輸出某資料庫值null。。公司S,審查程式碼,發現多個地方都出現一個詭異的邏輯,檔案輸出的時候,定義編碼是GB2312,我跟寫程式碼的碼農說:“可是,咱們不在中國啊[攤手],而且,那可是10多年前的做法啊[捂臉] 。職業與事業
現實
鐵打的營盤流水的兵,大家都是可以被拋棄的卒子,不想成為邊角料,就要不斷提升自我。職場如古代的歡場,上班族都是出來賣的小姐,區別是一些天生麗質技術過人的成了頭牌、花魁,日子自然滋潤,如果碰上要麼色中惡鬼的土豪劣紳或一見鍾情的傻情郎給之贖身(大量股票&公司上市),那就可以安穩過下半輩子。否則等到徐娘半老只能被拋棄。少數早早財務自由,轉個身,還是做了老鴇(老闆)職場如古代的後宮,上班族都是佳麗,區別是一些天生麗質技術過人的成了各級妃嬪,日子自然滋潤,如果碰上皇上寵幸,成為高人幾等的貴妃(大量股票&公司上市),如果懷上龍種誕下皇子,那就可以成為寵妃甚至皇后(技術帶頭人)。否則等到徐娘半老只能被拋棄。少數早早財務自由,拿個封地自立為王(老闆)。追求
如果人沒有理想,那和鹹魚有什麼區別?我不是普通碼農,我是傳說中的那種10x碼農,效率是普通碼農的10倍,但我的待遇是普通碼農的10倍嗎?不是。所以,我今天還得起床去搬磚。出汙泥而不染,濯清漣而不妖,用這個來形容我每日在爛程式碼的槍林彈雨中匍匐前進而倖存下來,挺適合的。追求,除了程式碼質量,還有崗位,和待遇。我那“離職公司就上市”段子大家都知道了,我經歷過幾次,2次錯過,1次主動放棄。中午請公司Z的技術總監吃飯,他是老員工,整個系統主要是他搞起來的,公司最近拿了幾億刀的授信,市值是1.85億刀,但公司只給了他價值6萬的刀股票。另外一個所謂的CIO,來了沒多久,沒啥大貢獻,但他要求不拿工資換股份,現在有4%,價值約740萬刀 。追求,就是不甘於只完成任務,而是要做得更多。多年前,因為要監控不同公司的不同系統執行狀態,寫過多個針對性的監控程式。做過一個分散式計算,c井寫的,RESTful API通訊,cluster server傳送計算模組(動態的c井程式碼)到所有tenants,每個tenant跑完程式碼結果送回server,就是map reduce的過程。這種模式,可以做很多事情,譬如以前做過分散式查詢,任意客戶端(臺式電腦、手機等等)查詢結果然後彙總 。做監控系統,遇到狀況就觸發條件然後通知相關人。後來改用第三方的,譬如Nagios,再後來,改用雲服務。以前用過monitis.com ,還行,現在公司要這個功能,所以再做了比較,發現還monitis最適合 。做公司S,我發現公司沒有這種監控系統,我主動做了出來,效果很好,找出不少問題,damage control比以前好多了。剛才監控到實體記憶體突然佔用多了600M,分析後發現一個業務邏輯把整個資料表取出來在記憶體出來,空間佔用1.6G。這就是追求。公司S,花了些時間,給公司的系統做了個高度可配置的資料歸檔功能,可以指定任意來源和目標伺服器、資料庫、業務表、資料記錄條件等,自動建立目標資料庫、表,完了自動備份壓縮、遷移等等,這個,是之前沒有人能做出來的。這就是追求。公司S,主系統存在10多年了,當年沒啥設計,功能逐步堆砌。存在各種問題,效能問題尤為突出。主業務是各種資料的ETL,大部分邏輯都是逐條記錄寫入、更新到資料庫。譬如插入1萬條記錄,需要2分鐘。我改成批量的,0.4秒。。。還是太慢了[攤手]。這就是追求。雖然我是爆棧,我偏好寫後臺邏輯程式碼,因為前端程式碼,好歹還得跑一下minify和uglify步驟,這樣別人才看不清你寫的程式碼有多爛。畢竟,系統慢,你可以說是硬體差不是你程式碼爛。其實,我還是都寫得很好的。這就是追求。公司S,生產環境有備份(第三方的備份SQL server的備份檔案),但備份是一筆糊塗賬,譬如隨機抽查嘗試還原,居然能告訴我那天的備份失敗了[攤手]怎麼沒人通知??然後呢,換一天,資料庫本身的備份也失敗了,然而還是沒有設定通知[攤手]我看不下去,給備份結果做了通知,然後給之前寫的系統監控加了相關監控 。這就是追求。現在上班每天還是堅持做些研發和寫寫程式碼,最近在做系統監控的功能,全套, 爆棧,從前端(angularjs等)到伺服器(asp.net MVC+Web API等),從客戶端(Windows service) 到資料庫(SQL Server等),每個模組都儘量針對接下來做新產品要用到的技術的最佳實踐進行演示,程式設計規範等等都儘量覆蓋,給大家學習。這就是追求。公司S,一天,所有網站服務全部停擺。查自己寫的log沒發現,檢視IIS網站在跑,但應用程式池停,啟動再開啟網站,還是不行,池還是停,如此反覆,排查系統日誌,池停止是因為hips模組無法載入,追蹤是外包的IT服務公司擅自在工作時間安裝McAfee防毒軟體,給IIS加模組,IT解除安裝防毒軟體還不行,最後只能由我解決。這就是追求。公司S,每週開個workshop,主要說現有程式碼的問題和怎麼優化,還有各種場景的優化辦法和高效演算法,給出benchmark,一些快幾倍,一些幾十倍,一些上百倍。還在ASP.NET Web API的基礎上搭了個Web服務框架,支援token,流量控制等,寫得好爽 。這就是追求。我們心態不應該bottle half empty,而是half full,就是要樂觀。我眼中的坑,是潛力,我發揮的機會,坑越大越好。我吐槽了那麼多,都是我遇到並修正的。老油條
我對老油條愛恨交加。公司S,我面試的時候,老闆說公司要把現有老系統做成SaaS,隊伍很成熟,看了一下該公司領英員工列表,初創員工從最開始到現在11年多了,沒離開過。成熟,換言之,就是革新的阻力大,老員工舒舒服服的,不會關心什麼新技術,更不喜歡空降一個上司來找他們麻煩。如果你是老員工,你怎麼辦?如果你是空降那個,怎麼辦 ?公司S,幾個老油條,經常請病假,曾經有人一個月請三次病假,完全是濫用。有一家公司,做了20多年,積累了大量程式碼,超過2000萬行,其中,大量重複發明的輪子,基礎元件如譬如O/RM和XML序列化等,大模組如ERP等,無所不包,相當佩服,好處是,你有藉口入職後1年才開始瞭解系統,之後,也可以安心做老油條養老,因為你寫的程式碼沒多少人看得懂。公司A,我接替的那個研發經理將於3周內離職,問他拿系統架構設計、流程圖、資料庫設計、技術規範等等所有文件,全無!那好,讓他講解一下,他讓我直接看程式碼和用資料庫diagram看錶關係。。。我靠,系統設計僅僅就是表關係嗎?相當的無語。。。職業道德
這些年來聽過不少朋友吐槽各種奇葩遭遇,我之前也遇到過不少。公司X,用Java的,其是給南航做訂票系統的,後來老闆跑了,沒發工資,大家都回公司搶電腦填工資。公司H,一個從廣州靈狐(還有人記得嗎?)來的碼農同事離職,破壞分割槽然後格式化磁碟了,還拆開機箱,拔了電源線和資料線。一個公司僱用一個員工成本挺高的,找獵頭就要給一個半月的工資,基本工資,養老金,各種保險,工作環境(租金),裝置,培訓,年假,病假,每年加薪、獎金,平均算下來是基本工資的150%甚至更多。所以,我幹活都很努力,對得起這份工資。時刻站好崗,不過不需要像之前帶病工作了,也不需要第一個來上班,最後的那幫人走。早9晚5,把工作都做完就行了。公司S,部門會議,8個碼農,30個任務,部門的碼農狂塞任務給我,我要做10多個。。。我vs都沒,程式碼訪問許可權都沒,業務邏輯都沒掌握,就讓我做事情,一些任務還是有難度的,譬如很籠統的系統優化,我還是堅持去做了。公司S,資料安全很嚴格,除了一般的過濾和監控等,每個員工都是從本機使用自己的賬號遠端桌面到伺服器上做日常工作,譬如收發郵件、讀寫文件、使用公司的系統等,這種做法還真是第一次見 。公司這樣做,無非就是想大家遵守職業道德,但如果不尊重的情況下,可以知道並且行動。公司C,我離職的時候被部門經理冤枉我破壞伺服器,一個多月的工資沒發我,後來他們發現是部門經理搞鬼。這個部門經理還把原始碼放自己的手提每天帶回家,要挾老闆給他股份。幾年後,公司還發現這個部門經理偷偷賣公司的系統原始碼,把他給炒了,但公司還厚顏無恥地找我回去主持開發部。公司T,我離職了,幾年後,跟我一起呆過的技術負責人,聯絡我,說他現在手上有當年的系統的原始碼,問我有沒有興趣一起搞搞賣錢。健康
身體是革命的本錢。沒有健康的身體,工作效率和質量要打折。舉個梨子,我這些年來身體每況愈下,先後有脫髮、肩周炎、手腕痛、頸椎病、腰椎間盤突出、慢性胃炎、腎結石(三次入急診)等等。因為長期病痛,必然會導致工作時不能全神貫注,所以產出量自然要降,而且質量也可能存在問題。我工作10多年,只請過幾次病假,要麼是因為要去急診,要麼是頸椎病發作嚴重無法思考。現在回頭看,覺得自己不需要這樣拼命。該請病假就請病假,對自己好點。我現在是上班工作,出賣勞動力,而不是出賣性命。你垮了,甚至掛了,你全家人怎麼辦?老闆給你的工資中是不包括這個的。古代,那些賣唱的女子,碰到無恥之徒,會說:“請客官放尊重點,小女子只賣藝,不賣身!”。現在,我也應該說:“老闆,請你尊重勞動合同,我每天只賣藝8小時,不賣腎。”。當然了,如果老闆給的錢足夠多(非常非常多),那,我就不管你今晚來的多少人,來的是不是人了。加薪升職與待遇
加薪,還得看加多少,很多時候,僅僅是隨著通貨膨脹率加一點,一些時候還不怎麼加。加得多的,一般是公司看重的而且是呆得久,升職尤甚。蹲坑久了,一般人加薪升職是不如那些跳槽的。當然,如果你運氣好,公司上市,你又拿到可觀的股票期權,那另當別論。離職,和談得來的其它部門的同事喝酒,他在這個公司呆了10年,看著它的變化。他說:“我知道這個公司很多問題,很多混帳的人,我每天只能逐一應付,日子就這樣過去了,儘管一些生活我會忍不住爆粗,老闆待我不薄,所以我沒有找別的公司。”,這個待我不薄,其實就是加薪升職,他從畢業實習生一直做到經理。但是,職業生涯,是一個金字塔,底層的是絕大多數,往上層次/崗位的越來越少。所以,不可能大家都當上高階工程師、經理、主管甚至CTO。在中國,很多公司為員工逃稅,把工資造低,大家倒手的錢是多了,但長遠看,未必,因為帳目收入低了,公司給你的養老金自然會低,你自己給的養老金自然也低。我在中國工作7年,移民澳洲的時候退保,個人部分才拿回1萬多元人民幣。來澳洲剛剛滿7年,養老金是中國的40倍,不逃稅。典故
公司A,IT經理,樣子是典型的猶太人(就是那種大鬍子),後來一問,人家說是英格蘭+蘇格蘭裔的澳洲人。。。我代替的那個研發經理,是不丹人,祖母是廣東人。。。部門的開發人員之一是日本人,英文名跟中文拼音一樣。。。另外有一個開發人員是上海人。公司K,我是劊子手。公司人員流動率高,新員工入職,老員工離職,都需要一系列的流程,我做的hr業務中有一個功能:自動化入職和離職流程。每當監控系統中顯示今天要離職的人員,我就有深深的罪惡感。。。。監控系統只是顯示的人員不斷變化(入職離職),但背後是有血有肉的人啊。。公司T,大學還沒有畢業,就在這裡混了,然後跟著公司去了深圳蛇口,公司就在女媧補天像旁邊的大廈,當年那裡是海邊,現在那個地方都成市中心了吧?下班後,大家去樓下的大排檔喝深圳土產的金威啤酒,晚上大家就在公司裡的一個小房間裡的擠著睡。女碼農,大家覺得又少又神奇,是吧?公司T,遇到了兩個女碼農,一個在幾年後成為了另外一個該公司的男同事的老婆。另外一個,成了我的女朋友,當年是很開心的,有共同語言,愛的死去活來,(這裡省略大量兒童不宜的內容)。後來,與她糾纏不休的前男友來攪和,她讓我走,我心有不甘,但尊重她的決定,多年之後,她讀了大學,用上了C,去了銀行搞大型機,再幾年後,找了個同鄉,回去組建家庭,生了孩子,沒再從事碼農事業,(這裡省略大量各種哀怨)。公司H,另外一個女碼農,水平還行,但不大喜歡接受新技術,我推薦的新東西她都沒有采用,不過,我還是在這家公司呆了我職業生涯最長的時間,超過5年,直到我要離開中國移民澳洲。公司T,上述的同事夫婦,3年前帶上全家來澳洲,他讀碩士,說是曲線移民。畢業後,因為,他的原話:“我只是不想別人給我的時間定價”,憤而回深圳發展。對了,當年我們分別離職之後,我在廣州買房,他在深圳買房,都才是50萬左右的兩房,現在他的房子快1000萬了。注意!前方高能!!!職場,是泡妞的好地方。公司A,前臺真漂亮啊,目測很年輕,20歲左右的樣子,貌似是混血的,哎呀。公司H,我遇到了一個女神,真心漂亮,一見傾心那種,我就對她展開了追求。後來發現已婚了的部門經理對她也有興趣,在各種電影中才會發生的經歷之後,(這裡省略大量兒童不宜的內容) ,她成了我的兩個孩子的媽!事業/經驗
說起做技術的人事業演進路線,一般分三條。大家都是從初級碼農開始,到中級碼農,高階碼農,然後開始分:1、tech lead / principle developer → architect → senior architect → chief architect → CTO;2、team lead → development manager → senior / technical manager → VP of engineering。如果還要細分architect的話,還可以這樣:application/software architect → solution architect → enterprise architect ,每個都有junior/mid/senior/chief級別。說起架構師,我覺得沒有多年實際動手經驗,畢業就上來做架構師的,真正做成功的屬於鳳毛麟角,大部分都是扯蛋。為什麼需要資深(老)碼農?為什麼需要架構師?一個誤區:把現有系統扔到AWS/azure/GCP這樣的公有云是簡單的lift and shift,但實際上遠遠不是這樣,譬如一個公司的業務要列印快遞公司的那些標籤,就不能完全在雲裡面跑了。資深碼農,經過多年的實戰經歷的錘鍊,掌握的技術廣度和深度都是新人無法比擬的。簡單來說,老碼農踩過的坑,都是血淚換回來的,你願意讓缺乏經驗的人再去拿公司來玩笑嗎?找工作
獵頭/中介
大部分獵頭都很爛,大部分獵頭都很爛,大部分獵頭都很爛,#重要的事情要說三遍#。獵頭,就是把人力資源當牲口那樣販賣,他們所謂的Cherry picking,很爛,因為沒有背景知識,他們亂來地強塞給你一個崗位,騷擾你,或者你投了很多份簡歷,就是不理睬你,儘管你非常符合甚至over qualified。更搞笑的是,我去找工作,他們倒過來給我推銷碼農。獵頭乾的是買賣牲口的工作,澳洲的招聘工作,大部分是都是企業通過中介來發布的,但絕大部分中介很爛,根本不懂行業知識,不懂的分應聘者水平高低。我之前找工作,大部分中介都不理睬我,但知道我當上研發經理後,經常騷擾我,強力給我推薦他們手頭上的應聘者。很多時候,聯絡了獵頭,然後,就沒然後了。獵頭不靠譜,獵頭不靠譜,獵頭不靠譜,重要的事情必須說三遍 。獵頭/中介真的不懂技術的,今天有個獵頭,多次來回郵件,每次都問一個技術/工具。譬如微軟的team foundation server,讓我深入說明這個東西。要不要我說說怎麼配置continuous integration啊,要不要我說說vs agent的引數啊 ?試過面一個多月前面的一家公司,沒潛力,推了。接下來這個故公司換了幾家獵頭來投放廣告,我都發了簡歷(難以分辨是非同一家公司),獵頭問技術問題的時候,總會問同一個問題,每當問這個問題,我就心裡想:靠。。。又是這家公司。曾經看見一份工作,投了簡歷,和獵頭來幾個來回郵件電話交流後,無疾而終(中介沒回復)。大半年後同一個公司同一個職位(招聘廣告不會列明公司),同樣一個獵頭,幾個來回後沒下文。之後,同一個獵頭,主動找我,還是同一個公司同一個職位。剛來澳洲的時候,找啥工作,獵頭都會問你有沒有本地經驗(local experience)。找來找去沒找到合適的,只能重新從低做起。最搞笑的一個真實故事:一個英國人,做了20年,來澳洲找工作,獵頭還是說:你沒有本地經驗。獵頭,很多沒知識不說,純粹浪費時間,沒有面試機會,還找你去面對面聊天 ,還為了不對口的技術騷擾你,還讓你去做初級碼農。澳洲市場很小,獵頭很傻B。剛才一獵頭找我,職位是我上一家公司的首席架構師,她根本沒看我的簡歷,如果看了,就不會找我了。一些獵頭真是厚顏無恥啊,群發垃圾郵件就算了,我回復:“你這職位我很多年前已經不找了,更新一下你的系統吧”,今天直接電話騷擾我,問了一串問題,我強調我剛找到perm工作,不會換,她還死纏爛打問我工作內容什麼的,我說我在開會,她說:那麼我明天再電話你吧。我說:郵件聯絡,別電話我了。某公司要招一個全棧碼農,最後在領英上找到了一個技術極度全面的,上班後才發現,原來他是個獵頭。#一個獵頭寫什麼狗屁掌握技術 某公司要招一個全棧碼農,最後在領英上找到了一個技術極度全面的,上班後才發現,原來他是個獵頭。#一個獵頭寫什麼狗屁掌握技術# 。有一次,被獵頭騷擾,LinkedIn上加了我,一看就知道是昨晚我忽略的一個工作機會,他打電話過來,工作需要常飛去越南搞外包團隊,待遇還比我現在低,一聽到我沒興趣,馬上掛電話。。。基本禮貌啊 。曾有一次,獵頭騷擾,在招聘網站找到我的簡歷,花了半個小時,強推一個用Java、RoR的公司的崗位,待遇比我現在還低,然後呢,我竟然同意去面試了。找到工作之後,經常有獵頭直接打電話到我們公司的技術支援來找我,強推他們手上的碼農,我上司接的電話,上司一臉詭異地看著我,以為我在找工作(雖然我實際上是。。。)我投簡歷,獵頭不鳥我,現在倒過來給我找麻煩。一次,公司的技術支援電話響起來了,女QA接電話,然後轉過頭來對著我詭異地笑了,說找我的,我納悶誰會用這個號碼找我,問是誰,女QA說是獵頭,當時就驚出一身冷汗 。還有一次,獵頭來電,說:“喂,我們有一個很適合你的崗位!”,我說:“哦?說來聽聽。”,獵頭:“你擅長.NET,對吧?”,我說:“嗯。”,她說:”那JAVA呢?“,我心裡一咯噔。。。mmmmm,她繼續:“還有PHP呢?”,我馬上說:“負分滾粗!”有一個獵頭來電:"現在有一家大資料處理公司,需要SQL Server專家,你來不?",我:“好啊,我馬上辭職。”,上班第一天,SQL Server正在Linux上歡快地跑著。曾經有一次,獵頭來電,上司在和我討論容災設計,我迅速拿起電話說我要接這個電話,以防Google又自動顯示未知號碼是哪個招聘公司。這已經不是第一次了,上司那麼聰明,肯定知道我。曾經有兩個美國獵頭找我去美國工作,用的是澳洲公民特有的E3簽證,我說我希望是H1B簽證,這樣我可以留在美國,然後,就沒然後了。一獵頭讓我做一個ASP.NET的線上測試,IKM的,50來個問題,內容真是服,一大堆過時的ASP.NET Web Form技術細節,連web.config配置裡某屬性的名字都要搞幾個typo來考,還包括SharePoint開發的,MVC的只有寥寥幾個routing問題,越做越哭笑不得,完成那一刻仰天長嘆:世界那麼大,我還是。。。 做完後不爽,寫了郵件給獵頭,痛斥這個測試問題多,和現在的技術嚴重脫節,這些老技術沒什麼人用的了,還說測試太長,沒多少人會願意做完。。。。。傳送之後,意識到這獵頭不會再聯絡我了。。。曾經有獵頭打電話來,問我昨天面試怎麼樣了,知道我對那份工作不大感興趣,就直接問我所有記得的面試題目,這樣她就可以給下一個應聘者提高成功率。 獵頭推薦的3個應聘者,兩個掛了,我說對這職位不大滿意,她說跟招聘公司聯絡一下看看結果先,然後呢,沒跟我打招呼,剛才靜悄悄地再發了一個新的招聘廣告。悉尼有大量獵頭中介,大部分丟很爛,做垃圾的一間叫progressive,垃圾中的戰鬥機,各個員工輪流通過系統傳送一樣的郵件給你推送完全不合適的崗位,剛開始我都老實回覆郵件說崗位不對口沒興趣,他們都不理睬照樣發。還打電話騷擾你,一些是看中我做經理所以推薦他們手上的人,一些是推不合適崗位給我 。最近幾年,和獵頭的互動,發生了可笑的變化。以前他們找我,基本上是推銷比我現在崗位職稱低、薪酬少的工作,現在呢,推銷他們手頭上的那些找工作的人給我,因為他們發現我是研發經理,除了電話騷擾,還在領英上私信騷擾。#我只想安靜地找個工作#。雞蛋不能放到同一個籃子裡。同理,公司招聘,通過獵頭髮廣告,很多會找多個獵頭,漁翁廣撒網。不過招聘廣告絕大部分不會透露公司名字,應聘者難以分別,所以會經常造成通過不同獵頭投同一個崗位的情況,這過程常會出現不愉快的經歷 。曾經遇到過一個混血獵頭,母親臺灣人,真心漂亮,模特級別的,美!後來去了澳洲最大的銀行做人力資源,最近懷孕休產假去了。。。總結一下這些年來面試心得:中介(獵頭)大多不(就)靠(是)譜(豬),買賣雙方多會避(造)重(假)就(注)輕(水),正常工作時間基(加)本(班)是(沒)不(工)多(資),隊友水平參(大)差(多)不(很)齊(爛),開發很(毫)有(無)規(章)範(法),產品質量有(別)保(逗)障(了)。。。應聘
我是程式碼浪人,不在打靶路上,就在被打靶的面試中。我夢想有那麼一天,終於不再需要打靶了,為自己工作,當老闆。在澳洲找工作,要金睛火眼,打的是perm職位,其實是合同工/臨時工,打的是悉尼地區,其實可能是墨爾本、黃金海岸、紐西蘭、新加坡、英國,還看見一個奇葩的:曼谷。這還不算,最好玩的是看見一個是 不丹 。公司B,面試中,和公司領導之一聊了一個小時。原來年初才加入的那個穆斯林技術負責人要離職了,其餘的開發人員也打算幹掉或者已經離職,現在有個5人的海外硬度團隊,產品嚴重拖延交付,公司允許把現有的系統推倒重來,我上任後先是重建團隊,再考慮重寫還是繼續改現有的半成品。應聘過程中,免不了要做各種測試。大家還記得那個反向二叉樹的段子吧?寫演算法和實際問題解決能力,這個還是因人而異的。單純強調演算法不靠譜,畢竟,實際開發,很多情況下是需要糾結具體演算法的,有需要的時候就Google。我覺得更應該強調實際解決問題的能力。曾經遇到過一面試官問我Sharding是啥。我沒聽過Sharding這個詞,所以說不知道,後來才知道就是資料庫的分庫/partitioning。一次,打靶,真的被爆了。那個在微軟幹過的,兩鬢有白髮了,架構師,問了我一大堆的設計/架構問題,簡單的,複雜的,最後讓我在白板馬上設計同時支援幾百萬人線上的系統。結束之前問他在微軟做得怎麼樣,visual studio還有你的程式碼嗎?每次打完靶,覺得都被掏空了,又要重新填充一下全新的計劃,這種迭代,不肯定是螺旋式上升的,還是原地踏步 。不過,我習慣了每次做完面試題目,回家就覆盤,把所有問題都寫下來,重新做一次,總結。好幾次面試過程中,遇到到了不懂的技術問題,別面試官質疑我的能力,當時是很無地自容的,但最關鍵的是,我知恥而後勇,把不懂的都學會了。簡歷
被國內碼農尊稱為高司令的Java之父James Gosling,這些年來簡歷只有一行字:Father of Java。這種級別的簡歷,也只有10來個重量級語言的創造者才有這底氣,當然,那些作業系統創造者們則是天外飛仙了。悲哀的是,很多人簡歷作假。這些人造假,一些原因是因為自身水平/經驗不行,一些是因為獵頭只給一份簡歷3分鐘時間,用的關鍵字自動掃描,大家無法突圍而出。但是,我強烈建議大家簡歷還是要短小精悍,最有價值的東西放首頁突出位置,不要造假,不要動輒精通,用實際例子和數字來說話。說到底,簡歷只是敲門磚,只能讓你獲取面試機會,面試中的表現,還是看過人的水平。面試別人
公司C,當年畢業沒多久,年少氣盛,技術負責人不在,我代替他去面試一個新的開發人員,對方經驗比我豐富,我問問題也不含糊,追根究底,他耐不住了,就直接說:“算了,就這樣吧,我走了”。。。。一公司招聘開發人員,在10多個應聘者中,我堅持並最終選華人。其實最後一輪有2個,第二個是印度人。這個面試的印度的開發人員跟我之前的見識的類似(只是說見識過,沒說全部,以事論事)。面試不是一個對等的過程。面試官可以出任意問題,事無鉅細均可,面試者能做的就是基本功要紮實,然後針對崗位準備一下相關技術問題。我看過幾篇老外的文章,痛斥面試過程中種種不是,說其是絕壁無聊,蛋疼沒用,慘無人道的。面試就是相親的過程,雙方都在扯談,都會注水。應聘者會吹一些沒掌握好甚至完全不懂的東西。面試官會吹公司情況怎麼這麼好。辭職
原因/理由
辭職的原因可以很多,最主要的原因,其實就是:“老子做得不爽”。這個不爽,可以很多有很多原因:- 待遇不滿意
- 職位升遷不夠快
- 豬隊友
- 辦公室政治鬥爭