你可能会觉得有些奇怪:拆需求跟编程有什么关系?别急,听我跟你讲个故事。
拿我自己举例:我大学学的是国际贸易,工作岗位是产品经理,就是字面意义上「没学过写代码」的情况。曾经在工作中碰到过这样一个需求:给每个员工按规则生成绩效评价对象。
产品经理的困境:功能点价值低 = 没资源
大厂牛马们应该很熟悉了:矩阵管理,各种互相评价。以往的评价人都是系统写死一部分(比如直属上级),员工自己选一部分(比如协作较多的相关方),主管确认一部分;但后来大家都觉得很麻烦,不如让系统直接自动根据规则生成(一套令人眼花缭乱且动态更新的规则,要自动计算不同相关方的权重,还要时间节点拆不同组织架构切片等等),不用人工参与调整确认,所以就想做个功能。
抛开这个需求在实际业务中的可行性不谈(绩效评价这种事情是最容易出 drama 的点,怎么可能不用人工参与调整,到最后还是得在系统里开口子改,甚至结果和过程数据都要一起改),我们只谈功能的实现。
作为产品经理,收到这个需求的官话回复是:这个需求我们要深挖,抽象成通用的规则引擎;实际就是性价比太低,不如找个实习生苦力搞一搞算了(对不起实习生朋友们,没有任何贬低的意思……),反正每年就做两次绩效评价。做成规则引擎也不是不行,但这种非标需求估计换个业务方然后需求又会变,然后被问「为什么方案这么不灵活」;要是做了个灵活的方案就会被质疑「真的有必要这么复杂吗」,以及评估完资源说「这个需求我们排期到明年上」。主打一个「产品不理会业务诉求」、「开发不支持资源排期」及「业务不考虑开发成本」的不合氛围。
这就是在一个大型组织内做事经常碰到的困境:所有的原因都是客观的(因为资源确实是有限的),业务、产品和开发都在搞「抽象」,都在尝试做「复用组件」,然后拿去做晋升汇报抢资源继续造轮子,但具体的一线需求就是推不下去。
我的「土法炼钢」
那时候还没有 AI(或许已经有了但我不知道),只是因为憋着一口气要真的帮业务对接的小姑娘解决点问题,与其一直在那里「想价值点、等评审、等排期」,不如自己动手试试看。所以就开始琢磨,这个规则究竟要做什么,输入是什么,输出又是什么?
评价分配规则梳理出来差不多长这样:
- 如果员工的岗位是 A1,小组是 B1,部门是 C1,那么这个员工就应该由 C2 部门的 B2 小组的所有人来评,但不包括 A3 岗位
- 对于 B5 小组里的每一个人,评价对象在既有规则之外都还要加上 D1 部门里岗位不是 A2 的人,和 张三
- 还有其他各种奇奇怪怪的规则,这里都做了简化,要不然单纯的 vlookup 完全可以搞定
- 至于为什么会有这样的规则,属于业务管理问题,不在这篇讨论了,让我们只关注打工人自己能控制的东西吧
常识告诉我这就是个类似 Excel 的 vlookup 工具,只不过简单的 vlookup 只能输出指定列,这里需要在 vlookup 里再嵌套一层 vlookup,根据第一次找到的评价规则在另外一张表里再找人,那为什么不能做个方便的小工具出来点两下就好了。
于是,在某个月黑风高的晚上,尝试性地开始在 Google、B 站、Youtube 上搜解决方案。
先是看各种零代码、低代码平台有没有类似的工具,找了下都不太符合要求。然后又在想,Excel 里的 VBA 是不是就能处理,看了下教程发现有类似的案例,但公司配的 Excel 版本没有 VBA 功能,于是又作罢。
在翻搜索结果的时候看到有用 Python 处理数据的案例,而且那些示例代码看起来很容易懂,基本就是类似自然语言的描述。于是,就在搜索框里打下「Python 根据条件提取 Excel 脚本」几个关键词,一页页打开看,还真让我找到了最贴合的案例。
但找到之后发现,自己不会运行代码,怎么能让这个东西在我自己的电脑上跑起来呢?于是又开始搜「Mac 如何安装 Python」「如何运行 Python」「如何查看 python 版本」「pip 是什么」「虚拟环境是什么」「什么是 Homebrew」「为什么 Homebrew 安装速度慢」「如何安装 pandas」……
就这么一步步地,慢慢有了一个雏形:
import pandas as pd
df_A = pd.read_csv('/path/to/file_A.csv')
df_B = pd.read_csv('/path/to/file_B.csv')
def find_ids(df, **conditions):
result = df
for key, value in conditions.items():
result = result[result[key] == value]
return result['id'].tolist()
def update_appraiser(row, df_B):
if row['position'] == 'A1' and row['group'] == 'B1' and row['dept'] == 'C1':
ids_1 = find_ids(df_B[df_B['position'] != 'A3'], dept='C2', group='B2')
……
combined_ids = ';'.join(map(str, ids_1 + ……))
return combined_ids
elif ……
return row['appraiser']
def main():
df_A['appraiser'] = df_A.apply(lambda row: update_appraiser(row, df_B), axis=1)
df_A.to_csv('/path/to/file.csv', index=False)
if __name__ == '__main__':
main()
第一眼看上去好像挺复杂,但实际上这就是在几个不同的案例里东拼西凑起来的大杂烩,我都不知道这坨东西究竟是什么意思。
但心态放宽就好了,反正做成了的话自己也掌握了新知识,业务也解决了问题,做不成就不成,没人期待我这样一个没什么编程基础的人上来就会写代码了。所以就硬着头皮看,慢慢就发现:
- 这个引号「‘’」里的东西好像都是表格里的表头或者单元格值;
- row 是行的意思;
- to_csv 后面有个路径,看起来像是文件的地址;
- ……
真的静下心默读一下这段代码,你会发现这非常类似自然语言。不看语法,只用英语翻译能看懂的部分就是:
if row['position'] == 'A1' and row['group'] == 'B1' and row['dept'] == 'C1':
-> 如果这一行里的 position 值是 A1,group 值是 B1,dept 值是 C1
ids_1 = find_ids(df_B[df_B['position'] != 'A3'], dept='C2', group='B2')
-> find_ids 是查工号的工具名字,position 值不等于 A3,dept 值等于 C2,group 值等于 B2
-> 好像说的是要在表 B 里查:岗位不是 A3,部门是 C2,小组是 B2 的人的工号?
combined_ids = ';'.join(map(str, ids_1 + ……))
-> 看不懂,join 是加入,map 是地图?
return combined_ids
-> 返回一个叫 combined_ids 的东西,看不懂
既然有能看懂的部分,那么就上手改改,看看运行出来的结果是什么样的,然后就大概知道这一行代码的作用。有时候改坏了,看着一屏幕的陌生提示,那就复制出来扔到搜索引擎继续搜,这个阶段碰到的问题都一定有标准答案。
最终给业务方提供了一个脚本,能把评价人的工号都找出来,然后再在 Excel 里手动做逆透视(把行数据变成列数据,这一步就是产品经理的基本功了),最终导出能用的数据。
业务方小姑娘开心坏了。
真正的基础:需求拆解
上面这个例子是在没有 AI 的时候就已经可以做到的结果,善用搜索引擎,你会发现你碰到过的问题也一定有其他人碰到并解决过。现在更好了,你已经可以完全省略掉在搜索引擎里找答案的过程,直接扔给 AI 让它帮你写好解释,你只需要复制粘贴看结果就行。
当然,一切都有一个大前提:所有的后续步骤都建立在你对业务(或者对你的需求)足够了解的情况下,可以想象,在开始搜索实现方式之前,如果我没办法把业务需求转化为可以用语言清晰描述的规则,至少一个输入能对应一个明确输出的话,那么就算我再会写代码,也还是需要人来告诉我规则是什么。
即便是用 AI 来协作,你也仍然需要扮演从「需求」到「代码实现」中间的桥梁角色。越能够清晰地描述需求,AI 产出的结果就越好。
- 明确目标:我想要解决什么问题
- 分析输入:我需要哪些数据?数据从哪里来?
- 确定输出:我希望得到什么结果?结果是什么格式?
- 梳理流程、规则:从输入到输出有哪些步骤?每一步的判断条件是什么?
- 用自然语言描述:用清晰、简洁的语言把规则和需求描述出来,就像写作文一样
这就是我所理解的「基础」:在 AI 时代,哪怕是零基础学编程,比学语法、框架更为基础的其实是你的「需求拆解」能力。你可以在最开始的时候完全没有任何概念,但你需要会翻译——要么把你的需求翻译成条件格式(如果 A 那么 B),要么能读懂别人或 AI 所写的示例代码里的逻辑判断。
毕竟大多数人「零基础学编程」的最终目的并不是要成为一个专业写代码的程序员,而是要通过编程能力的拓展来更好地解决生活和工作中存在的问题。
拆解之后:像学外语一样学写代码
在我的认知里,代码就是语言的一种。人与人沟通用中文,用英语;人与机器沟通用代码。(我知道这不严谨,还有很多编译到二进制的工作,理解意思就行。)当年学英语是怎么学的,现在学代码也是一样。非理科生可能逻辑确实弱一点(对不起,刻板印象了),但就像英语阅读理解一样,先浑个脸熟,逻辑可以慢慢捋(而且还不像以前有时间限制)。
不过,也正因为像做英语阅读理解一样,词汇量是拿分的基础。一篇文章里有 10% 的生词你还能靠上下文逻辑关系蒙一蒙,要是 90% 都不认识,那跟瞎做也没区别。但现在有了 AI,你相当于带着文曲星——算了,还是换个没那么暴露年龄的例子,你相当于带着讯飞翻译笔进考场,「哪里不会点哪里」。
当然,我也知道这种碎片化的信息并不是真的「知识」,这种「干中学」相比与系统学习也有其局限性。但对于编程小白来说,获取「微弱但持续的成就感」比「严谨而系统的学习框架」在初期更为重要。毕竟不是要转去当全职码农,而是要用写代码的能力来实现自己的产品设想。先做出来看看,有了甜头自然就有了深入学习的动力。
另外,这些基础知识本身也不难(即便是对于如我一样的非理科专业),甚至对于一些人来说属于看了就等于会了的程度。如果当年初高中上微机课时都能绕过网管去玩泡泡堂(又是一个暴露年龄的例子),现在觉得看起来困难可能真的只是因为没有迈出那一步上手试试。跟朋友聊的时候也在感慨,学生时代每天都在跨领域学习新知识,那时候是怎么做到九门学科每天都在学新东西的,工作时间久了之后,估计就在每天的麻木中忘了自己仍然有跨领域学习的能力。
别光看了,开始上手试试吧。
推荐我自己用过的一些基础学习资料和方式:
- O’REILLY 的 Head First 系列书:你可以当成教材跟着看和练,或者跟我一样,把它当成字典用,碰到 AI 举例我都无法理解的情况就去看书。最基础的可以从 HTML 和 CSS 那本开始看,先写一个静态网页建立下成就感。PS:Head First 的书写得是真好,虽然有很多外国人的冷幽默翻译过来之后变得更冷了,但整体的结构和循序渐进的方式会让你觉得「以前上学的时候老师要都这么教就好了」。
- DeepLearning.ai 上吴恩达的系列公开课:这上面的课是反复听反复有收获,但建议是先有了一点 Python 基础再听。我就是听了那个《Prompt Engineering for Developers》的 9 节课之后入门的。
- freecodecamp:看完书听完课之后,直接上手写代码过认证考试,又是一轮反复强化记忆。
- 最后,你还可以让 AI 帮你生成题目来检查知识点的掌握情况。别忘了 AI 可是个 7*24 小时的高级私教。
留言
暂无留言。来第一个留言吧!