当前位置:网站首页>软件开发的一点随记
软件开发的一点随记
2022-07-06 07:36:00 【王崇卫】
这篇不是笔记了,想随便写点东西,可以算做是随笔吧。挺久没写文章了,可能逻辑会比较混乱,想到啥写啥。
说明一下,自己技术水平也不咋滴。只不过是一时的思考记录。
遇到的事情:
- 最近的工作,程序需要加入标准的通信和功能。在增加和设计较为庞大的程序的时候,需要做设计程序结构,会考虑很多,如何解耦,层与层接口,模块之间,参数,ram,flash,运行速度。
- 前一周刷到up王木头学科学的一个视频。
- 这两天,和一个大佬也讨论下了,自己在编程时的一些,架构,重构。
- 最近开始学习了解aoutosar的分层结构这一块。
- 新的一个项目,需要较短的时间,完成从零的编码,到交付。
综上就比较让我产生了一些有关编程,可能又无关编程的思考。
一. 软件工程
我是机电专业的,软件工程的理论课是没有的。只能说在工程中,在编程的学习过程中,或多或少接触的。
对软件工程是什么。我很推荐大家去看“王木头学科学”这个up的一期视频《软件工程背后的思想是如何影响编程的》。以下的几点,也是我从视频中截取的。
1. 软件工程复杂性很高。
这个复杂性指内部的耦合性很高。
三重耦合:功能与功能之间的耦合,人和人之间的耦合,过去与未来的耦合。
功能与功能之间的耦合:软件的开发,如何设计划分层次和模块,这都是人来做的。
人与人之间的耦合:多人的协作之间产生的麻烦。
历史与未来的耦合:新的功能在原来的基础上更新,不止受到历史的影响,还要考虑未来这个模块的更新迭代,改变和不确定性。
2. 解耦的思想
在不损失功能的情况下,用性能和资源去交换更低的复杂度。
模块化:功能和功能之间的解耦
高内聚低耦合。分层:需求和实现之间的解耦
比如:操作系统,autosar。主要是对上层的支持和完备。分层更偏向业务驱动。模式化:对未来的解耦
设计模式、基本范式、编程原则。不知道如何办,这些规则是兜底方案。对未来的不确定性得到一定的解耦,避免了很多坑。
对这些,很多时候是深有感触的。比如我在现有基础上需要加入标准的通信和功能,需要引入协议栈,对象字典。几十个对象的意义需要设置到具体的功能上,基础的架构并不能直接使用,需要做转换。大部分参数还需要默认值,参数设置,可以保存。功能上要要求时序,性能,等等。还需要优化其他的代码来,为加功能提供flash,和ram。
在考虑对抗未来的不确定性,以及减少部分复杂度,做到一些接口模块,无关协议,无关硬件。这样解耦会稍微彻底一点。但往往性能,效率是变低的,资源占用的更多。
历史带来的耦合,新加的时候又不愿意真的耦合进去,某一些层就又更倾向重构,重构则又需要考虑,未来的修改与不确定性。任务时间节点,并不允许做更多的重构。
和同事的协作还好不多,不然复杂性又多好几倍。
思考如何做耦合尽量少一些,效率高一些,纠结到最后只能抉择如何取舍。
二. 工程的折衷
这里的折中,也是上面提到过多次的取舍。这个词我印象中,还是本科大三学《自动控制原理》巨老师,在课上讲的控制的折中。大概讲的是,控制器设计时候,在调节速度,和不超调之间如何考虑的。
又想调节的快,还要不超调是矛盾的。又想复杂性低,耦合少,还想性能效率高,资源占用少这也是矛盾的。这种鱼和熊掌不可兼得的事情,工程师面临了很多。每一次的面临,都需要在各方面的考虑之下,做抉择,做取舍,做折中。
这是一种能力、经验,这种能力也需要有意识的去锻炼,在每次的折中中去分析、体会。
工程项目的魅力也是这样的体现。很多往往时间急迫,资源有限的情况,在诸多折中的过程中完成了。有的时候是妥协,更多的时候是权衡。
三、对抗复杂、适应复杂
复杂性是我们不愿意的,也是不可避免的。人的大脑很厉害,只要我们接受,并且训练,我们的大脑就会变得复杂。
我一个工作的同事,昨天看着电脑书本,说,不知道大学时候为啥这么简单的东西,就是没看懂。现在看起来好简单。
因为大脑经过工作的训练,大脑的复杂度得到提升,回首往事,自然简单。就像一个做linux的同学,突然要做一下rtos,那不也是降维打击。要面对的复杂度直接降了多少级。
对抗的复杂性,提高我们自己的能面对的复杂性,也是在抵抗未来的复杂性,不确定性。
读书也是在提高我们内心的复杂度,之前刷视频,看到董老师的一句话:书不能解决问题,但书可以让你不再纠结一些问题。可能不会让你成为很成功的人,书往往会让你成为一个更加深刻和周全的人。
如果看到最后,感谢你花的这两分钟。
边栏推荐
- 【mysql学习笔记30】锁(非教程)
- Introduction to the basics of network security
- datax自检报错 /datax/plugin/reader/._drdsreader/plugin.json]不存在
- 【MySQL学习笔记32】mvcc
- SSM learning
- Get/post/put/patch/delete meaning
- Simple and understandable high-precision addition in C language
- opencv学习笔记九--背景建模+光流估计
- The difference between TS Gymnastics (cross operation) and interface inheritance
- Memory error during variable parameter overload
猜你喜欢
Compliance and efficiency, accelerate the digital transformation of pharmaceutical enterprises, and create a new document resource center for pharmaceutical enterprises
TypeScript接口与泛型的使用
qt颜色与字符串、uint相互转换
ORACLE列转行--某字段按指定分隔符转多行
leecode-C语言实现-15. 三数之和------思路待改进版
The way to learn go (I) the basic introduction of go to the first HelloWorld
word中如何删除某符号前面或后面所有的文字
opencv学习笔记八--答题卡识别
JDBC learning notes
QT color is converted to string and uint
随机推荐
Compliance and efficiency, accelerate the digital transformation of pharmaceutical enterprises, and create a new document resource center for pharmaceutical enterprises
NiO programming introduction
杰理之蓝牙设备想要发送数据给手机,需要手机先打开 notify 通道【篇】
剪映的相关介绍
Methods for JS object to obtain attributes (. And [] methods)
杰理之如若需要大包发送,需要手机端修改 MTU【篇】
可变参数重载时的内存错误
Do you really think binary search is easy
TS 体操 &(交叉运算) 和 接口的继承的区别
Jerry needs to modify the profile definition of GATT [chapter]
Redis builds clusters
[MySQL learning notes 32] mvcc
Typescript variable scope
Excel的相关操作
CF1036C Classy Numbers 题解
HTTP cache, forced cache, negotiated cache
杰理之BLE【篇】
navicat如何导入MySQL脚本
Oracle column to row -- a field is converted to multiple rows according to the specified separator
Related operations of Excel