基本开发情况
两人60天输出有效代码行15k,基本实现需求。
经验
1、学会使用开发工具
在项目中使用了MyBatis框架,可以使用MyBatis Generator生成基础MyBatis代码,节省开发时间。同时合理利用IDEA插件可以提升开发效率。
2、合理设计工程目录结构
工程结构严格按照controller/service/dao层进行封装,保证controller层简洁性,dao层只做基本数据库操作,不使用sql进行复杂逻辑,service层写具体业务逻辑。
1)合理的项目结构,方便后期维护,随着代码量的增加,这种优势会越来越明显,因此在代码设计初期,首先要重视工程结构;
2)除了上面的三层结构,一般还需要构造vo/common/exception/utils等层次,用于方便开发和管理
在common包中可以定义诸如统一响应,全局常量
在exception中定义需要处理的业务异常,可以使用@ExceptionHandler 对异常统一处理
utils可以定义一些工具,如时间操作、字符操作
3、合理的数据库设计
需要权衡表的数量与业务场景,既要考虑设计尽量少的表,方便维护,又要考虑业务场景,便于代码书写。
1)不能一味追求表数量尽量少,这样可能导致代码处理很复杂
2)也不能为了代码书写方便,随意增加表,这样会导致字段重复以及数据库维护的复杂性
3)每张表都应该包括如下5个字段,软删除标识 deleted 创建人 createdBy 创建时间 createdAt 更新人 updatedBy 更新时间 updatedAt (用于排序,保证前台展示顺序),在代码中可以写一个父类包含这几个属性,其他VO可以都直接继承该父类。同时由于软删除标志deleted的存在,所有查询语句都要加上deleted = 0这个条件来过滤有效数据(0表示未删除)。
4、代码规范性
1)类文件使用统一前缀,便于阅读,类名、方法名、变量名遵循业界统计的命名规范即可,如驼峰命名法
2)注释的合理性,复杂的代码逻辑需要有注释,便于后期优化;
3)日志的合理性,要区分debug info error级别的使用场景,同时使用占位符方式打日志不要使用加号,便于提升代码性能。
4)冗余代码清理,随着业务的复杂性增加,可能需要对原有方法进行修改甚至废弃,要及时清理无用代码以及即时修改或清理注释,错误的注释不如没有注释。
5)合理的代码返回,在上面我们讲过要在common包可以定义统一的响应体包括 data 数据 message 消息 state 状态,同时要注意在接口返回前对所有异常进行统一处理,不要让异常抛到请求方,否则可能出现Feign调用后,解析响应异常(无法对null或不符合json格式的字符串进行反序列化,报错,导致接口调用失败)
5、文档规范性
1)输出了API文档,与PC端、APP端以及H5页面同步做项目时,需要以文档为准,一是方便前端人员开发,二是便于后期维护;
2)输出了数据库文档,便于后期维护
不足
1、开发工具不统一
由于本次开发是两个人合作开发,但是由于习惯性问题,一个使用IDEA,一个使用Eclipse,在开发过程中多次因为环境问题浪费开发时间
改进措施:
1)合作开发的所有人应该统一开发工具,避免浪费精力在调试开发环境上
2、代码设计不充分
时间仓促导致代码结构设计没有足够时间,代码没有充分考虑性能,同时没有输出代码设计文档。
本次开发客观原因是开发时间较短,应该遵循开发的周期及合理性,不应该盲目追求速度,这样会给后期增加很大的维护成本。主观原因是,开发经验不足,在开发中还需要不断查询一些开发知识,导致开发效率不高。
在开发过程中由于只追求实现业务功能,同时需求规格说明不详细,导致在代码中的异常处理不充分,很多异常场景没有统一的处理措施,没有相应的错误码,导致在调试时耗费了大量时间定位问题。
改进措施:
1)应该提升自身基本开发能力,同时提高沟通能力,合理地将开发中比较耗费人力的地方与业务进行沟通,达成共识。
2)学习代码设计知识并予以实践,积累开发能力。
3)在开发代码前与业务沟通好各种异常的错误码以及返回的错误信息,同时在代码中各种异常都需要以及error级别打印日志,便于定位问题。
4)对已有代码进行优化,走读代码增加注释、在适当位置打日志、对异常场景进行处理
3、数据库知识缺乏
在设计数据库时没有充分考虑Oracle数据库的特性。
在使用MyBatis只考虑了如使用子查询提升查询效率等基本的数据库能力,提高性能。
但是由于数据库知识匮乏,也犯了一些低级错误,如使用了关键字当了字段名。
改进措施:
1)系统学习数据库知识,在设计时,避免低级错误
2)学会数据库调优
4、测试依赖于测试人员
由于对整个系统没有系统的认识,在自测试期间需要造一些基础数据过于依赖测试人员。
改进措施:
1)提升对系统的端到端能力培养,同时输出指导文档
2)提供测试数据自动化脚本,测试时,直接一键执行,可以完成基础数据的构造,节省时间,让开发人员能够聚焦开发的业务场景