1. 程式人生 > >靈感之源之十多年技術人生的經驗與心得

靈感之源之十多年技術人生的經驗與心得

我是個碼農,在職場幹了多年,在超過10個公司服務過,遇到過各種怪現狀,拍案驚奇葩,不吐不快,太想寫篇文章吐槽一下。

這篇文章彙集了我10多年來的工作中遇到的各種經歷,總結的心得,分別討論了團隊與協作(同事/領導/客戶的交流)、技術與質量(學習、技術選擇、質量)、職業與事業(現實、追求、老油條、職業道德、典故、事業/經驗)、找工作(獵頭/中介、應聘、簡歷、面試別人)、辭職(原因/理由、信任)等,乾貨滿滿的,裡面還夾帶了我的很多祕密和典故,如果你認真看,會回來找我讚的!!!

如果你非要叫我跑龍套碼農,請不要在前面加個死字,謝謝。

我在中國讀的大學,工作了7年之後,移民到了澳洲,文中的經歷,一部分是中國的,剩下的都是在澳洲遇到的。

下面的文章夾雜了不少英文,那是因為這些文字都是我在澳洲寫的,習慣而已,不是你們想象中的所謂裝逼,謝謝。

本文是我的個人經歷和意見,請取濾網三錢,溫水煎,和著服用,謝謝。

協作與交流

入職

不管你在以前多厲害,有多豐富的經驗,去到新公司,都要重新學習,撇開業務邏輯,我們還需要學新的編碼規範(不管你是否認同)、開發流程與守則、工具等等,更耗時的,是理解他們的開發框架,每個公司都有自己的一套(很多可能重複發明了了輪子)。

心態很重要,沒有端正心態,很容易造成失衡。一些人一夜暴富(如中獎),然後大肆揮霍,最後比暴富前更窮困潦倒。入職新公司,可以放低身段,畢竟你掌握的技術是一回事,學習公司各種文化、流程、規範、業務邏輯等等都要花一段時間,不能一蹴而就,否則落差太大,事與願違,如牛入泥潭,強烈的無力感。

一張廁紙,都有它的作用。每個技術公司都有過人之處,我們要關注的,不是那些不行的地方(有待後續解決),而是尋找那些有營養的乾貨,學習之,提高自己。20/80法則,20%的公司牛,那就算差的公司裡,也有20%的人尤為突出的,要向他們學習,看他們寫的高質量程式碼。

從一個公司角度來看,評估員工的表現,不是看他以前多厲害,經驗多豐富,而是看現在為公司的貢獻。所以,一些時候出現的情況是:“我自認水平很好,為什麼公司給我的回報沒有我想象中那麼多?”

去到一個新公司,心態要擺好,低頭做人,努力學習。或許,有一些同事,覺得你空降過來,不會持有熱烈歡迎的態度,所以,做好本分的事情,不需要奉承別人,也更加不要得罪別人,平常心看待。

每去到一家公司,我會嘗試笑著面對每個遇到的人,甚至說一聲Hi,如果對方沒興趣,那沒關係,我不會因此臉黑或者不爽。笑著面對各種問題,自己寫的爛程式碼,含著淚也得把它重構好。

同事/領導/職場

林子大了,什麼鳥都有,公司大了,什麼人都有。有人的地方就有江湖,有利益的地方,就有衝突。

澳洲,跟美國一樣,是移民國家,一般每家公司都有各色人種。文化的差異,語言的溝通,總會造成各種矛盾。

根據這些年來的觀察,衝突一般有:1、邀功,當你辛苦幹完活,別人把功勞拿走了;2、推卸責任,不是你造成的問題,別人強加於你身上;3、小圈子排擠外人。

說到底,工作就只是一份養家餬口的事情,其它都是不重要的,把這個想通了,一切都好辦了。把心態擺正,把事情做好了,就行了,很多事情無法控制,當然,我們要懂得不要給別人留有藉口揪你小辮子。

每個公司都有各種問題,進新公司之前,大家習慣設想新公司怎麼怎麼好,自己的計劃如何順利開展,現實,往往不是如你所願。所以,要做好最好的準備,最壞的打算。

辦公室不是找朋友的地方,必須時刻提防各種辦公室政治,披著羊皮的狼,是最危險的,越天真越容易中招,不大有人會踢一隻死狗,槍打出頭鳥,你越出色,越容易招惹是非,要混得開,低頭做人很重要。

對美女來說,“天生麗質難自棄”,想突出自己把自己的優勢最大化。職場,大部分人都想出人頭地,努力往上爬,加薪升職。然而,事與願違,總有“老子乾得很不爽,去你大爺的!”的時候,如果你真有心有力,確實是可以去創業,不需要受各種非人的委屈。

一言蔽之,要幹得爽,還是需要自己創業。

公司S,心累,現在公司部門和部門之間有嚴重的鬥爭,各自為政,根本就不是想幹活的,噁心的事情很多,譬如部門老大不幹活,讓小弟幹,小弟工作繁忙壓力大就爆脾氣,說話不像人樣,然後部門老大就各種推卸責任,還美化之,去它大爺的 。

公司B,三個印度碼農在印度,一個大鬍子孟加拉國的,一個剛來澳洲兩天的伊朗人,一個來了澳洲很多年但口音極重的越南人,一個還在馬來西亞下個月才來報道的碼農,加上來自黎巴嫩的上司,還有我,真的是聯合國。

公司K,精神分裂的部門女同事,菲律賓大媽,在公司呆了18年,在CTO背後聯合她的兩個馬來西亞小弟直接跟CTO的上司說CTO各種壞話,在CTO面前老裝很友好地狂笑,對待客戶是一樣的做法。

公司T,當年很純真,但已經目睹了各種利益糾紛。公司和別的公司協作做的GSP系統,一個醫藥銷售系統,產品做得差不多了,各種糾紛,後來產品就爛尾了。

公司T,我離職,老闆請大家吃醬板鴨,味道特別棒,至今難忘,離職後還和老闆保持了多年的聯絡,每年春節還發祝賀簡訊,很精短,都是手寫的。

工欲善其事,必先利其器。開發工具,是開發中重要的資源,公司不應該在這塊上有任何吝嗇。

公司S,我入職後發現開發部的機器,最老的7年了,新的也有3年老了,沒改一行程式碼,重新編譯,需要5分鐘以上。跟我一起入職的有4個新同事,公司給我買的電腦是給其它同事買的3倍價錢,IT部經理一臉正經地跟我說:你丫的應該覺得慶幸拿到這麼貴的電腦。但我一臉無奈地跟他說:“雖然你買的是我要求的ThinkPad,我我希望是t4xx,你卻買了exxx,我才不想要呢!”。新來的專案經理對公司安排給他的新手提電腦很不滿意,一大早開啟的時候就已經用力噼噼啪啪了,還吐槽連HDMI介面都沒有什麼的,下班快走的時候還吐槽這i3 CPU配置都8年老的了。首先,講道理,每次i3換代都有新版本,不能刻舟求劍,但是,省這幾百塊不值得。

客戶

客戶是不講理的上帝。

你的程式碼寫得那麼爛,你的客戶知道麼?

公司S,做IT的同事告訴我幾個真實的故事,忒搞笑了,其中一個是:客戶說電腦不正常,同事遠端協助,很客戶說:“close all the windows”,然後客戶說“done”,同事說我這裡看見還沒有關閉啊,客戶堅持已經關閉。爭論半天,最後發現客戶關閉了的不是“視窗”,是“窗戶”。

公司S,有一個潛在客戶發來合同,要求我們的系統一年365日,100%線上,如果服務down了,按分鐘賠錢[允悲]。

客戶的需求,沒有明確目標的居多,需要逐步引導,按優先度和難度分期實現,否則很容易爛尾。

技術與質量

學習

只為一家公司賣命一輩子的,少數。即便只為一家公司幹活,始終會有產品改進甚至更新換代的一刻,不管是使用者量上去了,還是使用者需求變更了,那總要學習新技術。一些公司,系統多年不改進,員工就無慾無求了。等離開公司的一刻,才發現自己與社會脫節了,這種如溫水煮蛙,所以早就了很多養老心態的老油條 。

公司C,一個資深碼農,離職之前,考高階程式設計師證,惡補,拿到證之後,離職了。

我不是喜鵲碼農(The Magpie Developer),不貪新厭舊,確實太多東西需要學,資料量太大了,每天太多東西可以學,時間不夠。舉個例子,基本的日常使用的工具,如開發工具,譬如Visual Studio,即便你每天用,很多有用的東西我就是沒留意,舉個栗子:你知道怎麼快速複製、剪下、刪除整行程式碼嗎?刪除一個詞呢?再舉個粒子,SSMS(SQL Server Management Studio)裡面,怎麼快速檢視一個物件的相關資訊,如一個表,顯示所有欄位、主鍵、索引、約束等等?

最近看越來越多的網路資源,一些要收費,如一個網站提供了專業面試國際大公司的一對一指導服務,全程真題,還有全球20多個著名Web2.0公司的系統設計詳解,也就幾十刀,值得買。

看過很多技術文章,一些網站追求一些非常入門的內容,譬如怎麼做個多級選單,動畫效果,等等,放在首頁,而一些乾貨文章卻被忽視了,悲哀。

大部分碼農都只擅長一種技術,所以選擇的時候應該選擇一種不容易被淘汰的技術(中期還是主流的),譬如.net,現在各大平臺都能用而且生命力很強,在上升階段。前端,髒亂差,但學好JavaScript不愁吃穿,圍繞js的各種框架可以學一下主流的。

技術是相通的,不同的技術棧,技術思想是相仿甚至一樣的,所謂一理通百理明,所以,有全棧的開發人員,從Web前端一直到後臺、資料儲存,還有所有之間的技術如安全、日誌、佇列等等。

即便不睡覺,也不夠時間學習可以學的東西。所以,只能挑食,籠統地學一下大部分新技術,最關鍵核心的,可以深入學一下。

技術選擇

前端、後臺、資料儲存,都有亂象。

前端尤其亂,對日新月異的那些前端技術無力吐槽,簡單來說,就是髒亂差,可惜,技術負責人,沒有把好關,選擇了錯誤的技術。

技術選型,決定因素很多,譬如技術帶頭人,譬如技術儲備,公司現有情況,等等。著名雲程式日誌記錄提供商raygun,幾個月之前扔掉node.js改用.net core,效能提升20倍。但就是有些公司的技術人為了反對而反對,選擇一些不切實際的解決方案[攤手] 。

舉個栗子,譬如SOA家的微服務的設計與使用。網上諸多最佳實踐,在多數公司裡面都沒有、也不會實現 ,不管是決策者、財力資源、還是人力資源等限制 。大家審視一下現在公司的系統, 你連現有系統的的基本的模組化做到了嗎?如果沒有,憑啥你就覺連模組化就做不到就能把微服務做好? 甭想微服務了。微服務不大適合初創或小公司,Martin Fowler說過,上微服務需要現有的流程、監控、快速釋出基礎, 而且釋出的成本和複雜度比單系統服務高,服務間的網路資料交換成本額外高,本地開發測試複雜度和成本也高。 遇到異常,還是看業務,一些transactional的該怎麼樣就怎麼樣,一般流程化操作,如用sagas,容易導致死流程,這種怎麼監控和解決具體問題具體分析。一般做法是有機制重試n次後還不行就escalate到IT,還有日誌這塊也是很多坑的。

繼續這個栗子,微服務的基礎,用公有云的話,論靈活性,那就azure function;論scalability,還是azure batch吊;論可控性,還是service fabric強;論簡單易用陪流程,還是azure logicapps好;論業界認受度,還是Amazon家的AWS λ 吊。

MYOB是澳洲著名的老牌會計系統,直到幾年前他們的解決方案還是Windows桌面程式,客戶需要用citrix遠端進去跑的。。。anyway,原來這公司的名字是Mind Your Own Business的縮寫。

公司C,當年O/RM流行沒多久,entity framework還沒有出現,我們用的一個商業的,效能很爛,批量生成資料的時候整個介面無法響應(當年我們都不懂非同步處理)。

公司C,微軟推出了和macromedia(還沒有被Adobe收購)的flash對抗的Silverlight,設計思路是好的,效能都比flash好,漏洞遠沒flash多,技術負責人說,我們下一版本要用Silverlight實現,當時他說:“我們要做銀光版!”

爆棧

最近的爭論,懂一個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,實際出現:foo 
coma.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,一個從廣州靈狐(還有人記得嗎?)來的碼農同事離職,破壞分割槽然後格式化磁碟了,還拆開機箱,拔了電源線和資料線。

相關推薦

靈感多年技術人生經驗心得

我是個碼農,在職場幹了多年,在超過10個公司服務過,遇到過各種怪現狀,拍案驚奇葩,不吐不快,太想寫篇文章吐槽一下。 這篇文章彙集了我10多年來的工作中遇到的各種經歷,總結的心得,分別討論了團隊與協作(同事/領導/客戶的交流)、技術與質量(學習、技術選擇、質量)、職業與事業(現實、追求、老油條、職業

全棧JavaScript路(四)HTML5 中class屬性相關的擴充

mov html5 表示 方法 popu dom add data- token 1. getElementByClassName() :支持getElementsByClassName()方法的瀏覽器有IE 9+、Firefox 3+、Safari

小邪在阿里的技術人生

2008年4月,小邪正式入職阿里巴巴,首次接觸淘寶商城專案,拉開了十年的阿里技術生

OpenCV影象處理(六) 卷積運算元自定義線性濾波

卷積概念 卷積是影象處理中一個操作,是kernel在影象的每個畫素上的操作。 Kernel本質上一個固定大小的矩陣陣列,其中心點稱為錨點(anchor point) 卷積如何工作 把kernel放到畫素陣列之上,求錨點周圍覆蓋的畫素乘積之

《C++primer(第五版)》學習路-第六章:模板泛型程式設計

【宣告:版權所有,轉載請標明出處,請勿用於商業用途。聯絡信箱:[email protected]】 16.1 定義模板 1.模板定義以關鍵字template開始,後跟一個模板引數列表,這是一個逗號分隔的一個或多個模板引數的列表,用小於號(<)和大於號(&

技術人生:故事 網路是什麼?

故事之十 網路是什麼? 我做網路到第五個年頭的時候,發現問題了,使用者們並不清楚網路是什麼,我在報刊上詳細介紹了NT構造網路的方案,並用了一段被同事們常重複的話:網路,網路,網路到底是什麼。 說起來可笑,我也糊塗網路是什麼了,因為它太抽象又太具體。於是

設計模式叠代器模式解析學習碼(八)

定義 cas blank 變量 學習 叠代器模式 array 叠代器 壓入 原文獻上, 點擊滴滴滴 叠代器模式(Iterator)定義: 提供一種方法順序訪問聚合對象的各個元素嗎而又不暴露該對象的內部展示 不用Iterator的壞處 原文中編寫了三個簡單的集合 A

OpenCV探索路(六):圖像矯正技術深入探討

double gb2 教科書 長方形 strong fine open lines 導致 剛進入實驗室導師就交給我一個任務,就是讓我設計算法給圖像進行矯正。哎呀,我不太會圖像這塊啊,不過還是接下來了,硬著頭皮開幹吧! 那什麽是圖像的矯正呢?舉個例子就好明白了。 我的好朋友小

大數據入門第七天——storm上遊數據 kafka詳解(一)入門

不同 這也 接受 blog 存儲 發送 records ant post 一、概述   1.kafka是什麽     根據標題可以有個概念:kafka是storm的上遊數據源之一,也是一對經典的組合,就像郭德綱和於謙     根據官網:http://kafka.apa

Spark學習路 (五)SparkCore的碼解讀(一)啟動腳本

-o 啟動服務 binary dirname ppi std 參數 exp 情況 一、啟動腳本分析 獨立部署模式下,主要由master和slaves組成,master可以利用zk實現高可用性,其driver,work,app等信息可以持久化到zk上;slaves由一臺至多

本人做c++有多年啦,談談我這幾年的C++學習

學習程式設計十多年了,決定向遊戲發展大概就是半年前了,在這裡總結一下游戲方面的學習經歷過,給初學的朋友們參考下 PS:本來樓主打算遊戲的方式總結一下自己近兩年的來的遊戲方面的學習狀況的,但是由於腦細胞死光了,到了後面顯得很混亂,不幸看到這篇文章的同志們請勉強一下。 完全開源的C++開

《Android系統原始碼情景分析》連載回憶錄:靈感

       上個月,在花了一年半時間之後,寫了55篇文章,分析完成了Chromium在Android上的實現,以及Android基於Chromium實現的WebView。學到了很多東西,不過也挺累的,平均不到兩個星期一篇文章。本來想休息一段時間後,再繼續分析Chromium

微服務架構設計實踐系列技術架構

微服務架構設計實踐 目    次1 序言2 微服務4.4.4  技術架構4.4.4.1  技術架構定義        技術架構定義了實現整個系統所需的各種技術,包括開發類、過程管理類、執行環境類、運維支撐類、以及相關技術規範等。        更確切地說,技術架構描述了在一個

《C++primer(第五版)》學習路-第九章:特殊工具技術

【宣告:版權所有,轉載請標明出處,請勿用於商業用途。聯絡信箱:[email protected]】 19.1 控制記憶體分配 1. 當我們使用一條new表示式時: string *sp

Linux學習碼包安裝腳本安裝(八)

ali 圖片 src ins conf ext cef ini bit Linux學習之源碼包安裝與腳本安裝 目錄 源碼包與RPM包的區別 源碼包安裝 腳本安裝 源碼包與RPM包的區別 1.區別 安裝之前的區別:概念上的區別 安裝之後的區別:安裝位

Hadoop實戰-FlumeHdfs Sink()

pac esc path ref times buffers ogg events nts a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source a1.sources

Hadoop實戰-FlumeSource regex_extractor(二)

local netcat nts configure style cto and event time a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source a1.s

全棧JavaScript路(六)HTML5 HTMLDocument 類型的變化

complete 文檔 出了 content ldoc 之路 stat javascrip safari HTML5 擴展了 HTMLDocument, 添加了新的功能。 1.document.readState = ‘loading‘ || ‘complet

構建法第一章讀後感

思維導圖 我們 加減乘除 圖形 計算 每日 導圖 case 中間 本周進行了構建之法的第十一章軟件設計與實現的學習; 第十一章主要講了典型的開發流程,常見的分析和設計方法:ERD,DFD,UML,開發階段的一些管理方法:每日構建,小強地獄,構建大師; 分析和設計方法包括以文

OpenCV探索路(五):角點檢測

回調函數 閾值 source and 類型 幾何 擁有 .com named 角點檢測是計算機視覺系統中用來獲取圖像特征的一種方法。我們都常說,這幅圖像很有特點,但是一問他到底有哪些特點,或者這幅圖有哪些特征可以讓你一下子就識別出該物體,你可能就說不出來了。其實說圖像的特征