鞠強
這是一篇關于成長的心得。仁者見仁、智者見智,如果諸位讀者能夠從此文中看出一點東西來,有所感悟,我就滿足了。
我是數學系畢業的,大二開始搗鼓計算機(94年),最大的興趣就是寫程序。改游戲、改病毒,這些小東西讓人很有成就感。工作后的興趣經歷了一個很大的轉變(當然,這個時間相對于多數人而言,遲了些),2000年的時候,我突然發現了我寫的程序的價值。當我看到我修改了短短的幾行代碼的時候,給客戶帶來了很大的效率提升,降低了成本,那種成就感,遠非6年前的認識可比了。
本文并非專門面對計算機入門者,所以內容比較雜。
此段權作前言,現在進入正題。
知識點要連貫,知識面要廣
國內的大部分軟件企業,從來沒有像國外那樣,在技術上保持連續性。從微軟這條路線來看,從最早的DOS->Win16->Win32->OLE->DCOM,到COM+->.NET,我們很難找到能夠完整走完這個歷程的人。這種現狀,導致大部分的技術人員,對于開發技能,有一個很大的斷層:知其然,不知其所以然;碰到非source code的錯誤,就手足無措;或者代碼質量低劣,或者性能有很大瓶頸。
上面的路線演進,可以認為是“工程”方面的,而非我們大學教育中的“科學”。操作系統、數據庫、數據結構、離散數學,這些內容非常重要。但是我們要注意的是,你學習了這些,不代表就能寫好一個程序,能夠解決客戶的問題。工程方面的東西,我們多加掌握,熟練應用,配合上述“科學”的內容,才能真正保證程序價值的發揮。
而如何讓兩者有機的結合起來?我想,不外乎就是興趣+經驗。
在微軟平臺上開發,很重要的一個資源就是MSDN(Microsoft Software Development Network),里面有how to,有concepts,有topics,可以讓我們更好更快的上手。當我們碰到某個代碼錯誤,想找某種解決方案的時候,MSDN是一個非常好的助手。對于初學者,我們可以看里面的how to,step by step的進行學習。
還有一個笨辦法,我剛工作時候采用的,就是找一個老版本的SDK說明文檔(borland開發工具的幫助里面就有,那個短小精悍,沒有msdn的那么復雜),從字母A開始,到字母Z,我當時花了一年半的時間,基本把所有的API都試驗了一遍。這么做有個好處,能讓你快速的對整個開發有一個概覽。以后在學習或者工作中碰到了問題,能讓你有一個大概的印象,知道應該怎么做,知道應該用哪個API
對于現在的應用而言,如果是基于.NET的企業級應用開發,我的經驗是,Win32 API了解即可(當然,如果對某一方面很熟練的話,還是非常有好處的。如socket、GDI等。);COM/COM+要知道一些,至少要清楚Add/Release Reference的含義;.NET Framework要深入一些。比如可以拿那本《.NET 高級編程》來做練習。這本書1000多頁,雖然名之為“高級”,但你可以拿它當字典來用。有興趣的,可以按照我說的那個笨辦法,從第一章開始到最后一章,讀一遍之后,自己一個字母一個字母的,把所有的代碼寫上、調試通過、運行,并反復debug,從中了解語法、語義、一些編程技巧。
對于高質量的代碼而言,仔細研讀《Essential .NET》這本書是很有必要的。
對于企業級應用開發,還有一點很重要,就是數據庫知識。數據庫本身的語法很簡單,關鍵是我們寫出來的sql要成本低,成本低一般就會帶來效率的提升(并非絕對如此)。這部分內容,一需要經驗,二需要思想意識的轉變。什么思想意識呢?就是要有數字化的觀點!
舉個例子,客戶讓你出一份能夠適應未來三年需求的存儲方案,你該如何考慮?如果沒有數字的觀點,很可能的結果就是瞎蒙出來的數字。如果有了數字觀點,我們很容易提供此方案。
對于存儲空間,我們可以仔細分析客戶最近2-3年的數據庫結構、內容,加以咨詢客戶,未來3年的應用變化趨勢,最終我們能得到這樣一份提綱:
|
帳務管理 |
發票管理 |
訂單管理 |
用戶個數 |
50 |
20 |
100 |
高峰時間段 |
月底3天 |
每日 |
每日 |
每行記錄大小(kb) |
20 |
10 |
200 |
業務發生筆數(每天) |
30 |
50 |
50 |
高峰期業務發生筆數(每天) |
100 |
50 |
50 |
假設每個月工作日是22天,那么計算每個月的高峰期業務量、平時業務量,得到一個總數,乘以36個月,就能得到一個統計意義上的3年業務量。再考慮到tempdb、日志、索引,以及raid,我們就能很容易的得到存儲空間數字。再通過TPC等要求,得到服務器的其他配置要求。
當你寫的代碼被別人應用的時候,總會有這樣、那樣的問題。硬件,可能會和程序不兼容;軟件,新操作系統你可能不支持;木馬可能讓你的B/S代碼發生莫名其妙的故障;病毒會導致你的.NET runtime頻繁重啟;BT/emule讓你的應用沒有帶寬用、socket無法連接,等等……
諸如此類的問題,絕對不是我們在電腦旁邊寫程序時,就能想到的。那怎么辦呢?我們雖然做不到全才,但是要利用好你所處的團隊,利用好網絡資源。這兩點做到了,當你積累了相當的經驗,再考慮新的程序的時候,就能有所警覺,讓新程序的架構更為合理。(對于架構,牢牢記住這些:伸縮性、擴展性、可靠性,以及安全、性能。)
當你對架構有所了解的時候,你又會發現,細節決定了一切。細節的處理,來自于你的知識面、項目經驗,以及大量的思考。無論.NET還是J2EE,無論是C#還是C++,平時多了解一些,總會對你思考整個軟件,帶來益處的。
軟件開發是一項事業
軟件是一個非常累的行業,如果想拿高薪、每天八小時工作、周六周日有自己的私人空間,那么在這個行業你幾乎找不到合適的切入點。
對于許多新人而言,這個行業充滿了誘惑,也有很多挑戰。興趣,也許是選擇這個行業的第一前提。當我發現我寫的程序能夠控制企業的生產設備時,無疑是很興奮的;當我發現我的代碼總是會莫名其妙的crash,無疑又是很沮喪的。很快,我們的興趣就容易被這些抽風似的問題,磨滅殆盡。
也許可以這么說,興趣是領我們進門的老師,你能讓它跟你越久,你就越能保持前進的動力。如果沒有了,這也是一個好事。我在工作后的第三年,突然對所做的一切失去了興趣。后來想,這說明我已經度過了那個純粹感性認識的階段,“可以”朝理性階段邁進了。
就這個行業本身而言,我們更多的接觸客戶、更多的接觸實際需求,這些帶來的沖擊,遠比一種新技術對我們的影響,要猛烈的多。客戶那里有各式各樣的硬件環境、網絡環境、軟件環境,有各種管理模式的應用。接觸的久了,我們自然就會思考:
l 我寫的代碼,該如何改進,才能適應各種環境?
l 應用上采用什么架構,可以滿足可預見到的未來的需求?
l 怎么做,能讓程序在sqlserver和oracle、db2上都跑的很好?
l 安全上,代碼中的sql injection,真是那么容易解決的嗎?
l 我的程序能夠無縫的在客戶那里的.NET Frame1.1/2.0上切換嗎?
l 我的程序,如何能在windows 2000上跑的更快?
當我們有了這些思考,實際上,興趣就又回來了。這些問題毫無疑問,都不簡單,但都很有意思。我相信,這是一個良性的循環。興趣、事業,交替引導著我們前行。
不要急于為自己定位
工作了2、3年之后,我們都會有這個困惑:我以后做什么?繼續作程序員?作管理?想的再遠一些,30歲之后,我們應該做什么?
這個問題,我曾經問過我的老板,他和我說,你把自己當前的工作做好,好的要做的更好。今后的發展,是和你目前所做的工作、你的視野、你的經驗,息息相關的。
功到自然成。
如何看待IT這個行業
我認為IT行業,現在剛剛是起步階段,這個階段也許持續20年或者更長。IT的最終目標,應該是作為一種基礎服務,沉淀在經濟發展大潮下面。如同水、電、煤氣一樣,我們日常感受不到它們的存在。一旦停電、停水、停氣,我們才會感覺到不便,才會發現,整個經濟的運轉,都離不開這些基礎設施。
軟件方面,最終也會發展到這么一個階段。黑客帝國二里面,議會老大和NEO在談論matrix和“真實”世界,透過繁榮,背后是巨大的能量供應基地、星羅棋布的管道,這一切看起來丑陋的東西,被深深地印藏在背后了。
從目前來看,軟件還是在盡量的模擬世界,盡量的從數據中發現我們所生存的這個世界的真相。這首先需要我們把所有能發現的現象,都抽象出來,需要龐雜的數學理論支持,需要硬件的革命性地變化支撐。
但這是一個非常困難的工作,也許幾代人的時間我們才能做到。我們目前所做的,正是這偉大變革的第一步。
做好選擇:進大公司?進小公司?
每個臨近畢業的,致力于搞軟件的人都會有這個抉擇:進大公司?進小公司?
大公司門檻高,組織結構復雜,層級很多,待遇也許不會太好,高手眾多。Freshman也許要適應幾年的時間,才能展露頭角。
小公司門檻低,結構單一,待遇相對會好。新手很容易抓住機會,在項目中成長起來。
眾多走過來的人都有這個經驗,大公司里面你會學到很多東西,各方面會正規一些;小公司的生存壓力比較大,也許你會成為一個多面手,但成為一個高手,會很困難。道理很簡單,一個是發展階段,一個是生存期,這兩種狀態決定了公司的運營狀態,決定了軟件研發的思路,決定了市場思路。
我個人的體會是,開始進入大公司,應該是一個不錯的抉擇。如果進了小公司,就要考慮如何踏實的把工作做好先,如何能夠全面、快速的成長。
作者鞠強,10年的企業管理軟件開發經驗,目前致力于產品性能、安全方面的研究。我的聯系方式是:濟南市山大路224號,浪潮通軟,郵編250103。聯系電話:138 5310 1310,MSN是:juqiang1975@msn.com