软件开发为什么可以称之为艺术?只有真正从零开发过一个软件,并且经历过软件完整的生命周期,才能体会到其中的奥秘吧。
万事开头难,想想看上学那会写一篇作文,开头部分总是最难写的。往往过了很久,才吭哧吭哧崩了几个字出来。从零开始写软件也是这样。打开电脑,盯着屏幕,不知道从哪里下手。有经验的程序员往往会先做足前期准备。
1. 需求
和PM开会讨论,确定软件的需求。
2. 编写软件架构
可以用你喜欢的工具把软件架构图画出来。我倒是发现用思维导图来画也是个不错的选择。这部分往往包含了软件由哪几个模块组成,每个模块的具体功能是什么。
3. 选择技术栈
3.1 GUI
GUI是用WPF还是QT?你需要权衡是否有跨平台的需求。如果需要跨平台,那么QT是一个不错的选择。但是最终使用哪个GUI框架是一个复杂难决的问题。比如,要考虑团队成员的技能熟练度,开发的时间成本,是否有未知的风险(坑)等。这种时候老板往往有一票否决权。保守的老板会倾向于选择风险最小的方案。
3.2 跨平台
底层组件是否需要跨平台?如果需要的话,那么就需要考虑使用哪种编译工具,是CMake还是其他?使用的第三方库也会优先选择可以跨平台的,比如:Boost,OpenCV等。平台相关的代码则需要用条件编译做特殊处理。
3.3 搭框架
如果你需要和别人一起协作来开发这个项目,那么你们最好有一份代码规范。如果大家不能达成一致,那会是一件很痛苦的事情。杂乱的质量参差不齐的代码从一开始就会埋下祸根。所以如果可以,我宁愿一个人写。要知道沟通的成本是很高的,况且程序员都是一群高傲的猴子。当然,如果你们的团队里面有一个类似于主程序或者架构师之类的大牛,提前把软件的框架搭好,那也是一种不错的选择。
3.4 日志系统
不管是使用第三方开源的Log系统,还是自己写一个出来,这都是一个必选项。没有Log的程序对于改BUG的程序员是一场灾难。
3.5 错误处理
采用哪种错误处理方式?给出几条参考意见:
- Windows平台相关代码使用返回值HRESULT。
- 性能不敏感的业务代码使用异常处理的方式。
- 性能敏感的代码,一般是最底层算法的实现模块,采用返回错误码的方式。
4. 写代码
到了这一步,终于可以开始写代码了。先把每个组件的工程创建出来,给命名空间起一个帅气的名字。然后就需要思考,需要定义哪些类?每个类之间的关系是什么?是继承还是组合?类的接口怎么设计?名字怎么起?采用哪种数据结构最高效?等等。需要考虑的实在是多。
等到费了九牛二虎之力,软件的雏形终于慢慢显现。兴奋感,成就感,随之而来。你高兴的像个小孩子,快乐的和周围的人分享着你成功的喜悦。