1. 将一些需要变动的配置写在属性文件中
比如, 没有把一些需要并发执行时使用的线程数设置成可在属性文件中配置. 那么你的程序无论在 DEV 环境中, 还是 TEST 环境中, 都可以顺畅无阻地运行, 但是一旦部署在 PROD 上, 把它作为多线程程序处理更大的数据集时, 就会抛出 IOException, 原因也许是线上环境并发造成也许是其他.
如果线程数目可以在属性文件中配置, 那么使它成为一个单线程应用程序就变得十分容易了. 我们不再需要为了解决问题而反复地部署和测试应用了. 这种方法也同样适用于配置 URL, 服务器和端口号等.
这里推荐使用属性文件外化这些配置, 文件格式使用 properties,YAML,hocon,JSON 都可以.
2. 测试中尽可能模拟线上环境
生产过程中一个典型的场景就是只使用 1 到 3 个帐户进行测试, 而这个数量本应是 1000 到 2000 个的.
在做性能测试时, 使用的数据必须是真实并且未经裁剪的. 不贴近真实环境的性能测试, 可能会带来不可预料的性能, 拓展和多线程问题.
3. 对于所有外部调用以及内部服务都要做容错处理
不管是 RPC 调用还是对于第三方服务的调用, 都不能想当然的认为可用性是百分之百的.
不允许出现服务调用超时和重试, 将会对应用程序的稳定性和性能造成不利地影响.
4. 需要提供以下文档
编写单元测试文档并使其拥有良好的代码覆盖率.
高层次的设计图: 描述了所有的组件, 交互和结构.
详细的设计图: 具体到代码层面的设计
系统 map(类似于 site map): 说明系统的所有组成文件, 配置文件等.
5. 做好系统关键功能的监控, 错误恢复, 备份等
对于系统一些至关重要的功能模块要做好对其的监控, 防止其影响系统的运行, 造成不可估算的损失.
另外, 如果可以, 监控到故障后去去试图恢复, 恢复失败再发送告警. 对于一些很重要的数据文件, 还要做到冗余备份, 防止发生一些突然故障造成数据丢失.
6. 数据库设计时设计一些便于追踪历史, 整理的列
比如 created_time,update_time 可以说明记录的创建和更新时间.;created_by,updated_by 可以说明记录是由谁创建和更新的.
此外, 删除记录有时候并非真正删除, 这时需要设计表示此记录状态的列, 如可以取'Y'或'N'的'deleted'列或是可以取'Active'或'Inactive'的'status'列.
7. 制定好项目回滚计划
新的功能上线时, 如果发生故障, 没有一份回滚计划, 那么可能会手忙脚乱. 有一个良好的回顾及计划, 可以让你能够有条不紊的执行相关操作, 将系统恢复到一个可运行的状态.
8. 项目上线前要做好量化分析
对于项目中用到的内存, 数据库, 文件, 缓存等, 要做好量化分析. 预估出未来一段时间的空间占用, 给运维分配机器时一个参考. 防止, 由于数据量增长过快, 导致存储不够.
9. 选择合适的工具 / 技术
很多情况下, 开发者会在生产系统中使用一门想要学习的语言或某种工具. 通常这不是很好的选择. 比如, 为已经实际上是关系型的数据使用 NoSQL 数据库. 不管是语言还是工具, 都有其适用的场景.
10. 在一些关键技术领域具有充足的知识储备.
设计模式, JVM 调优, 多线程 "并发问题", 事务问题, 包括分布式事务, 性能问题, 包括 GC, 计算等, 缓存等等.
来源: http://www.jianshu.com/p/04bd44740c2d