- 博客(57)
- 收藏
- 关注
原创 前端该如何评估开发时间
一、需求分析产品经理提出的需求可能不是很正确,这个时候需要工程师进行辅助,原因如下:1、产品经理可能对技术的边界不是很了解,所以无法充分利用技术解决用户需求。优秀的产品经理是需要有技术广度的,他不一定要深入了解技术的原理,但一定要理解技术的边界。某个技术能做什么,不能做什么,最近是不是又有新技术了,和我的产品有关系吗?2、对用户原始需求的理解是很难传递的。很多时候,产品只是发了个产品文档过...
2019-09-04 17:16:10 5740
原创 产品经理必修课(9):工作流中的管理
一、协作管理在产品经理的职位要求里,无一例外都会提到“沟通能力”。协作、项目管理、产品跟进、迭代安排等,很多产品经理的分内之事。不过,单纯的沟通是解决不了问题的。协作的核心在于,如何在同一个目标即“实现好的产品”下共同合作,实现共赢。在《高效能人士的七个习惯》一书中提到了“双赢思维”,描述了我们在人际交往中最重要的指导思想。作为产品经理,跟其他部门的协作在很多情况下并不存在标准的答案,问题常...
2019-02-16 23:55:16 601
原创 产品经理必修课(8):需求管理
跟了解订单的生命周期就能勾画出电商购买流程、了解帖子的生命周期就能勾画出论坛的交流场景一样,从需求的生命周期就能勾画出整个产品设计到实现的流程。在相对成熟、处于发展期的团队,需求管理就是产品经理的核心工作之一。就像长途驾车既要保证方向正确、目标清晰,也要保证在驾驶中的平稳、安全不出差错。需求在不同的阶段,产品经理对这个需求要负的责任是不同的。但需求要牢牢把控在产品经理手中。产品经理对每个需求都...
2019-02-15 22:17:43 997
原创 产品经理必修课(7):文档管理
一、产品经理要不要懂技术?大家通常提到的产品经理,除了常规意义上全权负责产品的产品经理之外,还有产品设计师、用户体验产品经理,以及后台产品经理、需求分析师等很多种。不同的公司,产品经理负责的事务也各不相同。从行业角度,也可以分为技术型产品的 PM、设计型产品的 PM、运营导向产品的 PM。再细一点划分,还可以分出电商产品的 PM、社交产品的PM或者搜索产品的 PM等。在某招聘网站上,产品经理的...
2019-02-13 23:53:55 1801
原创 产品经理必修课(6):用户体验
用户体验到底是什么概念呢?发布于2012年的ISO 9241-210标准将用户体验定义为“人们对于针对使用或期望使用的产品、系统或者服务的认知印象和回应”。这个概念当然比较严谨了,但不够直观。好的用户体验可以囊括很多产品的特性,让用户觉得满意。互联网知名的信息构架专家、Semantic Studios总裁 Peter Morville曾经提到,他认为用户体验包含7个模块,可以用蜂窝模型来展现。...
2019-02-13 00:25:06 1326 1
原创 产品经理必修课(5):用户研究
用户研究的目的是理解用户,是一系列方法的笼统概称。凡是能够协助我们理解用户并以研究得到的结论,指导我们设计产品和优化产品的方法和工具都可以算作用户研究的范畴。用户研究是个很大的课题,可能会在规模略大的公司才出现,但对产品经理来说,从做第一个版本的产品开始,其实就要开展用户研究的工作了,获取一些用户相关的数据和信息,才能做进一步需求分析和产品设计。我们在第3章里提到的找用户痛点的方法,也可以算是用...
2019-02-11 22:06:09 2031
原创 产品经理必修课(4):深挖需求
产品经理不应只关心浮于表面的需要,而是要关心需求背后的真正诉求。阿尔伯塔大学的一门关于软件设计的课程中,用Want(需要)和Needs(需求)来区分这两者,前者是“希望在产品中看到的功能”而后者是“确定的具体问题,留待产品解决的问题”。对于很多用户表面的要求,以及形式上我们“看似”要满足的需求,很多其实都值得商榷。对待这些需求,我们最需要做的是发掘更深处它们代表的是什么、真正的问题在哪里。下面...
2019-02-10 22:39:24 1601
原创 产品经理必修课(3):MVP与痛点
MVP是埃里克·莱斯所著《精益创业》中提到的概念,它的目的是验证两件事:一是产品满足了用户需求;二是产品能够创造商业价值。这恰好跟前文我们提到的,初创团队的产品经理应该探讨产品模型和商业模式对应。MVP就是验证它们的手段。许多产品都是从小做大的,而非起初就做得非常臃肿。打开微信,我们能看到它有许多功能。在图3-1中,我们可以看到微信大致的功能概览。作为已经有五年多寿命的国民级产品,微信的功能远称...
2019-02-08 21:48:26 1307
原创 产品经理必修课(2):找到产品核心价值
在刚开始做产品的时候,我心里想到的无非就是找到需求做功能,做完了再找新的需求做功能,以为产品经理就只是不断发现需求、不断实现功能的人。后来,遇到很多前辈,他们都会提到“核心价值”这件事,起初我很不理解:只要满足用户的需求,不就都是有价值的吗?经过了几年的成长,我终于意识到了核心价值的意义。产品经理的经典书籍《用户体验要素》里提到了产品设计的多个层级,提出了Web时代互联网产品要自下而上设计的概...
2019-02-08 00:26:15 1173
原创 产品经理必修课(1):点子与方案
在知乎上,有一个提问是:“我有一个App创意,如何将其实现?”关注的人非常多,因为大家平时都会有很多想法,也想把这些想法付诸实践,看能否做出一款可用的互联网产品。事实上,所有的产品不仅仅是一个点子就能支撑的,还要考察具体实现的逻辑是否清晰、方案是否可行。在产品尚未成型、什么都没有时,作为产品经理要有建立在对市场和用户的理解上的雏形方案。在相对成熟的公司,也要清楚公司的产品是怎样从简单的点子和想...
2019-02-07 17:08:22 1686
原创 设计原则之接口和面向接口编程
当我们谈到接口的时候,通常会涉及以下几种含义,下面先简单介绍。我们经常说一个库或者模块对外提供了某某API接口。通过主动暴露的接口来通信,可以隐藏软件系统内部的工作细节。这也是我们最熟悉的第一种接口含义。第二种接口是一些语言提供的关键字,比如Java的interface。interface关键字可以产生一个完全抽象的类。这个完全抽象的类用来表示一种契约,专门负责建立类与类之间的联系。第三种接...
2019-02-06 08:30:21 558 1
原创 设计原则之开放-封闭原则
在面向对象的程序设计中,开放-封闭原则(OCP)是最重要的一条原则。很多时候,一个程序具有良好的设计,往往说明它是符合开放-封闭原则的。开放-封闭原则最早由Eiffel语言的设计者Bertrand Meyer在其著作Object-Oriented Software Construction 中提出。它的定义如下:软件实体(类、模块、函数)等应该是可以扩展的,但是不可修改。扩展window.o...
2019-02-05 08:35:23 551 2
原创 设计原则之单一职责原则
就一个类而言,应该仅有一个引起它变化的原因。在JavaScript中,需要用到类的场景并不太多,单一职责原则更多地是被运用在对象或者方法级别上,因此本节我们的讨论大多基于对象和方法。单一职责原则(SRP)的职责被定义为“引起变化的原因”。如果我们有两个动机去改写一个方法,那么这个方法就具有两个职责。每个职责都是变化的一个轴线,如果一个方法承担了过多的职责,那么在需求的变迁过程中,需要改写这个方法...
2019-02-02 19:36:17 2065
原创 代码重构
模式和重构之间有着一种与生俱来的关系。从某种角度来看,设计模式的目的就是为许多重构行为提供目标。在实际的项目开发中,除了使用设计模式进行重构之外,还有一些常见而容易忽略的细节,这些细节也是帮助我们达到重构目标的重要手段。这里挑选一些进行介绍,其中有一部分思想来自Martin Fowler的名著《重构:改善既有代码的设计》,虽然该书是使用Java语言写成的,但这些重构的技巧,有很大一部分可以为Ja...
2019-02-01 21:42:29 1840
原创 JavaScript设计模式之适配器模式
适配器模式的作用是解决两个软件实体间的接口不兼容的问题。使用适配器模式之后,原本由于接口不兼容而不能工作的两个软件实体可以一起工作。适配器的别名是包装器(wrapper),这是一个相对简单的模式。在程序开发中有许多这样的场景:当我们试图调用模块或者对象的某个接口时,却发现这个接口的格式并不符合目前的需求。这时候有两种解决办法,第一种是修改原来的接口实现,但如果原来的模块很复杂,或者我们拿到的模块...
2019-01-31 23:48:29 169
原创 JavaScript设计模式之状态模式
状态模式是一种非同寻常的优秀模式,它也许是解决某些需求场景的最好方法。虽然状态模式并不是一种简单到一目了然的模式(它往往还会带来代码量的增加),但你一旦明白了状态模式的精髓,以后一定会感谢它带给你的无与伦比的好处。状态模式的关键是区分事物内部的状态,事物内部状态的改变往往会带来事物的行为改变。初识状态模式我们来想象这样一个场景:有一个电灯,电灯上面只有一个开关。当电灯开着的时候,此时按下开关...
2019-01-30 21:54:06 294
原创 JavaScript设计模式之装饰者模式
在程序开发中,许多时候都并不希望某个类天生就非常庞大,一次性包含许多职责。那么我们就可以使用装饰者模式。装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象。在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活,还会带来许多问题:一方面会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之改变;另一方面,继承这种功能复用方式通常被...
2019-01-29 21:48:30 268
原创 JavaScript设计模式之中介者模式
在我们生活的世界中,每个人每个物体之间都会产生一些错综复杂的联系。在应用程序里也是一样,程序由大大小小的单一对象组成,所有这些对象都按照某种关系和规则来通信。平时我们大概能记住10个朋友的电话、30家餐馆的位置。在程序里,也许一个对象会和其他10个对象打交道,所以它会保持10个对象的引用。当程序的规模增大,对象会越来越多,它们之间的关系也越来越复杂,难免会形成网状的交叉引用。当我们改变或删除其中...
2019-01-28 21:44:11 2490
原创 JavaScript设计模式之职责链模式
职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。职责链模式的名字非常形象,一系列可能会处理请求的对象被连接成一条链,请求在这些对象之间依次传递,直到遇到一个可以处理它的对象,我们把这些对象称为链中的节点,如图13-1所示。现实中的职责链模式职责链模式的例子在现实中并不难找到,...
2019-01-27 18:20:10 1279
原创 JavaScript设计模式之享元模式
享元(flyweight)模式是一种用于性能优化的模式,“fly”在这里是苍蝇的意思,意为蝇量级。享元模式的核心是运用共享技术来有效支持大量细粒度的对象。如果系统中因为创建了大量类似的对象而导致内存占用过高,享元模式就非常有用了。在JavaScript中,浏览器特别是移动端的浏览器分配的内存并不算多,如何节省内存就成了一件非常有意义的事情。享元模式的概念初听起来并不太好理解,所以在深入讲解之前...
2019-01-26 22:51:12 2458
原创 JavaScript设计模式之模板方法模式
在JavaScript开发中用到继承的场景其实并不是很多,很多时候我们都喜欢用mix-in的方式给对象扩展属性。但这不代表继承在JavaScript里没有用武之地,虽然没有真正的类和继承机制,但我们可以通过原型prototype来变相地实现继承。不过这里并非要讨论继承,而是讨论一种基于继承的设计模式——模板方法(Template Method)模式。模板方法模式的定义和组成模板方法模式是一种...
2019-01-26 09:42:51 1319
原创 JavaScript设计模式之组合模式
我们知道地球和一些其他行星围绕着太阳旋转,也知道在一个原子中,有许多电子围绕着原子核旋转。我曾经想象,我们的太阳系也许是一个更大世界里的一个原子,地球只是围绕着太阳原子的一个电子。而我身上的每个原子又是一个星系,原子核就是这个星系中的恒星,电子是围绕着恒星旋转的行星。一个电子中也许还包含了另一个宇宙,虽然这个宇宙还不能被显微镜看到,但我相信它的存在。也许这个想法有些异想天开,但在程序设计中,也有...
2019-01-25 02:11:43 1479
原创 JavaScript设计模式之命令模式
假设有一个快餐店,而我是该餐厅的点餐服务员,那么我一天的工作应该是这样的:当某位客人点餐或者打来订餐电话后,我会把他的需求都写在清单上,然后交给厨房,客人不用关心是哪些厨师帮他炒菜。我们餐厅还可以满足客人需要的定时服务,比如客人可能当前正在回家的路上,要求1个小时后才开始炒他的菜,只要订单还在,厨师就不会忘记。客人也可以很方便地打电话来撤销订单。另外如果有太多的客人点餐,厨房可以按照订单的顺序排队...
2019-01-24 00:17:00 1961
原创 JavaScript设计模式之发布—订阅模式
发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。在JavaScript开发中,我们一般用事件模型来替代传统的发布—订阅模式。现实中的发布-订阅模式不论是在程序世界里还是现实生活中,发布—订阅模式的应用都非常之广泛。我们先看一个现实中的例子。小明最近看上了一套房子,到了售楼处之后才被告知,该楼盘的房子早已售罄。好在售...
2019-01-22 22:41:29 2921
原创 JavaScript设计模式之迭代器模式
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。目前,恐怕只有在一些“古董级”的语言中才会为实现一个迭代器模式而烦恼,现在流行的大部分语言如Java、Ruby等都已经有了内置的迭代器实现,许多浏览器也支持JavaScript的...
2019-01-21 22:10:00 1591
原创 JavaScript设计模式之代理模式
代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景。比如,明星都有经纪人作为代理。如果想请明星来办一场商业演出,只能联系他的经纪人。经纪人会把商业演出的细节和报酬都谈好之后,再把合同交给明星签。代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问...
2019-01-20 17:25:35 1548
原创 JavaScript设计模式之策略模式
在程序设计中,我们也常常遇到类似的情况,要实现某一个功能有多种方案可以选择。比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法。这些算法灵活多样,而且可以随意互相替换。这种解决方案就是将要介绍的策略模式。策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。使用策略模式计算奖金策略模式有着广泛的应用。这里我们就以年终奖的计算为例进行介绍。很多...
2019-01-20 09:17:37 2098
原创 JavaScript设计模式之单例模式
单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池、全局缓存、浏览器中的window对象等。在JavaScript开发中,单例模式的用途同样非常广泛。试想一下,当我们单击登录按钮的时候,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的,无论单击多少次登录按钮,这个浮窗都只会被创建一次,那么这个登录浮窗就适合用...
2019-01-19 22:21:18 1250
原创 高阶函数--实现AOP,函数节流,分时函数,惰性加载函数
高阶函数是指至少满足下列条件之一的函数。函数可以作为参数被传递;函数可以作为返回值输出。JavaScript语言中的函数显然满足高阶函数的条件,在实际开发中,无论是将函数当作参数传递,还是让函数的执行结果返回另外一个函数,这两种情形都有很多应用场景,下面就列举一些高阶函数的应用场景。函数作为参数传递把函数当作参数传递,这代表我们可以抽离出一部分容易变化的业务逻辑,把这部分...
2019-01-17 22:42:57 1427
原创 闭包--生存周期,实现命令模式,内存管理
对于JavaScript程序员来说,闭包(closure)是一个难懂又必须征服的概念。闭包的形成与变量的作用域以及变量的生存周期密切相关。下面我们先简单了解这两个知识点。变量的作用域变量的作用域,就是指变量的有效范围。我们最常谈到的是在函数中声明的变量作用域。当在函数中声明一个变量的时候,如果该变量前面没有带上关键字var,这个变量就会成为全局变量,这当然是一种容易造成命名冲突的做法。另外...
2019-01-16 22:43:15 3824
原创 JavaScript中的this、call和apply
在JavaScript编程中,this关键字总是让初学者感到迷惑,Function.prototype.call和Function.prototype.apply这两个方法也有着广泛的运用。我们有必要在学习设计模式之前先理解这几个概念。this跟别的语言大相径庭的是,JavaScript的this总是指向一个对象,而具体指向哪个对象是在运行时基于函数的执行环境动态绑定的,而非函数被声明时的环境...
2019-01-15 22:39:32 1641
原创 JavaScript的面向对象--原型
在以类为中心的面向对象编程语言中,类和对象的关系可以想象成铸模和铸件的关系,对象总是从类中创建而来。而在原型编程的思想中,类并不是必需的,对象未必需要从类中创建而来,一个对象是通过克隆另外一个对象所得到的。就像电影《第六日》一样,通过克隆可以创造另外一个一模一样的人,而且本体和克隆体看不出任何区别。使用克隆的原型模式从设计模式的角度讲,原型模式是用于创建对象的一种模式,如果我们想要创建一个对象...
2019-01-14 22:51:03 1185
原创 JavaScript的面向对象--封装的实现、类型、变化
封装的目的是将信息隐藏。一般而言,我们讨论的封装是封装数据和封装实现。这里将讨论更广义的封装,不仅包括封装数据和封装实现,还包括封装类型和封装变化。封装数据在许多语言的对象系统中,封装数据是由语法解析来实现的,这些语言也许提供了private、public、protected等关键字来提供不同的访问权限。但JavaScript并没有提供对这些关键字的支持,我们只能依赖变量的作用域来实现封装特...
2019-01-13 19:41:57 1492
原创 面向对象的JavaScript--多态
一段“多态”的JavaScript代码 var makeSound = function( animal ){ if ( animal instanceof Duck ){ console.log( '嘎嘎嘎' ); }else if ( animal instanceof Chicken ){ console.log( '咯咯咯' );...
2019-01-12 23:24:03 994
原创 Window对象--计时器,定位与导航,窗口
计时器 setTimeout()和setInterval()可以用来注册在指定的时间之后单次或重复调用的函数。因为它们都是客户端JavaScript中重要的全局函数,所以定义为Window对象的方法,但作为通用函数,其实不会对窗口做什么事情。Window对象的setTimeout()方法用来实现一个函数在指定的毫秒数之后运行。setTimeout()返回一个值,这个值可以传递给c...
2019-01-12 10:01:29 2370
原创 Web浏览器中的JavaScript
客户端JavaScriptWindow对象是所有客户端JavaScript特性和API的主要接入点。它表示Web浏览器的一个窗口或窗体,并且可以用标识符window来引用它。Window对象定义了一些属性,比如,指代Location对象的location属性,Location对象指定当前显示在窗口中的URL,并允许脚本往窗口里载入新的URL://设置location属性,从而跳转到新的We...
2019-01-10 22:46:40 5578
原创 正则表达式--RegExp对象
正则表达式是通过RegExp对象来表示的。除了RegExp()构造函数之外,RegExp对象还支持三个方法和一些属性。接下来会对RegExp模式匹配方法和属性展开讲述。RegExp()构造函数带有两个字符串参数,其中第二个参数是可选的,RegExp()用以创建新的RegExp对象。第一个参数包含正则表达式的主体部分,也就是正则表达式直接量中两条斜线之间的文本。需要注意的是,不论是字符串直接量还...
2019-01-09 22:56:45 8121
原创 正则表达式的模式匹配
JavaScript中的正则表达式用RegExp对象表示,可以使用RegExp()构造函数来创建RegExp对象,不过RegExp对象更多的是通过一种特殊的直接量语法来创建。就像通过引号包裹字符的方式来定义字符串直接量一样,正则表达式直接量定义为包含在一对斜杠(/)之间的字符,例如:var pattern=/s$/;运行这段代码创建一个新的RegExp对象,并将它赋值给变量pattern。这...
2019-01-08 22:11:45 4183
原创 类和模块--ECMAScript 5中的类
让属性不可枚举 例9-6中的Set类使用了一个小技巧,将对象存储为“集合”的成员:它给添加至这个“集合”的任何对象定义了“对象id”属性。之后如果在for/in循环中对这个对象做遍历,这个新添加的属性也会遍历到。ECMAScript 5可以通过设置属性为“不可枚举”(nonenumerable)来让属性不会遍历到。例9-17展示了如何通过Object.defineProperty()来做到...
2019-01-07 23:16:09 1253
原创 子类的定义,与组合的比较
在面向对象编程中,类B可以继承自另外一个类A。我们将A称为父类(superclass),将B称为子类(subclass)。B的实例从A继承了所有的实例方法。类B可以定义自己的实例方法,有些方法可以重载类A中的同名方法,如果B的方法重载了A中的方法,B中的重载方法可能会调用A中的重载方法,这种做法称为“方法链”(method chaining)。同样,子类的构造函数B()有时需要调用父类的构造函数A...
2019-01-06 22:43:00 5407
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人