不断出现的卡片掠夺黑客攻击只是一个特别引人注目的目标。
梅西百货(Macy's)已警告客户,入侵者将于10月7日在其网站上将代码(据信为JavaScript)滑入两页,让他们从购物者那里收集数据,包括姓名,地址和付款信息。
梅西百货在10月15日发现该攻击后立即将其关闭,但尚不清楚有多少人受到了影响。该公司告诉Bleeping Computer,一小部分人是受害者,并且已经实施了“附加安全措施”并提供免费信用监控。
这项名为Magecart的技术因其相对简单和有效的结合而在黑客中越来越流行。他们不需要做很多事情,而只需插入流氓脚本(指向远程命令和控制服务器)并等待人们购物。从那里,他们可以使用该信息进行欺诈性购买,制作克隆卡并在黑市上出售数据。
不要指望这些攻击会在短期内消退。它们已被用于众多主要品牌,包括英国航空,Newegg和Ticketmaster。直到网上商店对诸如Magecart之类的技术保持封闭,它们才会成为诱人的目标。
这篇文章中,本文作者分享了他对于产品文档的看法以及撰写产品文档的常用流程。
很多人听到「产品文档」这四个字就像吞了苍蝇一样,人们通常会认为这意味着又要花几周写一个根本没人看的文档。如果一个团队总被产品文档这种事情拖累,怎么可能「敏捷」得起来,怎么可能高效地产出代码?
我在过去十几年创造了多个数百万人使用的软件产品之后,越发认为这种观点是完全错误的。根据我的经验:
在这篇文章中,我会通过一个案例来分享一些普适的建议,这些建议会对大中型(超过二百人的)公司中的产品经理们非常有帮助。
假设你在这里工作:
一家从事在线旅游预订服务 (就像 Hotels 或者 Airbnb 但是规模更小一些)的公司。目前这家公司的支付转化率偏低,所以这个季度大家打算尝试通过在支付环节加入在线客服的方案来提升转化。
你的工单/用户故事/路线图是:
通过在支付环节增加在线客服来尝试提高支付转化率。支付转化率目前仅有 18%,而业内平均转化率有 30%。我们打算测试下在支付时展示在线客服聊天窗口是否可以提高这个转化率。用户运营团队已经同意了提供 1 人月的客服人力支持。
在你没有产品文档时,你会这样做:
比方说,你觉得行动起来总是最重要的,因此直接开始动手:
搞定了!这么简单的事情怎么能要我们写产品文档呢?如果你是在一个小型创业团队,你也确实并不需要——因为产品改动相对小,涉及到的人也相对更少。
但如果你是在一个更大的组织之中,或者产品更加成熟/复杂,就会陆续出现下列这些问题,并且相比写文档,这些问题会需要更多时间来处理。
例如:
如果这是一个相对简单的项目,即使没有产品文档可能也不至于陷入这样的灾难之中。但是在简单的项目中你仍然有可能会因为没有文档浪费许多时间和机会成本。
为了便于说明,我准备了两个示例文档:一篇思路笔记,和一篇完整的产品文档示例——这样可以完整介绍产品文档的撰写流程。
请在继续阅读文章之前,花几分钟读一下这两篇示例文档吧。
这是一个根据你已知的信息和想要解答的问题所梳理成的列表。
这会是你需要做的第一件事情,大约需要一个小时来完成这个文档。这个文档会成为你和团队中其他人的一个沟通基础。
只有和团队一起评审了你的假设和创意之后(无论是在专门召集的会议上,喝咖啡时,或者桌上足球的休息时间),你才应该真正开始写产品文档。
如果已经完成了沟通和评审,整个文档应该花费你 1-3 个小时的时间。
啊哈!有了文档之后是不是就感觉踏实多了?写文档看起来是额外的工作成本,但是其实并不是,高效的文档可以帮助你和你的团队节约时间投入,并且在交付上线时会更有信心。
等等!——你已经读完示例文档了么?请务必先读完它再继续阅读下面的文章。
Ben Horowitz
我通过示例文档诠释了这篇文章中所讲述的思考,在继续阅读全文之前,请务必确认你已经阅读了示例文档 。
为了以更高的质量、更快的速度和更佳的预判来交付正确的产品。
是的,就是这样。那么,产品文档将如何帮助你做到这一切呢?Ben Horowitz 分享了上图中这个看法,我的示例文档也是一个很好的例证。明确一下要点:
产品文档应该明确沟通要做一个「什么」产品,以及「为什么」要这么做。用来说明清楚一个产品的表达方式很多,但最核心的,一定要说清楚这五件事情:
你可以使用我的示例文档做你的文档模板,按照你的想法增/删/改任何章节。只要你能够清晰并且条理清楚地表述上面提到的这五点信息,文档形式并不重要。
接下来我会介绍我撰写和评审文档的常规流程。根据项目大小,利益相关方的数量不同等情况,流程细节可能会有所变化,但是大体的流程是确定的。
(1)快速完成一个草稿(1-2 个小时)
关闭电子邮件和聊天工具。泡杯茶,坐在椅子上开始思考,然后逐一把你所了解的信息列成清单(见上文中的思路笔记示例)。
(2)安排几个 30 分钟的一对一会议 (1-4 个小时)
这个步骤的目的是过一遍文档中的细节,优化你的方案,并且获得更多人的支持。尽可能控制这些会议的规模,人越少越好(理想状态下都应该是一对一会议)。
在本文的示例中,我会和客服部门的负责人,一个财务人员和一个工程师分别安排一次会议。
(3)撰写和编辑文档 (0.5-3 天)
此时,你应该对能做,并且应该做什么有了一个明确的想法,但是大脑中塞满了大量的细节等待着梳理清楚。于是接下来需要将所有这些细节都整理出来,并且逐一梳理斟酌。
在完成第一版文档之后,需要继续大篇幅编辑修改,通常最终的文档可以在你的第一版草稿的基础上压缩 30%-50% 的长度,简洁和清晰的文档就意味着更加容易阅读。
大部分文档都可以在半天到一天的时间里完成,不过实际上也会有一些文档需要两三天才能写完。
(4)群发文档并且安排一个 1 小时的评审会议(15 分钟)
将文档群发给项目的所有利益相关方,并且抄送给其他可能对文档感兴趣的团队(例如你所在的产品团队,整个支持团队等)。
跟进这些关键人员是否接受了会议邀请:将会执行这件事情的人,和所有对这件事情有通过/否决权力的人。
(5)评审文档(1小时)
在开始会议之前,询问是否有参会者没有详细阅读你的文档。通常都会有一两个人中枪,在这种情况下可以说:「没问题,我们先用 10 分钟一起来看一下文档。已经读过文档的人可以利用这个时间先放松休息一下」。
这次会议上你需要获得利益相关方的同意,并且获得执行方(工程师、支持团队等)的知晓、认可以及人力支持。
你可能需要开多次评审会议,并且根据评审会议上沟通的信息不断修改文档。
(6)通过评审后,及时同步信息和建立工单 (1-2 小时)
会后同步信息的电子邮件需要包含更新后的产品文档链接,和此项目相关的工单链接(例如「在页面上添加 JavaScript 代码」,「完成数据分析报告」,「测试 Staging 环境」,「和支持团队预演流程」,等等)。
一般接下来将会有一位工程师完成技术文档,不过并不总是这样(文中的示例项目就不需要这一步)。
尽量简短
没有比这更重要的文档写作建议了。简洁意味着清晰的思路和沟通,也意味着你的文档更加易于阅读和理解——这一点至关重要。
使用平白的语言和简单的格式
使用简短而不是花哨的语句,使用列表和加粗强调可以使文章更一目了然,以放松有趣的方式写作而不是一板一眼,如果你有得体的幽默感就再好不过了。
为开发团队预留时间
通过评审并且达成一致通过的文档才是完善的文档。如果你希望在未来的某一个迭代 Sprint 中开发此项目,就应该提前两到三周开始这个产品文档写作流程。
像工程师一样思考
在项目得以进入开发之时,常常会发现大量未预料到的边缘情况——但这种情形其实可以避免。如果你认真考虑过项目进入开发的所有必要条件,你就可以提前发现这些问题(例如,是否在移动设备中可以使用在线聊天功能?)。
确保每一个人都跟上了你的节奏
当我组织产品评审时,会议室里的大部分人都已经大致了解我要讲的内容——因为我已经提前在讨论会和日常聊天中沟通过这个事情了。既然大家都已经清楚了「做什么」和「为什么要做」的问题,文档评审会上我们只要关注实施细节就好了。
在图表中下功夫
流程图、线框图等图表可以通过易于理解的方式提供很大的信息量,同时也需要消耗非常多的时间来制作这些图表。
在思考和写文档上花 0.5-3 天时间
具体时间根据项目大小而定。花费在写文档上的时间越长,所带来的边际收益就会递减。特别需要指出的是,没有人能够读的下去超过 5-6 页的文档。
指明方向,明晰愿景
你不仅仅是在定义一个功能,也是在解释「为什么我们要做这件事情」以及「我们的目标是什么」,在文档中指出这个项目将会对更高层面的规划造成什么影响,以及接下来会发生什么。
确保你的观众阅读了文档
如果你的文档又臭又长,或者从来不分享给对应的人,那你还不如不写文档。务必确保你的文档被对应的人阅读了,我上面关于评审开始时留时间给大家读文档的建议值得大家参考。
获取真诚的反馈
你的文档是否是在赘述人尽皆知的事情?或者是文档缺乏足够的细节?是否在后续实施中发现了太多的边缘情况?又或者,是否在制定计划和文档评审上耗费了太多的时间?你应该和你的团队时刻保持沟通。
我知道会有争议,但是产品文档和敏捷宣言的原则没有丝毫冲突,并且在类似于 Scrum 这样的敏捷方法上得到了充分发挥。
毕竟,用户故事(Story)许多时候需要详尽的描述,文档可以增加沟通中的清晰度和可传播性,为什么非要刻板地认为仅仅使用口头沟通和使用白板才算是敏捷开发呢?
「产品文档会导致发布变慢,过度规划,通常会浪费时间」的想法完全是无稽之谈。
我工作过的多个世界级团队遵循着一些敏捷原则(例如两周一个迭代周期),每天(甚至更频繁地)发布代码,并且以发布产品(而不是文档或者会议)作为衡量成功的标准——这些团队也都仍然认为文档是他们打造成功软件的一个关键部分。
我是一个技术文档的支持者。产品文档通常关注 做什么 ,而技术文档更多关注在如何做 。这两种文档为研发流程中的不同环节带来同样的清晰视角,并且都使得工程师(和他们的用户)身心愉悦。 未来如果大家有兴趣的话我可能会写一篇关于技术文档的文章。
感谢你读到这里。如果你认为这篇文章有用,请分享给其他人——特别是你的产品/工程团队。
如果你想看更多的产品经理内容(例如:规划产品路线图),或者想了解其他人如何使用产品文档, 请用两分钟填写这个小调查(英文)。我会在未来的文章中分享调查结果中有意思的信息。
以上,祝写文档愉快!
原文作者:Gaurav Oberoi是 SurveyMonkey 的(前)联合创始人,曾于 Amazon、Xmarks 先后从事工程师、产品经理等职位,在西雅图和硅谷有十余年的工作经验。
原文地址:https://goberoi.com/on-writing-product-specs-5ca697b992fd
翻译:Tomy
译文地址:http://zhuanlan.zhihu.com/p/23778590
本文由 @Tomy 授权发布于人人都是产品经理,未经作者许可,禁止转载。
元素共有5个,分别是::before、::after、::first-letter、::first-line和::selection
::first-letter主要用于为文本的首字母添加特殊样式
注意:::first-letter 伪元素只适用于块级元素。
::first-line 伪元素用于向文本的首行添加特殊样式。
注意:::first-line 伪元素只能应用于块级元素。
::selection 伪元素匹配用户选择的元素部分。也就是给我们鼠标滑动选中的部分设置样式,它可以设置以下属性
::before用于在元素内容之前插入一些内容,::after用于在元素内容之后插入一些内容,其他方面的都相同。写法就是只要在想要添加的元素选择器后面加上::before或::after即可,有些人会发现,写一个冒号和两个冒号都可以有相应的效果,那是因为在css3中,w3c为了区分伪类和伪元素,用双冒号取代了伪元素的单冒号表示法,所以我们以后在写伪元素的时候尽量使用双冒号。
这些添加不会出现在DOM中,不会改变文档内容,不可复制,仅仅是在css渲染层加入。所以不要用:before或:after展示有实际意义的内容,尽量使用它们显示修饰性内容,例如图标。
举例:网站有些联系电话,希望在它们前加一个icon?,就可以使用:before伪元素.
不同于其他伪元素,::before和::after在使用的时候必须提供content属性,可以为字符串和图片,也可以是空,但不能省略该属性,否则将不生效。
伪类元素的display是默认值inline,可以通过设置display:block来改变其显示。
content可取以下值。
使用引号包一段字符串,将会向元素内容中添加字符串。如:a:after{content:""}
举例:
<!DOCTYPE html><meta charset="utf-8" /><style type="text/css">
p::before{
content: "《";
color: blue;
}
p::after{
content: "》";
color: blue;
}
</style>
<p>平凡的世界</p>
通过attr()调用当前元素的属性,比如将图片alt提示文字或者链接的href地址显示出来。
<style type="text/css">
a::after{
content: "(" attr(href) ")";
}
</style>
<a href="http://www.cnblogs.com/starof">starof</a>
举例:“百度”前面给出一张图片,后面给出href属性。
<style>
a::before{
content: url("https://www.baidu.com/img/baidu_jgylogo3.gif");}
a::after{
content:"("attr(href)")";}
a{
text-decoration: none;}</style>
---------------------------
<body><a href="http://www.baidu.com">百度</a></body>
效果:
调用计数器,可以不使用列表元素实现序号功能。
配合counter-increment和counter-reset属性使用:
h2:before {
counter-increment: chapter;
content: "Chapter "
counter(chapter) ". "
}
代码:
<style>
body{
counter-reset: section;
}
h1{
counter-reset: subsection;
}
h1:before{
counter-increment:section;
content:counter(section) "、";
}
h2:before{
counter-increment:subsection;
content: counter(section) "." counter(subsection) "、";
}
</style>
------------------------------------------------
<body>
<h1>HTML tutorials</h1>
<h2>HTML Tutorial</h2>
<h2>XHTML Tutorial</h2>
<h2>CSS Tutorial</h2>
<h1>Scripting tutorials</h1>
<h2>JavaScript</h2>
<h2>VBScript</h2>
<h1>XML tutorials</h1>
<h2>XML</h2>
<h2>XSL</h2>
</body>
效果:
了解更多可参考:https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Counters
举例:一个六角星
<style>
#star-six {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid red;
position: relative;
}
#star-six::after {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-top: 100px solid red;
position: absolute;
content: "";
top: 30px;
left: -50px;
}
</style>
<body><div id="star-six"></div></body>
#star-six的div是一个正三角行,#star-six::after是一个倒三角形,通过绝对定位,调整其位置即可实现六角星的效果。
<style>
@media print {
a[href]:after {
content: " (" attr(href) ") ";
}
}
</style>
<body>
<a href="http://www.baidu.com">百度</a>
</body>
举例:网站有些联系电话,希望在它们前加一个icon?,就可以使用:before伪元素,如下:
<!DOCTYPE html><meta charset="utf-8" />
<style type="text/css">
.phoneNumber::before {
content:'\260E';
font-size: 15px;
}
</style>
<p class="phoneNumber">12345645654</p>
制作一款特殊的鼠标滑入滑出效果
这个效果还是之前一个朋友从某网站看到之后问我能不能实现,我去那个网站查看了代码学会的,觉得很有趣,特意分享给大家。
可以先看一下效果
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.h-button {
z-index: 1;
position: relative;
overflow: hidden;
}
.h-button:before,
.h-button:after {
content: "";
width: 0;
height: 100%;
position: absolute;
filter: brightness(.9);
background-color: inherit;
z-index: -1;
}
.h-button:before {
left: 0;
}
.h-button:after {
right: 0;
transition: width .5s ease;
}
.h-button:hover::before {
width: 100%;
transition: width .5s ease;
}
.h-button:hover::after {
width: 100%;
background-color: transparent;
}
.submit {
width: 100px;
height: 40px;
color: #fff;
line-height: 40px;
text-align: center;
background: #00baca;
margin: 50px;
}
</style>
</head>
<body>
<div class="h-button submit">提交</div>
</body>
<script>
</script>
</html>
有些时候,我们不想要用户使用ctrl+f搜索我们网页内的内容,必须在一些文字识别的网页小游戏里,我们又不想把文字做成图片,那么就可以使用这个属性,使用::before和::after渲染出来的文字,不可选中也不能搜索。当然这个低版本浏览器的兼容性我木有试,谷歌浏览器和safari是可以实现不能选中不可搜索的效果的。
拿上面的示例进行尝试,可以看到,我们使用伪元素添加的[问题]两个字,就无法使用浏览器的搜索工具搜到。
*请认真填写需求信息,我们会在24小时内与您取得联系。