彩色电子墨水市场前景畅想

拿到锦书之后,我对E-ink这类技术有了比较多的兴趣,研究了一下,发现彩色电子墨水才刚刚上路,我觉得它比仅仅能用来看书的黑白E-ink要更有广泛的市场应用。

一、升级现有的电子书终端,可以让电子书的效果更好,阅读杂志这类彩色的东西也更好。杂志能进驻电子书终端,销售的方式就很多样了。

二、替代现有的电子相框,现有的电子相框其实就是个大号的MP4之类的东西,LCD的屏幕非常耗电,并不能用多久。而E-ink,不翻页的话几乎不耗电。

三、替代现在的纸质海报。我认为像什么分众聚众之类搞广告的应该早点瞄准彩色E-ink。商场中也经常能看到把LCD屏幕当做是海报来用的,但是LCD显示器的背光能源消耗还是太大,热量也巨大。彩色E-Ink更加适合这个场景,而且可以在户外部署广告基于E-Ink的广告终端,在太阳下依然可以分辨清晰(问题可能在于晚上的照明)。

Joel Spolsky: 创业公司如何公平分配股权?

编者按:本文来自Chance Jiang的投稿,翻译自onstartups.com问答社区的一个Joel Spolsky的回帖。Joel Spolsky是曾是MS Excel产品的核心开发,目前是纽约软件公司Fog Creek的老板。他的博客Joel On Software是在业界流行了10多年的老博客,记录了Joel十几年行业经验,覆盖软件企业运作的点点滴滴,视为行业知识经典。

创业网友提问:

我有一个新的社会网络应用的构想。我并不期望这个应用可以获得巨大成功,但我想还是有些潜力的。我找过一些好友和同事交流过这个想法,他们都十分喜欢这个构想。还有些朋友甚至提出想作为合作伙伴加入一起进行开发,把想法变为一个可用的软件。

我无法用自己的钱给他们支付工资(他们也不期望那样),而且大家都打算把这项工作作为我们平时晚上或周末的业余项目。因为我认为这个想法有潜力可以 变为成功的企业,我想从目前这个阶段开始,就解决企业所有权/薪酬的问题,免得将来因为没界定清楚导致真正的问题。我倾向于把公司所有权在我们三个创始人 当中平分,而且基于这个分配规则来确定将来盈利后如何分配。这个选择对吗?如果对,怎么才算公平的股权分配?这是我自己提出的想法而且已花了不少时间做规 划(而且我很确定我将自己负担所有开发过程中发生的费用),所以我感觉我应该理所当然持有更大的股权。这个要求是否合理?

我还同时企图想办法按付出的努力来激励我的合伙人。我不担心有人加入后什么都不干,但我的确认为我们当中有一个或多个人也许将十分努力付出,比其他人付出更多。如果情况是这样,我想这类合伙人应该获得更多的股份。在规划股权架构方面,您有何建议?

Joel Spolsky回答:

这个问题实在是太普遍了,我打算对这个为题给出这个世界上最详细的回答。我希望,将来如果这个坛子上有人问到类似的问题,大家只需要引用我的回答。

最重要的(股权分配)原则:公平,而且可感知到的公平,比真正拥有大的股份更有价值。在一个创业公司,几乎所有 可能会出错的地方都会出错,而且会出错的问题当中最大最大的问题是创始人之间巨大的、令人气愤的、吵到面红耳赤的关于“谁更努力工作”的争论,谁拥有更多 股份,谁提出的想法等等。这也是我总会与一个朋友50-50平分一个新公司的股权,而不是坚持自己拥有60%的股权,因为“这是我的想法”,或者因为“我 比你更有经验”,或者任何其它原因。为什么呢?因为如果我把股权拆分为60-40,公司将在我们(创始人)不断争吵当中走向失败!如果你只是说,“去他妈 的,我们永远也无法知道正确的股权分配比例,我们还是像哥们儿那样50-50平分”,你们将继续是朋友而且公司将生存下去。

所以,我郑重向大家推出:Joel的适用于任何创业公司创始人完全公平划分股权的秘笈!

为简单起见,我将假设你们不打算拿风险投资,而且你们将不会有外来的投资人。随后,我再解释如何处理风险投资,但目前我们暂时假设没有投资人。同样 为简单起见,我们临时假设所有创始人都辞掉了他们的全职工作,而且同时开始全职为新公司工作。随后,我再解释如何处理后来加入的创始人。

来啦,原则是这样的:随着你们公司的成长,你们将一层一层/一批一批地加入新员工。公司的首批员工就是第一个创始人(或者第一批创始人)。也许有1 个,2个,3个或者更多,但你们都同时开始在新公司工作,而且你们要冒一样的风险……例如辞掉你们的工作加入一个未被市场认可的新公司。

第二批进来的人就是首个(批)真正的员工。当你聘任这批人时,你已从某个来源获得现金(投资人或者客户,这个无所谓)。这些人不需要冒多大风险因为他们从工作的第一天开始就拿了工资,而且,老实说,他们不是公司的创始人,他们是加入公司打工的。

第三批的人是更后来加入到员工。他们加入公司时,公司已运作得不错。

对于很多公司而言,每隔大约1年将进来一“批”员工。当你的公司规模大到可以卖给谷歌或上市或是其它,你公司员工也许已经有了6批:创始人1批,员 工大约5批。每一批员工人数都比上一批更多。也许有2个创始人,第二批当中有5名最早的员工,第三批有25名员工,而第四批有200名员工。越迟加入公司的员工需要冒的风险越低。

好啦,你将这样利用上述信息:创始人应该最终拿整个公司大约50%的股份。首层下面的5层员工的每一层最终都分别分到大约10%的公司股份,每一层的员工都将平分这10%的股份。

例子:

  • 2个创始人启动公司。他们每人拿2500份股份。公司总市值按5000股算,所以每个创始人拿一半。
  • 第一年,他们聘用了4名员工。这4名员工每人拿250份股份。公司总市值按6000股算。
  • 第二年,他们又聘用了一批20名员工。这些员工每人拿50份股份。他们获得更少股份因为他们要承受的风险更少。因为公司给每一批员工派发的股份是1000股,所以他们每人拿到50股。
  • 直到公司员工有了6批,你已给出10000股。每个创始人最终持有公司25%的股份。每个员工“层级”持有10%的股份。所有员工当中,最早进入公司的员工,因为他们与迟来的相比要承担的风险最大,在所有员工中持有最多股份。

靠谱吗?你不必严格按照这个公式来规划股份,但基本思路是:你设立不同的资历“层”,最高的层级中的员工承受最大的风险,最低层层级的员工承担最少的风险,而每个“层”的员工平分公司分配给这个层级的股份,这个规则神奇地让越早加入到员工获得越多的股份。

使用“层级”的一个稍微不同的方式是“资历”。你的顶部层级是公司创始人,再下一层,你需要预留一整层给将来招聘牛逼哄哄并坚持需要10%股份的 CEO;再下一层是给那些早期进来的员工以及顶级经理人的,等等。无论你如何组织你的层级,它们应该是设计清晰明了,容易理解,不容易产生纷争。现在,你 搞定了一个公平的份股系统,但还有一个重要的原则:你必须执行“股份绑定(vesting)。股份绑定期最好是4到5年。任何人都必须在公司做够起码1年才可持有股份(包括创始人)。好的股份绑定计划一般是头一年给25%,然后接下来每个月落实2%。否则,你的合作创始人将加入公司3个星期后跑掉,然后7年后又出现,并声称他拥有公司的25%的股份。没有“股份绑定”条款,你派股份给任何人都是不靠谱的!没有执行“股份绑定”是极其普遍的现象,后果可以十分严重。你看到有些公司的3个创始人没日没夜地工作了5年,然后你发现有些混蛋加入后2个星期就离开,这混蛋还以为他仍然拥有公司25%的股份,就因为他工作过的那2个星期。

好了,让我们清理一下整个设计蓝图中没搞定的小问题。如果你的公司融资了,股份如何分割?投资可以来自任何方向,一个天使投资人,一个风险投资公司,或者是某人的老爸。基本上,回答很简单:新的投资将“稀释”所有人的股份。

沿用上面的例子,我们有2个创始人,我们给了自己每人2500股股份,所以我们每人拥有公司的50%股份,然后我们找了个风投,风投提出给我们 100万换取1/3的公司股份。公司1/3的股份 = 2500股。所以,你发行2500股给了风投。风投持有1/3公司股份,而你和另外一个创始人各持1/3。就这么多。如果并不是所有早期员工都需要拿工 资,怎么办?很多时候,有些公司创始人有不少个人积蓄,她决定公司启动后的某个阶段可以不拿工资。而有些创始人则需要现金,所以拿了工资。很多人认为不拿 工资的创始人可以多拿一些股份,作为创业初期不拿工资的回报。问题是,你永远不可能计算出究竟应该给多多少股份(作为初期不拿工资的回报)。这样做将导致 未来的纷争。千万不要用分配股权来解决这些问题。其实,你只需要针对每位创始人拿的工资做好记帐:不拿工资创始人就给 她记着工资“欠条”。当公司有了足够现金,就根据这个工资欠条补发工资给她。接下来的几年中,当公司现金收入逐步增加,或者当完成第一轮风险投资后,你可 以给每一位创始人补发工资,以确保每一位创始人都可从公司得到完全一样的工资收入。

创业构想是我提出的,难道我不应该多拿股份吗?不拿。构想基本上是不值钱的。仅仅因为提出创业构想就获得更多股 权,因此导致纷争是不值得的。如果你们当中有人首先提出的创业构想,但你们都同时辞工并同时开始创业,你们应该拿同等的股份。为公司工作才是创造价值的原 因,而你洗澡的时候突发奇想的“创业点子”根本不值什么钱。

如果创始人之一不是全职投入创业公司工作,该怎么办?那么,他(们)就不能算是“创始人”。在我的概念中,如果 一个人不全职投入公司的工作就不能算是创始人。任何边干着他们其它的全职工作边帮公司干活的人只能拿工资或者工资“欠条”,但是不要给股份。如果这个“创 始人”一直干着某份全职工作直到公司拿到风投,然后辞工全职过来公司干活,他(们)和第一批员工相比好不了多少,毕竟他们并没有冒其他创始人一样的风险。

如果有人为公司提供设备或其它有价值的东西(专利、域名等),怎么处理?很好啊。按这些东西的价值支付现金或开个“欠条”咯,别给股份。你准确算一下他给公司带来的那台电脑的价值,或者他们自带的某个聪明的字处理专利的价格,给他们写下欠条,公司有钱后再偿还即可。在创业初期就用股权来购买某些公司需要的东西将导致不平等,纷争和不公平。

投资人、创始人和雇员分别应该拥有多少股份?这都要看市场情况来确定。现实地看,如果投资人最终获得超过50% 的公司股权,创始人将感觉自己不重要而且会丧失动力,所以好的投资人也不会这样干(拿超过50%的股权)。如果公司能依赖自我积累来发展而不依靠外来投 资,创始人和员工一起将拥有公司100%的股权。有趣的是,这样的安排将给未来投资人带来足够的压力,以平衡投资人与创始人/员工。一条老经验是:公司上 市时(当你雇佣了足够的员工而且筹集了足够的投资后),投资人将拥有50%股份,创始人+员工将拥有50%股份,但是就2011年热门的网络公司而言,他 们的投资人最终拥有的股份都比50%少得多。

结论

虽然创业公司股权分配原则这个问题没有一刀切的解决方案,但是你得尽可能让它简单化,透明化,直接了当,而最重要的是:要公平。只有这样你的公司才更有可能成功。

转载请注明:文章来自36氪

 

重读《一分钟经理人》

这本《一分钟经理人》不知是何时买的书,好像是大学里,放在我家很久,过年回家的时候又带来上海,最近闲暇的时候又回顾了一下。书很薄,32开,只有100多页。

令我惊讶的是,虽然书的内容几乎完全淡忘,但是书中阐述的道理似乎已经完全渗入我的思维之中,让我阅读的时候一直有戚戚焉。虽然我并不做管理,但是过去三年的工作,也让我意识到了工作中存在的管理问题。书中也若隐若现有一些GTD的方法以及敏捷开发的思想。让我隐隐感到一种符合我的哲学理念。

当然管理是关于人的问题,虽然书阐述了一些很简单的道理,但也并非总是适用于各种环境和背景——尤其是有中国特色的公司组织中。关键还是看人。对于书中描述那样高效的团队真是向往啊。

同时,今天正好看到这篇文章:哈佛经典:谁背上了猴子,也有类似的哲学在里面。

在SpiderMonkey中产生可调用的对象

我应该对标题做一个更详细的解释:用C语言在SpiderMonkey中产生一个在JavaScript中可以当成函数被调用的对象,换句话说,就是一个非Function的对象,在JavaScript中可以被当成Function进行调用。例如,我有一个Hash对象,当我在var h = new Hash()之后,可以直接调用h(key),h并非一个函数对象,却可以以这种函数调用的方式来获取键key对应的值。

首先,必须要在创建这个Hash类的结构时,将JSClass中的”call”字段设置为相应的函数,如下:

现在,这里有一个很关键的问题便是如何在SpiderMonkey调用call_hash函数的时候,能够让call_hash函数知道被调用的对象(callee)是谁。然而,Mozilla的官方文档并没有对此作出任何解释。于是我在邮件列表中问了这个问题,有人给出了一个很特别的技巧——引擎调用call函数的时候,argv[-2]便是被调用者本身。


在把玩了Spidermonkey一段时间之后,我还是打算放弃spidermonkey,虽然这是一个很成熟很强大的脚本引擎,但是他的API还是有些混乱的,从本文的这个问题的解决方案就可以看得出来。

提领类型双关的指针将破坏强重叠规则

最近复习C/C++,今日用APR编写了一个生产/消费模型的小程序。结果出现了这样一个奇怪的警告:“提领类型双关的指针将破坏强重叠规则”,让我大惑不解,特此和大家讨论一下。

我用的是gcc 版本 4.2.3 (Ubuntu 4.2.3-2ubuntu7) 线程模型:posix。出现警告的这段是这样的:

虽然可以运行无误,但该警告还是让我比较无奈,最后我改成了如下:

因为很久没有写C,在这里,我的问题是:

  1. 什么叫做“提领类型双关的指针”?
  2. 什么是“强重叠规则”?
  3. 为什么会破坏?
  4. 破坏之后会引发什么问题?

希望有C/C++达人能解决我这些疑问,谢谢。

附源代码:main.c

Rails中取消asset id

在Rails中使用helper链接应用中的JavaScript和CSS文件的时候,会在文件的路径后面添加一个问号和一个数字,如:

问号后面的数字被称为asset id,目的是为了一些容易被缓存的目标如JavaScript和CSS文件,在文件被更改后不会被浏览器或代理服务器强制使用缓存,这也用于某些Ajax请求中。

但是这种asset id的行为比较怪异,他是一个查询字符串,但是没有键值对。我的一个部署方式是在一个已经架设了Wordpress的域名下,使用反向代理向用户暴露某个控制器。因为给Wordpress配置了mod_rewrite,并启用了.htaccess,将所有不存在的文件重写到wordpress的脚本处理。而这时我使用了Alias来将Rails的public目录下的javascripts和stylesheets目录绑定到相应的URL路径下,Apache却在处理这个asset id上有些问题,直接访问/javascripts/prototype.js可以得到,但/javascripts/prototype.js?11223344却会跑到WordPress中,并且说这个文件不存在。这可能和Apache处理URL的次序有关。当然,将DocumentRoot配置到Rails的Public目录,则不会出现这个问题。

无论如何,我要去掉这个asset id,根据Rails 2.0的代码,大家可以在actionpack/lib/action_view/helpers/asset_tag_helper.rb中找到生成asset id的方法rails_asset_id,如下:

代码的注释也说的很清楚了,asset id默认为文件的修改时间的时间戳,也可以通过环境变量RAILS_ASSET_ID来自行设置。环境变量可以在系统中设定,也可以在environment.rb或相应的环境配置的代码中修改,比如我在config/environments/production.rb中添加了:

这样最终Rails生成的代码中就没有asset id了。

小结

我认为asset id在开发环境中的意义更大,因为这些文件可能会被频繁修改,这么作就可以防止被浏览器强制缓存。但在实际的生产环境中,这些文件并不会被频繁修改,而我们正是需要这样的缓存,带有“?”的URL常常是不被缓存的,我们完全可以通过链接带有版本号的文件来确保调用了正确的版本,如”prototype-1.6.0.js”,Flickr就是这么做的:

你还能在它页面中看到更为夸张的文件名。当然,Flickr也在某些地方使用了asset id——究竟什么样的情况下用asset id,还可以继续探讨。

对于Ajax请求,POST方式是不会被缓存的,可以放心使用。

PHP的二进制位移操作

PHP主要是设计于文本操作的,其实PHP不适合做数学运算,效率也不高,不过因为这次的项目中有个东西必须使用到二进制位移操作,在PHP上面遇到了一些麻烦。

因为PHP只有32位有符号整数,没有64位长整型,也没有无符号整数。其整型的范围是-231-1~231,超出这个范围的,将被解释为浮点数。因此,0xFFFFFFFF,直接打印,显示的是4294967295,及232

而在32位有符号整型中,0xFFFFFFFF应表示-1:

而PHP不支持浮点数的二进制位移操作,如果要进行,会先转换为整型,最后的结果,也将按照整型来返回:

同时PHP的向右位移操作,高位会填充符号位,而且PHP没有提供类似Java的>>>来强制填充0:

如何解决这个问题呢,我考虑过使用BCMath数学函数库,直接处理字符串表示的整数,或者是GMP/BigInt扩展等。不过我想既然使用字符串,那么我可以字符串地彻底一些,把数字转换成32个二进制的字符串,再手工填充0,最后转换回来。

不知道哪位有更好的方法,请告诉我。

代码如下:
直接下载代码:shift.php
(另外,其实代码可以扩展为任意位2进制的位移操作,这里我没有做)

升级到RubyGems 1.0

虽然前一段时间Ruby社区推出了很多重大的更新,如RubyGems发布了1.0,Rails发布了2.0,Ruby发布了1.9测试版。但是却潜藏了很多危险。比如在Windows平台下,升级了RubyGems之后,会导致我现有的Mongrel无法启动,原因在于RubyGems1.0修改了系统的识别,将mswin32改成了x86-mswin32,从而导致gem_plugin无法正确定位相应gem。

修复的方法也很简单,只需要先删除Mongrel再重新安装:

另外还在一些人的BLOG中发现Rails2.0刚发布时,是要求使用RubyGems0.9.5,也会出现一些问题。幸而我暂时没有迁移到Rails2.0上,也还没有遇到问题。

从这一个事件上也可以看出Ruby社区相对于Python/Perl的社区来说,还不是十分的成熟。

Rails + Memcached = Undefined Class/Module?

问题描述:
当使用memcached并将Model对象保存在其中时,若要取出这个缓存对象时,可能会找不到Model的类,并抛出“Undefined Class/Module SomeClass”的错误。
例如:

解决方案
要解决这个问题,可以在引用到该对象之间,先引用其类。比如,在前面的代码前面加入要引用的类Genre:

还有更好地方法是在Controller的before_filter中加载所依赖的所有Model:

结论
这个问题应该是Rails的一个Bug,不知道在2.0中有没有解决。我猜测是因为Rails中很多类信息是lazy load的,而从memcached中取出时没有附带类信息,也不知道如何加载,而通过上面的方法预先加载所需的类和其相关的类的信息,便解决了这个问题。

Rails错误LoadError Expected x.rb to define X

今天将代码部署到服务器上之后出现了这个奇怪的错误,经过删除gems重装之后问题依旧,最后查找资料,发现可能是 requireclass 之间的问题,最后在今天写的代码中发现了我在某个model的文件开头require了一个包。将require移入class定义内该问题解决。
原来代码如下:

修改后:

这个问题产生的原因我还不是非常清楚,难道和ruby的语法或者是内部运行机制和rails有冲突么?
这个问题在Rails的BUG列表中依然存在争议,目前还没有被彻底解决


2007-12-11更新

今天在我更新了服务器后,服务器上又出现了这个问题,但这次换了一个文件,变成了account.rb。这台服务器上装的是CentOS3,而另外一台同步更新的Windows2003服务器,则没有出现这个情况。多次修改找不出原因也不能解决问题,最后通过重启服务器解决了问题……

重新看了Rails Trac上的问题,发现情况并不是那么简单,很多条件可以造成这个错误,而问题的解决也是非常奇怪,比如有个人出现错误后,将某个设置从true改为了false,便正常了,然后他又把设置改回true,但是错误就没有了。