隨想錄(軟件開發不能是加工作坊)

?? 前一段時間看了一本《走出軟件作坊》,心情很沉重。不管你是否承認,書中描述的情況在現在的國內IT企業中確實存在,可能涉及的范圍還很廣。聯想到自己目前處于的行業,心中不免唏噓不已。類似的事件,類似的方法,每天都在上演著。無休止的版本修改,無休止的測試,無休止的開發需求,人員的流失和更替,心中除了累還是累。現在的IT早已經不是10年前的香餑餑行業,大家都在經受著挑戰和煎熬。現在的IT行業分布很廣,IT信息化公司、網站公司、通信公司、嵌入式產品公司、芯片公司、網游公司、ERP公司,這些公司由于所處行業的上下游位置不同,公司的境遇差別很大。特別辛苦的是那些本身技術門檻比較低,缺少技術壁壘的公司,員工在承受著低福利的同時還要承受著與之不匹配的工作強度。這就是我們的生活現狀。我們的IT開發非要這樣不可嗎?


? ? 一般認為,IT項目開發的過程都是按照需求分析、軟件設計與實現、集成測試與系統測試、后期維護這幾個步驟進行的。我們應該好好反思一下,這幾個步驟有沒有提高和改進的空間。


(1)加強需求分析

? ? 從商業的角度來說,交易的出發點就是為了滿足客戶的需求。只有精準地滿足了客戶的需求,我們才能更好地交付產品,實現雙贏。當然,完成這一切的前提就是需要我們能夠準確把握客戶的需求。對很多公司來說,需求分析都是由銷售來說,這是十分不靠譜的一個舉動。因為,我們知道,銷售人員的目標就是完成更多的簽單,所以很多時候他會毫無原則地接受客戶的一切要求。至于這些要求客戶是不是真實需要,或者說這些需求本身技術能不能實現,那就超過了他本身的理解范圍了。很多銷售的理解范圍其實就是入職時培訓的那一些內容,至于技術細節或者產品性能方面的東西,那真是無能為力了。作為優秀的需求分析師,他不僅僅可以準確把握客戶的需求,甚至在某種程度上可以影響客戶的需求。這種例子雖然不多,但是也不鮮見。無原則的接單,不僅浪費了開發的資源,從大了說,也會影響公司的誠信水平,甚至危害公司的發展。


(2)抽象公共平臺

? ? 現在的服務器系統平臺很多,windows可以,linux可以,unix也可以。因此,很多情況你不知道自己的服務端程序最終跑在哪一個操作系統上。所以,你要做的就是做一個抽象的公共平臺。在這個平臺上面,你可以忽視具體的細節,因為你使用的函數都是平臺的函數,你使用的數據類型都是平臺的數據類型,所以不管什么操作系統,你的服務器程序都可以準確無誤地運行。為了做到這些,你可能在構造平臺的時候需要對很多函數重新進行封裝,比如,

a)內存申請、釋放

b)socket創建、接受、發送、釋放

c)信號量操作

d)文件創建、打開、讀、寫、關操作

e)定時器

f)消息發送和接受

g)延時函數

h)線程創建、優先級設置、屬性設置、屬性獲取等等


(3)構建自己的軟件庫

? ? 軟件作為一個工程來說,事實上它也是由很多的子模塊組成的。這里面的模塊很多,比如說基本算法模塊、數據庫訪問模塊、圖形模塊、解析模塊、日志模塊、解壓縮模塊、pic讀取模塊。對于很多項目來講,很多模塊的功能都是可以復用的,那么如何把這些模塊抽取出來就是我們需要完成的一個工作了。最最理想的情況就是,我們所有的軟件都是由各個模塊按照搭積木的方式組成的,如果我們需要對應的功能,那么打開對應的編譯宏就可以了;反之,如果不需要這個功能了,那么關閉對應的宏即可。這方面,我們可以看一下linux代碼。它上面的很多代碼都是以模塊存在的,那么多cpu、那么多fs、那么多chip都可以在上面運行,這說明linux整個系統的設計是非常開放和健壯的。


(4)抽象流程

? ? 作為一個軟件的主流程,這好像應該是軟件主程序員應該負責的事情。其實,作為某一個模塊的程序員,我們也可以從中學習到一些東西。就拿我經常說的一個例子來說,假設現在我們需要設計一個音頻播放器,它需要支持mp3、wav、ogg等多種音頻格式文件。看到這里,大家可以先考慮一下,這個軟件應該設計?在這個地方,我們應該思考一下,所有的文件操作有什么共性的地方,能不能在各種音頻文件之上構造出一個通用的文件訪問流程。有了這個抽象的訪問流程之后,那我們對各種音頻的處理就是一個簡單的注冊和解析工作了。即使我們寫的程序不正確,也不會影響原來主流程的運行過程。有了這一層抽象之后,可以極大提高我們工作的開發效率。


(5)單元測試

? ? 單元測試是一種非常好的方法。本質上說,代碼設計者應該是代碼的最終負責人。可是在實際工作中,我們把軟件的質量問題過多地放在了測試人員身上。好多人認為軟件測試是一個非常無趣且單調的工作。其實,情況并非如此。對于功能性測試,我們應該盡可能采取自動化測試的方法,實現版本的每日構造和每日冒煙測試。而對于模塊的測試,那就要進行代碼的單元測試。就我個人的經驗而言,如何設計stub函數,如何設計單元測試是非常考驗人的一件事情。隨著單元測試用例的增加,我們的代碼會越來越健壯,整個模塊也會越來越穩定。可是在很多公司,單元測試做的很不足,或者說很多公司干脆徹底就不做了。


(6)自己編寫測試工具

? ? 平時測試軟件的時候,我們的方法其實不多。有的人習慣使用windows的性能分析工具,或者如果公司比較富裕一點,會自己購買pure coverage等工具。但是,其實很多時候我們是可以自己編寫測試工具的。這些工具的編寫不復雜,比如說

a)可以利用malloc重定向的方法,統計malloc的內存個數,看看內存有沒有泄漏

b)利用開源工具gcov測試代碼覆蓋率

c)自己編寫腳本解析模塊,靈活地對代碼功能進行測試

d)利用assert屬性,捕捉一切異常的屬性等等


(7)仿真工具

? ? 在嵌入式開發中,實際環境常常是非常有限的。所以,創建一個有效的仿真平臺是什么重要的。就拿android來說,我們就是在windows上面開發一個android的仿真環境,那么app的開發者就不需要每次開發一個版本之后,到實際phone上下載之后才能看到實際的運行結果。有了pc的仿真之后,他在pc上看到的結果基本上就是在phone上看到的效果。這中間沒有別人的打擾、沒有實際環境的搭建,工作的效率自然而然就可以提高上去了。當然不僅GUI可以仿真,原則上只要不和具體硬件相關的操作都可以而且應該放在pc上來解決。


? ? 上面很多的內容都是我個人的一些總結和意見,歡迎朋友們多多交流看法。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452591.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452591.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

程序員的核心競爭力

1、穩定的基礎知識體系; 2、需求到模型的轉化建模能力; 3、獨立思考能力; 4、思想:世界觀、方法論。

Flask愛家租房--訂單支付(支付過程)

文章目錄0.支付流程1. 重點總結2.后端代碼3.前端js4.前端html0.支付流程 1. 重點總結 1)用戶進入“我的訂單”頁面,點擊“去支付”; 觸發后端js中的函數,發出ajsx異步請求,調用后端相應接口order_pay(order_id)&#…

微信小程序利用key實現列表性能的提升

微信小程序利用key實現列表性能的提升 key值在列表渲染的時候,能夠提升列表渲染性能,為什么呢?首先得想想小程序的頁面是如何渲染的,主要分為以下幾步: 將wxml結構的文檔構建成一個vdom虛擬數頁面有新的交互&#xff0…

CentOS MySQL 5.7編譯安裝

CentOS MySQL 5.7編譯安裝 MySQL 5.7 GA版本的發布,也就是說從現在開始5.7已經可以在生產環境中使用,有任何問題官方都將立刻修復。 MySQL 5.7主要特性: 更好的性能:對于多核CPU、固態硬盤、鎖有著更好的優化,每秒100…

為什么設計師創造的編程語言更受歡迎?

導讀:在編程的世界里,語言紛繁多樣,而大部分真正廣泛流行的語言并不是那些學術界的產物,而是在通過自由發揮設計出來的。 和那些在最后期限重壓下產生的語言版本比較起來,從一定程度上來看,從學術界產生出…

狀態轉換圖簡介

狀態轉換圖(簡稱為狀態圖)通過描繪系統的狀態及引起系統狀態轉換的事件,來表示系統的行為。此外,狀態圖還指明了作為特定事件的結果系統將做哪些動作。 (一)狀態 狀態是任何可以被觀察到的系統行為模式,一個狀態代表…

C#常用單元測試框架比較:XUnit、NUnit和Visual Studio(MSTest)

做過單元測試的同學大概都知道以上幾種測試框架,但我一直很好奇它們到底有什么不同,然后搜到了一篇不錯的文章清楚地解釋了這幾種框架的最大不同之處。 地址在這里:http://www.tuicool.com/articles/F3eEn2j 簡而言之,三者是非常相…

實驗五 類和對象-3

1.ex3.cpp 1 #include <iostream>2 #include <vector>3 #include <string>4 using namespace std;5 6 // 函數聲明 7 void output1(vector<string> &); 8 void output2(vector<string> &); 9 10 int main() 11 { 12 vector<st…

Vector用法詳解

這篇文章的目的是為了介紹std::vector&#xff0c;如何恰當地使用它們的成員函數等操作。本文中還討論了條件函數和函數指針在迭代算法中使用&#xff0c;如在remove_if()和for_each()中的使用。通過閱讀這篇文章讀者應該能夠有效地使用vector容器&#xff0c;而且應該不會再去…

linux 共享移動硬盤,隨時登陸上QQ 自帶Linux移動硬盤實戰

在以往我們的觀念中&#xff0c;移動硬盤頂多就是個移動存儲設備&#xff0c;根本談不上有什么功能&#xff0c;但今天這款一盤通卻將我們原始的觀念打了一個180大轉彎&#xff01;如果你的電腦支持USB設備啟動&#xff0c;那么只需要在BIOS進行一下更改&#xff0c;一盤通就可…

需求分析的圖形工具(層次方框 warnier IPO)

1 層次方框圖 層次方框圖用樹形結構的一系列多層次的矩形框描繪數據的層次結構。 例如&#xff0c;描繪一家計算機公司全部產品的數據結構可以用下圖層次方框圖表示。 這家公司的產品由硬件、軟件和服務3類產品組成&#xff0c;軟件產品又分為系統軟件和應用軟件&#xf…

如何處理錯誤信息 Pricing procedure could not be determined

2019獨角獸企業重金招聘Python工程師標準>>> 當給一個SAP CRM Quotation文檔的行項目維護一個產品時&#xff0c;遇到如下錯誤信息&#xff1a;Pricing procedure could not be determined 通過調試得知錯誤消息在function module CRM_PRIDOC_COM_PRCPROC_DET_SEL第…

Flask愛家租房--訂單(下訂單)

文章目錄0 、效果展示1、思路總結2、后端代碼3、前端js4、前端html0 、效果展示 detail.html booking.html 1、思路總結 1&#xff09;用戶打開房屋詳情頁detail.html之后&#xff0c;后端detail.js會判斷此訪問用戶是否為房東&#xff0c;若不是房東&#xff0c;則在詳情…

linux下各權限的細分

PS&#xff1a;有時候你發現用root權限都不能修改某個文件&#xff0c;大部分原因是曾經用chattr命令鎖定該文件了。chattr命令的作用很大&#xff0c;其中一些功能是由Linux內核版本來支持的&#xff0c;不過現在生產絕大部分跑的linux系統都是2.6以上內核了。通過chattr命令修…

紅帽linux lnmp搭建,Linux(redhat5.4)下lnmp環境的搭建

在前面我們已經實現了lamp架構的創建&#xff0c;今天就讓我們來看一看lnmp架構是如何實現的。計劃的實驗步驟如下&#xff1a;1. 數據庫mysql的安裝2. Nginx的安裝&#xff0c;libevent(編譯庫代碼)的安裝&#xff0c;pcre的安裝3. Php的安裝4. 測試1. Mysql 的安裝//注意:小編…

為什么借助開源學習是最有效的?

導讀&#xff1a;盛大創新院高級研究員莊表偉近日編撰系列文章《借助開源項目&#xff0c;學習軟件開發》活動&#xff0c;引起業界關注。莊表偉認為&#xff0c;通過編撰這些文章&#xff0c;希望更多開發者能夠借助開源項目提高開發效率&#xff0c;減少重復勞動并從開源軟件…

redux middleware 源碼分析

原文鏈接 middleware 的由來 在業務中需要打印每一個 action 信息來調試&#xff0c;又或者希望 dispatch 或 reducer 擁有異步請求的功能。面對這些場景時&#xff0c;一個個修改 dispatch 或 reducer 代碼有些乏力&#xff0c;我們需要一個可組合的、自由增減的插件機制&…

Flsak愛家租房--訂單(獲取用戶訂單、用戶評論)

文章目錄0.頁面效果1.思路總結2.后端代碼3.前端js4.前端html0.頁面效果 1.思路總結 1&#xff09;用戶點擊“我的訂單”&#xff0c;js向后端獲取數據&#xff0c;并加載在前端的模板中&#xff1b; 2&#xff09;用戶點擊相應訂單的“去支付”按鈕&#xff0c;js向引導用戶…