研究生參與項目經驗談

作爲計算機專業的研究生,參加實際項目無論對於我們將來找工作,還是從事科學研究,都有着非常重要的意義。這個過程不僅可以提高我們的軟件開發能力,同時也是對我們多年所學專業知識和能力的有效檢驗,讓我們這些涉世未深、經驗尚淺、知識結構不夠清晰、但同時有些自負或迷茫的研究生們對自己的知識水平和技術有一個更加清楚和認識。下面是本人在一次不成功的項目開發後的一點點心得:

一、項目與用戶需求脫節,或需求分析不充分,對需求變化的適應能力差。對於成功的軟件開發而言,技術本身並不是最重要的,而是對用戶需求的理解程度。大多數時候,用戶需求無法在需求階段就能完全搞清楚,而且用戶也弄不清楚他們到底需要什麼,即使一開始確定了用戶需求,但到後來,比如維護階段,用戶的需求也可能發生變化。可以這麼說,需求的變化本身也是一種需求,這可能是隱藏在軟件開發中最具挑戰性的需求,這要求我們對軟件進行更具彈性的設計,使之儘可能地適應或最大限度地適應要求的變化,從而使後期修改及維護的成本更低(對於公司而言,高成本意味着更多資金的投入;對於我們從事軟件開發的工作者而言,則是時間和精力的過多消耗,甚至在項目期限壓力下心理力的更多支出,比如,排除錯誤或修改功能時的那種焦頭爛額的狀態)。也就是說,我們要能構造出可進化的,平滑地適應需求變化的系統,使得當用戶提出新的需求時,少修改或不修改原來的代碼,而僅僅是新功能的添加。這是我們的理想,也是我們努力的目標。由於我們一直以來太過專注於技術細節和功能的實現,以至於這方面的能力太差了。

二、編程陷阱多,動手須謹慎。每寫一行代碼,特別是編碼和設計同時進行的情況(我們大多使用這種編程方法),我們都要想到,新增的代碼既可以完成某個功能或解決某個問題,也可能帶來BUG。雖然BUG在所難免,但要儘量減少它。單元測試在項目開發過程中不能忽視,並儘可能使用斷言,這樣會大大減少代碼中隱藏的BUG。不要以爲這樣會浪費時間,會影響項目的按期交付,這些看起來附加的步驟所花費的時間比起將來在測試階段排除錯誤所花費的時間,簡直不值一提。而且從長遠角度而言,這會使項目的開發效率越來越高,軟件的質量也越來越好。當然最重要的,我們的開發水平也會有很大的提高,因爲一旦這些優秀的實踐形成習慣,它就會對我們軟件開發的方方面面產生積極的影響。

三、要有一種無私的軟件開發精神。不要認爲我只要正確地實現了某個功能就算OK,一定要在編程過程中,哪怕是自己的小練習,都要想着自己寫的這段代碼是要給他人閱讀的。如果代碼可讀性太差,別人就無法從中獲取你的設計思想,也就無法通過代碼進行有效的交流,當然也就無法對你的代碼做出任何的修改或改進,而且其中隱含的錯誤也就難以被他人發現,最終這段代碼會被當作垃圾扔掉。採用無私式的軟件開發原則,有利於我們寫出清晰、條理、可複用、易維護、易修改、組織良好的代碼,從而提高我們的軟件開發水平。

四、不要抱有“把一切BUG都留給測試階級去發現和處理吧”的想法。這是典型的“短視”作法。在測試階段發現問題時,因爲開發者對自己所寫代碼的印象已經不像編碼時那樣清晰,所以也就不容易對錯誤進行定位並修改之。因此,儘量在開發階段採用單元測試的方式去發現和修改錯誤。雖然這不能發現所有BUG,但會大大減少BUG的數量,從而大大減少測試階段排除BUG所花費的時間,保證整個項目的進度。

五、只有做了非常充分的設計和嚴格的編碼規範,以至於編碼是一個機械的“組裝”過程,才能用“卡時間”的方式來提高編碼效率。其實,這已經不算做程序設計(編程)過程了,而是“輸入”程序了。因爲創造性的工作已經在詳細設計階段完成,所謂的編程階段只是一個“組裝”過程。在軟件過程管理中個人軟件過程強調編程速度,這是有前提的,前提便是充分的前期準備(充分的需求分析、詳細而全面的設計)。對於我們這種很少做前期設計工作,即基本上是在編碼的同時進行設計(類似極限編程)的開發方式而言,就不能用“卡時間”的方式來追求編程的速度。特別對於複雜的功能模塊,更不能急於求成,一旦匆忙完成任務,將來所付出的代價將比這個時候多花些時間思考如何進行更好的設計大得多。“卡時間”的方式只能用於提高那些簡單的重複性的、機械的任務的效率,但如果要進行設計或需要創新,這種“卡時間”的方式往往會導致拙劣的設計。

六、簡單就是最好。儘量使用最簡單的方式去組織程序,不要使各模塊之間的交互關聯過於複雜。同樣的問題,往往有很多種解決方案,一般腦中最先閃出的解決方案並不是最有效或最簡單的。動手之前,要多加思考,再三權衡,選擇針對當前問題最簡單最有效的解決方案,不要急於實現。要做到這一點,首先要對待解決的問題做出深入理解,在對問題深入理解後,好的解決辦法往往就在腦中呈現出來了。

七、廣泛閱讀,善於創新。多看大師們寫得書,從中學習優秀的軟件設計思想。那樣雖然不會立即給你帶來具體的技術或解決問題的方案,但會告訴你什麼樣的設計纔是最優秀的、如何思考和設計才能更簡單更有效地解決問題。軟件開發是一個充滿創新的過程,這也是好多熱愛創造的人選擇它作爲專業的原因。因爲這種創新不需要太大的成本和過多的客觀條件,只要有一臺電腦作爲工具和某種相關的技術(比如掌握某種編程語言)作爲手段,就能將自己的創新變爲現實。沒有創新,技術水平再高,也只是一個熟練工,永遠都是在做別人已經做過的事情,永遠都是“代碼民工”。在技術發展一日千里的今天,遲早會被淘汰。因爲軟件開發中的創新完全體現在設計之中,所以要培養創新能力,就要在整個軟件開發過程中有意識地進行設計,勤于思考,學習和採用各種先進的設計思想並不斷創新。只有這樣,才能讓自己在軟件開發的職業生涯中立於不敗之地。

八、爲用戶着想的同時,多爲我們自己着想。完成用戶所要求的功能,即實現用戶需求,是爲用戶着想。也就是利用我們的技術爲用戶提供某種可簡化其工作的服務。而良好地組織我們的程序、增加模塊的可複用度、降低模塊之間的耦合性,使之維護和修改更加簡單,則是爲我們自己着想,爲自己負責(現在沒有哪個軟件就一旦交工,就不用管了,完事了),使我們的軟件開發工作不至於太累乃至壓力太大,因爲平時如果我們注重設計,注重代碼的模塊性和可複用性,這些可複用的部分就可以用在類似功能的項目中,從而降低我們開發者的勞動強度。總的來說,代碼的可讀性、模塊性,以及模塊之間的低耦合度可以降低維護負擔,對開發者有利;由於良好的設計對需求的變化響應快,用戶的新需求能很快就能得到滿足,對用戶也有利。可以這麼說,學習技術是爲了解決用戶的的問題,簡化其工作;學習優秀的設計思想則是爲了簡化我們開發者的工作,同時也會增加我們的服務質量,使開發出的軟件更加可靠,對用戶需求變化的適應力更強。

九、不要在疲憊和高壓狀態下編程或修改代碼,那樣帶來的BUG往往比解決的還要多。

十、關於學習對於我們計算機專業的研究生而言,學習還是主要任務。開發項目是爲了培養實際動手能力,加深對所學知識的理解,最終目的也是爲了學習。因此,在開發過程中,一定不要忘記學習這一目標。在每天的項目開發中,重要的不是我們解決了什麼樣的問題或實現了什麼樣的功能,而是從中我們收穫到了什麼。這就是說,在項目開發過程中,我們要儘可能採用好的開發思想和技術。雖然強調這些看起來會增加項目的開發時間,但對於我們學習優秀的設計思想、增加創造力、培養優良編程習慣有着極大的益處,而且會逐漸縮短我們日後開發軟件的時間。可見,不是參加項目就一定會提高我們的開發能力,而是我們在開發項目的過程中,是否採用了優秀的、已經被實踐證明是有效的開發思想和方法。如果要做一名優秀的開發人員,我們就不能太過功利化,收穫好的經驗比收穫金錢更加重要。對於沒有實際項目可做的同學,爲了提高自己的開發能力,跟據自己的喜好,不妨自己把自己當作客戶,自己給自己提需求,儘量採用優秀的,先進的設計思想和方法,去給自己開發一個具有挑戰性的軟件。不同類型的項目,學習的測重點也會有所不同。對於技術性要求很強的項目,掌握其中涉及的關鍵技術是主要的學習目標,從而通過該項目的開發實踐提高我們對技術的理解水平和應用能力。但有一點,當技術問題解決了之後,要想一想有沒有更好的設計,能不能在不改變軟件外在行爲的情況下,改善其設計。比如,某些功能模塊能不能提取出來,作爲可複用的庫;某些代碼能不能重構,使其更加容易閱讀和修改;軟件各模塊的組織方式能不能重新設計,使各模塊間的耦合性更低以及模塊的職責劃分是否更加明確(即低耦合,高內聚)等等(使用Java,C++,.Net等面嚮對象語言的開發人員,不妨讀一讀《重構:改善既有代碼的設計》這本書,使用C等面向過程語言的開發人員,不妨讀一讀《程序設計實踐》這本書)。對於技術性要求不高的項目,軟件工程的思想和方法就成了我們學習的主要目標和內容。

十一、設計要素:簡單、三思學習優秀的設計思想和方法,一方面是讓我們知道什麼樣的設計可以更加有效地解決我們當前遇到的問題,使我們的工作更加輕鬆;另一方面是通過對這些優秀的設計思想和方法的學習,刺激我們的思維,培養我們創造性地解決問題的能力,即創新能力。因此,我們不能爲了設計而設計,不要在實際工作中生硬地套用某種設計方法。這種機械的設計,往往會導致過分設計或設計過於複雜、不合理、增加實現難度。這就要求我們在設計及編碼過程中多思考、多商量、多交流,要具體問題具體分析,根據具體情況採取合適的設計方法,要做到簡單優雅,通俗易懂。這還是應了我前面說過的一句話:不要機械地設計,不要機械地編程。也就是要多動腦,我發現好多同學做項目時,遇到一個問題,不管三七二十一,直接編程去實現之,理由是,學習計算機要多實踐,多編程。誠然,學習計算機是要多動手,多實踐,但要明白,動手和實踐只是爲了實現我們的設計或驗證我們的設計是否正確,如果不進行充分的思考、設計,要麼難以實現,要麼實現的代碼僅僅能運行,勉強實現某個功能而已。

十二、學習設計模式的好處 1.當今幾乎所有使用面向對象的編程語言編寫的框架(如 .net、j2ee等)和類庫(如STL、MFC、JDK等)都應用了的設計模式。因此學習設計模式可以使我們更好地、更加熟練地使用這些框架和類庫,並從根本上降低學習這些框架和類庫的難度。 2.爲我們的程序設計質量的提高提供了目標和參考,從而提高我們的程序設計水平。 3.使得我們有可能自己開發可複用的框加和類庫。 4.剌激我們的思維和思考問題的方式,提高我們的創新能力。總之,要以用戶需要爲中心,儘可能地採用先進的技術和優秀的設計思想,以簡單、實用、“省事”爲原則,多思考、多學習、多交流、廣泛閱讀、開闊思路,不斷提高我們的編程水平和設計能力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章