我的軟體開發生涯 :10年開發經驗總結和爆棧人生

靈感之源發表於2015-09-14

簡介

網名靈感之源,智慧實驗室創始人,從事軟體開發超過10年,寫過千萬下載量軟體,熱衷開源,寫過多個爆棧專案(系統開發技術棧、.Net技術棧、資料庫技術棧、前端開發技術棧)。現定居於澳大利亞悉尼,研發經理,從事系統架構開發。

爆棧人生

現在流行說全棧。每種開發都有其相關的技術。您是否覺得難以羅列某種開發所包括對技術(技術棧)呢?

您是否想過:

  • 我做的這個職業,究竟包含哪些技術呢?
  • 我所掌握的技術這個子集,在整個技術大系這個超集裡面佔的比例是多少呢?
  • 我究竟還沒有掌握多少技術呢?
  • 面試的時候會考哪些技術呢?
  • 那麼,開發是否也應該有這樣的技術棧概覽圖呢?

我搜尋了很久,沒有找到一個符合我要求的“較為全面”地表述各種技術大系的圖表。所以我建立了爆棧,覆蓋了以下技術棧:

系統開發技術棧  https://github.com/unruledboy/DevelopmentStack

您是架構師/設計師嗎?您可以在系統開發技術棧這裡找到比較全面的基礎、分析、專案/計劃、文件、設計/建模、實現、質量、管理、編譯、測試、釋出、維護、排錯和學習等。

Web前端技術棧  https://github.com/unruledboy/WebFrontEndStack/blob/master/README.zh-cn.md

您是前端攻城師/設計師嗎?您可以在Web前端技術棧這裡找到比較全面的瀏覽器、平臺、類庫、框架、工具等。

資料庫技術棧  https://github.com/unruledboy/DatabaseStack/blob/master/README.zh-cn.md

您是資料庫開發人員/管理員嗎?您可以在資料庫技術棧這裡找到比較全面的關於SQL Server和Azure等資料庫系統的技術細節。

.NET技術棧  https://github.com/unruledboy/DotNetStack

您是.NET碼農嗎?您可以在.NET技術棧這裡找到比較全面的關於.NET技術的框架、平臺、IDE、開發包、桌面系統、web開發、SOA、資料訪問、生產力、元件、工具等資訊。

這些技術棧不僅提供相關技術的描述、網站、GitHub地址等,還提供互動式的HTML預覽,方便你全面理解各種技術點的關係。

不管您是否前端攻城師/設計師、資料庫開發人員/管理員還是.NET碼農,我們都歡迎您加入我們的行列!

爆棧的官網:http://overflowstack.github.io/

軟體生涯的開始

上初二,學校開了電腦課。電腦老師叫鄧騰飛,

第一次上課,眼睛裡看見的是一臺臺白色的機器,帶了個像電視的東東,能顯示東西,真神奇。課程上多了,覺得電腦挺好玩的,感覺就像在跟電腦交談,而且比較聽話,從來沒有人這麼聽我的話。不過問題來了,當時安裝的是DOS3.x版,滿螢幕是英文,很多都不認識。這個時候我就更加希望能把英文掌握好。

到了初三,終於有了屬於自己的第一臺電腦,386,DX40,4M記憶體,120M硬碟,當時感覺很好了。以前是一個月才回家一次,有了電腦後就常常回家了,一到家就“抱”著它,經常搗弄到凌晨4-5點。

後來電腦升級了,486,DX80,開Turbo的,4M記憶體,210M硬碟,光電滑鼠,還帶個鉤可以掛到顯示器邊上的,很有趣的設計。至今,這臺電腦還放在老家,或許,多年後,要麼放博物館,要麼給孫子說:你看,你爺爺當年的電腦是這樣的。

初三畢業,會考,我的英文拿了滿分,英文老師很替我高興,說這麼多年沒有人拿這麼高分,說要獎勵我一本英文語法書,名字忘記了,但我仍然記得封面顏色是紅是的,而且到現在還保留著,放在老家。當時就有那麼一個念頭:我是為了電腦學好英文的。

電腦老師的電腦,記得是Novell的無盤工作站,我們當年為了要拿許可權,試圖模擬個登入介面,蕩老師輸入密碼時,這樣我們就可以盜取了。不過最後沒有成功。後來學生們的電腦用上了DOS 3.x。先用的GWBASIC,後來接觸了Quick BASIC和Pascal。

上了高中,在電腦課中認識了幾個志同道合的人,我們平時會常常交流技術。但大家都想做自己的事情,成立自己的工作室。這跟我以後所認識到的個人英雄主義很類似。我記憶中最大的便是我們幾個曾經在一個暑假中進行一個比賽,用自己最熟悉的語言寫一個程式,比一下技術水平,看看誰寫得更好,可惜最後不了了之(沒有評比)。當時大家的作品我仍然保留著,後來一次硬碟壞了,所有以前研究的東西都沒有了。

其中一個厲害的傢伙是張敏鋒,他在DOS下利用QuickBASIC實現了一個類似x-windows的圖形化的介面 ,支援中文直接寫屏、滑鼠、帶中文輸入法、圖片(自己定義的點陣圖格式!)、動畫和音樂,實在讓我驚歎不已!可惜他現在不再寫程式了,實在太遺憾了。

另外一個是“道友”,他更牛,特別擅長用PASCAL和QuickBASIC,他的演算法功底很紮實,經常給我們演示他寫的演算法,並用圖形表現出來。後來他上了大學了,用Delphi+DirectX寫了一個很著名的《決戰坦克》,效果好得不得了。多年前他在珠海金山公司開發WPS。

還有一個,名字忘記了,用匯編寫了個圖形功能庫,在QuickBASIC中呼叫,實現真彩色,因為QuickBASIC的Screen12模式就支援16色。可惜現在不他的知道下落。

還有一個,阿祥,用PASCAL的牛人,實現了類似張敏鋒的圖形化介面,多年前他在騰訊公司寫QQ。

還有一個,Chicken,這傢伙最喜歡鑽研技術,從DOS下的QuickBASIC到Windows下的Visual BASIC,再到VC++,再到Java,多年前在21CN做開發,現在在創業。

還有一個,Silly,這傢伙好像學了10多種語言,有一些我根本沒有聽說過的。現在下落不明。

實際上,我們高中畢業那一屆出來的,很多出來都做軟體開發,可能是那一年開始市場比較熱吧。

事實上,我們從正規電腦課程中沒有得到多少專業知識,這應了一句老話:師傅領入門,修為在個人。在高中的時候,我們做了不少荒唐事情,其中一件跟學習電腦最難忘的是:我們“入侵”電腦老師的房子。

那應該是在讀高二的時候,一個週末,我們幾個熱衷學習程式設計的在學校留宿的同學,跟平時一樣,到電腦老師的房子用他的機器,因為週末的時候電腦室不開,而且電腦老師也樂意於讓我們學習電腦。但那個週末老師不在家,而我們習慣了每個週末都用他的電腦,大家又沒有鑰匙,碰巧另外一個老師經過,說:”break in啊”,當時就震驚。然後大家都說:你看,這老師都讓我們闖進去了,那就闖唄。最後,我們爬窗進去了。當晚大家的確研究了不少東西。我們還在老師的房子裡面開小灶,弄了一鍋粥,吃得挺開心的。大家累了倒頭便睡。第二天早上,老師開門看見我們和變樣了的房子,“責罵”了我們一頓,他其實也沒有什麼的,呵呵。不過我們之後都沒有在未曾得到老師的同意之前“入侵”他的房子了。

在高中,從求伯君先生的作品WPS瞭解到他的個人經歷,很欽佩他,便把他作為我的偶像和目標,或許這便是個人崇拜吧。至今仍然記得DOS下的WPS開啟文件的萬能密碼是CTRL+QIUBOJUN (求伯君的拼音)。

我把所有課餘時間都放到學習電腦和程式設計中了。很少玩遊戲,而且比較少參與課外活動,週末和假期都把所有時間都投入到學習程式設計中。

高中,學習的確繁重,但我仍然把相當多的學習時間都放到學習程式設計中。

畢業後知道電腦老師自己開了間電腦公司,但沒有了解其近況。

第一次開發人生的感悟

在大學的時候寫了篇感悟,現在原文放出來。

我是一個英文專業的大學生,但我真正想做的,卻是成為一位IT人。六年多以來,廢枕忘食,連那“黑色七月”前的莘莘學子浴血奮戰,殺得昏天暗地的瘋狂日子裡,我仍然是“兩耳不問窗外事,一心只顧程式設計序”。更離譜的是,連在答語文考卷的時候,我不由自主地想起前一陣子的還沒有完成的程式來。高考結果出來卻有點出乎意料,考上了第一志願。

這六年多以來,我想成為一位IT人的願望越來越強烈,這更讓我瘋狂地學習電腦知識,儘可能地接觸與電腦有關的東西,關注有關電腦的資訊,對自己不斷“充電”。在家裡時,我常常在白天構思程式,晚上從別人開始入睡的時候開始上機,大概是11p.m.吧,一直地打到窗外第一屢陽光射進我的工作室為止。原因有2: 1.晚上安靜,我的思維為一天中最清晰的,這樣能更好地讓我發揮; 2.晚上正常的人都睡了 。

考上大學的近一年來,我總在問自己,“到底有沒有選擇錯了?”為什麼我會有這個想法呢?我理科不大好,害怕考不上大學,所以在高中分科的時候選擇了文科,希望能考上大學後可以選擇與電腦相關專業,即使是旁聽也好。但是考上大學後,發現這根本是不可能的事情,因為我所在的大學不但沒有電腦專業,連相關的專業也沒有。當獲悉這令我頓感近乎絕望的事實,我消沉了。不能學電腦,又能怎樣?我平時行為不羈,獨來獨往,不受束縛,穿著更是以舒服為重,因此經常成為老師跟同學“攻擊”我的藉口。老師曾多次找我做“思想工作”,苦口婆心地向我表明作為freshman應該儘量接觸英語,多讀英文名著,擴大詞彙量……,如此云云。我當然明白老師的出發點是很純潔的,但是,老師,你可知道,對我來說,英語,是作為我學習電腦的工具,而非電腦作為學習英語的輔助工具。我曾多次對自己說:“一定要在保證英語過關的基礎下,才能搞電腦!”但往往不能keep promise,因此我常常感嘆:“到底有多少人能信守承諾,又有多少人可以達成願望?”

我每當遇到不如意的事情的時候,經常以“世事沒有完美”來安慰自己,應該說是欺騙才對,因為我深知這僅僅讓心裡好過點,如此而已。但在這以後,又可以做些什麼呢?但一件事讓我明白到一句古語——“只要有恆心”的的確確是不假。體育課要考1500米,要是以前,我根本是不會害怕的,但幾年來已經荒廢了,頗有“廉頗老已,尚能飯否”的感覺。真正站在起跑線上時,我知道,該來的都會來了的……我不大擅長描寫心理活動,想必很多網友都有過同樣的感覺。結果怎樣?跑了個第一。不但重拾了當年的感覺,而且深深明白:成功貴乎堅持。雖然很多網友都明白這點,但是,又有多少人能真正在實際中運用了呢?先輩雖然留下了不少的至理名言,但是,沒有多少能真正體會到箇中含義,這不能不說是個遺憾。

職業軟體開發生涯

工作經歷

1. 大學四年級(貌似)的時候去深圳蛇口工作了幾個月,算是第一份工作吧,做的是醫藥銷售管理系統(GSP)。公司效益不好,同事們紛紛離開,我是倒數第二個走的,最後公司倒閉了。或許這就是謠言很厲害的說我做過的公司都倒閉的來源之一吧。其實我有一個碼農同事,他最近做的3家公司都倒閉了。主要用ASP和VB,SQL Server好像是6.5什麼的,還是用的MMC的管理器。在這間公司認識了一個程式媛,工作期間交流多了,關係好起來,她成了我的女朋友。後來中學70週年紀念,帶她回去,感覺很自豪。大家常說:“做軟體開發的,哪裡會有女朋友?”,其實,書中自有黃金屋,書中自有顏如玉。做開發的也可以找到女朋友。不過,後來因為一個經典的原因,分了。

2. 畢業後第一份正規的工作是做辦公自動化(OA)的,應該是中國第一家公司使用ASP.NET+VB.NET+SQL Server做的。當時還是.NET 1.0 Beta,那裡我第一次接觸.NET,學了VB.NET (我的背景是DOS下的GWBASIC、QuickBASIC,一路到Windows下的Visual BASIC)。不過,當時很多事情發生,一直影響到現在,其中一樣就是,我在那裡遇到了我現在的老婆。你看,做軟體開發還真能找到老婆的。 部門經理經常刪除我的程式碼,我離職了,還冤枉我破壞伺服器,公司剋扣了我近兩個月工資,然後我就直接回老家和老婆結婚了。後來這個部門經理被查出倒賣產品原始碼,被炒了。對了,這個原始碼當年在網上流傳很廣泛,相信很多做.NET的都下載過。在這裡掌握了ASP.NET、VB.NET、SQL Server等。

3. 第三份工作是一家給南方航空做新線上售票系統的公司,用的Java,那是我第一次接觸Java,做了好像3個月不到,不喜歡,走了,沒多久,公司劇變,要倒閉,員工們都在週末回公司搶機器來抵工資。

4. 第四份工作是一家做房地產管理系的公司,在這家公司呆了5年,完善.NET和資料庫技術,就是在這個期間寫了個人的千萬下載量軟體。如果不是移民澳洲,可能會提前走。對了,在這裡用到了Silverlight,這個技術已經被淘汰。語言主要用的C#,掌握了Oracle和O/RM等技術。

5. 第五份工作是來澳洲後的第一份,做能源管理的,呆了兩年,老闆是斯里蘭卡人,公司大部分員工是印度人,部門經理是伊朗人,其它都是印度碼農。在這裡接觸到海量資料(起碼當時來看算吧,單表30億條,每天更新數百萬),數千儲存過程,在這裡,做了大量資料庫優化,效能暴升,我的資料庫技術大增,還重寫了主系統,掌握了ASP.NET MVC、Bootstrap、Knockoutjs等等一票技術。

6. 第六份工作是做Care的,接觸到醫學方面的知識,譬如身體檢查就有近20個的專案,複雜的演算法,幾百個問題,過百頁的演算法。這裡呆了2年,菲律賓大媽,你還安好?在這裡掌握了Service Bus、angularjs、bower、yeoman等。

7. 第七份工作是做金融/財務貸款/支付的,呆了4個月,老闆是猶太人,比較懂得把錢用到極致。經常要我加班,有些時候加班到晚上10點多,一些時候甚至星期天凌晨。

8. 第八份工作是做GIS相關的,目前呆了快一年,這裡在微博吐槽了幾十回了,不再細說。在這裡掌握了團隊管理/GIS、增強了WPF/資料探勘/資料倉儲等技術。

好了,說完經歷就說職場吧。一句話:職場黑暗。遇到好多不爽的事情和混帳的人,有人的地方就有漿糊,有利益就有買賣,就有手段,博弈。這麼多年就只有一個半公司尚算正常能讓我好好地搞研發。

跳槽是加薪的最佳辦法,跳槽是加薪的最佳辦法,跳槽是加薪的最佳辦法。重要的事情要說三遍。

如何成為一名程式設計師

說明:文章中提及的技術大部分已經過時,正確點來說,應用範圍已經比較小了。因此我並不是介紹新技術,只是談談程式人生。

從事軟體開發,可以是科班出身,也可以不是。我知道從事軟體開發的,除了計算機專業的(電腦科學/軟體工程等),還有科班是學電子、化學、生物、數學、醫學等等,不一而足。而我,是學英語的。

做開發,首先是個人的能力。個人能力可以包括很多方面,不過,我覺得最重要的兩樣是:學習能力、交流能力。

可能有一些程式設計師會問怎樣學習好英文,除了在課堂上認真學習英文外,可以儘量多看些英文節目、連續劇、新聞、廣播來練習聽力,多看英文技術書籍、文章提升閱讀能力,多在英文技術論壇、部落格交流提升表達能力。

我偏好高質量的程式碼。剛畢業的時候,寫了一篇20多頁的《VB程式設計標準》,想發表在《電腦報》上,可惜沒有給編輯採納,可能是我的語言表達太差了,但我仍然希望能在原來公司裡面推行,可惜能理解的人太少。

這些年來,遇到各種各樣的開發人員,各有各的程式設計風格,水平參差不齊。中國的程式設計師有個性,他們中的部分人相信能憑一己之力就能把一個系統做好,實際上,單槍匹馬的英雄時代已經過去,開發人員應該是實幹家,不應該發白日夢。他們為什麼會拒絕接受程式設計規範呢?理由很簡單:“我有我的習慣,為什麼要花時間重新學習別人的規範?別人的規範不一定就好。”是的,別人的規範的確不是最好的,但在工作實踐中總結出來的規範能切合實際需求,能讓開發快速進行並完成,最關鍵的是能滿足客戶需求。同時,遵循同一規範,無論在開發交流還是工作移交,都能快速領會。

掌握好開發語言是每個程式設計師必須做的。但怎樣才算及格呢?很多人說,掌握越多越語言越好,一些則說掌握一種就夠了。我認為都有道理,但我相信在很好地掌握一種語言的基礎上,舉一反三,觸類旁通地學習並能應用其它語言就更好了。實際上,我們不能強求不同的客戶需求使用同一種語言,開發必須為客戶需求服務。現在.NET大行其道,想想在2003年很多論壇上還有大量的帖子,主題都是圍繞是否放棄現有掌握的技術,去學習.NET。這種問題類似於一直以來的爭論不休的兩種語言之間的優劣,最後還是不了了之的。實際上,任何語言都有其存在的理由,不必去爭論什麼,關鍵是自己用得舒服,能滿足客戶需求就好。我在工作中也要根據不同需求用不同的工具。除了語言本身,還的掌握好IDE(開發環境)/工具,工欲善其事,必先利其器。

要做好開發,除了個人/團隊技術過硬之外,還應該多學習同行,前人總有讓我們學習的地方。我的做法是:做開發之前,先客戶需求分析,再下研究一下市面上領先的同類軟體/系統/解決方方案,借鑑他們的優點,注意,是學習優點,不是抄襲。

怎樣成為一名僱員

大部分程式設計師都得找工作餬口(一小部分可能自己給自己打工,做老闆),這樣就免不了要找工作:首先是寫好一份簡歷,然後是過面試關,然後是協同開發,還有跟同事相處了。

這些年來,我既做過應聘者,也做過面試官。最近我在找新工作,網友調侃:“你不是在去面試的路上,就是在面試中”。

首先,是寫份好簡歷。之於簡歷,我更強調過硬的個人能力,不過現在僅僅談談簡歷。

一份好的簡歷很重要,它是你的應聘某份工作的敲門磚。簡歷內容因人而異,但宗旨是要誠實。實在太多的人寫自己精通xx了,有更離譜的, 稱自己精通幾種甚至十幾種語言。我相信世界上最偉大的程式設計師都不這樣說。還有工作和專案經驗,很多人寫得很玄,一看就知道是捏造的,經典的如北大青鳥的學生的簡歷,都是套模板的,水分太大,建議大家老老實實地寫。不過,仍然可以有點技巧的:那就是專業規範化的文字描述。建議多看看各大技術網站的相關文章。

需要強調的一點,那就是證照。現在社會風氣是很強調證照的,各種證照多得我看證照縮寫根本認不出來是什麼。很不好意思的告訴大家,我連初級程式設計師都不是,因為我從來沒有參加過國內任何認證考試。大家可能覺得很奇怪,為什麼我做軟體開發這好麼久了仍然還不考一個證照;可能大家更加關心的是:我沒有證照怎樣成功應聘職位。我不大注重證照。我覺得證照只是能力某種程度上的體現,並不是能完全代表你的所有能力。或許也就是這樣,很多程式設計師考了一大堆的證照。

寫好了簡歷,就是投簡歷了。除了直接投,還可以“騷擾”獵頭。除此之外,還可以找熟悉的人做內推。當然,如果你名氣大,直接就被僱主騷擾了。我當年沒經驗,把自己當萬能膏藥,同時投了同一個公司應聘多個職位,我以為招聘公司會把我當全才,但實際上他們會認為你什麼都不行,純粹為了混個工作做做。所以,應該有針對性地投心目中感覺最對口、最有可能的那個。

關於職位廣告,部分或真或假或誇張,如果分辨,那是門學問。

關於獵頭,獵頭大多不懂技術,而且部分真的很爛,說得不好聽,這些爛中介就是買賣人口的,譬如一些從來不答覆你,一些說:”行啊,我晚點回復你,然後就沒下文了”。

未完待續

接下來還有第二部分,包括:

  • 擴充套件能力
  • 開源人生
  • 開發質量與效能追求
  • 理想與將來

 

相關文章