Sunday, September 26, 2004

公司创始人经营企业的理念

我创办天下一网的时候,给她定了一个企业的经营理念:
让客户赢利是第一位的,
善待员工是我们的立业第二原则,
投资人的利益在做好前两条后自然得到保证!

得出这样一个企业的经营理念是基于企业的社会属性、人的本性、资本的趋利性来考虑的。
根据这个经营理念我想把公司股权结构分成五类:

客户股
我们设立企业的目的是为社会提供服务,自然是服务客户。天下一网定位于为企业提供完善的互联网服务,企业在享受我们的服务时希望获得利润或者便利。当然让客户通过我们的服务产生赢利是第一位的了。客户是通过我们天下一**钱了,它还会离开我们吗?还怕我们不赚钱吗?!
定位、资金、团队、市场一切似乎什么都拥有了,为了进一步锁定客户,我们会在适当的时候推出客户持股计划。让它的消费也能获得像投资一样的分红回报。我们提出的客户持股概念,让它的消费也变成一种投资,实现最大化利益共同体。那时,天下一网就成为客户公司里的网络部门。

员工股
人的本性是什么?
反映在商场或者职场上的人的本性是崇尚自由、物质生活无忧、希望受人尊重、幸福的生活。一个人只要拥有这些东西才是天下最幸福的人。那么怎样让天下一网的员工得到这些东西呢?善待员工就成为我们的立业的第二原则。具体可以体现在:想要自由吗?想要物质生活无忧?想希望受人尊重或者拥有幸福的生活吗?我们给你弹性工作时间、家里办公机会、与我们合作当老板、员工持股计划、多级纵横晋升机会、工资按月递增、相对管理策略、量化管理模式等等方式来适应和满足人的本性需求。我们认为只有人力资源的问题解决好了,对企业来说才叫人力资源,而不叫劳动力成本。
拥有稳定、团结、高效的团队是商场制胜的法宝。稳定的为客户服务团队是一个企业发展的根本。我们通过员工持股等多种人力资源激励方式来相对保证我们的团队稳定。员工股顾名思义是员工时享有,离职的时候收回。拥有广泛的建议权和相对的决策权。一般采用年度奖金置换股权的方式实现。

资金股
一个企业做好前两条了,只要它的经营方向没有问题,利润肯定没有问题。投资人的利益当然会等到保证!投资人在企业成长阶段拥有重要的作用。就像现在这样没有投资人的帮助,我们就没有办法做大一样。但是,在互联网行业里也是不靠分红那点利润来获取投资回报的。一般都是通过出让股份的方式获得投资回报的。会有投资人提出你把公司的股权分得这么零散,我怎么投资给你呀?那您只要告诉我10万元公司里占100%、100万元公司里占40%、1000万元公司里占20%和1个亿的公司里占10%哪个大就行。而在互联网行业里寻找风险资金的工作一般总是由原始股东去完成的。

合作股
企业在自身发展的过程中,肯定不是完美的。在互联网这个世界里,钱是通过与他人合作才能赚来的。企业需要快速地扩张也是需要通过种种手段与他人合作。与合作方之间的相互持股既满足中国公司法的要求,又可以巩固与合作者的关系。有了资金和良好的团队,怎样扩张占领市场呢?大部分的互联网采用代理制的渠道政策,而全球最大的互联网企业GOOGEL公司采用最原始的通过产品的质量和信誉去影响客户。我们认为这两种方式都不是理想的模式。代理制具有不稳定性,GOOGLE忽视了其他网络公司的利益。天下一网将通过品牌、模式、管理、产品的合作与第三方组建新公司的方式开辟市场。同时,为了让第三方与我们的利益保持一致性,产生了让合作方持有天下一网公司的部分股份,这就是合作股的概念。一般在扩张期间比较多点份额。

原始股
我提出这个设想,也经过几年尝试经营企业互联网服务这个项目。我以前提出的控股的原因是希望按照这个的一个规则设立企业,现在的我掌握的股份还会慢慢地分给员工、客户、合作伙伴和新的投资人的。最终我只想取得天下一网20%的股份。
创业的时候,企业的定位、选择是最重要的。原始股东的价值体现就在这里。以后他就是一个决策者或者管理者、监督者、服务者的角色。更多的是为投资人、合作方、员工、客户之间起到协调与服务的作用。前期多取得的股份是为了后期分配给其他类型的股东。再说前期原始股不分红,但是拥有绝对决策权。早期的收益是通过不断地出让股份后融资中的10%的来收益的。这种模式的优点就在于创始人要想有钱花,就得不停地寻找新的投资人,要想得到风险资金的青睐,就得保持资产的快速膨胀和保持公司旺盛的发展潜力。

本人建议五类股东各占20%,不同时期当然会有所侧重。
一个企业需要实现以上的目标需要几个基本的条件:
健全规范的财务制度;
清晰透明的股权结构;
诚实守信的经营原则;
丰富稳定的现金流量;
持续增长的客户资源;
易于控制与具有发展空间的经营项目。
我认为一个企业要办得好、做得大、做得强、做得长,以上五个方面的持股一个也不能少。每一个股东的重要性程度呢?企业处于不同的阶段,每个股东的重要性也是不同的。

The Google Browser

posted August 24, 2004 at 11:36 pm

Last summer, Anil Dash suggested that it would be a good move for Google to develop a Google browser based on Mozilla. Give that kid a gold star because it looks more than plausible. Mozilla Developer Day 2004 was recently held at the Google Campus. Google is investing heavily in JavaScript-powered desktop-like web apps like Gmail and Blogger (the posting inferface is now WYSIWYG). Google could use their JavaScript expertise (in the form of Gmail ubercoder Chris Wetherell) to build Mozilla applications. Built-in blogging tools. Built-in Gmail tools. Built-in search tools. A search pane that watches what you're browsing and suggests related pages and search queries or watches what you're blogging and suggests related pages, news items, or emails you've written. Google Toolbar++. You get the idea.

Mozilla is currently getting some good press due to Microsoft's continuing troubles with their browser and the uptick in usage compared to IE is encouraging. But it's nothing compared to what could happen if Google decides to release a Mozilla-based browser. A Google Browser would give the Mozilla platform instant credibility and would be a big hit. The peerless Google brand & reputation and their huge reach are the keys here. Mom and Dad know about Google...if Google offered a browser that was as powerful and easy to use as their search engine and didn't scum up their system, they'd download it. IT departments wanting to switch away from IE would have some formidable firepower when pitching to upper management..."Mozilla? What? Oh, it's Google? Go for it!" Get good reasons in front of enough Google users and millions would switch from IE.

A Google Browser is a no-brainer for them and they have to be thinking about it. It's been obvious for awhile now that Google isn't a search company, nor are they an advertising company, despite what the experts have to say. Sorry to sound like a broken record, but I'm convinced they're building an operating system (of sorts) from which they will dispense all sorts of applications and data (as well as allow other people/companies to do the same in this fashion). What we could see is the next generation of office suite. Not Word, Excel, Powerpoint, and Outlook of Microsoft's Office or iPhoto, iDVD, iMovie, iTunes, and Garageband of Apple's iLife suite, but Google search, Gmail, Google Browser, Blogger, and perhaps even GIM. It'll be interesting to watch whether this happens or not.

GooOS, the Google Operating System

posted April 06, 2004 at 12:10 am

Great post about what Google is up to by Rich Skrenta. He argues that Google is building a huge computer with a custom operating system that everyone on earth can have an account on. His last few paragraphs are so much more perceptive than anything that's been written about Google by anyone; Skrenta nails the company exactly:

Google is a company that has built a single very large, custom computer. It's
running their own cluster operating system. They make their big computer even
bigger and faster each month, while lowering the cost of CPU cycles. It's
looking more like a general purpose platform than a cluster optimized for a
single application.

While competitors are targeting the individual
applications Google has deployed, Google is building a massive, general purpose
computing platform for web-scale programming.

This computer is running
the world's top search engine, a social networking service, a shopping price
comparison engine, a new email service, and a local search/yellow pages engine.
What will they do next with the world's biggest computer and most advanced
operating system?
I was thrilled reading this today because I had been thinking along the same lines as I wondered about Gmail (and the 1GB of storage in particular)...and that Skrenta had made the argument so well. This weekend, as I hacked through a bunch of XHTML and CSS for an upcoming site redesign, I jotted down a few notes for a follow-up on a post I made over a year ago called Google is not a search company. I was going to call it "GooOS, the Google Operating System".

My notes contained two of Skrenta's main points: the importance of the supercomputer and the scores of Ph.Ds being Google's main assets. A third key asset for Google is the data that they're storing on those 100,000 computers. As I said in that post:

Google's money won't be made with search...that's small peanuts compared to
selling access to the world's biggest, best, and most cleverly-utilized map of
the web.

So. They have this huge map of the Web and are aware of how people move around in the virtual space it represents. They have the perfect place to store this map (one of the world's largest computers that's all but incapable of crashing). And they are clever at reading this map. Google knows what people write about, what they search for, what they shop for, they know who wants to advertise and how effective those advertisements are, and they're about to know how we communicate with friends and loved ones. What can they do with all that? Just about anything that collection of Ph.Ds can dream up.

Tim O'Reilly has talked about various bits from the Web morphing into "the emergent Internet operating system"; the small pieces loosely joining, if you will. Google seems to be heading there already, all by themselves. By building and then joining a bunch of the small pieces by themselves, Google can take full advantage of the economies of scale and avoid the difficulties of interop.

Google isn't worried about Yahoo! or Microsoft's search efforts...although the media's focus on that is probably to their advantage. Their real target is Windows. Who needs Windows when anyone can have free unlimited access to the world's fastest computer running the smartest operating system? Mobile devices don't need big, bloated OSes...they'll be perfect platforms for accessing the GooOS. Using Gnome and Linux as a starting point, Google should design an OS for desktop computers that's modified to use the GooOS and sell it right alongside Windows ($200) at CompUSA for $10/apiece (available free online of course). Google Office (Goffice?) will be built in, with all your data stored locally, backed up remotely, and available to whomever it needs to be (SubEthaEdit-style collaboration on Word/Excel/PowerPoint-esque documents is only the beginning). Email, shopping, games, music, news, personal publishing, etc.; all the stuff that people use their computers for, it's all there.

Even though everyone's down on Google these days, they remain the most interesting company in the world and I'm optimistic about their potential and success (while also apprehensive about the prospect of using Google for absolutely everything someday...I'll be cursing the Google monopoly in 5 years time). If they stay on target with their plans to leverage their three core assets (which, if Gmail is any indication, they will), I predict Google will be the biggest and most important company in the world in 5-8 years.

Online Poker and Unenforceable Rules

Computerized "bots" may be common in online poker games according to a Mike Brunker story at MSNBC.com. I have my doubts about the prevalence today of skillful, fully automated pokerbots, but there is an interesting story here nonetheless.

Most online casinos ban bots, but there is really no way to enforce such a rule. Already, many online players use electronic assistants that help them calculate odds, something that world-class players are adept at doing in their heads. Pokerbot technology will only advance, so that even if bots don't outplay people now, they will eventually. (The claim, sometimes heard, that computers cannot understand bluffing in poker, is incorrect. Game theory can predict and explain bluffing behavior. A good pokerbot will bluff sometimes.)

Once bots are better than people, it's hard to see why a rational person, with real money at stake, would fail to use a bot. Sure, watching your bot play is less fun than playing yourself; but losing to a bunch of bots isn't much fun either. Old-fashioned human vs. human play will still be seen in very-low-stakes online games, where it's not worth the trouble of deploying a bot, and in in-person games where the non-botness of players can be checked.

The online casinos are kidding themselves if they think they can enforce a no-bots rule. How can they tell what a player is doing in the privacy of his own home? Even if they can tell that a human's hands are on the keyboard, how can they tell whether that human is getting advice from a bot?

The article discusses yet another unenforceable rule of online poker: the ban on collusion between players. If two or more players simply show each other their cards, they gain an advantage over the others at the table. There's no way for an online casino to prevent players from conducting back-channel communications, so a ban on collusion is impossible to enforce.

By reiterating their anti-bot and anti-collusion rules, and by claiming to have mysterious enforcement mechanisms, online casinos may be able to stem the tide of cheating for a while. But eventually, bots and collusion will become the norm, and lone human players will be driven out of all but the lowest stakes games.

谈谈美国的医疗保健系统

《华夏文摘》第697期刊登的宋公明文“美国医疗改革之我见”对美国现有医疗体制所发表的看法及建议,除了反映出作者对该体制的极端无知和毫不掩饰的酸葡萄心态外,实无建设性意义。很难想像该文出自“最聪明”人之手。作为一名知识分子,哪怕是个“小小的”知识分子,也应有最起码的科学常识,在对某一现象作出改革之见前,对它先有基本的了解。

  美国医疗保健系统痼疾太深,不仅是医,还有药的问题,无法三言两语就能说清楚。表面看来,在美国看病难,收费高,医疗投入和服务效果不成比例。但真正原因决非宋氏想像的那么简单:卖方市场,行业垄断。笔者非政策专家,无意也无能像宋公那样为大家指点迷津,提出改革之高见。在此我只想对宋文中提出的某些问题作出澄清,相信读者可凭自己的思考能力作出客观的判断。

  一、美国的医学教育

  美国医学教育可以说是世界上最严格的教育体系。与世界大部分地区不同,医学教育在美国属研究生教育(Graduate Education),必须在修完大学本科所需课程,并通过美国医学院入学考试(MCAT)后,方有资格申请医学院。医学院四年毕业后获医学博士(MD)学位,但想行医,还必须通过美国医生执照考试(USMLE),并经过三至八年不等的住院医及专科(FELLOWSHIP)训练和考试。你要是以为经过以上磨难之后终于可以万事大吉,专心赚钱的话,那是大错特错。每年必须积攒的持续医学教育(CME)学分,及每十年一次的专科再认证考试(Recertification Exam)要伴随着你直到你决定退休不干为止。如此严格的医学教育及再教育,目的决不是为了行业垄断,而是为了保证医疗质量,强制性地使临床医生对日新月异的诊疗知识得以式不断更新,以对病人负责。美国有着世界上最先进的医疗技术和诊疗手段,这与其严格的医疗教育和研究是分不开的。对此,中国和世界上大多数国家根本无法与之相提并论。

  在美国,进医学院的绝非只是有钱人的子女。实际上,任何有能力又有兴趣的人,包括宋公在内,都可申请进入医学院。笔者就有几位来自中国大陆的好友在美国做完了硕士或博士后决定弃研从医。凭着他们的聪明才智,无一不被医学院入取。美国医学院学费昂贵,但大部分的美国医学生都是凭着低息贷款完成学业的。教育和训练时间越长,所欠贷款也越多。根据2002全国学生贷款调查资料,美国医学生本科及医学院平均累积债款为$91,700,而一般毕业生平均债款仅为$45,900。

  还有一个事实可以帮助大家了解目前美国医学院校的招生情况。根据美国医学院校协会(AAMC)资料,1993年全国医学院校申请总人数为42,806人,而2003年则只有34,786,总的来说呈逐年下降趋势。美国的医学院招生和专业分配基本上是靠市场调节的,而不是像宋公明所说的垄断。数年前当Managed Care(统筹保健)模式兴起时,对基础保健医生(Primary Care Physician)的需求大增,使得很多优秀的医学院毕业生纷纷涌向此行列,导致专科医生严重缺乏。许多国外医学院毕业生(Foreign Medical Graduates)因此得益,有机会进入一些被看为冷门的专科,像病理科和麻醉科等。如今风水轮流转,因基础保健医生培训人数过多,不少美国医学院校毕业生又开始纷纷转向专科。因为美国自己医学院毕业的医学生人数无法满足整个社会,尤其是偏远地区日益增大的对医生的需求,许多社区医院只能靠招收外国医学院毕业生为住院医来维持其正常经营。很难想像,在医学院生源不断下降的情况下,靠宋公明所建议的增加医学院数量的方法能起到什么样的效果。

  二、医生收费标准

  在美国,医生对病人收费的高低是有严格标准的。医疗保险公司普遍使用的CPT和ICD编码系统限定了医生对某一诊断和操作程序所能收取的最高费用。为了遵守此系统,医生必须严格记录对每一病例所做的一切以证明其符合所使用的诊疗编码,并不是想要多少就要多少。违反者一旦被发现,是要被起诉和罚款的。以CPT编码99244(门诊首次会诊Level 4,综合性病例)为例,为了使用此编码,医生必须在其会诊文件中清楚地记录病人的主诉、现病史、既往史、家族史、社会史、药物过敏史、及病人现用药物,同时要对病人身体的至少十个系统作出复审。体检部分则必须包括病人的生命指征、符合此编码所要求的点数的各系统的检查,及专科检查。最后,医生必须对病例作出必要的诊断或鉴别诊断,并提供相关的检查及治疗建议。因此系统的复杂性,许多诊所和医疗单位都专门配备有Medical Billing专家,或请专门的Medical Billing公司服务,以保证向保险公司或个人所索取的服务费符合此系统的规定。无形中增加的许多繁杂的Paperwork是医生效率不高的原因之一。

  即使是医生严格按照CPT和ICD编码系统的规定向保险公司索取服务费,也不能保证能从保险公司得到所索取的款额。原因是美国现行的医疗保险体系以Managed Care(统筹保健)为主要模式,而非传统的按服务收费(Fee-for-Service)。此模式的中心不是医生,而是医疗保险业。美国超过半数的州有50-70%的人的医保都属于此种类型。结果,大部分的医生和诊所,以及几乎所有的医院要想生存,都必须接受Managed Care模式。要说有垄断,这也可以说是一种垄断了吧。在此模式下,医疗保险公司一方面与医生和医疗机构签约以保证向后者提供病人来源,条件是后者必须同意按合同对所索取的服务费打折扣(Adjustment),另一方面要求投保的病人只在它所指定的与之有合约的医院或诊所处看病,以此来控制医药费用。Managed Care模式最典型的例子是所谓的“健康维护组织”(HMO),目前约有一亿两千五百万的美国人使用它或类似的保险计划。除了上述的限制外,HMO规定病人看专科医生必须经过基础保健医生介绍,专科医生也没有绝对权威决定对某一病例所应进行的各项检查,而须事先经过保险公司同意(Preauthorization)才行。因此造成的医疗延误,常常招致对医生的法律诉讼,这也是为什么近年来不断有人呼吁HMO也应对医疗延误负法律责任的原因。

  必须指出的是不是每个病人都有同样的保险计划,且各保险计划对某一CPT编码的报销率也不同。还是以CPT编码99244为例,看病平均时间45分钟至60分钟,标准收费为$210.00,但在密西根州,Medicare只付$169.65,Medicaid则更惨:$108.17。加上与保险公司签约所规定的折扣,平均下来,医生能拿到手的只有$210.00的60%至65%,即$126.00至$136.00。此数额还要扣除55%至65%的诊所运作开销(Overhead),才是医生看此病人所能得到的税前收入。不知其他州法律怎样,在密西根州,对有语言障碍的病人,医院或诊所有义务为他们配备免费翻译。说起来有人可能不相信:一个Medicaid的复诊病例,医生索取的是$75.00,只能从Medicaid得到$30.00,而诊所请一次翻译的起价却是$50.00。

  最后我想说的是,宋公明所幸得的是普通的嗓子疼,可能是病毒性咽炎什么的,不碍大事,但在5分钟内医生必须用他所学知识和经验对你的嗓子疼做出正确的诊断,以保证你得的不是咽喉癌或其他严重的病症。医生的诊断使你悬着的心可以放了下来。他收你$75.00,但他为他的诊断所付出的法律责任是无法用金钱去衡量的。

  三、医生生活与收入

  不可否认,医生收入在普通人群中确实偏上,但医生不是商人,而是职业服务人员(Professional)。谈论医生收入时,必须考虑到他们在时间和金钱上的高投入,职业风险,及相关的生活品质。不要说每周50-70小时的工作时间和随叫随到的夜班、周末和节假日值日,单单漫长的训练周期本身(从本科算起11-15年)就足以使不少渴望一夜致富的人望而止步。一个普通的基础保健医生每天早上5-7点钟开始上医院查房(看病人人数而定),然后赶到诊所开始门诊。顺利的话一切按时间表进行,若是比时间表滞后,则常常连午饭及入厕的时间都没有。下午4-5点钟左右结束门诊后,还要面对一大堆的Paperwork(病人所要填写的各样表格,保险公司要求的医疗信息,以及与其他医生如专科医生交流所需的信函)和病人要求回复的各种问题(化验结果的解释,药物副作用,新的症状等等)。所有这些都在无偿占用医生的时间。专科医生所花费的时间则更长。在美国你所得到的服务是一对一的服务,你的医生有义务回答你的任何电话咨询,即使是在半夜三更时(有值班医生代替),除非你不用他。这与在中国每个医生一天看50至60个病人,医生常常在没有了解清楚病情的情况下就作出诊断并对此毫不负责的服务相比,是不可同日而语的。

  如前所述,当医生向你的医疗保险公司索取$75.00时,实际收到的有可能只是它的60-65%,而此收入还需减去诊所为此付出的运作开销,如每月房屋水电租金,护士、医生助理、秘书、病史转录员(Transcriptionist)、Billing专家、档案管理员、以及诊所经理等员工的薪水及福利。在美国,一个诊所的平均运行开销是毛收入的50-65%。扣除了所有这些开销之后,才是医生的税前收入。读者自己可以算算还剩多少。宋公明在文中很肯定地指出“美国一般的family care医生一年进账二十万美元左右,要是爬上专家的位置就是四十万左右,更有甚者,专门给体育明星、电影明星、大富翁看病的高级大夫,一年少说也是八十万”,不知是想当然,还是有笔者所不知的出处。在如今资讯高度发达的年代,医生的收入早已不是秘密,任何搜索引擎,只要打入“physician compensation survey”,就能找到无数的资料。现实是,普通医生(内科,儿科,妇科,及家庭医生等等)的平均收入很少超过$150,000。专科医生则视其行医风险及训练时间而定,$200,000-500,000不等。高收入的专科一般都涉及手术及操作,但因其面临的行医风险,所需购买的医疗事故保险(malpractice insurance)也要比普通医生要高几倍(见下节)。

  最后要提的是,宋公明指出“医疗业是美国近年来惟一一个不受经济低迷影响的行业。其他行业工资紧缩的时候,看医生的费用非但没有降低,反而以超过通货膨胀率好几倍的速度疯狂上升”,此话很不准确。真正以超过通货膨胀率好几倍速度狂飙上升的不是医生的收入,而是医疗事故保险费。现实情况是,相对通货膨胀率而言,因医疗事故保险费的持续上涨及医生服务费报销率的相对下降,美国医生的实际收入已是逐年下降。另一方面,因为没完没了的Paperwork,医生的工作时间却越来越长。即使如此,医生在美国却没有像其他行业一样有自己的工会来保障医生的权益。因为医生若是罢工,必然违背其救死扶伤的职业道德。

  四、医疗事故保险

  论到医生的收入,一个无法回避的问题就是医疗事故保险费。对于许多医生来说,税前收入还应去掉用来购买医疗事故保险的费用,才是他们真正的税前收入。法律诉讼对医生的行为规范作了限定,使他们不能随意草菅人命。但医生因医疗事故败诉所应作出的赔偿在大多数州都是不封顶的。为了保证有足够的赔偿能力,许多医生都不得不购买医疗事故保险。手术和操作程序越复杂,承担的风险越大,面临法律诉讼的机率也越高,因此投保费也越高。这本身并不是一个问题。问题是因为对医生索赔金额无封顶限制而导致的城镇地区医疗事故民事诉讼费用的上涨,使得自1990年至2000年短短的十年内,医疗事故保险费上涨了140%。与此相比,同期医疗费用的增长仅为60%。以2001年的密西根州为例,妇产科的平均年医疗事故保险费为$106,000,外科为$81,000,内科为$29,000。这在美国各州中还只是居中而已。如果你是医生,你辛苦赚来的收入的三分之一至四分之一要用来购买医疗事故保险,你的情况会是怎样?

  因医疗事故保险费的上涨而导致的医疗保健危机已在许多州造成了不良的影响:许多医生因付不起高额保险费,或被迫提前退休,或迁居至诉讼率低的地区,或无保险行医,或放弃高风险手术及操作等。受此影响最大的专科是创伤科及妇产科。在某些州,高达20%的妇产科医生被迫歇业,以至孕妇分娩只能去急诊室。在此压力下许多医院、养老院及其他医疗保健机构也不得不关闭,或减少它们为社区所能提供的服务范围。

  五、也谈在美看病

  美国看病采取的是预约制。对于在大陆已习惯了随时挂号就诊的人来说,确有其不便之处。但此制度的本意是要保证医护人员有足够的时间为病人提供最佳的服务。病人看病时常常会遇到像宋公明所抱怨的按时赴约却被晾在一边坐冷板凳的现象。造成此现象的原因是多方面的,但很少是因医生的缘故。一般情况下,专科初诊时间约45-60分钟(视各科而定),复诊约15-20分钟。遇到复杂病例,则很有可能超过预定的时间。大部分的医生都不会因为时间到了问题还没解决就把病人扫地出门,因医德及所面临的可能的医疗诉讼限制了他们不能这么做。美国病人对于这样的等待大多都能理解,因为他们知道,如果需要,他们也有权利占用医生更多的时间。造成病人等医生的更普遍原因则是有些病人的不守时。一般诊所均要求初诊或复诊病人提前15分钟左右赴约以完成可能需要的Paperwork。但不是每个病人都会这样做。由此导致的医生的晚诊若是不加限制,势必引起连锁效应,使其他按时赴约的病人无辜等待。所以很多诊所都对晚到病人有严格规定:迟到一定时间后须重新约诊。屡次迟到者则有可能会永远失去在此诊所看病的机会。也许是笔者孤陋寡闻,我还从没有听说过病人不能如期赴约而被医生索取双份钱的事情,真有这样也应算是违法吧?

  为了帮助大家在美得到理想的医疗服务,最后我向大家提供一些实用的建议:

  1.根据你和你的家庭成员的健康情况,仔细比较各保险计划的优劣。不要只是为了省钱而失去了得到理想医疗服务的自由。

  2.找医生前多问问周围的人。医生个性及经验不同,服务效果自然也不同。

  3.定期拜访你的基础保健医生,以做到未病先防。

  4.如有可能,尽量选择早上的约诊,这样可以减少等待的时间。

  5.按时赴约。

  6.对有语言障碍的朋友,尤其是从大陆来的老人们,事先可找懂英文的朋友帮忙做翻译,或把自己的病史,病症,所用药物,以及想要问的问题打印出来。实在语言不通的,可向诊所或医院要求提供翻译服务(常常是免费的)。

  7.看完病后,不要忘了拿上一张医生的名片,上面有他的联系电话。

  8.不要怕给医生或诊所打电话。虽然看医生要约诊,但门诊之外的服务是24/7制的。医生或他的值日伙伴会根据你的情况作出合理的决定,或将你的约会提前,或为你安排其他的检查、专科会诊,或为你替换药物等。

  我在此衷心地希望大家身体健康,永远用不上医生。

Saturday, September 25, 2004

Writing a Social Content Engine with RDF

September 19th 2004 anselm@hook.org

Last rev Sep 23 2004 - continuing to add comments to Javascript section.
No source code is published yet - this is still a work in progress.

Revving our engines



Today we're going to build a social content engine for organizing and sharing
content with our friends.
The service we build will let you:

  1. Publish observations or 'stuff' onto a website.
  2. Categorize it variety of ways.
  3. Pivot on yours or others observations to discover other related topics or
    persons.

Our work will be modelled on newly emerging services including
del.icio.us
, Flickr and
Webjay
. The code itself will be a rewrite based on actually a fairly
small subset of Thingster and
BooksWeLike

which I've been developing (and learning to understand the implications of)
over the last 6 months or so. If you haven't used delicious in particular you
need to stop reading this, go there, make an account and play with it for a
while.

Users use these services to organize their own content for later recollection.
But since the services are public, other users can peek into the collective
space, and discover similar items, topics or persons.

In this project we're going to look for opportunities to stress the 'synthesis'
aspect of social discovery; to escape from the pattern of curated collections
managed and presented by one person. If there is time it would be fun to play
with generating statistics and views on participants and their recommendations
as well.
The components that we need to write to deliver our service will include:

  1. Our own lightweight RDF triple-store based on top of PERST.
  2. Our own lightweight content management system.
  3. A tag engine used to categorize our observations.
  4. An XML server gateway that we'll build on top of Jetty.
  5. A Javascript client-side User Interface.


One of the specific things we're going to build into our service is a 'tags'
mechanism as popularized by delicious. Users will be able to publish tags to
categorize items of interest and other users will be able to pivot on those
tags to discover items of like interest.

We are going to push RDF quite hard. We will write a lightweight persistent and
embeddable RDF triple store in Java - possibly being the first people to do so.
This will be the cornerstore of our application and represents significant
value even beyond this particular project. We'll also seek to use official RDF
vocabularies as much as possible. We want to have something that is not only
functional for our own use but that can interact with the rich ecology of the
web - publishing data via RSS or RDF/XML to a wide variety of other services.

We are also going to push Javascript quite a bit to express the client side
interface. Again we will seek to build fairly powerful components that will
have significant reuse for other projects.

Overall the pattern of the finished project is to build an XML driven
web-service built on top of industrial strength concepts that can be re-used
for almost any conceivable knowledge management application.
To accomplish all this you will need these third party pieces:

  1. Sun's Java SDK ( 1.3 is ok )
  2. PERST
  3. Jena's ARP
  4. Jetty
  5. Ant (optionally)


The results should be quite fun to drive and fairly industrial. Let's take a
look at some of the ideas next.

Signalling



Here we're just going to muck about about with casual observations about what
it means to have a 'social content' system. Ideally we'd like to end up with a
laundry list of constraints that can guide our choices.

There's an old saw that goes "actions speak louder than words". A car can have
its left signal flashing but be travelling blindly down the road not turning at
all... Or oncoming traffic may suddenly and mysteriously slow down suggesting
the presence of a fine officer of the law doing his part to help keep a
community orderly - or even just a kid crossing the street without illuminating
the crosswalk signal.

In vehicular traffic drivers wheel and race making moment to moment decisions
on the basis of each others inputs; signalling to each other in a variety of
both intentional and unintentional ways. As a participant you end up creating a
mental model of the things around you, the situational landscape, and the best
navigation choices.

On the net there is a potential for similar behavior.

If we could just watch what people "do" instead of what they "say" we might
actually find that the quality of knowledge we're getting from them is actually
higher.

People on the net do of course signal to each other with a variety of
intentional and explicit mechanisms. There are countless blogging services,
craigslist, vanilla websites, listservs, email, wikis, p2p networks, irc, sms
and on and on.
But that space has started falling over. There is incessant spam, and almost
everything has become saturated with 'adwords by google'. The language and
phrasing of traditional content has steered sharply towards maximizing ad
revenue. The intentional signals are polluted and noise-ridden.

Watching flocks of humans pinwheel about has up until now been the domain of
web portals. Now we're seeing this become more democratic as new p2p
psychographic behaviour tracking services such as A9 and Ask Jeeves are rolled
out.
The newer services that are emerging seem to have few parallels to existing
services. Wikipedia of course does offer social benefit but it has content
organized and massaged by hand. Orkut, Friendster, Multiply, LinkedIn are social but don't have any particular organizational utility; there is no personal activity that others observe - most behavior is explicit. CraigsList and Meetup and Upcoming do provide community but the signalling is all explicit again.

In automating the synthesis of many peoples observations there is perhaps an
immediacy, a lower latency between oneself and ones peers. Perhaps this
satisfies an instinctive need for a sense of connectedness. The best I can say
is that delicious seems more 'human' than say 'google news' or many of the
other sites I look at on a daily basis.
Can we get anything specific from all this? Here's a grabbag of constraints:

  1. Let you publish citations to books, urls, photographs and other digital ephemera.

  2. Categorize your observations using tags

  3. Pivot on tags and observations to find more like tags, observations and people.

  4. The application should be embeddable; running on personal systems not just LAMP
    / UNIX .

  5. Small

  6. Fast

  7. Clean understandable source

  8. Standards based

  9. A foundation for future projects

  10. Strong social discovery aspects

  11. Recommendation

  12. Tag clustering using LSI techniques (or any technique that comes to mind)

  13. Perhaps even a general purpose content management system.

  14. Run on Java 1.2 or any 'older language' - don't require bleeding edge ( to
    improve embedability and portability ).

As we find ourselves employing capricious aesthetics to arbitrate between
technology choices we can bolster this list.

Getting our hands dirty


One thing that we do know is our service is simply a web-site.
We don't have to think much about "what kind" of web-site yet. And in fact we'd
prefer not to. We'd like to pluck away all the orthogonal pieces and erase them
from consideration as early as possible.
Since this "serving web content" is a well defined goal we can at least take it
off our list. This will reduce the total number of things that we have to think
about.

  1. In broad strokes our candidate applications for serving web-pages are going to
    be either Apache, Mason, Tomcat, Jetty or even possibly just mod_perl or cgi
    support. My personal experience is that perl, Mason and mod_perl have too many
    dependencies to ever be run in embeddable environments. Admittedly these are
    extremely pleasing and rapid development tools but one of the constraints of
    this project is portability across devices - where those devices are not
    necessarily running full blown LAMP or UNIX capable operating environments.
    Java is the only language that currently has widespread portability (well C# as
    well). Java is slightly more available - C# Mono for example has just started
    running on OpenBSD 3.6 and is not stable.

  2. In Java we have a choice between Tomcat or Jetty. NetKernel and other 1.4 NIO
    driven systems are also mighty appealing but I'd like to stick with a 1.2 or
    1.3 compatible environment. Jetty has become my personal favorite web-server of
    choice because it is quite visible and transparent all the way to the bottom.
    You can run it in an embedded mode and step-trace the logic all the way through
    to see what is going on. Being able to debug the application without having to
    'attach' to a running warfile does tremendously expedite development.

  3. Of course we are going to want to present a dynamic interface to the user.
    Traditionally people use Velocity templates or JSP templates to wrangle the
    user interface. In our case we are going to use Javascript and have the server
    serve static web-pages and dynamically generated XML content. What that means
    is that for now we do not have to think about how we are going to develop a
    server that serves dynamic content. We just have to think about the basic
    server core.

  4. Obviously we need a main() entry point of some kind. Presumably it starts up
    Jetty and does Jetty like things. Such as starting up a Jetty Resource Handler
    that will handle the incoming user web requests.

Overall then we're looking at some kickoff code that goes something like this:

static public void main(String[] args) {

server = new jetty server
context = new jetty context
session = new subclassed instace of a jetty handler

}


Here we're not bothering to package up the system as a servlet. We want this to
be easily accessible to the debugger and we're basically in a hurry overall. We
want to build the whole project in less time than our boredom threshhold.
Considering how to package something as a servlet will multiply the total
number of considerations in this project and create spurious complexity.
The Jetty Documentation tells us that we need to subclass a Jetty Resource
Handler to do actual work. In this case we invent a 'Session' concept that will
be responsible for replying to user requests as per our application. In broad
strokes this will look like this:

public class Session extends org.mortbay.jetty.ResourceHandler {

handle_event() {

if the request is for a vanilla web page then just return it
if the request is a database query then pass it off to some kind of query
handler we are about to detail out.
return query results as an xml graph

}

}

Our Session Handler above will be shallow. We're going to push most of the work
off to an XML query handler layer.
One complexity that we have to keep in mind is that multiple response handlers
can be active at the same time so we'll have to remember to put semaphores or
synchronized blocks around any code that isn't thread-safe. This will require a
careful audit of the project when it is done.
Now that we can "start up our app" we need to pick another piece to do. Our
choices are the query layer or the user interface. But it really does seem like
we are going to have to do a bit of real work now and deal with our actual
persistent datastore. Since we have a main() entry point we should be able to
do quick tests anything we now write.
The actual code for the above should be in the tarball at the end of this
project.

Writing the Triple Store


The first piece of real work is to write a lightweight RDF Triple Store. This
section will get the most discussion in fact; there are many details here.

Again here we don't have to think much about "what kind" of application is
going to use the triple store. In a sense we're making a decision that will
enforce design apriori - because of previous experiences I've had with RDF and
influences I've gotten from other people who have used RDF quite successfully.
RDF is a perpetually emerging grammer for expressing the relationships between
objects. It will be the cornerstone of this project and just about every other
project that we walk through. We're actually going to use RDF/XML - one way of
expressing RDF.

Parsing


One of the things we need to do is to load up RDF content off disk. Although
we're interested in writing a datastore we're actually not that terribly
interested in writing an RDF parser. And excellent ones already exist. To load
content into our RDF database we'll use Jena's RDF parser called ARP:

http://www.hpl.hp.com/semweb/jena2.htm

Storing


Another thing we need to do is to store stuff. We are not really keen on writing
a BTree on Disk or some other storage system. Java 1.4 does support NIO -
memory mapped IO and it is somewhat appealing to write our own system based on
that - but this takes us out of Java 1.2 land and breaks a design constraint.
Also there are some rather bizarre systems such as Prevalyer which offer
transparent persistence but I'm just not sure about the idea of inhaling
hundreds of thousands of RDF triples every time we start up - regardless of
performance. In this case we're going to go with PERST - which is a very nice
datastore written by some crazy russian guy:

http://www.garret.ru/~knizhnik/perst.html

Side Note:
We could in fact avoid writing our own triple store if we used
Jena or Kowari:


http://www.hpl.hp.com/semweb/jena2.htm

http://www.kowari.org

And in fact we could just grab an open source blogging tool
off the shelf:


http://www.opensourcecms.org

http://wordpress.org

We're not going to go with the completely off-the-shelf
solutions in this project because:


  1. Part of what we want to do is to build a
    system that we can understand all the way to the bottom. Getting a comfort
    level with RDF and
    a few of its peculiarities will let us make
    better decisions when we want to pick that industrial strength RDF store for
    subsequent projects.

  2. As well we may want to run this project as a mini-server on a
    local home PC or even on a cellphone type device. Our approach should be light
    enough to at least run on a circa 2004 HP IPaq and possibly even on newer
    smartphones.

  3. The fact is that building a triple-store is *not* hard given
    the power of tools such as PERST and ARP which we are going to leverage
    heavily.

  4. The main thing we're going to miss is a real query language.
    In fact even in avoiding a full blown query language one effectively ends up
    writing ones own. Query languages do introduce complexity and unpredictability.
    But mostly what we're trying to do is to understand the landscape of RDF; how
    and why exactly one works with RDF 'all the way down to the bottom' in a sense.

As far as I know nobody else has written an embeddable
persistent Java based RDF Triple store yet. As soon as one comes out we can
chuck all of this code out the window - but to achieve our learning and
portability constraints we are (for now) forced to use a solution that we write
ourselves.

Mapping Object Representation to RDF


Another big question - possibly the biggest question of this entire project - is
what is the best mapping between RDF (say in an XML file) and RDF in memory.
There are a number of excellent W3C sponsored articles on RDF mappings to RDBMS.
(In this case we're looking for a mapping from RDF to an OODB - but the ideas
are the same). This article:

http://www.w3.org/2001/sw/Europe/reports/scalable_rdbms_mapping_report/


and

http://www.w3.org/2001/sw/Europe/reports/rdf_scalable_storage_report/


talks about some of the data-type requirements and implementation issues than an
RDF Store might have for example. Some of the completely reasonable
considerations they cite are:

  1. Text Searching
  2. Storing URI's efficiently
  3. Supporting Datatypes ( int, float, string )
  4. Supporting RDF Containers
  5. Supporting RDF Schemas
  6. Inferencing / rules and reasoning hooks.
  7. Triple Provenance ( tracking what website a triple came from )

We're actually going to respectfully ignore quite a bit of this good advice -
but it is worth reading.
Our RDF database is going to have only a single kind of persisted object - an
RDF triple. Where an RDF Triple consists of a:

{ Subject, Predicate, Value }

Each of these parts can be represented in Java:

  1. 'Subject' represents a canonical URI string describing the topic at hand. It
    can be represented by a Java String.
  2. 'Predicate' describes a relationship such as "knows" or "owns" and can also be
    represented by a Java String. There is some argument that for conservation of
    memory one could store the XMLNS encoding of the predicate such as 'geo:long'.
    We'll store the whole unrolled predicate for now and revisit the idea later on
    possibly.
  3. 'Value' is either a literal such as "12" or "Mary" or alternatively it is a
    reference to another Subject. This can be either a literal of type integer,
    float, String or another Subject reference. Another consideration might be
    different language encodings for values. And yet another consideration might be
    providing full text search on the Values as well (probably best done using
    Lucene). We are going to just treat this as a string and not actually
    differentiate except by context of usage.

In Java our simple triple container would look like this:

public class Triple extends Persistent {

public String sub;
public String pred;
public String val;

}

Side Note:
Even if we're not going to be formal we should be at least
aware of the weaknesses of both the data model and the representation of that
data model being used here:


  1. It duplicates the same 'Subject' and 'Predicate' and 'Value'
    Strings over and over in the cache and even on disk. This is quite wasteful.
    Often in fact (say when implementing a PostgreSQL based store) one would index
    all the strings once only in a shared global index. The triple-store can then
    just be integer keys that refer to the String Index. The problem with one
    common bucket of strings is that one doesn't know if wildcard matches are
    returning Subjects, Predicates or Values without also checking the triples -
    and this can be slow. An alternative would be to have three string pools.
    Another alternative could be using a key that is say an md5 or sha1 hash of the
    string in question; thus allowing exact searches without having to goto disk to
    discover the strings key value first. In any case these approaches are easy
    enough to retrofit under a working RDF store later on.

  2. This approach doesn't specify the 'type' of a Value. One could argue that it is the role of an OWL based description to formalize those facts. The system will be able to store OWL terms just as it stores ordinary
    RDF content but at the same time we're not going to be writing any code to validate a collection of RDF triplets against an OWL definition.

  3. Some people would also add 'provenance' here - turning the triple into a quad and tracking the originating site of each triple. For our purposes we will simply treat it as a 'String' for now and revisit the issue
    later on possibly.

  4. Yet more bulky RDF triple stores might specify 'owner' concepts on each triple for fine-grained privacy. I prefer to have concepts of ownership be 'in' the grammer itself rather going from triples to quads.
  5. Another consideration might be to date-stamp triples as well - again something we're not doing.

Another way to store RDF triples would be to bind all triples associated with a given subject as a single Subject node. Doing this in Java
would look like so:


public class Reference extends Persistent {

public String subject;
public Hashtable values = new Hashtable();

}


Although we're not doing it this way - this second way does
have a subtle advantage. It would allow a query engine to operate across
disjoint database back ends. For example you might have a spatial database and
a vanilla subject-sorted keyword index and you might want to return some
features from each. Since each reference is fully self contained you could
easily emit a stream of blended features - without having to duplicate those
features into each database. This is a significant benefit - but again
something we're not doing.

Yet another way to do this would be to use an IDL to generate your java objects from an OWL definition. This is completely insane but I can see cases where people might do it:

public class MyRDFPerson {

public String uri;
public int age;
public float height;

}

We are going to use the first approach however we will wrap the triples inside of a Reference Class as exampled above so that from the
outside you won't really care about the implementation that much - and in fact
it will be very easy to swap implementations even as far as switching to Jena
or directly backing your persistence requirements with PostgreSQL.

Here is what that Reference class is going to look like:

public class Reference {

String uri;
public String get(String predicate);
public String set(String predicate, String value, boolean allowDuplicates );

}

The rules we'd think of normally associating with set() would say that duplicate
predicates are not allowed per subject. In a Java class for example you can't
say "int myvalue; int myvalue;". But in RDF this method can explicitly allow a
given predicate to be declared more than once if allowDuplicates is true. You'd
typically however want an rdf:Bag. Let's say that for example you wanted to
associate several tags with a given subject - you'd want to declare a child bag
that belongs to that subject and have that child cite all of the tags in
question.
At this stage we have a concept of a 'Reference'. This acts as a bag for
predicates and values associated with a given Subject.

Sticking things together


What we need now is actual persistence and a way to manufacture and store
handles on our Reference objects. Basically now we're going to just glue all of
the pieces into one huge blob called 'Database'.
So this is where we call upon PERST to do the heavy lifting for us:

import org.mortbay.perst.*;
class DatabaseRoot extends Persistent {

FieldIndex subs;
FieldIndex preds;
FieldIndex vals;

}

This incantation declares 3 persistent field indexes using PERST. Now when we
commit triples into the database we commit them to all 3 indexes. And to query
for any triple we can query any of the indexes.
PERST supports range queries, exact queries, and "subject starts with" string
queries. Queries can be done in forward or reverse index order.
For our needs this will suffice. For example:

  1. If we want to discover all triples whose subject begins with http://playground then we ask PERST to efficiently search the subs FieldIndex for subjects with that term.
  2. If we want to discover say all predicates that are http://www.w3.org/2003/01/geo/long
    then we do something similar.
  3. If we want to discover all values that are say > "118.35" and < "120.35"
    we can do that as well using PERST.

However to do more complex queries such as say find all things that are within a
certain value of predicate "geo:long" and predicate "geo:lat" we have to issue
multiple queries and do explicit joins by hand. Technically speaking however
one can actually avoid fully explicit joins (where one has a full copy of each
set) by using java code to iterate through the second set with the first set in
hand. (In the particular case where we are doing something that looks like a
spatial query - we could use the spatial indexing that PERST provides).
There's one more piece on top of all this that we need to add. We need some
concept of an overall "database" that can yield instances of References that
the application logic can then manipulate. That database layer will wrap PERST
completely; making it invisible to the outside world and will look something
like this:

interface Database {

public Reference get(String key);

}


With a little bit of glue this layer is basically done. Please refer to the
associated tar-ball for the exact details.
Now we're done most of the hard stuff. We just have to think about the user
experience and build out some UI. Actually that will also be quite a bit of
work - but hard in a different way - as we wander a thicket of possible UI
choices next.
Side Note:
A lot of people wonder if RDF is really any kind of
improvement over other ways of expressing objects. People often complain that
RDF/XML is overly verbose and not human editable for example. And people do
wonder if the same content couldn't be packaged under some other schema
altogether. Here are some of my thoughts as a first-time-user from playing with
RDF over the last few months:


  1. These days I find it easiest to think of RDF documents as simply big buckets full of triplets consisting of { subject, predicate, object }. This corresponds fairly well to the definition of a simple english sentence
    being { subject, verb, noun }.

  2. In RDF one can talk about 'decorating' any arbitrary subject with any arbitrary fact. It can be a reasonable way to think about and verbally discuss RDF system architecture in general - having something of a 'tools not rules' or 'just do it' flavor that can expedite thought.
  3. Subjects can be extended later on in the development process - meaning less time spent anticipating and pre-planning the system. Pre-planning and discussion time can be exponential with the number of elements
    that need to be considered and RDF can help de-stress that part of the work.

  4. RDF implies an underlying database model (for better or worse). If you're using RDF triplets consisting of { subject, predicate, object } then you're likely to find yourself somewhat coerced into having a database
    implementation that consists of a huge bucket of RDF triplets (rather than say
    one with a lot of specialized schemas that are being translated to RDF
    dynamically).

  5. RDF forces debate up a level of abstraction. Using RDF/XML specifies agreement not only on the transport notation (XML), but now also on
    the database structure. Since RDF specifies a grammer - not simply a syntax -
    it seems to coercively imply how that grammer is stored at least to some
    degree. Agents written to crawl one RDF database can potentially crawl another
    one that they were not originally meant to consider. Where people used to argue
    about how to transport data and how to structure meaning in the data now they
    are arguing about what the words mean.

  6. RDF is something of a 'universal solvent'; things tend to be dissolveable in RDF whereas they are not dissolveable in other grammers. Some of the tension with other grammers such as say VRML, GML and the like come out
    of this fact: people want to represent extremely diverse collections of facts.
    Even if you can't succinctly represent a concept as a single RDF triplet you
    can pretty much always find some transformation of your original idea into two
    or more RDF triplets.

  7. Often (in other grammers) facts that were not core
    considerations are attached as kind of barnacles. Late arriving concepts are
    not considered to be first-class citizens. Because of this classical grammers
    often attempt to re-invent the wheel 'better' - rolling in all the new
    thinking. Grammers such as say SVG, Flash, VRML, GML, Avalon 'steal' ideas from
    other grammers - re-implementing and repackaging them - whereas with RDF you
    just 'use' the snippets of the other RDF vocabularies that you like. One
    example of this is the 'Locative Packet' that in and of itself specifies no new
    vocabulary but simply denotes a convenient intersection of already existing
    vocabularies:

    http://locative.net/workshop/index.cgi?Locative_Packets

  8. RDF has an appealing simplicity and formality. It is quite pleasing for example that OWL (a grammer for specifying the legal attributes of any RDF subject) is itself in RDF. In other language such as say Java or any IDL - there are separate notations for specifying 'abstract' versus 'instance'. Even XML has the infamous DTD notation which is not itself XML. This lucky happenstance of RDF seems to be more than just accidental thinking - it looks like there were many predecessor ideas that ended up emerging here such as this
    paper on Associative Databases:

    http://www.lazysoft.com/docs/other_docs/AMD.pdf
    and these general comments on database normalization:
    http://en.wikipedia.org/wiki/Database_normalization


  9. A weaknesses of RDF is that work is pushed over to logic. Instead of having a declarative schema that fully constrained an object one
    tends to ignore constraints and simply use application logic to traverse the
    complex relationships that describe an objects state. The fact that a person
    may belong to an organization for example can be expressed in OWL but is more
    likely - practically speaking - expressed implicitly in the logic that walks
    persons and finds organizations they belong to. This might be as simple as an
    RDQL query or could be as complicated as explicit hard-coded logic in the
    application. Ultimately what is needed is a programmatical model of RDF where
    the OWL schema is itself directly exposed to the procedural logic.
    FABL for example moves
    in that direction.

Navigating via Tags, Streams and Crumpled URLs


At this point we have a way to serve content, and we have a way to store
content. Now we have to consider exactly how the user is going to interact with
content.
Here is where we move into the thinking that specializes the design away from
being any generic web driven database application.
We do know that effectively we're building a CMS - it understands what a user
is, what posts are, how to perform various useful queries and enforces a
permissions policy such that users cannot overwrite each others space. The
kinds of concepts we're needing to manage include:

  1. Users
  2. User posts
  3. User tags
  4. Perhaps some statistics as well

We also have a list of constraints from our earlier design talk.

Users and Posts



One thing we do know is that there will be users and user accounts. Presumably
users have preferences as well.
As well users will make 'posts'.
These roles seem fairly clear. We can use FOAF to define people. And for posts
we just define some RDF predicates in a vocabulary to capture basic post data.
In fact we don't even have to do any work - we can just use RSS as is with
<title> <link> and <description> being perfectly adequate.

Tags


Tags are a new concept here and get a little bit more discussion.
Let's cite a few things that tags do:

  1. Tags are introduced as a mnemonic to help users recall their own posts later
    on. A user can categorize a new post under any arbitrary string that they wish
    such as say 'politics, satire, humor' or say 'politics, art, prague'. The user
    can then see posts under a specific topic or intersection of topics and this
    helps with overall recall.

  2. If enough users have similar ideas about similar tagging systems then
    presumably even in groups you'll begin to see certain tags evolve and become
    representative of certain ideas. In the dating advertisments in the back of
    magazines for example you often see 'm4w' or 'w4m' as examples of tags that
    have evolved to represent certain ideas.

  3. Tag naming can get out of control if we are not careful. We may have to enforce
    some tag naming constraints. In this system all user tags are lower case, may
    start with a number, must not have any symbol in them except '/' and may not
    have spaces in them (even with quotes). Heirarchical tags are allowed although
    their value is low and they are treated as single atomic tags in most cases. As
    well 'sys:' and 'system:' are reserved.

  4. Tags can also be used internally to categorize system concepts. There is a
    somewhat seductive power to a tag engine. Once you have one typing system then
    it becomes increasingly convenient to be able to do all of your filtering
    against that type system. A 'system:subscription' or a 'system:friend' or a
    'system:ignore' tag could be attached to a user post to indicate that that post
    is about another user that that user may be subscribed to or a friend of or
    ignoring. If we weren't using tags then we might have defined our own RDF
    Vocabulary to explicitly capture concepts such as 'subscription' and or
    'friend' and would have a system that was actually less flexible (as the query
    layer will show). At the same time, by migrating system concepts up to the
    level of tags we are in a sense stepping outside of RDF a bit - it means other
    third party consumers of our RDF feeds have to have special logic to understand
    exactly what class of object an object is.

Note that there isn't any particularily deep reasoning as to why we're using
tags - it's just an easy, convenient, brief and memorable concept for users.
At the same time there is quite a bit of formal discussion on voluntary
categorization, prototype theory and the like. You can read some of the
literature in cognitive psychology for more discussion of these topics - in
particular Eleanor Rosch and George Lakoff. But at the same time it's probably
best to think of tags as a simple colloquial concept and not to read too much
into them.
Here is a bit of a ramble about some of the thinking however. One essay that I
like to drag out even now is:

http://citeseer.ist.psu.edu/taivalsaari96classes.html

I like to use the made-up phrase 'platypus effect' to capture a bit of
the ideas expressed by Antero Taivalsaari:


http://www.advogato.org/article/83.html


At the time I was puzzled by finding ways to categorize knowledge -
wanting to build all kinds of complicated virtual file systems and the like. (
I sometimes wonder if Ma Bell didn't invent C++ and OOP abstraction because of
their problem domain - dealing with millions of identical phone records. If Ma
Bell had been say a games developer instead they might have encouraged
something that dealt better with lots of heterogenous types. )

But Del.icio.us tags pretty much demonstrated that this was actually
trivial - and that thinking about this too much is basically just a waste of
time.

Crumpled URLS


The URL presents a very small text space within which a number of not completely
orthogonal concepts are being 'crumpled'. We are effectively trying to
represent a set of slightly irrational 'human shaped' ideas within a few dozen
bytes. The URL space should be:

  1. Memorable. To have an URL scheme for the site overall that is simple enough and
    clear enough that it can act as a mnemonic for the user. The user should
    ideally be able to type in an URL with various path and parameter qualifiers
    and have their browser retrieve specific content at that path. The user should
    not be required to visit the site and navigate solely by mouse-clicks.
  2. Unique. Each unique given page of a given type of content should uniquely map
    to a an URL and visa versa. Some sites that don't conform to these simple rules
    cannot be bookmarked; the user must manually navigate back to the site and page
    in order to retrieve the content.
  3. Key concepts dominate. In general the most important concepts that the service
    provides should be URL addressable in the URL path itself. Secondary concepts
    can be reached by '?' style parameters.
  4. Ego dominates. Users simply enjoy having their name be visible in the URL
    space.
  5. Tags dominate. Tags are an important concept and should be visible in the URL.

Streams


Del.icio.us uses an especially nice pattern where the url path represents a kind
of 'sum of children streams'.
We're going to do something similar where the URL is broken up like this:
Effectively the url is broken into:

[ domain ] / [ username ] / [ tag ] [ ?styles ]

Each parent folder sums up all of the content of all children folders. It's an
intuitive and useful metaphor. It even works with hierarchical tags.
An alternative pattern could be to do [username].[domainname]/[user tag path].
This is problematic simply for DNS management issues and because it ruins the
opportunity to use the domain name space for other kinds of more appropriate
overloading and precedence order. It is (arguably) more clear to humans to say
"portland.craigslist.org/anselm" than to say "anselm.craigslist.org/portland"
for example. So we won't do this.
Using a streams concept helps us work in RDF. There are some nice things we can
do in the database layer for indexing and discovering collections of facts
under a given stream or stream with a wildcard path.
Streams do create some worries and considerations however:

  1. There does need to be some concept of getting a stream of all tags independent
    of users. To accomplish this we can create a fake user called 'tag' and copy
    all posts to that user. Visiting http://domain/tag/elephant
    would yield all posts with the category elephant of all users.

  2. There is also quite a need to get at information in different 'styles' such as
    /person?rss=true. We are going to avoid as much as possible having reserved
    root path nodes and instead use parameter arguments where appropriate (
    avoiding /rss/person and favoring /person?rss=true ). This isn't quite "REST"
    http://www.xfront.com/REST-Web-Services.html
    ] in that REST encourages
    using 'nouns' not 'verbs' - but the REST argument in this case isn't quite
    clear to me and we are using tags so we desperately want to minimize use of the
    urlspace for anything else.

  3. Another final consideration regarding streams: there are system folders and
    other internal things that effectively end up becoming reserved users. If for
    example we want to have a folder for all books such as '/isbn/' we would have
    to make sure that user is reserved. There is some argument to put all users
    under '/home/' but that is a terrific waste of root namespace and that
    root-namespace is highly valuable and highly sought by users for their own
    names. So we live with the slight irrationality and just crumple the concepts
    we need into the url space as best maps to human needs.

Now we're done thinking about the way the user "sees" the system.
We're not actually being terribly innovative here - just emulating patterns that
work. Hopefully though we get to play a bit more later on once these
foundations are in place.

The Query Engine


Since we have a model of user interaction - with streams and tags and all that
stuff - we need to figure out how we're going to drive that interaction. We
have to make a bridge between the user and the database engine.
We're going to want a query layer that can be directly queried by the client
application. This is not RDQL (although it could use RDQL or another query
language) but is tailored towards our specific application. It also imposes a
security wall so that users cannot pollute other users content.
Basically we just want a laundry list of the kinds of capabilities we need and
then we can pluck out commonalities and implement something simple that
translates these high level requests into actual indexed query lookups of our
RDF database.
Typical queries are probably:

  1. Return a list of all posts by a particular user
  2. Return a list of all posts by a particular user under a particular topic or
    'tag'
  3. Return a description of a particular user
  4. Return a count of all posts or posts in an area
  5. Return posts within a certain date range
  6. Return posts over a certain size
  7. Return a list of all topics
  8. Return a list of all users
  9. Return a list of all posts
  10. Return all posts with certain content
  11. Return all posts on a particular 'kind' of topic - such as a book, music,
    mime-type or other disambiguatable thing.
  12. Return a thumbnail of an url or a file
  13. Return administrative gateway views of all users and all posts
  14. Login a user
  15. Logout a user
  16. Accept a new users description
  17. Accept a new post by a user
  18. Accept a subscription by a user to another user (ie accept other kinds of
    things not just posts)
  19. Accept a file
  20. Allow a sysadmin to delete or modify users and or posts
  21. Show statistics
  22. Throttle returned results; return todays or this weeks or 10 results only.
  23. Return not individual posts but only 'unique' posts about a given URL. An url
    posted twice should show up once only.

The discussion of the actual implementation of the query engine is probably too
much detail for here. I'll let you look at the code to see the specifics of how
these queries were implemented based on this set of use cases.

Javascript User Interface


This javascript stuff all sounds terribly mundane but actually it's quite
liberating - it means you as an engineer can get more stuff off your shoulders
and get other people to deal with it. That means much more leverage, more
people stirring the pot and more help overall.
What's happening is that a few web services now are starting to use Javascript -
and thats a pattern we're going to use.
Googles gmail and Amazon's A9 service are good examples of this.
Historically most web services manufactured the user interface on the server
side using Mason, ASP, JSP or other such grammers. These solutions are actually
quite difficult for designers to work with and they create a security liability
in that the pages can express commands that permeate the security wall between
the client and server state.
A cool thing about Javascript is that we're able to ask the server to ship us
pure XML and then we (or our lackeys) can do the layout of that ourselves. We
can even have long complicated dialogues with the server - asking small
questions about users or state and making decisions based on that. We could let
a user try to create a 'shared discussion group' and then advise the user if
their group was made or if the name was already taken for example.
We're able to use the same patterns we would in an ordinary
not-split-over-a-network application.
Here's a general laundry list of the reasons Javascript is appealing:

  1. Javascript runs on the client side, is shipped as static content from the
    server so less computation for server.
  2. It can be vastly more responsive than any server driven application.
  3. Authoring tools can deal with Javascript much better than with ASP, JSP and the
    like.
  4. It is simply a nice separation between server responsibilities and client
    responsibilities.
  5. Using Javascript creates a practice of building XML gateways between server and
    client; this formalizes the server API.
  6. A well separated server with clearly defined roles can talk to any client - a
    native application or other visualization tools.
  7. Since there is a total separation between the server and the client it becomes
    possible to allow clients to create their own html pages and store them on our
    server. That means users could entirely customize the appearance of their own
    pages and we wouldn't have to worry about security issues. Many web services
    fight over look and feel - this makes that debate totally obsolete and a little
    bit silly.

There are some drawbacks to using Javascript:

  1. Browser portability problems.
  2. HTML and layout inconsistencies across browsers (that can be more easily
    treated on the server side).
  3. Slow client machines can be slow to rebuild display.

In the way we're going to use Javascript there are also a few seemingly bizarre
design choices. We're going to simply have a single html document on the server
that we're going to send to the client over and over. This single document will
change its appearance based on the current URL that the client is on. And what
this means is that we have to 'round-trip' form parameters back to the client
document for it to do work.
In a sense we are shipping an 'application' to the client - and even though HTML
is too stupid to know it - that application persists between pages and doesn't
have to introduce any new pages.
The Javascript application delivers the UI. That UI consists of pieces like
this:

  1. Present a users home page full of their stuff. A huge time sorted list of
    posts, citations, books, music - whatever was logged.

  2. Present alterna views such as calendars, time-maps, geographic maps or
    whatever.

  3. Present other pages full of stuff there respectively as well.

  4. Show user tags so user can navigate by tag.

  5. Show all users tags together so users can pivot on tags to discover other
    similar posts and other similar users.

  6. Let users post new stuff.

  7. Let users fiddle with personal settings and profile

  8. Possibly show statistics

  9. Show recommendations; doing some server side computation.

There are going to be many UI pieces - but we can build them as we come across
them. It doesn't require a lot of pre-planning.
The amusing thing about a Javascript based application is that the HTML is
treated as just a launching point. There is almost no HTML at all:

<html>

<body>

<javascript>

deal_with_entire_pages_content();

</javascript>

</body>

</html>

All of the work is done from javascript. It doesn't even make sense to draw
header or footer banners in HTML unless they are absolutely universally
constant.
The client application sits inside of our javascript code and more or less just
fulfills the list of UI pages that we want to have. It's largely a sequence of
functions that we pick between. We look at the users current URL and the
current parameters and then execute the appropriate subroutine to draw that
page.
In the case of this application a fly-over of the code at 10,000 feet might look
something like this:

  1. Detect if IE, Moz, Safari or another browser.

  2. Get and set cookies for tracking current user.

  3. Parse apart the current URL into [ domain ] [ user ] [ tags ] [ ? ] [
    parameters ]

  4. Get current user

  5. Get user being visited

  6. If the user is looking at the home page then manufacture a splash screen. This
    could be a root feed with all content.

  7. If the user is looking at their own page then present their own content with
    edit controls.

  8. If the user is looking at somebody elses page then present that page.

  9. If the user wants to see all posts under a common tag then direct the user to
    some unique url that can represent that concept such as /tag.

  10. If the user wants to see their personal profile then start using parameter
    space to express that such as /user?profile=true

  11. If supplied parameters indicate an 'older' date range then present that date
    range.

  12. Draw the current page full of items

  13. Draw a navigation calendar widget or whatever is used to navigate timewise
    through a pages collection.

  14. Draw any silly mumbo-jumbo header and bottom.

All of these aspirations are going to be pinned on a small library of Javascript
functions. We're going to write some XML utilities, some layout utilities and a
few other bits and pieces. Overall the library will be something like this:

  1. Reading XML in Javascript from the server
  2. Writing XML in Javascript back to the server
  3. Drawing XML to the screen
  4. Input forms
  5. Some layout utilities
  6. Determining current user page and reacting appropriately

I don't have time to actually walk through exact code in this discussion. You'll
have to refer to the tarball for now. Later I may add more comments to this.

Conclusion


Here is the tarball. [ Well it's not
up yet but it will be in a week or so when I have a chance to finish it ].
These services are fun to build from a kind of mad scientist perspective. The
tools we have today to architect these large scale social systems are so
powerful and so easy to use that it can be as little as a few days work to
unleash an entirely new social application on an unsuspecting public.
If you're going to use this starting point professionally then there are other
considerations not covered here; such as finding ways to aggregate and or
federate content so that you can take advantage of laws of utility and avoid
walled garden effects. As well if you are deploying a commercial service based
on this code you may want to support some wiki like concepts so that users can
entirely customize their own experience.
What could you do with this?
You could make your own Craigs List such as discussed by Jo:http://frot.org/geo/craigslist.html
Your own personal knowledge tracking system - for tracking your habits or even
your finances.
Effectively this becomes a big bucket that you can pour stuff into. If used
personally it could become a hugely powerful tool for long term stuff
organization and management; from tracking habits, health, phone numbers and
other such often lost things to post-organizing existing collections of
duplicate archives and the like. You could attach an aggregator to this and do
say brute force geo-location of news-articles and project them onto a globe;
and then do peer based review of those articles or additional decoration of
facts from people who are on the ground in that area...
Really the sky is the limit.
In fact I originally started down this path with the hopes of writing a video
game. The idea of managing users, managing content and doing it all in a high
performance way came out of the kinds of demands that a large scale
locative-media multi-player experience would have. I ended up recognizing that
even building this foundation was a chore in itself and made just doing an RDF
based CMS the first goal.
The thing to do is to think about where all of these services are going over the
next 10 years. Clearly many of them are going to go away - and clearly others
will have to find ways to federate and share their knowledge.
Hope you had fun.
Please send me comments if you liked this essay to anselm@hook.org
. I'm also looking for ways to improve my understanding of this space so I'd
like to hear advice about better or more rigorous ways to build an RDF database
and to do embeddable persistence overall.
I'd like to thank Tangra, Maciej, Joshua, Brad Degraf, Dan Brickley and
especially Jo Walsh for getting me interested in RDF in the first place. All
mistakes are my own and many insights belong to these people.
- a


Venture Capital Blogs

The Mercury News has a roundup of our neighborly VC bloggers. You really have to hand it to them for making a private equity a little more, well, public.

Sometimes a cheat sheet is better than a term sheet, below are some of the better ones in no particular order:
Its a little cliché, but venture blogging has put a human face and open rationale for what is a mysterious process for many. You quickly learn that the venture boys have their own lives and interests. Also of interest is Jeff Nolan's blog which is like getting VentureWire for free with honest commentary and the VCs that dabble through AlwaysOn. I've been pleasantly surprised at the level of civility that venture bloggers receive, given the generic blame pointed at them since the crash -- something that should encourage new voices to join the chorus.

As an entrepreneur, there is no better reference for who I might choose to work with over a long term than their long term reputation and thoughts shared through blogging.

SS/SN的商业模式新思考

最近一直在考虑SS/SN的商业模式

很巧的是找到了一些文章,很有趣。但对自己的启发并不是很大,我觉得,从根本来言,SS/SN的商业模式,很难用几个简单的方式进行获取。

我觉得应该从2个主要方向去寻找商业模式

1、返回经济和管理的本质去寻找。SS/SN从根本上来说是降低社会成本,和猎头公司,资讯公司相同,是减少社会成本的方式。再从猎头公司和资讯公司的角度来看,其行业的商业模式也是非常简单,他们提供是一个经过整合的信息,也同样是通过互联网、电话等通讯工具来完成整个商业过程,可是SN/SS不同,他虽然是通过网络方式,但就几个方向来看,交友、购物、招聘。这三点,最重要的是SS/SN公司无法对双方的商业过程进行掌控,SS/SN公司在其中只是一个渠道!而且是自己不能控制的渠道!信息是可以用来卖钱,可是,如果这个信息是不可控的,他就是无主资源,就和空气一样,那他还有价值吗?SS/SN公司需要做的就是要寻找一个方法让包含在SS/SN的信息得到有效的控制;

2、寻找上下游及相关行业,当然还有终端客户是谁。寻找他们的商业模式,并寻找如何和上下游的行业的接口,开辟一个自己发展的空间。上下`业:电信/宽带运营商,下游有什么行业呢?还没有。这个需要考虑!相关行业:与生活相关的所有行业,很大,呵呵。下文有句话说的不错,人类的各种关系之中,以生存的关系、性关系和经济关系最为重要,所以要抓这几个行业:招聘,消费品,旅游,娱乐,媒体、商业资讯这几个行业。终端客户是谁呢?可能也是一个问题!每个使用者都是客户?还是抓几个重点客户群?需要思考。

综上,现在要解决的问题是

1、信息的可控性;

2、下`业确定和打造;

3、定位终端客户。

关系万千重--关于社会性软件、IM和p2p等的随想

个人主页:http://risker.org 网络日志:http://blog.xfocus.net/wlj/
原始链接:http://risker.org/misc/ssp2p/index.html
版本控制
v0.8 07/30/2004 文档创建
v0.9 08/10/2004 增加部份社会性软件内容,并借黄仁宇的《关系万千重》来命名

1. 观点
2004年中,各种即时通信软件方兴未艾,社会性软件初露头角,p2p技术日趋成熟,知识管理更受重视……这一切意味着当前正处在变化的边缘,正确利用人们投诸于这些领域的热情,可能带来突破性的进展。黄仁宇在《关系》一文中认为,人类的各种关系之中,以生存的关系、性关系和经济关系最为重要,仔细想来,生死、男女、经济的确左右了人与人之间相互交往的许多特性。

网络时代,前面提到的社会性软件、即时通信平台、p2p技术、知识管理平台等,能够:

在不同程度地影响着人与人之间的“关系”和“圈子”。
将促进多种技术的融合,并为用户提供一体化的应用和服务。
人与人之间的关系、软件与软件之间的关系、技术与技术之间的关系能够在这个小范围内充分相互作用。
2. 考虑范围
2.1 这些软件或平台的概念
为了对所思考的范围做一个界定,我用FreeMind制作了下面这张图片(这里列出的软件、产品或概念并不完整,但基本能表明我的分类方式):



仔细观察图片中的内容范围,可以得出本文关注的基本范围是:与个人通讯、交往、学习、游戏有关的电脑或网络工具。

2.2 外行评价
这里并不想就这些名词或软件作概念上的界定--事实上我认为现在不是恰当的时机,因为这些概念产品技术正在迅速地相互作用和杂交,最终在市场上、在人们的记忆中能够留下印痕的将是什么,谁也无从得知。所以,这是个探索期,在这个时期,不该做定义,只需要叙述感受。:)

2.2.1 社会性软件
利用电脑与网络技术,结合人与人之间的信赖、互助,以类似滚雪球的形式将人们聚集起来,并且可以共同完成某些目标,或者,仅仅是为了快乐……

orkut等国外服务
orkut是颇具王者之风的google推出的社会性网络,在网络中曾经引起了很大反响,ebay上拍卖的orkut的邀请在一段时期内非常抢手,它的基本界面如下:



orkut类的网络运作原理是基于人都有一定的交往圈子,在这个圈子内相互信任程度较高,性格、爱好等也有相似之处。在这一基础上,A认识B之后,相当于A与B共享各自圈内的朋友……这样“滚雪球”似的运动,会发生人际关系间哪些奇妙的互动,只有尝试了才知道了。

orkut比起其它社交网络有几个特点:

只有通过邀请才能加入,因此比较能够保证社区质量;
新加朋友,在对方认可前,就能够浏览他(她)的圈内朋友,并加其为好友,因此圈子容易扩大;
有Rank功能,对朋友进行属名或者匿名投票,可以帮助判断朋友的情况。
与orkut相仿,国外还有多种类似的社交网络,如社交网络服务的先行者Friendster、以求职招聘为主的Linkedin等,各有特色,其基本界面可以参考下面的图片:

Friendster
Linkedin
较具特色的是在国内被称为“美味书签”的del.icio.us,与上面的orkut等SNS相同,美味书签也是一种社会网络服务,但它只专注于让人们共享其收藏夹,通过对web的关注兴趣点来“选择”志同道合者。它的界面可以参考这幅图片

uu、友友和liring等国内服务
在国内,SNS的发展也相当迅猛,一方面是大量对Blog和社会网络有着浓厚兴趣的先行者翻译、搜集整理相关文档和资料,促进人们的了解;另一方面,由于社会网络服务本身具有很强的商业潜力,也吸引了许多开发者和投资商的目光。

友友网络优友地带生活圈等几家服务商可以算是国内较为知名的社交网络服务提供商了,基本思路都是以通过朋友结识朋友的朋友,扩展社交圈,提升社会资本。让使用该服务的人们能够以现实中的朋友为桥梁,建立起以信任为基础的关系网络。

当然,几家服务商的侧重点还有所不同,比如优友地带,在一定程度上进行了社交网络和通信平台的结合,并且通过与电信运营商的合作,试图通过VoIP等方式盈利;而生活圈则是通过细化“关系”的类别、计算关系密切度等手段保证它的先进性,甚至于希望能够将关系量化,来协助对“圈子”进行分类对比(这或许是将来一个可以研究的课题,但事实上我并不看好)。

wiki
“Wiki Wiki”一词源于夏威夷语“wee keewee kee”,意思是“快点快点”。大约是因为“快点快点”地催促暗合了这个系统迫切需要的参与精神,Wiki发明人WardCunningham就用Wiki命名了以知识库文档为中心、以共同创作为手段,靠大众不停地更新修改,借助互联网创建、积累、完善和分享知识的全新模式。

wiki和普通网站最大的区别就在于它是群众参与的,任何浏览者都能够对页面进行修订增删,国内Wiki在CNBlog等一些社区团体中已经得到一定的应用,使用更为广泛的是自由软件社区,比如linuxsirfcitx等,因为wiki的自由与便捷令人心动。

2.2.2 通信软件
即时通信软件相信有一定上网经历的人都会相当了解(或者,现在初学上网的年轻人,一开始会的,估计qq该是其中之一)。这里我把它简单分成几种类型。

2.2.2.1 IM类
纯粹自有品牌、自建服务器、通过软件的优势来吸引玩家的类型。

qq和msn
在中国,毫无疑问,qq是即时通讯中的王者。近期MSN正在迅猛的速度赶上。这两款软件从功能、实用性、便捷程度等角度来说,可以说都处于同一档次,如果硬要进行比较,个人认为,只能从文化上着手:qq的大量玩家是年龄在20岁上下的青少年,加上qq上曾经出现“打擦边球”的带色信息、大量的游戏、品味一般的聊天室……这一切使qq有一种“娱乐工具”的标准形象。而MSN则一直以企业严肃面孔出现,给人的感觉用户群相对素质较高。

或许这是目前大量企业在网络内部封杀qq,但却往往给MSN留个口子的原因?

icq、yahoo、uc
icq曾经是聊天工具中当之无愧的老大,可惜廉颇已老,软件功能单一,导致疆土逐渐被竞争对手所蚕食。yahoo messenger则始终未能出人头地,一直被压着打。至于uc,前期跟着qq的思路做得不错,被新浪收购后,不知战斗力是否会大幅增强。

jabber
Jabber是个开源项目,基于XML,并且架构、协议全面公开。而且它还是个分布式的系统,也就是说你可以架自己的Jabber服务器,注册到这台服务器的用户一样可以同其他地方的Jabber服务器上的注册用户联系。能够轻易构成一个分布全球的Jabber网络。每个企业也可以建立自己的Jabber服务器,并且封闭外部接口,只供自己内部使用。它的技术支持极其强大,有各种平台甚至PDA和手机版本的客户端。

2.2.2.2 整合类
trillian和myim
Trillian和Myim这两款软件,一中一外,都能够支持多种即时聊天工具的登陆使用,对同时使用多款IM进行聊天的人来说极为实用。对于国人来说,最大的区别应该在于Myim支持腾讯qq这个大陆事实上的标准,而Trillian由于不关心中国市场,并没有在这方面进行研发。其次是Trillian纯粹是一款整合多种即时聊天工具的软件,但myim看起来更有野心,因为--它至少还提供了自己的号码,估计是试图在用户积累到一定数量时再发力。

两款软件使用还算差强人意,比起单一IM来说,功能上并不那么完善,界面亲和度也不尽如人意,但总是勉强可用。它们的使用界面可以参考Trillian的图片和Myim的图片

gaim
之所以将Gaim单独放到一边来说,因为它开源、跨平台、支持多种IM,很容易能够在它之上开发出各种扩展应用来,它的界面参见图片

可以说,gaim的开放性及软件的成熟和稳定,很大程度上能够为希望通过IM创业的人们提供软件开发思路。

2.2.2.3 插件类
msn shell
msnshell是一位24岁的年轻人在MSN的基础上开发的插件程序,对MSN进行了功能扩展,最具特色的是它的标签功能,按作者的话说:“我们还可以增加自己特殊的标签,将常用的一些在线功能(阅读新闻、查看天气预报等)集成到 MSN Messenger 中,将其变为一个功能丰富而强大的客户端工具。曾经见到过 Microsoft 演示新加坡政府的电子政务系统,就是将许多客户端的功能置入 MSN Messenger 的标签中,为工作人员提供了一个使用极其方便的工具。”

msnshell只是一个插件,因此其功能是依托于MSN的,其基本界面见图片,由于标签可以自定义,就极大地扩展了MSN的功能,现在已有的标签有如:游戏、广播电台、网页收藏、电视节目等,因此,在这种结构下,all in one成为可能。

MSN机器人
和msnshell相比,msn机器人则有它独到的特点,从他们的网站上可以看到,它的功能点集中在一些信息查询和简单指令回复上,但由于这种形式容易定制,因此也有可能在其上进行深度挖掘。

木子版qq及qq for Linux
至于木子版qq,则较为简单,主要是满足网友的需求,去除qq众多广告,去掉不实用的浏览器,能够查看IP地址等等。对于qq的挖掘,近期由于自由软件工作者的反向工程,尤其是perl-oicq等软件项目对qq协议的完全破解并公开,使之成为可能。这里是一些qq协议分析的文档,感兴趣的朋友可以查阅。Linuxsir的朋友开发了OpenQLumaQQ,使qq的跨平台使用成为可能。

2.2.3 P2P软件
P2P是peer-to-peer的缩写,peer在英语里有"(地位、能力等)同等者"、"同事"和"伙伴"等意义。这样一来,P2P也就可以理解为"伙伴对伙伴"的意思,或称为对等联网。目前人们认为其在加强网络上人的交流、文件交换、分布计算等方面大有前途。这份英文文档里面简单对p2p技术进行了描述。p2p技术目前面临的最大问题在于版权,国际网络音乐版权诉讼对我国(p2p)企业的启发里面提到了部份值得参考的观点。

2.2.3.1 纯粹p2p
这里对“纯粹”与否的判定,是我自己杜撰的,我认为,不需要中心服务器、每个点都是对等而且在网络中具有同样功能的这种产品,才能称之为纯粹,而类似napster和bt这样,或者需要种子,或者需要中央服务器,但采用了p2p技术的,仅能称之为“准p2p”。

gnutella
被认为是“令人称奇的软件产品“的Gnutella,自从开发面世以后,转眼间就迅速普及。只要利用搜索功能,就可以在全世界gnutella对等网中与其它个体之间收发各种软件、文档等。

有大量的软件能够加入这一对等网,比如gnucleus



你在gnutelliums还可以找到大量的同类软件,如phex等。

freenet
在Freenet的网站上有一句说明:Freenet is free software which lets you publish and obtain information on the Internet without fear of censorship.出于众所周知的原因,这里不对它进行细节描述了。这里是它的logo

2.2.3.2 准p2p
napster
Napster技术在1999年由仍在美国东北大学就读的Shawn Fanning开发成功,并迅速在众多MP3数字音乐爱好者中传播开来。Napster提供了一个客户端软件供MP3音乐迷在自己的硬盘上共享歌曲文件,搜索其他用户共享的歌曲文件,并到其他也使用Napster服务的用户硬盘上去下载歌曲。

bt
BT是一种类似与电驴的P2P共享软件,全名叫"BitTorrent",中文全称:"比特流"。bt在这两年来成为互联网上的一个热腾腾的地盘,你可以到作者的网站看看对bt的介绍性文字。BT的下载原理见下图:



它首先在上传者端把一个文件分成了Z个部分,甲在服务器随机下载了第N各部分,乙在服务器随机下载了第M个部分,这样甲的BT就会根据情况到乙的电脑上去拿乙已经下载好的M部分,乙的BT就会根据情况去到甲的电脑上去拿甲已经下载好的N部分,这样就不但减轻了服务器端得负荷,也加快了用户方(甲乙)的下载速度,效率也提高了,更同样减少了地域之间的限制。比如说丙要连到服务器去下载的话可能才几K,但是要是到甲和乙的电脑上去拿就快得多了。所以说用的人越多,下载的人越多,大家也就越快,BT的优越性就在这里。而且,在你下载的同时,你也在上传(别人从你的电脑上拿那个文件的某个部分),所以说在享受别人提供的下载的同时,你也在贡献。

同样,有大量客户端软件能够以bt的原理进行p2p的文件共享,比如azureus

2.2.4 Blog
Blog是继Email、BBS、ICQ之后出现的第四种网络交流方式。Blog的全名应该是Weblog,中文意思是“网络日志”,后来缩写为Blog,而博客(Blogger)就是写Blog的人。实际上个人博客网站就是网民们通过互联网发表各种思想的虚拟场所。盛行的“博客”网站内容通常五花八门,从新闻内幕到个人思想、诗歌、散文甚至科幻小说,应有尽有。

2.2.4.1 Blog服务
blogger
blogger无疑是世界上最大的blog服务提供商,看看这份2004年8月4日的统计数据,就可以看到blogger的巨大影响力了。Blogger与众不同的特性在于:增强型的Dashboard(允许用户使用便携设备通过电子邮件发表自己的Blog)、共享型的评论功能和新的作者概况等。它的界面非常简洁明快。

cnblog
在国内,cnblog有其一定的特点,表现在团队中的成员对blog、SNS的理论、技术不断追求;同时借鉴了类似wiki的形式,撰写blog百科;提供blog搜索等,可以说是国内blog非赢利性组织的代表。

blogchina
博客中国则是另一种风格,前期更注重新闻、评论,在这里聚集了一批文人,他们似乎并不很在意blog的理论,只是将它当成一种便捷发布的工具。近期,或许考虑更多,它也提供了新闻聚合、博客公社等。可惜这里的博客公社,从理念到界面都有抄袭blogger之嫌。

blogcn、blogbus、blogdriver等
相比之下,我最喜欢blogbus,不知是不是因为我没有在这里申请过帐号的缘故。 :)

blogcn经常性的改版、缓慢的速度、偶尔发生留言等遗失故障,让人略有些不满。而blogdriver功能略显华而不实(不够简洁)、安全性一般,在2003年底我的使用过程中,发生过帐号失效、日志丢失、站点升级长时间暂停服务等。

国内提供blog服务的厂商现在有很多了,上面提到几家的即便有种种不足,但总体而言,仍不失为这一阵营里的领头羊。

2.2.4.2 Blog聚合
聚合服务
bloglines等许多企业都提供新闻聚合的服务。国内也有看天下等网站提供类似服务。个人理解,这类似新闻分类、检索和过滤,属于信息服务,再往深里走,或者能够走向信息个性化定制。

聚合软件
提供新闻聚合的软件相当多,如SharpReaderRSS Bandit或者商业软件feeddemon等等。

它们能够对rss、atom等格式的新闻、网志进行订阅,省去了开启浏览器的大量窗口进行阅读的麻烦。

2.2.4.3其它blog工具
Blog发表工具
比如w.bloggar,比如wbeditor都是这类工具的代表,更理想的模式是,将国内的免费blog都以插件形式集合进来,这也是吸引人气的法宝。 :)

Blog服务器工具
这方面的工具就数不胜数了,wordpressmtb2等软件,都极为流行,能够轻易帮助个人建站,而象plog之类的软件,则支持多用户blog,近期更为人们所喜好。

2.2.5 其它
列在这“其它”项目里的,要么是一些较为“另类”的工具,要么则是前面提到的两种甚至多种技术的杂合体,因此简要说明。

softether和vnn
softether是一个日本学生写的软件,一度引起较大轰动。它能很好地穿越防火墙等边界设备,有效地促进了网络的互联互通。

vnn软件通过VNN平台提供NAT穿透服务,以独有的VNN透明NAT穿透技术为基础,为用户、尤其是内网用户提供传统网络服务、办公、文件共享、即时消息、语音、视频、游戏等全面的网络应用NAT透明解决方案。其客户端基本界面见图。

当然,剑有双刃,这两款产品的功能,同时也可能给企业或机要部门带来安全上的隐患,需要引起注意。

p2p与im杂交
这类软件较多,象PP点点通点石OPpoco等都是国内的优秀软件,各有其特点,但他们面临的最大问题仍然是:版权和国内的信息管制。另外,最近在voip领域引起较多人关注的skype,它是p2p软件KaZaA开发人员的又一杰作,而且音质甚至超过普通电话。

ss与im杂交
我所见到做得最出色的应该是优友通了,只要在优友地带注册,就能够使用该软件,并且优友地带这个社交网络内的朋友,会直接成为该IM上的好友。该软件的另一个特色是pc 2 phone,能够拨打电话,这也是一个赢利点。

新闻与im杂交
暂时仅能举出一个donews的IMU,所谓“快牛”,它一方面支持多种IM登陆,另一方面,借助donews在新闻方面的专长,该IM工具直接绑定他们的评论网站。如果想再深挖潜力,可以将他们的blog、专栏作家与IMU结合互动。


3. 赢利模式和弱点
从上面的简单介绍中(不得不简单,因为涉及的产品和公司、概念太多了),不知你是否能够感受到一种整合的趋势?当前即时通信软件正处在风起云涌的大潮头,而社会性软件、Blog、新闻聚合、p2p等多处在摸索阶段,或者说,暂时还是雷声大雨点小。

3.1 市场竞争情况
仅举即时通信软件来看,当前国内的市场竞争已经非常激烈,qq、msn、yahoo、uc、myim、icq、pp、imu、网易泡泡等等,但如此数目众多的厂商挤到这个环境中,市场份额是不是足够大?他们希望如何创造利润?

再看本文所论及的每个技术领域,都扎进了大量的“先行者”,无疑不会有人总想为人提供免费午餐的。他们现在的所有努力,很大程度上目的是:吸引眼球!

他们希望如何赚钱?

3.2 现有厂商的赢利模式
事实胜于雄辩,看过前面所描述的众多产品后,只要对当前市场情况有所了解,应该不难在头脑中描绘出他们希望走的赢利之路:

广告
这是最容易理解的,包括腾讯和微软在内,许多厂商都希望在吸引眼球之后,能够适当利用这些眼球赚来回报,广告无疑是最直截了当的方式了,但,是否是投资回报最高的方式呢?

游戏
Tencent QQ中的游戏大厅、MSN和MSN shell里面众多的网络游戏,甚至包括大量提供信息服务的机器人,都是寓赚于乐,让人们在嘻笑之余掏了腰包。

短信
2003年最火爆的应用,救活了中国的几大门户。但2004年市场渐渐规范后,市场增长幅度便不再那么迅猛了,但仍然是诸多厂商追逐的目标。

语音
类似skype采用的聪明方式:普通用户免费享受高品质的pc to pc的语音服务,而付费用户及企业用户则能够利用免费用户提供的带宽,进行pc to phone的高品质通话,甚至于召开网络电话会议等等。国内的优友通看起来短期内想走的主要赢利之路就在这里。

下载(电影、音乐、软件等)
类似于点石op那样,用户通过大量上传或者购买点卡获得“石头”--点石中的货币,然后就可以用这些“石头”下载相应的电影、音乐、软件等等。这种方式也相当聪明,一方面将娱乐集成到产品中来,另一方面充分利用p2p产品的特性,提倡共享,付出越多,收获自然也越大。

这类型的收入最容易引起纠纷的实际上是版权问题,或许这是国内企业很难绕过的一道槛。

企业即时通讯
今年的7月15日微软、美国在线和雅虎宣布,微软为企业用户提供即时通讯服务的Live Communication Sever(LCS)将连接美国在线的AIM、雅虎通和微软自己的MSN。这表明在企业IM领域国外巨头已经有合纵联横,而国内,腾讯的RTX努力在这一市场上厮杀,也颇有斩获。

另类
我的一位朋友冷峻散势收到过国外公司shareyouexperiences(以下简称Share)的邀请信,其主要模式是:

若你想与某人A交往,如果有人B熟悉A根基底细,你想不想跟B聊聊先,否则遇人不淑,交友不慎… 若你想跟某公司C做交易,交易前,如果你有机会与C已有过交易经历的公司D接洽一下,是否胜算更大一些呢?每个认识A的人都可以通过Share匿名发出“我有关于A的背景信息”的消息 每个认识C的公司/人都可以通过Share匿名散播“我有与C交易过的经历”的消息

Share不对诸如“关于A的背景信息”的真伪负责,即便它是诽谤!它还有法律依据呢,呵呵。它提供一个匿名交流平台,举例来说,B是匿名发布“我有关于A的背景信息”的,B需要在Share登记并获得一个ID(免费),B发布“拥有的信息或需要的信息”是免费的;当然,你也得先在Share注册一个ID(免费),不过你若想与B接上头交流,呵呵 对不起,你的用户级别得先升级,交纳X美元。诚然,你与B接上后,你双方可以看情况透露联系Email,不再用Share的匿名交流平台了,但是可别忘了,你的银子已付给了Share,只为揭开A的信息。

你付了钱,不能保证你可得到A的真实信息,理由很简单:

(1)Share不对诸如“关于A的背景信息”的真伪负责,即便它是诽谤;

(2)B拥有的信息根本不是你想要的;

(3)B纯粹是 Share的托。

但是,Share这种模式很可能成功!为什么,因为它牢牢抓住了大众“窥私”的天性。无论真相或谣言,它总可以给我一些我不知道的东西。


3.3 与他们竞争的困难点
市场80%的眼球都盯在20%的厂商身上了,这时候,我们要采取怎么样出位的动作,才能够让观众把热情投向我们呢?未求胜,先求败,让我们看看与他们竞争会面临哪些困难:

新技术和思想受到具备雄厚资源厂商的压力
微软在日本推出Blog服务、传言Google的IM在策划当中、AIMMSNYAHOO在企业IM方面进行的紧密合作……这一切似乎都表明一点:在这个领域中,只怕想不到,不怕做不到!有了任何新的想法和思路,均有可能被大厂商迅速跟进,并挟人气、人、财、物的优势长趋直入。

市场已经基本稳定
im、blog或者社交网络都有个特性,就是:在使用中扩大生活的圈子,并加深彼此的友谊。因此这类型的软件使用者会容易产生思维定势,不愿更换。

思路开阔技术全面的复合型人才缺乏
在这些领域中,由于“目标”的不稳定性,因此需要人员的思路开阔,有创新能力,同时技术尽量全面或者有足够好的学习能力,但这样的人并不太多。因此起步也不那么容易。

4. 一些想法

4.1 我想要的是什么?
把我放到纯粹用户的角度,面对这些选择,我想要的是什么?

社会性软件、p2p软件、blog、新闻聚合、IM、语音、视频、广播电台、信息点播、甚至个人信息管理……我们面对如此多的优秀思想与产品,但是众多类型的技术之间横向上各自为战,导致的缺憾也很明显:

众多思路未能很好整合,或者由于产品观念上没有突破,导致产品与产品之间的融合进程非常缓慢。而且彼此间的力量很难利用,比如,是否有人考虑过,社交网络能够带来的雪球效应和p2p技术中的“每个节点都是一个中心”结合,可能带来什么?
由于多种产品的并存,用户往往需要在一台机器上同时打开多个应用程序,来完成每天必需的工作。事实上,我们考虑一下,假设每天8小时上网,你都做些什么?开了哪些应用程序?我自己按照使用频率应该是:Email客户端、Web浏览器、即时聊天工具(qq & MSN)、RSS新闻聚合软件、个人信息管理程序、Office办公软件、多媒体软件。太多了……
那么,考虑一下这样一个产品吧:它可以是Client/Server方式在企业内部自建(类似腾讯RTX),并且同时能够通过插件的形式登陆qq、msn、icq等多种不同的即时聊天工具;如果你有一个Blog,它有插件标签能够让你登陆并且发表Blog、也能够让你收取各个网站的新闻聚合;当你有新邮件抵达邮箱时,它能够提示邮件到达,并且有邮件的内容提要;如果你愿意,你可以挂接插件来收听mp3、在线广播甚至视频文件;通过它你可以直接对日程进行管理的安排,并且能够有效地进行个人文件搜集整理工作。

唔,或许你会说,这样的功能很简单啊,你是不是提倡的就是all in one呢?我很快可以做一个出来,但它会有市场吗?

当然不仅如此,刚才那么说,仅仅是单纯的1+1+1……,怎样才能让合力大于单纯的加法呢?其实并不困难,比如,我们的IM产品,与orkut之类的社交网络站点有编程接口,你在社交网络里认识的朋友可以直接在IM上显示和对话,甚至于语音通话;你的IM加了一位新朋友,如果他注册了Blog,那么,新闻聚合就会自动加进该朋友的Blog,甚至于你和他就某篇blog的对话,可以“一键通”地发表到他的Blog comment上;你的邮件也可以跟Blog相联系,发表某个特殊主题的邮件,便会自动Post到Blog上;你在p2p地下载某人的文档时,能够选择是否加入他的IM和blog……

这样似乎就有趣多了,不是么?

再看看,我们利用p2p和类似softether的技术,能够使对电脑配置一无所知的人们直接穿越现在越来越复杂的防火墙等数据包的过滤系统,简单是否也是一种美?

4.2 可以考虑的突破点
这里不想展开说明了,仅是对临时想到的一些可能的突破点“汇聚”,供参考。

N合一,借助msn、qq、icq等众多品牌IM的力量,将新品牌打响;
与Msnshell相仿,将标签自定义扩展,使之能够读取新闻、浏览网站、收听音乐甚至观看视频(整合媒体中心);
与社交网络结合,通过社交网络进一步扩展朋友的发展渠道;
采用p2p技术,使企业和个人用户的利益得到较好的平衡;
采用类似VNN、Softether的技术突破各种网络限制;
IM、SS、Blog、P2P等等做一个深度耦合,不仅简单的1+1;
建立一个创业平台,利用社交网络和p2p的特点,使软件的使用者能够赚得利润(通过充当服务器、通过上载有价值的数据信息、或者类似前面冷峻散势提到的商业信息交换等等);
背后与bloger之类的网站接口,并且与mt、b2之类的blog应用程序有接口,还能够类似w.bloggar那样能够发布blog;
类似MSN机器人那样提供信息服务(靠信息来提供增值,例如:提供城市中公交路线查询、餐馆查询等。)
……
只要愿意开动脑筋,还会有很多有特点的思路等着你开发。

4.3 推广模式
谈到推广,这一类型的产品,重在给人新鲜感。我们可以看几个实际的推广案例:

google模式,例如orkut和gmail,两者都采用了“邀请模式”,配合上google的造势,比如gmail强势推出1G的超大邮箱并且在邮件搜索、存储上有新突破等有新意的点,一时间使人们以拥有orkut或gmail为荣,ebay上甚至大量出现orkut和gmail邀请函拍卖。这种模式的好处是,前期测试阶段,仅是少量“高端用户”参与测试,使用频率高,并且会提出反馈建议,同时形势上已经将这一产品炒热。后期采用滚雪球方式,人带人,迅速地拉动用户群。
Microsoft模式,例如MSN,直接在操作系统中绑定,谁人能抗拒得了?(眼见MS又在XP的SP2中绑进个人防火墙,近期介入防病毒市场……从IE vs Netscape以来的垄断气势有增无减……),当然,这种模式并不是人人能学的,但,至少3721(鄙视之)学得不错,从ie的搜索到XP的sp2,3721愣是都捆了进来。
如果希望从无到有地快速发展,我的思路是:

借势
比如,与旅游产业结合,e龙、携程……;比如“暴力合作”,整合qq、msn等多种im;比如通过类似w.bloggar写blog功能,整合blogcn、cnblog、blogdriver、blogbus等。借这些产业、产品、社区的人气,迅速提高产品知名度。

造势
传销式合作,利用社交网络的便利性,结合类似donews那样的新闻功能,采用gmail式的推广方式,将声势扭转成“传统IM与BLOG走向没落,新的产业正在形成”,生造几个词,迅速占领制高点。 :)

5. 延伸
这里我想写的就更简单了,只写下几个可能的标题,内容,留待读者自已开发 :)

个人信息管理与blog及其它
IM与杀毒
网游、MUD与IM
专用电脑
……
我的建议是,拿出一张很大的白纸,在纸上标记出各种产品和技术,然后标记出各种不同的行业领域,开始进行脑力激荡……相信这些激动人心的技术能够带给你足够丰富的想象空间 :)