如果让大家设计一个登录功能,大家会怎么做?

可能大家一听就高兴了,登录不就是用户名加密码嘛,我熟啊,我还可以设计出验证码、找回密码、第三方登录等等功能。

更有个别动作快的同事,甚至已经开始设计数据库表,考虑用 Redis 做缓存了。整个过程下来,大家彼此讨论得热火朝天,唯一没人理会的就是客户真正需求。

讨论结束,客户告诉大家,作为一个“土豪”,他打算做一个打车软件,用户可以通过手机号接收验证码的方式进行登录。你可以想见,大家一副“被套路了”的表情。是的,他们设计那套用户名密码登录完全是文不对题。

虽然这是一个简单的练习,但反映的却是我们日常面对的真实工作场景:许多人都是刚刚听到别人要求做的一个功能,就开始脑补接下来的一切。导致的结果,就是付出的努力毫无意义。

以终为始,就是在做事之前,先想想结果是什么样子的。

说起来很简单,但做到并不容易。因为我们习以为常的思维模式是线性而顺序的,第一步做完,做第二步;第二步做完,做第三步。
    这也情有可原。我们人类都是从远古时代演化而来,在那个食不果腹的时代里,倒着思考的用途并不大,人们甚至不确定自己能否见到明天的太阳。几十万年的进化留给我们很多短视的行为和思考习惯,因为这样的做法最为节省能量,把目光放长远是需要额外消耗能量的。

“以终为始”是一种反直觉的思维方式,是大多数人不具备的。所以,日常生活中,我们看到很多有趣的现象。

比如,大学毕业时,有很多人想考研,如果你问他为什么要考研,得到的理由通常是为了找个好工作。但考研真的能帮他找个好工作吗?不一定,因为找工作和考研根本就不是同一棵技能树。

如果真的是想找个好工作,那你就应该了解工作的要求是什么,怎样才能掌握工作要求的技能。

从后面这个角度出发,你会发现考研只是通往工作诸多道路中的一条,其他的路径也是可以到达的。比如,你应该找个实习的地方锻炼一下职业技能。这就是“以终为始”思考问题的方式。

回到前面“设计登录功能”的例子,对比“以终为始”的思维,你也许会替我的同事抱不平,他们或许也有“以终为始”的思路,只不过,他们的“终”和我这个客户的“终”不一样罢了。这就要说到做软件,本质上是在构建一个“集体想象”。

如果你读过尤瓦尔·赫拉利的《人类简史》或《未来简史》,有一个说法你一定不陌生:想象的共同体。作者认为,人类历史发展的一个重要因素是“集体想象”,无论是国家、宗教,还是法律、习俗,都是人们达成的“集体想象”。人类就是认同了这些“集体想象”的一个共同体。

程序员其实就是一个想象的共同体,这个“集体想象”就是我们要做的软件,任何想象都需要一个载体将其展现出来,我们编写软件的过程就是将这个“集体想象”落实的过程。

既然是“集体想象”,那么在载体将想象呈现出来之前,我们的想象很难统一起来,都或多或少存在差异。

所以,任何事物都要经过两次创造:一次是在头脑中的创造,也就是智力上的或者第一次创造(Mental/First Creation),然后才是付诸实践,也就是实际的构建或第二次创造(Physical/Second Creation)。

我们在工作中遇到的很多问题,其实就是在于第一次创造没有做好,就进入到第二次创造。所以,我们在工作中会遇到很多“惊喜”,准确地说,是惊吓。

相比于第一次创造,第二次创造是一件成本很高的事。我们知道,软件开发最费时费力,一旦投入大量精力做出来,却发现与理解偏差甚大,所有人都会欲哭无泪。

所以,在动手做事之前,我们要在第一次创造上多下一些功夫,将相关各方的“集体想象”统一起来。因此,我们可以做很多事,比如:

  • 要给用户看产品的样子,可以用原型工具把它做出来,而不是非得把完整功能开发出来;

  • 要呈现服务接口的样子,可以用模拟服务器搭出一个服务,而不用等后端全部开发完毕;

  • 要让程序员知道要开发产品的细节,可以在任务上描述出软件各种场景给出的各种行为。

回到前面“设计一个登录功能”的例子上,大家在构建的其实是他们自己的想象,而不是我们共同的想象。这其中最大的一个区别就在于,没有人会为他们自己的想象买单的。

所以说,他们看到的“终”不是真正的终,只是一个自我的“终”,至于看到什么样的“终”,这取决于每个人的见识。

对做软件的人来说,我们应该把“终”定位成做一个对用户有价值的软件,能够为别人带来价值,自己的价值才能体现出来。

软件行业有很多英雄传说,一个人或者一个团队连续奋战一段时间,写好了一个软件,在上线前夜发现了一个问题,然后冒着“不成功便成仁”的风险,通宵达旦解决了问题,一战成名。

这种故事听起来让人热血沸腾,但仔细想想,为什么总在最后一刻发现问题?除了时间压力确实大的情况以外,大多数情况,他们还是一开始没有想好就动手了。

有了“以终为始”的思维,我们考虑的是别人会怎么用我们的平台。我们设计的方式是,用户到我们的网站,阅读相关文档,然后参考文档一步一步照着做。

这其中的一个关键点是:文档,特别是《起步走》的文档,这是用户接触我们这个平台的第一步,决定了他对我们产品的第一印象。

所以,我们决定从写《起步走》这个文档开始,这个文档描绘了用户怎样一步一步使用我们的开发平台,完成第一个“Hello World”级别的应用。请注意,这个时候,我们一行代码都没有写。

写好了这个《起步走》文档,团队的所有人对于我们的平台要做成什么样子,已经有了一个比较初步的认识。更重要的是,我们可以拿着这个文档,去和外部的人讨论这个尚未出世的平台。

人类是一个擅长脑补的群体,一旦有人看到了这个文档,他就已经可以构想出这个平台已经存在的样子,进而给出各种各样的反馈:“我认为这个地方可以这样做”“我觉得那个地方可以改改”。

所有这些反馈都是真实的,因为他们已经“看到了”一个真实的东西。正是这些真实的反馈,让我们逐渐地锁定了目标。之后,我们才开始动手写代码。

“以终为始”的方式,不仅仅可以帮我们规划工作,还可以帮我们发现工作中的问题。

当在开发一个大功能,要将现有的系统改造成支持多租户的系统。也就是说,别的商家可以到我们的平台上发起申请,拥有和我们现有平台一样的能力。

功能来了,各个团队将任务分解,然后就各忙各的去了。但项目负责人有着习惯性的不安,总担心丢点什么,于是催着项目经理梳理一下上线流程。

是的,上线流程,虽然我们的代码还没开发完,但是本着“以终为始”的态度,我们就假设各个部分已经开发好了,来想一想上线应该怎么做。

果不其然,一梳理上线流程,我们便发现了问题:怎么识别不同的租户呢?有人给出的方案是设置一个 HTTP 头。但谁来设置这个 HTTP 头呢?没人仔细想过。于是,一个潜在的问题就这样被发现了,至少不用在未来为它加班了。至于解决方案,作为程序员,我们有的是办法。

事实上,在今天的软件开发实践中,已经有很多采用了“以终为始”原则的实践。

比如测试驱动开发。测试是什么?就是你这段代码的“终”,只有通过测试了,我们才有资格说代码完成了。当然,测试驱动开发想做好,并不是先写测试这么简单的。

比如持续集成,我们是要交付一个可运行的软件,倒着来想,最好的做法就是让软件一直处于可运行的状态,那就是持续地做集成。

所以,践行“以终为始”就是在做事之前,先考虑结果,根据结果来确定要做的事情。

如何让你的努力有价值?相关推荐

  1. 别再说“我已经努力了”,你的“努力”一文不值!

    有次,让一个研究生男收集一份资料,快下班了问结果,竟然毛也没有.见我要怒,他慷慨激昂地说:"我已经很努力找了,但真的查不到." 作为主管,"我已经努力"这话我不 ...

  2. 打造抖音爆款脚本文案,让你分分钟钟上热门涨粉。

    要想在抖音里面占据一席之地,运营者必须具备基本的短视频脚本创作能力. 有的人,为了一个创意能想上一天:而有的人,通过一些技巧,延伸出无数个好的想法. 那么优质的短视频脚本的创意又是从何而来的呢?猫哥告 ...

  3. “年轻”有价值,才是本钱

    在生活中,我们常常听到有人说:"年轻",就是本钱.可你知道吗?年轻如果没有价值,他只不过是年少无知而已. 就比如:一个来自家境不好的大学生,毕业后几年都没有工作,还在家啃老,让父母 ...

  4. 十问陆奇:努力、能力和机遇,谁能帮你跑赢未来?

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 作者 | 陆奇 转载自36氪 陆奇说:在创业者从0到1的过程中,我们看到的主要挑战有以下几个方面: 对需 ...

  5. 我的微软最有价值专家(Microsoft MVP)之路

    前言 在这一年多的时间里,经常逛国内的一些技术社区和论坛,其中发现一个问题--现在很多朋友,大部分是学生和刚毕业参加工作的朋友,或工作1-2年的朋友都比较迷茫,不知道自己想要什么,想下决心努力学习但是 ...

  6. 只要努力搞,没有KPI搞不垮的团队?

    KPI考核,近年来备受争议. 索尼前董事天外伺朗,曾经写文章批判:"绩效主义毁了索尼!" 魏则西事件后,李彦宏曾说:"短期KPI的追逐,我们的价值观被挤压变形了,业绩增长 ...

  7. 来字节才发现,31岁程序员已经是大团队里最老的了!才发现自己从未真的努力,虽然每天加班到十二点,但只怀着赶紧干完的抱怨!...

    你有没有在某个时刻怀疑过自己? 最近一个字节跳动的员工发贴感慨自己不够努力,觉得自己是团队里年纪最大的,智商.情商都被团队的年轻人全面碾压.没看过原贴的人大概会以为这是个年近退休的老大爷了吧?可实际上 ...

  8. 为实现流行病预测:联邦政府在疫情暴发建模方面的努力和机遇

    翻译 | 雄狮塞拉 摘要&点评 | 耶鲁大学单博士 致谢 | 课题组33和金玉同学 _ _ _ _ 摘  要 _ _ _ _ 传染病的暴发威胁着全球健康.经济活力和美国国家安全.引发美国和国际 ...

  9. CSDN2008最有价值博客获奖感言--放飞梦想,让我们扬帆远航

    我应该是幸运的,在大学初次接触计算机的时候就被分到试验班,每周仅有的两次课都可以在机房中度过,最早学习的DOS命令和WPS却没有引起我多大的兴趣,直到Basic语言的出现,才使我的认识有了极大的改观, ...

最新文章

  1. linux svn更换数据仓库,Linux环境下SVN数据仓库迁移
  2. 华为nova 2 Plus魔镜版818欢购热潮凶猛来袭
  3. 24.Interpreter-解释器模式
  4. js 获取sessionid_百战卓越班学员学习经验分享:页面js代码
  5. Go 语言编程 — gorm 的数据完整性约束
  6. 网页打不开,却能上qq,何解?
  7. hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)
  8. Codeforces 1188 题解
  9. mysql目录树_无限级目录树+记忆节点状态(PHP+mysql)
  10. java登录界面命令_Java命令行界面(第30部分):观察
  11. 助人快乐:笔记本连网
  12. 区块链比特币开源_开源资金:比特币,区块链和免费软件
  13. DAM的内涵正在改变
  14. 小tips:JS语法之标签(label)
  15. sql配置管理器服务是空的_Sql Server ReportingServices(SSRS)报表配置
  16. 【Python学习21】Python中函数的用法,使用函数进行简单的数学运算
  17. hashmap扩容机制 jdk1.7
  18. vue||简易版音乐播放器
  19. 二牛频道-收集分享各类不花钱的各类绿色优质软件-互联网资源分享
  20. 手机HTML5 audio 无法自动播放下一首

热门文章

  1. 微信小程序 选中目标 在后面显示一个对号
  2. stm32、gd32等芯片固件升级思路
  3. js记录用户在网站的浏览记录和停留时间
  4. 音频转码 via DirectShow
  5. Python 数据结构之哈希表的实现
  6. chrome dev tools 使用大全
  7. sublime 3 for mac安装与使用
  8. CTF学习笔记——IncludePing Ping Ping
  9. 【短信业务】阿里云可以发送带变量的链接短信
  10. 第十五周知原理题目解析