前言

本篇文章适合于以下同学阅读

  • 接触编程时间不长的初学者;
  • 经常需要编程,但是对工程的概念相对模糊的同学。

初步认识工程

工程的概念大家或多或少都有接触过。比如在开发环境(如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倾向于整个软件从确定软件需要实现什么功能开始,到软件投入使用结束,整个过程中所有需要做的事情。

了解工程的概念对个人的作用

本文读者中可能有一些尚未参与到工作中的同学,对软件开发的整体过程可能没有完整的接触。了解软件工程,可以帮助你了解最真实的软件开发流程,为将来的工作作准备。

同时,软件工程中包含的一系列设计步骤和方法,是提高软件质量的重要保证。对个人来说,学会参与到软件工程为主导的开发过程中,是提高自身软实力的重要机会,能让自己的编程生涯更加顺利,减少不必要的麻烦,避免因质量、进度问题产生严重后果。

结语

笔者根据自己多年的编程和工作经验,简述了工程相关的概念,并没有作深入介绍。希望能够引起读者对工程的注意,帮助读者避开自己曾经走过的弯路,扩充知识面,提高自身实力。

【软技能】代码先放一放,学习一下工程的概念相关推荐

  1. 软技能-代码之外的生存指南 学习笔记

    Soft Skills: the software developer's life manual 这本书是美国的一个软件开发人员写的,但是书中除了有Java.C# 几个单词外,没有一行代码,因为这本 ...

  2. 《软技能-代码之外的生存指南》学习笔记之理财篇

    <软技能–代码之外的生存指南>学习笔记之理财篇 作者:[美] John Z. Sonmez 摘要:这是⼀本真正从"⼈"(⽽⾮技术也⾮管理)的⾓度关注软件开发⼈员⾃⾝发展 ...

  3. 《软技能--代码之外的生存指南》学习笔记之生产力篇

    <软技能–代码之外的生存指南>学习笔记之生产力篇 作者:[美] John Z. Sonmez 摘要:这是⼀本真正从"⼈"(⽽⾮技术也⾮管理)的⾓度关注软件开发⼈员⾃⾝发 ...

  4. 《软技能——代码之外的生存指南》 之博客篇

    昨晚拜读 软技能-代码之外的生存指南 讲真,收益不少,感同身受的太多.而让我决定重新开始写博客,也是在拜读了 第21章 创建大获成功的博客 之后 博客的重要性早已烂熟于心,除了总结.记录外,更多的是分 ...

  5. 程序员的自我修养——读《软技能-代码之外的生存指南》笔记

    我记得曾经读过俞甲子的<程序员的自我修养--链接.加载和库>,当时就觉得这个书名起的不太合适,有点不合主题,因为这本书主要讲述链接库的事情,我认为这个是编译器的一部分,是作为程序员要掌握的 ...

  6. 《软技能 代码之外的生存指南》

    这是一本关于程序员人生的书籍,并不是一本技术书.作者从职业.自我营销.学习.生产力.理财.健身.精神七个方面来介绍,从中可以看出作者初期还是一个扎实.能力强的程序员,后面慢慢进入房产和其他投资实现了财 ...

  7. 《软技能-代码之外的生存指南》的读后感

    <软技能-代码之外的生存指南>的读后感 该文章是阅读<软技能-代码之外的生存指南>这本书后的读后感,主要总结了这本书中的几个方面的笔记. 1.职业篇 ①拥有商业心态 目前我们中 ...

  8. 《软技能——代码之外的生存指南》笔记

    学习之十步学习法 作为在互联网日新月异时代的软件开发人员,自我学习能力为一个开发人员最重要的一个自身技能.如果我们想成为最好的开发人员,那么就必须要学会自学.无论如何,学会自学都是自我教育的核心技能. ...

  9. 软技能-代码之外的生存指南

    作为一个初级程序员,生活不仅有眼前的bug,还应该有诗和远方.最近读了一本书,虽然只读了一半但其中阐明的思想让我感受颇深. 初次看到这本书时候,就像书名软技能-代码之外的生存指南一样,直觉告诉我这肯定 ...

  10. 《软技能--代码之外的生存指南》读书笔记

    这本书可以说是程序员必读书了,本书共分为职业篇.自我营销篇.学习篇.生产力篇.理财篇.健身篇.精神篇等七篇,概括了软件行业从业人员所需的"软技能".通过阅读本书,软件工程人员.编程 ...

最新文章

  1. 基于边缘的图像分割——分水岭算法(watershed)算法分析(附opencv源码分析)
  2. 2019-11-10 秩和奇异的一些概念
  3. Vscode----热门插件超实用插件汇总(史上最全)
  4. HALCON示例程序check_fish_stick_dimension.hdev生鱼棒尺寸测量;基于形态学的像素级精度尺寸测量
  5. (转)代理模式(Proxy)
  6. Zipkin 基于MQ存 储链路信息至 MySQL
  7. Git的下载与安装(详细)
  8. 《Python程序设计实例教程》课后习题参考答案
  9. Linux安装tomcat8
  10. SSM项目实战之博客系统
  11. html鼠标指向上面有尾注,插入脚注和尾注的方法
  12. 为什么是“止于至善”?
  13. Tilera多线程网络编程总结
  14. ElasticSearch:为中文分词器增加对英文的支持(让中文分词器可以处理中英文混合文档)(转)
  15. 【愚人节专场】Java实现定时发送小情话
  16. 【Latex】Latex调整行间距
  17. 逻辑移位和算术移位的区别
  18. OSPF不规则区域的解决方案
  19. Prior Posterior和Likelihood的理解与几种表达方式
  20. VB语音对接验证码短信接口DEMO示例

热门文章

  1. 201521123014 《Java程序设计》第8周学习总结
  2. 数据库-Oracle【Oracle数据库设置默认表空间问题及Oracle,SQL,MySQL的自增变量设置】...
  3. 用多媒体库 Bass.dll 播放 mp3 [15] - 设置与获取播放速度
  4. 1048. Longest String Chain
  5. mysql集群和主从区别_搭建MySQL主从集群,主从复制过程中同步延迟问题
  6. 了解WWW服务与HTTP协议 【入门与应用】
  7. mysql binlog sql统计_mysql的binlog详解
  8. 1-3 交换变量(算法竞赛入门经典)
  9. 2017安徽二级c语言,2017计算机二级C语言测试题及答案
  10. STM32 USB虚拟串口原理(上)