架构师成长之旅_第一篇:c++插件开发
目录
- 踏入工作前的准备
- 框架是什么?
- 多人开发
一.踏入工作前的准备
在即将踏入工作时,最主要的是你的代码量和你编码能力,最重要的是你的代码质量,在编码界代码质量有如下几个检验标准:
1.可维护性
你的代码是否具备较高的可维护性,代码没有混乱一团,思路清晰,让人一眼就能看懂你的代码想要做什么,没有那么多拐弯抹角的多余代码。
2.易读性
代码会比较容易让人看得懂,编写代码时常用“\”符号来分割一行比较长的代码,函数命名规范,编码时分段编写,每一段小步骤用一个空白行来分割,并且要养成一个小步骤写一个小注释,用来描述下面代码执行什么工作(类似分布式描述)
3.可扩展性
你的程序具有很强的扩展性,如支持插件,无需二次编译修改,善于用模块化编程,一些业务或者复杂的功能用dll方式动态加载,当你以后程序业务代码出了bug,只需要重新编译dll文件,替换给用户就可以了,这样的方法在大型软件上非常高效。
4.可靠性
程序上线run起来时不会出现层出不穷的bug,运行相当稳定,极少崩溃,保护代码非常到位,即便发生异常也不会崩溃直接退出,而是会捕获异常并告知用户,每个函数里都写有校验代码(如传递指针是否为空这些),确定条件满足才会执行函数
5.可移植性
你的项目代码具有非常棒的模块化性质,别人可以从你的项目中拉取想要的模块功能,非常方便的移植到自己的项目中,同时你的项目里的模块依赖不会那么死,如A模块依赖B模块这样的情况。
6.高效性
编写代码时从硬件与算法角度思考你的代码,提升程序稳健性,如遇到排序功能时善于使用一些高效的排序算法,还有搜索算法,当然硬件方面如果你要长时间对一个文件进行IO操作,那么会采用内存映射的方式来提升效率,当然这些需要你具备很强的底功,否则即便你知道,开发时也不一定会想起来用,同时不能怕麻烦。
其次是你的项目中内存泄漏的问题,目前来说最好的解决方法是采用c++的智能指针,或者使用类封装起来,在析构时判断是否需要释放。
在开发时记住一点,项目中,谁malloc或者new的,由谁去释放。
在进行开发时最好多学几种开发模式,如在线程同步最基本的就是工厂模式,目前很多模式能对应业务上每个功能
线程之间不要有太多的内存交互,如果需要内存交互需要加锁,防止数据出错,同时最好不要去使用全局变量,因为全局变量每个函数都可以修改,编写时不谨慎会导致变量值乱七八糟,很难找出bug点,同时内存变量始终会占有内存,当栈空间开支大的情况下,全局变量会导致程序内存始终保持一个占有率。
最好采用c++面向对象的思想,用类去描述每一个功能。一个对象对应一个类。
二.框架是什么?
软件框架是在一个项目起步时,由架构师首先编写一个基本项目原型,并且从编程语言到开发SDK选择和环境与硬件都由架构师规定,并且架构师会首先编写一个基本的项目原型并给团队每个人分工该做什么,如c语言架构师会让你编写一个函数,输入参数是什么,输出应该是什么,如果是c++那么架构师们一般会留下纯虚函数让你去实现。
团队里的人甚至可能到最后都不知道自己做了什么,但是你的功能就用在上面了,你的功能编写完成提交到github上,最后由架构师或者团队的一些核心主力集成到一起,换句话说,架构师们已经写好了整个项目的原型,很多模块由团队里的其它人负责编写,写好后上传的托管代码平台,最后集成编译,并且代码都是有规范要求的,如架构师要求你什么环境下,和使用什么编译器都是有团队要求,且编码规范都是有要求的。
简而言之,框架就像盖房子的地基一样,地基打好了才能继续盖房子,软件也一样,初步肯定需要有人制定好一份软件项目所需的技术以及清单和实现大致需要什么功能,在编写一份初步的项目体系,不需要实现这些体系的功能,只需要将其声明出来,在分发下去由谁实现。
同时软件框架首先要达到如下目标:
1.可靠性(Reliable)
软件系统对于用户的商业经营和管理来说极为重要,因此软件系统必须非常可靠。
2.安全性(Secure)
软件系统所承担的交易的商业价值极高,系统的安全性非常重要。
3.可伸缩性(SCAlable)
软件必须能够在用户的使用率、用户的数目增加很快的情况下,保持合理的性能。只有这样,才能适应用户的市场扩展的可能性。
4.可定制化(CuSTomizable)
同样的一套软件,可以根据客户群的不同和市场需求的变化进行调整。
5.可扩展性(Extensible)
在新技术出现的时候,一个软件系统应当允许导入新技术,从而对现有系统进行功能和性能的扩展。
6.可维护性(MAIntainable)
软件系统的维护包括两方面,一是排除现有的错误,二是将新的软件需求反映到现有系统中去。一个易于维护的系统可以有效地降低技术支持的花费。
7.客户体验(Customer Experience)
软件系统必须易于使用,满足客户体验感。
8.市场时机(Time to Market)
软件用户要面临同业竞争,软件提供商也要面临同业竞争。以最快的速度争夺市场先机非常重要。
三.多人开发
1.代码风格
多人开发中要规定一种编码风格,函数命名规则,变量命名规则这些。
2.注释
一个函数或者一小段代码一定要写注释,用来告诉别人这段代码干什么,主要目的是什么,描述尽量简洁,让人一眼读懂,哪怕实现一个无关紧要的功能,也要写上注释
3.代码目录结构
代码的目录结构要统一起来,可以多看看gnu下一些开源项目它们的目录结构,lib,include,build,每个目录都有含义,将你的代码放到对应的目录里,当别人需要阅读你的源代码时可以通过目录快速找到想要的源文件
4.软件可重构率
要保证你的代码重复率不高(重复利用率),这样你的软件重构会更加简易
5.git分支
如果你要修改项目中某个功能或者调试bug,一定要git上拉一个分支下来,并且在里面改完代码调试没有问题之后在合并到主分支上去,要在你的.md文件上写出来你改了什么,因为commit提交的注释并不能写很多,这样以后在拉取时可以看到每个子分支改了什么。
四.插件开发
做插件开发的目的是为了让自己的程序具有更强的扩展性,如果你的程序模块化很棒,那么将来遇到bug会变得很容易找到是哪里的问题,其次是模块化的好处是如果你的软件需要支持新的协议或者功能,你只需要编写一个插件(dll),让你的软件调用即可,无需在去修改代码增加新功能的支持,也无需重新编译你的项目。
当然做插件开发需要考虑许多因素,如:
1.插件规范
要保证你的插件规范是统一的,让你的框架能够调用并解析这个插件。
2.如何注册插件
你需要编写一套代码用于注册插件,并且将插件记录起来,避免二次重复加载这样的问题,同时你也要解析注册的插件是否是支持的。
3.如何调用插件
你需要规范插件需要实现什么接口,供你的框架调用,同时你的框架想要使用哪种方式去调用插件。
4.插件的生命周期
在插件存活期间需要知道,插件该什么时候释放,什么时候工作。
5.插件之间的通讯拟定
当插件需要获取框架某些信息,或者想要获取外界环境的一些信息,需要框架开发者提供接口。
6.框架的安全性
需要插件只能使用你规范的一些接口,否则如果让插件开发者自由发挥,开发者如果使用了一些木马代码在里面极其可能破坏程序运行
目前上面这些只是最简单的初步设想,让大家对插件开发有一个初步的了解,更深入的可以去参考OSGI