- 起因
现在很多公司的普遍的开发过程是这样的,开发部老大安排了任务,项目负责人组织人手归纳整理需求,功能分析、功能流程文档做出来后,就交给开发人员进行开发了,开发部的老大认为自己在架构设计上已经很成熟、开发人员配置得很完善,有开发人员、测试人员,但是开发过程中仍然觉得进度慢,测试经常出现问题,程序部署之后出现更多无法预测的问题,这是什么原因呢?
- 归纳
功能逻辑设计完成后,就交给开发人员,认为开发人员只是写代码就可以了,写代码的人使用刚毕业的新生来做不可以吗?这样可以节省开发费用吖!!这是很多公司的普遍做法,嘿嘿!!但这是一个非常严重的陷井
- 论述
★第一个例子:抢活动的机制(程序处理流程问题)
问题一:何时把活动信息放入Redis中呢?
方式一:在活动创建之后就放入Redis
方式二:在活动开始前5分钟内把活动数据放入Redis
第一种方式代码简单,但是对Redis的使用相当"暴力",会占用比较大的空间
第二种方式需要创建一个定时任务,代码会复杂一些,但是可以大大减少Redis的负载量
这两个不同的处理机制会导致测试人员做自动化测试时流程完全不同,就是说一个已经成型而且成熟的功能逻辑设计会导致完全不同的程序逻辑设计,然后又引发了测试流程的不同。
有时在这个阶段测试人员有可能会觉察出问题所在,但是测试人没不是设计人员,他们提出的功能修改意见开发人员会听吗?这又引发了第二个问题:开发流程的管理问题,测试人员如何在程序设计阶段起到作用呢?还是在程序做出来之后,测试人员才介入,这样会不会造成设计思路错误时,引起的重复工作和沟通困难呢?这个成本可大了去喽。
问题二:当用户进行抢操作时,后台如果处理共享资源占用的问题呢?
方式一:再使用自旋
方式二:用多线程阻塞
方式三:使用Redis锁
有谁可以说这几种方式的差别在哪里吗?
使用自旋会导致CPU无谓的消耗,带出一个附加问题:循环等待的时间间隔是多长呢?还是不停的循环检测锁状态?还是把时间间隔放在配置中?这些涉生出来的问题还真不是程序小工能仔细分析得透彻的。
很多开发语言支持多线程阻塞,只需要在进入共享资源的入口做一个锁即可,即使语言本身不支持,也会有第三方库支持或者自己弄一个语言插件进行扩展即可,像PHP,使用多线程的锁机制可以大大减少CPU的占用量,这个方式可能很多人都忘记了吧?
使用Redis锁可以在将来进行扩展时使用Redis分布式锁的特性,这个非常重要
严格来说,很多系统使用人数并非很多的情况下,这几种情况都是可以使用的,而且对系统整体来说影响不太大,但是很多情况下,业务会比这个复杂一些,测试也更复杂一些, 隐藏的问题可能会更难以处理
问题三:放在Redis中的过期活动是活动结束马上过期还是放到一段时间之后再释放,这个问题似乎解决起来非常简单,但是这个不同的机制会引起测试人员检查工作的内容不同,要检查Redis中的活动数据何时释放,这个可是有点工作量的哦
★第二个例子(程序结构问题)
现在的开发框架一般会在后台分几个层来处理不同的事情:respositoty层用来处理业务逻辑、dao层用来处理数据逻辑,model用来与数据库交互,这个习惯非常不错,虽然在开始的时候有些麻烦,但是后期对于代码的完善是非常有帮助的
其实很多情况下,业务会相对复杂,业务对象的封装结构不完善、开发部不重视,会使得测试与部署后的意外情况无法预测
刚才给大家一个引子,现在讨论第二个例子
活动数据本身已经有respositoty对象了,抢操作是放在活动respositoty中还是另外建一个respositoty呢?对于这个问题不要不以为意,这个对测试人员创建自动化测试模块影响非常大,接口完全不同了。
成熟的开发人员会建立第二个respositoty对象,很多情况下,业务情况会比第二个例子中的要复杂得多,程序结构要求更高,测试更复杂,这些情况更需要完善的程序设计
- 总结
解决方法一:做好程序结构设计和功能逻辑设计(这两个任务不需要分先后,他们会互相影响的)。
解决方法二:安排成熟的开发人员进行程序结构设计与流程设计(不是业务逻辑、功能设计哦)
程序设计这个阶段使用UML来做文档是非常好的习惯
附两个展示的文档,这是一个非常简单的小系统,但实际上需要完成的文档却是非常多的:
友邻分享系统需求分析报告
友邻分享系统设计
手机端网站:友邻分享
其实文档还有很多地方需要完善的,想要进一步沟通的朋友请联系
QQ:517409926
微信:rolkey