0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

代碼和bug就是一個(gè)此消彼長、相互依賴的過程

GReq_mcu168 ? 來源:硬件攻城獅 ? 作者:硬件攻城獅 ? 2022-03-11 10:01 ? 次閱讀

在進(jìn)行嵌入式軟件開發(fā)過程中,產(chǎn)生一些bug是難免的,工作年限比較長的朋友應(yīng)該都會有這樣的感受:"有一定規(guī)模的軟件工程幾乎不可能沒有bug",軟件邏輯不可能那么天衣無縫,軟件測試也不會百密沒有一疏,代碼和bug就是一個(gè)此消彼長、相互依賴的過程。 經(jīng)常聽一些朋友說道:"你寫的代碼沒有bug,那你離丟飯碗不遠(yuǎn)了",又或者代碼中故意保留一些bug來增強(qiáng)自己在團(tuán)隊(duì)中的存在感,這樣就變得無可替代了,怎么說呢,雖然這些觀點(diǎn)有些不道德,但也從側(cè)面透露出打工人的辛酸與無奈。 據(jù)觀察,大部分的工程師都是“七分寫,三分調(diào)”,當(dāng)然有些人該反駁了,"我怎么感覺是三分寫,七分調(diào)嗎?",如果你是這樣的狀態(tài)去編寫和調(diào)試你的代碼,我至少會認(rèn)為你不專業(yè)或者編碼能力不夠,思維邏輯能力不行~ 一個(gè)經(jīng)驗(yàn)老道的軟件工程師調(diào)試代碼的時(shí)間都是非常短的,甚至可以一把搞定。 這樣看來對于一般工程師們,調(diào)試所占據(jù)的比例還是比較高的,當(dāng)然調(diào)試過程并不一定全是解決bug,特別是在嵌入式領(lǐng)域,一方面要適配硬件平臺,甚至還要協(xié)助硬件排查硬件相關(guān)的問題;另一方面才是前期編碼所導(dǎo)致的一些程序bug。 然而調(diào)試結(jié)束后,與bug之間的斗爭遠(yuǎn)遠(yuǎn)沒有結(jié)束,當(dāng)把第一個(gè)版本提交給測試,就意味著后面會有N個(gè)版本,測試過程中、用戶使用中、增加新需求時(shí)、修護(hù)原有bug時(shí)等等都可能引入新的bug。 所以bug基本上伴隨著你整個(gè)產(chǎn)品的迭代過程,這或許也是你作為一個(gè)程序員存在的理由。 這樣看來,bug一直有,那產(chǎn)品是不是么辦法做好了?其實(shí)隨著bug的消滅,產(chǎn)品的“相對穩(wěn)定性”是不斷增強(qiáng)的,也就意味著以后的bug沒那么致命、沒那么容易出現(xiàn)、客戶的使用也并不會觸發(fā)等等。 如果這個(gè)時(shí)候你說這個(gè)軟件沒有bug了,至少我不會相信。 既然大家都一直與bug糾纏,是不是應(yīng)該有一些經(jīng)驗(yàn)了呢?知己知彼才能百戰(zhàn)百勝。 所以bug菌這里把最近所想到的、非常有意義的部分記錄了一下分享給諸位:

1

else不處理

工作這么多年,我算是看過很多人寫代碼了,經(jīng)常有同事寫if容易丟掉else,其實(shí)這是一個(gè)非常不好的習(xí)慣。

如果在編碼的時(shí)候else部分不需要處理,倒無傷大雅,但else部分存在一些相關(guān)變量需要置位或者釋放等,而你沒有else處理,便會引入bug。

ab333482-9398-11ec-952b-dac502259ad0.png

所以我的習(xí)慣就是即使else不需要處理也會保留下來,并且在其中進(jìn)行相關(guān)注釋,以提醒自己這一塊是有邏輯處理的。

2

可視化日志

相信很多朋友都有看到過類似的文章。比如什么串口打印日志技巧、easylog等開源日志庫、離線日志記錄工具等等,這些東西都是圍繞著一個(gè)主題為程序員提供一個(gè)可視化的日志信息展示。

因?yàn)榇蟛糠秩说臅簯B(tài)大容量記憶能力是較弱的,這樣會導(dǎo)致我們對于一些邏輯中狀態(tài)的梳理處于劣勢,特別是一些復(fù)雜的邏輯處理和梳理,使得最終編寫的代碼容易引入邏輯問題。

所以通過可視化日志的方式輔助程序員進(jìn)行程序相關(guān)狀態(tài)的記錄,從而便捷的定位問題,解決bug。

ab466728-9398-11ec-952b-dac502259ad0.png

3

bug與代碼要匹配

經(jīng)??蛻艋蛘邷y試反饋一些bug,有些朋友收到就立馬一頭扎進(jìn)最新的代碼中進(jìn)行查證,其實(shí)這個(gè)問題的出現(xiàn)是老版本上,導(dǎo)致自己忙前忙后還找不到問題的根源,所以軟件的版本管控是非常重要的,這樣才能對癥下藥。

以前去過一家公司,軟件方面沒人管控,代碼隨便改,其中一個(gè)代碼改了10幾遍,版本號什么的一直不變,這樣的話一旦有問題,這個(gè)真的是一件頭疼的事情。

4

常回頭看看

這種方式主要是應(yīng)對一些新增需求導(dǎo)致的軟件bug,以前版本運(yùn)行好幾個(gè)月都沒有問題,而更新到新版本沒多久就產(chǎn)生了故障,此時(shí)需要做的就是對比之前的代碼來進(jìn)行修改點(diǎn)的查驗(yàn)和評估。

在軟件中比較模棱兩可的位置,多看看歷史版本對其的設(shè)計(jì)和所考慮的問題,防止修改以后引入新的問題。

ab5ae11c-9398-11ec-952b-dac502259ad0.png

5

不要你認(rèn)為

以前非常有意思的一句話:"我不要你認(rèn)為,我要我認(rèn)為",這句話確實(shí)有點(diǎn)狂妄自大之感,但是在"標(biāo)準(zhǔn)"面前就是這么現(xiàn)實(shí)。

經(jīng)常有朋友在解決bug的過程中抱著猜一猜的心態(tài),這樣是非常不專業(yè)的。

對于軟件運(yùn)行本身是沒有bug這一說法的,程序都是按照你寫的代碼序列在運(yùn)行著,之所以稱軟件有bug,無非就是它沒有按照你想要的邏輯運(yùn)行罷了。

那這個(gè)問題并不是在軟件本身而是你自身的編碼能力,如果對于你所寫的代碼問題都還是猜一猜的方式去解決問題,那這個(gè)bug估計(jì)會越滾越大。

所以怎么算解決bug呢?一定要分析bug產(chǎn)生的前因后果,而不是“我把下面這行代碼屏蔽了問題就不出現(xiàn)”等等不負(fù)責(zé)任的方式。

當(dāng)然有時(shí)候你有這樣的做法,我也能理解,畢竟有時(shí)候客戶可耗不起你分析的時(shí)間,設(shè)備停機(jī)1個(gè)小時(shí)10來w,你看著賠償就好了~

ab717544-9398-11ec-952b-dac502259ad0.png

6

假如XXX會怎樣

寫軟件的朋友,腦袋瓜子相對比較靈活,這都是多年訓(xùn)練的結(jié)果。

在設(shè)計(jì)軟件的時(shí)候應(yīng)該多做一些假設(shè),比如程序中等待兩個(gè)信號到來便會進(jìn)行相應(yīng)的處理,此時(shí)此刻你就需要考慮其中有一個(gè)信號遲遲沒有到來超時(shí)了程序會怎么樣?

或者兩個(gè)信號接收的順序是否會對程序造成影響之類的問題?

解析一些通信數(shù)據(jù),不可能每次都那么穩(wěn)定的傳輸,如果存在粘包、斷包、錯(cuò)誤包該如何處理等等?

當(dāng)你在寫代碼的過程中面面俱到,這樣寫出來的程序才會相對更加穩(wěn)定,當(dāng)然要做到這種境界也得一日之寒,需要不斷的積累和理解。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4701

    瀏覽量

    68120
  • BUG
    BUG
    +關(guān)注

    關(guān)注

    0

    文章

    155

    瀏覽量

    15635

原文標(biāo)題:代碼中藏幾個(gè)bug,讓自己無法替代?

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    個(gè)隱秘的串口中斷BUG案例分享

    本文分享個(gè)STM32L4平臺串口驅(qū)動比較隱秘的BUG,分享的目的不在結(jié)論本身,而在于問題的分析過程,和如何形成標(biāo)準(zhǔn),形成checklist,避免類似問題,以及在嵌入式開發(fā)中的思想。
    的頭像 發(fā)表于 09-19 14:05 ?1989次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>隱秘的串口中斷<b class='flag-5'>BUG</b>案例分享

    開發(fā)者應(yīng)該知道的代碼查詢工具,杜絕代碼bug

    組件。接下來是Review Board,“個(gè)開源的、基于web的代碼和文檔審查工具,用于幫助公司、開源項(xiàng)目和其他組織保持代碼的高質(zhì)量,而且bug
    發(fā)表于 07-25 15:04

    怎樣導(dǎo)入相互依賴的.vhd文件(CLIP)到 Labview FPGA?

    各位大佬,我想導(dǎo)入個(gè)CLIP進(jìn)Labview FPGA的項(xiàng)目中。CLIP由組.vhd文件(VHDL代碼)組成,其中些文件
    發(fā)表于 04-03 21:50

    STM32的BUG代碼的錯(cuò)誤嗎

    2010-4-8 1: 45 下面的函數(shù)中有個(gè)BUG, 也就是SR2不能用WHILE來輪詢,而應(yīng)直接讀出.如下面代碼段, 因此,在這里說的
    發(fā)表于 08-11 07:42

    如何解決JVM中個(gè)極小概率發(fā)生的bug

    編者按:筆者遇到個(gè)非常典型 JVM 架構(gòu)相關(guān)問題,在 x86 正常運(yùn)行的應(yīng)用,在 aarch64 環(huán)境上低概率偶現(xiàn) JVM 崩潰。這是個(gè)典型的 JVM 內(nèi)部
    的頭像 發(fā)表于 08-23 17:35 ?3340次閱讀

    Bug定位的過程

    身為測試工程師,總有道繞不過去的坎就是定位bug,這其實(shí)是非常花費(fèi)時(shí)間的。
    的頭像 發(fā)表于 08-08 16:11 ?821次閱讀

    為離線開關(guān)電源選擇最佳MOSFET

    了解 MOSFET 的結(jié)構(gòu)及其相互依賴的參數(shù)如何影響電源的性能
    發(fā)表于 08-22 14:25 ?773次閱讀
    為離線開關(guān)電源選擇最佳MOSFET

    使用podman-compose部署wordpress的示例

    我們對于docker-compose并不陌生,它是個(gè)用于編排多個(gè)可能相互依賴的容器的工具。
    的頭像 發(fā)表于 10-17 10:59 ?2635次閱讀

    數(shù)字隔離器三個(gè)關(guān)鍵元件的性質(zhì)和相互依賴性的重要性

    多年來,工業(yè)、醫(yī)療和其他隔離系統(tǒng)的設(shè)計(jì)人員在實(shí)施安全隔離時(shí)選擇有限:唯合理的選擇是光耦合器。如今,數(shù)字隔離器在性能、尺寸、成本、能效和集成度方面具有優(yōu)勢。了解數(shù)字隔離器三個(gè)關(guān)鍵元件的性質(zhì)和相互依賴性對于選擇合適的數(shù)字隔離器非常
    的頭像 發(fā)表于 01-29 10:53 ?895次閱讀
    數(shù)字隔離器三<b class='flag-5'>個(gè)</b>關(guān)鍵元件的性質(zhì)和<b class='flag-5'>相互依賴</b>性的重要性

    量子糾纏與愛情的類比分析

    在量子力學(xué)中,如果兩個(gè)粒子之間有相互作用,它們就會產(chǎn)生種稱為“糾纏”的狀態(tài),即它們的狀態(tài)變得相互依賴。同樣地,在愛情中,兩個(gè)人之間也可能存在這種
    的頭像 發(fā)表于 02-27 17:57 ?3512次閱讀

    個(gè)冗余電路導(dǎo)致的BUG

      昨天解了個(gè)BUG,個(gè)低級錯(cuò)誤導(dǎo)致的BUG
    的頭像 發(fā)表于 05-14 15:28 ?835次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>冗余電路導(dǎo)致的<b class='flag-5'>BUG</b>

    Research和Develop相互依賴過程

    ? "Research"(研究)和"Develop"(開發(fā))是兩個(gè)緊密相關(guān)的概念,它們在創(chuàng)新、知識產(chǎn)出和產(chǎn)品/服務(wù)的生命周期中扮演不同的角色。以下是它們之間的關(guān)系: Research(研究
    的頭像 發(fā)表于 06-19 14:49 ?622次閱讀

    個(gè)req-ack接口引發(fā)的問題分析

    最近定位了個(gè)bug代碼是以前的同事留下的,沒有經(jīng)過太多充分的測試,且沒有仿真平臺,定位的過程是相當(dāng)?shù)耐纯啵昂蠡瞬畈欢?/div>
    的頭像 發(fā)表于 09-06 17:36 ?655次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>req-ack接口引發(fā)的問題分析

    半導(dǎo)體行業(yè)的創(chuàng)新案例

    當(dāng)技術(shù)優(yōu)化的整體方法包括芯片設(shè)計(jì)、封裝和產(chǎn)品級相互依賴性時(shí),產(chǎn)品、設(shè)計(jì)、封裝、工藝和器件相互依賴性的整體方法,以提高研發(fā)效率和價(jià)值創(chuàng)造
    的頭像 發(fā)表于 10-07 10:57 ?694次閱讀
    半導(dǎo)體行業(yè)的創(chuàng)新案例

    具有相互依賴的雙熱插拔電源控制器TPS2310和TPS2311數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《具有相互依賴的雙熱插拔電源控制器TPS2310和TPS2311數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 03-15 10:44 ?0次下載
    具有<b class='flag-5'>相互依賴</b>的雙熱插拔電源控制器TPS2310和TPS2311數(shù)據(jù)表