再談對軟件工程的認知與理解
一、對軟件工程的理解(我們學到了什么)
網上的定義為:按照工程學的管理方式,有組織、有計划的,在一定的質量基礎、時間限度和成本范圍內,實現功能明確的軟件系統。通過本次學習,我們也對軟件工程有了大致的概念,那什么是軟件工程呢。個人的理解為,設計軟件並不難,難在工程,如何用最小的規模、最低的成本、最短時間滿足甲方的需求和使利益最大化。工程顧名思義,不僅需要技術,還需要對整個流程的熟悉與了解,從了解需求、到畫原型圖、建數據庫、寫代碼、改bug,最后測試、交付等等,真真實實的了解完、並且親身經歷了一遍,我們對軟件工程針對有了一個立體和形象的認識。同時也讓我們理解了項目前期規划的重要性,團隊重要性,每個人個人能力的重要性。
細點來說,軟件開發是一個把用戶需要轉化為軟件需求,把軟件需求轉化為軟件設計,用軟件代碼來實現軟件設計,對軟件代碼進行測試,並簽署確認它可以投入運行使用的過程。在這個過程中的每一階段,都包含有相應的文檔編制工作。軟件開發過程當中,遵循一定的流程,主要包括系統分析、系統設計、系統編碼、系統測試以及系統的維護等幾個階段。系統分析包括軟件需求分析和系統可行性分析。軟件需求分析就是回答做什么的問題。它是一個對用戶的需求進行去粗取精、去偽存真、正確理解,然后把它用軟件工程開發語言(形式功能規約,即需求規格說明書)表達出來的過程。系統可行性分析就是通過需求調查來確定此系統是否具有可行性。系統設計可以分為概要設計和詳細設計兩個階段。實際上軟件設計的主要任務就是將軟件分解成模塊。概要設計就是結構設計,其主要目標就是給出軟件的模塊結構,用軟件結構圖表示。詳細設計的首要任務就是設計模塊的程序流程、算法和數據結構,次要任務就是設計數據庫,常用方法還是結構化程序設計方法。系統編碼是指把軟件設計轉換成計算機可以接受的程序,即寫成以某一程序設計語言表示的"源程序清單"。系統測試的目的不是驗證軟件的正確性,而是以較小的代價發現盡可能多的錯誤。測試從需求階段開始,此后與整個開發過程並行,換句話說,伴隨着開發過程的每一個階段,都有一個重要的測試活動,它是預期內按時交付高質量的軟件的保證。 系統維護是指在已完成對軟件的研制(分析、設計、編碼和測試)工作並交付使用以后,對軟件產品所進行的一些軟件工程的活動。即根據軟件運行的情況,對軟件進行適當修改,以適應新的要求,以及糾正運行中發現的錯誤。編寫軟件問題報告、軟件修改報告。在實際開發過程中,軟件開發並不是從第一步進行到最后一步,而是在任何階段,在進入下一階段前一般都有一步或幾步的回溯。在測試過程中的問題可能要求修改設計,用戶可能會提出一些需要來修改需求說明書等。總的說來,軟件開發是一個環環相扣的設計和實施過程,整個系統開發的過程當中,系統分析和設計是重中之重。只有把握好系統分析,才能使后續改動盡可能多的減少;只有把握好系統設計,才能保證軟件的根基比較穩固。也即是它們很大程度上決定着軟件開發的周期以及壽命。
二、如何利用好技術與工具來開發項目
軟件開發工具提供了描述軟件狀況及其開發過程的概念模式,協助軟件開發人員認識軟件工作的環境與要求、合理地組織與管理軟件開的工作過程。傳統的結構化模型包括數據模型、功能模型與行為模型,相應的需要畫實體聯系圖、數據流圖、狀態轉化圖,畫這些圖需要用到Visual Paradigm、Axure,除了這些繪圖工具,原型工具之外,還用到了數據庫可視化工具SQLyog,開發工具IDEA等等,這些工具軟件的應用極大的幫助我們了解需求,對整個開發過程有更清晰的了解,使開發相對簡化。
我們也用到了很多技術,如ssh框架技術,它封裝了很多類方法等等,使我們編程變得更簡單,代碼更簡潔。前端我們采用的主要構件框架是EasyU(一組基於JQuery的UI插件集合體);中間件我們使用tomcat;持久化我們采用Mysql。同時采用Ajax,Json,xml,Servlet,mail.jar等技術。
當然很多技術也是第一次聽說,但也能感受到構成軟件的軟件實體的粒度不斷增大,軟件基本模型越來越符合人類的思維模式;軟件運行平台的能力不斷增強,越來越多地屏蔽掉計算機底層的復雜性;軟件支撐平台的能力不斷增強,越來越多地屏蔽了軟件開發過程的復雜性;軟件技術的應用范圍不斷擴大,越來越廣地滲透到人類生活的各個方面。
三、在做項目時,遇到的問題及解決方法
1、一些繪圖工具、原型工具不會使用。剛開始的時候不會用Visual Paradigm畫類圖,活動圖,之前沒用過這個工具,包括用Axure繪制快速原型圖。后來和隊友們一起商量,在網絡中找教程,逐漸摸索,找到了解決問題的方式。
2、做頁面的時候,很多web前端知識有些遺忘,頁面做的很丑,后來邊畫頁面,邊在網上尋找相應的知識點,對自己進行補充。
3、很多技術都沒聽過,ssh框架不熟練,搭環境的時候很費勁,整個環境也是隊友幫忙搭建的。
四、切身的體會、收獲和感悟(感觸最大、感觸最深的某幾個知識點的認知)
1.周威威:
首先,一個人在團隊中的穩定輸出相對於站在高度上去指導,更能有意義。能夠輸出很容易,但是想要穩定的輸出(這里對我所說的穩定輸出進行說明——高質量的代碼,充分體現出了面向對象設計的思想。)其次就是對於開發工具的使用,我們享受開發工具給我們帶來的便捷,但是我們絕對不能完全的依賴於開發工具,如果有一天開發工具消失了,那么我們能夠依靠的也就最原生的SDK,我們的雙手和大腦,所以我們應當自覺地提升脫離開發工具的編碼能力。最后,還是覺得對於知識的認識,太過於片面,還有很多深層次的東西觸及不到,每一個框架都是眾多大牛的思想結晶,我們除了使用,還應該去和大牛們思想碰撞。
2.程昕蕊:
軟件工程是一個從可行性研究、需求分析、概要設計、詳情設計、開發實現、測試、部署及維護這幾個方面來完成整個項目。對我來說,最深的親身體會就是真的從頭到尾的經歷了這些步驟,真正了解了項目是如何開發的,在這過程中我們會經歷許多坎坷,遇到從未接觸過的知識點和從沒有遇到過的bug,但這種挫折也鍛煉了我們解決問題的能力,在項目一開始的時候,我不知道如何在寫邏輯時,用debug來找到自己邏輯出問題的點,在寫前台頁面時,不知道如何用alert等語句查看自己的錯誤。但是后來,通過完成項目,我都可以熟練利用這些小技巧幫助自己更快的解決問題和發現問題。也明白了如何利用CSDN、知乎等知識庫進行技術的檢索,看別人的東西能讓自己借鑒多少,這些都是我的成長。同時,我發現前台頁面的json我了解的不多,導致寫程序時一開始很懵,所以我也要在以后的日子里,多鞏固基礎知識。
3.劉立博:
軟件工程作為一個脫胎於其他工程方法的學科,我們學習的就是前人的經驗,同時突出了我們注重實踐的特性。作為工程類學科,我們更關注“人”,將人作為工程主體考慮其中,這是我們的特點,也是優點。這種人文關懷,是我們的工程更復雜,有更多的不確定性,但得出的結論更精准。除了經驗主義和人文關懷,我認為我們還要注重差異性規划,要考慮不同規模,不同情景的項目采取不同的工程方法,不能一刀切,這種方法實用就都用。同時,在做項目時,我更多的偏於前期的設計和需求分析,這也非常適合我細心、人緣廣、善於溝通的特性,同時,我熟練使用文檔,所以這在我們團隊也發揮了重要的作用。除此之外,我也學會了一些技術知識。之前一直對各種開發軟件的應用不了解、不清楚。不清楚前期的設計到底有什么用,甚至不知道如何去利用工具去畫、去寫。不知道如何使用idea這些開發軟件來實現自己的邏輯和對功能進行實現。那么,經過這幾個月的學習和與伙伴的合作,我了解了整個開發過程,這對我對軟件工程的認識也有了新的進展。
4.馮暑容:
在學習中,我發現其實很多技術都是為了幫助開發的,現在先學會使用,就單純搭環境這一方面來說吧,剛從gitHub上下載源碼之后,上面雖然有搭配環境的教程,但實際操作卻又是另一回事。先搭建Spring環境-->然后搭建 Hibernate環境--> 整合Spring和Hibernate --> 搭建Struts2環境 --> 整合Spring和Struts2。但是一開始不會啊,就一股腦的把所有包都引進去了,然后有的包是多余的,有的包是缺少的,一下子全引進去了,就看不出來自己到底哪里出了問題,就要一點點檢查,很麻煩。而且之前對搭配環境很抵觸,每次到這種地方,就不知道該如何去做,不知道怎么做。自己折磨自己的時候就是最讓自己成長的時候。在自己不斷試錯和走彎路的時候,就是自己成長的時候,雖然搭配環境我用了好幾天的時候也沒研究明白,最后還是隊友幫忙,但是下次我再看到搭配環境的時候,我至少會很有信心的去接觸它。總的來說,團隊協作非常重要,一個人可以走得很快,但一群人可以走的很遠。
總的來說,這不僅需要個人的技術,還需要大家在一起團結協作,我們需要溝通、需要理解,同時我們也要互相提升,在隊友有錯誤要及時指正,團隊有問題要溫暖的去幫助。我們是命運共同體,我們的成長也是團隊共同的成長。在整個過程中,對於隊長來說印象最深的就是如何去和隊員溝通,如何去將項目的各個部分上傳到公共管理的板塊進行整個團隊的統一管理,當隊友焦慮不知道如何做時,隊長應該怎么樣鼓勵隊員並且給隊員思路。在分配任務時,如何根據隊員的能力進行任務的分配等等,這些都是在整個項目中,我們所成長的。同時,我也很感謝我的三位隊友,我們互相鼓勵溫暖了彼此。不管以后能不能一起合作,都希望我們仍可以陪伴和支持彼此。