官术网_书友最值得收藏!

1.1 創(chuàng)造的根源

軟件開發(fā)越來越需要創(chuàng)造力。創(chuàng)造的根源在于想象。如何運用想象能力以及提升想象技能,是軟件開發(fā)成功與否的關鍵。

什么是創(chuàng)造?最簡單的說法就是,經(jīng)過人的智慧的加工,通過非必然的過程,產(chǎn)生非必然的結(jié)果。創(chuàng)造不能復制,每一次都是獨特的。

錢學森錢學森(1911年12月11日—2009年10月31日),浙江杭州人,中國空氣動力學家,中國科學院、中國工程院院士,中國兩彈一星功勛獎章獲得者之一。曾任美國麻省理工學院教授、加州理工學院教授,為中美兩國的導彈和航天計劃都曾作出過重大貢獻,被譽為“中國航天之父”和“火箭之王”。先生認為,人的思維有三種類型:邏輯思維、形象思維和靈感思維。

邏輯思維是線形的,借助于數(shù)學和邏輯學中的公理,可以根據(jù)一些信息推導出精確的、必然的結(jié)果。

形象思維是面形的,在解決一個具體問題時,由于現(xiàn)象提供的信息非常復雜,無法完全使用邏輯推理的方式產(chǎn)生結(jié)果。在這種情況下,非科學性的知識和以往的經(jīng)驗,甚至人體中未被認識的特殊功能都可能幫助我們解決問題。

靈感思維是三維的,人類可以在潛意識中完成一些看似無法解決的問題。潛意識的研究目前還處于非常膚淺的階段。我們談論的創(chuàng)造是發(fā)生在人類可以控制的顯意識方面的,主要是指形象思維。

我們說,軟件開發(fā)越來越需要創(chuàng)造力,越來越需要形象思維。這種說法是有道理的,它體現(xiàn)在軟件開發(fā)領域的方方面面。例如,編程語言的發(fā)展,就可以作為這個斷語的證明。

眾所周知,編程語言經(jīng)過多年的發(fā)展,已經(jīng)從面向機器的低級語言“進化為”面向領域和對象的高級語言。越是高級的語言,抽象程度就越高,人類想象力和創(chuàng)造精神的特征也越明顯。

15年前,我剛剛進入工業(yè)控制行業(yè),從事嵌入式設備(單片機)的軟件開發(fā)。這段經(jīng)歷使我有機會從硬件的角度來認識軟件的本質(zhì)。10年前,我開始從事企業(yè)級信息系統(tǒng)的開發(fā),在應用軟件的構建方面積累了一定的經(jīng)驗。這段經(jīng)歷又使我有機會從領域的角度來認識軟件。

為了論證上面提到的關于創(chuàng)造的觀點,我想結(jié)合自己的經(jīng)歷,談談對單片機、編程語言和企業(yè)信息系統(tǒng)的認識。這些認識看上去非常基礎,涉及的內(nèi)容聽上去有點枯燥,但它們卻是想象的基礎。

我有一個有趣的想法:如果人們愿意定心斂神,細細體會熟視無睹的事物,一定可以得到超出想象的收獲。

在談單片機之前,必須先提到兩個基本的概念:二進制和與或非邏輯。

二進制是計算技術中廣泛采用的一種數(shù)制。這種數(shù)制,只包含0和1兩個數(shù),基數(shù)是2,進位時逢二進一,借位時借一當二。

與或非邏輯是布爾代數(shù)中的基本運算邏輯。在布爾代數(shù)中,同樣只有兩個邏輯值,邏輯1和邏輯0,代表兩種相反的邏輯狀態(tài)。邏輯“與”相當于生活中說的“并且”,在兩個條件都同時成立的情況下,邏輯“與”的運算結(jié)果是“真”;邏輯“或”相當于生活中說的“或者”,只要兩個條件中有任意一個條件滿足,邏輯“或”的運算結(jié)果是“真”;邏輯“非”表示與本來的情況相反的情況。

與或非邏輯代表了人類的一種思維規(guī)律,同時與二進制吻合得天衣無縫。我們來看看二進制運算中的與或非邏輯。

二進制加法有四種情況

  • 0+0=0(邏輯或)
  • 0+1=1(邏輯或)
  • 1+0=1(邏輯或)
  • 1+1=0(進位為1)(邏輯或,然后是一次有趣的移位)

二進制乘法有四種情況

  • 0*0=0(邏輯與)
  • 0*1=0(邏輯與)
  • 1*0=0(邏輯與)
  • 1*1=1(邏輯與)

關于二進制和與或非邏輯的更多知識,大家可以查閱相關的參考書。

我想強調(diào)的是,二進制和與或非邏輯這兩個概念可以很容易地通過硬件來實現(xiàn)。例如,5V電位(通的狀態(tài))代表1,0V電位(斷的狀態(tài))代表0。邏輯“與”則涉及兩個輸入電位和一個輸出電位,當兩個輸入電位分別為5V和0V時,輸出電位為0V。場效應管CMOS或者雙極晶體管TTL這些具有開關特性的電子元件都可以實現(xiàn)這種邏輯要求。

簡單來說,電子計算機就是可以進行二進制計算的機器。它可以幫助人類節(jié)省邏輯思維的時間和精力,目前它能幫助人類的也僅此而已。

單片機中包含了大量具有開關特性的電子元件。作為一種微型計算機,它幾乎具有普通計算機的所有特征。大規(guī)模的集成電路給了二進制和與或非邏輯表演的平臺;CPU處理自己可以識別的指令,并幫助人類進行邏輯計算;IO系統(tǒng)處理各種數(shù)據(jù)和地址信息;晶振可以保證電子元件間的同步與協(xié)作;中斷系統(tǒng)則像一位計算任務的調(diào)度員。存儲器通常是一個必需的外部系統(tǒng),存儲的內(nèi)容包括指令(程序)和數(shù)據(jù)。地址總線和數(shù)據(jù)總線為CPU建立了與外部系統(tǒng)聯(lián)系的通道。

單片機的基本組成看上去并不復雜,我們來看看它的工作原理。

首先,單片機需要加電。電子元件的各種特性要依賴于特定的電壓和電流。單片機加電后,電子元件有電流通過,晶振開始工作。于是所有的元件有了時間規(guī)則,有了合作完成一項任務的基礎。中斷系統(tǒng)處在待命狀態(tài),等待任何一項任務的觸發(fā)條件。CPU借助于地址總線和數(shù)據(jù)總線,從存有指令的存儲器中獲取指令(程序),這些指令全部是二進制的。它們不是任意的,而是CPU指定的二進制格式。指令(程序)中可能涉及一些位于特定存儲地址中的數(shù)據(jù),CPU還要負責從那些地址中取數(shù)。CPU按照指令的要求進行計算(利用電子元件的開關特性),計算的結(jié)果可能會存放到指定的存儲地址中;也可能暫時存儲在和CPU關系更緊密的內(nèi)部空間(存取速度比外部空間更快),例如累加器或其他寄存器;計算結(jié)果(一系列的開關信號)更有可能通過數(shù)據(jù)總線輸出到指定的IO。IO是計算機連接現(xiàn)實世界的橋梁。

我曾經(jīng)開發(fā)過鐵路道岔預警系統(tǒng),那些指定的IO被連接到一些微型開關。這些微型開關控制著一些LED光帶,從而可以展示整個道岔系統(tǒng)的狀態(tài)。

談到這里,我們終于可以引出軟件的概念。什么是軟件?本質(zhì)上就是那些特定于CPU的二進制指令的集合。在我所使用的單片機中,二進制指令是8位的。根據(jù)CPU的不同,指令也可能是16位、32位或64位。這些指令,從操作人員的角度看,就是一些語言;從機器的角度看,就是一組開關信號。老實說,當你用示波器去看那些指令、地址或數(shù)據(jù)時,一定會在軟硬件的交界點上感慨萬千。

好,我們談到了語言。當這些語言經(jīng)過組織、編排,從而讓機器自動化工作時,我們又有了程序的概念。

15年前,我使用匯編語言來編寫單片機程序。匯編語言與機器語言(完全由0和1組成,可以把機器語言看成是特定于CPU的開關信號)是完全對應的。兩者之間的些微區(qū)別在于,匯編語言提供了一些人類可以理解的助記符,例如,數(shù)據(jù)傳送符、跳轉(zhuǎn)符、條件符、中斷符等。關于匯編語言的細節(jié),可以參考相關的書籍。

在使用匯編語言的時候,需要了解數(shù)據(jù)存儲的地址、數(shù)據(jù)傳送的目的地、二進制數(shù)運算的方法以及各種寄存器的特殊用法。

在匯編語言中,數(shù)據(jù)結(jié)構的概念是很淡的,更不要說圍繞數(shù)據(jù)結(jié)構展開的算法了。數(shù)據(jù)結(jié)構和算法的繁榮發(fā)生在比匯編語言高一級的編程語言中,例如C語言。

出現(xiàn)一種更高級的語言是人類抽象的需要。抽象,是因為發(fā)現(xiàn)了邏輯推理中的規(guī)律。這些規(guī)律具有可以重復使用的特征,但是,規(guī)律本身重現(xiàn)起來比較復雜。

例如,用匯編語言來實現(xiàn)一個四則運算就有點復雜。在匯編語言中,既沒有足夠豐富的對人友好的操作符,而且在處理數(shù)學計算時會涉及不少硬件概念。你看,因為CPU的不同(機器語言不同)、硬件調(diào)度上下文(使用不同的寄存器)的差異,四則運算的實現(xiàn)也不會完全一樣。而C語言(也包括很多其他的高一級語言,BASIC、Fortran)的出現(xiàn),滿足了人類在進行數(shù)學計算過程中的抽象要求。

為了實現(xiàn)數(shù)學計算的抽象,這些高級語言的背后,還有很多相關的技術在支撐著,例如,C語言編譯器、鏈接器、運行庫、操作系統(tǒng)加載器等。C語言編寫的程序和其他語言編寫的程序,在運用計算機這個硬件資源上沒有什么區(qū)別;那些隱藏在幕后的技術,使我們可以僅僅關注于抽象的程序,而幾乎不考慮硬件的問題。

C語言在一定程度上解決了人類在數(shù)學計算和邏輯推理上的抽象。從此,軟件的主要關注點轉(zhuǎn)移到數(shù)據(jù)結(jié)構(線性表、棧、隊列、串、數(shù)組、二叉樹、圖等)和各種算法(對特定問題的求解過程)上,經(jīng)過多年的發(fā)展,數(shù)據(jù)結(jié)構和算法已經(jīng)成了計算機專業(yè)的一門基礎課程,而幾乎所有的教科書,都是用規(guī)范的數(shù)學語言來描述數(shù)據(jù)結(jié)構的。

算法就是數(shù)學問題的求解過程。在使用C語言來實現(xiàn)一個軟件系統(tǒng)時,邏輯思維占了絕對的比重。

10年前,我又開始從事企業(yè)級信息系統(tǒng)的開發(fā)。工作中接觸最多的是Java語言。從語言的抽象程度來說,Java語言與C語言沒有太大的區(qū)別。Java語言同樣可以解決C語言能處理的一切問題(可以描述相同的數(shù)據(jù)結(jié)構,并給出相同的算法)。一個微妙的不同之處在于,Java語言對于數(shù)據(jù)結(jié)構中的數(shù)據(jù)類型進行了新的抽象,引入了類和對象的概念。因為這個概念的引入,一次新的面向?qū)ο蟮母锩a(chǎn)生了。

當代的企業(yè)級信息系統(tǒng)與Java語言結(jié)合得非常完美,這不是偶然的。我們知道,企業(yè)級信息系統(tǒng)需要解決的是領域問題,而不單單是數(shù)學運算問題。

領域問題最終會轉(zhuǎn)化為一個個數(shù)學運算,但是在求解領域問題的過程中,僅僅依靠數(shù)學知識是遠遠不夠的。

例如,保險公司的承保業(yè)務,不僅需要大量的信息數(shù)據(jù),還需要復雜的業(yè)務邏輯。要描述這些業(yè)務邏輯,必須站在領域的高度上進行。此外,復雜多變的用戶需求、數(shù)不勝數(shù)的方案模型、參差不齊的開發(fā)團隊、成年累月的項目周期,這些各方面的因素都會對信息系統(tǒng)的開發(fā)產(chǎn)生影響。

處理領域問題就像戰(zhàn)場上的一個個戰(zhàn)役,指揮官決策(問題求解)時,可以參考和依據(jù)的現(xiàn)象太復雜了,他必須借助面形的思維(經(jīng)驗、習慣以及形象思維)才能指揮隊伍朝正確的方向前進。

Java語言恰好是進行面形思維的一個好工具。

為什么這么說呢?因為Java語言引入了類和對象的概念。這使得這種語言的使用者從單純的邏輯思維中跳了出來。人們開始發(fā)現(xiàn),編程語言與領域世界是如此貼近,以至于人類的想象幾乎可以完整地從軟件系統(tǒng)中再現(xiàn)出來,換句話說,人們可以使用Java語言進行隱喻式編程了。關于隱喻式編程的詳細內(nèi)容,我會在第4章的某一節(jié)展開討論。

Java語言培養(yǎng)了我在軟件開發(fā)中的想象能力,這是其他任何一種編程語言都沒有給過我的。

多年前,我曾經(jīng)閱讀了Tomcat(一個開源的servlet引擎,用Java語言實現(xiàn),它也提供Web服務)的源碼。我看到一個HTTP的請求被Tomcat監(jiān)聽到以后,它根據(jù)請求數(shù)據(jù)中攜帶的特征,開啟了不同的閥門。開啟的閥門引導數(shù)據(jù)流進入相應的管道。管道中有各種解釋器對數(shù)據(jù)進行分析。分析后再轉(zhuǎn)發(fā)給相應的處理器。簡直不可思議,我就像閱讀一個故事,第一次從軟件中體驗到了一個想象的世界!

這次閱讀使我開始反思自己的軟件開發(fā)生涯。反思的結(jié)果是:

  • 多年來一直在編寫程序,而且翻閱了不少軟件產(chǎn)品或技術的操作手冊;
  • 已經(jīng)比較善于理解各種需求了,而且可以直接地給予實現(xiàn);
  • 可以從軟件的運行中得到樂趣了,可是還沒有開始關注軟件本身;
  • 學到了一些知識,但是這些知識總顯得雜亂零散;
  • 我的軟件開發(fā)工作幾乎沒有任何創(chuàng)造性。

反思中的最后一條使我很震驚,我也因此領悟了一些道理。總結(jié)起來只有一句話:軟件的美和價值在于創(chuàng)造,創(chuàng)造的根源在于想象。

此后,我按照自己領悟的道理來評價我所接觸到的一切事物。我不再覺得迷惘、猶豫,一切仿佛都變得簡單了。我開始追求一個富有創(chuàng)造力的想象世界。

當然,想象世界并不依附于編程語言而存在,但是,一種合適的編程語言可以使我們更容易地表達想象。基于這個原因,我認為Java語言是C語言的一個發(fā)展。當然,如果你有一個足夠抽象的庫,如果你不考慮內(nèi)存分配和釋放,如果你不使用寄存器,如果你不使用地址概念和指針,C語言也能和Java一樣,讓人馳騁在一個更高級抽象的想象世界。

我開始覺得有趣了。編程語言的發(fā)展,擴展了我們想象的空間,也幫助我們養(yǎng)成了一些想象的習慣。你看,我們可以把Web服務想象成一個政府的辦公流程,甚至可以是一次朋友的聚會。這些想象可以用來創(chuàng)造軟件,而且為軟件帶來了異乎尋常的活力。換句話說,我們的人生閱歷,可以用來幫助自己進行想象和創(chuàng)造,并把它們用軟件的形式表達出來,這不是很有趣的一件事嗎?

不過,在軟件開發(fā)中,想象和創(chuàng)造是需要一定技能的。這不僅體現(xiàn)在編程上,還體現(xiàn)在軟件開發(fā)中的方方面面,包括思考方法、項目管理、架構設計,等等。本書中有一些想象和創(chuàng)造的例子。

能夠充分展開想象,是創(chuàng)造能力的集中體現(xiàn)。

事實上,在我所經(jīng)歷的一些糟糕的軟件開發(fā)案例中,最大的問題,往往源于缺乏想象或想法混亂造成的軟件架構問題,以及毫無想象力的、僵化的項目管理思想。只有較小的一些問題,來自具體的工作細節(jié),例如,糟糕的算法和糟糕的邏輯思維。這也從另一個角度證明了想象和創(chuàng)造的價值。

主站蜘蛛池模板: 资溪县| 菏泽市| 苍梧县| 承德县| 大邑县| 葵青区| 舟山市| 济源市| 延庆县| 新余市| 商南县| 正镶白旗| 武城县| 阳原县| 胶南市| 乌海市| 彭泽县| 潢川县| 蒙山县| 芜湖县| 固阳县| 秀山| 吉木萨尔县| 红原县| 福泉市| 凤冈县| 罗山县| 天祝| 北流市| 塔城市| 石嘴山市| 云龙县| 洪洞县| 丹巴县| 叙永县| 枝江市| 乐业县| 翁源县| 宜君县| 措美县| 开江县|