單元測試與仿真程序之間的選擇

為什么寫這篇文章

現在的工作需求,讓我有必要總結和整理一下。
凡事都有適用的場景。首先這里我需要提示一下,這里的信息,可能并不普適。
但是可以肯定一點的是,有些人,不論做事還是寫書,上下文還沒有交待清楚,就對你說單元測試如何重要,這種是極為無恥的。
是的,我是說無恥。因為說風涼話的人,他們不需要像那些奮戰在一線的程序員那樣,需要面對結果質量與進度和成本,以及維護性之間的考量,他們只需要在意自己說的話是不是看來永遠正確即可。
這么說吧,一個想要他說的話永遠正確,只需要故意將上下文刪除即可,這也就是人們常說的站著說話不腰疼,或者永恒正確的廢話,或者何不食肉糜之類的正確但無用的話。這些話往往常出現在書籍上。

但是,現實中,我們每天都需要面臨痛苦的選擇:是讓自己良心好受一些,寫出質量過得去的程序,還是讓老板看到,我又出活了這樣的表面文章。

所以,我們必須要考慮如何測試,以及如何避免重復相同的錯誤這樣的問題。

然而,測試從來不是一件簡單的事,事實上,我的碩士論文寫的就是如何在被測對象升級之后,自動測試的腳本,能夠95%以上自動升級的故事。這個我們不多說了。但大家都知道這是一個困難的事情。所以我的論文開篇講的是自動測試的消亡史。

講到測試,我們就不得不考慮測試的方法。
所有的書上,都強調Unit test是必不可少,多么重要。

這點了解我的人都知道,我是嗤之以鼻的。

正確的事,就好比亞當.斯密的《國富論》,認為自由競爭是是經濟的基石;而事實是,人們總會有想盡辦法使自由競爭失效。
同樣,這些看似正確的廢話,只能帶來災難。軟件行業的災難性失敗還少嗎?這些大公司沒有做單元測試嗎?
以微軟為例,2003年,當時我還在某為,聽說微軟過了CMM2級,我說了一句:微軟從此再也不能開發出有完整度的軟件。一語成讖。

鋪墊這么多,就是想對一些人說:凡事需要考慮上下文,不要被所有的書里都認可的話所蒙蔽:所有的寫書的人,大多沒有在一線工作過。

單元測試VS模擬(或仿真)程序

后面我們來比較一下這二者

單元測試的適用范圍

1。 相對簡單的程序或產品。
2。 與設備無關的程序或產品。
3。 需求變動相對慢的程序或產品。
4。 設計良好,接口清晰,與人機界面交互不多的多線程的每個模塊或層之間。
上述為一般的單元測試能取得良好效果的上下文。

單元測試的問題

對代碼有依賴。

這顯然是最嚴重的問題。
有人說,為什么我要極客編程的原因正是如此,因為以前測試與研發是相對的,因為體制要求如此,但測試發現,研發的人可以隨意改代碼,所以白盒測試就消亡了。
所以,管理者就想到讓程序員吃自己的狗食這樣的損招:自己寫自己的單元測試——反正嘴一動就可以了,這多簡單。他們不考慮這么做帶來的后果是什么。

這是一個悲哀的時代的原因是真正的程序員,已失去是了話語權。
那么有人說,是你自己的狗食,做得不好吃是你自己的問題。
然而事實真的是這樣嗎?
需求變動,產品經理認了客戶當干爹,他敢對干爹說不嗎?
還是苦一苦程序員吧。
設計錯誤,所有的PMP(我不是說PMP認證,我是說拍馬屁那個PMP)的組長,敢對總工說不嗎?
還是苦一苦程序員吧。
接口常變動,程序員同樣沒有權力找橫跨多個部門的技術官僚體系去說理。
還是苦一苦程序員吧。

所以,這狗食難吃,也許只有不到1%的問題,在程序員。
所以,程序員現在不僅要捏著鼻子做難吃的狗食,還要自己吃了。

當然我們需要肯定單元測試的價值

如果你有良好設計的復雜的程序,所有的模塊相對獨立,接口相對穩定,
并且這個程序是多線程程序,那么單元測試是能發揮出極大的價值的。
如果再加上我寫的論文里描述的,當被測對象發生改變時,自動測試腳本也能自動升級,顯然對程序員是有利的。
當然,這是永恒正確的廢話。
因為分工是你程序員澆水,官僚體系吃桃子。
嘔,我忘了說,這種分工很公平:一棵樹,一人一半,你要下面,我要上面。你一直澆水,我一直吃桃子,對了,老吃桃子也很累人的,你們澆水人不會懂我們的痛苦的。一人一半,很公平,放稱上稱稱,一定一樣重的。。。
或者說,除非這項目是你一個人在寫。
多數情況,單元測試害處多于利益。
原因很簡單,導致這種情況的官僚體系,是無人問責的(單向向上體系)。責權不對等。當然,他們吃桃子也很累,我也很有同理心的。

所以總結:
一個人的項目,而且項目很復雜,設計可控,接口清晰,需求清楚,而且你要對被測的對象非常了解,才可以。

模擬(或仿真)程序

當然一般我們是指模擬程序。除非有條件(作設備仿真)。
人們有個誤解,認為互聯網程序代表程序員,這顯然是錯到離譜,離了大譜。
廣大的程序員,是需要與設備或硬件打交道的。
所以,模擬或仿真程序,是至關重要的。
原因是絕大多數公司,無法提供足夠的硬件給程序員。

程序員的困難在于,有困難無處去說,比如說,我需要行拿到設備,才能逐漸的了解它的習性;
但領導卻堅持認為,你是懂的,你非常懂。
等你剛懂,這個項目完事了,新的設備又到了。
所以,程序開發是個動態過程,這些話,領導是無法理解的,因為中國的情況,目前的領導都是硬件出身,麻麻不懂。而且也不講道理。我這么說是有依據的。

在這樣的情況下,寫單元測試,是相當離譜的。

但是,寫模擬程序卻是非常必要的。

這是從技術開發和技術管理兩個視角來看的。

因為模擬程序的仿照對象僅僅是我們的target,而unit的服務對象卻是我們的程序。
這個你稍微理解一下就懂了。一個是對哈雷彗星,另一個是對哈雷將軍。

也就是說,我們自己寫程序,是最不可信的,因為你在信息的最后一道工序,沒人在乎你。
但設備不同。
所以,不論你如何改代碼,都不會影響simulator。
這是最關鍵的要點。與unit test不同。
我常說,第一點占75%以上。
但是后面的不重要的理由我們也要說說。

資產保值性

資產保值這件事,也是有水分的。因為你得是“資產”,才有必要保值。
一堆垃圾代碼,它就不是資產。
單元測試的代碼,往往如此。因為它要測的對象如果是個垃圾,它就一定是垃圾。

可是,simulator卻不是這樣的。
因為它mirror的對象是真實的設備。
隨著公司工程的一年一年的積累,這個simulator會變成emulator的一部分,最后會變成產品的一部分,最后,會比產品更好。

以ABB的機器人為例,了解過的人都知道它的simulator有多強。FPGA的程序,DSP的程序,直能能跑。機器人也是三維CAD動畫模擬出來的。
用戶不需要買robot就能完全與買了一樣給機器人編程。

這個算是15%?

管理角度

利用分工,也就是說,大公司,可以專門派專人寫simulator,這點其實非常有價值的。注意是專崗。
如果有公司這么做,說明這老板有水平。
盡管中國大多是垃圾公司,管理極為垃圾。
但如果你的老板有這水平,恭喜你。盡量多干幾年。
啊對了,你不可能設立專崗寫unit test。前面這我解釋得好多了。

后記

可千萬不要以為,單元測試不重要。
其實我也寫的。
因為我能做到可控。
因為是我一個人在干。我對我的能力也相當自信。所以我用。
但我盡最大可能,會集中精力寫模擬程序,因為太必要了。

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

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

相關文章

如何在Android中實現圖片加載和緩存

在Android中實現圖片加載和緩存是提升應用性能和用戶體驗的關鍵環節。高效的圖片加載和緩存策略能夠減少內存占用、避免應用卡頓,并快速響應用戶的圖片查看需求。以下是在Android中實現圖片加載和緩存的幾種常見方法: 一、使用第三方圖片加載庫 1. Gli…

FusionInsight MRS云原生數據湖

FusionInsight MRS云原生數據湖 1、FusionInsight MRS概述2、FusionInsight MRS解決方案3、FusionInsight MRS優勢4、FusionInsight MRS功能 1、FusionInsight MRS概述 1.1、數據湖概述 數據湖是一個集中式存儲庫,允許以任意規模存儲所有結構化和非結構化數據。可以…

推薦幾款優秀的PDF轉電子畫冊的軟件

當然可以!以下是幾款優秀的PDF轉電子畫冊的軟件推薦,內容簡潔易懂,這些軟件都具有易用性和互動性,適合不同需求的用戶使用。? ? FLBOOK|在線創作平臺 支持PDF直接導入生成仿真翻頁電子書。提供15主題模板與字體庫&a…

【GoTeams】-2:項目基礎搭建(下)

本文目錄 1. 回顧2. Zap日志3. 配置4. 引入gprc梳理gRPC思路優雅關閉gRPC 1. 回顧 上篇文章我們進行了路由搭建,引入了redis,現在來看看對應的效果。 首先先把前端跑起來,然后點擊注冊獲取驗證碼。 再看看控制臺輸出和redis是否已經有記錄&…

深度學習反向傳播

一、白話解釋 梯度其實就是導數,除了用符號求導也可以用近似求導: 然后更新ww-學習率*導數 反向傳播就是鏈式求導 向前計算:對每個節點求偏導 在前向傳播的時候,進行一次前向計算的時候就可以把每一條線的偏導數都知道 前向傳…

JavaWeb-HttpServletRequest請求域接口

文章目錄 HttpServletRequest請求域接口HttpServletRequest請求域接口簡介關于請求域和應用域的區別 請求域接口中的相關方法獲取前端請求參數(getParameter系列方法)存儲請求域名參數(Attribute系列方法)獲取客戶端的相關地址信息獲取項目的根路徑 關于轉發和重定向的細致剖析…

deepseek在pycharm 中的配置和簡單應用

對于最常用的調試python腳本開發環境pycharm,如何接入deepseek是我們窺探ai代碼編寫的第一步,熟悉起來總沒壞處。 1、官網安裝pycharm社區版(免費),如果需要安裝專業版,需要另外找破解碼。 2、安裝Ollama…

AAA協議:從零認識網絡的“身份管家”

AAA(Authentication, Authorization, Accounting,認證、授權和計費)是網絡世界的“身份管理員”,負責確認“你是誰”、決定“你能干啥”、記錄“你干了啥”。如果你用過華三的交換機或路由器,可能在配置用戶管理時見過…

動態規劃01背包問題系列一>最后一塊石頭的重量II

這里寫目錄標題 題目分析:狀態表示:狀態轉移方程:初始化:填表順序:返回值:代碼呈現:優化版本:代碼呈現: 題目分析: 狀態表示: 狀態轉移方程&#…

逐行拆解 C 語言:數據類型、變量

今日,我們即將踏上一段充滿趣味與挑戰的學習之旅,深度鉆研數據類型的多樣奧秘,解鎖變量創建的實用技巧。不僅如此,還會邂逅兩個實用的基礎庫函數,探索它們在程序中穿針引線的奇妙作用。同時,幾個簡潔卻強大…

【音視頻】ffplay簡單過濾器

一、ffplay簡單過濾器 視頻旋轉:借助transpose濾鏡 ffplay -i 1.mp4 -vf transpose1這里選擇不同的數字是不同的方向: 視頻翻轉:借助hflip/vflip實現水平和垂直翻轉: 水平翻轉 ffplay 1.mp4 -vf hflip垂直翻轉 ffplay 1.mp4 …

springboot中注解有什么用

注解(Annotation)是 Java 的一個重要特性,我用幾個具體例子來解釋: 1、標記功能 Service // 告訴Spring這是一個服務類 public class UserService { }Data // 告訴Lombok自動生成getter/setter public class User {private…

Excel中COUNTIF用法解析

COUNTIF 是 Excel 中一個非常實用的函數,用于統計滿足某個條件的單元格數量。它的基本語法如下: 基本語法 COUNTIF(范圍, 條件) 范圍:需要統計的單元格區域,例如 A1:A10 或整列 A:A。 條件:用于判斷哪些單元格需要被…

java根據List<Object>中的某個屬性排序(數據極少,順序固定)

public static void main(String[] args) { List<HashMap<String, Object>> dydj new ArrayList<>(); // 模擬原始數據 HashMap<String, Object> map1 new HashMap<>(); map1.put(“city_name”, “張家口”); map1.put(“wjs”, 0); map1.put…

4G工業路由器在公交充電樁中的應用與優勢

隨著電動公交車的普及&#xff0c;公交充電樁的穩定運行和高效管理是交通營運部門最關心的問題。4G工業路由器憑借其卓越的數據采集和通訊能力&#xff0c;成為實現充電樁智能化管理的關鍵。 公交充電樁運維管理需求概述&#xff1a; 1.實時性&#xff1a;實時監控充電狀態、剩…

利用golang embed特性嵌入前端資源問題解決

embed嵌入前端資源&#xff0c;配置前端路由的代碼如下 func StartHttpService(port string, assetsFs embed.FS) error {//r : gin.Default()gin.SetMode(gin.ReleaseMode)r : gin.New()r.Use(CORSMiddleware())// 靜態文件服務dist, err : fs.Sub(assetsFs, "assets/di…

【LangChain 數據連接封裝】 文檔加載器、文檔處理器

小結&#xff1a; 文檔處理部分&#xff0c;建議在實際應用中詳細測試后使用與向量數據庫的鏈接部分本質是接口封裝&#xff0c;向量數據庫需要自己選型類似 LlamaIndex&#xff0c;LangChain 也提供了豐富的 Document Loaders DocumentLoaders和 Text Splitters Text Splitte…

Springboot集成dubbo完整過程(三)

準備工作 1&#xff0c;準備mysql服務環境2&#xff0c;準備redis服務環境3&#xff0c;準備zookeeper服務環境4&#xff0c;準備逆向生成bean的xml配置文件5&#xff0c;準備slf4j日志xml配置文件6&#xff0c;準備一個sql腳本 1&#xff0c;搭建創建服務工程 1&#xff0c;創…

【DeepSeek 】學習編程的利器:DeepSeek 使用指南

學習編程的利器&#xff1a;DeepSeek 使用指南 如果你正苦于如何開始學習 Python/R/Linux/HTML 語法&#xff0c;這個方法或許是你學習過程中的利器&#xff0c;又不用考慮請教真人&#xff0c;麻煩別人。 學習階段 第一階段&#xff1a;通讀語法書籍 第一步通讀一些相關語法…

【大模型篇】目前主流 AI 大模型體系全解析:架構、特點與應用

大家好,我是大 F,深耕AI算法十余年,互聯網大廠技術崗。分享AI算法干貨、技術心得。 歡迎關注《大模型理論和實戰》、《DeepSeek技術解析和實戰》,一起探索技術的無限可能! 閱讀完本文,您將知道:目前主流的大模型體系有哪些?及其架構的特點。 前言 在自然語言處理(NL…