前言
本篇文章适合于以下同学阅读
- 接触编程时间不长的初学者;
- 经常需要编程,但是对工程的概念相对模糊的同学。
初步认识工程
工程的概念大家或多或少都有接触过。比如在开发环境(如Qt Creator)里编写一个软件,我们首先需要新建一个“Project”,中文翻译通常叫做项目或者工程。一个项目中包含了以下内容:
- 项目配置:用于告诉开发环境如何为你工作;
- 项目代码:项目代码是开发者编写的,用于实现你的编程目标,比如实现一个播放器、实现一个游戏等;
- 项目其他资源:如图片、文本等数据资源。
可以看到,**项目是实现一个目标,所需要的信息、资源、工具、步骤的集合。**换言之,把实现一个目标所需要的资源,有机的结合起来,就变成了项目。
在脑海中树立项目的概念是很有用的。项目能够让你更加有条理地、高效地管理你正在做的事情,让你能够更加专注于和目标相关的事物,而不是把精力放在无关紧要的东西上。
但是,上述的项目/工程仅仅是软件开发过程中的一个狭义的概念。在实际的软件开发行业中,也就是在公司、团队在做产品开发的实际生产实践中,需要将上述的“Project”(即项目/工程)的概念作推广。
概念推广
每个人都是初学者过来的,记得在笔者本人初学编程的几年内,总以为软件开发就只是写代码而已。随着参与了一个又一个实际的软件项目,笔者才明白,软件开发绝不仅仅是闷头写代码而已。
也许你觉得,编程做软件不就是写代码吗?我一直都是这样做的啊,代码也能写出来,也能运行很好。之所以产生这样的认知,是因为你没有接触到相关的实际问题。
例如,一个总价50万的软件,总代码行数5万行,如果交给你做,项目交付时间为三个月,软件的需求由客户来提,需求有一定的变动,你有多少把握去接?判断有多少把握,当然不是直接把代码写出来再评估,评估和分析的工作要在编码之前做好。例如,至少需要评估以下方面:
- 需求变化范围:需求绝大多数情况下是会变的,就像是每个App每年都在更新。要和客户确认需求的变化范围,保证需求可控,考虑不可控因素。在后续的开发编码中,要对不确定因素做好软件架构上的冗余设计。
- 技术难度:项目涉及到哪些技术,有哪些解决不了的问题,哪些难点大概需要花多长时间;
- 技术选型:同一个业务可能有多个技术方案,选一个综合考虑最优的方案;
- 软件的结构设计:代码在5万行的项目,对于一个人来说,是一个不小的项目了。可能你平时写万行以内的小工具、小demo不是很费力,完全用不上精心考量设计模式和架构。但是,随着代码行数的增多,代码的维护越来越难。如果软件没有一个章法、结构可寻,你的代码将逐渐失控。最典型的例子是,在你写一个新的功能时,需要在已有的代码中添加、修改或删除代码。但是因为代码量多,代码耦合性强,导致你每改一个地方,都有可能破坏已有功能,引入bug,导致软件bug横行,最终项目失败!
- 软件测试如何做,以及需要多少工作量
- 软件部署、维护如何做,以及需要多少工作量
如上所述,软件从开始到结束,除了编写代码,还有很多步骤需要完成,而且每个步骤都需要产出相关的文档、资料,作为后续编码人员进行编码的依据。现实中,软件公司的软件生产流程和上述过程类似。之所以说类似,是因为实际上并不是所有公司、团队都会严格遵循以上步骤。其中重要的原因是成本问题,步骤增多,成本自然会上升。对于规模较小的公司、团队,可能流程更加精简;规模较大的公司,因为出错成本高,会更加注重软件工程的实施,提高软件质量。
我们一定要摒弃“做软件只是写代码”的陈旧观念,写代码是软件过程中的重要部分,但并非全部。读者可能会觉得上述内容可能用不到,这是因为暂时你还没有遇到实际的问题。在日后的工作中,你将会逐渐地遇到这些问题。在遇到这些问题之前,最好先建立起相关概念,做好心理准备,并随着时间的推移,慢慢消化。
软件行业发展已有将近一个世纪,软件开发过程中,什么情况下会遇到什么问题,以及这些问题如何解决,相关的研究已经比较成熟。这一套成熟的理论,叫做“软件工程”。这个“工程”不再是“Project”,而是“Engineering”。
如果你想要进一步了解的话,可以查阅“软件工程”相关的书籍。这里推荐一本:《软件设计师教程(第五版)》。此书电子版百度云地址:链接: https://pan.baidu.com/s/1s9rQjIIAxFmccCf7fZUvOA,提取码: htcq。也可以关注公众号“Qt未来工程师”,后台回复1,获取下载地址。此书中有软件工程的相关章节。大家下载下来以后,可以在闲暇之余阅读。
Project和Enginnering的异同点
相同点:
- 都是为了实现某个目标,而创建的信息、资源、步骤的集合。
不同点:
- Project更倾向于代码管理,而Engineering倾向于整个软件从确定软件需要实现什么功能开始,到软件投入使用结束,整个过程中所有需要做的事情。
了解工程的概念对个人的作用
本文读者中可能有一些尚未参与到工作中的同学,对软件开发的整体过程可能没有完整的接触。了解软件工程,可以帮助你了解最真实的软件开发流程,为将来的工作作准备。
同时,软件工程中包含的一系列设计步骤和方法,是提高软件质量的重要保证。对个人来说,学会参与到软件工程为主导的开发过程中,是提高自身软实力的重要机会,能让自己的编程生涯更加顺利,减少不必要的麻烦,避免因质量、进度问题产生严重后果。
结语
笔者根据自己多年的编程和工作经验,简述了工程相关的概念,并没有作深入介绍。希望能够引起读者对工程的注意,帮助读者避开自己曾经走过的弯路,扩充知识面,提高自身实力。