如果非讓我來回憶大學軟體工程課的相關內容,我只能拜託大哥大姐您們別為難我了好嗎,我對本課程的唯一印象就是這門課是開卷考試的。那麼作為一個計算機專業、並且作為當時班級裡為數不多會編寫一些程式的學生,我對這門課程為何如此的無感呢?
首先,大學一系列枯燥的理論課功不可沒,我們在學習很多的理論知識,可是卻不瞭解這些知識的應用場景或者說是無法深刻體會其應用場景。計算機可以說是一門實踐出真知的學問,你可以把一些經典的理論當作是真知,但因為缺少實踐,很多同學對這些真知視而不見,甚至厭惡而刻意遠離,對學校為何如此安排課程感到困惑、憤憤不平、嗤之以鼻。在我們還沒有寫出過幾個像樣的程式的時候,對軟體的理解還非常膚淺的時候,真不知道為什麼要去學習軟體工程。
其次,並不是所有學生都是這樣的,怪就怪自己沒有足夠的領悟力,缺乏高人指點和引導,不知道大學裡學的那些知識如何被真正運用到之後的工作中,因此對學校裡學習的內容重視不夠,對於像我這樣沒有以保研為標的的部分學生來說,及格萬歲。因此,很多人在最有時間精力、最應該努力打好理論基礎的年華,把熱血奉獻給了遊戲或一些虛幻的東西。如果本文的讀者有學生的話,我真心建議你在學生時代好好學習理論基礎,總有一天你會用得上的。
因為以上的原因,軟體工程這門課程只給我留下了開卷考試這麼一個印象。後來隨著工作經歷的增多和視野的開闊,我很快就意識到這個問題,也曾花很多時間去補學校裡學的更多理論知識,但因為工作的繁忙,總是難以靜下心來學習。關於軟體工程,大概十年前還剛畢業不久的時候,我看了林銳的《軟體工程思想》和周愛民的《大道至簡—軟體工程實踐者的思想》,看的時候覺得挺爽,過後又什麼都忘了。後來經過反思,我認為自己當時還稱不上一個合格的讀者。為什麼呢?因為實踐還是不夠多,我可能還處在熟悉框架、基本工具使用的階段,在專案中只負責某一個模組的開發,沒有形成全域性視野等等,都導致我無法理解軟體工程知識在專案中的作用。而隨著閱歷的增長,自己也成為了一些公司的技術負責人,對專案的成敗擔負更大的責任時,才漸漸覺得需要一些流程和方法論,才能更好地將專案推向成功。當然,我也知道一些大神級的人物,比如大學時代就獨立開發出遊戲引擎“風魂”而名聲在外的雲風,聲稱自己對軟體工程沒有興趣。我想或許一些工程相關的東西早就固化在他們那類人的腦子裡了,他不用再去學什麼軟體工程照樣可以把大專案做成,但不應該讓大多數人去效仿。
林銳的《軟體工程思想》雖然是二十年前的作品了,但今天閱讀還是能有所啟發。在書中他把軟體工程包含的主要環節畫在一個圖上,如下:
那麼軟體工程模型就是要將圖上的各個環節串聯起來,然後以一定的規範去執行,成為一條生產線。關於生產流水線,我在拙作《漫談中小企業研發技術棧》中也有提及,一般來說,閉環的生產線是高效率產出的必要條件。具體的比如線性模型、漸增式模型、快速原型模型等等,可以去參考具體的軟體工程教程。
在《大道至簡—軟體工程實踐者的思想》中,周愛民說道:
在我如今看來,語言其實是開發的細微未節,而在大學時代、在課桌上令人昏昏欲睡的《軟體工程》才是軟體開發中的髓質與靈魂。十年的軟體開發實踐中,其實在很多時間裡我都落入了細節陷阱。
“實現”的慾望是從程式員出身的管理者的通病。因此如果你仍然在思考選擇什麼語言、如何重構,以及在開發部裡爭論一段程式碼有沒有或應不應該採用某種樣式,那麼請你暫時沉寂下來,聽我說:那是細節。
—《大道至簡-軟體工程實踐者的思想》
這樣的觀點,簡直不能同意更多了。我何嘗不是在相當長的時間裡,陷入了實現的細節而不自知,對自己熟悉的東西習以為常覺得沒價值,對別人做的自己暫時不瞭解的東西,即使再簡單,也總以為高深莫測,從而作繭自縛缺乏自信。
從對軟體工程的嗤之以鼻到視若法寶,是一個人對客觀事物認知不斷變化的一個過程。人的一生中會有許許多多這樣的過程在並行著,比如我們很多年前堅信的東西,隨著閱歷的增加已經變得不那麼堅信了,這是因為我們對自己、對事物等等的看法發生了變化,大家常說的三觀發生了變化。那這樣是不是意味著過去的自己對很多東西的認知是錯誤的呢?其實我覺得有時候也不能分對錯,可能是有偏頗,那麼我們能做的,就是無論處於哪個階段,都應該汲取更多的知識,進行更多的實踐,使自己對這個世界的認知儘量地接近真相,這樣有助於在每個十字路口都能做出相對正確的選擇。
此文是對我自己經歷的總結剖析,如果還能給剛上船的年輕朋友們一點點啟發,那將倍感榮幸!