封版战斗札记项目从早期不断迭代
Posted xinxi2010
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封版战斗札记项目从早期不断迭代相关的知识,希望对你有一定的参考价值。
封版战斗札记项目从早期不断迭代,到最近临近交付客户。有很多值得反思和记忆的故事,我明显感受到了自己的成长,也明白了产品、研发的重要。
昨晚是封版本的最后一晚,一直加班到了凌晨2点。从晚上开会到不断修复紧急bug,每个小伙伴们都绷紧了神经,全力以赴地验证所有的case。最终还是如期交付,但值得思考的问题不少。如果我不写下这些,我怕忙碌会把这些经验湮没。
1. 需求是产品之源,必须深刻理解。
如果有不清楚的地方,在开发之初就应该提出疑问,通过一次一次产品研讨,弄清楚所有逻辑。
打个比方,一款银行理财产品,用户下单购买该产品后,进行作废订单,到底如何处理库存和销量等等。这些看起来简单的问题,对不同的用户可能选择不同。有的银行认为销量是需要计算真正成交的订单数,如果作废,则需要从总销量里面去掉被作废的。有的银行则认为只要成交过,那么就持续累积。
对于研发工程师,对于这些可以有自己的见解,但不能直接替客户做选择。倾听客户的真正的心声,才能实现真正有价值且符合需求的功能和产品。
2. 全局检查,深入所有逻辑分支
不得不相信一句话:任何可能出现的问题的地方,都有可能出现问题。所以每次修复bug的时候,一定要从全局去思考,是否有关联性的逻辑已经检查了,确保算无遗策。
3. 学会跳出常规思路去用产品
在使用产品进行测试的时候,我们不能只想着怎么正常用这个产品,而是要尽量从各种情况去玩整个系统。摆脱一种产品标准使用方式的思维定势,像折腾手办一样,把它扭成一个意想不到的形状和方向,然后看它还能否正常还原。如果只是顺着期待的结果去准备数据,去测试常规的case,我们很难真正了解一个产品的潜在问题。就像如果一直不敢下水,虽然不会被淹死,但是很难真正学会拥有。
4. debug也是需要准备的
之前老板就提醒过几次,准备好一些query和一些排查工具,方便在最终测试里面遇到问题的时候能快速排查数据。我对我们开发的系统过于自信了,并没有专门准备query。在连续发现一些异常数据的时候,临时再去写sql,有些慌忙。提前准备能让自己更从容,也能更快定位问题,减少不必要的debug时间。
项目目录札记附:config.json
config.json:基础配置文件
/* 该文件用于生产环境,不要轻易修改该文件,请修改development.json,修改相应的端口或配置*/ { /* begin 添加特殊的配置到里面,比如mongo*/ // "mongoConfig": { // "host": "mongoDb", // "database": "xxx" // }, /* end */ "restify": "http://restSE:8080", "restifySec": "http://countSE:8080", "cacheDir": "path:./cache", "mongoConfig": { "host": "mongoDb", "database": "rbac" //修改 }, "log4jsConfig": "path:./config/log4js.json", "envYHCG":"finance",//银行存管 "express": { "view engine": "ejs", "view cache": true, "views": "path:./site/views" }, "qiniuConfig": { "ACCESS_KEY": "H51ZLbLGMEBOL0Ut56CI7ZOPsOiE3lkWdriXawr6", "SECRET_KEY": "Sf-Y_OzfCKtQCUgYZQ7AKTB0x8YsCkqb5ZYSXHIE", "bucketname": "epb-pc" }, "view engines": { "ejs": { "module": "ejs", "renderer": "renderFile" } }, "middleware": { "static": { "module": { "arguments": ["path:./public"] } }, "favicon": { "module": { "arguments": ["path:./public/favicon.ico"] } }, "logger": { "enabled": false }, "log4js": { "enabled": true, "priority": 51, "module": { "name": "kraken-middleware/lib/log-mid", "arguments": [{ "category": "http", "level": "auto" }] } }, "cookieParser": { "module": { "arguments": ["6de5191ab3c401bcb266dff913"] } }, "session": { "enabled": true, "priority": 100, "module": { "name": "kraken-middleware/lib/redis-session", "arguments": [{ "secret": "6de5191ab3c401bcb266dff913", "cookie": { "path": "/", "httpOnly": true, "maxAge": 1800000 }, "resave": true, "rolling":true, "saveUninitialized": true }, { "host": "redisDb", "port": 6379 }] } }, "appsec": { "enabled": true, "priority": 110, "module": { "name": "lusca", "arguments": [{ "csrf": true, "xframe": "SAMEORIGIN", "p3p": false, "csp": false }] } }, "switchOption": { "enabled": true, "priority": 119, "module": { "name": "kraken-middleware/lib/switch", "arguments": [{}] } }, "router": { "enabled": true, "priority": 120, "module": { "arguments": [{ "directory": "path:./controllers" }] } }, "fileNotFound": { "enabled": true, "priority": 130, "module": { "name": "kraken-js/middleware/404", "arguments": ["error/404"] } }, "serverError": { "enabled": true, "priority": 140, "module": { "name": "kraken-js/middleware/500", "arguments": ["error/500"] } } } }
以上是关于封版战斗札记项目从早期不断迭代的主要内容,如果未能解决你的问题,请参考以下文章
Python札记5:__init__函数和__new__函数