跳到主要内容

接了个小活,报价的时候踩的坑

可乐不卖课
可乐不卖课

· 阅读约 4 分钟

先说清楚,这篇不是教学,就是昨晚刚从坑里爬出来,趁记得赶紧记一下。

活是朋友的朋友介绍的,一个小程序页面改版加后台联调。需求说出来很简单,原话我记得特别清楚:"就一个报名页面,能填表、能导出名单就行。"

我去看他们的旧版——就是一个H5加一个管理后台。页面长得很80年代,数据存在一个线上表格里,导出是靠人肉复制粘贴。对方说想要个"正式一点的样子",别的没要求。

我当时怎么报价的呢?嘴上说"我先看看,不用急",脑子里其实已经在想能不能3000块拿下来。最后报了3500,交期两周。截图发出去那一刻我就觉得报低了,打住,不是觉得,是我知道自己省了哪一步。

我没细问。

结果就是活开始以后,一个上午搞清楚了需求,到了下午我开始改目录再安装环境——那边发来一份十七页的word文档,标题叫《后台功能细则》。十七页,有插画。

里面大概有:报名表单要按票种区分,票种有五种,每个票种有单独的库存和限购逻辑;导出的时候要能按票种筛选、按时间筛选、按支付状态筛选;支付状态分三种,"待支付"的每二十分钟自动取消,但取消名额不能立刻释放,要等管理员确认;管理员有时候不想让某个人报名成功,需要在后台手动拉黑,拉黑后这个人看到的状态是"已满",不是"已取消"。

我盯着"手动拉黑"那一节看了半天,觉得"已满"这个说法还挺人性化,这客户以前大概被恶意抢过票。

行吧,加到整单报价里那是不可能的了。我跟朋友抱怨了两句,他转了个红包过来说是介绍费辛苦费什么的——这个不细说。

说句实话,如果3500是一把锁,我拿钥匙拧了第一下就发现锁芯是换过的。最好的止损点是那个下午,立刻停下来重新报个价,或者至少说清楚需求变了我得加点钱。但我当时做了什么呢,我翻了翻那份文档,觉得"其实也还好",每个功能单独拎出来都是现成的组件,改改参数就行。

掉坑不是从功能难开始的,是从"都能做"开始的。这句话是我当年卖课的时候讲给别人听的,自己听进去的时候晚了好几年。

后来的事情就很无聊且标准了:全都能做,就是全都不是改改参数就行。票种库存要写个定时脚本去关,导出筛选在前端实现完以后发现"待支付"的判定要跟订单表做联查,联查就查出性能问题了,数据从第一天上线就有增量,有一张三年前的测试表也混在里面,还是主键重复的那种。

真正让那天崩掉的报错是这个,直说了吧:Fatal error: Allowed memory size of 134217728 bytes exhausted。内存不够了,导出八千人的名单,PHP的数组直接炸了。我当时看到这个报错的第一反应不是难受,是释然——终于有个具体的、能查文档的、不用跟人解释"这个需求跟昨天说的不太一样"的错误了。不是嘲讽,是真实感受。

昨天上线,今天交付收尾款,对方很爽快,还多给了两百块说是请喝咖啡。我收了,说了声谢,没有更多的对话了。

这笔账算下来,我的时薪大概相当于我在上个公司当杂工的水平。但学到的东西是实在的:报价里面除了开发时间,还要留一行,写"需求变更"——哪怕你只在脑子里给这行留个零点五的系数。

说句实话,当年卖课的时候教人接私活,模板里有一条叫"任何需求变更都要重新报价",讲得头头是道的。自己接的时候照样往里跳,菜就是菜,跟你卖没卖过课没关系。就说到这。

可乐不卖课
可乐不卖课

前技术博主,翻过车。现在只写干货,不带货,别问。

查看主页 →