正文:(一)項(xiàng)目確立
一年前,CSDN的外包頻道,一家貿(mào)易公司尋求開發(fā)業(yè)務(wù)系統(tǒng)。我注意到這家公司和我正好在一個城市,索性就跟了一帖,寫了點(diǎn)簡要的個人開發(fā)情況,當(dāng)然最重要的是附上了自己的手機(jī)號碼(當(dāng)時CSDN外包頻道還不限制這個信息的)。第二天就接到那家公司總經(jīng)理的電話,這讓我多少有點(diǎn)意外,電話中,雙方客套兩句后,約定好周末面談。
和以往面試一樣,我?guī)蟼€筆記本(上面有以往開發(fā)的項(xiàng)目演示版)按照約定好的時間,準(zhǔn)時去洽談。地點(diǎn)是在對方的辦公室,一進(jìn)會客室,給我第一感覺整齊、清新、優(yōu)雅、綠色;窗外則是寧靜的半島和微瀾的海浪,心情頓時感覺非常暢快。
電話中那位非常紳士的總經(jīng)理,年紀(jì)大概45歲左右,我們的談話直奔主題。我先簡單介紹了一下自己的情況(工作和開發(fā)經(jīng)歷),用筆記本演示自己以前開發(fā)過的兩個類似項(xiàng)目情況,他則不時地提幾個關(guān)心的問題。然后,他簡單地將自己公司的需求告訴我,并把現(xiàn)行的系統(tǒng)的主要功能演示給我看了看。
整個談話過程中,我印象最深刻的是他最后時刻說的話:“我看了你以前開發(fā)的系統(tǒng)演示,認(rèn)為你完全有能力開發(fā)我們的系統(tǒng);我也不打算再尋找其他人來面試,因?yàn)槲业臅r間不允許我這樣做。你如果覺得剛才我們談到需求內(nèi)容和開發(fā)價格都合適,那么我們就此開始合作?!?/p>
我是個程序員,他是個商人,我們的合作就此開始。
正文:(二)需求確定1
有了第一次的面談,我對這家公司的整體印象不錯。說起來,我以前去過不少公司(自己工作過的公司或談項(xiàng)目去過的公司),尤其是從事貿(mào)易的公司,還是第一次見到辦公室這樣讓人感覺如此舒服的。
簡單說一下我需要開發(fā)的系統(tǒng),其實(shí)并不復(fù)雜,就是一個典型的貿(mào)易系統(tǒng),主要功能是管理公司的產(chǎn)品、客戶信息,然后給客戶報價、生成合同、給廠家下生產(chǎn)單等等。當(dāng)然,這每一個模塊中都會有很多特定的需求,例如,產(chǎn)品的價格組成,當(dāng)某些價格組成發(fā)生變化時,系統(tǒng)需要自動更新到所有可能產(chǎn)生影響的部分去。
(那位非常紳士的總經(jīng)理,為了敘事方便,給他取個名字吧,就叫Gentleman吧)
Gentleman把他們現(xiàn)在使用的系統(tǒng),發(fā)了一份給我,在我看來這個系統(tǒng)簡直就是一個學(xué)生的實(shí)習(xí)作業(yè)。無論從系統(tǒng)的性能上,還是操作的界面上,邏輯的條理性上,都存在很多的問題。但就是這樣的系統(tǒng),Gentleman居然使用了近7年的時間,這讓我感到很驚訝,甚至于難以理解。而Gentleman經(jīng)常在需求的溝通過程中,提到他們原先的系統(tǒng)如何如何實(shí)現(xiàn),我心中總是會非常不舒服,覺得拿這樣原始而粗糙的系統(tǒng)來與即將開發(fā)的系統(tǒng)相提并論,我認(rèn)為是對我的輕視或者說低估。
對了,需求中有個重要的部分,那就是數(shù)據(jù)同步。因?yàn)镚entleman長期定居在國外,每年只回國兩次,每次大概一個半月,平時他都是通過IM和Email來管理他的公司。
正文:(三)需求確定2
我用2天時間,把他們原先的老系統(tǒng)的所有功能,都‘學(xué)習(xí)’了一遍,在自己大腦中已經(jīng)有了一個比較清晰的輪廓。其實(shí)行業(yè)軟件,大家只要熟悉其業(yè)務(wù)流程,就會感覺非常簡單。因?yàn)閺某绦驅(qū)崿F(xiàn)上來看,主要工作就是數(shù)據(jù)庫的表結(jié)構(gòu)設(shè)計(jì),以及相關(guān)前臺界面的操作合理性。
Gentleman在他回CA國之前,約我再見一次面,并給我發(fā)來一份他自己整理的需求文檔(20頁左右)。因?yàn)槲野滋煲I习?,而他的返程機(jī)票已經(jīng)訂好,所以我們只能約定好晚上見面。這次,他約我的地點(diǎn)是一家五星級酒店的自助餐廳。用他的話說,他不知道該去哪合適,只知道這個地方吃飯還比較自在,他喜歡這的環(huán)境。這家自助餐廳給我留下的印象,就是用餐的外國人比中國人多,當(dāng)然Gentleman給我的感覺也有點(diǎn)像個外國人,只是和我說話的時候還是用中文而已。
我們邊吃邊談系統(tǒng)的需求,他把自己需求文件中描述的內(nèi)容,再給我講述一遍。而且講得非常仔細(xì),生怕我有不明白地方。其實(shí)他說的大部分內(nèi)容,對于一個有8年開發(fā)經(jīng)驗(yàn)的程序員來說,完全沒必說得這么細(xì)致。當(dāng)然,我也不打斷他的思路,只是默默地聽著,因?yàn)槲也幌胱屗詾槲液芸裢N铱粗J(rèn)真的神情,思想反倒有點(diǎn)走神,腦子里尋思這一個問題:我什么時候能像他這樣工作和生活?
就系統(tǒng)的需求,我們聊了大概有3-4個小時,從自助餐廳到酒店大廳的會客區(qū)。Gentleman想把他所有能想到的想法和問題都告訴我,因?yàn)樗魈炀鸵w回CA國,這半年內(nèi),再也沒有這樣好的溝通機(jī)會了,畢竟Email中的描述只能停留在字面上。
那夜,我回去后,腦子里并沒想任何系統(tǒng)需求,只是一直在想:我什么時候能像他這樣工作和生活?
正文:(四)系統(tǒng)整體設(shè)計(jì)1
需求大致上了解以后,我開始著手系統(tǒng)的整體設(shè)計(jì)工作。
首先,從應(yīng)用角度上來看,這個系統(tǒng)是準(zhǔn)備在一家30人左右的公司運(yùn)行,而且Gentleman需要在自己的筆記本上安裝一套系統(tǒng),并與國內(nèi)公司這邊進(jìn)行數(shù)據(jù)同步。另外,他們公司在每年的春秋廣交會期間,都會帶產(chǎn)品去參展,期間有5-6臺筆記本需要使用系統(tǒng),以便隨時給客戶報價。所以說,各個數(shù)據(jù)庫之間的同步,是這個系統(tǒng)的一個非常重要內(nèi)容。
其次,我開發(fā)系統(tǒng)有個習(xí)慣,即在完成系統(tǒng)功能的同時,比較注重界面的設(shè)計(jì)。這個習(xí)慣,也讓我在這個系統(tǒng)上多花了30-40%的時間(Gentleman對于界面并未做任何要求)。但我認(rèn)為是必要的,我們程序員在寫程序的時候,都使用IDE工具,我個人的感覺,如果這個開發(fā)工具非常丑陋或看起來別扭,在開發(fā)系統(tǒng)的時候,是會非常不舒服的。同理,業(yè)務(wù)人員每天都是使用這套系統(tǒng)來工作,如果系統(tǒng)的界面非常差,操作起來很別扭,那工作簡直就是遭罪。
還有,系統(tǒng)的整體框架。我沒有采用以前開發(fā)過度系統(tǒng)框架,雖然這樣能節(jié)省我很多時間。但我仔細(xì)考慮了一下,由于這個系統(tǒng)對于時間要求并不緊迫,而我也想積累更多的系統(tǒng)框架,所以最終決定在原框架的基礎(chǔ)上做許多升級改良,以便更試用于這套系統(tǒng)。
(不少程序員開發(fā)系統(tǒng),是一套框架多處使用。我認(rèn)為如果時間不是很緊張的情況下,完全可以設(shè)計(jì)更好的方案。這樣在接下一單項(xiàng)目的時候,就可以有更多更好的系統(tǒng)演示給客戶看)
系統(tǒng)的功能就像人的五臟六腑,界面則是人的長相和外衣;長相雖然不影響身體健康,但絕對影響找對象,呵呵,所以說,界面是個不大不小的問題。
正文:(五)系統(tǒng)整體設(shè)計(jì)2
Gentleman回CA國后的一個月內(nèi),他仍然每周都給我發(fā)過來最新的系統(tǒng)需求,其中有專題性質(zhì)的(例如:某處的價格算法,以及價格調(diào)整的系列影響),也有系統(tǒng)整體性的需求調(diào)整。我則有條不紊地地分析著每份需求文件,從這些需求文件中,我能感覺到Gentleman對這個系統(tǒng)的期望值很高,因?yàn)樗粌H是在提需求,甚至是在做程序設(shè)計(jì)工作,哪些部分需要加按鈕,這些按鈕完成什么功能,具體某個字段是下拉列表顯示,還是彈出窗口等等。
在此期間,我并未急于做實(shí)質(zhì)性的業(yè)務(wù)程序開發(fā)工作。我從Gentleman的眾多需求文件,逐步整理和設(shè)計(jì)出系統(tǒng)的幾個核心表結(jié)構(gòu),在這幾個核心表結(jié)構(gòu)還沒有相對穩(wěn)定之前,我是不會寫一行業(yè)務(wù)程序代碼的,這是原則。當(dāng)然,我的程序框架的改進(jìn)工作是一直在同步進(jìn)行的,因?yàn)槌绦蚩蚣懿糠趾蜆I(yè)務(wù)程序部分幾乎是平行的,只需要在框架中考慮到幾處重要的StatusBar和ProgressBar,以及系統(tǒng)的整體顯示風(fēng)格即可。
(即便如此,在后續(xù)的開發(fā)過程中,還是出現(xiàn)了需要調(diào)整核心表結(jié)構(gòu)的情況,當(dāng)然這是后話,暫且不提)
隨著核心表結(jié)構(gòu)的設(shè)計(jì)過程,我的腦海中正在一步步地形成整套系統(tǒng)的數(shù)據(jù)脈絡(luò)(主業(yè)務(wù)數(shù)據(jù)流和輔助數(shù)據(jù)流)。與此同時,Gentleman經(jīng)常在發(fā)送新需求文件的同時,詢問系統(tǒng)的進(jìn)度情況。而此時的系統(tǒng)進(jìn)度只是在我腦海中,在一份數(shù)據(jù)庫表結(jié)構(gòu)文件中(我沒去寫非常詳盡的設(shè)計(jì)資料,因?yàn)橐粋€人的系統(tǒng)沒必要把過多的時間放在文檔上,文檔工作是對于協(xié)同開發(fā)小組比較重要的),我無法讓Gentleman感知進(jìn)度的情況。我只是告訴他正在做系統(tǒng)的設(shè)計(jì)工作,我也沒發(fā)送改進(jìn)好的程序框架給他看,我認(rèn)為把一個半成品給對方看,還不如不給對方看。
Gentleman很理解我的工作,雖然我的當(dāng)前的工作匯報只是停留在口頭上。噢,又忘交代了,Gentleman在成為商人以前是學(xué)計(jì)算機(jī)專業(yè)的,不過,我至今還不知道他是否當(dāng)過程序員。
中間插一討論篇《程序風(fēng)格》,本篇與這個項(xiàng)目開發(fā)有些關(guān)系,但并不納入到正文中。
歡迎各位程序開發(fā)高手積極討論一下。
討論篇1:程序風(fēng)格
程序是什么?不同的角度有不同的看法,比較經(jīng)典的論斷是 程序=數(shù)據(jù)+算法。數(shù)據(jù)是一套系統(tǒng)的核心,他的地位是不可動搖的,好比人民的溫飽問題。算法是什么,算法是系統(tǒng)的引擎,算法的好壞優(yōu)劣決定了程序執(zhí)行的效率。但隨著現(xiàn)在硬件技術(shù)的提高,很多程序員已經(jīng)淡化了算法的重要性,以完成功能為標(biāo)準(zhǔn),這是可悲的事情。
依我的看法,程序不光是數(shù)據(jù)+算法,那只是程序的行體部分;程序還需要有風(fēng)格,這才是程序的神態(tài)部分。只有形神兼?zhèn)涞某绦颍攀且粋€優(yōu)秀的程序。程序風(fēng)格又包涵哪些內(nèi)容呢?在解釋這個問題之前,我們先設(shè)想一下,如果一個閉月羞花的美女,出口就是臟字;如果一篇行文灑脫的文章,字確寫得東倒西歪;如果一座雄偉的山峰,上面確寸草不生。那樣是不是很煞風(fēng)景?
程序風(fēng)格是什么?程序風(fēng)格就是一個程序中,在數(shù)據(jù)內(nèi)容以外所體現(xiàn)出來的內(nèi)涵,它表現(xiàn)在程序的各個方面。從使用者的角度:主要體現(xiàn)在程序的整體顯示風(fēng)格(顏色基調(diào)、圖標(biāo)風(fēng)格、字體大?。┖徒换ワL(fēng)格(數(shù)據(jù)組合方式、功能區(qū)劃分、操作流程);從程序開發(fā)者的角度,它包括項(xiàng)目的管理、源文件的組織、代碼的風(fēng)格、注釋的寫法。
對于一個人的項(xiàng)目,程序的風(fēng)格就取決于你的個人風(fēng)格。程序員在鍛煉開發(fā)技術(shù)水平的同時,應(yīng)該同時培養(yǎng)你的程序風(fēng)格。
恭候拍磚!
正文:(六)Coding 1
程序的風(fēng)格和核心數(shù)據(jù)庫表基本確定后,我開始了系統(tǒng)的模塊設(shè)計(jì)和編碼工作。我的基本思路是,按照程序模塊的重要性,逐個模塊實(shí)現(xiàn)。單個模塊的設(shè)計(jì)和編碼同時進(jìn)行的,完成好一個模塊,就發(fā)送給Gentleman審核,以模塊程序?yàn)榻涣鬏d體,方便雙方溝通。
夜晚22:00后,靜夜孤燈下,一杯水,一個人。時而低頭沉思,時而握筆繪圖,時而指走鍵盤,這就是我平時工作的畫面。一行行代碼,一個個畫面就這樣躍然屏幕上。
系統(tǒng)中最先做到是產(chǎn)品管理模塊,大家可能會認(rèn)為這樣的模塊應(yīng)該是比較簡單的。是的,如果只是實(shí)現(xiàn)新建、編輯、刪除功能的話,肯定很簡單,但我確故意要將簡單的東西復(fù)雜化。廚師的水平高低,不在菜上,而在于做菜的功夫上。
我在實(shí)現(xiàn)產(chǎn)品管理模塊時,考慮到很多問題。如何將主貨號和詳細(xì)貨號關(guān)聯(lián)?主貨號中的哪些字段應(yīng)該與詳細(xì)貨號中的相同,兩者之間應(yīng)該怎么顯示和編輯最合理?程序?qū)崿F(xiàn)的過程中,哪些模塊可以共用,哪些字段需要冗余?編輯某個貨號的時候,應(yīng)該怎么顯示其他貨號的詳細(xì)內(nèi)容作為參考?怎么讓業(yè)務(wù)員輸入最少的信息即可完成操作?
上面這些問題,有Gentleman提到的,更有Gentleman沒提到的。我認(rèn)為系統(tǒng)的開發(fā)過程,就像一段外語的翻譯過程,有人是直譯,有人是意譯,孰高孰低,明眼人一看就知道。至于其中多付出的勞動,雖然只有自己知道,但同樣可以體現(xiàn)在你的勞動成果中。
在我的觀念中,開發(fā)系統(tǒng)不僅僅是為了開發(fā)而開發(fā),應(yīng)該再提升一個高度,至少要讓自己滿意。后來證實(shí)我的思路是正確的,Gentleman對于我的程序?qū)崿F(xiàn)方式,很滿意,或者說贊賞。以至于他總是說我聰明,能準(zhǔn)確地理解他的意圖,并恰當(dāng)?shù)貙?shí)現(xiàn)出來。具體體現(xiàn)在他的需求文檔中,以往那些瑣碎的、近似設(shè)計(jì)的描述少了,他只提他想要的結(jié)果,具體實(shí)現(xiàn)他已經(jīng)不用操心了 - 這正是我的目的。
我和Gentleman的關(guān)系,開始有點(diǎn)像Partner了。
正文:(七)Coding 2
自從編碼開始后,項(xiàng)目開發(fā)工作似乎進(jìn)入了正軌。
這套系統(tǒng)的編碼過程中,有一個十分麻煩的地方,那就是貨號價格的變化,需要更新多非常多的地方。這些都是Gentleman在常年的工作中總結(jié)出來的,他心中非常清楚。他只要一看這些價格數(shù)字,就能知道哪些是正確更新后的,哪些是未更新的??晌以诙虝r間內(nèi)確是很難做到的這一點(diǎn)的,因此,我單獨(dú)寫了一份價格更新對照表,雖說整理著份文件花了不少時間,但磨刀不誤砍柴功,這份文件在后續(xù)的工作中發(fā)揮了重要的作用。
因此,我認(rèn)為在開發(fā)過程中,對于那些容易混淆或需要非常仔細(xì)的地方(例如:本系統(tǒng)中的各種價格組成、公式、更新對照等),應(yīng)該單獨(dú)寫份文檔作為項(xiàng)目參考資料(這份文檔一定要準(zhǔn)確無誤),即便是一個人開發(fā)系統(tǒng),也有必要。就像Windows API參考文檔一樣,當(dāng)程序需要調(diào)用具體API函數(shù)的時候,只要查一下參考文檔就可以了,完全沒必要去記住那些具體參數(shù),因?yàn)槎虝r間內(nèi)去記住那些參數(shù),是不現(xiàn)實(shí)的。隨著開發(fā)的過程,對于那些經(jīng)常調(diào)用的部分,自然就熟悉了。
編碼的過程,是對設(shè)計(jì)的逐步修正的過程。設(shè)計(jì)時理解不準(zhǔn)確的部分,在Coding的過程中,都會逐一發(fā)現(xiàn)。
很多人羨慕一個人開發(fā)系統(tǒng),其實(shí)一個人開發(fā)系統(tǒng)的優(yōu)勢和劣勢同樣明顯。優(yōu)勢在于整個開發(fā)中,省卻了所有的開發(fā)溝通時間,因?yàn)檎麄€系統(tǒng)(哪怕是非常細(xì)小的環(huán)節(jié))都了然于胸;劣勢就是孤單,遇到任何技術(shù)問題都必須自己一個人去解決,解決問題后的快感也沒人分享。
這個劣勢在后續(xù)的開發(fā)中,給項(xiàng)目帶來了一點(diǎn)問題。
正文:(八)Coding 3
編碼的工作是辛苦的,遠(yuǎn)沒有程序設(shè)計(jì)時的天馬行空,需要的是嚴(yán)謹(jǐn)?shù)墓ぷ鲬B(tài)度、良好的編碼習(xí)慣和相對完整的開發(fā)時間。對于Part-Time開發(fā)者來說,很多人覺得非常辛苦,主要是因?yàn)闆]有完整的開發(fā)時間。
項(xiàng)目的開始階段,一般開發(fā)者都能保持相對高的開發(fā)熱情,但一旦進(jìn)入編碼的中期,這種熱情支撐下的開發(fā)進(jìn)度就開始疲態(tài)盡顯。我也是遇到了同樣的問題,項(xiàng)目進(jìn)行了3-4個月左右的時候,開發(fā)進(jìn)度明顯比預(yù)期的低了很多,就連大洋彼岸的Gentleman也能明顯感覺得到。
Gentlman開始有些著急了,經(jīng)常在Email中詢問開發(fā)進(jìn)度(其實(shí)就是催促開發(fā)進(jìn)度),并主動提出快速開發(fā)獎勵。我非常清楚Gentleman的心思,首先,他是想在下一次的廣交會之前使用上這套新的系統(tǒng),以便提高工作效率;其次,他是認(rèn)為我當(dāng)前的系統(tǒng)開發(fā)質(zhì)量比他原先預(yù)期的要好,所以很樂意提高開發(fā)費(fèi)用。面對相對優(yōu)厚的額外獎勵(這是Gentleman高明的地方),我也很想提高效率,但由于種種原因我很難進(jìn)入快速開發(fā)狀態(tài)。
多說兩句當(dāng)時的情況,權(quán)當(dāng)為自己開脫吧。其一,項(xiàng)目進(jìn)展到3-4個月左右的時候,我老婆正到預(yù)產(chǎn)期,我可愛的女兒來到了這個花花世界;其二,在去年轟轟烈烈的A股牛市中,我這新股民懷著快速發(fā)財?shù)膲粝?,?500點(diǎn)的高位殺入了大量的資金,結(jié)果虧損嚴(yán)重,致命的是這些資金有大部分不是自己的存款。這讓我承受了巨大的精神壓力,幾次出現(xiàn)失眠的情況。僅此兩點(diǎn),大家就可想而知我當(dāng)時的狀態(tài)了。
心態(tài)上無法進(jìn)入工作狀態(tài),時間上無法保證開發(fā)時間,一個人的戰(zhàn)斗,孤立無援,我把項(xiàng)目帶入到了最艱難的境地。
正文:(九)Coding 4
面對Gentleman的額外獎勵,我深感慚愧,雖然內(nèi)心很想加快開發(fā)進(jìn)度,但當(dāng)時的心思確又很難聚焦到項(xiàng)目開發(fā)上來。這樣渾渾噩噩的狀態(tài)大概延續(xù)了一個月左右,項(xiàng)目的開發(fā)進(jìn)度比預(yù)期已經(jīng)差了一大塊。我?guī)状蜗朐贓mail中告訴Gentleman我的痛苦,但炒股導(dǎo)致的心理失衡問題,怎么能讓他去承擔(dān)后果。我問心有愧??!
即便在如此情形下,程序的代碼質(zhì)量還是我把握的第一要素。要么不寫,要寫就一定要保證質(zhì)量,我絕對不會做殺雞取卵這樣的事。盲目上線帶來的一定是后續(xù)更大量的補(bǔ)救工作,同時也會影響客戶的信心。這一點(diǎn),應(yīng)該也是Gentleman欣賞我的地方之一。
隨著春季廣交會時間的日益臨近,Gentleman已經(jīng)感覺到項(xiàng)目無法在此之前完成,但他表現(xiàn)得非常大度。不僅沒有過多地責(zé)怪我,相反還繼續(xù)鼓勵我,額外獎勵依然有效,只是要求我全力把程序開發(fā)好。Gentleman的做法,讓我非常感動,我時常自己在問自己:如果我不能及時調(diào)整好心態(tài),不能堅(jiān)持把項(xiàng)目開發(fā)好,對得起Gentleman這樣的好人嗎?
我的名言:生命就是折騰與被折騰的過程。
這渾渾噩噩的一個多月,其實(shí)就是我個人心態(tài)的筑底過程,而這心態(tài)鑄底成功的因素中,我清楚,有Gentleman一份功勞。伴隨心態(tài)的調(diào)整成功,項(xiàng)目開發(fā)也重新步入正軌。當(dāng)然Gentleman也從CA國飛回到本市,開始籌備公司的春季廣交會的展覽。
準(zhǔn)確的說,此時此刻,系統(tǒng)的編碼工作已經(jīng)完成了80-90%
正文:(十)數(shù)據(jù)庫選型
個人項(xiàng)目中,心理層面的問題需要自我調(diào)節(jié),技術(shù)層面的問題同樣只能獨(dú)自解決,下面就寫點(diǎn)技術(shù)問題。
在這套系統(tǒng)的數(shù)據(jù)庫選型中,我是經(jīng)過一番思考的。從我個人技術(shù)熟悉程度上來說,是對DB2和Sql Server比較熟悉。但對于30人規(guī)模的中小型公司,沒必要選用過大的數(shù)據(jù)庫,Oracle、DB2這類首先被PASS掉了,在Sql Server、MySql、Sybase ASA中,MySql中,到底應(yīng)該選用哪個呢?
可能很多人認(rèn)為Sql Server應(yīng)該是首選,最初我也在重點(diǎn)考慮它。但是Sql Serverd數(shù)據(jù)庫,部署起來有點(diǎn)麻煩,考慮到Gentleman是長期在國外生活,在系統(tǒng)開發(fā)的過程中,我時常需要對數(shù)據(jù)庫的結(jié)構(gòu)進(jìn)行調(diào)整。因此,數(shù)據(jù)庫一定要便于打包和部署。其次,考慮到數(shù)據(jù)同步問題,因?yàn)檫@個系統(tǒng)最終數(shù)據(jù)庫的部署,是需要在公司本部放一個中心數(shù)據(jù)庫,另外幾臺筆記本上各放一個遠(yuǎn)程數(shù)據(jù)庫。而這些數(shù)據(jù)庫之間,要能夠非常方便的進(jìn)行數(shù)據(jù)同步。此時Sybase的Mobilink同步技術(shù)就進(jìn)入了我的視線。(在這個項(xiàng)目之前,我并未做過數(shù)據(jù)同步方面的工作)
綜合上面兩個主要問題,我最終選擇了 Sybase Asa 數(shù)據(jù)庫,這款數(shù)據(jù)庫,非常方便部署。更新數(shù)據(jù)庫的時候,只需要直接替換數(shù)據(jù)庫文件和日志文件就可以。而且我從Mobilink的資料中了解到,它是基于偶連接的同步技術(shù),專用于中心數(shù)據(jù)庫與多個移動數(shù)據(jù)庫的數(shù)據(jù)同步的解決方案。我心想:Mobilink技術(shù)簡直就是為我們這種應(yīng)用而設(shè)計(jì)的。
同為Sybase的產(chǎn)品,ASA數(shù)據(jù)庫理應(yīng)與Mobilink無縫銜接。
討論篇2:技術(shù)與應(yīng)用
很多在校的學(xué)生和入行的新人,總是最關(guān)心開發(fā)技術(shù),而且最關(guān)注流行技術(shù)。就好像流行時裝一樣,看哪些語言或工具流行,就學(xué)哪樣,有甚者把市場主流的應(yīng)用開發(fā)語言都學(xué)了個遍。其實(shí)大家會發(fā)現(xiàn)一個問題,即便學(xué)習(xí)了所有的開發(fā)語言,仍然不可能就此成為開發(fā)高手,因?yàn)樗麄儗W(xué)到的只是外在功夫,而非內(nèi)功。
關(guān)于技術(shù)的內(nèi)功和外功問題,大家只需要在開發(fā)的過程中,稍微用心體會一下,就可以找到練內(nèi)功的方法。寫代碼的時候是不是頻繁 Ctrl+C 和 Ctrl+V ,而不去琢磨復(fù)制過來這段代碼或算法的基本原理?函數(shù)中的參數(shù)設(shè)置,是否僅僅滿足功能就可以,還是需要預(yù)留下某個擴(kuò)展?哪些功能代碼可以抽象成一個類來實(shí)現(xiàn),而非在程序中到處Copy同樣的代碼?等等!
(書法作品中一筆一畫即能體現(xiàn)深厚的功底,想成為行家,就應(yīng)該在程序的每個地方有自己的心得)
同樣的程序,從客戶角度,他們關(guān)注的側(cè)重點(diǎn)是完全不同的。依據(jù)我的開發(fā)經(jīng)驗(yàn),客戶基本上不關(guān)注系統(tǒng)采用的技術(shù)架構(gòu),哪怕你說得天花亂墜,那最多只是談價格的一點(diǎn)小資本而已。他們關(guān)注的是系統(tǒng)功能,能否設(shè)計(jì)出他們認(rèn)為最快捷、最安全、最實(shí)用的系統(tǒng)?!奥浜蟆钡募夹g(shù),同樣有廣闊的生存空間。因?yàn)閷τ诳蛻簦m用的就是最好的。
一個人做項(xiàng)目的時候,請記?。杭夹g(shù)不是越新越好,而是越適用于項(xiàng)目越好,越熟悉的技術(shù)越好。在技術(shù)上你站得越高,項(xiàng)目的成功率就越高。(想學(xué)習(xí)和鍛煉新技術(shù),最好請到其他的項(xiàng)目組中學(xué)習(xí),因?yàn)橐粋€人的項(xiàng)目,新技術(shù)意味著無數(shù)未知的問題)
恭候高手拍磚!
正文:(十一)項(xiàng)目中期收款
Gentleman回國后的這一個多月時間,幾乎一直在忙于春季廣交會的事情,很少和我聯(lián)系。只是約定等他從廣交會回來后,讓我去他那領(lǐng)取部分項(xiàng)目款。
(在第一次面談的時候,Gentleman就問過我項(xiàng)目收費(fèi)方式的問題?,F(xiàn)在一般公司的付款方式是361方式,即30%作為項(xiàng)目啟動款,60%在項(xiàng)目驗(yàn)收后付款,10%的尾款最后在確認(rèn)系統(tǒng)運(yùn)行正常后付清。而我給Gentleman的答復(fù)是,項(xiàng)目開發(fā)前我不收任何款,等系統(tǒng)基本成型后(即客戶可以認(rèn)同開發(fā)質(zhì)量和效果后)付60%的項(xiàng)目款,正式上線運(yùn)行后,再付40%的項(xiàng)目款。
我之所以采取這樣的收款方式,首先,我對自己的開發(fā)實(shí)力有信心,相信客戶在見到系統(tǒng)后,會樂于付款;其次,我考慮對方是一家公司,而我是個人開發(fā)者,讓對方提前把錢付給個人,這其中的風(fēng)險明顯大于付給一家公司。而我關(guān)心的是項(xiàng)目款的多少,并非付款時間。)
這次,我們見面的地點(diǎn)是Gentleman在本市的House,我按照約定好的時間準(zhǔn)時到達(dá)。他的房子位于本市一段黃金海岸線上,從室內(nèi)就能看到浩瀚的大海,總面積約有160平米,價值至少兩百多萬。屋子以淺色調(diào)為主,家具并不多,顯得非常整潔。用Gentleman的話說,他常年定居在CA國,這房子基本是空著,只是回來的時候住這,所以陳設(shè)簡單了些。
我們的話題,始終圍繞著房子,而并沒有說太多關(guān)于項(xiàng)目的事情。那天,我才了解到,Gentleman在做生意之前,也是工薪族,居住在一套30平左右的老房子中。后來公司逐步地發(fā)展壯大,他家的房子也隨之換了三次,地段一次比一次好,面積一次比一次大,而他現(xiàn)在在CA國的家,是一棟獨(dú)門獨(dú)院的木房子。
從Gentleman家出來的時候,我已懷揣著剛收到的項(xiàng)目款,心中雖說有幾分成功的喜悅,但同樣有幾分抹不去的惆悵。
正文:(十二)意譯的煩惱
在整套系統(tǒng)開發(fā)的過程中,我一直采用‘意譯’的模式,對Gentleman所提出的需求進(jìn)行改進(jìn)設(shè)計(jì),但也有例外的情況。系統(tǒng)中有一個模塊是給工廠下生產(chǎn)通知單,在這個模塊的處理上,就出現(xiàn)了問題。
公司當(dāng)前的做法是依據(jù)合同中的產(chǎn)品數(shù)量,給工廠下達(dá)生產(chǎn)。一份合同由多種貨物組成,每種貨物的訂購數(shù)量和外銷價是不同的。實(shí)際工作中都是將一種貨物中所有的訂購數(shù)量都制定一家工廠生產(chǎn),當(dāng)時,我從邏輯角度上分析,認(rèn)為存在這種可能,即一種貨物分交給兩家以上的工廠生產(chǎn)。
所以我在設(shè)計(jì)中提出了改進(jìn)模塊的設(shè)計(jì)思路,并匯報給Gentleman,他當(dāng)時的反應(yīng)顯得有些猶豫。因?yàn)楝F(xiàn)在的實(shí)際工作中是不存在這樣的情況的,如果系統(tǒng)能實(shí)現(xiàn)到這種程度,肯定是更靈活,因此他就準(zhǔn)許了我的設(shè)計(jì)思路。
這個模塊的設(shè)計(jì)和實(shí)現(xiàn)過程中,由于要實(shí)現(xiàn)到同一種產(chǎn)品分配給多家工廠,并且訂購數(shù)量要動態(tài)分配和回收。所以需要考慮到情況就復(fù)雜了很多,時間自然也多花了N倍。最終實(shí)現(xiàn)出來的效果是非常不錯的,操作員可以清楚地看出每份合同下達(dá)的生產(chǎn)通知單,以及每種產(chǎn)品的生產(chǎn)數(shù)量。
但以上所認(rèn)為到的程序最佳實(shí)現(xiàn)效果,都僅僅是我個人認(rèn)為的狀態(tài)。當(dāng)把這個模塊拿到具體業(yè)務(wù)員那測試操作的時候,問題就顯現(xiàn)出來了。他們都反映麻煩,第一,從思路上和現(xiàn)狀有點(diǎn)差別,感覺別扭;第二,在操作步驟上又多了一步操作,耽誤時間。最后,Gentleman在考慮再三后,讓我把這個改進(jìn)模塊功能去掉,依舊實(shí)現(xiàn)最原始的需求。
后來我總結(jié)此次教訓(xùn),雖然模塊的功能更靈活、更強(qiáng)大,但客戶只需要他想要的,改進(jìn)模塊一定不能成為畫蛇添足。
正文:(十三)測試之痛1
程序編碼工作逐步接近尾聲,接踵而來的就是功能測試、模塊測試、集成測試、系統(tǒng)測試等。對于系統(tǒng)測試,開發(fā)人員大都不愿意去做的,因?yàn)檫@是一項(xiàng)既繁瑣、又無成就感的工作。
一套沒有經(jīng)過嚴(yán)格測試的系統(tǒng),就像一匹沒有韁繩的野馬,誰也不知道它發(fā)飆的時候,會跑到什么地方去。再繁瑣的工作也要做,初步的功能測試和模塊測試工作自然是由我自己來完成。可我發(fā)現(xiàn)個問題,我只要輸入一些數(shù)據(jù)到系統(tǒng)中,開始做測試工作,就會自然地進(jìn)入到一種自我欣賞系統(tǒng)的狀態(tài)中,一圈數(shù)據(jù)測試下來,只能找到少量的程序錯誤。
Bug大體上可以分為兩類,第一類是程序錯誤,例如:由于數(shù)據(jù)邊際校驗(yàn)不強(qiáng)而引起系統(tǒng)異常死機(jī),程序顯示不正確等;第二類是算法錯誤,即程序中某些數(shù)據(jù)的計(jì)算方法不正確,或數(shù)據(jù)更新不完整。對于第一類錯誤,我還好測試些,畢竟出現(xiàn)問題后,一目了然。但對于第二種錯誤,我根本無法察覺,例如一套產(chǎn)品的最終價格是58,我很難直接判斷出這個價格是正確計(jì)算結(jié)果,還是有問題。但對于有豐富經(jīng)驗(yàn)的業(yè)務(wù)員來說,他們是很容易做到的,因?yàn)檫@些價格他們太熟悉了。
考慮到我在測試過程中很難發(fā)現(xiàn)第二類錯誤,所以就和Gentleman商量,看能否找人來協(xié)助我做這部分的測試工作。(當(dāng)時我以為Gentleman的日子過得很瀟灑,身在國外,遙控公司,自己則周游列國,好不自在。)而他也沒含糊,一口就答應(yīng)下來,我真是喜出望外。
其實(shí)我的想法僅僅是,讓他找個心細(xì)的業(yè)務(wù)員來做系統(tǒng)的測試工作,但出乎意料的是,他居然親自上陣,自己一個人來做測試工作。
正文:(十四)測試之痛2
Gentleman是一個辦事認(rèn)真仔細(xì)的人,他每次測試完一個模塊后,都會詳細(xì)地記錄下錯誤的具體情況(效果、他估計(jì)的原因、在什么數(shù)據(jù)輸入流程下出現(xiàn)錯誤等等),然后發(fā)一份錯誤報告給我。有時為了描述一個錯誤,需要要寫上百字,并配以屏幕截圖。我見過他在電腦上輸漢字,基本上是二指禪的功夫,輸入速度非常慢。所以我可以想象,他在做完測試后,敲上一篇上千字的錯誤報告需要多少時間。而且,后來我從Gentleman那也證實(shí)了自己的猜測,他花在寫Email的時間,遠(yuǎn)多于測試時間。
雖然我多次建議Gentleman將測試工作交由下屬去做,但他一直都沒有同意。他說,系統(tǒng)的需求和設(shè)計(jì)過程,都是他全程參與的,換了誰都沒有他這么清楚。其中有很多地方都是與原系統(tǒng)不相同的,如果換由其他人來做測試的話,是測試不出問題來的。他堅(jiān)持測試到基本可用的狀態(tài),再交由其他人來做后續(xù)測試。
我真的為他這種認(rèn)真的工作態(tài)度所感動,所以他每次發(fā)送新的錯誤報告后,我都會盡快把這個錯誤修改好。我們就這樣合作,他一有空就測試程序,然后把錯誤報告發(fā)給我,我將修改好的程序發(fā)送給他,他最后再做一次錯誤修正后確認(rèn)測試。為了我們的測試能基于相同數(shù)據(jù),我們之間還經(jīng)常交換數(shù)據(jù)庫,固定以某段數(shù)據(jù)為測試基礎(chǔ)。初略估計(jì),這個測試階段他的工作量應(yīng)該是我的2-3倍,因?yàn)榇蟛糠值腂ug,都很容易修改,只有少量幾個需要調(diào)整較多的地方。
看著系統(tǒng)一天比一天強(qiáng)壯,這種感覺真的很美妙,就像練健美的人看著自己的肌肉越來越發(fā)達(dá),喝酒的人感覺自己酒量越來越大一樣,都是很享受到事情。
同時,Gentleman也基本上切換到新系統(tǒng)下工作了,只是用老系統(tǒng)來查以前的數(shù)據(jù)。因?yàn)橛辛诵孪到y(tǒng)的比較后,他已經(jīng)無法忍受老系統(tǒng)的低效率了。
正文:(十五)測試之痛3
系統(tǒng)經(jīng)過Gentleman和我的多次測試和修改后,健壯性得到了顯著的提高。在測試期間Gentleman想從CA國飛回來,專程為系統(tǒng)上線前做最后的實(shí)戰(zhàn)測試。我是不贊同的他這么做的,當(dāng)時正好趕上萬眾矚目的北京奧運(yùn)會,他的簽證上也遇到了些麻煩,所以也就順利成章地取消了這一臨時計(jì)劃。
雖然Gentleman自己沒回來,但他專門安排了他的助理(本文中稱呼為MissLee)來協(xié)助我做上線前的最后測試工作。我和Gentleman協(xié)商后,制定的計(jì)劃是:測試數(shù)據(jù)庫放在MissLee的電腦上(以后再配備專用的數(shù)據(jù)庫服務(wù)器),首先在營銷部的5臺電腦上安裝客戶端程序。即本套系統(tǒng)先由營銷部來做實(shí)戰(zhàn)測試,因?yàn)樗麄兊臉I(yè)務(wù)中使用到的模塊最多,數(shù)據(jù)所走到流程也最全。當(dāng)系統(tǒng)測試沒有問題后,再全面推廣到公司的所有機(jī)器上,這個過程預(yù)計(jì)2-4周。
系統(tǒng)安裝到營銷部后的那些天,他們馬上就有很多信息反饋。依據(jù)Gentleman的要求,營銷部所有的反饋意見都統(tǒng)一發(fā)到MissLee那兒,再轉(zhuǎn)交給Gentleman本人。Gentleman和MissLee會對這些信息反饋進(jìn)行分析,例如:哪些意見是非常正確的,系統(tǒng)的確需要在某處添加數(shù)據(jù)項(xiàng)、添加功能或數(shù)據(jù)導(dǎo)出。然后他們會整理好,發(fā)送Email給我。我越來越覺得Gentleman真是個Good Partner,他的事先安排,讓我的工作井然有序,而不是面對嗡嗡作響的各種嘈雜意見,這應(yīng)該是很多人值得學(xué)習(xí)的地方。
當(dāng)然,這期間系統(tǒng)也有很多‘莫名其妙’的錯誤,例如,他們在導(dǎo)出一份報表文件的時候,進(jìn)度條總是停在30%處就不動了。而我在自己的電腦上,和Gentleman的電腦上都測試不出這樣的問題(這些問題大多是因?yàn)?,產(chǎn)品庫中缺少了某些產(chǎn)品的圖片啊,或金山詞霸的自動取詞功能引起系統(tǒng)中特效按鈕顯示不正確等等)。類似于這種情況的問題大概有五六次,我都是需要及時到現(xiàn)場測試,然后逐一排查原因,最終找到問題所在。
解決這些疑難雜癥的話說起來很輕松,但在實(shí)際找尋錯誤的過程中,沒有交流,只有自己一個人琢磨。都是在結(jié)合程序源代碼的基礎(chǔ)上,仔細(xì)排查錯誤,這個過程既曲折更痛苦,需要相當(dāng)?shù)拈_發(fā)經(jīng)驗(yàn)。以至于后來Gentleman開玩笑,說我無所不能,在我這所有問題都不是問題。
經(jīng)歷了半個多月的系統(tǒng)測試后,營銷部人員,也由最初的對系統(tǒng)很不放心,到享受系統(tǒng)帶來的高效工作。
討論篇3:項(xiàng)目之上的情感
在本文前面的若干節(jié)中,我已經(jīng)多次提及Gentleman身上的特點(diǎn),認(rèn)真仔細(xì),善待員工。原本我以為他平時的工作很輕松,可后來才知道,他每天工作都在十小時以上。國內(nèi)與CA國有八個小時的時差,這邊白天上班的時候(他那就是17:00-01:00),他基本上都掛在IM上,隨時與公司這邊保持著聯(lián)系,而且還要處理大量的客戶Email。
現(xiàn)在回想起測試階段,我把大量的測試工作都交由他來做,真是于心不忍。系統(tǒng)安裝到營銷部的時候,MissLee和其他同事也都說Gentleman非常辛苦,希望系統(tǒng)能給他減少負(fù)荷。我當(dāng)時心中就在想一個問題,當(dāng)今社會,有幾家公司的員工會這樣為老板說話?大家為什么會這樣向著老板說話?如果Gentleman身上沒有特殊的品質(zhì),員工又是會怎么樣?看到了這些,我就不難理解,為什么一家30人不到的貿(mào)易公司,每年的貿(mào)易量卻能達(dá)到2000標(biāo)箱以上。
今年一場金融危機(jī)幾乎席卷了全球,我由于炒股的原因,所以非常關(guān)注全球各股市的走勢。我能意識到這場危機(jī)對于出口型公司的沖擊會有多大,所以在9月18日的時候,冒昧地給Gentleman發(fā)了一封與項(xiàng)目無關(guān)的Email。全文如下:
“您好!
不知您最近是否關(guān)心全球經(jīng)濟(jì)動向?現(xiàn)在能看到的情況已經(jīng)非常糟糕。美國五大投資銀行已經(jīng)倒閉和被他人收購了三個(貝爾斯登、雷曼、美林),另外兩個(高盛、摩根士丹利)也是關(guān)注的焦點(diǎn),昨天高盛股價下滑23%,摩根士丹利股價大跌44%。
上周我和一個高中同學(xué)(他是耶魯博士畢業(yè),就職于美國雷曼兄弟公司紐約總部)MSN上聊天,他說美國遇到1929年以來最大的金融危機(jī)。上周末雷曼即宣布破產(chǎn),美聯(lián)儲前主席格林斯潘在接受采訪時也說,美國遭遇百年不遇的金融危機(jī),經(jīng)濟(jì)回退很難避免。美股最近3天出現(xiàn)了2次4%以上的跌幅,這是美國911事件以來單日最大的跌幅。
我不清楚會對全球經(jīng)濟(jì)產(chǎn)生多大的振動,現(xiàn)在全球的股市(美洲、歐洲、亞洲)都是一片暴跌。波羅的海航運(yùn)指數(shù)也從高點(diǎn)12000點(diǎn),跌到現(xiàn)在不到6000點(diǎn),這些都說明全球經(jīng)濟(jì)可能面臨萎縮。我的一個朋友,是青島一家4S店的總經(jīng)理,他們最近2個月的汽車銷售量為0,搞得他壓力非常大。前天就是去他公司看套行業(yè)軟件去了,和他聊了一下上面這些話題。他前期忙于生意,都不太清楚原來全球經(jīng)濟(jì)發(fā)生了這些事情,感覺他聽后心情很沉重。您公司是做外貿(mào),應(yīng)該對這更敏感些,我也不了解這些變化會對咱們這個行業(yè)產(chǎn)生多大的影響,提前做有些準(zhǔn)備總是有益的,希望我的擔(dān)心是多余的?!?/p>
下面冒昧地將Gentleman的回信公布于此,希望他不會因此責(zé)怪我。
“謝謝你的關(guān)心!非常感謝,真的。我每天都在關(guān)注這些事情。一句話,冬天快要來了!
1929年美國發(fā)生了大蕭條,稱為GREAT DEPRESSION.最近2-3年內(nèi),極有可能會發(fā)生GREATER DEPRESSION.
格林斯潘說,美國遭遇百年不遇的金融危機(jī),并沒有夸張--雖然這是他一系列政策埋下的種子。
對于我們生意的影響有多大,現(xiàn)在還很難說。一種可能是:覆巢之下,焉有完卵?另一種是,滄海橫流,方顯出英雄本色。
(這話說的有點(diǎn)大了,我并沒有把握。勉勵自己而已。)謝謝!”
這封Email之后,我能明顯感覺出我們的關(guān)系更親近了,已經(jīng)超出項(xiàng)目范疇了。一個人的成功不可能是偶然的,Gentleman身上有很多值得我學(xué)習(xí)的地方,在后續(xù)的Email中我直言,項(xiàng)目的收入對于我來說是次要的,能跟著成功男士學(xué)習(xí)優(yōu)秀的品質(zhì)對我來說更為寶貴。
正文:(十六)數(shù)據(jù)同步1
系統(tǒng)從一開始設(shè)計(jì)的時候,就有數(shù)據(jù)同步的需求,即公司局域網(wǎng)的電腦都訪問中心服務(wù)器的數(shù)據(jù)庫,而各臺筆記本都訪問本機(jī)上的分?jǐn)?shù)據(jù)庫,兩者是完全同構(gòu)的數(shù)據(jù)庫。
由于在接這個項(xiàng)目之前,我沒做過任何數(shù)據(jù)同步的項(xiàng)目。因此,一開始我還設(shè)想著自己寫程序來實(shí)現(xiàn)數(shù)據(jù)同步功能,即設(shè)定時間點(diǎn),然后通過程序?qū)С雒總€數(shù)據(jù)庫某段時間內(nèi)的數(shù)據(jù)(新建、修改、刪除),然后再將導(dǎo)出的數(shù)據(jù)進(jìn)行比較,最終求出數(shù)據(jù)合集??缮晕⒖紤]點(diǎn)詳細(xì)的實(shí)現(xiàn)過程就覺得頭大,情況太復(fù)雜了。如果要實(shí)現(xiàn)到應(yīng)用的程度,可能單寫數(shù)據(jù)同步程序所花費(fèi)的精力,就遠(yuǎn)遠(yuǎn)超過了寫業(yè)務(wù)程序,所以,最終放棄了這種不現(xiàn)實(shí)的想法。
(在校時,我的一位同學(xué)接了個進(jìn)銷存項(xiàng)目,可當(dāng)時我們所掌握的技術(shù)主要集中在C++操作文件上,即所有的數(shù)據(jù)都是存儲在二進(jìn)制文件中。這老兄完成這個項(xiàng)目,楞是沒有用數(shù)據(jù)庫。所有的數(shù)據(jù)全用二進(jìn)制文件來操作,讀寫刪查都是自己寫代碼,沒有用一句SQL。用他的話說,簡直就是自己寫了個數(shù)據(jù)庫啊,累得快吐血,效果還很一般。)
同樣的道理,如果我自己去寫數(shù)據(jù)同步程序的話,我估計(jì)效果肯定和我那位同學(xué)當(dāng)年一樣。所以斷然不能自己去寫數(shù)據(jù)同步,即便我真有這能力寫出來,那也不能這樣做。因?yàn)槿绻麡I(yè)務(wù)發(fā)生變化或系統(tǒng)擴(kuò)展,需要對數(shù)據(jù)庫表進(jìn)行調(diào)整(新增表或字段),那我的數(shù)據(jù)同步程序還要自己去重新完善,我想那一定是個場災(zāi)難。
數(shù)據(jù)對于任何公司來說,都是最寶貴的,所以我要選用成熟而安全的方式來實(shí)現(xiàn)數(shù)據(jù)同步。
正文:(十七)數(shù)據(jù)同步2
確定選用數(shù)據(jù)庫同步工具來實(shí)現(xiàn)數(shù)據(jù)同步后,我就開始Google數(shù)據(jù)庫同步工具,其中Sybase Mobilink進(jìn)入了我的視線,它的主要功能介紹如下:
“MobiLink 同步允許在符合 ODBC 標(biāo)準(zhǔn)的統(tǒng)一數(shù)據(jù)庫和 Adaptive Server Anywhere 或 UltraLite 遠(yuǎn)程數(shù)據(jù)庫之間進(jìn)行復(fù)制。在本教程中使用的是 Adaptive Server Anywhere 遠(yuǎn)程數(shù)據(jù)庫。統(tǒng)一數(shù)據(jù)庫能夠是使用 Sybase Adaptive Server Anywhere、Sybase Adaptive Server Enterprise、Oracle、Microsoft SQL Server 或 IBM DB2 生成的數(shù)據(jù)庫。
MobiLink 適用于將一個統(tǒng)一數(shù)據(jù)服務(wù)器和大量遠(yuǎn)程數(shù)據(jù)庫進(jìn)行同步(通常包含多個移動數(shù)據(jù)庫)。遠(yuǎn)程站點(diǎn)的管理和資源需要已降到了最低限度。此系統(tǒng)是基于偶連接的,并且遠(yuǎn)程站點(diǎn)可隨時進(jìn)行連接。在每次進(jìn)行連接之后,數(shù)據(jù)庫是完全同步的。
MobiLink 的工作方式是:將遠(yuǎn)程數(shù)據(jù)庫上的多個事務(wù)的結(jié)果合并成一個更改集,然后應(yīng)用到統(tǒng)一數(shù)據(jù)庫中。因?yàn)橥绞冀K在事務(wù)邊界進(jìn)行的,所以保持了參照完整性。不保留在組件事務(wù)過程中所做的各個更改的順序:因?yàn)閺牟粡?fù)制未提交的數(shù)據(jù),所以保留了數(shù)據(jù)完整性?!?/p>
乍看到這些介紹的時候,我簡直是喜出望外,這些同步功能簡直就是為本項(xiàng)目需求所設(shè)計(jì)的啊。
我趕忙連夜下載了一套 Sql Anywhere 9 開發(fā)版(其中包含Mobilink同步工具),依據(jù)一些文檔資料,我開始測試起數(shù)據(jù)同步功能來。先新建好一個中心數(shù)據(jù)庫和兩個遠(yuǎn)程數(shù)據(jù)庫,然后按照文檔中提供的例子,啟動同步服務(wù)器和同步客戶端。沒想到進(jìn)行得異常順利,遠(yuǎn)程數(shù)據(jù)庫和中心數(shù)據(jù)庫的數(shù)據(jù)很快就實(shí)現(xiàn)了同步,我有點(diǎn)找不到北了,心想原本以為麻煩的問題,原來就是層窗戶紙啊!
可高興勁還來得及過去,就發(fā)現(xiàn)一個問題,其他所有的同步都正常,就是刪除操作的同步出來點(diǎn)問題。遠(yuǎn)程數(shù)據(jù)庫中的刪除可以正常同步到中心數(shù)據(jù)庫上,但遠(yuǎn)程數(shù)據(jù)庫之間卻無法同步刪除操作。具體情況的描述如下:
中心服務(wù)器取名CenterDB(Server),兩個遠(yuǎn)程數(shù)據(jù)庫分別取名RemoteDB1(Client1)和RemoteDB2(Client2),當(dāng)你在RemoteDB1(Client1)中刪除某條記錄后,Clinet1執(zhí)行同步語句后,能同步到CenterDB(Server)上,即CenterDB中也刪除了這條記錄。接著在Client2上執(zhí)行同步語句后,卻發(fā)現(xiàn)這條記錄依然存在于RemoteDB2(Client2)中。
這是我在MobiLink使用過程中遇到的第一個麻煩。
正文:(十八)數(shù)據(jù)同步3
為了刪除無法同步的問題,我到處Google解決方法,可網(wǎng)上幾乎沒有什么討論MobiLink的文章,僅有的幾篇都是介紹性的文章,逐漸地我開始有點(diǎn)毛爪了??蒅entleman在得知這個問題后,確表現(xiàn)得非常大度,他對我說,如果實(shí)在解決不了刪除同步的問題,那系統(tǒng)在使用的過程中,就采取行政手段來同步。即需要數(shù)據(jù)刪除的時候,大家就記錄下來,然后互相發(fā)Email通知。
我很難想象在系統(tǒng)使用過程中,大家互相發(fā)Email通知刪除的時候,會順便暗自問候我這個程序開發(fā)者多少次。我沒得選擇,必須找出辦法來。在翻了很多資料和搜索大量網(wǎng)頁后,終于在Sybase網(wǎng)站上一個英文的幫助文件上,找到了這個問題的解決方法。
原來MobiLink在實(shí)現(xiàn)數(shù)據(jù)同步的過程中,中心數(shù)據(jù)庫的刪除就是無法同步到遠(yuǎn)程數(shù)據(jù)庫上,而遠(yuǎn)程數(shù)據(jù)庫的刪除可以同步到中心數(shù)據(jù)庫上。如果想實(shí)現(xiàn)這種刪除的數(shù)據(jù)同步,有兩種解決辦法。第一種方法是建立影子表,即對每個表都新建一個影子表,某條記錄刪除的時候,都在其對應(yīng)的影子表中記錄下刪除行的主鍵;第二種方法是邏輯刪除,即在每個表中建一個刪除標(biāo)識字段。
考慮到實(shí)現(xiàn)的復(fù)雜度,我最終選用了邏輯刪除的方法。但緊接著另一個問題又來了,此時的程序編碼工作差不多完成了70%左右,現(xiàn)在把程序中所有的真實(shí)刪除都改成邏輯刪除,源代碼中需要修改很多的地方。如何以最快最全的方法實(shí)現(xiàn)邏輯刪除?我整整思索了半天,突然靈光一閃,想到了一個最佳方法。即從數(shù)據(jù)交互的父類中修改真實(shí)刪除所調(diào)用的函數(shù),把真實(shí)刪除改的SQL語句改為邏輯刪除所對應(yīng)的SQL語句。這樣只修改一處代碼,即把系統(tǒng)中所有的真是刪除都搞定。
我暗自夸獎自己:你怎么這么聰明啊!
正文:(十九)數(shù)據(jù)同步4
在解決了MobiLink數(shù)據(jù)同步的中心數(shù)據(jù)庫與遠(yuǎn)程數(shù)據(jù)庫的刪除同步問題后,我又開始測試數(shù)據(jù)同步的速度問題。發(fā)現(xiàn)局域網(wǎng)內(nèi)和Internet網(wǎng)上MobiLink的數(shù)據(jù)同步速度差不多,這讓我很是高興,可接著另外一個問題又開始困擾我了。
開始做數(shù)據(jù)同步測試的時候,由于數(shù)據(jù)庫中的數(shù)據(jù)量很小,每次數(shù)據(jù)同步的時間大概在2-5分鐘。而隨著數(shù)據(jù)庫中的數(shù)據(jù)逐步增加,發(fā)現(xiàn)同步所需的時間越來越長。MobiLink資料上,都說數(shù)據(jù)同步的原理是依據(jù)日志文件中的數(shù)據(jù)庫操作語句,對數(shù)據(jù)進(jìn)行增量同步,即第二次同步的數(shù)據(jù)是第一次同步后的數(shù)據(jù)修改。這就讓我很不理解了,為什么隨著數(shù)據(jù)庫的增大,同步的速度越來越慢,而且從同步服務(wù)器的滾屏顯示上,明顯是在掃描第一次同步以前的數(shù)據(jù)。
Google了N多的地方,都沒有發(fā)現(xiàn)有討論這個問題的地方,我又得自己摸黑前進(jìn)了。憑借以往的經(jīng)驗(yàn)初步推斷,有兩種可能原因,第一種是數(shù)據(jù)庫的日志出來問題,第二種是數(shù)據(jù)庫的MobiLink同步設(shè)置出來問題。
首先從第一種可能性考慮,我把ASA數(shù)據(jù)庫的日志刪除掉,重新構(gòu)建日志。希望全新的日志能給我解決這個問題,可發(fā)現(xiàn)同步速度依然是老牛拉車。重構(gòu)的新日志不行,我又遍查方法,希望能有日志整理的方法,把原先的日志重新整理。光折騰日志就花了我一個多星期,頭也大了兩圈,最終自認(rèn)為是進(jìn)來死胡同。
然后又考慮Mobilink同步設(shè)置的問題,把《Mobilink同步用戶指南》《Mobilink同步參考手冊》都翻了個遍,還查幾乎所有能找到的資料,也都沒查出所以然來。光前面兩本書加起來就一千五百來頁,真是郁悶得夠嗆。此時的Gentleman又給了我鼓勵,說現(xiàn)在也能將就著用,無非就是速度慢些而已??晌倚闹忻靼装。到y(tǒng)正式上線后,數(shù)據(jù)庫會迅速加大,如果每次同步都是全掃描,那真是慢得跟頭驢一樣。
經(jīng)過半個多月的查找,就在我?guī)缀蹩旖^望的時候,一次隨意翻查《MobiLink Developer Resource Kit》的時候,居然發(fā)現(xiàn)里面有一篇“Mobilink數(shù)據(jù)分區(qū)”,詳細(xì)地記載了如何設(shè)置實(shí)現(xiàn)數(shù)據(jù)的增量同步。這真是踏遍鐵鞋無覓處,得來全不費(fèi)功夫啊。我都感動得想喊出來,按照里面的設(shè)置方法,對數(shù)據(jù)庫進(jìn)行了相應(yīng)的調(diào)整后,一測試,OK, No Problem。
那天,我感受到久違了的勝利喜悅,似乎一下子把我拉回到了讀書時代。
正文:(二十)最后一次大考1
經(jīng)過多次的數(shù)據(jù)庫同步測試,我自認(rèn)為已經(jīng)大體上掌握了MobiLink的數(shù)據(jù)同步方法;同時,系統(tǒng)程序經(jīng)過營銷部的實(shí)際測試也日趨完善。與Gentleman商量后,決定系統(tǒng)在秋季廣交會前全公司范圍內(nèi)上線。
由于前面的系統(tǒng)測試工作做得非常充分,所以系統(tǒng)上線后并未遇到任何技術(shù)上的問題,僅是某些部門和個人提出了一些小的功能修改意見。至此系統(tǒng)算是基本上線成功,但還有最后一次大考,那就是秋季廣交會。
Gentleman和他的同事們,非常重視廣交會,他們會在此前做好最細(xì)致的準(zhǔn)備,其中包括參展的樣品、名片的準(zhǔn)備、筆記本、業(yè)務(wù)系統(tǒng)、打印機(jī)的調(diào)試等等。給我感覺就像上前線打仗一樣,這比喻一點(diǎn)都不夸張。Gentleman說他們在以往的廣交會上就是神經(jīng)一直緊繃,來了客戶以后,需要迅速給客戶報出各種產(chǎn)品(或依據(jù)客戶的需求組合的產(chǎn)品)的價格。其中容不得半點(diǎn)差錯,價格報高了,會讓客戶失去興趣,價格報低了,則公司蒙受損失。所以廣交會期間,只要客戶一來詢價,大家就處于緊張狀態(tài),需要反復(fù)核算價格。
當(dāng)然Gentleman這次去參加廣交會是準(zhǔn)備好了兩套方案的,他們分別在新老兩套系統(tǒng)中都輸入好了參加廣交會的新貨號,如果新系統(tǒng)在廣交會期間出現(xiàn)問題,他們就馬上切換到老系統(tǒng)下使用。(這些是我事后從其他員工那兒得知的)
此次廣交會,Gentleman他們租用來兩個展廳,所以帶去的六臺筆記本組成2個局域網(wǎng),分別在兩處使用。整個廣交會參展期間(大約10天時間),新系統(tǒng)不負(fù)眾望,運(yùn)行高效穩(wěn)定,報價準(zhǔn)確迅速,極大地減輕了Gentleman他們的工作量和精神壓力。看著大家回來時對系統(tǒng)滿意的神情,我心中甚是開心,說明新系統(tǒng)完全達(dá)到了預(yù)期的目的。
可就在廣交會回來后的數(shù)據(jù)庫同步過程中,我又挨了一記‘悶棍’——其中一臺筆記本上的數(shù)據(jù)庫與中心服務(wù)器數(shù)據(jù)庫的同步過程中,出現(xiàn)了只下載數(shù)據(jù)不上傳數(shù)據(jù)的奇怪現(xiàn)象。
正文:(二十一)最后一次大考2
由于全球金融危機(jī)的原因,今年的秋季廣交會市場比較清淡,珠江三角洲附近以出口為主的家具和玩具企業(yè)紛紛倒閉。但從Gentleman那了解到,今年他們公司的情況還算不錯,雖然比春季廣交會的成交量差一些,但已經(jīng)比預(yù)期的狀況好多了。加之此次廣交會上,由于新系統(tǒng)非常好用,所以在現(xiàn)場感覺工作比較輕松,并未出現(xiàn)手忙腳亂的現(xiàn)象。在此次廣交會臨近結(jié)束的時候,他們還特意舉行了一場小型的慶功宴會。
大家從廣交會上回來后,紛紛說新系統(tǒng)非常好用。得知這些喜人的消息,我自然也是非常高興,在他們回來的第二天,我就去Gentleman公司那,幫他們把筆記本上的數(shù)據(jù)同步到服務(wù)器上。我原本預(yù)計(jì)最多一兩個小時就能搞定的事情,可沒想到居然整整耗了近十個小時(16:00 - 02:00 晚飯也沒吃)。
因?yàn)槌霈F(xiàn)了一個奇怪的現(xiàn)象,即其中一臺筆記本與中心數(shù)據(jù)庫同步的時候,只能下載數(shù)據(jù),卻無法上傳數(shù)據(jù),這讓我一頭霧水。因?yàn)檫@臺筆記本上的同步語句和其他的都是一樣的,MobiLink中的確提供了單向同步的設(shè)置,可我并未加上這個參數(shù)啊。問題出在什么地方呢?
我仔細(xì)梳理著每一步環(huán)節(jié),回想起來這臺筆記本上的數(shù)據(jù)庫與其他數(shù)據(jù)庫不同在于,它的數(shù)據(jù)庫是從另外一臺筆記本上復(fù)制過來的。因?yàn)樵趶V交會上,Gentleman是分兩個展區(qū)的,而這第二個展區(qū)的開展時間比第一個展區(qū)晚兩天,所以Gentleman當(dāng)時在得到我的許可后,就把第一個展區(qū)用的數(shù)據(jù)庫復(fù)制到了這臺筆記本上。
而MobiLink數(shù)據(jù)同步的原理是,每個遠(yuǎn)程數(shù)據(jù)庫都對應(yīng)一個同步用戶的,即每臺筆記本都需要對應(yīng)一個不同的同步用戶。最初我認(rèn)為MobiLink的數(shù)據(jù)同步過程,只要我不設(shè)置單向同步,即肯定是即上傳又下載的??赡翘旖?jīng)過我反復(fù)測試,發(fā)現(xiàn)對于一個新的同步用戶,在初次與中心服務(wù)器做同步的時候,數(shù)據(jù)是只下載不上傳的。
一開始,我以為是設(shè)置出來問題,可反復(fù)檢查設(shè)置,并未查出問題。我再仔細(xì)琢磨MobiLink為什么這樣處理?雖然我并未在任何MobiLink資料中印證我的猜測,但我最終認(rèn)為這是MobiLink特意這樣處理的。即對于一個全新同步用戶,初次同步過程中,MobiLink的執(zhí)行方法是只下載不上傳的。其實(shí)這也很好理解,因在一個中心數(shù)據(jù)庫和多個遠(yuǎn)程數(shù)據(jù)庫發(fā)布的時候,只有默認(rèn)這種方式才能最快完成同步,否則數(shù)據(jù)只有輪詢同步兩遍之后才能實(shí)現(xiàn)完全一致。在想明白了這一點(diǎn)后,我趕緊改變了方法,即采取手工SQL語句導(dǎo)出的方法,將那臺無法上傳數(shù)據(jù)的筆記本中的數(shù)據(jù)導(dǎo)出到文件中,然后再將這些文件數(shù)據(jù)導(dǎo)入到中心服務(wù)器內(nèi)。
那晚,就這樣琢磨后測試,測試后又琢磨,一直折騰到凌晨2點(diǎn)才把數(shù)據(jù)全部導(dǎo)入到中心服務(wù)器中。因?yàn)槲仪宄?,如果不把?shù)據(jù)整理好,Gentleman的公司明天就無法正常工作,所以一定要在那晚把數(shù)據(jù)整理好。
正文:(二十二)煮酒論英雄
那天為了將筆記本數(shù)據(jù)導(dǎo)入到中心服務(wù)器,我工作到凌晨兩點(diǎn),Gentleman為此深受感動。但我認(rèn)為,一個值得我尊敬的合作伙伴,我就應(yīng)該盡我全部的能量,將系統(tǒng)功能開發(fā)好,將數(shù)據(jù)同步完善好。
在這近一年的交往過程中,我深感Gentleman身上有太多值得學(xué)習(xí)的地方。所以每次Gentleman回國的時候,都是我抓緊學(xué)習(xí)的機(jī)會。為了有更好的交流時間,我迫不及待地在秋季廣交會之前,就邀請Gentleman單獨(dú)慶賀一翻。
Genteleman是個非常理性的人,在他的思想中,開發(fā)一套系統(tǒng),無論投入多大精力和財力,只要系統(tǒng)能創(chuàng)造出更多的效益,那所有的投入都是非常值得的。而對于我來說,當(dāng)前的新系統(tǒng)僅僅是第一步,只是簡單地提升了業(yè)務(wù)的執(zhí)行效率,并未給公司帶來更多的利益。在我的頭腦中,正在思索下一步的工作重點(diǎn),如何能從繁瑣的工作中解放出更多的人員?如何能讓Gentleman站在全局的高度上,分析出公司的利潤發(fā)展點(diǎn)和成本控制點(diǎn)?如何能有效地將營銷部、海運(yùn)操作部、財務(wù)部等各職能部門更有效得協(xié)同工作?我相信,心有多大,舞臺就有多大。
借單獨(dú)與Gentleman慶功的機(jī)會,我將自己成熟的與不成熟的想法都拋出來了。我們邊飲酒邊暢談,對于新系統(tǒng)的下一步建設(shè)做了總體的規(guī)劃,從這個規(guī)劃中可見在Gentleman的心中,有更宏偉的藍(lán)圖,他希望建設(shè)的不僅僅是一個單純的貿(mào)易公司,而是一個既有活力又有深度的集團(tuán)性公司。
-
程序員
+關(guān)注
關(guān)注
4文章
952瀏覽量
29799
發(fā)布評論請先 登錄
相關(guān)推薦
評論