封版战斗札记项目从早期不断迭代

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"]
            }
        }
    }
}

 

以上是关于封版战斗札记项目从早期不断迭代的主要内容,如果未能解决你的问题,请参考以下文章

产品札记:10种原则帮你更顺利地打造优秀产品

Python札记5:__init__函数和__new__函数

项目目录札记

《JavaScript设计模式》札记

UML和模式应用5:细化阶段(7)---从需求到设计迭代进化

项目目录札记附:config.json