软件开发流程
2017-05-21 01:06
204 查看
1.明确需求
2.讨论制作产品原型(https://modao.cc,https://www.axure.com)
3.美工根据产品原型制作UI
4.前后端根据产品原型确定网络接口并制定网络数据传输协议(较多都是json,需要确定的是字段),写接口文档
5.前后端根据业务需要指定对应的数据对象,设计数据库
6.前后端各自编码,编码过程要指定规范文件目录,每个人的文件须放到对应的目录下,同时用git进行多人合作版本控制,个人进行编码时也要注意对自己代码进行测试并整合后才能上传到git,提出pull request请求,然后测试人员进行测试,并且其他人进行了代码审查之后方能合并到git
7.前后端分别进行单元测试和集成测试,最好是边编码边测试,每次改了代码都重新跑测试
8.前后端接口联调,后端进行并发测试
注意点:
判错从最开始就做到位;
只要返回err,检查!参数,检查!错误,一定返回并且写日志!
变量不能随便缩写,遵循行业规范;
变量命名,见名知意;
同一个包里面不要放太多文件(代码量不要太大),否则编辑器会很卡(代码补全搜索起来太慢),当大到一定程度时要考虑包重构,分包
善用搜索替换,包括但文件内搜索和整个项目文件的搜索,比如某些地方是模板式的,要改的时候就可以利用全局搜索替换,文件数比较多的话一个个改会非常耗费时间
Go:
defer 在return后处理错误 记得判了err之后再defer close,因为err后会返回nil
channel 实现消息分发
go routine
SQL语句要prepare,不然会被注入攻击
SQL如果要用事务要使用长事务,否则尽量使用SQL存储过程或函数,因为事务较慢
接口问题:
数据较多时要进行分页,一次返回数据尽量不要超过50条;
数据太大就写文件,然后发文件;
logs
经常修改的参数放到.config文件读入,不用每次都改代码 ,这样编译出来的可执行程序也可以随时改配置
SQL文件夹放置个人封的sql包,Network文件夹放网络接口代码,public文件夹放返回给前端的文件
2.讨论制作产品原型(https://modao.cc,https://www.axure.com)
3.美工根据产品原型制作UI
4.前后端根据产品原型确定网络接口并制定网络数据传输协议(较多都是json,需要确定的是字段),写接口文档
5.前后端根据业务需要指定对应的数据对象,设计数据库
6.前后端各自编码,编码过程要指定规范文件目录,每个人的文件须放到对应的目录下,同时用git进行多人合作版本控制,个人进行编码时也要注意对自己代码进行测试并整合后才能上传到git,提出pull request请求,然后测试人员进行测试,并且其他人进行了代码审查之后方能合并到git
7.前后端分别进行单元测试和集成测试,最好是边编码边测试,每次改了代码都重新跑测试
8.前后端接口联调,后端进行并发测试
注意点:
判错从最开始就做到位;
只要返回err,检查!参数,检查!错误,一定返回并且写日志!
变量不能随便缩写,遵循行业规范;
变量命名,见名知意;
同一个包里面不要放太多文件(代码量不要太大),否则编辑器会很卡(代码补全搜索起来太慢),当大到一定程度时要考虑包重构,分包
善用搜索替换,包括但文件内搜索和整个项目文件的搜索,比如某些地方是模板式的,要改的时候就可以利用全局搜索替换,文件数比较多的话一个个改会非常耗费时间
Go:
defer 在return后处理错误 记得判了err之后再defer close,因为err后会返回nil
channel 实现消息分发
go routine
SQL语句要prepare,不然会被注入攻击
SQL如果要用事务要使用长事务,否则尽量使用SQL存储过程或函数,因为事务较慢
接口问题:
数据较多时要进行分页,一次返回数据尽量不要超过50条;
数据太大就写文件,然后发文件;
package logs import ( "fmt" "runtime/debug" "strings" ) var debugMode = true // Print 打印调用此函数的外层函数的文件和行号信息 // // -- parent's parent func // | // -- parent func //打印这个函数的信息 // | // -- PrintParent // func SetMode(mode bool) { debugMode = mode } func Print(args ...interface{}) { if !debugMode { fmt.Println(args...) return } stack := string(debug.Stack()) stackLines := strings.Split(stack, "\n") debugLine := strings.SplitAfter(stackLines[6], "/") debugInfo := debugLine[len(debugLine)-1] debugInfo = debugInfo[:len(debugInfo)-6] a := []interface{}{debugInfo + ":"} a = append(a, args...) fmt.Println(a...) } // PrintParent 打印调用此函数的外层函数的外层函数的文件和行号信息 // // -- parent's parent func //打印这个函数的信息 // | // -- parent func // | // -- PrintParent // // 注意:main调用此函数,程序会崩溃! func PrintParent(args ...interface{}) { if !debugMode { fmt.Println(args...) return } stack := string(debug.Stack()) stackLines := strings.Split(stack, "\n") debugLine := strings.SplitAfter(stackLines[8], "/") debugInfo := debugLine[len(debugLine)-1] debugInfo = debugInfo[:len(debugInfo)-6] a := []interface{}{debugInfo + ":"} a = append(a, args...) fmt.Println(a...) }
logs
经常修改的参数放到.config文件读入,不用每次都改代码 ,这样编译出来的可执行程序也可以随时改配置
SQL文件夹放置个人封的sql包,Network文件夹放网络接口代码,public文件夹放返回给前端的文件