程序员也要学会说不:我在项目中与产品经理的“战争”和和解

萧秀英
2025-06-13 13:11
阅读 582

引言:为什么这个问题值得聊聊?

引言:为什么这个问题值得聊聊?

我是一个做了十年的后端工程师,从最初的单机Web应用开发到现在参与高并发微服务系统设计,经历了不少“人”和“事”。要说在职业成长路上,最难缠、最让人头疼的角色之一,非产品经理莫属。

不是因为他们不好,而是因为我们的目标和思维方式常常不在一个频道上。很多时候,他们的需求看起来“理所当然”,但我们做技术的人心里清楚——这些需求背后,可能是一次次架构重构、性能优化甚至数据迁移的噩梦。

今天我想聊聊,程序员如何在尊重产品方向的前提下,勇敢地对不合理的需求说“不”,并在这个过程中建立起真正有效的协作关系。这不仅是一种技术能力的体现,更是一种软技能的成长。

这不是鸡汤,而是在多个真实项目中摔过跟头、踩过坑后的血泪经验。


问题描述:一场因“一句话”引发的灾难

问题描述:一场因“一句话”引发的灾难

负载均衡配置-2

时间回到2019年底,我当时在一家做B2B SaaS的公司负责订单系统的重构工作。我们原有的订单流程已经使用多年,功能稳定但扩展性极差。于是公司决定启动一次全面的技术升级计划,引入微服务架构,并对原有数据库进行拆分重构。

就在这个节骨眼上,产品经理突然提出了一个新需求:

“能不能在订单生成时,把用户的历史购买记录同步展示出来?这样销售在确认订单的时候会更有判断依据。”

听起来是不是很简单?就是一个简单的“显示历史订单”的需求嘛。但当你作为架构师来评估这个需求时,事情就不那么简单了。

需求背后的挑战

  • 历史订单存储分散:用户的订单分布在多个业务库中(订单服务、会员服务、财务服务各自维护一部分)
  • 系统间依赖复杂:要聚合历史订单,就需要跨服务调用,这在微服务架构中意味着延迟风险
  • 权限控制麻烦:销售看到的“历史记录”必须经过严格的访问控制,不能越权查看
  • 实时性要求模糊:到底是要准实时还是可以接受一定延时?没说明白,容易做成性能瓶颈

我当时的第一个反应是:“这个需求不该在当前阶段实现。”但我没有直接说“不行”,而是花了一天时间整理了一份影响分析文档,给团队负责人汇报后,决定找产品经理沟通。


解决方案:不只是说不,而是给出更好的选择

服务器部署方案-1

解决方案:不只是说不,而是给出更好的选择

很多程序员面对产品提需求的第一反应就是“又来了”或者“怎么这么简单都不懂”。但真正的高手不是靠情绪解决问题的,而是提供替代方案,让对方感受到你是在“共同推进”。

我和产品经理进行了三次沟通,最终达成以下共识:

1. 把核心需求抽象为“上下文信息辅助决策”

不是所有历史订单都要展示,只需要最近一段时间内的有效订单,比如3个月内的成交记录,而且只看自己管理客户的订单。

这个调整大幅降低了数据获取范围,也减少了权限校验逻辑的复杂度。

2. 引入异步日志+ES搜索机制

我们并没有直接去调多个服务接口,而是通过埋点收集用户的下单行为日志,写入Elasticsearch,前端再通过用户ID + 时间范围查询历史订单摘要。

这样做有几个好处:

  • 减少跨服务调用带来的链路延迟
  • 提供一定的搜索和聚合能力
  • 可以灵活设置缓存策略

3. 增加“轻量型历史订单服务”

为了后续复用价值,我们抽离出一个小模块,用于处理这类辅助型的数据请求。这个服务不参与核心交易流程,属于边缘服务,但也足够支撑未来类似场景的快速迭代。

技术细节上的小贴士

  • 数据写入采用Kafka异步推送,避免阻塞主流程
  • Elasticsearch索引结构设计为按 user_id + order_time 做复合分片,提高命中率
  • 接口返回字段尽量压缩,只返回关键字段如订单号、金额、状态等
  • 权限校验放在查询前,通过RBAC机制确保安全

整个实现过程花了不到两周时间,上线后也平稳运行至今。


效果总结:一次拒绝,换来更健康的协作方式

效果总结:一次拒绝,换来更健康的协作方式

这次“对抗”之后,反而让我们建立了更好的信任基础。产品经理后来不止一次对我说:“你们真的不是在抗拒变化,而是在考虑怎么做得更好。”

从那以后,他在提需求时也会主动问一句:

“这个改动会不会太大?有没有什么我可以调整的地方?”

这种转变让我意识到:说不的意义,不是拒绝,而是引导。

更重要的是,我们在不影响整体进度的前提下,找到了一种更健康、更可持续的技术实现路径。


经验分享:如何优雅地说“不”

结合这些年的工作经验,我想给同行们几点建议:

1. 不要立刻说“不能做”,而是先问“为什么”

产品提出的每一个需求,背后都有其业务逻辑。你可能听不懂他说的理由,但不代表他的理由不存在。先倾听、再质疑。

举个例子:

Product Manager: 我需要在商品详情页展示最近一周的销量曲线。
Developer: 这个曲线的颗粒度是多少?是按小时还是按天?是总销量还是去重数?

多问几个问题,你会发现有些需求其实没那么刚性。


2. 学会量化影响,用数据说服别人

产品经常站在用户体验的角度考虑问题,而我们则要考虑系统负载、运维成本、数据一致性等等。你可以试着把这些技术影响转化为产品能理解的成本模型。

比如:

“这个功能如果现在加上,会导致API响应时间增加40ms,QPS下降15%,可能影响首页加载速度。”

他们听得懂这些指标,也会重新思考优先级。


3. 给出替代方案,而不是只说不行

这是最重要的原则之一。永远不要只说“这个做不了”,而是尝试提出一个折中的版本。

比如:

  • 降低数据精度
  • 缩短时间窗口
  • 改为异步展示或降级展示

这会让你的产品经理觉得你在配合他一起解决问题,而不是挡在他面前。


4. 建立“技术债意识”,敢于延迟满足

有时候你不是反对某个功能本身,而是反对它在当前阶段出现。

这个时候可以说:

“这个功能我们可以在X阶段支持,但现在加入会导致Y模块稳定性受影响。”

只要你的理由清晰、有条理,大多数产品经理都是愿意配合的。


5. 技术视角要有前瞻性

产品往往关注短期收益,而我们要考虑长期维护。比如:

  • 多个需求叠加之后的接口膨胀
  • 某个设计是否适合未来迁移
  • 是否会造成数据孤岛或重复建设

这些都是我们需要在早期预见到的风险。


6. 在代码之外,构建可沟通的边界

有一次我在评审会上明确画出了三个区:

区域 内容 谁主导
核心路径 订单创建、支付、退款等 开发团队
辅助路径 用户画像、推荐展示等 产品主导但需评估
实验功能 A/B测试、灰度试用等 产品主导

这种分类方式让大家都明白哪些地方需要更谨慎对待,也避免了很多无谓的争执。


一些感悟:技术人的软实力比想象中重要

在我职业生涯里见过很多优秀的程序员,他们写得出漂亮的算法,设计得了牛逼的架构,却常常在与产品经理打交道时吃尽苦头。为什么?因为他们不会表达,也不善沟通。

但反过来看,那些走得更远的开发者,往往是既能搞定技术,也能和产品打成一片的人。

说到底,编程只是工具,沟通才是生产力的放大器

学会“说不”不是叛逆,而是一种专业素养的体现。它意味着你有能力判断什么时候应该坚持,什么时候应该妥协。它意味着你不只是一个执行者,而是一个能影响方向的设计者。


结语:我们不是对手,而是队友

最后想说,产品经理和程序员从来不是敌人。我们都希望做出一个好产品,服务更多用户,带来更大的价值。

只是大家走的路不同:产品经理在跑市场节奏,程序员在跑系统节奏。当我们能够互相理解和协同,才能真正发挥出团队的能量。

所以,不要怕“说不”,但要学会“怎么说得漂亮”。

愿你我都能在技术和人性之间找到那个平衡点。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝