我的軟件開發生涯 (10年開發經驗總結和爆棧人生)
簡介
網名靈感之源,智能實驗室創始人,從事軟件開發超過10年,寫過千萬下載量軟件,熱衷開源,寫過多個爆棧項目(系統開發技術棧、.Net技術棧、數據庫技術棧、前端開發技術棧)?,F定居于澳大利亞悉尼,研發經理,從事系統架構開發。
爆棧人生
現在流行說全棧。每種開發都有其相關的技術。您是否覺得難以羅列某種開發所包括對技術(技術棧)呢?
您是否想過:
- 我做的這個職業,究竟包含哪些技術呢?
- 我所掌握的技術這個子集,在整個技術大系這個超集里面占的比例是多少呢?
- 我究竟還沒有掌握多少技術呢?
- 面試的時候會考哪些技術呢?
- 那么,開發是否也應該有這樣的技術棧概覽圖呢?
我搜索了很久,沒有找到一個符合我要求的“較為全面”地表述各種技術大系的圖表。所以我創建了爆棧,覆蓋了以下技術棧:
- 您是架構師/設計師嗎?您可以在系統開發技術棧這里找到比較全面的基礎、分析、項目/計劃、文檔、設計/建模、實現、質量、管理、編譯、測試、發布、維護、排錯和學習等。
- 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/
#p#
軟件生涯的開始
上初二,學校開了電腦課。電腦老師叫鄧騰飛,
第一次上課,眼睛里看見的是一臺臺白色的機器,帶了個像電視的東東,能顯示東西,真神奇。課程上多了,覺得電腦挺好玩的,感覺就像在跟電腦交 談,而且比較聽話,從來沒有人這么聽我的話。不過問題來了,當時安裝的是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色??上КF在不他的知道下落。
還有一個,阿祥,用PASCAL的牛人,實現了類似張敏鋒的圖形化界面,多年前他在騰訊公司寫QQ。
還有一個,Chicken,這家伙最喜歡鉆研技術,從DOS下的QuickBASIC到Windows下的Visual BASIC,再到VC++,再到Java,多年前在21CN做開發,現在在創業。
還有一個,Silly,這家伙好像學了10多種語言,有一些我根本沒有聽說過的?,F在下落不明。
實際上,我們高中畢業那一屆出來的,很多出來都做軟件開發,可能是那一年開始市場比較熱吧。
事實上,我們從正規電腦課程中沒有得到多少專業知識,這應了一句老話:師傅領入門,修為在個人。在高中的時候,我們做了不少荒唐事情,其中一件跟學習電腦最難忘的是:我們“入侵”電腦老師的房子。
那應該是在讀高二的時候,一個周末,我們幾個熱衷學習編程的在學校留宿的同學,跟平時一樣,到電腦老師的房子用他的機器,因為周末的時候電腦室 不開,而且電腦老師也樂意于讓我們學習電腦。但那個周末老師不在家,而我們習慣了每個周末都用他的電腦,大家又沒有鑰匙,碰巧另外一個老師經過, 說:"break in啊",當時就震驚。然后大家都說:你看,這老師都讓我們闖進去了,那就闖唄。最后,我們爬窗進去了。當晚大家的確研究了不少東西。我們還在老師的房子 里面開小灶,弄了一鍋粥,吃得挺開心的。大家累了倒頭便睡。第二天早上,老師開門看見我們和變樣了的房子,“責罵”了我們一頓,他其實也沒有什么的,呵 呵。不過我們之后都沒有在未曾得到老師的同意之前“入侵”他的房子了。
在高中,從求伯君先生的作品WPS了解到他的個人經歷,很欽佩他,便把他作為我的偶像和目標,或許這便是個人崇拜吧。至今仍然記得DOS下的WPS打開文檔的萬能密碼是CTRL+QIUBOJUN (求伯君的拼音)。
我把所有課余時間都放到學習電腦和編程中了。很少玩游戲,而且比較少參與課外活動,周末和假期都把所有時間都投入到學習編程中。
高中,學習的確繁重,但我仍然把相當多的學習時間都放到學習編程中。
畢業后知道電腦老師自己開了間電腦公司,但沒有了解其近況。
#p#
第一次開發人生的感悟
在大學的時候寫了篇感悟,現在原文放出來。
我是一個英文專業的大學生,但我真正想做的,卻是成為一位IT人。六年多以來,廢枕忘食,連那“黑色七月”前的莘莘學子浴血奮戰,殺得昏天暗地 的瘋狂日子里,我仍然是“兩耳不問窗外事,一心只顧編程序”。更離譜的是,連在答語文考卷的時候,我不由自主地想起前一陣子的還沒有完成的程序來。高考結 果出來卻有點出乎意料,考上了第一志愿。
這六年多以來,我想成為一位IT人的愿望越來越強烈,這更讓我瘋狂地學習電腦知識,盡可能地接觸與電腦有關的東西,關注有關電腦的信息,對自己 不斷“充電”。在家里時,我常常在白天構思程序,晚上從別人開始入睡的時候開始上機,大概是11p.m.吧,一直地打到窗外第一屢陽光射進我的工作室為 止。原因有2: 1.晚上安靜,我的思維為一天中最清晰的,這樣能更好地讓我發揮; 2.晚上正常的人都睡了 。
考上大學的近一年來,我總在問自己,“到底有沒有選擇錯了?”為什么我會有這個想法呢?我理科不大好,害怕考不上大學,所以在高中分科的時候選擇了文科, 希望能考上大學后可以選擇與電腦相關專業,即使是旁聽也好。但是考上大學后,發現這根本是不可能的事情,因為我所在的大學不但沒有電腦專業,連相關的專業 也沒有。當獲悉這令我頓感近乎絕望的事實,我消沉了。不能學電腦,又能怎樣?
我平時行為不羈,獨來獨往,不受束縛,穿著更是以舒服為重,因此經常成為老師跟同學“攻擊”我的借口。老師曾多次找我做“思想工作”,苦口婆心地向我表明 作為freshman應該盡量接觸英語,多讀英文名著,擴大詞匯量......,如此云云。我當然明白老師的出發點是很純潔的,但是,老師,你可知道,對 我來說,英語,是作為我學習電腦的工具,而非電腦作為學習英語的輔助工具。我曾多次對自己說:“一定要在保證英語過關的基礎下,才能搞電腦!”但往往不能 keep promise,因此我常常感嘆:“到底有多少人能信守承諾,又有多少人可以達成愿望?”
我每當遇到不如意的事情的時候,經常以“世事沒有完美”來安慰自己,應該說是欺騙才對,因為我深知這僅僅讓心里好過點,如此而已。但在這以后,又可以做些 什么呢?但一件事讓我明白到一句古語——“只要有恒心”的的確確是不假。體育課要考1500米,要是以前,我根本是不會害怕的,但幾年來已經荒廢了,頗有 “廉頗老已,尚能飯否”的感覺。真正站在起跑線上時,我知道,該來的都會來了的......我不大擅長描寫心理活動,想必很多網友都有過同樣的感覺。結果 怎樣?跑了個第一。不但重拾了當年的感覺,而且深深明白:成功貴乎堅持。雖然很多網友都明白這點,但是,又有多少人能真正在實際中運用了呢?先輩雖然留下 了不少的至理名言,但是,沒有多少能真正體會到個中含義,這不能不說是個遺憾。
是否,
有過不知方向的感覺?
問自己,
“為什么?”
生活中,
往往決定方向的,
不是自己,
而是眾說紛紜,
不知所措,
其實,
真正的方向,
是自己決定,
不由別人左右。
有感 于1999年
#p#
職業軟件開發生涯
工作經歷
1. 大學四年級(貌似)的時候去深圳蛇口工作了幾個月,算是第一份工作吧,做的是醫藥銷售管理系統(GSP)。公司效益不好,同事們紛紛離開,我是倒數第二個 走的,最后公司倒閉了?;蛟S這就是謠言很厲害的說我做過的公司都倒閉的來源之一吧。其實我有一個碼農同事,他最近做的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/數據挖掘/數據倉庫等技術。
好了,說完經歷就說職場吧。一句話:職場黑暗。遇到好多不爽的事情和混帳的人,有人的地方就有漿糊,有利益就有買賣,就有手段,博弈。這么多年就只有一個半公司尚算正常能讓我好好地搞研發。
跳槽是加薪的最佳辦法,跳槽是加薪的最佳辦法,跳槽是加薪的最佳辦法。重要的事情要說三遍。
#p#
如何成為一名程序員
說明:文章中提及的技術大部分已經過時,正確點來說,應用范圍已經比較小了。因此我并不是介紹新技術,只是談談程序人生。
從事軟件開發,可以是科班出身,也可以不是。我知道從事軟件開發的,除了計算機專業的(計算機科學/軟件工程等),還有科班是學電子、化學、生物、數學、醫學等等,不一而足。而我,是學英語的。
做開發,首先是個人的能力。個人能力可以包括很多方面,不過,我覺得最重要的兩樣是:學習能力、交流能力。
可能有一些程序員會問怎樣學習好英文,除了在課堂上認真學習英文外,可以盡量多看些英文節目、連續劇、新聞、廣播來練習聽力,多看英文技術書籍、文章提升閱讀能力,多在英文技術論壇、博客交流提升表達能力。
我偏好高質量的代碼。剛畢業的時候,寫了一篇20多頁的《VB編程標準》,想發表在《電腦報》上,可惜沒有給編輯采納,可能是我的語言表達太差了,但我仍然希望能在原來公司里面推行,可惜能理解的人太少。
這些年來,遇到各種各樣的開發人員,各有各的編程風格,水平參差不齊。中國的程序員有個性,他們中的部分人相信能憑一己之力就能把一個系統做 好,實際上,單槍匹馬的英雄時代已經過去,開發人員應該是實干家,不應該發白日夢。他們為什么會拒絕接受編程規范呢?理由很簡單:“我有我的習慣,為什么 要花時間重新學習別人的規范?別人的規范不一定就好。”是的,別人的規范的確不是最好的,但在工作實踐中總結出來的規范能切合實際需求,能讓開發快速進行 并完成,最關鍵的是能滿足客戶需求。同時,遵循同一規范,無論在開發交流還是工作移交,都能快速領會。
掌握好開發語言是每個程序員必須做的。但怎樣才算及格呢?很多人說,掌握越多越語言越好,一些則說掌握一種就夠了。我認為都有道理,但我相信在 很好地掌握一種語言的基礎上,舉一反三,觸類旁通地學習并能應用其它語言就更好了。實際上,我們不能強求不同的客戶需求使用同一種語言,開發必須為客戶需 求服務?,F在.NET大行其道,想想在2003年很多論壇上還有大量的帖子,主題都是圍繞是否放棄現有掌握的技術,去學習.NET。這種問題類似于一直以 來的爭論不休的兩種語言之間的優劣,最后還是不了了之的。實際上,任何語言都有其存在的理由,不必去爭論什么,關鍵是自己用得舒服,能滿足客戶需求就好。 我在工作中也要根據不同需求用不同的工具。除了語言本身,還的掌握好IDE(開發環境)/工具,工欲善其事,必先利其器。
要做好開發,除了個人/團隊技術過硬之外,還應該多學習同行,前人總有讓我們學習的地方。我的做法是:做開發之前,先客戶需求分析,再下研究一下市面上領先的同類軟件/系統/解決方方案,借鑒他們的優點,注意,是學習優點,不是抄襲。
怎樣成為一名雇員
大部分程序員都得找工作糊口(一小部分可能自己給自己打工,做老板),這樣就免不了要找工作:首先是寫好一份簡歷,然后是過面試關,然后是協同開發,還有跟同事相處了。
這些年來,我既做過應聘者,也做過面試官。最近我在找新工作,網友調侃:“你不是在去面試的路上,就是在面試中”。
首先,是寫份好簡歷。之于簡歷,我更強調過硬的個人能力,不過現在僅僅談談簡歷。
一份好的簡歷很重要,它是你的應聘某份工作的敲門磚。簡歷內容因人而異,但宗旨是要誠實。實在太多的人寫自己精通xx了,有更離譜的, 稱自己精通幾種甚至十幾種語言。我相信世界上最偉大的程序員都不這樣說。還有工作和項目經驗,很多人寫得很玄,一看就知道是捏造的,經典的如北大青鳥的學 生的簡歷,都是套模板的,水分太大,建議大家老老實實地寫。不過,仍然可以有點技巧的:那就是專業規范化的文字描述。建議多看看各大技術網站的相關文章。
需要強調的一點,那就是證書?,F在社會風氣是很強調證書的,各種證書多得我看證書縮寫根本認不出來是什么。很不好意思的告訴大家,我連初級程序 員都不是,因為我從來沒有參加過國內任何認證考試。大家可能覺得很奇怪,為什么我做軟件開發這好么久了仍然還不考一個證書;可能大家更加關心的是:我沒有 證書怎樣成功應聘職位。我不大注重證書。我覺得證書只是能力某種程度上的體現,并不是能完全代表你的所有能力。或許也就是這樣,很多程序員考了一大堆的證 書。
寫好了簡歷,就是投簡歷了。除了直接投,還可以“騷擾”獵頭。除此之外,還可以找熟悉的人做內推。當然,如果你名氣大,直接就被雇主騷擾了。我 當年沒經驗,把自己當萬能膏藥,同時投了同一個公司應聘多個職位,我以為招聘公司會把我當全才,但實際上他們會認為你什么都不行,純粹為了混個工作做做。 所以,應該有針對性地投心目中感覺最對口、最有可能的那個。
關于職位廣告,部分或真或假或夸張,如果分辨,那是門學問。
關于獵頭,獵頭大多不懂技術,而且部分真的很爛,說得不好聽,這些爛中介就是買賣人口的,譬如一些從來不答復你,一些說:"行啊,我晚點回復你,然后就沒下文了"