‘壹’ 为何大多数程序猿会转行做产品经理的背后的原因有哪些
产品经理这个工作对之前的工作经历或者学历没有太高的要求,再加上这两种工作有联系,作为程序员了解产品的属性或者性质,程序员的沟通能力很强,所以可以好好的胜任产品经理这个工作。
‘贰’ 好累,程序员听不懂产品经理提的需求,问多了,产品经理嫌烦。该怎么办
这个东西应该有一定经验积累会理解比较快,也是一个过程。只有多沟通,在沟通前想想沟通的目的,这次沟通要解决什么问题。用笔记下来。然后在实操,在实操过程中如果遇到问题先想一想,试着自己去解决一下。再去询问,至少让别人感受你是在用心做这件事。而且也是想做好这件事。其实你们的目的都是一致的。注意方式方法,不要让别人觉得你一个问题重复的问还没什么结果。大家都有自己的事情都会比较烦。
‘叁’ 程序员面试经常被提到的问题
java 程序员常用面试题- -
Java程序员面试三十二问
Java程序员面试三十二问
作者:佚名 来自:未知
第一,谈谈final, finally, finalize的区别。
第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以
implements(实现)interface(接口)?
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
第四,&和&&的区别。
第五,HashMap和Hashtable的区别。
第六,Collection 和 Collections的区别。
第七,什么时候用assert.
第八,GC是什么? 为什么要有GC?
第九,String s = new String("xyz");创建了几个String Object?
第十,Math.round(11.5)等于多少? Math.round(-11.5)等于多少?
第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
第十二,sleep() 和 wait() 有什么区别?
第十三,Java有没有goto?
第十四,数组有没有length()这个方法? String有没有length()这个方法?
第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()?
它们有何区别?
第十七,给我一个你最常见到的runtime exception.
第十八,error和exception有什么区别?
第十九,List, Set, Map是否继承自Collection接口?
第二十,abstract class和interface有什么区别?
第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是
synchronized?
第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体
类(concrete class)?
第二十三,启动一个线程是用run()还是start()?
第二十四,构造器Constructor是否可被override?
第二十五,是否可以继承String类?
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它
方法?
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行
,什么时候被执行,在return前还是后?
第二十八,编程题: 用最有效率的方法算出2乘以8等于几?
第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对
?
第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后
的结果,那么这里到底是值传递还是引用传递?
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
第三十二,编程题: 写一个Singleton出来。
以下是答案
第一,谈谈final, finally, finalize的区别。
final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父
类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,
可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能
读取,不可修改。被声明为final的方法也同样只能使用,不能重载finally?再异常处理时提供 finally
块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入
finally 块(如果有的话)。
finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去
之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是
在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执
行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以
implements(实现)interface(接口)?
匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口
,由另一个内部类实现。
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套
类最大的不同就在于是否有指向外部的引用上。具体可见http:
//www.frontfree.net/articles/services/view.asp?id=704&page=1
注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2
不能从一个static内部类的一个对象访问一个外部类对象
第四,&和&&的区别。
&是位运算符。&&是布尔逻辑运算符。
第五,HashMap和Hashtable的区别。
都属于Map接口的类,实现了将惟一键映射到特定的值上。
HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步
的。
第六,Collection 和 Collections的区别。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。
第七,什么时候用assert。
断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为
false,那么系统会报告一个 AssertionError。它用于调试目的:
assert(a > 0); // throws an AssertionError if a <= 0
断言可以有两种形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。
不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参
数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任
何方式改变程序的状态。
第八,GC是什么? 为什么要有GC? (基础)。
GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收
集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
第九,String s = new String("xyz");创建了几个String Object?
两个对象,一个是"xyx",一个是指向"xyx"的引用对象s。
第十,Math.round(11.5)等于多少? Math.round(-11.5)等于多少?
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;
第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为
s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。
第十二,sleep() 和 wait() 有什么区别? 搞线程的最爱
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。
这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)"醒来"的线程具有更
高的优先级,(b)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对
象进入等待状态,直到被唤醒或等待时间到。
第十三,Java有没有goto?
Goto?java中的保留字,现在没有在java中使用。
第十四,数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。
String有有length()这个方法。
第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类
之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其
父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子
类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或
有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改
变返回值的类型。
第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它
们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相
等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的
内容和类型相配的话,返回真值。
第十七,给我一个你最常见到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException,
BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException,
CMMException, , DOMException, EmptyStackException,
IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException,
IllegalStateException, ImagingOpException, IndexOutOfBoundsException,
MissingResourceException, NegativeArraySizeException, NoSuchElementException,
NullPointerException, ProfileDataException, ProviderException, RasterFormatException,
SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException,
UnsupportedOperationException
第十八,error和exception有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能
处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
第十九,List, Set, Map是否继承自Collection接口?
List,Set是
Map不是
第二十,abstract class和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基
本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而
可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象
静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代
之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的
接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量
。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即
将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。
由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类
型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是
synchronized?
都不能
第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类
(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类
必须有明确的构造函数。
第二十三,启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由
JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
第二十四,构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
第二十五,是否可以继承String类?
String类是final类故不可以继承。
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它
方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行
,什么时候被执行,在return前还是后?
会执行,在return前执行。
第二十八,编程题: 用最有效率的方法算出2乘以8等于几?
有C背景的程序员特别喜欢问这种问题。
2 << 3
第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对,有相同的hash code。
第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后
的结果,那么这里到底是值传递还是引用传递?
是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数
的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int
、 short、 char 或者 byte。long,string 都不能作用于swtich。
第三十二,编程题: 写一个Singleton出来。
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,
在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些
第三十三 Hashtable和HashMap
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为
contains方法容易让人引起误解。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,
不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
‘肆’ APP上线出重大bug,产品经理欲开除程序员网友:把你自己开了!
对于程序员而言,出现bug就像吃饭一样稀松平常。出现bug?改就是了。但最近出了个让众网友都啧啧称奇的事。某公司的APP上线之后,出现了重大bug,这位产品经理居然去网上问该不该开出程序员。顿时,众程序员就炸了。这是什么情况呢?
为什么会有这么多程序员都气炸呢?这么说吧,首先,程序员不可能一点bug都不出,但是现在这么重大的bug到APP上线了才被发现。很明显是测试的责任更大,现在这个产品经理却是让程序员走人。再者,不管是测试还是前端的错,首先,最大的责任应该是这个产品经理的错。而他,现在只想找程序员的责任。最后,出现了错误,他的第一想法不是解决问题,不是找出各部门的责任,不好好复盘而一味的甩锅给程序员们。
众网友也是气愤不已,表示,开!就应该让这个产品经理把自己开了,不懂前后端还敢管程序员做APP。出了事情不自己扛还找人背锅。另一部分则表示赶紧开除程序员,放他们一条生路。
不管怎么说,这位产品经理的行为,着实让人十分寒心。身为管理者,出事了首先就应该从自己找原因。我们公司的负责人,有问题首先都是自己先承担,然后再说如何去惩罚出错误的部门。即便是惩罚也不会说像这样直接让人走人。说实话,这种行为就像夫妻吵架说离婚一样的性质。即便后来问题解决,也和好了,但是心却寒了。
对此,各位小伙伴有什么不同的想法呢?
‘伍’ 为防被程序员“砍”,产品经理需要注意这些场景
互联网行业中,众人热衷于讨论“程序员砍产品经理”。虽然,“砍”更多是调侃的意思,一种消遣工作的方式;但是,这不是一个饭后笑话,侧面反应了产品经理和程序员间的对立关系。很多时候,产品经理和程序员间就像对手,产品研发过程就像打仗,总要争个你死我亡。“砍”的本质,是程序员表达对产品经理的不满,也是一种情绪的宣泄。
在产品研发的过程中,产品经理与程序员对立关系,会严重影响项目的推进。一旦产品经理和程序员对立关系公开化,很容易导致团队人心涣散。这种对立关系,经常滋生出一些极端的事情,骂娘、打架已屡见不鲜。
下文就列举一些程序员想砍产品经理的场景。这些场景都是我过去和很多程序员朋友交流时,他们遇到的对产品不满的场景。这些场景,都会以产品经理的沟通话语表现出来。通过这些场景,去解析这种对立关系产生的原因。以及,作为对照,产品经理应该如何规避和处理这种对立关系。
这样说法是程序员们最不喜欢的,最容易惹毛程序员的。这句话,在程序员们看来就是削减工时、加班的代名词,他们当然不喜欢。而且他们也非常讨厌,一个非技术人员为技术人员做技术难度的定论。简不简单,都需要技术人员做了技术评估,才能下结论。
这种言语,会让程序员们觉得产品经理不靠谱。大家通常都是比较排斥借鉴。借鉴你也得有合理明确的理由。以我某程序员朋友的话来说:微信怎么做的,你就怎么做,那你不如去微信做产品算了。
每个产品,在表面的UI下,都有其背后的复杂的业务逻辑。如果产品经理只是叫程序员照着某个产品做,很多时候技术们是很难实现的,因为他们也需要弄懂背后的逻辑和流程。当然,这应该是产品经理的工作。
这就是抬杠。产品经理虽然名字里面有“经理”二字,但并没有经理的权利,当然不能命令合作的技术们。这句话,言下之意也是拒绝了商量和讨论。而程序员也需要参与感和团队感。
这就是质疑他人能力,是人都不会喜欢。如果产品经理提出的方案,程序员们没有理解。那就说明产品经理的解释说明和文档,做的不够优秀,不够简洁易懂。让程序员们理解需求,是产品经理的基本工作内容。
在互联网产品开发中,修改需求和插入新需求都是挺常见的。对于程序员们来说,这是非常不爽的事情。这种操作通常会打断程序员的思路,思路被打断是非常痛苦的。当然,这样也会影响他们的开发效率。更可怕的是,反复的修改需求,会使他们有种劳动成果不被尊重的感受,同时也会对项目的未来抱有怀疑的态度。反复的更改方案,也说明产品经理设计是未经过严密的论证,或对细节的把控是不够。
程序员都比较讨厌反复的催促。当项目的节点确定后,技术们会严格遵守节点,产品应该信任他们。当然,时间比较紧凑时,反复催促也会加大程序员们的压力,使他们变得非常烦躁。在这种时候,催促就是添麻烦。
甩锅会导致团队分崩离析,人心不齐。不管任何问题,都是团队的责任,不要将责任指定给某人。特别是在项目复盘时,如果心态不好同事,这是非常难堪的。所以,我们要尽量以原因和结果为导向,而不是责任为导向。
程序员也是也是团队的一份子,有权利知道知道需求的背景。同时,了解需求背景也利于程序员们更好的开发程序。
产品经理给程序员们画饼是最不切实际的,只会引起大家的反感。程序员都是喜欢偏实际的东西,虚的东西只会招致白眼。
任何传递给程序员的需求,都是需要有计划和规范的。如果口头传达一个需求,很容易导致开发出的功能与需求不匹配。同时,因为缺乏相关的记录和文档,可能会造成需求流失。这对于程序员们来说,可能就是延迟、加班、返工、担责等等风险。这是团队合作的大忌,也是项目管理不专业的体现。
以上的这些场景,可能出现一次,程序员们都会顺着我们的想法做。但是,这会渐渐改变程序员们的心态,最终会使产品经理与程序员间产生隔阂和矛盾。如果出现这些场景,作为产品经理都需要小心的处理好,以免影响项目的正常推进。当然,最好是不要出现这些场景。作为产品经理,我们的最终目标,都是要保证我们的产品,准时、保质、保量的落地。
产品经理在与程序员们合作时,产品经理需要讲究合作共赢、互相体谅。在产品经理的相关工作中,最要避免的就是抬杠。抬杠是一切矛盾的根源。很多时候,产品经理要站在程序员的角度考虑问题。比如,对于产品来说可能就是改改需求,但对于程序员,他们更在意的可能是因为改需求而导致的加班。
产品经理在工作中,经常会追求产品上的极致。追求极致本身是好事,但是切忌过分偏执。我们也需要考虑团队的现状和资源,在极致和现实间寻找均衡。毕竟,如果没有乔布斯的团队,要像乔布斯一样做产品,只会拖垮团队。
在产品开发的过程,改需求、改方案等项目异常,都是不可避免的。这是项目管理的第一部分。如何进行项目异常的处理,考验的是产品经理的沟通能力和项目管理能力。产品经理需要在保持技术们高效工作的情况下,完成项目异常的处理。
当然,在产品经理工作中,矛盾的根源也并不总是产品经理。有时候,也可能是某些程序员的性格或者对该工作的态度导致的。这时候,产品经理要明确,作为团队的润滑剂,有责任推动和协调大家的工作。如果,矛盾不可调和,我们需要尽早提出问题、控制风险,避免“勉强”行事。
有时候,程序员在私下评价一起工作的产品经理时,总是会补加一句“我感觉我也能做产品经理”。这句话的背后,是产品经理没有让程序员们感受到产品工作的价值。在这种背景下,产品经理是很难获取程序员们的注重,也会为很多争论埋下诱因。那如何感受到我们工作的价值那?其实很简单,就是保持工作信息的透明。将我们针对需求和产品做的相关工作,体现在我们的沟通或者文档中。
导致程序员想“砍”产品经理,本质是产品经理工作方式的问题,也有情商的问题。在我的产品经理工作经验中,我总结下了以下四点,我们需要注意和避免的。这四点,都可以和上文的场景相对应,是最容易慢慢改变程序员的心态的。
‘陆’ 产品经理如何应对技术的“做不了”这样的问题
我们先了解一个问题“做不了”,为什么做不了,无非就是程序员技术问题,做不了,金钱问题做不了,产品冲突做不了,那么认识到这几个问题了,产品经理还有做不了的事吗?马化腾都说了“在腾讯不要说什么事是技术上无法实现的”
第一沟通问题。产品经理尽可能地向开发人员沟通,要做到这一点就是要解决什么样的问题,我想从解决问题的角度看,有时我们应该听开发商解决这种方案”。
总之就是要和技术人员多沟通,了解开发产品的困难等等。
‘柒’ 程序员面试时,总是问有没有项目
面试的时候肯定会问这个的,有项目经验的自然比较占优势。
如果你参与过项目,一般面试的会就你在项目中扮演的角色和负责的主要工作进行一些询问,比如项目的大体架构,采用了什么样的技术,然后就可以顺势问你一个某某技术领域的问题,看你究竟掌握的如何。
抄写代码也是一种能力,因为刚开始的时候,很多东西都不会都是需要模仿别人的,不过在面试的时候这种经历应该不会被算做项目经历。
‘捌’ 产品经理怎么和程序员打交道【3】
经常有人问我:“嗨,费杰你好!请问阿里巴巴的需求文档怎么写?“,但很少听到人谈:“嗨,哥们你好!请问产品经理怎么和程序员打交道?”你回去稍微琢磨了一下,心里就会得到下面三种情况:1) 很多产品经理之前就是程序员,所以非常了解程序员是什么样的一个状态;2) 很多产品经理还停留在关注自己产品规划、设计本身,缺乏对团队配合的思考;3) 很多产品经理,其实是有和程序员打交道的实践技巧、心得的,但没有重视和分享。事实上在很多产品研发体系下,产品经理和程序员因为思考方式、关注范围、职能职责的差异,导致了沟通上的困难。如何更好的与程序员建立起一座畅通的桥梁也是每位产品经理需要思考的问题。一般情况下,产品经理和程序员沟通困难大概的原因:�0�21、得到信息不对称;�0�2�0�2产品经理得到的信息一般集中在:商业需求、商业策略、战略方向、产品规划、运营数据、整体营收、目标任务等方面。产品经理往往在根据公司现阶段的情况,以及市场的竞争情况,做一些产品策略或者一些产品的方案的策划、发起、实施。
所以这个过程中,产品经理扮演的角色是翻译:“市场需求、商业需求”,成为:“产品需求”,所有的信息全部围绕需求本身。为什么要做需求?怎么做需求?先做什么需求、后做什么?基于怎么样一个思路去推送产品进行实施、从一个利益平衡获得空间增长指标后达到另外一个利益平衡。程序员不一样,很多时候程序员得到的信息是:有一个需求,可能是小需求、产品需求、或大到项目需求,然后得到一系列需求列表,然后产品经理会让程序员看:“需求”哪些通过code改改就可以实现,哪些是需要开发可以实现,哪些是技术或构架或因为成本的原因不能实现。
所以在这个过程中,程序员扮演的角色是翻译:“产品需求”,成为:“技术语言”的评估,所有的信息全部围绕开发需求本身。如何开发这些需求?是沟通数据库增加字段?调用接口?开发新的接口?需要开发组件?重新构架引擎?来实现满足或支撑这些需求?那这个时候问题来了,很多情况下我们只是把程序员当做一个写代码,通过编程语言来操作计算机完成需求的工具了。�0�22、沟通语言不对称;�0�2�0�2说到两者沟通的语言,这肯定是困扰产品经理本身的。产品经理的语言是:“描述“、”形容“,我也见过很多产品经理,很多人的需求文档就是漫天飞舞的文字,一整段的描述+描述,不要说程序员看不清,可能过段时间连自己都看不清楚。除了书面语言,产品经理的沟通语言也是含糊的,没有太多的逻辑去组织,很多时候总是试图去述说一个需求,被程序员的一个计算机术语而打断。程序员的语言,更偏向于技术化。很多产品经理做过技术,有技术背景,但是还有很多产品经理不懂得技术。所以在这个时候,程序员在解说或回答一个需求的时候,会把自己习以为常的变量、函数、实现方式说出来。于是很多产品经理听到:“Sdk、webshell、select、api、组件、插件、控件“等等的时候会云里雾里,那这个时候问题来了,很多情况下我们总站在自己的立场上、自己的世界里认为别人也懂自己在说什么?实际呢?大家都是听得一半一半,沟通没有彻底到位。�0�23、思考角度不对称�0�2�0�2产品经理思考的角度在于产品本身,对技术的细节、技术的性能没有太多的发言权。很多产品经理要是的实现的业务逻辑,不管程序员是采用:c++ 、java、php、Python、找开源代码改的,还是自己写的都没有关系。程序员只要在约定的时间里,把约定的业务逻辑开发出来就可以,产品经理不去会考虑目前服务器的配置、程序员手上任务的配置、技术能力的情况,要的是结果。而且很情愿的认为团队中的工程师都是世界上最好的工程师,想做什么都可以做,对因为技术原因而不能支持实现需求不能接受。程序员思考的角度有点区别,我也看到不到程序员本身对产品追求完美对需求的背景、意义去研究了解;但很多程序员还是停留在自己接单子任务一样来一个做一个的境界,做好了自己玩自己的。程序员考虑程序实现的方式同样的一个请求是get还是post,程序员考虑代码的性能,从而采取不一样的方案去实现需求,考虑请求并发量压力和安全性。但是很多情况下,程序员对技术的理解会导致有一些业务需求满足不了,不是因为不能实现,是因为实现了觉得是废代码,或者构架不完美了。那这个时候问题来了,很多情况下到底倾斜谁的立场上思考问题?我之前也会碰到很多情况程序员就程序的角度说业务需求不合理,产品经理说程序员消极罢工、霸得蛮。�0�24、考核标准不对称;�0�2�0�2谁也不尿谁,哼!你能把我怎么样。产品经理和程序员有为完全沟通或误会的时候,极端情况下,有一方会罢工。这个时候主要是2个角色的各个考核标准不一样,所以在很多情况下显得非常的无奈。产品经理很可能考核的是方案和上线的时间、产品上线后的数据;而工程师考核的是程序的性能、很多时候产品经理催的急要的急,但程序员每天的时间有限,还是得慢慢构架慢慢开发,程序员开发时间少了,未知的执行BUG没考虑过是要负责的。这个时候问题又来了,产品经理天天干着急!咋办?以上是我结合几年来的工作经验总结出来的,当然这4大因素把很多共性的因素概况进来了。当然过程中还是会因为很多产品经理或程序员本身(个性)的沟通技巧、态度、情商等因素导致的沟通不倡,影响了彼此之间的默契。其实仔细的分析一下,产品经理和程序员打交道的过程中不管是共性的因素还是个性的因素,也不是想象中那么困难。通过一些努力之后,我们总是会找到一些快速和程序员建立沟通桥梁的办法。我个观点如下:�0�21、 要看到项目层面,不要只看需求本身。�0�2�0�2上面说到的几点不管是:“信息不对称“、”沟通的语言不对称“、”思考角度不对称“还是”考核的标准不对称“是我们常见的几个客观隐私。把几个因素抽取出来剖析,发现还是由于我们站问题的视角的高度不一致造成的。产品经理只是看到自己得到了商业的需求,策划了产品的需求,接下来会把很多事情抛给程序员做了,那还是站在需求方的角色中。那如果真正的是站在意识层面的项目经理的角度,这个时候看待问题的视眼会广很多。这个时候你就想着为了做这个项目这个需求,程序员是不是明白了为什么要做?是不是对这哪些需求的优先级有了重要的认识?作为产品经理我用怎么样一种表达方式程序员更明白?是不是需要把时间点等划定?目前程序员的资源和服务器情况允许他们能做的空间是多大?怎么样才能拉动他们的积极性更好的完成这个项目?适当的时候,需要帮助程序员做哪些申请或让步?对产品经理来说,同样张罗一件事情,同样会了得到一个结果,但是中间的过程很可能是完全不一样的。所以因为思考角度仅仅从做完一个需求死磨硬泡上升到,站在项目的角度去考虑各个关节的风险点、时间点,得到的效果是完全不一样的。�0�22、从理解程序员开始,换位思考会更好。�0�2�0�2一直在问一个问题:“程序员是什么一群人?“就和问自己:”产品经理是什么一群人?“一样,有点好笑、有点幼稚。从小工到专家,从CSDN到走出软件作坊,发现很多很多非常优秀的程序员的心声。程序员是什么样一群人?像切西瓜一样一刀一刀切:写php的写Java的写windows C的写liunx C的写C++的编程水平一般的编程水平还行的编程水平牛逼的编程水平大师级的构架牛的数据库牛的勤奋的懒于思考的不会JavaScript的积极的喜欢钻研的……好像都不太合适,因为你找不到解决和工程师沟通的好的办法。而且这些很多是外在的条件,随随都在改变。看到很多朋友一年之间经历几个大项目水平突然猛进,态度、一些特点也变得完全不一样。这个时候你需要的是了解和掌握程序员,作为职场的人,和我们一样的人共同需要的一些特点。如下4点:1) 是不是特别想被肯定、获得尊重;理解、肯定、尊重。这3个词或许非常的空但确确实实是一个非常好的方子。静下心来走近程序员,听听他们的心声、他们的抱怨,或许产品经理和程序员的距离将不再是那么遥远。虽然很多时候我们讲德行说尊重,但真正领悟到心里、落实到行动、表现在态度上的完全不一样的。真正,你是不是一言、一行本真理解、肯定、尊重程序员的,程序员是有感知的。2) 是不是想给产品提供自己的建议,而不是仅仅做一个编程的机器;很多程序员对产品非常热爱、对产品有独特的想法,但多数又局限于技术情节对产品的建议常常被忽视。相信很多程序员都希望参与产品,通过自己的专长改变产品,进而打磨出一款完美的产品。所以产品经理也可以适当的给程序员一点发挥的空间,特别是在技术创新、产品需要技术驱动的方面,在商业可控的层面让程序员发挥排头兵的作用。这样程序员会开足马力投入到开发实施的过程中。3) 是不是不仅仅和人任务指派,需求更多的和谐的人与人之间的沟通建立。产品经理和程序员两者之间没有一个良好的沟通,只是基于做与不做,做好做不好,什么时候做好,这样的功利性沟通肯定是不可靠的。往往两者因默契不够,或一方因沟通技巧不足、对待工作态度不够积极,造成矛盾。建立一个人与人之间的良好沟通,帮助产品经理或程序员更好的认知对方、了解对方,这样无论是在平时的沟通过程,还是在项目的合作过程中更好的促进了解、达成共致都会有一个前提保障。4)是不是需要别人的帮助,让他在非技术领域获得真知。看到很多产品经理朋友和程序员打成一片,和程序员一天聊天、抽烟、一起下班打游戏、打球,甚至有些时候产品头脑风暴的时候要去几个有产品情节的工程师参与前期的讨论,效果都不错。可能这些现象从另外一个层面来解决我们上面的一些疑惑。3、产品经理要改善心智,不断自我学习。�0�2�0�2最近突然觉得说得想的,有点像哲学。群里的一个朋友说了, 其实哲学就是我们生活一些事情表现出来的道路。产品经理跟程序员打交道也好,对待生活也好,我个人认为是产品经理对哲学的认识、理解、应用。产品经理越往下走,抛开产品技能本身不谈,沉淀商业以及人脉资源,都是需要以一种良好、可靠的思维方式去支撑的,也就是所说的心智模型。很多时候产品经理改善心智可以不断的增强一些事物的判断。如:遇到程序员的拒绝的、不行的理由,这个时候你通过分析起码要判断得出来,这个是程序员隔个人的态度问题,还是流程问题,有一点微妙的。所以产品经理需要不断的学习,学习提高软技能。说到学习,回应这篇《产品经理怎么样和程序员打交道》中,程序员常用的一些技术原理、技术术语得去学习一下、研究一下。Right? OK, End !