2001年10月21日下午,第47期IT沙龍在翠宮飯店舉行,這次論壇的話題是“現代軟件工程”,以下是這次沙龍的實錄:
主持人潘加宇:
大家好,歡迎大家光臨第47期IT沙龍,我是umlchina。本期沙龍主題是“現代軟件工
程”,由我為大家主持,F在我們請本次IT沙龍的組織者,書生公司董事長王東臨先生給大家做一個開場白。
書生公司董事長王東臨:
大家好。我們這期主題是“現代軟件工程”,其中特別強調“現代”這兩個字,是因為我們軟件業雖然經過了幾十年的發展,但主流輿論對軟件工程的認識還停留在七八十年代傳統軟件工程的水平,把軟件工程機械化成教科書上所寫的生命周期法,甚至還有很多人把軟件工程片面理解成寫足夠多的文檔。這是由于中國軟件業所存在的一個問題,即軟件行業的話語權并不掌握在做軟件的人手里所造成的。
應該說傳統軟件工程的原則基本還是正確的,但是從具體方法來說,90年代以來有已經不少發展和提高了。傳統的教科書上的方法在已知條件充足、條件恒定不變時,給出一個靜態的最優解應該說還是一個比較恰當的方法。但是應用在商業環境里面,條件還不是很充分,需求在不停變化,那就不太夠了。
我今年31歲,我上學時就學的這套方法,而幾乎所有的專家學者年齡都比我大,他們更是受到這種傳統方法的教育。而咱們國家有一點跟美國不一樣,軟件等高科技行業受科研單位、大專院校的影響比較大,這些單位的專家學者對政府、媒體、用戶等的影響是很大的。我大致分析了一下,我國由于歷史原因,早期只有國家科研單位、大專院校才具備從事軟件開發的人才,因此早期的IT企業大多出自這些單位,如北大、清華和中科院,這也是我國特有的高校辦企業現象的根源。而美國大學和企業的界線是很分明的,前者只管研究,后者負責商品研發和市場運作。如果大學里研究出了一項好技術,就會拉出來作為一個企業來運作,如CISCO最早就是斯坦福的老師研究出來的,他們夫妻倆就自己出來辦了公司,與斯坦福是不相干的?傊,個人可以流動,但不管怎樣在大學就作研究,要做商業就出來到企業去,而不是以做教學和研究為職責的大學下面再辦一個商業的公司,最后什么都不像。目前,中國那些高校和科研單位辦的IT企業很多已開始明白這個道理了,并開始逐步脫鉤了,但還不徹底,明明是工業界的事卻偏偏要去聽學術界的人的意見,如果遇到周老師這樣明白的人還好,遇到一些從教科書到教科書的所謂專家學者,就往往會有偏差,這就造成了前面所說的軟件業的話語權不在做軟件的人手里的現象。
事實上,我本人在十多年從事軟件行業的工作中,普遍感到無論是用戶、媒體還是政府,都一直用七八十年代軟件工程的標準來衡量我們。這樣對行業造成一定的誤導,而且這種誤導現在還是有一定的作用,有一定的影響。
所以今天希望借這個機會,請真正做軟件的,如Microsoft,摩托羅拉,包括國內比較優秀的像金山,也有相對比較符合中國國情的,規模比較小的,像做超級解霸的等等,大家談談真正的實際軟件工程到底怎么回事。當然也包括周老師,周老師雖然也是在高校里面,但是周老師本身對現代軟件工程方面也有比較好的研究。我們的主持人潘加宇有個人網站umlchina,在軟件業專業圈里面影響也比較大,他本身對軟件工程也有很多了解。
今天很榮幸請到這樣幾位主講嘉賓和主持人,也希望今天大家都有很好的收獲。
謝謝大家。
主持人潘加宇:
今天我們非常榮幸邀請到了五位主講嘉賓,他們分別是微軟研發中心服務系統平臺部經理楊永生先生,金山公司金山詞霸研發部技術總監鄒濤先生,摩托羅拉全球電信解決方案部網絡方案技術中心高級經理胡大慶先生,清華大學著名教授周之英老師,還有一位是豪杰公司的總裁梁肇新先生。
首先我們有請清華大學計算機系的周之英教授。周教授二十多年來一直從事軟件工程方法的教學和研究工作,曾經和主持和參與多項軟件工程有關的國家重大科技攻關項目和863項目,還有需要大型復雜網絡的應用系統開發工程,連續十多年在清華講授研究生課程“軟件工程技術和設計”?赡艽蠹覍χ芙淌谧畲蟮牧私饩褪99年末的時候出過《現代軟件工程》的書,當時涉及的內容是很新的。所以從當時很新的書里面,周老師對新知識的敏銳和軟件工程推廣的熱情。
周老師今天發言的主題是《現代軟件工程的觀點——尊重事實、認識極端,解決思想》。下面有請周老師。清華大學計算機系教授周之英:
很高興有機會跟大家一起探討現代軟件工程。我大概二十多年一直對軟件工程很有興趣。為什么呢?如果做軟件是一個項目開發問題,那我們希望軟件工程解決普通性的問題,超越一個項目。所以這個問題我認為很有挑戰性,一直在搞這方面的工作。
大概兩年前我在科學出版社出了叫做《現代軟件工程》的書。為什么加“現代”兩個字?主要想界分一下現代軟件工程跟軟件工程的一些差別。什么是軟件工程?希望改變小作坊式的軟件開發方式,轉向工業化,就是希望學習工廠的經驗,物質生產的過程。物質生產過程基于一些規律,物理學原理力學等等,和工程的一些方法。能夠使生產工作達到大規模生產,效率高,不需要很多的技藝。比如手工加工一個零件需要很高的手藝,按工程規范做,就不需要長期學手藝,學工程規范比用手藝實現簡單。這是軟件工程追求的理想。把軟件變成一個有規律的物化的觀念。
但是90年代以后發現有很多矛盾,我參與了很多項目,覺得并不像那個樣子。最大的矛盾是什么?軟件不是純物化的東西,這里面有人的因素,所以這就有很多變動的東西,不可能像理想的物質生產過程,基于物理學等的原理來做。人的(認識)規律,我們還沒有認識得很清楚,F在有五花八門適應各種情況的東西出來,才能真正解決它的問題,適應變化的需求。所以我基于這樣的觀點:全球化形勢下,變化多端;過去是很穩定的情況還可以;現在全世界這么大范圍里面,任何一個地方發生變動,就可能影響到你這兒,所以變動顯得是非常地迅速。這時,人的因素就更突出了,而且方法就更多種多樣了。我就加上一個“現代”,強調僅用物的規律的不夠,改變過去軟件工程的想一成不變的用一個方法解決一切,出現多種多樣的、豐富多彩的問題。
到現在為止,我這觀點,跟各方面交流不夠。這次有機會跟大家談談覺得很高興。能跟參加實際工作的朋友交流,可以更好地展開這些思想。
我今天主要想提十個觀點。主要是針對沙龍給我的參考文章里面提到的普遍問題。
一個觀點,現在的項目各個都不一樣,每一個項目都應該有自己的規范,規范都是不一樣的。軟件工程是超越項目。就是說每一個項目不一樣,但是項目之間有共性的、有規律性的東西,我們要把這些東西研究出來。所以軟件工程是基于項目和產品,不可能脫離項目和產品,但要超越產品,超越開發組織、開發的團隊、個人。要超越,就要有客觀性。軟件工程環繞事實進行,這事實就是軟件過程中一系列的東西,包括文檔等等。所有工作要建立在客觀性基礎上。這是第一點,就是說要超越項目;共性跟個性的問題;不能憑主觀想象,要有事實作為基礎。
第二個觀點,軟件工程理論方面,經驗實踐,各式各樣標準等等,跟物質世界相應的東西是有區別的,軟件工程的這些理論、方法、標準、開發模式等等,是強烈依賴于具體環境和執行的人。就是說,這個人本身不像一個車間里一個機器,一種機器生產的東西可以是不變的,但是在軟件過程中,人不可能一樣的。人的能力,人的行為都不同。人的一些東西,比較難刻劃,所以目前軟件工程中所有理論是不充分的。因為人是在其中起很主要作用。雖然模型總是一種簡化,但是人的簡化往往是太簡化了。我們應該看到這些理論到目前為止是不充分的。
不充分以后,要去推廣就有一定難度。我們說,所有理論要使用的前提是什么?可重復性。像CMM,最基本的條件是可重復性。但你的邊界條件都是不重復的,整個過程就不太好重復了。所以要認識哪些東西重復,哪些東西不重復了,推廣就難度比較大,不是不需要推廣,而是難度比較大。常常需要人在軟件過程中調整。有時因為有“人”的參與而能推廣,隱含了人在過程里對差異的的能動性調整。所以學習的時候要有這樣的理解。第二個,理論的東西是一個抽象純化的東西,我們要在實際運用,要把純化變成實際的情況。我覺得很奇怪,大家都對軟件工程說,實際開發怎么跟書本上不一樣,我想物理學書本說動者恒動,靜者恒靜,小球會在絕對光滑的水平面上不停地滾動。物理教這些,你從來沒有要求實際是這樣,這球在地毯上滾,一會兒就停住了。所以說,在這個問題上,你學到的理論是理想情況,對實際情形來說第一個就是不完整的,很多邊界條件沒講清楚,也講不清楚;第二,實際工作時,不能要求照著書本上理想模式來作范本,這樣要求是不合理的。需要體會你的環境,理解為什么,對你有什么幫助。而不能希望百分之百照抄,這樣你什么也學不到;不能學到對你有共性的東西。
第三,對于文檔。我們要客觀性,這中間有一個很大的東西就是記錄文檔,通過文檔記錄一些東西。大家說文檔里面的東西也有錯,我要照著它做不是就錯了。問題是文檔你知道錯,就可以改,如果沒有文檔你是不是就錯更多。記錄一些東西,便于大家交流。不要你想你的,我想我的,這是文檔可起的一個方面的作用。第二個文檔應該是記錄了開發的歷史,大家可以想人類社會的歷史起了什么作用:了解過去,認識現在,展望將來。我更提高一些,說文檔應該表示你把對問題的理解記錄下來,工作進展應該記錄下來,這是文檔的作用;第二個從更深層次所起的歷史作用:將來可以改進,記錄下你的成就。所以對軟件組織或者軟件工程師個人來說,如果你有抱負,你希望能起歷史作用你就得把你的工作記錄下來。所以應該用更高、更深層次來思考這些東西,
那么歷史有什么作用?我們只能夠根據歷史去預測未來,并不是我們為了躺在老祖宗身上,而是我們為了向前看,為了現在的工作,為了將來的工作,F在工作怎么來看,我們還沒有做,將來工作更不知道。那只有什么?只有靠歷史,靠歷史去預測未來。但是我們不能靠歷史去計劃未來,我們未來一定是跟歷史不一樣的,中國還停在封建社會?這是不可能的。還是在文化大革命?這是不可能的。我們為了更好的未來,我們希望未來比過去歷史更好。所以我們不能照過去怎么現在就怎么樣,而是要吸取歷史經驗教訓來指導我們,這就是歷史的作用。
第五個,什么是歷史,歷史就是過去的事實,真實的事實。軟件工程包含很好的項目的成功的經驗的總結。我們軟件工程有一些東西,分析得更多的是過去成功的經驗。學習軟件工程這些東西,是為了掌握歷史的觀點。一個人脫離了歷史,就是沒有文化的。有人問,學了有沒有用?當然你要沒有學歷史,你也可以做事,但是往往是短期的。你要有更高要求的話,不僅是就事論事的話,就應該學習過去成功的經驗,而不僅僅是為了當前這件事,對素養的提高很重要。
歷史要尊重事實;尊重事實有兩方面,一方面是歷史,一方面是現狀,現狀也是一個事實,跟歷史不一樣的,所以你要正確認識自己和別人的情況。
第七點,在全球化的進程中,技術環境的變化非常多樣,而且復雜,變化非常迅速。對一個具體個人或者一個企業來說,周圍不確定因素太多了。針對這樣情況,從軟件工程本身來說,對它的要求實在太高了。為什么呢?現在使用軟件工作已經不像四十年、五十年、七十年代是非常少的人群,現在有非常多的人群,各行各業,現在有很多不是學計算機的,學化學的、學機械的,有很多人甚至不是大學畢業的,也在搞軟件,也搞工程。所以對軟件工程希望的東西太多了。人群廣泛以后,更希望簡單好用,還要實用,還要有效。又要處理非常復雜的問題,各式各樣的問題,所以給軟件工程帶來了很多的矛盾。根本的矛盾是什么呢?這是我的觀點,我認為開發中所有能看到的東西,但運行時的情況發生了變化,F在面向對象技術出現以后,運行視圖,運行時實際情況跟你開發時看到的東西不一樣了。從前結構化的時候,還可以,差不多。因為結構化設計時的模塊結構,在運行時是一樣。設計是什么樣的模式,運行也是差不多這樣的模式。如果希望運行時效率提高,那就在什么地方去改一改。人可以看到的一些東西,就能夠去做它?床坏降臇|西、在運行過程中,全放在腦袋里面,對人的要求太多了。處于這種狀況下非常困難。
運行模式是由硬件確定的;是開發平臺確定的。也就是說,現在這種本質的硬件已從四十年代五十年代一直延續到現在。某種意義上,真正要解決這樣有很多的難點的開發問題,得從根子上來解決。所以現在還有很多人在研究更基礎的問題。國內這方面考慮少一點。我們應該認識到,什么方法能解決那么困難的問題,看不見!即使有的話,是會有困難的。有根本矛盾的困難。
第八個,一般性的問題很難解決,但是具體問題并不難解決。一個一個成功具體的項目很多。項目為什么成功?因為把它主要問題、主要特征解決了,F在就有一些方法很極端,比方有人說XP,或者更極端一些,我什么方法也沒有,就完全可以用黑客的方式、就可以去解決問題了等等。這種情況是強調某個片面,就是強調局部,針對具體問題可能是有效的;或者強調不是那么片面的,但也不是很全面,針對具體問題具體解決的有了各式各樣的方法。各種情況的多樣性。還有一種極端就是想全面,我也碰到,有時候審查論文,或項目,說想有一個知識庫把所有知識都放進去等等。按這種東西照搬會超越你的控制能力,可以是一種想法,有道理。但是能用嗎?得自己考慮。應該去理解和利用它的一些內涵的東西。比方說有一些方法很全面,把各種東西刻劃了,也許對你全部做不合適,但是你可以當做一種參考模型,去理解所考慮的方方面面,幫助你找到自己需要的。但是找到自己需要的前提是什么?你得知道自己需要什么。首先得清楚自己的情況,然后還要清楚現在的技術提供一些什么。
不同環境下情況可能不一樣,甚至觀點不一樣,F在軟件工程中,客觀存在就有沖突的觀點,有不一樣的東西。這是在不同背景下,適應不同情況。得理解問題的邊界條件。得承認這是客觀事實,F在最好的觀點是你不要違反常識,常識告訴你的往往是最有效的東西。不要盲目追求一些很出名的東西。在面對復雜而有沖突的問題,想獲得成功,需要的是積極思考,認識自己的問題,通過理性思考,包括認識極端的方法,全面方法的作用,通過一些合作和交流去解決一些沖突,得到一定的平衡。軟件工程是通過平衡解決問題,也可說軟件工程處理的很多問題是得到“滿意解”。另一方面“滿意解”也等于“不滿意解”。為什么?它僅是一種平衡,它遺留了一些不夠滿意的東西。對不滿意的東西,就應該想辦法再提高、去解決。所以應該有發展的觀點,不要覺得協商“滿意解”就解決一切了。還要考慮進一步創新。
文章來源于領測軟件測試網 http://www.kjueaiud.com/