想想入行已經1年有餘,天天出了拿需求寫程式碼,完成一個個功能外,自己對整個軟體的開發如何誕生,如何設計卻瞭解的很有限。這些天一直在思考著一款軟體在讓我編碼之前都做了什麼?一款軟體到我這樣的程式設計師開始功能程式碼的編寫之前都是由誰完成的?都是怎麼設計的?都是怎麼規劃的?

        我覺得是時候思考這個問題了,我不是什麼牛人,相反我和大多數人一樣是一個大學啥都沒有學過的超級菜鳥,只是頂個計算機系畢業的頭銜混混沌沌的加入了程式設計師的行列。如果一直這麼編寫功能下去,我想以後再也走不出程式碼民工的範疇,其實這也沒有什麼,關鍵是思想上已經不可能再有什麼進展了,無疑是人生的悲哀。思想被禁錮在一個狹小的範圍內,永遠不能指點江山。我追求思想上的開放和整體的感知,我覺得這是每個熱愛生活的人都該具備的基本素質,具體到軟體開發,我覺得每個人都應該把軟體架構師等頂級職位當成自己的量化目標。因為當你實現這個目標的時候,意味著你的思想高度也已經達到了思考生活,享受生活的地步了。

        講了一些自己的想法,說說我最近的感觸吧。(設計主線和程式碼主線)

        一款軟體從需求調研,到概要設計,再到詳細設計,再到可以形成文件,緊接著程式設計,測試,釋出。以前在軟體工程上學到這些條條框框都扔給了老師。現在重新找回來,發現其實樹上說的和現實中的差別並不大。我們很多時候的軟體都是這樣設計出來的。我就以這個作為一個設計主線說說吧。

        需求調研: 說白了,這個就是向軟體的使用者羅列一些處理功能需求。其實這個就是問和答的問題。有的時候我們想到我們的軟體需要什麼功能,然後寫出來,參考別人的類似軟體放到自己這裡來。這個階段決定了你的軟體具備什麼樣的功能和軟體的特色和定位。一款軟體有個清晰的定位很重要。(PS:軟體不該是萬能的,功能的明確才會讓你的軟體有特色)。

 概要設計:這就是整合使用者的需求,列出一個列表來。把整個軟體具有的功能劃分一個個功能區域和模組。(PS:這裡不是程式邏輯模組, 僅僅是功能模組)。這個完成了,基本軟體90%的功能就確定了下來。一個概要設計主要完成的其實就是讓你明確加深對軟體功能的熟悉,更加明確軟體的方向。讓你接下來的詳細設計變的更符合邏輯更通用。(PS:這個概要設計在一些公司應該被什麼策劃部門列為最詳盡的文件吧,其實我想對開發者來說這就是一份功能性文件)。

詳細設計:在我的想法裡,這個詳細設計是應該由一個專案組的專案經理來主導完成,整個專案成員參與進來的過程。這裡是整個軟體開發的關鍵所在。因為這裡要完成整個軟體的功能的細分,功能模組和邏輯模組的結合。(PS:我所說的邏輯模組是相對於程式碼來說,由各個邏輯模組聯合完成某個功能模組的需求,也可以是一個邏輯模組對應了一個功能模組,如果非要劃分,我想把它劃分為:一對多的關係。一個功能模組對應了一個或者多個邏輯模組)。在詳細設計裡我覺得要做到以下幾點:

      1、使用者的角度來看:結合一項功能如何展現給使用者,使用者如何操作,將這些場景一個個和概要設計裡的功能對應起來。說到程式碼裡這就對應一個函式塊或者一個模組的功能

      2、分析概要設計裡的關鍵元素,我記得有術語,不過我忘了。我就叫他關鍵的物件吧。然後抽象出物件的屬性。設計出基本的資料結構。(PS:說到程式碼裡我覺得enum, 

             struct,class, define, const等主要的你能夠感知到的物件(再次PS:什麼是你能感知到的,說白了就是你能很快想到的,玄吧,比如說人這個物件:身高,年齡等這個就是

            可感知,比如,一個通知類,這種就是非可感知,因為這個是你虛構的)在這個時間確定的)

     3、基本的元素有了,元素要完成的功能有了,這個時候就可以設計整個功能的活動圖了,用功能為一條精神指引,用元素作為支撐點,一步步的搭建起來一個活動圖。(PS:

           這個是我覺得畫活動圖的最高境界),兩個元素,或者功能無法直接產生聯絡的時候,那就開始發揮你的想象吧,這就像一條公路的修建,遇水架橋,遇山開山。(PS: 程式

           中的一些“現實中不存在的物件類”我個人覺得就是這麼產生的)

 4、當你能夠把整個軟體的功能以這樣一種形式跑通的時候,我覺得整個軟體的邏輯模組基本上就定型了,接下來的類圖,資料流圖,介面的設計應該在前面都思考過,這個

            時候只是整理出來而已了。把這些東西搞好,這個軟體的骨架應該就算完成。

     5、以上基本上還沒有牽扯到程式碼,下面的就是我所說的程式碼主線的主要部分。這個時候,專案經理開始用編譯器或者什麼神器之類的工具搭建軟體的基礎框架。不需要寫什

           麼詳細的類啥的,只是把工程的型別,編譯選項,要使用的庫,以及主要使用的技術等糅合起來,讓一個軟體的程式碼基礎都顯示出來(PS:我不想說這類似人體的骨架,我

           想把他比喻成人體的表皮他們是把骨架和血肉組合起來變成了一個活人,你說呢,不要踹我)

    6、我想到了這個階段就是我現在從事的程式碼編寫階段了,大家各司其職。專案經理應該在小組成員開始之前把基本的資料結構等相關程式碼編寫完畢,每個人需要通用的程式碼

          編寫完畢。緊接著我想就是想我這樣的程式設計師開始登場了。寫,寫,寫...

    7、基本就是測試,修改BUG了,就不詳述..

綜上:其實我把一個軟體的需求分析,概要設計,詳細設計的前1和2兩點劃分為軟體中的純設計主線,詳細設計的3,4有設計的影子也有程式碼的影子,屬於設計和程式碼的結合部分,而詳細設計第四點以後的部分就被我劃分為程式碼主線的部分了,這時候程式碼是整個軟體專案的主導。前面設計是主導。

       其實我只是說了一個軟體設計的大概流程,只是最近的一些感想。具體的實施在這個過程中有很多需要細化的地方。

       有的時候我們在看書,看很多關於軟體設計的書,但卻忘了停下來思考,停下來結合實際反思。書有的時候僅僅是給了我們一種思考的方式,或者說給了我們一種擴充套件視野的方式。尤其是軟體工程和軟體設計類的書,大都泛泛而談。所以結合實際形成一套自己設計軟體的方式才是最重要的,工作1年有餘,我感受到自己這方面必須要加強了,程式碼的功底時間長了機器人都能熟悉,只有思想需要時刻的磨練著。

.