一個代碼狗,成長經歷都是莫名相似的,
你應該和我有類似的經歷,雖然功能都能做出來,但是總覺得自己代碼缺了點什么,
就是怎么寫都覺得不夠完美,感覺代碼的水平介于專業和不專業之間,
自己的認知水平也非常有限,也不知道那些大佬寫的程式是怎么樣的,
曾經自以為,把某些功能獨立寫一個函式,然后多用指標程式就顯得比較牛逼了,
其實有時候自己都覺得有點牽強,有種強行裝逼的感覺,明明可以寫的更簡單更好理解,
我在這個階段徘徊了3年左右,一直沒有提升,主要當時主要用51單片機在做專案,
相對比較簡單,基本上在一個mian.c檔案就能做完整個產品功能,一些資料也是通過全域變數的方式去存盤,雖然使用方面,但是程式如果大了變數不注釋有時候就忘記是干嘛用的了,

那幾年一直接觸不到大神寫的代碼,自己的代碼也一直處于這種水平無法提升,
所以,一個人代碼水平怎么樣,其實跟去你有多少年經驗沒有必然的聯系,貴人和環境決定你的成長速度,
如果你一輩子都接觸不到大佬寫的代碼,那你一輩子的水平可能都處于中級水平,
雖然我在這個行業做了10年,但是真正代碼水平有質的飛越也就在那2,3年,還是自己摸索的情況下,如果當初有人帶,成為現在的水平其實只需要1年,
現在想想走彎路付出的時間代價真的是太大了,
很多人可能好奇,C語言開發單片機為什么大多數都采用全域變數的形式,
其實這個說法不完全正確,還是那句話,可能是你接觸的代碼都是這樣子,而更好的代碼結構你或許沒接觸到,
你的思維可能還是處于c語言是面向程序編程的誤區,其實在做一些中大型專案的時候,為了保證程式可移植性和可擴展性,都會采用面向物件的編程思維,
最典型的例子就是STM32的韌體庫,

如果大家研究過韌體庫那些外設的.c檔案,你會發現基本沒有全域變數,為什么?
我的理解是這樣的:
1.對于一個資深工程師來說,全域變數絕對不允許用來被多個不同的.c檔案呼叫,否則移植性極差,而且程式大了,檔案多了,如果全域變數都宣告在.h檔案里,你怎么保證變數名不會重復?
2.如果我用全域變數,那變數的應用范圍僅限該.c檔案內,也就是相當于static的作用域,
除了沒有全域變數以外,不知道你發現沒有,它們的.h檔案定義了很多結構體,列舉,

然后,在.c檔案里面的那些函式呢,基本上就是對這些結構體進行操作,

可能你現在一臉懵逼,這是什么神操作????
其實啊這就是所謂的面向物件的編程思維,難怪stm32的韌體庫移植性和可擴展性超強!
我們拿GPIO來舉例:

STM32韌體庫把每個外設可以配置的引數都通過結構體封裝起來,比如說GPIO有具體引腳(GPIO_Pin),頻率(GPIO_Speed),作業模式(GPIO_Mode),
不同的引數對應不同的設定值,比如說上圖的GPIO作業模式,通過列舉來給值重命名,這樣可以增強可讀性,
而這些值其實就是最終去配置單片機暫存器的,
大家在使用韌體庫的時候,都是先定義好結構體,然后初始化,再把這個結構體的地址作為形參傳輸相關初始化函式完成配置,

大家發現沒有,韌體庫的這種種操作都是非常有針對性的,首先凡事皆物件:GPIO、TIMER、USART、DMA、NVIC等等,
先把這些物件的屬性通過結構體定義出來,后續大多函式都是基于這個結構體去操作的,
這就是面向物件的思維(個人從業多年的理解),
所以,這就展現了一個工程師的代碼水平了,代碼寫得好不好不是看你的代碼風格和規范有多好,可移植性、可擴展性強,執行效率高才是核心,
很多新手對這些底層的思維沒有一個很清晰的認知,就瞎搞,比如說強行用指標裝逼,實際上是治標不治本的,搞不好還把自己坑了(以前經常干這種蠢事),
如果你剛從事這個不久,又接觸不到好的代碼架構,可以看看我19年錄制的那個程式架構教程,

這個架構最大的好處在于2點:
- 精簡,占用資源少,
- 經過大批量產品驗證,
- 提供了很多組件解決產品痛點(任務管理、佇列、LED特效、多按鍵檢測等),
- 基于這個架構能縮短你產品研發周期,
反正我這幾年一直在用這個架構,非常爽,直接復制粘貼,基本2-3周完成一個產品軟體部分,
也算是我這么多年一個精華總結之一,價值3000不為過,現在無償分享給大家學習,
還是那句話,如果你有機會接觸更好的代碼,那你的水平會像開掛一樣提升,如果接觸不到一輩子可能都會原地踏步,
要看的直接找無際單片機編程,或者到小破站搜就可以了,
最后分享下,我后續繼續提升的渠道,
第一個就是上面說的STM32標準庫,還有就是各種協議堆疊,比如說藍牙的協議堆疊,又或者是各種實時作業系統,
這些都是你最好的學習渠道,
不過學習需要回圈漸進,切忌在新手的時候去打BOSS,在你連功能代碼都不知道怎么實作的時候,就不要去想架構的事情,
因為你根本不知道架構的價值和意義,你學了暫時無法領悟里面的精髓,
原創不易,如果對你有幫助,麻煩給我安排個"贊”吧~
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/293784.html
標籤:其他
