Thursday, May 30, 2013

郭淮的时间线


曹魏在重要的几个州都是政军各有一名主官,而这其中最重要的就是前线三州,分别是西边的雍凉、南边的荆州和东边的扬州。郭淮是曹魏西线上重要的官员,为什麼说是官员而不仅仅是将领,因为郭淮大部分时间在西线都是刺史。所以说到郭淮必须先了解曹魏西线历个时期的形势。

郭淮的童少年时期,迎献帝至曹操西进时期(196-211)16年

早期曹魏对西边一帮小军阀是以安抚为主,所以并没有设置军事都督,只是让司隶校尉钟繇经营。而凉州刺史几十年一直都是后来被马超杀死的韦康。
韦康在诸多军阀的围困下经营凉州几十年深得官民爱戴,马超一杀了他,群吏皆反。所以我认为马超后来与其说是被夏侯渊赶出了凉州,还不如说是韦康多年之功,这也可见刺史的重要性。

郭淮的青壮年时期,曹操的三次西进(211-220)10年

  • 208年至209年期间,曹操几番南下东进都不顺利,开始转方向。
  • 211年曹操第一次西进,逼反了河西那些小诸侯,并击破马超韩遂后,并没有继续下去,隔年212年旋即回到东边打孙权。
  • 213年曹操即位魏公,开始大改。撤掉了司隶校尉召回钟繇做魏大理,而该年韦康也被反扑的马超所杀,曹操把凉州也废除并入雍州(后来又恢复)。
    同时开始了曹魏几十年的刺史+都督双轨制--雍州刺史是大名鼎鼎的张既,第一任都督则是大名鼎鼎的夏侯渊,以护军将军屯关中。
  • 214年曹操再次东进打孙权不顺利。
  • 215年又回到了西线第二次西进,这时候我们的主角郭淮终於登场啦,大概二十岁出头不到二十五吧,以丞相兵曹议令史随曹操入汉中。平定张鲁之后曹操升夏侯渊为征西将军镇汉中,并留下郭淮为夏侯渊的司马。
  • 216年曹操即位为王后,马不停蹄的继续和孙权打,东边仍然不顺利。
    曹操几次三番没办法稳妥的先平定西边主要也是因为孙权一直在东线骚扰,所以孙刘联盟的功不可没,让刘备可以慢慢在西边蚕食。
  • 218年曹操第三次西进与刘备在汉中展开大战,219夏侯渊被杀,郭淮推举张郃为主帅,曹操让郭淮继续做张郃的司马。
  • 曹操败退出汉中之后,郭淮一直在张郃手下继续平定关中,转为镇西长史,又行征羌护军。

郭淮的刺史时期,曹丕称帝至曹爽死(220-249)30年

在刺史时期,他的同期都督分别是夏侯懋、曹真、司马懿、赵俨、夏侯玄。
  • 220年曹丕称帝,夏侯懋安西将军都督关中诸军事,郭淮从221年接替张既为雍州刺史(注意火凤中张既和郭淮都是司马家的人)。这年郭淮应该不到三十或三十左右。
  • 226年曹睿即位,诸葛亮228年北伐,夏侯懋被召入为尚书,改由曹真大将军都督雍凉诸军事,这时候郭淮雍州刺史上加了个建武将军的头衔。
  • 231年曹真死,司马懿接大将军位都督雍凉诸军事时,郭淮换成了扬武将军继续雍州刺史。
  • 239年曹芳即位,司马懿在征辽东公孙康后被夺权由太尉变成了太傅,改由赵俨监雍凉二州军事,这时候郭淮升级为左将军仍然是雍州刺史。
  • 243年曹爽预备伐蜀,让亲族夏侯玄以征西将军都督雍凉诸军事,郭淮升为前将军。
  • 249年曹爽被司马懿收了,夏侯玄被司马懿召回剥夺实权成为太常。

郭淮的晚期与死后,(249-255)7年

一直到这时候郭淮才终於出头,由前将军雍州刺史升迁接替夏侯玄成为征西将军都督雍凉诸军事,整整30年啊!这时候郭淮应该至少已经六十。雍州刺史的职位则由陈泰接替。
第二年郭淮又升为车骑将军并开府,六年后死。他死后陈泰接替以征西将军都督雍凉,王经接任为刺史。
陈泰因为不是司马家心腹,第二年就业被夺权召回朝中作尚书仆射,由司马家的司马望接替征西将军都督雍凉。
也许司马家对司马望的实际领兵能力不放心,於是司马家的门生邓艾前一年才从兖州刺史的位置上调到了雍凉以安西将军领东羌校尉,第二年就改以镇西将军都督陇右了。邓艾之前曾经作为南安太守在西线和郭淮陈泰待过一段时期。
这时候是256年,雍州军事上分为二都督,雍凉和陇右。司马望和邓艾的搭配一直持续到灭蜀。

Monday, July 30, 2012

215年曹操称王之后手下主要将领的分配


诸夏侯曹

  • 夏侯惇:扬州军区总司令 (以伏波将军都督二十六军屯居巢)
  • 夏侯渊:关中军区总司令 (以征西将军镇汉中)
  • 曹仁:荆州军区总司令 (以征南将军屯樊城)
  • 曹洪:京畿卫戎部队总司令 (都护将军)
所以他们后来在曹丕称帝之后的升迁也是顺迁:

  • 夏侯惇升大将军
  • 夏侯渊升骠骑将军 (如果没死,但是他死了魏国这个位置就空了,后来曹洪补上)
  • 曹仁升车骑将军
  • 曹洪升卫将军
比之蜀汉呢,关羽如果没死,他就是大将军。他死了所以这个大将军位置就是一直空著。
张飞是车骑、马超是骠骑。所以张飞相当於曹仁、马超相当於夏侯渊。
而赵云最适合做卫将军,一直以来的工作也相符,只是他劝阻刘备不要伐吴惹刘备不高兴了,就变成了征南将军了。

  • 夏侯惇在做扬州军区总司令的时候统领二十六军,这包括了在合肥的张辽、李典、乐进,以及徐州的臧霸。
  • 曹仁在荆州军区做总司令的时候,手下统领的人我们可以从江陵之战和樊城之战看出来。其中包括了他的部将牛金、横野将军徐晃、襄阳太守乐进、奋威将军满宠、汝南太守李通、江夏太守文聘。
  • 夏侯渊做关中军区总司令打的两仗,都有曹操参与,我们只能大概算出他最开始统领谁。大概就是张郃、徐晃、朱灵、郭淮等。

五子

从上面我们可以看出,五子裏面,张辽是一直待在东边的。和其他两个军区不一样,虽然扬州军区虽然名义总司令是夏侯惇,但是仗都是张辽带人打的。而其他两个军区夏侯渊、曹仁都要亲自上阵。所以张辽可以视为扬州军区夏侯惇的副手,也是实际上的执行人。

张郃呢,则一直待在西边,他可以肯定说是夏侯渊的副手,因为夏侯渊死后众人就推举他为主帅。说来张郃其实比较悲催,他做了一辈子的关中战区二把手。之后先是在曹真手下做,后来又在司马懿手下做二把手。

而徐晃、乐进这两个右將軍则比较游动,徐晃在江陵之战、樊城之战属曹仁,潼关、汉中之战则属夏侯渊。乐进则是江陵之战属曹仁、合肥之战属夏侯惇管辖。

我们是不是忘掉了一个人?对的,就是于禁,他完全不属於这三个战区任何一人的统辖,就算是樊城之战他也是独立带七军。所以五子裏面,可以肯定在于禁在的时候,他位置最高。

虎豹骑

曹操手下还有一支精兵是直属的,就是虎豹骑,虎豹骑的主帅我们都知道,就是曹纯、曹休、曹真。基本上这几个人我们只会在曹操亲征的时候才会看到。所以我们可以肯定他们不属於三大军区的统属。曹纯早死、曹休、曹真后来分别做了东西军区总司令,如果曹纯没有早死他应该是荆州军区总司令,不会轮到夏侯尚。和夏侯懋一样,夏侯尚没什麽才干。夏侯懋、夏侯尚都是夏侯家的子弟,分别做过一段时间军区司令就被替下了。远不如三个虎豹骑锻炼出来的曹休、曹真。

而曹洪也是只有在曹操亲征的时候才会出现,因为他的任务是卫戎。当然卫戎部队也是可以派出去的,所以曹洪经常作为曹操亲征时的前沿部队出现,例如潼关之战与汉中之战。有时候也和虎豹骑一起行动。至於虎豹骑是否归于曹洪统属,我认为不是,虎豹骑应该是曹操直属的,与曹洪的部队并列关系。

其他的二线武将

  • 许褚(典韦)这是纯粹的保镖,与曹洪不同,曹洪统领的是卫戎部队,而许褚只统领最多一个营的卫兵而已。记住这也是赵云的职责更像曹洪,与许典完全不同的地方。
  • 李典、臧覇、吕虔,李典不多说。臧覇、吕虔一直都是分别统领青徐,属於夏侯惇的管辖范围。
  • 李通、文聘,一个汝南太守、一个江夏太守,都是属於曹仁统属的,在江陵之战出现。
  • 满宠在曹仁手下,后来在曹休死后做了扬州军区总司令。
  • 郭淮是夏侯渊手下,后来在司马懿卸任之后作了关中军区总司令。
  • 其他北边边戎的几个将领我这里就不说了。

曹操救援樊城爲什麽要派出于禁?

我們知道樊城之戰發生的時候,曹操剛剛從漢中之戰敗退回來。參與漢中之戰的部隊需要調整才能出發。

這個時候我上面所說的那些高級將領裏面,夏侯惇坐鎮東邊不能動,曹操也不會動他。樂進已死,張遼也不能動。事實上在孫權投降之後張遼就開拔前往樊城。

曹仁困守樊城裏,張郃應該是留在了關中軍區整頓。曹洪、以及曹真、曹休所部是否跟隨曹操撤回,還是留在關中不清楚,不過徐晃倒是撤了回來。

這時候曹操所最可能派出的高級將領,以及救援部隊,就是在此前幾大戰役中都沒有動用過的于禁了。于禁作爲生力軍,應該足以扭轉形勢,事實上他的能力也是如此。他的帶兵風格以嚴整著稱。曹操當時的目的是想讓他從一旁震懾牽制住關羽軍,以待後面的援軍陸續來到。

只是非常不巧,關羽這次的進攻是很有計劃性的,漢水大漲也是在他計劃之中。否則他不會事先就準備好大船攻城,要知道大船想從南郡長江那邊繞入漢水,必須得經過江夏文聘的屬地。文聘之前江陵之戰還威猛威猛的,這次不知道怎麽就躲起來也沒阻攔。

所以于禁事實上是中了關羽安排好的時間上的一個陷阱。我們假設先帶兵來救的是徐晃,恐怕他也得變成水鱉,至於投不投降,就因各人不同了。而于禁替代了徐晃的位置,則帶兵來時水已退,孫權已襲江陵,于禁應該也能立徐晃之功。

那麽誰帶兵來才不會受困水斗呢?恐怕只有那些能夠因地制宜排兵佈陣的謀將才可以了,例如曹操自己、識變數的張郃、後期的鄧艾。

Friday, May 4, 2012

Project Sanguo

五月份我將開始一個新的Project,這個Project籌備了有半年時間,是一個非常私人的Project,目的一是爲了填補空白時間,二整合一下自己整理的一些東西,三來學習自己以前比較少用到的技術。

Project内容

中國的史書有紀傳體、編年體與紀事本末體三大體例。梁啟超說:「蓋紀傳體以人為主,編年體以年為主,而紀事本末體以事為主。」中國官方編撰的史書也就是所謂的正史「二十四史」都依照《史记》紀傳體體例编纂而成。

紀傳體是以為人物立傳記(皇帝的傳記稱「紀」,皇族、外威、一般人物稱「傳」,特殊情形的人物稱「世家」或「載記」,記載制度、風俗、經濟等稱「志」、「意」或「考」,以表格排列歷史大事稱「表」)的方式记叙史实。所謂「〈紀〉以包舉大端,〈傳〉以委曲細事,〈表〉以序其年爵,〈志〉以總括遺漏。逮於天文、地理、國典、朝章,顯隱必該,洪纖靡失。」

《三國志》雖然被後世稱為「志」,但是其實全書完全是按人物排列的本紀和列傳,沒有任何如地理、經濟、典章制度等的志書或表的內容,這對想要系統性去了解那個時代非常的不便。
至今已有許多前人整理補充各種志表,按wikipedia上的資料。
補志方面:
補表方面:
  • 謝鍾英《三國疆域表》*、《三國疆域表疑》*。
  • 周嘉猷《三國紀年表》*。
  • 謝鍾英《三國大事表》*,張守常《謝鍾英〈三國大事表〉補正》。
  • 萬斯同《歷代史表》中有《三國大事年表》*、《三国漢季方鎮年表》*、《三國諸王世表》*、《魏國將相大臣年表》*、《魏將相大臣年表》*、《魏方鎮年表》*、《漢將相大臣年表》*、《吳將相大臣年表》*。
  • 黃大華《三國志三公宰輔年表》*。
  • 周明泰《三国志世系表》*,陶元珍著《三國志世系表補遺附訂偽》*。

今人也有不少人將以上各類補表錄入電子化。我個人就曾將萬斯通《歷代史表》中三國相關的部分錄入Excel,後來又有陸續整理過一些資料錄入Access,GenePro之類不同用途的數據庫。也以Excel及Visio整理過簡略的圖表給文做附。
 但整體給我一個感覺,這些東西太過零散,輸入既需要時間且無法重復使用,每次都需要各種不同工具來生成想要得出的效果,很沒有效率。使用Access做數據繪入就是因爲我萌生了整合成一個數據庫然後通過定制顯示頁面來達到自己想要的想法。

只是使用Access數據庫,一來過於簡陋,二來也無法與衆人隨時隨地分享,後來便想要自己寫一個程序。最初是想做成iOS的軟件將來還能有機會在AppStore上賣錢。但是後來覺得平臺的局限性太大,而且很多東西也無法表現出來。

Project技術

比較來去,最後使用Web成爲了唯一的選擇。在一開始,我覺得更需要的是Presentation上面的靈活性,所以停留在各種動態網頁表現上,看了很多Flash和Silverlight的資料,又看了很多HTML5的資料。

但因爲自己不是Digital media出身,對於這些東西實在是看得懵囃囃,不知道從哪裏開始,如何將已錄入的數據以炫酷的形式表現出來。於是我詢問了做Web FrontEnd開發的好友,好友建議說像我這樣的需求,還是應該以Web Application形式來做,於是向我推薦了ASP.NET MVC。

ASP.NET MVC的模式我一看就很喜歡,適合我這種學軟件開發出身的。它是以傳統的軟件開發模式來開發網頁,對我非常地親切。只是以MVC這種模式開發,一刀一斧工程浩大,耗時會比普通的WebForm形式更爲費時耗力。所以爲了保險起見我做了更多關於這方面的調查,進行比較。包括ASP.NET的WebForm,Ruby on Rails和Java的各種Web Framework。

理論上,我目前工作環境都是Java,公司的產品也是用Java開發的Web application,我應該選擇Java才對,又能工作和自身學習相搭配。只是不知道爲什麽,我實在是不喜歡Java,雖然最早接觸的語言就是Java,算是我的啓蒙語言,各個學校學習用的也多是Java,我也是爲了讓自己更熟悉Java而進入這個公司強迫自己有這個環境。

只是這麽一年過去了,我對Java卻產生更大的排斥心理,討厭Ant也討厭Maven,更不用説Eclipse那個IDE了。我總覺得Java無法像C/C++那樣寫出很自由很酷的服務器軟件,也沒有像Visual Studio能提供非常容易上手易用的工具套件,雖然Java的跨平臺優勢前兩者無可比擬。

相比之下,在嘗試ASP.NET MVC的過程中,Visual Studio卻讓我覺得無比的親切,也許這就是一種天生的個人喜好,無法以更客觀的角度去選擇使用的技術。所以就算將來Host ASP.NET的服務器租金可能更貴,暫時也管不了那麽多了。

在閲讀了更多的資料之後我最後還是決定選擇使用ASP.NET MVC,特別是因爲MVC3使用了Razor引擎。總結的說,選擇的理由就是簡單易用,快捷方便,又能作出很系統性完整的東西,將來的擴展性也大。而且在各方面的知識上,雖然其他知識我也都是淺嚐爲止,Web我卻幾乎沒有接觸過,能夠增加很多這方面的知識,例如HTML5、Ajax。同時也能夠加深對C#的理解。

Project參考資料

決定了使用的技術後,我也決定買一本書來加強學習。基本上也就兩本入門到中級的可供選擇,分別是Wrox的Professional ASP.NET MVC3與Apress的Pro ASP.NET MVC 3 Framework。
經過多次比較,我還是選擇了後者,因爲後者的後面部分感覺會更深入一些,前者則讓我感覺與網上那些免費的教程相去不遠。只是在購入了後者之後我發現作者用了自己的很多習慣來做教程,而前者則基本上沿用Microsoft的Convension。所以還是有點後悔,我的怪癖就是覺得用官方的習慣標準會比較舒服,所以有可能也會把前者也買下來。我選擇的是電子書版本,比較便宜也隨時隨地可以看。比較了iBook版和Kindle版發現還是Amazon的比較便宜。

而前面所提到的前人所著之各種補志補表,目其中帶*有收錄在中華書局所刊印的《二十五史補編》的《三國志補編》裏,國家圖書館出版社有專出這本。國内大城市的書城還可以買到。旁邊的悉尼大學的Fisher圖書館有著南半球最大的東亞圖書收藏,我查了一下,比較主要的基本清代以前補編的志表裏面都有,倒是近現代民國學者王欣夫編撰的《補三國兵志》沒有。

這些資料已然足夠,關鍵系統要架構起來,錄入這些數據是長期的事情。我的計劃是做一個關於三國無論橫向覆蓋或者縱向深入都比較完整的數據庫,方便查找歸類,並且能生成各種各樣的圖表形式。如果將來有機會製作遊戲還可以很好的使用,目前我有一些關於這方面的想法。至於文字方面内容反倒是其次,現在許多例如wikisource那樣的網上書庫已經很多可以查閲。之後我將會詳細談談哪些是我想要的。

Sunday, July 17, 2011

魚水之歡

引言

我們都知道,一個勢力想要成功奪取天下,需要具備兩個條件:一個是階級基礎,一個是群衆基礎。南華派那幾個善於蠱惑人心的八怪,懂得利用群衆基礎來作亂。可惜他們沒有階級基礎,於是不能長久。

那個時代的階級基礎是什麼?是士人,士人就是知識分子。水鏡府作爲當時知識分子的最高殿堂,自然成爲當時各大勢力爭奪人才的地方。

有云以人爲本。又有云得人心者得天下。人心是可以操控的,輿論的走向是可以牽引的。經過了兩次黨錮之爭,大義牢牢地掌握在士人手裡,這是其一。

其二,沒錢的人是讀不起書的,寒士不是沒有,但不是主流,當時的士人多出於豪強士紳大族。黃巾與董卓之亂後,鄉縣民衆在這種狀態下為求自保都聽令於當地大族。於是士族豪強紛紛聚眾起事自保,形成地方上的割據。有了士人的支持,也就等於有了一定的群眾基礎。

第三,也因爲那時的教育不普及,知識只掌握在士人手裡。要打架做反當山賊,可能靠煽動來發動點群衆基礎就可以了。但我們都知道戰爭最終打的是後勤,後勤就在於根據地的發展治理。讓沒有知識的庶民治理一個地​​方是不可能的,打仗的方法就是換著地方搶,終不能長久。

--
如魚得水

劉備是有點群衆基礎的,他是庶民出身,身邊追隨的也多是庶民寒士,懂得掌握這方面的民心。也正因爲如此,他沒有士人基礎。且不說他令人不信服的皇叔身份,就算他是真落魄皇叔,在世族裏也毫無號召力。

《火鳳》裏有個細節,很多人沒注意到。老七救徐之後,已認定劉備為他追隨之主。但他不在其老家徐州投靠劉備,反而先去荊州,讓劉備去找他。因爲老七知道中原一帶的士人早已確定追隨袁或曹,無劉備立足的空間。

三爺也是如此想法,他一手謀劃讓劉備入徐再棄徐。因爲三爺知道中原已無立業之處,他作畫天下三分便是清楚的表達了這個意思。這圖後來贈與老七或水鏡,這二人後來共賞這幅畫,得出張飛的三劉相合以圖三分之意,於是老七先去荊州與當地士人建立關係網以待劉備。

劉備後來常說如魚得水,水是魚的生活環境,不是指諸葛亮這個人。魚離開了水就會窒息而亡,一個離開了士人支持的勢力也是如此。劉備所謂的如魚得水,指的是得到了諸葛亮所建立的知識分子圈,他終於能得到一些士人們的支持了。

所謂的臥龍鳳雛,得一可得天下,也是這個意思。不只是他們的才能卓越所以天下可得,而是諸葛亮和龐統都與當時荊楚的士人豪族交際廣泛(《火鳳》裏,龐統能夠一匡諸多小勢力,在南陽狙擊曹操)。得到了他們的支持,就相當於得到了荊州士人們的支持。得到了荊州士人的支持,就能得到荊州,進而圖謀天下。


--當然,這些都只是想當然。所謂的臥龍鳳雛只是互相吹捧的說法,他們的一廂情願並無法去號領天下所有的士人。就算只在荊州範圍內,也無法通吃。

首先,荊州有很多南下避難的北方士人,比如王粲、徐庶、孟建、石韜等等。諸葛亮雖然與這些人交情不錯,但卻沒法改變他們的想法。這些人在荊州的目的就只是避難,沒想在南方紮根,所以曹操一南下,他們也就北上回鄉,在曹操主持的朝廷裡做官。

諸葛亮自己也是屬於南下避難的北方士族,不過他們家很快就在南方扎了根,而且很深。諸葛家南下之後,與荊州的四大士族,蔡、蒯、黃、龐都有姻親關係。而次一級的四個大士族,馬、向、習、楊都是其好友。


儘管諸葛亮在荊州發展出的的關係網很大,也不能領導他們。畢竟他是外來之人,對較大的四族,蔡蒯黃龐,諸葛亮都沒有影響力,只靠姻親攀上關係。這四個家族都只是圖個安穩,保有產業。至於上頭是劉表還是曹操,都沒有差別。倒是較小的四族,馬向習楊都被諸葛亮忽悠得隨劉備奔波,一直到入蜀之後都還起到重要的作用,打壓益州當地的士族集團。

所以得臥龍得到的天下,就只是荊楚本土小部分士人的支持,去掉北下士人、荊楚大族,就剩下三成。不過就只是三成的水,已足以讓劉備這魚很高興了,這就是基礎啊。所以之後他才能很快的掌握荊州南部。

要知道劉備之前是沒有士人支持的基礎的。別看他領過徐州,做過豫州牧,當地的士人都只是當他在其位的時候,任其職。像陳群、陳登、袁渙等他提拔過的人在他離開之後可都沒有跟隨,因為這些人很多本來就是當地大族。他們跟的是地方,不是劉備。真正跟隨劉備到處流浪的,只有糜竺,以及孫乾。

--
上善若水

天下魚這麼多,諸葛亮為什麼會選擇劉備?為什麼南下北方士族都北歸的時候,他不北歸?要知道諸葛家在徐州可是大族,他的族人在魏晉時期歷任大官。為什麼他的荊楚姻親士族都投曹的時候,他卻獨自帶領剩餘肯跟隨的士人一直堅持抗曹?

隆中對暴露出了諸葛亮一直就有抗曹的思想,沒有這種思想,他不會想要在荊州紮根,完全可以在北方恢復太平了就回去。我個人覺得,只是因為曹操的屠徐,而劉備卻在力量單薄的時候救徐。人的選擇有時候就是這麼簡單,幼時對好惡的分辨容易影響了一生。

我一直認為曹操的屠徐之舉有百惡而無一益,讓他間接失去了“天下”。試想一下,如果他當時沒有屠徐,只是攻徐,到最後徐州還是會在他手裡。後來徐州畢竟治理得不錯,諸葛亮也不會如此反感曹操,而會像其他學友那樣北歸。這樣荊州就不會有那三分之一被諸葛亮帶動起來的反曹派,劉備在荊州便站不住腳。就算孫權周瑜還是能在赤壁擊敗了曹操,之後曹操捲土重來時就不需要同時面對荊州與揚州(後來再加上個益州)的左右牽制。劉備在荊州站不住腳,也沒有機會可以被邀請入蜀。而就算入蜀了,沒有那些荊州的人才幫助也壓制不了益州的士人。


曹操雖然一直都好殺,但他當時不過是領了兗州,收了三十萬青州兵,就以為天下無敵地開始濫殺,未免太不明智。那段時間他應該是被沖昏了頭吧,屠徐讓他間接失去了“天下”,殺邊讓,則差點讓他失去了全部身家。

曹操的出身很不好。在士人的眼裡,劉備可能只是出身布衣,或者冒牌皇叔,不會選擇他。但是曹操可是真正的贅閹遺醜,黨錮之爭士人被宦官壓制得很慘,不管你曹騰是不是好宦官,總之就是閹醜。就算不至於成爲仇敵,看不起肯定是有的。所以曹操一開始就只有他自己夏侯家曹家的人跟隨(也就是他譙縣的群衆基礎),不像袁紹一開始就是士人領袖,眾望所歸。


我們知道當時中原的士族最多,也就是河北河南。袁紹與曹操的發展方針也很明確:袁紹以河北為基礎,以冀州的士族為基礎。曹操以河南為基礎,就是兗州。《火鳳》有一集登泰山而小天下,得兗州者得天下,這裡的“天下”其實又是指兗州的士人。當時這兩個州受到之前的黃巾影響而四處避難的士族比較少。青徐很多士人都南下揚州避難,而豫州則有很多到了荊州。

袁紹是士人領袖,他到冀州取得統治權實在是輕而易舉,韓馥的手下個個都是人心向袁。曹操則波折得多,劉岱死後受到鮑信迎入主持兗州,其實兗州的士人還是有很多不服,所以邊讓看不起曹操,並引來殺身之禍,最終導致張邈陳宮迎呂布入主。張邈是八廚之一,陳宮也是兗州當地名士,他們可能也會看不起呂布,但至少沒像曹操殺名士那麼可恨。程昱是少數仍然支持曹操的兗州名士,也因為他,使得曹操不至於全失兗州,至少能保有三城。他的這次貢獻,也使得程昱成為第一批與夏侯惇曹仁能享配太廟的曹魏大臣,可見有多重要。

--
水弱彌堅

如魚得水的人,不只有劉備,曹操也是。曹操雖然比起劉備有家族基礎,但也缺乏士人的支持,而荀彧就是他的水。

天下名士,以豫州穎川郡為冠,汝南郡次之。雖然黃巾之亂為禍這兩個郡最深,當地許多士人都南逃荊州,比如前面提到的司馬徽、徐庶、石韜來自於穎川,孟建、許劭許靖兄弟來自於汝南。還有許多北上冀州追隨袁紹,例如荀湛、郭圖、辛氏兄弟。荀諶是荀彧的弟弟、郭圖可能和郭嘉也有點關係。荀彧郭嘉,最開始也都是先想去追隨袁紹,後來發現不是成大事之人,才嘗試接觸一下曹操。

荀彧之所以是曹操的水,是因為他能把穎川遺留下的人才都集結起來以供曹操使用。荀氏是本地的大族,比起諸葛亮那種外地人想在荊州忽悠當地的大族來得容易得多,穎川的大族荀氏、陳氏、鐘氏盡皆歸附曹操,給他提供了戲志才、郭嘉、鍾繇、陳群、杜襲、棗詆等起到很大作用的人才。

有了這些穎川大族們的支持,曹操能在兗州不穩的情況下把根據地轉為豫州,繼續與呂布爭奪兗州,後來迎奉獻帝到許縣就是穎川的一個治縣。這才是他奪取天下的基礎,《火鳳中》荀彧養兵千日這個情節的故事背景。


曹操的第二次大危機是官渡,他與袁紹實力的差距,不僅僅在於兵力與資源上,名聲人望上也遠遠不如。曹操是什麼?贅閹遺醜。袁紹是什麼?當時的名士領袖。除了荀彧郭嘉這兩個一開始見過袁紹並棄之而選曹操的,其他幾乎沒什麼人覺得曹操有勝算。

事實上,袁紹不僅得到河北名士大族的支持(田豐、沮授都是冀州鉅鹿大族,審配則是冀州魏郡,也就是鄴城的大族),還得到了河南的部分士人的支持,如之前說的穎川的荀湛、郭圖、辛氏兄弟。《火鳳》中袁方貴為水鏡府八奇之首,能力之高,就是當時袁紹這些名士集結歸附的一個縮影。


(題外話,說一下袁紹在南下方針上的兩派分歧:反對南下的主要是田豐和沮授這些河北大士族,因為戰爭對於他們來説等於增加本族的開支,沒有什麽好處;而最支持南下的郭圖等人則是因為他們老家在河南。

這其實也是中國自古以來的地域性拉幫結派的一個縮影。在田豐沮授被消滅之後,本處為鄴的審配逢紀繼續與來自於穎川的辛評郭圖各擁一派互相對抗。辛評郭圖還支持袁譚與南方的曹操結盟,方針都不像田沮審這些以守家保土為主。這些放在《火鳳》裏面就是縮影在袁方這個私生子對抗袁氏本家的那些人。類似這種外來士族與當地士族的不合在後來歷史一直還會發生,劉備入蜀之後,諸葛亮所拉攏的荊襄士人就與益州本地的士人一直有摩擦。)


當時袁紹能收到很多投誠的信,非常正常。大多數河南的士人只是想要保全性命而不敢反曹,但是他們看好袁紹,提前聯繫好感情以免之後出問題。汝南一郡則成為了袁紹在曹操的敵後根據地,因為袁家本來就是汝南郡出身,稍微號召一下,召集一些黃巾餘黨是再容易不過的事情,這個根據地直到官渡之戰結束後才被曹操剿滅。這些映射到《火鳳》裏面,就成爲了大師兄的養兵與佈置。

天子在手,只是讓曹操的征伐有名而已,很多自己有號召力的集團都不賣這個賬。更不用說袁紹了,他們完全可以以曹操挾持天子為由,清君側為名來對抗,事實上之前就這麼做過。

董卓剛入洛陽的時候也想要收買人心,想得到士大夫們的支持,於是他把當時那些名士們都封到各地做刺史太守,結果到頭來還是搬石砸腳。士人自視品德高尚,首先最仇視宦官,宦官被除掉了他們同樣也看不起董卓這種守戎邊疆的武夫。之前士大夫們都只得一張嘴,沒有實際權力,現在董卓把他們放在有兵有糧的位置上(因為黃巾之亂各州郡都有了一定的自主權)。於是這些剛被董卓委任出去的這些名士們鼓譟一下又聚集起來推袁紹為首反董卓了。董卓那時候也是天子在手,可以以天子名義發號施令,一樣一點法子也沒有。曹操也是一樣,在對袁紹上處於了極大的劣勢,但他比董卓強在於他有荀彧。

荀彧不僅替他把後勤輸送新戰鬥力等工作都做好,還能安撫後方的士人不至於添亂。同出於穎川大族的鐘繇則鎮關中,提供補給而且還說服了關中的軍閥出兵平定了幫袁紹在河東為亂的郭援。郭援是鐘繇外甥,尚且幫助袁紹,可見當時曹操領地内的大族分歧之大。

--
水能窒魚

現在的很多人,老是矯枉過正,看了點史聽一些人說的獵奇,就覺得演義太誤人。覺得諸葛亮前期打醬油,後期各種悲劇。郭嘉多牛逼,有郭嘉不會輸赤壁。

中國的歷史就是一部人際關係史。沒有諸葛亮,劉備不可能得到荊州僅剩的那些士族的支持。沒有這些人才,他無法在荊州站住腳,也沒有資本進益州。而沒有荀彧的關係網,曹操想得到河南剩下那部分士人的支持也很難,就算不被袁紹拉走,也會持觀望狀態。沒有這些人才基礎,曹操兩個的難關都很難過。沒有戲志才,荀彧可以推薦郭嘉,沒有郭嘉,也還有其他人。郭嘉在曹氏看來的重要性甚至不如替曹操保住兗州最後基礎的程昱。


不過曹操始終最喜歡的是郭嘉,一是郭嘉能看透人心,迎合曹操的脾性;二來比起手下這些豪族名士,郭嘉也不那麽高節清風(鐘繇數次當堂責難郭嘉的行爲作風)。曹操與手下的這批士人,一直到最後都仍貌似神離。曹操覺得雖然現在這些人荀彧的凝聚下幫他,心裡還是有會被看不起的陰影。

曹操利用荀彧,荀彧其實也是在使用曹操,可能什麽時候水就往其他地方去了。《火鳳》裏華陽儆君之後曹操明白爲什麽荀彧會幫他,而歷史上曹操則三次下達求賢令,唯才是擧,唯才是用。多用寒士以及原本德行上有點欠缺的人才,以爲了避免人員過度局限於荀彧所薦用的有志節的士族清流,為漢室做了嫁衣。


再後來曹操勢力擴大了,便開始著手清除那些可能會對他造成阻礙的清流名士。崔琰毛玠為官清風亮節,同為曹操的首席文官,掌銓衡選拔人才的任務十餘年,所举用的都是清廉正直之士。崔琰下獄死,毛玠被營救但免職。

出自孔子世家的孔融自黨錮之禍以來就是天下名士,門第出身、政治背景與立場都與宦官之後的曹操有明顯差異,而且他非常堅定的效忠於日趨式微的漢朝天子,成為當權的曹操推行自己政策的最大障礙之一,最終招來殺身之禍。楊修出身四世太尉的高門士族弘農楊家,也被曹操借故除去。

除了一開始就幫他打天下的穎川士族外,其餘不妥協於他的名士都處於殺身的威脅之中,就連荀彧之死也是讓後人有諸多猜測。


所以曹操在赤壁之戰之後的幾次征伐,都無法盡全功。征馬超、張魯,與孫權相持於濡須口,同劉備於漢中相爭,每次都不敢帶軍在外太久就得急急趕回。何故?再沒有荀彧在後方幫他鎮撫群士,後方內亂不斷。值得注意的是自從荀彧死後,曹操便再也未能擴張寸土。

其後的關羽能夠威震華夏,和這也有不少關係。當時曹操指派的荆州刺史胡修、南乡郡太守傅方都投降了关羽,治郡下許多義軍早已受關羽遙控,從荊北至司豫更有許多叛亂都想引關羽為援。試想那時曹操已經經營十數載尚且如此,當年的袁紹更有號召力,如果沒有荀彧在後方的鎮撫,恐怕叛亂的影響就不止於想要遷都這麼簡單了。


經過了曹操的幾番清理,士族們為了保全身家性命,就只剩下了妥協。少了忠貞之士,曹丕的篡權便是那麼的水到渠成。曹丕稱帝之後,就沒有也沒必要繼續打壓這些士族群體。只是士人們畢竟只是妥協,缺乏了忠貞之士的維護,曹家可以取代劉家天下,司馬家也可以,何況河內司馬家本來就是一個比曹家出身更好的士族。曹氏在士族們眼裡,只不過是一個暴發戶。

在司馬氏的奪權過程中,幫曹操平定北方起到很大作用的穎川荀氏、鐘氏繼續起著很大的作用,只是這次他們幫的不是曹家,而是司馬家了。能夠獲得士族認同的司馬家的後人們雖然很混帳,但是他們的天下卻能長過曹魏。

Fin
--
秉忠贞之诚,守退让之实;君子爱人以德

Thursday, September 30, 2010

Mobile Platform Wars



Went to the conference last night, basically it was all about (free beers & foods,) presentation & debates from developer's perspective between 3 major mobile platform + cross platform.
It was present in a more friendly way than what I thought to be, here are a little summary from it:

Android is catching up iOS in terms of Apps have developed per month:
pro:
  • Developer-friendly with those who had wrote JAVA Swing before;
  • The learning curve is starting with easy but will encounter hump at later stage;
  • Free install on any android phone;
con:
  • Pirate problem - free install on any android phone (yes, both pro & con).
  • Compatible problem - inconsistency version of android OS with different handset (CPU speed, memory and resolution etc.)

iOS is still holding the crown, but I feel people is getting a bit of aesthetic fatigue with it.
pro:
  • Apple controls the version update and handset standard (only Apple products running iOS);
  • Rich documentation and examples from Apple;
  • No pirate problem, money guaranteed;
con:
  • Approval process of Apps required to go through Apple, and need to pay money before putting on shelf.
  • Object-C and iOS dev kit require a bit more time to get familiar with, hump at begging of the learning curve.

Windows Phone 7 was all re-designed, they learnt a lot of experience from previous two platform. Plus that Microsoft is putting huge amount of money into it, it looks promising.
The demo was directly projected from the prototype phone (previous two were through slides), which was pretty cool.
Its new clean & slice Zune style UI gave me some impression on over those iPhone style touch-phone UI (although android does provide some different things, such as widget/gadget on dashboard)
pro:
  • Backed by the powerful Visual Studio & .net, this isn't something like iOS devkit or Eclipse can compete with.
  • Instant wealth feedback with Microsoft's money support even before you start list your apps.
  • Microsoft chose some middle way between Android & iOS:
    a. Controlling with approval, but also allow you to invite people for free install.
    b. Still have different manufactures but they mentioned they will control the version updates and standardisation.
con:
  • Still need to wait for market reaction after a real phone on shelf.
  • The conference was sponsored by Microsoft, and they present in a more user experience way rather than from developer's perspective.

Cross-Platform basically means you write apps as web app, good for writing small scale apps.
pro:
  • With a local platform wrap you can write core codes once and able to run on all kind of OS.
  • Easily hop on for those web developers - cross languages.
con:
  • Compatible problem, different resolutions etc.
  • Performance problem because app is not running in native code.
  • Development curve might be hump after humps.

Overall I felt that if Apple is not going to do any change in future years, they might fall behind with the fierce growing of Android and menacing return of the Windows Phone.
However consumers will be happy to see the competition in smartphone world is going into a new stage soon.

Thursday, August 19, 2010

Software Testing

Developers will rarely like to work on software testing because it's boring. It isn't like creating code that requires creativities, but more like a repeating labor work. To help/enforce developer to overcome this laziness, with the power of Agile methodology, TDD (Test-Driven Development) requires you to write tests based on requirements before you can start actual coding.

Ok, Software Testing is not in my job description, but because there are no tester or QA in our development firm, every developer has to do his testing by himself, consequently we only have automated tests, and as SCMer I need formalize them as part of build automation, therefore I need to understand a bit more in it.

Software Testing is an complicated and time-consuming discipline, what I'm addressing here will not be entirely correct, but rather to be just my understanding at moment. Write them down to allow me to revisit and revise in the future.


All testing were done by our developers with all automated, hence they are all white box testing.

Unit testing verifies the functionality of a specific section of code at the function/class level, it is the most fundamental one, we use it from first year of computer science study. But unfortunately it is still the only test that some of our projects have, and in a few projects they don't even have a proper unit testing.

Unit testing frameworks help simplify the process of unit testing, it provides assertions, exception handling and other control flow mechanism that make your work of adding unit tests become relatively easy. We use Boost Test Library for C++ and NUnit for C#, some of our cool kids start to use google test.


One of the task I was working on is the Code Coverage, it tests how your source code been covered by your unit tests. In other word unit tests test code, and coverage test measure unit test. We use gcov for C++ projects (with lcov as an extension to generate reports), and NCover for C# projects.

Three common metric we get from code coverage are:
  • Function coverage - How many times each function in the program been called during exercising unit tests.
  • Statement coverage - How many times does each line been visited.
  • Branch coverage - Does every edge/decision/condition been executed?


Unit testing is a Dynamic testing, there are other Dynamic testing such as Integration Tests, System Test and Acceptance Tests. We don't have most of them, and due to the nature that our software are in-house only software, our end users are acting as tester and doing all these tests for us kindly.


Contrast to dynamic testing there is static testing, or as we called it - code review, primarily it is just to walkthrough the code manually. In my previous company we were required to have a "buddy check" before doing any commit, now in my current one we are not that restricted but people will still ask someone in the same team to review. This does help the collaboration by letting other team members to understand what your are working on, thereby improve both the overall quality of code and the developers' skills.

ReviewBoard is the tool that I deployed to help pre-commit review, it is a relatively new open source tool so don't expect to be that perfect. I also configured post-commit mailer for Subversion to emails code to reviewers automatically after checkin is made.


Static testing without human analysis is called static code analysis, this is performed by an automated tool. Coverity is one of the tool that identifies security vulnerabilities and code defects, some say it is a very powerful, but it is very expensive as well - charge by per line of code it analyse. I wonder if it's worth because I only had a glance on it, for next few days I will take some time to deploy and test it.

There are other two statis analysis tools we use for our C# projects, they are both from Microsoft and they are free (uhh?). FxCop analyse .NET programs that compile to CIL object code, and StyleCop analyse C# source code to enforce a set of style and rules. Although FxCop was running there for a long time and its result appeared to be similiar to what we got from Coverity, but no one had ever care about them. Because they are from Microsoft and they are free, hence most of our developers think they are weak? what a pity.


These are just the tip of the iceberg in the entire software testing empire, but they covered most of what SCMer need to know and take care with. If your boss ask you to do anything more than tests that can be automated, you should suggset him/her to hire some more experienced tester to setup a testing team.

Remember, as the hub of the wheel we help but we don't do everything.

Wednesday, August 4, 2010

Clash of Titans: G.A.M on!

從第一輪起到現在,多數挑戰者都是採用了G大神的Android系統,在單一手機上也許愛鳳無敵,但G神要像上個世紀M帝一樣使出人海戰術,讓喬幫主的歷史再一次重演。

生果的的iOS與G神的Android,就好比上個世紀的MacOS與Windows之爭。MacOS是個人電腦的奠基者,有著1984年的iPhone之稱,創意與風頭都是一時無兩。但是其系統只出在自己生産的硬件上,自己的硬件也無法運行其他的系統,軟硬沒有分離,被後來居上的Windows超過。M帝只做軟不做硬,與intel結成了wintel聯盟,除了生果集團的硬件廠商都用它的,最後以量取勝。

和Windows一樣,G神推出Android,創意沒做到,先機沒搶到,但是現在卻穩步搶奪市場,因爲更多的手機開發商採用,就有更多的機型可供選擇,就有更多的使用者,然後就會有更多的開發者,更多的内容,而後鋪天蓋地。生果一年推出一支愛鳳,以精品取勝,可據一方,但要以一敵百,霸佔市場,恐怕很難。

不知道喬幫主還會不會讓自己重新走上幾十年前的老路?Android反其道以多搶攻,之後會佔上風,但要達到Windows在個人電腦市場上那種壟斷,應該也不行。畢竟M帝的Windows Mobile現在仍有手機平臺不少的份額,比之個人電腦那種OS格局,手機OS今後更有可能是三分天下再加上Symbian、RIM等其他攪局的情況。

RIM雖然現在仍然是美國境内購買量最多的智能手機OS,但因爲它因爲也是種生果(黑莓)所以只在自己的手機上裝專屬的OS,而且其本來的出發點就過於企業化,不具有大衆效果,所以逐步下滑被iOS與Android吞噬份額。其最終形態應是像電腦有專作服務器OS那樣的繼續守住商務區的一畝三分田了。

Symbian作爲最早的智能手機系統、Nokia作爲最大的手機制造商,至今仍然佔據半數以上的智能手機市場,但竟被認爲跟不上時代的步伐,不禁讓人感嘆一代江山一代人,前浪死在不思進取上。至於其他的Linux based系統(Intel的MeeGo、Samsung的bada),沒有更具創新的點籽及過硬的實力,想要尋找夾縫,極其之難。


以前說生果代表的是硬件、M帝代表的是軟件、G神代表的是網絡,但現在這三者相互競爭,領域並不局限於自己擅長的,也逐漸侵蝕到對方的市場,手機平臺的較量,只是一部分。現在的戰爭,就是全面戰爭,請看下回--G.A.M: Total War。

Tuesday, August 3, 2010

Media Distortion

本人不是果粉,曾經追隨過M帝一段時間,但現在沒有,對G神的使用基本上也僅限於search engine上,所以相對中立。西方的傳統就是講究均勢制衡,不希望看到哪個集團坐大,這應該是源自歐洲一族一國的歷史。不像中國傳統上是期待統一化,都喜歡那種大國思想、大企業觀念,所以也容易產生壟斷。

說來以前M帝還是M帝的時候,可沒被媒體少批,一點小小的問題就會被無限放大。這是爲啥?他如果產品不好,光靠市場策略和行銷手段,還能佔據90%以上的世界市場不成。不過既然市場不喜歡見到被壟斷,媒體作爲消費者的指向標自然也要誤導一下,否則如何矯正?國内的主流媒體就不一樣,都是一味鼓吹。爲什麽?都被掌控了。

所以Media Distortion也不全是不好,校正偏移一下市場方向標,對整體也有好處,畢竟競爭才是第一創造力的動力來源。沒有火狐的出現,IE現在還是6。誇大修飾算是媒體一貫做法,這可以理解。不渲染一下,讀者沒有情感偏頗,誰還會感興趣呢。只是人類的平均本質上沒有良好的自我辨析能力,所以盲從與互噴也是這種群居社會的景象之一。不要以爲五毛黨與五美分黨只有中國才有,在西方他們只是換了一種形式存在而已。


這次生果愛鳳的天綫寶寶門事件,也是人類特性的一種表現手法。也許愛鳳設計上確實有問題生果沒有正面承認,也許普羅大衆太不能接受愛鳳沒像一貫的完美,但這事還是被媒體無限放大了。一來市場不喜歡被一方做大,二來互噴盲從被當作生活樂趣。結果如何?排隊的排隊,斷貨的斷貨,免費的套子算是這場喧嘩中最大的好處。

事實上從愛鳳出現以來,就不停的有愛鳳殺手們登場。記得以前看ChannelWeb,每代都有比較(括號内是贏的場次):
  1. 第一輪:iPhone 3G (6) vs T-Mobile G1 (5) vs BlackBerry Storm (3)
  2. 第二輪:iPhone 3GS (8) vs Palm Pre (6)
  3. 第三輪:iPhone 4 (10) vs HTC Evo 4G (6)
  4. 第四輪:iPhone 4 (9) vs Motorola Droid X (6)
就算媒體想要偏頗,但是這種硬性評分的結果還是顯示了公正,每一輪愛鳳都是贏家。有的輪看起來比分接近,不過現在誰還記得當初最大的殺手Palm Pre?還有那個G大神出的Nexus One,現在停產了。這兩個是我印象最深刻的殺手,而現在最出名的對手就是HTC Evo 4G和Motorola Droid X了,不過這兩個都沒在澳洲出,澳洲是HTC Desire與Samsung Galaxy S i9000。

在前兩輪,市場需要靠媒體來鼓吹一下以避免愛鳳風頭太盛,但現在對手越來越多,越來越多。以前是一年都難找個對手,現在一季就會出幾個競爭者。從單一手機來看愛鳳無敵手,但是雙拳難敵眾手,從整體市場來説生果卻很有可能再次重演歷史。請看下回--Clash of Titans: G.A.M on!

Wednesday, July 28, 2010

Elegant Code

每個Programmer,都應該是有能力分辨出一段code是否具有美感。只是有時候有人問我靠什麽去評判時,我一時無法詳細地去解釋,只能説是靠種感覺。現在仔細想來,優雅的Code應該是具有「簡潔明瞭精致有效」這八個字。

前四個字是做WhiteBox時的評判,只有Programmer在意,因爲他們看得到内部的code,他們需要clean code是因爲這樣他們可以更快速的去理解(無論是自己寫的還是別人寫的),從而能在理解基礎上快速修復或增加新的東西。

后四個字是BlockBox時的評判,User和Developer都在意,這關乎的是一個成品的表現。成品在意的是效率,就是速度與精確。而一般來説,聰明的算法與數據結構總是有更好的效率。換句話說,我們現代CPU架構的模式使得在相同標準下短小精悍的code有優勢。

這些東西說太多,也只是意會,不好理解,下面用四個例子來做更好的作説明。需要注意的是,這四段Code都是合理優秀的,裏面就算最普通的第一個也是有如教科書般經典。

 def f1(list):
string = ""
for item in list:
string = string + chr(item)
return string
 def f2(list):
string = ""
ichr = chr
for item in list:
string = string + ichr(item)
return string
 def f3(list):
return "".join([chr(item) for item in list])
 def f4(list):
return "".join(map(chr, list))

給一個相對大的list,f1-f4的運行時間分別是:
  • f1: 3.01409792928ms
  • f2: 2.99986600876ms
  • f3: 2.69300198555ms
  • f4: 1.84089493752ms
  1. f1是最正規的寫法,只要不是很performance intensive的程序,相信大多數Programmer都是這麽寫。

  2. f2只比f1相比只有一處變化,性能上也只是稍微快了一點點。因爲python的特性,當執行chr()這個function的時候,intepretor需要不斷向上回溯去找chr()被定義的地方。而f2則將local variable ichr指向了chr,避免了每個loop都要向上回溯的時間。當然,這個減少的時間微乎其微,因爲大多數compiler都會幫你優化。

  3. f1和f2還有一個地方是很浪費資源的,就是string concatenation。一般Programming初學者總是喜歡用這個方法:初始化一個empty的string,然後再把内容用+ operator粘貼在後面。這個方法在string相對小並且操作量少的情況下並無壞處。但是在上面的function裏,每個loop可能都以運行十萬計的情況下,就非常耗費資源。因爲其操作是每次重新初始化一個string在memory裏,然後把舊的string和新的string添加在一起放入那個memory位置。這樣的complexity是O(n**2)。而使用join()這個内建函數,其complexity則是O(n),因爲它一次性把所有要加的部份粘在一起。

  4. 這4個function裏面,以f4的字符數最少,但是速度提升最大的也是f4。f4比f3的改變僅僅是用map代替了for,如此小的改變獲得的效果比前兩個改變大得多。你可以把map當作是for被移到了C code裏了,唯一不好的地方是map的loop body必須得是一個function。結論就是一個program的效率最大影響的還是compiler,只要有内置相同作用的function,還是用内置的更快也更方便。

以上是我最近從http://wiki.python.org/moin/PythonSpeed/PerformanceTips所學到的小技巧,每种語言都有其類似的提升方法。

Good programming style的視覺美感不僅僅是如何format及indent,簡潔的code也總是能有更高的性能。如果要做一個更好的Programmer,光遵循書上或者老師教的好code是不夠的,優雅的code,那是必需的。

Sunday, July 25, 2010

CM娘與Agile君

一個是靦腆寡言默默在背後服務的女僕式隨從,一個是當今最灸手可热的万人迷,兩人之間又有什麽不得不說的故事呢?

CM娘,可不是Agile君專屬的天使喲!早在Agile君成爲萬人迷很久之前,CM娘就默默地在幕後耕耘了,才不在乎誰是現在的主子呢。她不為堯存,不為桀亡,管你是瀑布君,還是叠代君,都能很好的為之服務。

只是她實在太不爭太小眾了,以至人們甚至都忘記她也是IEEE Computer society所制定的SWEBOK十大技術娘之一,知名度甚至遠不如其妹妹QA娘。爲什麽呢?人們難道忘記CM娘帶來的諸多便利的服務了嗎?


其實是在於,如果說Developer衆是一輛法拉利跑車,那麽CM娘就是這輛跑車上的各種減速系統。雖然速度被控制讓人很不爽,但這能避免你車毀人亡。

所以嘛,CM娘這個女僕,並不只是單純的服務於Developer眾的喲,她同時也監督著這些小祖宗們。所以這些小少爺呀,當然會去選擇性的忽略她,讓她越不起眼就越好。


回溯結束,讓我們就來開始開始八卦一下CM娘與Agile君的故事吧!

如前所述CM娘並不為Agile君而存在,她幾乎能適應各種主子們,所以呢,這個八卦的真相就是:其實是Agile君更需要CM娘!

爲什麽呢?如上一篇所述,Agile君的特質具有更大的多變性與適應性,並且需要進行更頻繁的交付。這些都需要CM娘們更多更細心地為他打理一切,進行調控和提供管理服務。

著名的Agile君專屬八卦雜誌AgileJournal.com曾經向Agile君的粉絲們推出一份問卷,請粉絲們為CM娘對Agile君的重要性從各方面進行投票,0分爲最不重要,10分爲最重要。

下面這份圖表,就是問卷答案在各方面的平均得分

我們可以看出,其中最低的平均得分“CM娘的報告”也有6分,而整體平均線在7.5分以上,可見就算是Agile君的粉絲,也是對CM娘的重要性相當的認同哦!

也難怪CM娘的粉絲們,如其專屬的八卦雜誌CMCrossroads.com會對這兩者的關係相當瘋狂的追逐了。在他們看來,這可是麻雀一朝變鳳凰,躍上枝頭衆人羡的美事呢。


在我看來,願望是美好的,但事情都不是那麽容易的。CM娘一直都是孤獨的CM娘,她缺少與其他人在同一個氛圍進行交流的機會,她的圈子太局限太被動了。這也是爲什麽CM娘的粉絲們那麽希望兩者能結合在一起,畢竟Agile君理論上也應該是獨行俠,現在卻大受歡迎。CM娘如果能學習Agile君身上的那些讓他流行起來的元素,例如專業集群化,那麽兩者就算最終不能在一起,又有何懼呢?

Friday, July 23, 2010

The Knight bringing Agile to the Day

Agile君是誰?

傳説很久以前,有一位聖騎士對他的國王說,我們應該給人民他們所需要的,而不是我們想給他們什麽就給他們什麽。並且,與其在他們已經等了很久以後再把他們想要得到的一次性全部給與,還不如分階段按需分配,這樣他們可以更快地獲得缺需的,從而改變他們的生活,讓人民更快樂。

聖騎士他認爲國家中的人民才是真正推動各種需求的,而政府所能夠提供的價值,其核心就在於如何讓人民從這個不斷改變的世界中感知並獲得他們的價值。

這位聖騎士就是被後人稱之爲Agile君的那位,他建立了Agile騎士團,制定了騎士團的四大信條:

  1. 政績實效大於完整文檔。
    這不是說文檔不重要,只是人民更看重施政效果,而非口號、文件、以及各種上級部門所下達的各類指示。
  2. 個體互動大於工具過程。
    這也不是說工具與過程不重要,只是要讓人民進行生産並不是把他們當成無腦的機械,而是需要通過體現個人,並相互之間的互動來達到。
  3. 協同合作大於律法合約。
    只有當政府持續與人民互動時,才能減少危機的出現,才能帶給人民更多他們所需要的。
  4. 適應變化大於盲從計劃。
    能夠適應各種變化地來與人民合作及進行控制;表現出各種意見都是受歡迎、可理解、什麽時候都是有其道理的誠意。


能夠擁抱變化,接受現實生活的這種不定性,Agile騎士團通過提供方法與技術來最大限度的降低風險並增加確定性來治國,這減少了政府與人民之間的隔閡,保證了政府能夠讓人民獲得他們真正想要的。

With that, the Knight brought Agile into the day and people into the light.

--「Agile君做軟件則軟件大賣,治國則國富民強。」

Wednesday, July 21, 2010

Cloud

Cloud叔叔(右圖)與CM娘的關係?

按照之前所提到那些高人的説法:
  1. Cloud叔叔現在在更多方面進行的擴展,這必將需要更多的CM娘來協助其進行管理;
  2. CM娘通過Cloud叔叔的模式進行專業服務,這已經有許多案例,比如美麗雪梨情人港兼Market St FF旁的Atalassian就有提供CM娘專業服務的一些。
不過這兩個説法都很攀龍附鳳耶,弄得好像CM娘硬要和Cloud叔叔扯上關係似的。Cloud叔叔這種類型的新概念的普及,何時不是需要各種不同的技術娘來多多支持呢?
充其量,CM娘也只是獲得了更多打雜的地方而已嘛,在這方面電腦軟硬諸界以及下屬各領域的情況其實是差不多的才對。

而第二點則更是無稽,Cloud叔叔的這種服務概念,連小狐狸都自稱家裏的視頻共享也是其中一種,IT大千世界又有哪方哪面會應用不上呢?


在我看來,Cloud叔叔對CM娘來説最大的幫助,就是讓本來大多時間都是單獨勞作的CM娘們有更多可能性在一起工作,因爲那些提供Cloud叔叔的應用公司需要好多CM娘而非一個的說。

而其他組織大多數會因爲有了這種通過Cloud叔叔來提供服務的CM娘,就不再需要那種聘請一兩個CM娘來為整個公司提供各項服務的模式了。因爲被外包了,公司内部的Development Services將不再需要,剩下操控的部分則可能被整合入管理裏面(這就給了CM娘與Agile君親近的機會,當然這是後話)。

這種服務專業化的模式是大勢所趨,畢竟CM娘這種缺稀且需求不大的技術娘,無法像Developer眾經常可以通過討論交流來增強自己。大部分CM娘都是獨立工作,最多有事找找Google大神,很少能有互相交流提高的機會。有時候就算去一些CM娘大聚餐、High派對之類的,也都是聼彼此說一些誰不知道你媽是女的之類的東西,再喝喝酒,劃劃拳,讓人無法感知到半點Inspiration。

像Thoughtworks那樣,專業服務專業化,被包的公司可以得到更專業更有效率的服務,而各專業人才之間也經常可以交流,並且可以有渠道在不同行業不同公司提供技術性服務與咨詢,從而更大化的獲得知識,真是美哉!

Monday, July 19, 2010

Cloudy with a chance of Agility

到底我的job title是要換成SCM Engineer,還是Configuration Anaylst,亦或仍是Build Engineer,都尚不可知。但我已覺得CM(Configuration Management)是那麽的無聊,枯燥且缺乏變化。上手之後的大部份時間都是重復性勞作,缺乏創意與巧思的動力不禁讓我懷疑自己還敢這樣做多久。

不過,既然無法在短期(半年内)轉爲C++ developer,那麽秉著幹一行愛一行的原則,還是把本職做精了,做神了,至少做出成果,做出實績再説。既不跳出圈外,我就需要在圈内求變化。

首先要和一些先進性名詞挂上鈎,比如Cloud,Agile什麽的IT新抱,能拉多近拉多近。

Cloud云云,本來就是和IT所有東西可能有關的概念,最近連MS都趁熱打鐵推出了Windows Azure。我貼個近乎,也就是走走過場,理所當然不在話下。

至於Agile,以我敏銳的預判本能,早在半年多前就看到了CM和Agile之間不可分割的聯係,兩者的水乳交合,在公在私,正是大勢所趨。剩下的只是我將如何推進此跨時代的轉型?

Agile的書,看了不少;公司新的Dev Manager,也是Agile正統科班出身,正把這些信條步步帶入三樓。只是這些無論理論還是實踐的玩兒,聞之見之,都只覺是空泛之辭,難覺其妙,無法讓我有那種Programming時見到巧妙算法解決難題時候的興奮。

或者Engineering的東西就是這樣,按班就步,條條有理,不興奮,但穩妥。可悲的是這十分適合我的區域,卻讓我興趣缺缺。性格如此,興趣卻非如此,豈不奇哉怪也!

在這樣十字路口,需要的是高人指點迷津,沒有更多知識來獲取,那就需要前人的經驗。CM這貨,本來就是靠著經驗吃飯的活。

於是乎我上網查詢有關資料,想找一些高人的Blog來觀摩Follow。正好,讓我逮着了http://cmforagile.blogspot.com/,這也是爲什麽我會建此Blog,因爲我follow了人家的blog嘛!沒登陸是無法follow的,既然登陸了就順便建了。順藤摸瓜,又摸到了http://www.cmcrossroads.com/,與其連接或下屬的http://www.cmwiki.com/。

於是乎,歷史的車輪又再一次滾動了起來,但在此之前讓我先去FF Market St.!