人在创意产品跟在实现产品时的关注点完全不同

实现产品时会非常注重时间管理和执行效力,要做的事情越精简越好,概括起来就是追求收敛。 创意产品时不会那么在乎时间,因为思考本身的时间成本是很低的,多想想,也花不了多少时间;而且人在思考时又容易触类旁通,得到很多新的想法,让产品更丰满。创意时追求的是一种“发散”的风格。 好的软件工程师应该鼓励产品经理放飞想象力,或者跟他一起飞;但在产品实现时要严格控制项目规模和执行纪律。好的产品经理也应该理解高效执行的重要性,在确定本期产品范围后提供精准的产品需求文档(PRD) 

产品决策不是科学

产品决策不是科学。当发生争论时,两边的观点似乎都很有道理,谁也说服不了谁;这跟技术争论很不一样。 解决方法之一是独裁,让位高者决定,因为位高者的想法一般更“靠谱”;但在大型组织中,位高者对自己的绩效非常敏感(丢官、丢地盘、被逼走),所以决策时经常有自己的个人利益考量在内,为了KPI做一些短期行为。  怎么办? 一是像苹果一样实施用户体验压倒一切的价值观,二是让公司维持小的团队规模,让老板自己来决策,因为他不需要向上汇报。

产品里可以有非核心功能,但要弱化

收到一封应届生简历,在介绍自己开发技能的同时,用了大量篇幅陈列自己的各种社会活动经验,严重喧宾夺主,看了两眼我就关了。 以前也收到过社招简历,我们招的是高级Java工程师,这封简历说自己C++和J2EE都很熟练,给予的篇幅也是1:1; 给人一种“样样通,样样怂”的印象,我看了后也就直接关掉了。 我这样做确实太主观了,并不理性、科学,但人性就是如此:如果你要推销自己,非核心的东西很有可能不但不加分,反而影响对你的整体认知,有可能让人怀疑的核心能力,也有可能带来庞杂感影响产品定位。如果这些简历里不提这些东西,或者只是简要提提,那可能就有面试机会了。 互联网产品设计也是这样。如果微信把购物、转账放在首屏,那微信是什么产品?人是矫情并且感性的,不会听你讲那么多道理,他们只管直觉。 非核心功能并非就不好,它可以起到丰富产品的作用。所以你可以把它放到一个角落里,或者把它视为另一个产品,只把当前产品作为它的入口。

“品牌”这个东西对互联网产品来说价值不是那么大

传统的营销理论把“品牌”视为关键竞争力。两款差不多的产品,品牌好的那个会占据更多的市场,即使它的质量稍差一些。所以有追求的企业会花大力气建立、维护品牌,品牌的重要性甚至超过产品本身。比如肯德基的汉堡,其实是非常一般的。 品牌重要,个人分析有三个原因: 1. 信息不对称,消费者在信息方面处于弱势。消费者自认为无法专业地考察产品的质量,对于原料选择、生产流程、购后的潜在问题更加不清楚。所以,还是要买品牌较好的,比较放心。 2. 更换成本高,导致消费者不太敢去“试一试”别的东西。如果发现的买的不好要换另一种,那已经付出的钱就算是浪费了;就算可以退换货,物流、时间成本也高。 考虑到这种风险,买品牌的综合成本是最低的。 3. 品牌的价格对自我印象的影响。买苹果、穿Nike肯定比买小米、穿班尼路更有面子。  互联网产品没有这这些问题: 1. 信息对称。一个网站好不好用,一个APP好不好用,用户自己用用就一清二楚;至于网站背后用什么技术,性能架构好不好,用户仍然不知道,但这完全无所谓。 所以,大网站也装不了逼,不好用老子就走。 2. 更换成本为0. 反正都免费,说走就走,MySpace说垮就垮。 3. 选择哪个网站,对自己的面子没有帮助。用亚马逊还是用京东,都改变不了吊丝或高富帅的形象。   当然,品牌还是有用的,它有一个惯性作用,让用户会在一段时间内继续使用产品。 只不过在互联网行业中,这个惯性持续的时间会很短很短,你必须持续地提升产品质量和用户体验,才能维持这个惯性。

通过shell脚本在服务器上一键构建java应用并重新部署

1. 把代码从github等托管服务器上更新下来 2. 编译成war文件 3. 重启tomcat 第一次使用时,先手动地把代码拉到一个固定的目录中 cd /home/me/myappsite/code git clone https://someuser@somesite/myapp.git 一键脚本:build-my.sh #!/bin/sh echo “pull and build” cd /home/me/myappsite/code/myapp git pull mvn clean mvn package -DskipTests echo “shutting down the tomcat” kill $(ps aux | grep ‘java’ | grep ‘mytomcat’| awk ‘{print $2}’) #不要用shutdown.sh;这里需要同步杀死进程,shutdown.sh做不到同步杀 echo “clean existing war files and copy the new one” …

通过shell脚本在服务器上一键构建java应用并重新部署 Read More »

一个典型的centos + apache httpd + tomcat的配置

典型的java网站: 用centos做操作系统,用tomcat提供服务,用apache httpd做反向代理 apache httpd配置 引用 #一个IP多个域名 NameVirtualHost *:80 #禁止直接使用ip访问 <VirtualHost *:80>         ServerName 11.11.11.11         <Location />            Order deny,allow             Deny from all         </Location> </VirtualHost> #顶级域名跳转到www域名 <VirtualHost *:80>     ServerName my.com     RewriteEngine on     RewriteCond %{http_host} ^my.com [NC]     RewriteRule ^(.*)$ http://www.my.com/$1 [L,R=301] </VirtualHost> #把对apache的访问指向tomcat <VirtualHost *:80>     ServerName www.my.com     …

一个典型的centos + apache httpd + tomcat的配置 Read More »

ec2中搭建服务后要编辑一下security group才能让外网访问

在aws ec2中搭建apache httpd或tomcat后,发现使用ec2 instance的public ip在浏览器里访问相关服务时失败。 这是因为防火墙未设置。对ec2来说,security group就相当于防火墙。 设置办法: 进入instance列表,在security group列中找到对应的group, 点击它,然后Actions => Edit Inbound Rules, 加入http, 即可允许80端口访问。 如果要打开8080的http端口,新增一个custom tcp rule.

innodb: 两个事务在binlog文件中不会交叉

在innodb的binlog文件中,如果一个事务从第m行开始,在第n行结束;那么从m到n之间只会记录本事务的操作,不会记录其他事务的行为。 这是因为innodb中binary log entries总是以事务为单位整体写入文件的。 引用 Within an uncommitted transaction, all updates (UPDATE, DELETE, or INSERT) that change transactional tables such as BDB or InnoDB tables are cached until a COMMIT statement is received by the server. At that point, mysqld writes the entire transaction to the binary log before the COMMIT is executed. 推论: 1. …

innodb: 两个事务在binlog文件中不会交叉 Read More »