软件开发多是多人协作开发,因此软件开发中的团队协作至关重要。
不管一个人是管理者还是基层工作者,一定要做到彼此相互尊重。大家都是合作者,只是分工不同,没有必要有鸡鸭鹅溜须拍马,阿谀奉承那一套浪费时间。人如果没有得到公正的对待,彼此是不可能站在同一战线,朝同一个目标共同努力。
版本控制是一个伟大的实现,让文件实现可追溯,多人协同更改。有效避免了文件的异常损坏、丢失等。
可以根据不同的队友进行code review,对其编程水平有一个大概的评估。
进行bug定位,对比出现bug的版本变更,可以缩小bug代码的定位范围。
GitHub之类的托管平台,让版本控制变得更加容易、普遍。不再需要搭建版本控制服务器,只需注册就能使用,太划算了。一个人可以从开始学习编程,就把自己写的代码进行版本控制,以备需要的时候复用。
编码规范可以让团队中的成员形成统一的编码风格。统一的编码风格,有利于软件的开发、维护、工作内容切换,还能有效减少bug出现的概率。
避免写出耦合度较大的类,意大利面条式的长方法。在团队中推广设计模式,减少耦合,细化代码。相似的场景,使用统一的解决方案。
if(condition) { return result }
优于
if(condition) return result
有时代码变更会在没有{}的执行语句前/后增加部分执行语句,却没有增加{},导致部分应该在条件为真的执行语句,却不受条件语句的限定。
var success = int.TryParse("1", out number); if (success) { //使用number }
优于
var number = int.Parse("1");
TryParse失败的时候,可以采用给予默认值继续执行。同时可以通过日志记录或者bug收集工具发送给开发者,及时的解决软件的潜在bug,提高软件的健壮性;Parse失败的时候,就会直接抛异常“System.FormatException: '输入字符串的格式不正确。'”,如果调用者没有适当处理,软件就挂掉了。
有TryFoo方法的接口尽可能用,避免一些不必要的异常。其他的比如:
var success = dictionary.TryGetValue(key, out value); if (success) { //使用value }
优于
var value = dictionary[key];
var result = list.FirstOrDefault(); if (result == null) { return; } //使用result
优于
var result = list.First();
如果不对异常处理,要保障异常上抛。像下面这样沉默“吃”掉异常,其中异常引起软件业务逻辑异常不容易定位解决。尤其是在生产环境中,更难定位bug。
try { } catch (Exception) { // ignored } finally { }
在没有把Warning当成Error的代码中,多数存在大量的Warning。Warning要及时的处理掉,避免一些不必要的bug或者性能损耗。整洁的代码有利于成员遵从软件童子军规(让代码比你更改前更干净),避免破窗效应。
持续交付是保证软件能够通过编译,通过单元测试,保持正常运行。
每日构建(Daily build)保证每天都能生成可用的软件包。时时构建是只要周期性检测到代码库有变更就进行构建。当构建失败时,及时通知版本管理者和代码提交者,解决构建失败的问题,保证其他开发者更新代码之后,能正常的编译运行,持续开发。
构建失败最常见的情况是漏传文件,其次是文件冲突。有效的解决方式是提交代码之前,先更新代码,有冲突时,先在本地解决后再提交,可以避免文件冲突。提交代码后,下载一份副本(常保留一份代码更新后测试,减少下载代码的浪费)测试本地能否正常构建,保证自己上传后软件能正常构建,如发现漏传文件,及时补传文件。
软件开发中的任务,很多时候是有交叉的,可做可不做的时候,尽量主动承担。耍一些小聪明把任务推给队友,自己跑去喝下午茶,悠哉悠哉。次数多了,队友也这么干的话,最终就是相互推诿。