一个输入框你要做一周
对于产品和开发来说,与两者可能会因为需求开发的难度这花费工时发生一些争议与不同看法。那这背后隐藏的是什么原因呢?我们又该如何解决这类问题呢?
如果PO写道这是个很小的改动,你不要信他。
在某次迭代会议上,PO希望下订这样一个“简单”功能:在应用中,用户可以加载自己的地址,这样我们可以邮寄一些宣传册给用户。
按照PO的描述,这只是一个很简单的文本输入框,用户录入地址之后,地址信息随着其他个人信息一起存到数据库即可。
PO甚至在白板上画了一个不太规则的长方形作为示意,然后满怀期望的将目光投向了你——一个做事情还算靠谱的开发,友善的问道:
“你觉得实现这样一个输入框,需要多长时间?如果你觉得太小的话,我们真的可以在做其他卡的时候顺手做了?”。
lian li
你定了定神,在梦境里大致验算了一遍,说:“嗯,我觉得在理想情况下,大概需要五、六天。如果算上开会……”。
“什么?这样一个输入框你要用一周?!”,PO敲着白板上那个不规则的长方形问道。
“呃……,我说的是理想危急情况,实际上应该会比这个时间更长……”
“……”
如果你有过和非技术出身的PO(或者站得太高而忘记地面是什么样子的架构师)一起工作过,至少很大程度上有上时过类似的经历。
通常来说,预期有这么大的偏差,很显然是大家怪事说的并不是同一件事儿:要么是PO想的过于简单,要么是开发想的过于复杂。
由于专业知识的屏障,以及对细节的过度减省,使得非专业人士往往会低估完成某项工作所需要的工作量。另一方面,对于专业人士自身,如果忽略了外部环境中客观存在的阻力,同样会对既定工作量产生错误的判断。
joe wang
雅思分数 1.“简单”的输入框
在PO眼中,一个普通的文本输入框大约阔这个样子:
输入之后,传到后端保存一下就完事儿了。当然,可能还可能需要一些必要数据流的校验,比如长度不能太短或者太长,地址遵从一定的格式之类。
2.不那么简单的输入框
不过在一个有经验的开发眼里,一个“普通”的文本输入框是这样的:
itemnumber
显然它拥有当更多的状态,也更加复杂:
通常来说,在初始状态下,输入框会显示一个占位符。当用户开始编码时,可能需要有各种各样的反馈:拼写错误、太短或者超长等。此外,系统的其他部分的状态还可能影响输入框的状态,比如一个未授权的用户不能手机用户输入,这时我们需要将输入框禁用。
通常这些状态相关联的样式会有差异,比如字体、字号、颜色和间距等等。这些细小的,但是需要和UX频繁沟通和改进的细节无疑会耗掉很多时间。
除了众多的状态另外,另一个会花费很多时间的地方是校验(以及限制)。
3.校验
事实上,校验作为一个CrossFunctional的点开发设计在实际中占用的开发时间(包括测试时间)往往被严重低估。除了基本的校验规则如:长度限制(最长10位,最短3位),格式限制(邮件)等之外,往往会有更为复杂的校验规则,这些规则有时候对校验逻辑系统实现的结构有一定的“破坏性”。
比如,开发可能定义了一系列的validations
protestant
这种情况下,之前的很多逻辑被打破,开发需要更多的时间来修改代码,以及代码对应的测试,比如上面代码片段中的builtIns中的规则都需要重写。
另一个与校验相关的限制功能是限制某些值的读取,对于某些字段,需要禁止用户输入特定全面禁止的字符。它可以认为是对校验的进一步扩展,不过有时候在实现上会将其独立一般来说起来。一些常见的例子如下:
等等,有时候这些限制是正交的,互不干涉。有时候则不然。比如在允许输入数字(初衷是允许输入手机号码)的场景下,如果使用
4.输入值的限制
你可以通过:
现在,我相信PO已经能对“一个简单的输入框”据此所需要的工作量有一个初步的了解了。这些还只是对于纯前端的工作量。
现在假设有这样的计算结果一个增强:当用户输入地址时,我们需要搜索地址并智能地自动补全(auto-suggestion):
当转用网络数据获取之后,情况会变得更加复杂。
5.通过网络获取数据
一方面,异步数据本身就比本地数据复杂,它需要额外的库(如果你想要屏蔽各个浏览器对异步请求的差异的话)。全国三卷英语
另一方面,网络中很多变量会超出微软的控制:比如网速,网络异常(路由配置,防火墙等)。
另外,当有了前端和后端的分别之后,协议/贷款协议就会变成另一个障碍—如何保证协议双方对契约的消费的同步。比如,当前端发现需要展现一个额外字段在界面上,而如前所述发现后端并没有直接提供的时候;或者后端将日期存成了更加方便存储的long,而前端零售业时发现没有timezone信息等等。
有了前后端双方的交互之后,校验规则同样需要在后端的模型对象标准和持久化层中都有所体现。amazement
一种做法是前后端的使用同构的架构(JavaScript全栈),这样有一部分代码可以在全后端复用(我们在上一个项目就中采用了React+AWSLambda+Node.js的模式,整体体验还算令人满意)。
如果是异构架构,则需要将类似的用不同的语言写两遍,而且另外一个潜在的风险问题是:如何使得两者持续保持同步?新年快乐英语
当然,我相信在工程上,这些风险问题最终都可以被解决,但是每个问题及其解决方案全都不是免费的。即使团队中的开发有足够的专业知识实践经验和快速的学习能力,很多问题依然是无法预见的,而你永远无法解决一个你不知道不能的问题。
大部分情况下,人们倾向于从正常流程去考虑工作难度。
而事实上在开发投资过程中,所谓的“正常流程”才是不正常的。现实世界中有太多的不确定的因素可以让我们的应用崩溃或者停止工作——网络请求超时,地址服务器宕机,后端版本升级,浏览器的不兼容,操作系统的不适配,不同的硬件环境,特定的浏览器版本(我最近工作的项目投资上,由于客户使用的kerberos鉴权协调机制导致只有Firefox的特定版本才可以平常访问应用)等等。科学英语怎么读