效顰篇 程式設計本質論

2021-08-21 22:47:59 字數 4282 閱讀 7319

效顰篇:程式設計本質論<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

猛禽[mental studio](個人專欄)

先有leezy_2000兄的大作《程式設計本質論》

,接著是johnnyxia兄的《也談程式設計本質》

,在csdn上引發了一場關於程式設計本質問題的熱烈討論。當時我也在qq上和framesniper兄就這個問題聊了幾句,當時就想寫這麼一篇效顰文章來湊個熱鬧,只是因為沒想到那篇bcbx的文章寫了這麼久,加上過了個年,於是耽擱了,現在過了兩三個月了,再來舊話重提,恐有馬後炮的嫌疑。

「效顰」的典故出自《莊子·天運》

,曰:故西施病心而顰其裡,其裡之醜人見之而美之,歸亦捧心而顰其裡。其裡之富人見之,堅閉門而不出;貧人見之,挈妻子而去之走。彼知顰美而不知顰之所以美。

正如我對fs兄所說的觀點:雖然我們在軟體業摸爬滾打了這麼些年頭,但軟體的本質對於我們來說,與盲人面前的大象沒有區別。每個人看到的都是其中很小的乙個方面,所有說出來的看法都是片面的,我也不例外。然而每個人將自已從不同角度得到的看法說出來,也許就能讓我們對軟體的本質有更全面的了解。這就是我為什麼明知是在「效顰」而仍要為之的原因之一(另乙個原因當然是因為我也是「不知顰之所以美」)。

在研究「程式設計本質」前,當然首先要研究一下什麼是「本質」,金山詞霸對「本質」一詞的解釋有三個: 1、

事物中常在的不變的形體 2、

事物的根本性質 3、

哲學名詞。某類事物區別於其它事物的基本特質

首先,軟體應該說是沒有什麼具體的形體的,至於哲學,太高深了,非我輩所能妄言,所以我想研究的是:什麼是「程式設計的根本性質」?

然後再來看看「程式設計」是乙個什麼概念?顧名思義,所謂「程式設計」就是編寫程式,就是coding,然而這只是乙個狹義的概念。按照program一詞的正式解釋是:設計、編寫、測試程式。也就是development,即「開發」。

現在可以明確所謂「程式設計本質」就是「軟體開發的根本性質」。

leezy_2000兄認為程式設計有四大要素:問題、概念、邏輯和技巧,並且認為其本質為:概念和邏輯。

而johnnyxia兄則認為程式設計的本質是thinking in programming language。

我的觀點是,他們說的都是正確的,但這不能算是「軟體開發的根本性質」。

先來看leezy_2000兄的觀點:首先這種劃分四大要素的分法就非常的主觀,因為每個人從不同的角度來看,都可能有不同的分法。比如三個要素:問題,解題思路(借用toomore兄的說法)及實現----個人更傾向於這種看法。或者還有人能分出五個要素來。既然它不是不變的,又談何「根本性質」?

另外,所謂「要素」即「必要的元素」,意味著它們中的任何一項都是不可或缺的,如果硬要說其中包含著所謂的「本質」,那麼所有的部分都是同等重要的,這個「本質」必須包含所有的要素,何故厚此薄彼?

leezy_2000兄強調概念和邏輯是基於軟體的質量屬性:健壯性、可重用性、易擴充性、容錯性(其實這就是健壯性)而言的。而事實上軟體的質量屬性遠不止這幾個,按《軟體需求》第11章中的說法可以分成兩類:對使用者最重要的屬性和對開發者最重要的屬性。而這兩類分別包括:有效性,高效性,靈活性,完整性,互操作性,可靠性,健壯性,可用性(以上為使用者方面),可維護性,可移植性,可重用性,可測試性(以上為開發者方面)。而且就這些屬性來說,很多也是互相制約的,只能是根據實際情況取捨,並非如leezy_2000兄所言的,只要對「邏輯進行提煉和精化」就能達到。

至於軟體可以用硬體替代,不過是證明軟體中包含邏輯,並不能證明邏輯就是軟體的本質,而且還恰恰證否了這一點:套用前面的哲學說法來說,它們就不能算是軟體「區別於其它事務的基本特質」了。

不可否認現在重視工具與技巧有些過度,沉迷於技術細節固然不是一種好的做法,在這一點上,我很支援leezy_2000兄對林銳的書的看法,正如《老子·五十七章》所說:「人多技巧,奇物滋起」。但我還是支援cpptrier兄的觀點:不可矯枉過正(雖然leezy_2000兄在文中提到這不是他的目的,但事實上他的文章卻得到這樣的效果),相當部分的初學者其實都很盲目,很容易從乙個極端走向另乙個極端。技巧仍然是乙個必不可少的要素。而且從某種角度上說,即使是像模式之類的也是一種技巧。

johnnyxia兄和cpptrier兄的觀點比較一致,也很有道理,而且從狹義上說,thinking in programming language就是coding的本質(考慮到概念的完整性,這個programming language其實還應該包括platform,在具體開發時,即使同樣是用c++語言,面對windows和linux下不同的api,這個thinking多少也是有些不同的),所有coding的過程都有這個「根本性質」,因為coding一定是在乙個確定的平台下用一種確定的開發語言來進行,「語言磨礪了我們思維的方式,也決定了我們思考的範圍。」大師就是大師。

然而對於「軟體開發」來說,這個「本質」還是不夠根本。拿現在異軍突起的mda來說,mda提出了pim(platform independent model)和psm(platform specific model)的概念,將設計過程分為兩個階段。thinking in programming language只是psm階段的工作,至於pim階段,則是乙個更高層次的抽象。所以說tinking in programming language也不能說是「軟體開發的根本性質」。

不過我非常贊成coding即design的觀點,mda的psm即證明了這一點,設計psm的過程其實就是對coding的改進,在psm的**自動生成技術實現後,psm就成為軟體的實現階段了。coding也是軟體開發的重要組成部分,鄙視coding的所謂專案經理才是最應該被鄙視的。

那麼什麼才是「軟體開發的根本性質」?我來說說我的看法吧(奏樂),軟體開發的根本性質就是:通過coding解決問題!(怎麼都暈倒了?)

廢話,這的確是一句廢話。因為這是誰都知道的事。

然而這也是一句實話,真理有時候就是這麼樸素。

首先,有軟體就有code,即使是mda被完美地實現了,psm可以直接生成**了,也還可以認為psm是一種圖形化的code,就如同工業上plc所用的程式語言----梯形圖,就是一種典型的圖形化code。

其次,軟體的目的就是解決問題,不能解決問題的軟體根本就是廢物。

前面說過,我們都是在盲人摸象,然而摸不出象並不表示象就不存在。對於軟體開發的問題,在具體的觀點上,各人有各人的看法,但仍然還是存在普遍真理的,這就是鄧公的經典論斷「不管黑貓白貓,抓得到老鼠就是好貓」,不論是什麼軟體理論或技術,只要是對解決問題有益的,就是好東東。

所以不論是概念邏輯分析,還是thinking in programming language,只要有助於你的軟體開發工作,那你就應該採納。從解決問題的角度上說,所以用於解決問題的方法都可以看作技巧,不論是coding的技巧,還是設計模式,oo,uml……對於解決不同的問題,它們肯定會有不同的側重,沒有哪個是絕對的重要,還是應該以一種平等的觀點來看待這些要素的。過於強調其中的某些方面實在有誤導之嫌,必然導致別人陷入像pbzjh兄那樣的困境。正如toomore兄所言:「手中有了一把榔頭,看什麼都是釘子」,這樣的人還是很多,片面地強調某些方面則必然導致他們放下這把榔頭,拿起的不過是另一把榔頭。所以我認為還是應該強調它們的重要性是同等的,要根據實際情況處理,如toomore兄所說(btw:toomore兄的例子都很經典啊):「我記得**體育台的中國象棋節目的張強大師有一次講到,高手下棋從來是根據具體的局面情況來制訂策略,而許多低手下棋總喜歡把棋走成某幾種固定的形狀而不顧具體局勢如何。」

基於解決問題這乙個目的,對於軟體公司的招聘要求也就好理解了,因為他們要的是能夠為他們解決具體問題的人,而不是一些只會空談的人。我們做技術的常常容易犯自以為是的毛病(我也一樣),總認為那些開公司的什麼都不懂,其實不懂的恰恰是我們,因為經營公司與開發軟體是完全不同的兩回事。作為公司來說,特別是目前國內的這些小軟體公司,最重要的是以最快的速度開發出為使用者解決問題的軟體,不管你有多麼強的邏輯分析能力,如果沒有實用的技巧,它是不可能等你去慢慢學習的。至於大公司,如微軟之類,它有足夠的資源去培養人才,所以它對技巧並不重視。打個簡單比方:乙個普通的鏢局招人,肯定是要有一定外家功夫的人,至於像段譽未學六脈神劍時那樣,即使他有很強的內功,鏢局也不會要的,因為不能打;但對於大的武林門派來說,要收門徒的話,卻一般會挑選有潛質的人,而不在乎他能不能打。(btw:就像從來沒有哪個鏢局能發展成為知名武林門派一樣,我感覺國內現有的軟體公司也不太可能在有限的時間裡發展成為國際知名軟體公司)

如果一定要在軟體開發的過程中找乙個重點的話,我認為是「問題」。只有在正確地定義了問題以後,後面的解決思路和實現才有意義,如果是對乙個問題作了錯誤的定義,即使後面提出了正確的解決思路和實現,那也是對錯誤問題的解決。這也許就是為什麼karl.e.weigers憑一本不到200頁的薄薄小書《軟體需求》

而獲jolt大獎的原因。

我本來就是個狂妄的人,所以也就沒有什麼假裝謙虛的客套話,大家有板磚就儘管扔過來吧。^_^

[mental studio]猛禽

2004-2-15

繼承本質論

1.引言 關於繼承,你是否駕熟就輕,關於繼承,你是否瞭如指掌。本文不討論繼承的基本概念,我們回歸本質,從編譯器執行的角度來揭示.net繼承中的執行本源,來發現子類物件是如何實現了對父類成員與方法的繼承,以最為簡陋的示例來揭示繼承的實質,闡述繼承機制是如何被執行的,這對於更好的理解繼承,是必要且必然的...

繼承本質論

原創作品,轉貼請註明作者和出處。關於繼承,你是否駕熟就輕,關於繼承,你是否瞭如指掌。本文不討論繼承的基本概念,我們回歸本質,從編譯器執行的角度來揭示.net繼承中的執行本源,來發現子類物件是如何實現了對父類成員與方法的繼承,以最為簡陋的示例來揭示繼承的實質,闡述繼承機制是如何被執行的,這對於更好的理...

指標本質論

指標本質論 1.指標是什麼?和一般變數有什麼區別?指標就是位址,和一般變數沒有本質區別,僅僅是它有自己的規則。int a 100 int p a printf d n a 100 printf p n p 0xbfa47858 a是乙個變數名,型別是int,值是100,a有自己的位址 a p是乙個變...