一:产品设计:核心能力要做到极致

  产品经理要把自己当一个挑剔的用户。我们做产品的精力是有限的,交互内容很多,所以要抓最常见的一块。流量、用量最大的地方都要考虑。规范到要让用户使用的舒服。要在感觉、触觉上都有琢磨,有困惑要想到去改善。如鼠标少移动、可快速点到等等。

  为产品做设计最难的是订优先级和先后次序。判断功能的好坏不能写个报告统计下流量证明是完了。这是非常错误的,我们要看用户是不是需要这个功能。所以我希望我们的产品经理在产品设计之初就想得透彻一点。产品经理需要投入更多的关注度,关注度不一样,结果出来的很不一样。

1.核心能力

任何产品都有核心功能,其宗旨就是能帮助到用户,解决用户某一方面的需求,如节省时间、解决问题、提升效率等。

   很多产品经理对核心能力的关注不够,不是说完全没有关注,而是没有关注到位。核心能力不仅仅是功能,也包括性能。对于技术出身的产品经理,特别是做后台出来的,如果自己有能力、有信心做到对核心能力的关注,肯定会渴望将速度、后台做到极限。但是现在的问题是产品还没做好。

  比如前段时间的网页速度优化,优化之后速度提高很多,真不知道之前都做什么去了?让用户忍受了这么久,既浪费时间又浪费我们的资源。

  不抓,都没人理,很说不过去。所以说我们要在性能方面放入更多精力。

  谈到核心的能力,首先就要有技术突破点。比如做QQ影音,我们不能做人家有我也有的东西,否则总是排在第二第三,虽然也有机会,但缺乏第一次出来时的惊喜,会失去用户的认同感。这时候,你第一要关注的就是你的产品的硬指标。在设计和开发的时候你就要考虑到外界会将它与竞争对手做比较,如播放能力、占用内存等。就像QQ影音,它的核心性能和速度都超越了暴风影音,所以推出之后发展的势头将会很好。

  硬指标选择上其实也有很多选择,如网络播放、交流、分享,这都是很多的思路。但是最后都砍掉了,我们就是要做播放器,因为这是用户的需求。并不是所有人都需要高清,但是高端用户需要(这个后面口碑创造会再提到)。只有硬指标满足了,用户说,我这个破机器,暴风影音都不能放,QQ影音能放。就这一句话:口碑就出来了,用户知道你行,口碑要有差异性

  核心能力要做到极致。要多想如何通过技术实现差异化,让人家做不到,或通过一年半载才能追上。

  很多用户评论QQ时说用QQ唯一的理由是传文件快,有群。那这就是我们的优势,我们要将这样的优势发挥到极致。比如离线传文件,以邮件方式体现就是一个中转站,即使是超大的文件也不困难,关键是要去做。虽然真正使用的用户并不一定多,但用户会说,我要传大文件,找了半天找不到可以传的地方,万般无奈之下用了很烂的QQmail,居然行了,于是我们的口碑就来了。

  要做大,你首先要考虑的就是如何让人家想到也追不上,这么多年在IDC(互联网数据中心)上的积累我们不能浪费,高速上传、城域网中转站,支持高速地上传??可能又会发现新的问题,如果不是邮件、在IM(即时通讯软件)上又该怎么实现。

  我们的目的是让用户感到超快,飞快,让用户体验非常好,这些都需要大量技术和后台来配合。

  产品的更新和升级需要产品经理来配合,但我们产品经理做研发出身的不多。而产品和服务是需要大量技术背景的,我们希望的产品经理是非常资深的,做过前端、后端开发的技术研发人员晋升而来。好的产品最好交到一个有技术能力、有经验的人员手上,这样会让大家更加放心。如果产品经理不合格,让很多兄弟陪着干,结果就会发现方向错误是非常浪费和挫伤团队士气的。

2.口碑

做产品要做到口碑就要关注高端用户、意见领袖关注的方向

  以前,我们的思路是抓大放小,满足大部分“小白”用户的需求。但是现在来看,高端用户的感受才是真正可以拿口碑的

  如何提升高端用户的关注,这是在基础能力比较好的情况下需要考虑的问题。如邮件搜索、RSS聚合等,这些只有“很炫”的用户在博客和论坛里面会提及,在有能力的情况下我们要保证。在产品已经成型的情况下,对待高端用户的心态也要不一样。比如允许用户在我们的QQmail上使用别的邮箱。之前我们自己心里打着小九九,让别人不方便使用外部邮箱地址,好使用我们的,但是这样小九九,高端用户是看得出来的,所以要改掉,只有这样才能做到真正的方便用户。

个性化服务,并不是大众化服务,也是要取得口碑的

  一个产品在没有口碑的时候,不要滥用平台。如像IM(及时通讯)部门要求支持,投入营销资源、要marking(市场部门)联系公关公司投放广告,提广告位要求??等着人家砍,其实心里想着有一半也够了。

  我们的产品经理精神力好像分配得很好,50%产品,30%营销??当然,如果你在基础环节控制得好,这样当然可以。但多数情况下我们的人第一点都做不好。如果你的实力如胜算不到70%?80%,那么就把精力放在最核心的地方。当你的产品已经获得良好口碑,处于上升期后再考虑这些。

  产品经理要关注最最核心、能够获得用户口碑的战略点,如果这块没做透,结果只能是用户过来,失望,再花更多的精力弥补。这是得不偿失的。当用户在自动增长(用户会主动推荐朋友来使用我们的产品),就不要去打扰用户,否则可能会好心办坏事。这时,每做一件事情,每加一个东西都要很慎重的考虑,真的是有建设性地去增加产品的一个口碑。

当用户口碑坏掉后,再将用户拉回来很难

  增加功能,在管理控制功能上也要有技巧。在核心功能做好后,常用功能是要逐步补齐的。产品在局部、细小之处的创新需要永不满足。作为一个有良好口碑的产品,每加一个功能都要考虑清楚,这个功能给10%的用户带来好感的时候是否会给90%的用户带来困惑。有冲突的时候要聪明,分情况避免。每个功能不一定要用得多才是好,而是用了的人都觉得好才是真正的好。

  做产品开发的时候需要有较强的研发机制保证,这样可以让产品开发更加敏感和快速。就算是大项目也要灵活。不能说等三个月后再给你东西看,这个时候竞争对手已经跑出去不知道有多远了。

  开发人员要用心思考产品,而不是公事公办的态度。你要知道用户、同行会关注你的产品,在这种驱动下开发人员要有责任心去主动完成。不能说等到产品都做好了,流水线一样送到面前再做。40-50%左右的产品最终体验应是由开发人员决定的。

  产品人员不要嫉妒有些工作是开发人员设计的,只有这样才是团队共同参与的。否则出来的产品一定会慢半拍。

二:运营式管理:敏感才能找到不足

  我们的产品部是单机版,不仅需要很强的用户感和技术功底,更重要的是服务。我们要关注一些很复杂的内容,如架构、应用等,产品需要有更好的架构,这需要花很多精力,常态下可能看不出来,所以需要我们高层更多的KPI(重要效绩指标)上考虑。这很考验功力,谁做的好,总办领导是看得到的,好的设计架构不会手忙脚乱。如把核心的东西做成组件模块分发。

发现产品的不足,最简单的方法就是天天用你的产品

  产品经理只有更敏感才能找出你产品的不足之处。我经常感到很奇怪,有的产品经理说找不出问题,我相信如果产品上线的时候你坚持使用三个月,问题是有限的,一天发现一个,解决掉,你就会慢慢逼近那个“很有口碑”的点。

  不要因为工作没有技术含量就不去做,很多好的产品都是靠这个方法做出来的。我们的领导不仅仅要安排下面的人去做,一定要自己做。这些都不难,关键要坚持,心里一定要想着,这个周末不试,肯定出事,直到一个产品基本成型。

  从哪个地方找问题呢?论坛、博客、RSS订阅啊。高端用户不屑于去论坛提出问题,我们的产品经理就要主动追出去,去查,去搜,然后主动和用户接触,解决,有些确实是用户搞错了,有些是我们自己的问题。

  产品经理心态要很好,希望用户能找出问题我们再解决掉。哪怕再小的问题解决了也是完成一件大事。有些事情做了,见效很快。产品经理要关注多个方面,经常去看看运营,比如你说的产品慢,用户不会管你的IDC(互联网数据中心)差或者其他原因,只知道你的速度慢。

三:交互设计:做最挑剔的用户

  产品经理要把自己当一个挑剔的用户。我们做产品的精力是有限的,交互内容很多,所以要抓最常见的一块。流量,用量最大的地方都要考虑,规范到要让用户使用得舒服。要有感觉、触觉上都有琢磨,有困惑要想到去改善。如鼠标少移动、可快速点到等等。

  像邮箱的“返回”按钮放在哪儿,放右边还是左边,大家要多琢磨,怎么放更好,想好了再上线测试。对同一个用户发信,在此用户有多个邮箱的情况下如何默认选最近用的一个账号。这些需求都小,但你真正做出来了,用户就会说好,虽然他未必能说出好在哪里。

  产品的使用要符合用户的习惯,如写邮件的时候拷贝东西,更多人习惯用键盘来操作。虽然有些技术难度,但也可以解决,交互,对鼠标反馈的灵敏性,便捷性。

  在设计上我们应该坚持几点:

  不强迫用户:如点亮图标,如QQmail,不为1%的需求骚扰99%的用户。

  操作便利:如QQ音乐,新旧列表,两者都要兼顾到,如QQ音乐的快捷播放,从圆形到方形,最后因为影响性能而放弃。

  淡淡的美术:点到即止,如QQmail,QQmail在UI界面上的启发,不用太重也能做得很好。图案和简洁并不是一对矛盾体。

  重点要突出:不能刻意地迎合低龄化。

互联网产品设计的“马化腾法则”

1、为产品订立优先级和先后次序。

2、不强迫用户。不为1%的需求骚扰99%的用户。

3、研发机制保证,产品换代要快,快速实现、快速响应。

4、图案和简洁并不是一对矛盾体。

5、要丰富自己的角色,做最挑剔的用户、笨用户。

6、产品经理第一要关注产品的硬指标。

7、技术核心能力非可复制性要强,让极致核心能力产生口碑。

8、在局部、细小之处的创新要永不满足。

此篇接oracle开发编码规范-中

1.SQL优化规则

1.1索引的使用原则

  • 尽量避免对索引列进行计算
 WHERE sal*1.1>950
 WHERE sal>950/1.1
 WHERE SUBSTR(name,1,7)=CAPITAL
 WHERE name LIKE CAPITAL%
  • 尽量注意比较值与索引列数据类型的一致性

emp_no: NUMBER型

 WHERE emp_no=123
 WHERE emp_no=123

emp_type:CHAR型

 WHERE emp_type=123 (此时,查询时,不利用索引列)
 WHERE emp_type=123
  • 尽量避免使用NULL
 WHERE comm IS NOT NULL
 WHERE comm IS NULL
 WHERE comm>=0
  • 尽量避免使用NOT=(!=)
 WHERE deptno!=0
 WHERE deptno>0
  • 对于复合索引,SQL语句必须使用主索引列

例:复合索引(deptno,job)

 WHERE deptno=20 AND job=MANAGER
 WHERE deptno=20
 WHERE job=MANAGER AND deptno=20
 WHERE job=MANAGER
  • ORDER BY子句

好 子句中,列的顺序与索引列的顺序一致。 好 子句中,列应为非空列。

  • 查询列与索引列次序(WHERE)的一致性
 SELECT empno,job FROM emp WHERE empno<100 AND job=MANAGER;

1.2其他

  • 语句书写要规范

尽量避免相同语句由于书写格式的不同,而导致多次语法分析。

  • 尽量少用嵌套查询

  • 使用表的别名

多表连接时,使用表的别名来引用列。


SELECT abc002,abd003
          FROM ab001 ,ab020
        WHERE ab001.col2=ab020.col3
......

SELECT t1.abc002,t2.abd003
           FROM ab001 t1,ab020 t2
         WHERE t1.col2=t2.col3
......
  • 用NOT EXISTS代替NOT IN

SELECT ......
        FROM emp
        WHERE dept_no NOT IN ( SELECT dept_no
               FROM dept
               WHERE dept_cat=A);


SELECT ......
        FROM emp e
WHERE NOT EXISTS ( SELECT X
             FROM dept
             WHERE dept_no=e.dept_no
                   AND dept_cat=A);
  • 用多表连接代替EXISTS子句

SELECT ......
          FROM emp
  WHERE EXISTS ( SELECT X
                   FROM dept
                 WHERE dept_no=e.dept_no
                   AND dept_cat=A);


SELECT ......
      FROM emp e,dept d
WHERE e.dept_no=d.dept_no
   AND dept_cat=A;
  • 少用DISTINCT,用EXISTS代替

SELECT DISTINCT d.dept_code,d.dept_name
             FROM dept d ,emp e
WHERE e.dept_code=d.dept_code;


SELECT dept_code,dept_name
           FROM dept d
 WHERE EXISTS ( SELECT X
               FROM emp e
               WHERE e.dept_code=d.dept_code);
  • 使用UNION ALL、MINUS、INTERSECT提高性能

  • 使用ROWID提高检索速度

对SELECT得到的单行记录,需进行DELETE、UPDATE操作时,使用ROWID将会使效率大大提高。

例:SELECT rowid
    INTO v_rowid
    FROM t1
  WHERE con1
  FOR UPDATE OF col2;
  ......
  ......
   UPDATE t1
           SET col2=......
     WHERE rowid=v_rowid;
  • 查询的WHERE过滤原则,应使过滤记录数最多的条件放在最前面
SELECT info
FROM taba a,tabb b,tabc c
WHERE a.acol between  :alow and :ahigh
AND      b.bcol between :blow and :bhigh
AND      c.ccol between :clow and :chigh
AND      a.key1 = b.key1
AND      a.key2 = c.key2;

其中,A表的acol列可以最多减少查询的记录数目,其次为B表的bcol列,依次类推。

  • 尽量使用共享的SQL语句

如经常使用select * from dept where deptno=值, 如果每一个‘值’都是常量,则每一次都会重新解释,不能共享内存中的SQL语句优化结果。应把‘值’设置为一个变量,所有的共同语句都可以优化一次,高度共享语句解释优化的结果。

select * from dept where deptno=:d; //java里面也需要这样使用,而能不用常量
  • 显示光标优于隐式光标

update target
set t_field = (select s_information
               from source
               where source.key = target.key)
where exists (select 
              from source
              where source.key  = target.key)


DECLARE
   cursor cur_source is
   select * from source;
begin
   for row in cur_source loop
      update target
      set t_field = row.s_information
      where key   = row.key;
   end loop;
end;

此篇接oracle开发编码规范-上

1.程序书写规范

1.1大小写风格

类 型 约 定 举 例
保留字 大写 BEGIN、DECLARE、ELSIF
内置函数 大写 SUBSTR、COUNT、TO_NUMBER
预定义类型 大写 NUMBER(7,2)、BOOLEAN
SQL关键字 大写 SELECT、INTO、WHERE
数据库对象 小写 包括数据表、字段等
变量名 小写 gv_dwhrbl

1.2注释风格

注释总是加在程序的需要一个概括性说明或不易理解或易理解错的地方。注释应语言简炼、易懂而又准确。

1.2.1程序包的注释

  • 在包的头部必须标明文件名称及其所完成的主要功能。
  • 包的作者及完成时间。
  • 包的状态:测试/未测试。
  • 主要修改活动的修改人、时间、简单原因说明列表。
  • 维护过程中需要修改程序时,应在被修改语句前面注明修改时间和原因说明。

举例:

/** 文件名:
* 功能描述:
* 作者:
*状态:(测试/未测试)
* 完成时间:
* 修改:时间            修改人        修改原因
*/

1.2.2过程、函数的注释

  • 头部:必须进行功能和参数说明
  • 主体部分:如算法复杂时,应以注释的方式对其算法结构作出说明

以下是头部的举例:

/**  功能描述:
* 作者:
*状态:(测试/未测试)
* 完成时间:
* 修改:时间            修改人        修改原因
*/

1.2.3语句的注释

  • 注释单独成行、放在语句前面。
  • 应对不易理解的分支条件表达式加注释;
  • 不易理解的循环,应说明出口条件(有GOTO的程序还应说明入口条件);
  • 对重要的计算应说明其功能;
  • 过长的函数实现,应将语句按实现的功能分段加以概括性说明;
  • 供别的文件或函数调用的函数,绝不应使用全局变量交换数据;
  • 每条SQL语句均应有注释说明。

举例:

    -- 从个人帐户表中查询满足条件的上年计入金额、本年计入金额、
    -- 本年缴费月数等信息存入对应的变量中
SELECT snjrje,bnjrje,bnjfys,nd,bnjfjs,bnzhzf,bntczf
	 INTO ln_ snjrje,ln_ bnjrje,ln_ bnjfys,
     ln_ nd,ln_ bnjfjs,ln_ bnzhzf,ln_ bntczf
  FROM PsnAccount
WHERE shbzh = ivc_shbzh AND pid   = ...;
UPDATE 表名
    SET 字段名 = 变量名,字段名 = 变量名,...
WHERE 字段名 = 变量名 AND ...
INSERT INTO table_name( col1,col2,col3,col4,col5,...)
    VALUES( V1,V2,V3,v4,v5,...)

1.2.4常量和变量的注释

注释说明放在常量和变量定义语句的后面,注释说明的要点是:

  • 被保存值的含义(必须)
  • 合法取值的范围(可选)
  • 全局量需要对以上逐点做充分的说明。

注释的书写规范

  • 可采用单行/多行注释。(– 或 /* */ 方式)

1.3缩进规则

1.3.1SQL语句的缩进风格

查询列表的书写风格(与注释综合考虑)

  • 一行有多列,超过80个字符时,基于列对齐原则,建议采用下行缩进
  SELECT col1,col2,...,
         colm,coln,...
    INTO v_col1,v_col2,...,
         v_colm,...

WHERE 子句的书写规范

  • 每个条件占一行
  • 嵌套查询条件书写规范
  WHERE con1
    AND con2
    AND col3 NOT IN ( SELECT col3 FROM t2 WHERE ......);

SET 子句的书写规范

  • 每个表达式占一行。
SET col1 = v1,
    col2 = v2,
    ...

1.3.2控制结构的缩进

程序应以缩进形式展现程序的块结构和控制结构。

  • 下列保留字的下一行缩进三格: BEGIN、THEN、ELSE、ELSIF、LOOP

  • 下列保留字所在行前移三格: END、ELSE、ELSIF、END IF、END LOOP

1.3.3缩进的限制

  • 每次缩进标准为 3 个空格,不准使用 TAB 键。
  • 建议任何一个程序最大行宽不超过80列,第一行续行语句缩进三格,后续续行语句与第一行续行语句对齐。

1.3.4其他

  • 后台过程禁止使用COMMIT。在出错处理中可用ROLLBACK。
  • 过程的输入/输出参数声明必须指定为’IN’或’OUT’,要与参数命名一致。特别,不能指定为’IN OUT’。

1.3.5范例

范例一

/** 文件名:jlgrzh.sql
*功能描述:该程序包主要用于人员新参保时帐户的处理
* 状态:未测试
* 作者:吴名
* 完成时间:2011/05/11
* 修改:2011/05/13,修改人:小李(所修改信息描述)
*/
CREATE OR REPLACE PACKAGE pkg_jlgrzh AS
/**  功能描述:对于新增,统筹范围外转入人员,新建个人帐户信息
* 作者:张三
*状态:未测试
* 完成时间:2011/05/12
* 修改:            修改人        修改原因
*/
PROCEDURE pro_xjgrzh (
    pi_shbzh   IN  CHAR                  --个人社会保障号
    pi_dwsxh  IN  NUMBER,               --单位顺序号
pi_cbrq    IN  DATE,                    --参保日期
    po_fhz    OUT NUMBER                --返回值
  );
/**  功能描述:对统筹范围外转入的参保人员,如实记载职工个人帐户
* 作者:张三
*状态:未测试
* 完成时间:2001/05/12
* 修改:            修改人        修改原因
*/
PROCEDURE pro_sjgrzh (
    pi_shbzh   IN  CHAR,                    --个人社会保障号
    pi_snjrje   IN  NUMBER,              --上年计入金额
po_fhz    OUT NUMBER          --返回值
  );

CREATE OR REPLACE PACKAGE BODY pkg_jlgrzh AS
   PROCEDURE 过程名 (
参数1 IN  类型,                  --参数说明
参数2 IN  类型,                  --参数说明
参数1 OUT 类型                --参数说明
  ) IS
     变量名 数据类型;                  --变量说明
  BEGIN
    --语句说明
    语句;
    长语句第一行
   续行1
   续行2;
    语句;
    IF 判断条件组合 THEN
    --分支处理说明
   语句;
    ELSIF  THEN
   语句;
    ELSE
   语句;
    END IF;
    FOR  LOOP
   循环体;
    END LOOP;
  EXCEPTION
    WHEN  THEN
       例外处理语句;
  END 过程名;

  PROCEDURE pro_xjgrzh (
     pi_shbzh   IN  CHAR,                --个人社会保障号
     pi_dwsxh  IN  NUMBER,            --单位顺序号
 pi_cbrq    IN  DATE,                --参保日期
 po_fhz    OUT NUMBER            --返回值
  ) IS
     v_bz     NUMBER;                         --标志
     v_snjrje NUMBER;                        --上年计入金额
     v_bnjrje NUMBER;                        --本年计入金额
     v_bnjfys NUMBER;                        --本年缴费月数
  BEGIN
     SELECT snjrje, bnjrje,
            bnjfys
   INTO v_ snjrje,v_ bnjrje,
        v_ bnjfys
   FROM psnAccount
  WHERE PID = pi_shbzh;

     --生成个人帐户记录
     INSERT INTO table_name
          ( col1,col2,                    --
            col3,...)                        --
 VALUES
      ( 变量1, 变量2,            --
        变量3,...);                    --

     ...
  EXCEPTION
     WHEN OTHERS THEN
    po_fhz := -10110.9;
  END proc_xjgrzh;

  ...
END pkg_jlgrzh;