【软件工程】提问回顾与个人总结
作业介绍
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2019春季计算机学院软件工程(罗杰)(北京航空航天大学) |
作业要求介绍 | 提问回顾与个人总结 |
一、提出问题的博客
【软件工程】第1次个人作业
二、对之前提出问题的解答
1. 第1章 1.2.2节:
Build To Learn:开发软件,构建系统的目的是做进一步的试验,试图发现客观规律或探求某方法的优劣。这些项目经常是科研论文的基础工作。
在科研论文的工作中,经常需要编写一些程序来对这些算法进行实现或对某个真实的场景进行模拟,在论文完成之后,这行程序很大可能就不会再使用了,那么这些程序还需要严格按照软件工程的一般方法和过程进行开发吗?
通过自己的一些实践认识到,不管是仅仅用于科研目的或是要投入使用,开发任何一个软件工程项目都需要遵循软件开发的一般方法和过程。一方面这些软件的开发过程往往会涉及多人合作开发,另一方面这些开发的过程和成果也会成为后续进一步研究的基础,所以遵循软件开发的一般方法和过程是十分必要的。
2. 第4章 4.3.2节:
函数最好有单一的出口,为了达到这一目的,可以使用goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用,包括goto。
适度使用goto语句确实有助于程序逻辑的清晰体现, 但也容易使程序的可读性变差,使分析和验证程序正确性(特别是涉及循环)的任务变得复杂。在实际编程中,这种“适度”该如何把控?
从实际的开发中可以看到,许多事情都不是非此即彼的,goto语句的使用也是如此,既不能绝对禁止,也不能过度使用,一种比较适合的使用情况是在程序中包括多重复杂的循环和分支时,在内层循环使用少量的goto语句迅速定位到目标位置,不仅不会使程序的可读性变差,反而有助于增加代码的可读性。
3. 第4章 4.5.2节:
在结对编程模式下,一对程序员肩并肩、平等地、互补地进行开发工作。他们并排坐在一台电脑前,面对同一个显示器,使用同一个键盘、同一个鼠标一起工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起做单元测试,一起做集成测试,一起写文档等。
虽然两人合作可能在一定程度上更有助于保证软件开发的质量,但是这种坐在一起共用一台电脑的行为是否显得过于极端?这样真的不会降低编程效率?
我认为结对编程更多强调的是一种敏捷开发的方式和理念,在实际的开发中还要根据实际的情况进行调整,任何行为不管是否极端,只要能够增加开发效率、简化开发流程就是有益的。
4. 第9章 9.1节:
Program Manager:微软的职位名称。微软产品团队三足鼎立的角色分配就是PM、开发、测试。PM负责除产品开发和测试之外的所有事情。从某种意义上说,是前面两种角色的综合。
在实际开发中,PM和开发、测试人员负责的工作类型有很大的不同,三者如何才能保持这种三足鼎立的平衡关系?如何避免“程序员暴打产品经理”这种事件的发生?
在实际开发中,要想保证一个团队能够进行和谐和高效的开发,首先PM的作用是至关重要的,PM不仅明需要确开发目标,分发任务,更需要在团队开发的各个阶段与团队成员进行充分的沟通和交流,在开发过程中发生任何问题都要能够及时解决,当然开发和测试人员也应该时时交流进度,做好code review,而且主要的测试工作最好由对应的开发人员进行。
5. 第16章 16.5节:
一些人士批评“很多企业还处于手工式的开发生产阶段”,我不知道软件除了用手工,还可以用什么别的来写。也许有人说,是不是那些CASE(ComputerAided Software Engineering)工具,或者是代码向导(Code Wizard),用右键一点,然后继续点[下一步]、[下一步]就可以产生出很多很多代码?这些固然好,但是你可以点一下产生很多代码,另一个公司也可以点一下产生很多同样的代码。你的核心技术在哪里呢?
一个软件的核心技术必须通过手写的代码来体现吗?如果存在一个可以根据算法的思路或者流程自动生成具体代码的工具,那么核心技术是否体现在算法的设计层面而非具体的实现?
就目前而言还不存在足够强大和便捷的可以根据算法的思路或者流程自动生成具体代码的工具,所以一个软件的核心还是需要通过具体的代码来实现。但是,目前开源已经成为互联网发展的一种趋势,越来越多的软件通过服务而不是软件本身来盈利,所以我认为许多软件真正的核心技术在于所提供的服务层面而不是软件本身。
三、在软件工程实践中学到的知识点
需求阶段
需求分析虽然是软件开发的起始阶段,但我认为这是软件开发中最重要的阶段。需求分析是否科学、合理,是否能够真正定位目标用户并反映目标用户的切实需求,是决定一个软件能不能成功,能拥有多少用户量的最关键的因素。所以我们需要在需求分析阶段,认真寻找目标用户,通过问卷等各种形式进行大量而全面的用户调查,认真分析调查结果,得出具体的需求。
设计阶段
一个好的设计可以为后续的开发、测试、维护等阶段带来极大的便利。尤其是对于前后端协同开发的软件项目,在设计阶段设计好详细的接口规范,包括接口的名称、参数名、参数类型、返回值名称、返回值类型、不同错误码的含义、各个参数的合法性检查条件等等,这能够为开发阶段免去许多不必要的沟通工作。对于前端开发,在具体的编码实现之前使用一些工具进行UI的设计也是十分必要的。
实现阶段
软件的实现阶段相对于前两个阶段来说就显得不那么重要了,但在开发的时候也要注意严格遵守代码规范和其他约定好的开发流程规范如git的使用规范等。在开发的过程中一定会遇到许多不可预知的问题,这时善用搜索引擎是最好的解决办法,实在不行也不要吝于向他人求助。
测试阶段
测试阶段是不能缺少的。不管开发实现的过程多么严谨,总会存在一些被疏忽的问题。一定要进行完整和全面的测试既需要对新的代码进行单元测试,对已有代码进行回归测试,也要注意让实际的用户通过使用进行测试,发现问题,提出建议。在产品投入实用前,进行完备的压力测试也是十分必要的。
发布阶段
发布阶段需要通过各种渠道进行宣传,无论产品做得多么完善,没有足够的宣传都是没办法吸引到用户的。在宣传阶段要注重用户体验,及时接受用户的反馈,这样可以快速定位到产品现有的不足,将其作为下一阶段迭代开发的目标。
维护阶段
维护阶段也需要注重用户的反馈,可以根据反馈进行一些小的功能修复和改进,同时要做好服务器和数据库的日常维护工作,确保产品的功能正常。
四、理解与心得
结对编程
结对编程的核心在于效率,而为了充分提高效率,结对开发的两个人最好还是要面对面,这样遇到任何问题都能非常及时高效地沟通和解决,在结对的二人进行交接时也能尽量减少不必要的沟通。
团队编程
团队编程时期我主要负责后端的相关工作,但是前端与后端绝不是孤立的,在开发之前虽然已经设计了比较详细的接口规范,但是开发过程中还是需要根据实际情况以及前端的具体需求进行一些细微的调整,这个过程也需要前后端进行及时的沟通。
团队的编程工作也是一个综合性的工作,需要我们掌握多方面的技术和能力,尤其是团队协作的精神和能力。既然是团队开发就要严格遵守约定好的开发规范和软件开发流程,团队的磨合中不可避免地会遇到许多问题,但是遇到问题要及时沟通,及时解决,切不能得过且过,敷衍了事。
最后,感谢课程老师和助教整个过程的耐心指导和答疑,也感谢共同合作过的每一个同学,希望软件工程课程能够越来越好,继续造福下一届学子。