從正式離開雜志社到新公司上班也已經1周多的時間,加上春節這個空隙的折騰,,離開媒體也接近一個月,在此之前,很少去考慮過有關不同崗位之間考慮問題的視角,在雜志社一年的時間也沒有真正靜心下來去寫一些技術架構或者管理方面的文章,我想更多的是因為沉淀不夠的原因。
有些主題注定會找罵,其實理由很簡單,因為無知和觸碰一些本來不應該屬于自己的視角。所以寫本文的開始我就做好了被打擊的準備。從2002年大學畢業到現在也快接近上年,加上大學畢業之前2年多的工作經驗,在這個浮躁的IT也算不老不少的人了。從Coder到Technical Leader再到Architect到《MSDN開發精選》的Editor,再到如今另外一個方向的工作,雖然層次始終不高,但是依舊覺得比較幸運,因為嘗試了大多人希望的職位。
如果將我自己從事過的崗位簡單的歸納,應該可以描述成下面的崗位
Coder:完成Technical Leader指定的模塊功能,擁有良好的編碼風格和一些細節實現技巧
Technical Leader:根據項目經理或者產品經理(國內大多比較少區分這兩個角色)指定的任務,協助Architect或者Analyst實現系統設計,指導和監督Coder完成開發任務,同時承擔一些技術難題的解決。
Architect:從技術和業務的角度對應用系統或者產品進行抽象,進而設計一個適用于解決方案的模式。簡要地說是抽象和分離軟件產品中的共性問題,提供一個解決這些共性問題的方法論(不是某一個方法)。從這個角度來講,系統架構師可以分成兩種類型:一是提供解決方案的技術實現,一個是提供業務的抽象(這是我個人的理解)。與此同時,可擴展性、可伸縮性、安全性、性能等等這些東西成為Architect關注的重點,他們不再具體關注某一個業務功能的具體代碼實現,而是在一個更高層次上考慮系統的總體結構,諸如子系統劃分、組件分布、消息通信等等方面的東西。
Editor:恰當的說是技術編輯,而不是純粹意義的編輯,所以它的第一要素是技術性,而非文字。這里我要感謝我在雜志社的搭檔孟巖先生,在短短的一年時間內他教會了我許多東西,也知道了許多事情可以從Non-Technical ViewPoint去看待。很多大學同學和朋友問過我做編輯和作程序有什么區別,我想最大的不同依舊是視角,作為一個合格的技術編輯,首先要求有比較扎實的技術功底,然后有開拓的視角和接納新知識的能力,最后才是其文字表達功底(就我個人認為,在這幾個方面孟巖和熊節先生做得非常出色,所以也就理所當然地稱為國內頂尖級的技術編輯)。作為一個編輯最重要的使命就是傳播,那么如何在這種信息爆炸的時代將最有用的信息通過最有效的途徑傳播給需要接受新知識的人,除了傳統的平面媒體和大家所熟知的論壇,Blog是一個非常有效的形式,它能夠讓讀者和身份為技術編輯的Bloger在第一時間得到最好的交流。所以技術編輯應該更多的是能夠將自己對于技術的理解和對于說了解的東西盡快地讓更多人了解,雖然很多IT雜志社比較傾向編輯不用寫稿,而是掌握大量的作者資源,然后有效地利用這些作者資源。對,本身沒有錯,但是在IT卻不是行的很通,所有做技術的都佩服Orielly的技術編輯,原因無它,因為那幫人拋開編輯的生活,每個都是技術上的大佬。獨立技術評論或者產業評論在許多時候成為一個技術編輯可以和他人溝通的基本條件,“英雄惺惺相惜”的局面在開發人員中出現的概率遠遠高于其他人群。因此在這個崗位上對于技術和文字的要求是并行的,或者前者重一點,只是相對于Coder,關注的層次和方向已經截然不同。也正是因為如此,在雜志社一年的時間雖然給朋友的公司做過一些技術咨詢,卻發現自己寫代碼的能力正在退化(寫代碼明顯比較慢)。
Manager:請記住永遠不要用Business-Card上面的Title去看待一個人的崗位或者說職位,這點在外企尤為明顯,做商務或者市場的沒有一個不是經理:),不過仔細的看他們英文的Title就能夠比較準確的反映出這個人在公司的崗位。在我經歷中,名片上很早就出現經理的字樣,但是客觀的說,那只是公司的商業因素決定的,大多時候所謂的項目經理等等是等同于Team Leader,是一個工作過程的臨時角色,而不是在公司行政體系中的崗位劃分。在做Coder的時候,我更多的是關心某個API的使用,能夠寫出一段賞心悅目的代碼是一件非常有成就感的事情,在做技術負責人的時候依舊關心的是技術,這個時候需要考慮針對人的分工,根據每個人不同的技術特點進行分工,然后再上級領導指定的時間內完成工作。而Architect從大多人來說,應該是相對不錯的崗位,它更多的是關心技術或者特定領域行業業務的抽象,我們可以簡單的認為Architect和Consultant的工作和比較接近的,不同的是Architect給公司干,Consultant給別的公司干,當然了,我這里提及的是技術顧問,而非大多咨詢公司的泛意義上的顧問。Architect總體上來說是一個和事情打交道居多的職位,是Non-Leadership,因為沒有涉及到太多人的因素。
當我第一天上班,家里的老大就提醒我需要注意一個Technical Leader和Manager是兩個差距比較大的角色,前者更多的是對事情而言的,而后者更多的是針對人。比如團隊建設,人才組織結構,員工培養計劃,激勵和考評機制和資源調度安排等等。在此之前,對于工作大多考慮的是如何爭取資源,而作為一個管理人員,更多的是考慮利用將有限資源最大化(嘿嘿,資本家和資本家走狗的本質)。
我不是職業IT經理,也沒有太多的管理經驗,雖然之前做過或多或少的管理工作,但是和一個崗位本身真正所從事的事情差距甚遠,因為如下只是我個人的一些理解,也請各位看官原諒我的無知和賣弄。一個小型公司的開發部門負責人需要做以下事情(至少吧,雖然還有其他許多事情)
1) 規劃化軟件開發過程
我不是一個軟件工程專家,甚至對于目前的大多軟件工程方法學不是特別感冒,但是我從來不去拒絕規范化的軟件開發過程,就如許多人問過我是否要采用CMM/CMMI或者RUP進行軟件開發時,我首先會去確認他們的團隊規模,通常來說,不超過15個人的開發團隊采用這些軟件工程的方法學并不能夠帶來明顯的好處,因為CMM/CMMI或者RUP對于角色的定義太明晰,雖然提供了定制的可能,但是對于國內大多的軟件公司而言,15個人的開發團隊應對的不僅僅是一個項目,更多時候被分離成了3個孤立的團隊,這個時候5個人的開發團隊在項目實施過程中很多角色注定是重合的,相信大家應該知道太多角色重合的結果是帶來崗位職責的沖突,對于大多數人而言,處理好這些沖突不是那么容易的。
里程碑和迭代總是被忽視,因為大多小公司的開發人員沒有經歷過相對系統的培訓,也就不是特別理解軟件開發過程,他們更多的是按照上級分配的任務去完成工作,稍有經驗的開發人員都會知道,這些東西的欠缺是非常致命的。最直接的結果就是無法控制項目進度和成本核算,更多的是依賴于個人的感覺“大約、估計、差不多”在現有資源的情況下完成指定工作。于是加班就成為了家常便飯,大多是為了在指定的時間之前完成任務。
通過一些輔助工具能夠能夠幫助小型開發團隊明顯的提高工作效率和里程碑的界定。比如建模工具Visio,Rational XDE,數據庫建模工具Power Designer,代代碼生成工具如CodeSmith,文檔和測試工具(NDoc,NUnit/NMock)及其批處理工具(NAnt)等等,這些工具能夠很大程度的幫助開發人員完成一些枯燥無味的重復性開發工作,從而將精力集中在核心業務的實現。
我們可以簡單的描述一個軟件開發過程能夠使用到的工具,當然這里提到的沒有太多的軟件工程方法學,只是從實用的角度來看利用一些已有的工具能夠較少軟件開發中的重復,同時提供相對明晰的里程碑界定:
(1) 定義需求。對于小型軟件開發,建議不用引入太復雜的開發工具(不知道大家的感覺如何,使用UML來進行業務建模對于大多開發人員是存在困難的),因為大多人習慣用代碼去表述業務邏輯,諸如Use Case,時序圖、活動圖等等,對于非專業技術人員而言太抽象,UML的提出是為了建立一種統一標準的溝通語言,讓所與參與者能夠統一種符號去表達思想,可是在國內目前的實際情況而言,這些UML恰恰讓許多人無法理解。對于大多軟件開發而言,我們需要的僅僅是一份開發人員的文檔,簡單來說文檔必須包含業務要求和技術要求兩部分。業務部分包含核心的業務流程圖和列表形式的業務描述,技術要求具備一些基本的要求如整合現有IT系統、技術模型等等就足夠了,對于大多數開發出生的系統分析員而言,有這個文檔就可以開始做設計了,那么有了這個文檔是不是全部足夠了呢?顯然不是,如果我告訴你是又多了一次被鄙視的機會了。
(2) 數據建模。你可以簡單的理解成數據庫設計,在這個過程中建議使用Power Designer或者Microsoft Visio(最好是.NET自帶的那個版本,而非2002或者2003的Professional),使用數據庫建模工具而非直接進行數據庫設計的理由有很多,我不想去夸夸其談的說可以提高……那樣的空話。最直接一點的好處就是可以圖形化的設計你的數據模型,同時這些建模工具都提供了很好的文檔生成。數據建模一個最基本的原則就是能夠滿足你在需求文檔定義的所有業務數據描述,你整個業務流程中的所有數據都能夠找到直接或者間接的存儲,同時數據之間的關系必須滿足業務的種種約束(比如生日不可以比當前時間大,員工數不可以是負值等等一些要求),這些業務約束可以通過觸發器和約束來表達,同時根據你業務的需要,可以適當的編寫一些存儲過程用來實現你的業務邏輯。最重要的一點,請記住記得為所有設計元素寫注釋,因為這些注釋正式用來描述你設計的最重要依據,也是你日后溝通的依據。
(3) 業務建模??梢岳斫鉃樵O計,按照推薦的做法,一個系統應該是分層設計的。比如微軟的Petshop就分離了Model、DAL、BLL和UI這樣的幾個層次。如果是基于.NET開發的,我建議使用Rational XDE Plus for VS.NET,從數據庫到商務對象的映射目前有兩種推薦的做法。一個是使用或者自行開發ORM框架用來完成數據到對象之間的映射,Java中可以使用Hibernate、JDO、EJB(Entity Bean似乎不是推薦的做法等等,.NET也有一些ORM工具如NHibernate,ORMapper、OPF.NET等一些開源項目,但是總體不算特別成熟。另外一種做法就是一個一個的編寫你的Business Object了,但是你可以通過一些CodeGeneration工具讓簡化你的重復工作,如果熟悉ASP.NET,建議使用CodeSmith。生成基本的代碼骨架之后,可以將這些代碼通過反向工程生成你的模型圖,然后再通過對象建模反復的校驗你的設計,當然設計過程中良好的注釋是必要的,通過對象模型圖,你可以和團隊成員很好的交流,在出現問題的時候也能夠及時修正你的設計。TDD(測試驅動開發)也得到越來越多的人接受,如果問我什么時候開始寫單元測試,那么我就建議從這個時候開始寫,原則也很簡單,就是你所有的測試用例合起來能夠完整覆蓋你的業務要求,一旦發現測試用例無法繼續編寫下去,那么存在問題的可能是你的業務建模部分(大多情況下,不應該回溯到數據建模階段),這個時候去修正你的設計。反復之后就能夠得到一個比較好初步設計框架。在此基礎上可以進行部分的設計調整,使其更具擴展性和靈活性,當然在一些特殊要求(如性能)的情況下可以在設計完畢的時候降解你的設計,雖然會破壞一些設計原則,但是在必要的時候還是可以接受的。
(4) 業務實現。好了,這個時候是開始編碼的階段了,這個時候開發人員需要一些文檔,如需求文檔(可能是Word形式)、數據庫設計文檔(Power Designer或者Visio的,也可以通過文檔工具直接生成相關文檔),設計文檔,單元測試用例,通過上述的迭代,這些文檔都是非常完整的。此時Team Leader對于開發人員的要求可以算比較簡單了,按照設計文檔提供的接口要求實現,工作完成得第一原則是通過單元測試,因為代碼的骨架在設計階段已經完成,同時對于各個接口提供了很好的文檔說明,就能夠在很大程度上去約束開發人員的散漫和隨意性,從而保證代碼的規范和可閱讀性。而規范的設計也保證了工作量的細化,從而能夠用相對量化的指標去衡量一個開發人員的具體工作量。開發過程中有三方面工具推薦使用:NAnt實現編譯、測試、部署的自動化;版本控制工具如(Visual SourceSafe)實現代碼的版本管理;利用BugTrack工具,從而有效地跟蹤和解決問題。
(5) 測試和部署。大多軟件出現問題的原因是沒有測試和模擬部署,要求開發人員自行完成測試之后就開始投入應用,這樣帶來的問題是顯而易見的,因為大多人對于自己的問題是一種逃避心理,而百盒(White Box)的測試如果沒有通過一些工具有效地保障,讓開發人員通過Code Review的方式是不切合實際的,對于目標環境的模擬部署也是非常必要的,為了減少不必要的麻煩,建議大家可以使用VMWare或者微軟的Virtual Server 2005來進行目標應用環境的模擬。
以上提到的只是開發過程中的典型環節,通過一些工具來規劃化和加速軟件開發過程是必要的,我上述提到的一些軟件是商業產品,在實際使用過程中建議購買商業軟件或者尋找替代的解決方案。但是這些過程對于小型開發團隊是行之有效的,我沒有大型團隊的應用開發,也許是另外一種場景,也不敢班門弄斧了。
2) 完善開發團隊的梯度建設
這個也是小公司存在的非常嚴重問題,整個開發團隊的成員結構是不合理,甚至是畸形的。不知道大家是否同意我這樣的說法,大多公司都是一個所謂的技術牛人帶領一幫資歷比較淺的開發人員進行開發的,一些最核心的工作都是由1-2個人來完成的,其他人實際上來說只是輔助性的工作。不可否認,高水平的開發人員對于一個團隊的效果是明顯的,但是同時帶來一個問題,如果對于開發人員脫控,就會形成“老板怕員工”的現象,這樣的管理弊病導致的結果就是內部斗爭嚴重。設計、編碼、測試、管理等等各個環節人員的平衡是一個相對良好的組織架構,同時盡量不要讓團隊的梯度出現脫節,比如高水平的開發人員和其他員工出現無法溝通的障礙(兩者完全不是在一個水平線上),低、中、高金字塔式的人才結構對于團隊的穩定是至關重要的。這段最直接的是反映在人員招聘上,不是找便宜的或者找牛的,而是選擇合適公司自己定位的。
3) 注重技術資源的基礎積累
生存對于小公司是第一目標,但是很多時候就以為如此,忽略了團隊的基礎積累,在一些公共模塊的應用上,在不同項目之間很多開發人員采用的是Copy/Paste來做的。在日常的開發過程中,應該逐漸形成自己的代碼和組件甚至業務的積累。這些工作可以成為高級開發人員日常工作的一部分。
4) 并行開發
如果你不是一家貿易公司,那么請記得“人無我有,人有我優,人優我絕”,至于“人絕我偷”就免了阿,要讓自己的公司保持長久的生命力,應該永遠保持比競爭對手領先半步,那么這半步來自何處呢?除了保證為生存奮斗的商務開發之外,前瞻性的開發也是必要的,最好的做法就是根據公司實際情況,抽出部分人力并行下一代產品的開發,在下一代的開發過程中產生的一些比較好的產品可以直接利用與現行系統,因為時間周期相對允許的緣故,在下一個版本設計的時候來自時間的壓力會明顯比較少,這樣子帶來的好處是能夠設計更好的系統。因此研發和開發并行對于一個小公司也是必要的,至于多少權重,那就根據實際情況去衡量了。
5) 加強內部外部的溝通
在社區和其它途徑總是可以看到一些開發人員在抱怨公司沒有給他們提供更好的交流技術,他們不知道市場,不知道需求,總是和客戶存在非常大的溝通障礙,那么作為一個管理人員,盡量創造這種溝通的機會也是非常必要的。
6) 堅持員工培訓
小公司員工跳槽的概率是遠遠大于規范的公司的,一個方面是待遇和福利跟不上,一個方面是無休止的加班,另外一個方面就是感覺公司沒有什么前景,學不到多少東西。第一個問題只有隨著公司業務的不斷發展才能夠根本性的得到解決,第二個問題通過規劃化的軟件開發過程能夠減少不必要的重復和錯誤,也能夠適度的得到解決(當然了,碰見真的資本家,趕緊走人吧)。最后一個問題在小公司是普遍存在的,那么給員工創造一個積極向上的發展空間,擁有更多的學習機會,對于管理人員是一個很大的挑戰,這些東西可以歸結為企業文化建設。對于小公司,因為資源方面的限制,很多管理人員會忽略這個環節。
目前所在的公司就堅持每周一次的技術培訓和2周一次的職業規劃培訓。我的做法比較簡單,相對于其他開發人員,我比較熟悉軟件開發過程多一點,所以在開始階段告訴他們在一個小型團隊中怎樣有效的進行協作開發,如何定義軟件開發的各個過程,各個環節中有哪些工具可以提高開發效率,而這些工具具體是怎樣使用的。等到員工熟悉了大致的軟件開發過程,可以每周探討一個技術點如.NET Remoting、Enterprise Services、Web Services、Http管道化等等,通過交流的方式讓團隊成員了解更多開發技術的具體細節,在適當的時候個人邀請一些技術上的朋友幫忙來公司做定期的交流。在職業規劃培訓方面,則是由公司的兩位老大提供一些來自McKensin、Aclearcase/" target="_blank" >ccenture這樣公司的培訓經驗。
7) 明晰的崗位責任制
坦白說,這個方面我目前還是沒有非常清晰的思路,希望得到各位的指點
崗位決定視角,從編碼人員、技術負責人、系統架構師、技術編輯到部門管理人員,這5個不同的崗位也決定了看待問題的不同方式,作為一個小公司的部門負責人,要做的事情很多很多,但是如何將最重要的事情做好呢,也希望和各位探討。
原文轉自:http://www.anti-gravitydesign.com