注意事項:
1.單向一對多
只需在“一”放進(jìn)行配置
2.雙向一對多
需要在關(guān)聯(lián)雙方都加以配置,而且需要在一的一方設(shè)置inverse=true
首先是實體類:
TAddress.java(多的一方)
public class TAddress implements Serializable {
private static final long serialVersionUID = 1121137857691229229L;
private Integer id;
private String address;
private String zipcode;
private String tel;
private String type;
private TUser user; //必須有
............
}
TUser.java(一的一方)
public class TUser implements Serializable {
private static final long serialVersionUID = 1224691192698621789L;
private Integer id;
private Integer age;
private String name;
@SuppressWarnings("rawtypes")
private Set address = new HashSet(); //多的一方放在集合中
....................
}
然后是各個實體類的配置文件
TAddress.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<!-- 一對多 -->
<hibernate-mapping>
<class name="com.model.TAddress" table="t_address"
dynamic-update="false" dynamic-insert="false">
<id name="id" type="java.lang.Integer" column="id" unsaved-value="0">
<generator class="native" />
</id>
<property name="address" column="address" type="string" />
<property name="tel" column="tel" type="string" />
<property name="zipcode" column="zipcode" type="string" />
<property name="type" column="type" type="string" />
<!-- 必須有many-to-one 否則關(guān)聯(lián)字段(user_id)為null -->
<many-to-one name="user"
class="com.model.TUser"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="user_id"
not-null="true">
</many-to-one>
</class>
</hibernate-mapping>
TUser.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<!-- 一對多 外鍵關(guān)聯(lián) -->
<!-- Select from TUser where id=1 Select from TUser where id=1 to Select
from TUser where id=1 or id=2 -->
<!-- batch-size 批量加載機(jī)制 可以自定義每次批量加載的數(shù)量 -->
<hibernate-mapping>
<class name="com.model.TUser" table="t_user" dynamic-update="true"
>
<id name="id" type="java.lang.Integer" column="id" unsaved-value="0">
<generator class="native" />
</id>
<property name="name" column="name" />
<property name="age" column="age" />
<set name="address" table="t_address" cascade="all" order-by="zipcode asc"
lazy="true" inverse="true">
<key column="user_id" /><!-- 確定關(guān)聯(lián)的外鍵列 -->
<one-to-many class="com.model.TAddress" />
</set>
</class>
</hibernate-mapping>
其次是hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- properties -->
<!-- 數(shù)據(jù)庫URL -->
<property name="hibernate.connection.url">jdbc:mysql://localhost/onetomany</property>
<!-- 數(shù)據(jù)庫JDBC驅(qū)動 -->
<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
<!-- 數(shù)據(jù)庫用戶名 -->
<property name="hibernate.connection.username">root</property>
<!-- 數(shù)據(jù)庫密碼 -->
<property name="hibernate.connection.password">hello</property>
<!-- 數(shù)據(jù)庫方言 -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- 是否日志調(diào)試 -->
<property name="show_sql">true</property>
<!-- 是否使用數(shù)據(jù)庫外連接 -->
<property name="use_outer_join">true</property>
<!-- 事務(wù)管理 使用JDBC Transaction(使用JTA會報錯) -->
<property name="transaction.factory_class">
net.sf.hibernate.transaction.JDBCTransactionFactory
</property>
<!-- 指定hibernate每次提交的SQL數(shù)量 對批量操作的性能提升幫助很大!!!!!!!!!!!!! -->
<property name="hibernate.jdbc.batch_size">25</property>
<!-- 映射文件配置,配置文件名必須包含其相對于根的全路徑 -->
<mapping resource="com/model/TUser.hbm.xml" />
<mapping resource="com/model/TAddress.hbm.xml" />
</session-factory>
</hibernate-configuration>
測試代碼(部分)
增加
public void testSave(){
try {
Transaction tx=session.beginTransaction();
// TUser user=(TUser) session.load(TUser.class, 1);
TUser user=new TUser();
user.setName("zhangsan");
user.setAge(20);
TAddress address=new TAddress();
address.setAddress("jingsan");
address.setTel("1361380");
address.setZipcode("45000");
address.setType("java");
address.setUser(user); //設(shè)置關(guān)聯(lián)的TUser對象
user.getAddress().add(address);
session.save(user); //級聯(lián)更新
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
}
}
查詢
public void testLoad(){
try {
Transaction tx=session.beginTransaction();
String hql="from TUser where name='zhangsan'";
List list=session.createQuery(hql).list();
System.out.println("-------------1------------");
Iterator iter=list.iterator();
while(iter.hasNext()){
TUser user=(TUser) iter.next();
System.out.println("--------------2------------");
System.out.println("user.name="+user.getName());
System.out.println("--------------3------------");
System.out.println("user.address="+user.getAddress().size());
System.out.println("--------------4------------");
}
} catch (HibernateException e) {
e.printStackTrace();
}
}
批量插入(可以提高性能)
實現(xiàn)機(jī)制:如果使用了批量加載機(jī)制,hibernate在進(jìn)行數(shù)據(jù)查詢操作前,會自動在當(dāng)前session中尋找是否還存在
其他同類型待加載的數(shù)據(jù),如果有,則將其查詢條件合并在當(dāng)前的select語句中一并提交,這樣,通過
一次數(shù)據(jù)庫操作即完成了多個讀取任務(wù)。
//批量插入操作性能優(yōu)化 通過配置<property name="hibernate.jdbc.batch_size">25</property>
public void testBatchInsert(){
long start=System.currentTimeMillis();
this.importUserList();
long end=System.currentTimeMillis();
System.out.println("批量插入花費(fèi)時間是"+(end-start));
}
public void importUserList(){
try {
Transaction tx=session.beginTransaction();
for(int i=0;i<10000;i++){
TUser user=new TUser();
user.setName("user"+i);
session.save(user);
if(i%25==0){ //以每25個數(shù)據(jù)作為一個處理單元
session.flush();
session.clear();
}
}
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
}
}
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- properties -->
<!-- 數(shù)據(jù)庫URL -->
<property name="hibernate.connection.url">jdbc:mysql://localhost/tablepersubclass</property>
<!-- 數(shù)據(jù)庫JDBC驅(qū)動 -->
<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
<!-- 數(shù)據(jù)庫用戶名 -->
<property name="hibernate.connection.username">root</property>
<!-- 數(shù)據(jù)庫密碼 -->
<property name="hibernate.connection.password">hello</property>
<!-- 數(shù)據(jù)庫方言 -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- 是否日志調(diào)試 -->
<property name="show_sql">true</property>
<!-- 是否使用數(shù)據(jù)庫外連接 -->
<property name="use_outer_join">true</property>
<!-- 事務(wù)管理 使用JDBC Transaction(使用JTA會報錯) -->
<property name="transaction.factory_class">
net.sf.hibernate.transaction.JDBCTransactionFactory
</property>
<!-- 映射文件配置,配置文件名必須包含其相對于根的全路徑 -->
<mapping resource="com/model/TItem.hbm.xml" />
</session-factory>
</hibernate-configuration>
把日志調(diào)試設(shè)置為true,需要log4j.properties配置文件支持
log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=warn, stdout
log4j.logger.net.sf.hibernate=info
### log just the SQL
#log4j.logger.net.sf.hibernate.SQL=debug
### log JDBC bind parameters 把這一行改為debug ###
log4j.logger.net.sf.hibernate.type=debug
### log schema export/update ###
log4j.logger.net.sf.hibernate.tool.hbm2ddl=debug
### log cache activity ###
#log4j.logger.net.sf.hibernate.cache=debug
### log jdbc resource acquisition
#log4j.logger.net.sf.hibernate.impl.BatcherImpl=debug
### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider=trace
一直想學(xué)Linux,在校期間有Linux選修課,看到教員在上課侃侃而談、命令操縱隨心而動……
最近項目忙完了,就開始著手學(xué)習(xí)。本人安裝的Redhat AS4,相關(guān)安裝步驟網(wǎng)上有很多,就不再詳細(xì)介紹了。(如有需要再單獨(dú)寫一遍安裝、初步使用等文章)
安裝完成后輸入賬戶進(jìn)入系統(tǒng)就開始進(jìn)行Linux命令學(xué)習(xí)。
創(chuàng)建用戶:
useradd chenyang【用戶名】 ---添加用戶
passwd chenyang【用戶名】 ---設(shè)置密碼


注:新建用戶"chenyang"在/home下面
用戶之間切換用:su
清屏命令:clear
顯示當(dāng)前用戶:whoami
userdel chenyang【用戶名】 ---刪除用戶

userdel –rf chenyang【用戶名】 ---刪除用戶所在的目錄

創(chuàng)建組:
groupadd newgroup【組名】 ---添加組
注:新建組在/etc下面,用more group查看

groupdel newgroup 【組名】 ---刪除組

安裝JDK:
1.
先查看系統(tǒng)是否有默認(rèn)的jdk rpm -qa|grep gcj
如果有可以選擇卸載或繼續(xù)使用 卸載:rpm –e 要卸載的jdk
2.
下載jdk for Linux,比如 jdk-6u25-linux-i586-rpm.bin
3.
上傳到Linux系統(tǒng)中,使用SSH SecureShellClient,SSH SecureShellClient是非常好用的把window上的文件上傳到Linux上的工具,我用的是從這http://download.csdn.net/source/3525638下載的,網(wǎng)友可以也可以從別的地方下載
4.
文件上傳到Linux系統(tǒng)中后,需要改變文件權(quán)限,不然不能安裝 chmod 777 jdk-6u25-linux-i586-rpm.bin
5.
./jdk-6u25-linux-i586-rpm.bin(中間不能有空格)
6.
安裝jdk rpm -ivh jdk-6u25-linux-i586.rpm
安裝成功后java目錄在/usr下面
7.
配置環(huán)境變量
需要進(jìn)入/etc目錄下,然后vi profile
輸入o就可以像在window下的記事本編輯
export JAVA_HOME=/usr/java/jdk1.6.0_25
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
(至于這樣設(shè)置的原因,可以看這篇文章http://www.cnblogs.com/wangchenyang/archive/2011/08/17/2143620.html)
完成后按"Esc"鍵,然后輸入:w就可以保存,退出時輸入:q,可以簡單些,直接輸入:wq
輸入:q!是直接退出不保存
8.測試
寫個test.java文件(文件名不重要)
vi test.java
class test{
public static void main(String[] args){
System.out.println("hello linux");
}
}
javac test.java
java test
若顯示hello linux,恭喜你!jdk正確安裝,否則環(huán)境變量等有問題。
尋找出色的產(chǎn)品經(jīng)理
“哪里能找到出色的產(chǎn)品經(jīng)理?”CEO經(jīng)常問我這個問題。
我總是這樣回答:出色的產(chǎn)品經(jīng)理就在公司里,只不過在其他崗位上,有可能是軟件工程師、用戶體驗設(shè)計師、系統(tǒng)工程師,等著伯樂去發(fā)掘。無論你打算從公司內(nèi)部還是從公司外部招聘產(chǎn)品經(jīng)理,必須清楚合適的人選應(yīng)該具備哪些特質(zhì)。這一章,我將列舉產(chǎn)品經(jīng)理應(yīng)有的特質(zhì)。

個人素質(zhì)和態(tài)度
技術(shù)可以學(xué)習(xí),素質(zhì)卻難以培養(yǎng),有些素質(zhì)是成功的產(chǎn)品經(jīng)理必不可少的。
~~對產(chǎn)品的熱情
有這樣一群人,他們對產(chǎn)品有一種本能的熱愛,把自己生活中的一切事物都看成產(chǎn)品,懷揣對優(yōu)秀的產(chǎn)品的熱愛和尊重。這份熱情是產(chǎn)品經(jīng)理必備的素質(zhì),是他們夜以繼日克服困難、完善產(chǎn)品的動力。這份熱情能感染團(tuán)隊成員,激勵所有人。
辨別這種特質(zhì)很容易,可以讓應(yīng)聘者談?wù)勛约鹤钕矚g的產(chǎn)品及喜歡的原因,聊聊不同領(lǐng)域的產(chǎn)品和他討厭的產(chǎn)品,問問對方,如果有機(jī)會,他打算怎樣完善自己最喜歡的產(chǎn)品。熱情是難以偽裝的,虛偽的做作容易畢露無遺。
~~用戶立場
理想的產(chǎn)品經(jīng)理不一定來自產(chǎn)品的目標(biāo)市場(這種情況有利也有弊),但是他必須融入目標(biāo)市場。這一特質(zhì)對制造大眾產(chǎn)品的高科技企業(yè)尤為難得。我們傾向于從自己的角度去理解用戶和市場。事實上,目標(biāo)用戶的經(jīng)驗、喜好、價值觀、知覺能力、忍受程度、技術(shù)理解很可能與我們的大相徑庭。
可以就產(chǎn)品的目標(biāo)市場向應(yīng)聘者發(fā)問,讓他談?wù)勅绾螕Q位思考。了解應(yīng)聘者對目標(biāo)市場的感覺,最重要的是看對方是尊重目標(biāo)市場希望融入其中,還是打算一意孤行改變用戶習(xí)慣。
對國際化的產(chǎn)品和針對特定地域的產(chǎn)品來說,換位思考尤其重要。各種文化雖有共通之處,但也存在許多差異。有些差異對產(chǎn)品無關(guān)緊要,有些則至關(guān)重要。應(yīng)該考察應(yīng)聘者是否足夠了解目標(biāo)市場,能否區(qū)分這兩種差異。
~~智力
人的智力水平是無法替換的。產(chǎn)品管理需要洞察力和判斷力,因此必須具備敏銳的頭腦。勤奮當(dāng)然是必需的,但從事這項工作光有勤奮還遠(yuǎn)遠(yuǎn)不夠。
招聘聰明人是項知易行難的任務(wù),結(jié)果在很大程度上取決于招聘者的能力和可靠性。常言道,“物以類聚,人以群分”,此言不虛。方法之一是測試應(yīng)聘者解決問題的能力。微軟令人稱道的、深入而有效的面試,即是考察應(yīng)聘者解決問題的能力,通常由一位或多位領(lǐng)域?qū)<揖鸵粋€問題對應(yīng)聘者進(jìn)行深入考察。面試官不關(guān)心應(yīng)聘者是否知道正確答案,而看重應(yīng)聘者解決問題的思路和方法(智力優(yōu)于知識)。如果應(yīng)聘者回答正確,面試官會將問題略作調(diào)整,詢問應(yīng)聘者在新情況下如何應(yīng)付。重復(fù)這個過程,直到應(yīng)聘者被迫處理他不知道答案的情況,說出解決方法。
~~職業(yè)操守
每種團(tuán)隊角色承擔(dān)的義務(wù)和付出的努力都不相同。產(chǎn)品經(jīng)理肩負(fù)著產(chǎn)品的前途和命運(yùn),絕不適合貪圖安逸的人擔(dān)任。即便掌握了時間管理和產(chǎn)品管理的技巧,產(chǎn)品經(jīng)理依然要為產(chǎn)品投入大量精力。成功的產(chǎn)品經(jīng)理能擁有時間享受清閑的家庭生活嗎?只要具備足夠的經(jīng)驗,我相信可以做到。但是,如果你期望的是一周只工作四十個小時,下班后把工作拋諸腦后,那是不現(xiàn)實的。
成功的產(chǎn)品經(jīng)理需要付出多少努力?在這個問題上,我對應(yīng)聘者向來坦率,產(chǎn)品管理工作絕不能用時間來衡量,付出多少都不為過。緊急情況下臨時找來的“救火隊員”多半不是合適的產(chǎn)品經(jīng)理人選。
在漫長的項目周期里,產(chǎn)品經(jīng)理需要付出的努力和承擔(dān)的義務(wù)并非一成不變。有的階段比較輕松,有的階段則很緊張。但是稱職的產(chǎn)品經(jīng)理對產(chǎn)品的關(guān)注和憂慮程度,以及愿意為之付出努力的熱情是不會改變的。
~~正直
在所有產(chǎn)品團(tuán)隊成員里,產(chǎn)品經(jīng)理最能體現(xiàn)公司和產(chǎn)品的價值觀。通常產(chǎn)品經(jīng)理不直接管理團(tuán)隊成員,不能要求別人執(zhí)行命令,所以他必須通過行動影響、說服身邊的同事。這種影響基于相互的信任和尊重,要求產(chǎn)品經(jīng)理必須是個正直的人。
產(chǎn)品經(jīng)理是產(chǎn)品團(tuán)隊、銷售團(tuán)隊、公司高管之間的樞紐,經(jīng)常要協(xié)調(diào)處理各種問題,比如提早供貨、滿足大客戶的特殊要求。產(chǎn)品經(jīng)理如何處理這些難題,同事們都看在眼里。
信任和尊重需要時間培養(yǎng),產(chǎn)品經(jīng)理唯有通過工作展示自己的素質(zhì)和能力,才能成為真正的團(tuán)隊領(lǐng)導(dǎo)。如果產(chǎn)品經(jīng)理對待同事缺乏誠意,懷有私心,一碗水端不平,那么勢必會影響整體團(tuán)結(jié)和工作效率。產(chǎn)品經(jīng)理雖然不必事事精通,但應(yīng)當(dāng)知道每位成員最擅長做什么,尊重大家發(fā)揮工作特長的意愿,充分信任大家。
考察一個人是否正直絕不比考察他的智力容易,考察陌生的應(yīng)聘者是否正直就更難了。對那些有工作經(jīng)驗的應(yīng)聘者,可以問問他們?nèi)绾翁幚砉ぷ髦械膲毫Γ嘧穯柟ぷ骷?xì)節(jié)。
~~信心
很多人相信經(jīng)驗可以讓人產(chǎn)生自信。如果僅憑經(jīng)驗可以建立信心,為什么許多工作多年的產(chǎn)品經(jīng)理卻毫無自信?相反,剛剛步入社會的大學(xué)畢業(yè)生卻往往充滿自信(雖然這種自信通常源自對自身狀況的無知)。
自信是很重要的素質(zhì)。公司高管、產(chǎn)品團(tuán)隊、銷售團(tuán)隊都需要看到產(chǎn)品經(jīng)理的信心,確信他們投入的時間、金錢、努力不會付之東流。自信的人更有說服力,更容易成為人們愿意追隨的領(lǐng)導(dǎo)者。
~~態(tài)度
稱職的產(chǎn)品經(jīng)理把自己當(dāng)成產(chǎn)品的CEO,愿意為產(chǎn)品的最終成敗承擔(dān)全部責(zé)任,絕不找借口。雖然他清楚產(chǎn)品按時成功上市要克服許多困難——開發(fā)難度大、開發(fā)時間長、成本過高、產(chǎn)品復(fù)雜等,但他明白預(yù)見和解決這些問題是他的責(zé)任。
這并不是說產(chǎn)品經(jīng)理要事必恭親,監(jiān)督每個人的工作,而是指出現(xiàn)問題時他應(yīng)該及時承擔(dān)責(zé)任,進(jìn)展順利時他應(yīng)該及時給大家以鼓勵。稱職的產(chǎn)品經(jīng)理知道,雖然產(chǎn)品的實現(xiàn)離不開大家的協(xié)助,但是他應(yīng)該對自己的產(chǎn)品創(chuàng)意負(fù)責(zé)。
技能
掌握一些重要的技能是打造成功產(chǎn)品的關(guān)鍵。我相信,只要具備優(yōu)秀的個人素質(zhì),所有技能都可以習(xí)得。
~~運(yùn)用技術(shù)的能力
很多成功的產(chǎn)品經(jīng)理是工程師出身,因為策劃產(chǎn)品在很大程度上取決于對新技術(shù)的理解,以及如何應(yīng)用技術(shù)解決相關(guān)的問題。
出色的產(chǎn)品經(jīng)理并不需要自己發(fā)明或?qū)崿F(xiàn)新技術(shù),但必須有能力理解技術(shù)、發(fā)掘技術(shù)的應(yīng)用潛力。
培養(yǎng)理解技術(shù)的能力有多種途徑,可以參加培訓(xùn)課程,閱讀相關(guān)書籍和文章,向程序員和架構(gòu)師請教,參加開發(fā)團(tuán)隊的頭腦風(fēng)暴也不失為一種途徑。
~~注意力
產(chǎn)品經(jīng)理要優(yōu)先解決重要問題。研發(fā)產(chǎn)品的過程中有很多干擾。能否集中注意力解決關(guān)鍵問題、克制不斷增加功能的沖動、不受關(guān)鍵人物或重要客戶的影響,取決于產(chǎn)品經(jīng)理是否有足夠強(qiáng)的自律性——不但要遵守公司制度,還要嚴(yán)格要求自己。
幾乎所有產(chǎn)品都有些不那么重要的功能——這些功能對提高銷量和用戶滿意度毫無作用。如果去掉這些功能,產(chǎn)品甚至?xí)驗楹唵巍⒁子毛@得更多用戶的喜愛。我建議過濾多余的功能,縮短研發(fā)時間,降低生產(chǎn)成本,讓產(chǎn)品更早上市。
~~時間管理
電子郵件、即時消息和手機(jī)構(gòu)成的世界充滿了干擾。你可能一大早就來上班,拼命工作一整天,連吃飯喝水都顧不上,深夜回到家卻發(fā)現(xiàn)到頭來沒完成一件重要工作。時間都用來“救火”和處理“緊急”事件了。
熟練、迅速地區(qū)分重要任務(wù)和緊急任務(wù),合理地規(guī)劃和安排時間是產(chǎn)品經(jīng)理必備的技能。如果產(chǎn)品經(jīng)理無法集中精力完成真正重要的任務(wù),那產(chǎn)品就難免命運(yùn)多舛了。
我認(rèn)識太多每星期工作七十個小時、累得精疲力竭的產(chǎn)品經(jīng)理。他們把所有的時間和精力都花在工作上,體力透支到了極限。對他們而言,最可怕的事實莫過于做的都是無用功。為此,我有意在培訓(xùn)課程中加入了時間管理和合理安排工作任務(wù)的內(nèi)容。產(chǎn)品經(jīng)理的時間應(yīng)該用來改變現(xiàn)狀,而不是疲于奔命參加大小會議、逐一回復(fù)郵件。有許多事情不值得做。
~~溝通技能
雖然溝通技巧可以學(xué)習(xí),但要做到出類拔萃需要經(jīng)年累月的練習(xí)。溝通(包括口頭表達(dá)和書面表達(dá))能力是產(chǎn)品經(jīng)理必備的技能,如前所述,產(chǎn)品經(jīng)理只能以理服人,絕不能靠職位壓制他人。
口頭表達(dá)能力可以在面試中測試,測試書面表達(dá)能力則需另尋他法。我常建議應(yīng)聘者隨身攜帶文字材料證明其書面表達(dá)能力,比如,不涉及專利的產(chǎn)品策劃文檔。
注意,如果應(yīng)聘者使用非母語時帶有口音或有輕微的語法錯誤,不代表其溝通技巧不佳,只要說話口齒清晰、易于理解、具有說服力即可,完美的發(fā)音和語法不是必要條件。
產(chǎn)品經(jīng)理會花許多時間寫電子郵件、產(chǎn)品說明文檔、策劃書、同類產(chǎn)品分析文檔等。聰明的產(chǎn)品經(jīng)理不會浪費(fèi)時間寫沒人看的東西,一旦決定動筆就要做到最好,言之有物,讓人信服。
書面表達(dá)務(wù)必條理清晰、言簡意賅,因為同事(特別是公司高管)會根據(jù)這些文字評估產(chǎn)品經(jīng)理的工作。有時文字材料是他們評判的唯一依據(jù)。
還有一種常見的溝通形式是演講。對許多人來說,面對聽眾演講并非易事,有效地表達(dá)觀點(diǎn)更是困難。盡管如此,演講是產(chǎn)品經(jīng)理的家常便飯。產(chǎn)品經(jīng)理必須用最短的時間向公司高管、大客戶、銷售團(tuán)隊解釋產(chǎn)品的內(nèi)涵和重要性。
我們都聽過糟糕的演講——幻燈片一張接一張沒完沒了,演講人死板地朗誦條目,聽眾不得不費(fèi)勁地揣摩每張圖表的意義,既抓不住重點(diǎn),也不明白價值何在。
與此相反,成功的產(chǎn)品經(jīng)理盡可能減少幻燈片的頁數(shù),他們的演講充滿熱情、重點(diǎn)清晰、數(shù)據(jù)充分、引人入勝,絕不超時(甚至提前結(jié)束)。他們更喜歡聽眾提問,即使遇到暫時無法回答的問題,也會努力嘗試向提問者和聽眾闡述自己的理解。杰里·韋斯曼(Jerry
Weissman)的《演講制勝:講故事的藝術(shù)》是一本非常好的提高演講水平的指南。
商業(yè)技能
作為產(chǎn)品團(tuán)隊的發(fā)言人,產(chǎn)品經(jīng)理要協(xié)調(diào)團(tuán)隊與財務(wù)部門、營銷部門、銷售團(tuán)隊、公司高管之間的工作——必須使用這些人聽得懂的概念和術(shù)語。
我認(rèn)為產(chǎn)品經(jīng)理應(yīng)該具備雙語技能。這并非指中文和英文,而是指產(chǎn)品經(jīng)理既能與程序員討論技術(shù),又能與管理層和營銷人員討論成本結(jié)構(gòu)、邊際效應(yīng)、市場份額、產(chǎn)品定位和品牌。
由于上述原因,很多產(chǎn)品經(jīng)理都是商學(xué)院畢業(yè)的。企業(yè)需要懂得商務(wù)的人,所以雇用MBA。雖然MBA也可以成長為出色的產(chǎn)品經(jīng)理,但總的來說商業(yè)技能只是產(chǎn)品經(jīng)理需要具備的多種技能之一,而且完全可以在商學(xué)院以外的地方學(xué)到。比如,技術(shù)人員進(jìn)入產(chǎn)品管理領(lǐng)域后,通過閱讀、培訓(xùn)學(xué)習(xí)商業(yè)技能是很常見的事。
去哪里招聘產(chǎn)品經(jīng)理?
具備以上這些素質(zhì)和技能條件的人極少見,和優(yōu)秀的產(chǎn)品一樣稀少。沒有比產(chǎn)品經(jīng)理更重要的職位了,所以必須用嚴(yán)格的標(biāo)準(zhǔn)考察應(yīng)聘者。
關(guān)于招聘產(chǎn)品經(jīng)理,有許多不同的看法。許多公司認(rèn)為他們需要的只是營銷部門的人或有MBA學(xué)歷的人,就像教科書對產(chǎn)品經(jīng)理的定義一樣。這種看法也許曾經(jīng)是正確的,但如今無疑是一種謬論。
許多公司喜歡招聘從頂級商學(xué)院畢業(yè)、擁有技術(shù)類學(xué)士文憑、具有行業(yè)經(jīng)驗的MBA。不過別忘了MBA課程幾乎不涉及產(chǎn)品管理。如果你認(rèn)為現(xiàn)在的MBA畢業(yè)生們知道如何管理產(chǎn)品,那就大錯特錯了。
最有效的招聘途徑是尋找具有上述特質(zhì)潛力的人,通過培訓(xùn)課程和傳幫帶把他們訓(xùn)練成高素質(zhì)的產(chǎn)品經(jīng)理。這些人可能就藏身于公司內(nèi)部。我認(rèn)識許多優(yōu)秀的產(chǎn)品經(jīng)理,他們曾經(jīng)是程序員、用戶體驗設(shè)計師、客服人員、技術(shù)支持人員、營銷人員,甚至曾經(jīng)是目標(biāo)用戶。他們利用各自的經(jīng)驗進(jìn)一步完善產(chǎn)品管理工作。出于同樣的原因,公司高管應(yīng)該聽取不同崗位員工對產(chǎn)品管理的建議。對于高管來說,這是寶貴的經(jīng)驗。
行業(yè)經(jīng)驗重要嗎?
最近一位朋友向我了解一位產(chǎn)品經(jīng)理應(yīng)聘者(大衛(wèi))的情況,我曾經(jīng)和大衛(wèi)一起工作過。我的朋友是一家大眾網(wǎng)絡(luò)服務(wù)公司的主管,他非常喜歡大衛(wèi),但他心里有個疑問:“大衛(wèi)是企業(yè)級軟件產(chǎn)品方面的專家,他適合我們這種企業(yè)嗎?”
我忍不住笑了,告訴他四年前我遇到過類似的問題。當(dāng)時大衛(wèi)現(xiàn)在的主管問我:“這個人對系統(tǒng)軟件十分在行,可他能夠做好企業(yè)級軟件嗎?”
其實大衛(wèi)所受的教育與系統(tǒng)軟件、企業(yè)級軟件、大眾網(wǎng)絡(luò)服務(wù)都無關(guān),甚至與軟件技術(shù)無關(guān)。他是學(xué)金融出身的,非常聰明,善于快速進(jìn)入新領(lǐng)域,理解新技術(shù)。
許多產(chǎn)品經(jīng)理是因為他們的行業(yè)經(jīng)驗獲聘的。經(jīng)常有人問我產(chǎn)品經(jīng)理是否必須具備領(lǐng)域和行業(yè)經(jīng)驗,我認(rèn)為對某些產(chǎn)品來說,專業(yè)知識是必要的,比如,研發(fā)心臟除顫器,最好有一位懂得心臟護(hù)理的產(chǎn)品經(jīng)理。但這只是個例,并非原則。
我甚至認(rèn)為資深行業(yè)經(jīng)驗對產(chǎn)品經(jīng)理的工作可能是不利的,因為長期從事某一行業(yè)的人通常會落入一種常見的心理陷阱:他們以為自己了解目標(biāo)客戶,盲目自信。產(chǎn)品經(jīng)理應(yīng)該習(xí)慣放下自己的成見。擁有資深行業(yè)經(jīng)驗的人也能做到這一點(diǎn),但他們必須付出更多努力,保持開放的心態(tài)。
我并不是說管理產(chǎn)品不需要行業(yè)知識,相反,我覺得了解產(chǎn)品的領(lǐng)域知識(粗淺的了解不算數(shù))是絕對必要的。我相信通過積極學(xué)習(xí),高素質(zhì)的產(chǎn)品經(jīng)理可以快速熟悉新行業(yè)。以我自己為例,熟悉新行業(yè)達(dá)到自信制定產(chǎn)品策略的程度,只需要兩三個月時間。
我相信開發(fā)企業(yè)級軟件、系統(tǒng)軟件、大眾網(wǎng)絡(luò)服務(wù)和消費(fèi)類電子產(chǎn)品各自有不同的技能要求。例如,企業(yè)級軟件的用戶是數(shù)目較少的大企業(yè)(而不是數(shù)量上百萬的消費(fèi)者),所以有不同的手段了解需求、定義產(chǎn)品;不同類型產(chǎn)品的銷售渠道各不相同;如果產(chǎn)品涉及硬件設(shè)備,則必須了解它會對流程和進(jìn)度造成哪些影響;如果開發(fā)大眾網(wǎng)絡(luò)服務(wù),必須知道如何展開規(guī)模管理和社區(qū)管理。
總的來說,我認(rèn)為產(chǎn)品經(jīng)理大約有80%的技能和天分可以用于不同類型的產(chǎn)品。
我并非要貶低經(jīng)驗的價值,但我發(fā)現(xiàn)最寶貴的經(jīng)驗不是行業(yè)知識或技術(shù)(這些都可能過時),而是打造優(yōu)秀產(chǎn)品的流程、領(lǐng)導(dǎo)產(chǎn)品團(tuán)隊的能力、應(yīng)對產(chǎn)品擴(kuò)張的經(jīng)驗、個人對自己的認(rèn)知,以及自我激勵的能力。
與行業(yè)知識密切相關(guān)的是技術(shù)專長,業(yè)界一度非常看重兩者的聯(lián)系。有一次,我看到一家企業(yè)級軟件公司招聘產(chǎn)品經(jīng)理,要求應(yīng)聘者具備開發(fā)Linux產(chǎn)品的經(jīng)驗。的確,不同操作系統(tǒng)之間差異很大,但產(chǎn)品經(jīng)理如果連處理不同操作系統(tǒng)對產(chǎn)品影響的能力都不具備,那么等待他的麻煩將遠(yuǎn)比缺乏Linux知識來得多。
高科技產(chǎn)品行業(yè)雖然要求快速學(xué)習(xí)新技術(shù),但更重要的是預(yù)見如何應(yīng)用技術(shù)合理地解決問題。技術(shù)發(fā)展很快,所以產(chǎn)品經(jīng)理必須善于快速學(xué)習(xí)新技術(shù),解決新問題。我面試應(yīng)聘者時,不關(guān)心他們已掌握的知識,只看重他們的學(xué)習(xí)思路。比如,讓他們回憶研發(fā)產(chǎn)品之前,他們需要學(xué)習(xí)哪些知識,需要多長時間學(xué)習(xí),如何利用這些知識。
年齡不是問題
各個年齡段都有出色的產(chǎn)品經(jīng)理。為什么有人二十五歲就脫穎而出?首先,互聯(lián)網(wǎng)真正普及是1995年以后的事情,因此,今天二十五歲左右的人和我們的上網(wǎng)經(jīng)驗一樣多。互聯(lián)網(wǎng)興起時,十幾歲的青少年很快學(xué)會了成年人搞不懂的技術(shù)。其次,經(jīng)驗雖然需要時間積累,但其他素質(zhì),比如智力和對產(chǎn)品的熱情則與年齡無關(guān)。
當(dāng)年為網(wǎng)景公司年輕的創(chuàng)始人馬克•安德森(Marc
Andreessen)工作時,我不得不適應(yīng)給這個二十出頭的年輕人打工的事實。但是當(dāng)我發(fā)現(xiàn)他吸收新技術(shù)和說服他人的能力后,我很快就忘記了他的年齡。未曾與他謀面的人會認(rèn)為,擁有這種商業(yè)能力的人至少得年過四十。
尋找出色的產(chǎn)品經(jīng)理不能以年齡、性別或種族作為判斷標(biāo)準(zhǔn)。我知道行業(yè)中仍然存在不少偏見。例如,由于重視溝通技巧,我們盡量招聘母語是英語的應(yīng)聘者。
我指出這一點(diǎn)并不是想譴責(zé)誰,只是想提醒大家,無意的偏見可能會讓我們錯過出色的產(chǎn)品經(jīng)理。下次某個大學(xué)畢業(yè)生帶著他的產(chǎn)品創(chuàng)意來找你時,你或許應(yīng)該聽一聽,他的創(chuàng)意很可能是下一個Facebook。
出自:http://www.yixieshi.com/zhichang/8810.html
正常情況下開發(fā)人員使用已經(jīng)定義好的API,這個過程叫Call。但是有時這樣不能滿足需求,就需要程序員注冊自己的程序,然后讓事先定義好多API在合適的時候調(diào)用注冊的方法,這叫CallBack。
“當(dāng)通常大家說的回調(diào)函數(shù)一般就是按照別人的定好的接口規(guī)范寫的,等待別人調(diào)用的函數(shù),在C語言中,回調(diào)函數(shù)通常通過函數(shù)指針來傳遞;在Java中,通常就是編寫另外一個類或類庫的人規(guī)定一個接口,然后你來實現(xiàn)這個接口,然后把這個實現(xiàn)類的一個對象作為參數(shù)傳給別人的程序,別人的程序必要時就會通過那個接口來調(diào)用你編寫的函數(shù)。”
使用技巧:定一個接口,在接口中聲明我們想調(diào)用的方法。
在另一個方法中注冊剛定義的回調(diào)接口
package com.call;
public interface Callback {
public void executeMethod();
}
-----------------------------------------------------
package com.call;
public class Tools {
public void getTime(Callback call) {
long start = System.currentTimeMillis();
call.executeMethod();
long end = System.currentTimeMillis();
System.out.println("cost time=" + (end - start));
}
}
---------------------------------------------
package com.call;
//測試執(zhí)行方法消耗時間
public class Main {
public static void main(String[] args) {
Tools tool = new Tools();
tool.getTime(new Callback() {
public void executeMethod() {
new Main().testMethod();
}
});
}
public void testMethod() {
for (int i = 0; i < 10000; i++) {
System.out.print("");
}
}
}