一个代码狗,成长经历都是莫名相似的。
你应该和我有类似的经历,虽然功能都能做出来,但是总觉得自己代码缺了点什么。
就是怎么写都觉得不够完美,感觉代码的水平介于专业和不专业之间。
自己的认知水平也非常有限,也不知道那些大佬写的程序是怎么样的。
曾经自以为,把某些功能独立写一个函数,然后多用指针程序就显得比较牛逼了。
其实有时候自己都觉得有点牵强,有种强行装逼的感觉,明明可以写的更简单更好理解。
我在这个阶段徘徊了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,在你连功能代码都不知道怎么实现的时候,就不要去想架构的事情。
因为你根本不知道架构的价值和意义,你学了暂时无法领悟里面的精髓。
原创不易,如果对你有帮助,麻烦给我安排个"赞”吧~