Category Archives: 收藏夹

那些虽短却让人的心疼出水来的QQ签名

是唯一有伞,仍然淋湿的人吗?
向来缘浅,奈何情深?
彼年豆蔻,谁许谁地老天荒。
如花美眷,似水流年。
有些事,一转身就是一辈子。
年轻时我们放弃,以为那只是一段感情,后来才知道,那其实是一生。
我还在原地等你,你却已经忘记曾来过这里。
哀莫大于心不死。
我很好,不吵不闹不炫耀,不要委屈不要嘲笑,也不需要别人知道。
我是你转身就忘的路人甲,凭什么陪你蹉跎年华到天涯?

想你的时候有些幸福,幸福得有些难过。
你走天桥,我走地下道。
经不住似水流年,逃不过此间少年。
原来地久天长,只是误会一场。
热闹都是他们的,与我无关。
蝴蝶飞不过沧海。
和爱的人吵架,和陌生人讲心里话。
我爱你,与你无关。
听悲伤的歌,看幸福的戏。
人生若只如初见。

你不过是仗着我喜欢你。
傻瓜,我们都一样。
原来心疼,是这样的。
催眠自己,告诉自己,有幸福。
你坐过的沙发宽了,你爱的音乐停了,那天的我等你等成了摆设……
这个冬天没有给我惊喜……
我是你的风筝,线在你手上,可陪伴我的只有风……
只想听到你说,祝我幸福。
回望灯如旧,浅握双手。
爱是我竖起防备,你却还是拥抱我。

下辈子不再为人,下辈子不再遇见。
朋友们都羡慕我,其实羡慕他们的人是我。
爱你,很久了,等你,也很久了,现在,我要离开你了,比很久很久还要久……
忘记开心的,就不会不开心了。
拖过一次你的手我已满足。
年少轻狂,幸福时光。
我不在乎你对我的不在乎。
在下一个路口,思念某一种温度。
我相信这个世界永远那么美。
我用我所有的果果,换你的一颜欢笑。

习惯难受,习惯思念,习惯等你,可是却一直没有习惯看不到你……
无处安放,我们遥远的青春。
我失恋了,你怎么可以把我弄丢了。
眼睛在为你下雨,心却在为你打伞。
寂寞太会见缝插针。
得到了别人的秘密,会失去自己的快乐。
不疯魔,不成活。
就如旧爱,有天总忘记,当初竟以为爱到死。
牵手,生命线就交错。
回得了过去,回不了当初。

生活在童话里,离天堂更近……
从长远来说,我们都死了。
我竟然还在爱他!
嘘……听,心碎的声音……
我在过马路,你人在哪里?
那些被允许任性的年代,叫做青春……
我有钱了,你回来吧!
忘却,是最无奈的爱。
我很想爱他。
你的幸福路人皆知,我的狼狈无处遁形。

如果我转过身,就不会有人看见我的眼泪了吧?
我们经过那么多考验,最后还是回到了原点……
让你在没有我的地方疯狂,让我在没有你的世界坚强。
每一天,允许自己放纵一次,哭一次,只一次……其余的时间,就开开心心地笑着过。
对自己狠心,才会让你幸福。
我是好人,别伤害我。
我是由影子保护的。
逃不过,最后都会变苍老……
那些最终会让你陷进去的,一开始总是美好。
爱和死,哪个更冷?

你转身,我下楼。
我只想问你,若我回头,你还在不在?
当你做对的时候,没有人会记得;当你做错的时候,连呼吸都是错。
爱那么短,遗忘那么长……
等待,是一生最初的苍老。
那都是很好很好的,我却偏偏不喜欢。
一个人只要不再想要,就什么都可以放下。
谁的寂寞,覆我华裳。谁的华裳,覆我肩膀。
祈求天地放过一双恋人,怕发生的永远别发生。
爱的最高境界是经得起平淡的流年。

童话已经结束,遗忘就是幸福。
最初不相识,最终不相认。
生不对,死不起。
幸福,就是找一个温暖的人过一辈子。
没有什么过不去,只是再也回不去。
要有多坚强,才敢念念不忘。
看着别人的故事,流着自己的眼泪。
我喜欢现在的自己,我怀念过去的我们。
离开后,别说祝我幸福,你有什么资格祝我幸福?
不被理解的弱小只好一直坚强。

不要依赖别人,是你还有人可以依赖的时候才说得出来的。
也许走得太远的代价就是寂寞。
不要骗我,你知道即使你的谎话我都会相信。
要离开,就请,永远别再回来。
我在怀念,你不再怀念的。
我怀旧,因为我看不到你和未来。
请不要假装对我好,我很傻,会当真的。
感情的戏,我没演技。
一个人,一座城,一生心疼

失恋诗


何故
昨日暮
偶遇见她
把纤纤玉手
交那衰人牵住
盈盈笑语左右顾
神采飞扬凌波微步
美眸中一片深情倾注
似前年与我同在湖畔路
也这般附耳交顾低语倾诉
如今见我头也不点形同陌路
我发现自己旧情难忘六神无主
两眼痴呆双脚生根心内如被汤煮
像我这么优秀的男子她总嫌我老土
那土鳖相貌恶心行止猥琐她爱他粗鲁
女孩子搞不清她想什么我越琢磨越胡涂
明知道她与自己不合适想忘记她另起灶炉
到头来都只能是剪不断理还乱最终于事无补
兄弟我长这么大从来没怕过谁却栽给了这个主
看来是上辈子欠她很多钱早知如此就不该和她堵
碰上她算我倒霉下次说什么也得找个温柔姑娘相处
总算明白这世上漂亮不能当饭吃往往还让你难堪重负
从现在起踏踏实实勤勤恳恳谦虚谨慎待人有礼爱护公物
切记过马路左右看要走人行斑马线要想富少生孩子多种树
化悲痛为力量一边努力学习一边时刻准备着开发祖国大西部
大丈夫何患无妻没有了你虽然孤独但也使我从此不再一叶障目
这也使我好好反思为什么会失败总结经验教训继续探索革命道路
我会遇上好姑娘没命地追她想她爱她决不放过她不管她属虎还属兔


回贴也爆强:
这个有志青年是个好同志失恋了不失魂落魄自暴自弃颇有男儿气度
他虽然遭遇了现代女陈世美被无情抛弃但没有怪命也不埋怨政府
反而擦亮眼睛激发斗志将其丑恶行径卑鄙嘴脸进行了深刻揭露
再次论证了阶级斗争将会在一定范围内长期存在的精辟论述
展望了初级阶段革命尚未成功同志仍需努力这条基本道路
尤其难能可贵的是该同志认真反省自己并触动灵魂深处
认识到过去在湖畔漫步是小资产阶级情调的严重错误
险些为漂亮的外表所迷惑中了糖衣炮弹的惯用招数
理论联系实际痛定思痛如梦方醒才知道差点迷途
漂亮不能当饭吃漂亮不是本质不是革命的全部
语言虽然通俗但体现了有志青年的朴实感悟
批评与自我批评言辞感人真可谓发自肺腑
并萌发修身齐家治国平天下的远大抱负
体现了由此及彼由表及里的思想反复
像他这么优秀的青年怎么能说他土
自然是徒具外表的女人有眼无珠
天涯何处无芳草佳丽不问出处
好马不吃回头草旧情勿枉顾
兔子不吃窝边草以为三窟
百步之内必有芳草无数
也许有天她变成弃妇
才会想起你的好处
再回来找你倾诉
一切已经太晚
你也有今天
一屑不顾
不理她
扮帅

连广告也信,读书读傻了吧?

1.我以后生个儿子名字要叫“好帅”,那别人看到我就会说’好帅的爸爸“。
2.工作,退一步海阔天空,爱情,退一步人去楼空。
3.工作的最高境界就是看着别人上班,领着别人的工资。
4.钱不是问题,问题是没钱!
5.喝醉了我谁也不服,我就扶墙!
6.我就像一只趴在玻璃上的苍蝇,前途一片光明,但又找不到出路.
7.大师兄,你知道吗?二师兄的肉现在比师傅的都贵了
8.如果多吃鱼可以补脑让人变聪明的话,那么你至少得吃一对儿鲸鱼……
9.水至清则无鱼,人至贱则无敌。
10.青春就像卫生纸,看着挺多得,用着用着就不够了
11.我身边的朋友们啊,你们快点出名吧,这样我的回忆录就可以畅销了
12.一女同学黑了些,她男友又太白了些,有天宿舍里得毒舌天后突然对她冒出一句:“你们这样不行,你们会生出斑马来的”
13.老娘一向视帅哥与金钱如粪土,而他们也一直是这样看我的
14.不要和我比懒,我懒得和你比
15.我不是个随便的人 我随便起来不是人
16.上帝说,要有光,我说我反对,从此世界上有了黑暗
17.今天心情不好.我只有四句话想说.包括这句和前面的两句.我的话说完了
18.做人就要做一个徘徊在牛A和牛C之间的人
19.我的大名叫上帝,小名叫耶稣,英文名God, 法号是如来…
20.树不要皮,必死无疑;人不要脸,天下无敌。
21.农夫三拳有点疼
22.其实我一直很受人欢迎的:小时候的我人见人爱,如今的我人贱人爱
23.不怕虎一样的敌人,就怕猪一样的队友
24.走自己的路,让别人打车去吧(走别人的路,让别人走投无路)
25.老鼠扛刀,满街找猫
26.只要功夫深,拉屎也认真
27.中国人谁跑的最快?是曹操(非刘翔)。因为说曹操曹操到
28.思想有多远,你就给我滚多远
29.只有在火车站大排长龙时,才能真正意识到自己是“龙的传人”。
30.有情人终成家属
31.春天来了,一群大雁正向北飞,一会儿排成B字型,一会儿排成T字型..
32.在哪里跌倒 就在哪里躺下
33.老虎不发威 你当我是HELLO KITTY!
34.驴是的念来过倒~
35.吃自助最高境界:扶墙进,扶墙出。
36.丢失…
37.没有钱,没有权,再不对你好点,你能跟我?
38.拿份报纸上厕所,俺是读书人。
39.上Google上百度一下。
40.女人一定要对自己好一点。一旦累死了,就会有别的女人花你的钱,住你的房,睡你的老公,打你的娃!
41.你的丑和你的脸没有关系…
42.爷爷都是从孙子走过来的……
43.老天,你让夏天和冬天同居了吗?!生出这种鬼天气!
44.鸟大了什么林子都有!
45.不怕虎一样的敌人,就怕猪一样的队友。
46.夏天就是不好,穷的时候我连西北风都没得喝……
47.随你大小便!
48.怀才就像怀孕,时间久了才能让人看出来。
49.没什么事就不要找我,有事了更不要找我。
50.你以为我会眼睁睁地看着你去送死?我会闭上眼睛的。
51.天使之所以会飞,是因为她们把自己看得很轻……
52.我想早恋,可是已经晚了……
53.请你以后不要在我面前说英文了,OK?
54.思想有多远,你就给我滚多远!
55.好久没有人把牛皮吹的这么清新脱俗了!
56.老板,钱对你来说真的就那么重要吗?讲了三个多小时了一分钱都不降?
57.一觉醒来,天都黑了。
58.我要是做了人事部经理,第一件事就是提拔自己做老总。
59.我每天除了吃饭的时间全在减肥,你还说我没有毅力?
60.水能载舟,亦能煮粥。
61.买了电脑不上宽带,就好比酒肉都准备好了却在吃饭前当了和尚。
62.有一个很古老的传说–能在XX校园里看到美女的人会长生不老
63.生,容易;活,容易;生活,不容易。
64.打死你我也不会说。
65.钱可以解决的问题都不是问题。
66.念了十几年书,想起来还是幼儿园比较好混!
67.连广告也信,读书读傻了吧?
68.不吃饱哪有力气减肥啊?
69.睡眠是一门艺术–谁也不能阻挡我追求艺术的脚步。
70.早起的鸟儿有虫吃,早起的虫虫被鸟吃。
71.天哪,我的衣服又瘦了!
72.我在女友手机里的名字是“他”,分手后,我就变成了“它”。
73.我和你不一样,因为我是人。
74.问君能有几多愁,恰似一群太监上青楼。
75.我喝水只喝纯净水,牛奶只喝纯牛奶,所以我很单纯
76 上天赐予我们青春的同时也赐予了我们青春痘。
77 出问题先从自己身上找原因,别一便秘就怪地球没引力。
78 虽然我长的不是很帅,但小时候也有人夸我左边鼻孔很偶像派。
79 老妈的规劝:闺女,要适当吃一点才有劲减肥啊!
80 春天是感冒和感情高发的季节,有人不小心感冒了,有人不小心恋爱了,我属于前者。
81 我当年也是个痴情的种子,结果下了场雨~~~~~~~~~~~~~~~淹死啦。
82 钞票不是万能的,有时还需要信用卡.
83 我允许你走进我的世界,但决不允许你在我的世界里走来走去。
84 我希望有一天能用鼠标双击我的钱包,然后选中一张百元大钞,按下“CTRL+C”.接着不停地“CTRL+V”.
85 我是一棵孤独的树,千百年来矗立在路旁,寂寞的等待,只为有一天你从我身边走过时为你倾倒,砸不扁你就算我白活了。
86 爱我的请举手,不爱我的请倒立。
87 人怕出名猪怕壮,男怕没钱女怕胖。
88 如果有钱也是一种错,我情愿一错再错。
89 如果婚姻是爱情的坟墓,那么我期待有一个人把我埋了。
90 千万别在一棵树上吊死,可以到周围的树上都试几次。
91 不要把银行卡密码设成女朋友的生日,不然总要换多麻烦。
92 最幸福的事:睡觉睡到自然醒。数钱数到手抽筋。最悲哀的事:睡觉睡到手抽筋,数钱数到自然醒。
93 钱可以买房子但买不到家,可以买婚姻但买不到爱情,可以买钟表但买不到时间,钱不是一切,反而是痛苦的根源。把你的钱给我,让我一个人承担痛苦把!
94 男孩穷着养,不然不晓得奋斗,女孩富着养,不然人家一块蛋糕就哄走了。
95 士为知己者装死,女为悦己者整容.
96 命运负责洗牌,但是玩牌的是我们自己!
97 年轻的时候,我们常常冲着镜子做鬼脸,年老的时候,镜子算是扯平了。
98 爱人是种无奈,被爱是种姿态,等爱是种期待,无爱是种能耐。
99 女人之美,在于蠢的无怨无悔,男人之美,在于说谎说的白日见鬼。

经典的辞职报告

辞职报告

尊敬的___________领导:
天要下雨,娘要嫁人,生死有命,富贵在天。本来我想在培养我的 ______________公司里工作终老,但是生活是残酷的,巨大的生活压力迫使我抬起头来,去遥望那碧蓝的天空。这时,我多么羡慕那自由飞翔的小鸟,还有那些坐得起飞机的人啊。每个月的开头,我会满心欢喜的拿着微薄的工资去还上个月的欠债,每个月的月中,我为了省钱会努力勒紧裤带,重复性的,每个月末,生活的本色就变成了借钱和躲债。
人比人得死。这是句俗话,但确实是亘古不变的真理。看着身边一个个兄弟都出口了,这心里跟火烧似的。看着朋友每月拿着15%的房贴,车贴,5、6百的高温费,几千几万的奖金,这心里就琢磨着,这人与人的差距咋就这么大尼?
人生数年,弹指一挥间。是的,公司有培训计划,有培养机制,公司会尽量把每一位员工培养成为有理想,有道德,有文化,有纪律的四有新人,工资会涨的,面包会有的,可俺就看不明白,咋你们培养我就要3年5年滴,人家咋不用培养就收了俺尼,俺还有多少年来给你培养?到时候,黄花菜都凉喽。人家咋就看得起俺,给俺钱呐?龙入浅水遭虾戏,虎落平原被犬欺啊。
佛曰:一枯一荣,皆有定数。圣经上说:欠着我的,我会记下。梁朝伟说:出来混,总归是要还的。主席说:哪里有压迫,哪里就有反抗。小平同志说:贫穷不是社会主义。电视上也说:要爽靠自己。
因此本人因为个人原因,决定离开已经服务多年的_____________公司。请求领导批准。
申请人:
日期:

谈2.0网站初期规划应该考虑的问题

  来源:在网络上想寻找到本文的原始链接并没有找到,目前找到最早转此文的文章发布时间是07年10月19日。因此我在这里没办法提供作者及原始链接出处了。
  ===========转文开始===============
   我做过多个2.0公司的技术顾问,简单的谈谈2.0公司遇到的问题(涉及隐私,我用A B C D代替),这里就不再赘述大家众所周知的页面静态化,缓存和代码安全等问题了,有点技术的2.0公司的CTO都知道这些东西,我们谈点发展之后的问题
  
  A公司
  
   A公司做的是SNS网站,程序是两个毛头小伙子做的,目标直指51,程序开发是一帆风顺,功能也比51牛多了,推广也是一帆风顺(A公司有自己独到的推广方式。但是当ALEXA到2W的时候问题出来了,每天下午4点左右,网站速度慢的惊人,基本上打不开,公司三台服务器CPU100%,让人郁闷的是公司的网络配置方式,居然是双WEB的集群,而单独一台DB数据库。整个瓶颈在数据库,于是我建议做DB的集群,分析了一下数据结构,MD,典型的WEB程序员的作品,没有一点数据库设计规范,功能实现是可以,如果要扩展,不可能,集群基本上是不可能的,怎么办?不能办,于是,一个月的时间修改程序,数据结构基本上换了一遍 前期砸进去的几十万打了水飘,用户走光了。
  
   结论:WEB2.0前期设计的时候不应该只考虑功能,应该认真考虑一下底层和数据结构了。
  
  B公司
  
   B公司也是做的SNS网站,程序是3个人开发的,CEO是某名牌大学的经济学硕士,有点知己网的味道,又有一些特色出来,说实话,公司的潜力不错,CEO有很强的运作能力,感觉前景不错。系统架构还行,但是—但是系统崩溃了,why?系统没有考虑到用户有个海量的说法,文件也有个海量的说法,用户的相册,图片全部存贮在WEB服务器的一个分区上,每个用户一个目录,而打开性能监视器,磁盘的IO高的惊人,基本上无暇响应。众所周知,文件系统也是一个数据库,单独大文件无所谓,关键是整个是300多个G的零碎文件,大量的读写操作,系统崩溃,数据丢失,文件系统的一个链断了,用户数据全部丢失!!!这是一个非常沉重的问题,系统整整停了一个月来做数据恢复(单独文件很容易,但是海量文件目前还没有一个软件能组织起来软件架构)。解决方案:修改程序架构,做分布式文件存贮(程序修改用了8天,但是文件转移却又用去了将近一个月),20万用户损失殆尽
  
   结论:WEB2.0前期的设计应该有应付海量存贮的考虑,整个涉及了程序架构的修改,前期规划不好的话基本上思路一条。
  
  C公司
  
   C公司是一个值得尊敬的公司,CEO技术出身,和比尔盖茨一样,大学未毕业出来做网络,01到03年做短信狠赚了一笔,后来做的小项目也小有所成,说实话,我很佩服。公司做的是校友方面,但是更偏重myspace风格,注重个人主页,推广方面也下了大手笔。系统崩溃的原因其实很简单,由于采用的是微软的SqlServer,而微软直接就告诉了我们,SQLSERVER不支持集群,他们的数据库超负载,100%就没有下去过,只能横向增加配置,采用了4路4核CPU系统,但是系统还是崩溃了… 高互动注定了高负载。解决方案: 现从基本入手,解决掉几个程序耗能大户,对数据库采用横向切割,将用户每10万进行分组,同时对数据库系统进行散列,将多个表垂直分割,同时进行文件分组 ,解决问题. 因为修改了数据结构,程序也基本上大动了一下。 好在系统没有出大错,损失不算很大,不过对用户体验造成了很坏的影响。
  
   结论:WEB2.0前期设计应该有良好的散列考虑,程序应该能有配合的扩充性,符合数据库的扩充
  
  D公司
  
   D公司是一个各个方面做的比较好的公司,做了CDN加速,图片也独立分出了N个服务器,数据库不错的一个,(CTO是个数据库专家),系统崩溃的原因在于WEB,按道理说WEB很容易做集群的,但是发现集群并解决不掉问题,他们的集群只允许做4台的WEB集群,但是4台都当掉了。仔细分析,找到原因,我估计整个也是大部分CTO最容易犯的一个错误,或者说他们根本就想不到的问题,就是WEB上传的问题,上传的时候由于时间的原因,线程是保持链接的,300个线程就可以把一个WEB Server当掉了。解决方案:这个最简单,把上传和其他耗能大户分离出独立出来。程序改动不是很大,但是之前半个月速度满对用户体验的损失也不可小视。
  
   结论:没有什么结论了,毕竟有海量访问经验的CTO不多,也就是那几个大站的。
  
   总结:不是泼冷水,模仿其实是很容易的,随便找几个WEB程序员就能做到,并且很简单,速度可能还很高效,因为WEB2.0无非就是跟数据库打交道,会操作数据库就会做。但是真正做大并不容易,因为能应付海量访问的程序并不简单,现在的程序员都太自命不凡,其实真正有经验的并不多,不要相信一个月薪5K–10K的程序员能给你多大的惊喜,能应付海量访问的程序员不是那个价格。如果您想做2.0,想做大,有几个个建议:
  
   一.找DBMS的专家设计好数据库,大部分程序员都不知道分区视图,数据散列,数据组的概念
  
   二.设计好程序架构(这个其实不难,有个高人指导就行了),保持良好的扩展性,成本考虑可以找兼职的系统架构设计师做好系统架构,确定将来的发展瓶颈。
  
   三.考虑好文件存贮的问题。文件存贮的技术含量看起来很低,其实是很高的,可以考虑反向代理的方案。文件存贮出问题了,站点基本上就完蛋了,不仅仅是RAID的问题和存贮服务器的问题,不过道理倒是一点就破的
  
   四.中国国情考虑,这个最致命,需要考虑电信和网通的问题,CDN并不能解决所有问题。互动性的东西并CDN并不是很有效。最关键的是,现有的双线机房遇到DDOS攻击基本上都会当掉,原因很简单,双线机房都是私人机房,本身就不会有太高的带宽,随便攻击一下就可以D掉(顺带提一个笑话,我知道一个双线机房的老总总共1G的带宽却买了4G的金盾墙,很简单800M的攻击就可以搞定)。
  
   五.网络延迟的问题,这是分布式系统必须要考虑的,程序要能容忍0到100秒的数据延迟的功能,也就是同步的问题。不要小看这几十秒,问题很大的,如果你的站点有交互式功能,比如即时聊天,你可以想象一下是个什么结果。对于即时聊天的东西,可以用反向代理来解决(成本较高)。但是对于留言和评论的影响不大,但是如果系统为了健壮做了缓存和静态化的时候,这个东西可能就是灾难性的了。
  
   六.分散你的程序,如果你没有太多的资金构筑动辄百万的服务器,建议把功能分散开来,比如相册一台服务器,留言一台服务器
  
   七.看好你的程序员,如果没有很好的激励措施的话你的程序员很容易写出敷衍性的代码,而这个可能就是将来的大患,程序架构定下来后要修改可能就要费牛劲了。最好你的CTO能对你100%的衷心,100%的负责。
  
   八.文件同步的问题,这个问题可能你觉得没有必要,如果你看一下网通和电信的TTL就明白了,同步要支持续传,并且不能是持续的,否则你的成本会高出N倍,不要期望能通过你的软件实现,交给你的程序员吧,把上面的话告诉他他就知道怎么做了。
  
   九.最狠的一个问题了,也是吃亏最大的问题,不管您跟网警的关系多好,看好你的用户,审核好你的东西,一被停机可能就致命,本人就吃过N次亏。
  
   十.最后,祝各位站长一番风顺,大展宏图。

http://www.douban.com/group/topic/2158343/

Linux/Unix网络编程指南(Socket 编程)

介绍
Hey! Socket 编程让你沮丧吗?从 man pages 中很难得到有用的信息吗?你想 跟上时代去做一做 Internet 程序,但是为你在调用 connect() 前的 bind() 的结构而愁眉不展?…
好了,我现在已经来了,我将和所有人共享我的知识了。如果你了解 C 语言并想穿过 网络编程的沼泽,那么你来对地方了。
读者
这个文档是写成一个指南,而不是参考书。如果你刚开始 socket 编程并想找一本 入门书,那么你是我的读者。这可不是一本完全的 socket 编程书。
平台和编译器
这篇文章中的大多数代码都在一台 Linux PC 上用 GNU 的 gcc 成功编译过。 而且他们在一台 HPUX 上用 gcc 也成功编译过。但是注意,并不是每个代码 片段都独立测试过。
——————————————————————————–
目录
什么是套接口?
Internet 套接口的两种类型
网络理论
struct–要么了解他们,要么等异形入侵地球
Convert the Natives!
IP 地址和如何处理他们
socket()–得到文件描述符!
bind()–我们在哪个端口?
connect()–Hello!
listen()–有人给我打电话吗?
accept()–"Thank you for calling port 3490."
send() 和 recv()–Talk to me, baby!
sendto() 和 recvfrom()–Talk to me, DGRAM-style
close() 和 shutdown()–滚开!
getpeername()–你是谁?
gethostname()–我是谁?
DNS–你说“白宫”,我说 "198.137.240.100"
客户-服务器背景知识
简单的服务器
简单的客户端
数据报 Socket
阻塞
select()–多路同步 I/O,酷!

参考资料
Disclaimer and Call for Help
——————————————————————————–
什么是 socket?
你始终听到人们谈论着 "socket",而你不知道他的确切含义。那么,现在我告诉你: 他是使用 Unix 文件描述符 (fiel descriptor) 和其他程序通讯的方式。
什么?
Ok–你也许听到一些 Unix 高手 (hacker) 这样说:“呀,Unix 中所有的东西就是文件!”那个家伙也许正在说到一个事实:Unix 程序在执行任何形式的 I/O 的时候,程序是在读或者写一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数。但是(注意后面的话),这个文件可能是一个网络连接,FIFO,管道,终端,磁盘上的文件 或者什么其他的东西。Unix 中所有的东西是文件!因此,你想和 Internet 上别 的程序通讯的时候,你将要通过文件描述符。最好相信刚才的话。
现在你脑海中或许冒出这样的念头:“那么我从哪里得到网络通讯的文件描述符呢,聪明 人?”无论如何,我要回答这个问题:你利用系统调用 socket()。他返回套接口描 述符 (socket descriptor),然后你再通过他来调用 send() 和 recv()。
“但是…”,你可能现在叫起来,“如果他是个文件描述符,那么为什么不用一般的调用 read() 和 write() 来通过套接口通讯?”简单的答案是:“你可以使用 一般的函数!”。详细的答案是:“你可以,但是使用 send() 和 recv() 让你更好的控制数据传输。”
有这样一个事实:在我们的世界上,有很多种套接口。有 DARPA Internet 地址 (Internet 套接口),本地节点的路径名 (Unix 套接口),CCITT X.25 地址 (你可以完全忽略 X.25 套接口)。 也许在你的 Unix 机器上还有其他的。我们在这里只讲第一种:Internet 套接口。
——————————————————————————–
Internet 套接口的两种类型
什么意思?有两种 Internet 套接口?是的。不,我在撒谎。其实还有很多,但是我可不想 吓着你。我们这里只讲两种。 Except for this sentence, where I’m going to tell you that "Raw Sockets" are also very powerful and you should look them up.
好了,好了。那两种类型是什么呢?一种是 "Stream Sockets",另外一种是 "Datagram Sockets"。我们以后谈到他们的时候也会用到 "SOCK_STREAM" 和 "SOCK_DGRAM"。数据报套接口有时也叫“无连接套接口”(如果你确实要连接的时候用 connect()。)
流式套接口是可靠的双向通讯的数据流。如果你向套接口安顺序输出“1,2”,那么他们 将安顺序“1,2”到达另一边。他们也是无错误的传递的,有自己的错误控制。
有谁在使用流式套接口?你可能听说过 telnet,不是吗?他就使用流式套接口。你需要你所输入的字符按顺序到达,不是 吗?同样,WWW 浏览器使用的 HTTP 协议也使用他们。实际上,当你通过端口80 telnet 到一个 WWW 站点,然后输入 “GET pagename” 的时候,你也可以得到 HTML 的内容。
为什么流式套接口可以达到高质量的数据传输?他使用了“传输控制协议 (The Transmission Control Protocol)”,也叫 “TCP” (请参考 RFC-793 获得详细资料。)TCP 控制你的数据 按顺序到达并且没有错误。你也许听到 “TCP” 是因为听到过 “TCP/IP”。这里的 IP 是指 “Internet 协议”(请参考 RFC-791.) IP 只是处理 Internet 路由而已。
那么数据报套接口呢?为什么他叫无连接呢?为什么他是不可靠的呢?恩,有这样的事实:如果你发送一个数据报,他可能到达,他可能次序颠倒了。如果他到达,那么在这个包的内部是无错误的。
数据报也使用 IP 作路由,但是他不选择 TCP。他使用“用户数据报协议 (User Datagram Protocol)”,也叫 “UDP” (请参考 RFC-768.)
为什么他们是无连接的呢?主要原因是因为他并不象流式套接口那样维持一个连接。 你只要建立一个包,在目标信息中构造一个 IP 头,然后发出去。不需要连接。应用程序有: tftp, bootp 等等。
“够了!”你也许会想,“如果数据丢失了这些程序如何正常工作?”我的朋友,每个程序在 UDP 上有自己的协议。例如,tftp 协议每发出一个包,收到者发回一个包来说“我收到了!” (一个“命令正确应答”也叫“ACK” 包)。如果在一定时间内(例如5秒),发送方没有收到应答, 他将重新发送,直到得到 ACK。这一点在实现 SOCK_DGRAM 应用程序的时候非常重要。
——————————————————————————–
网络理论
既然我刚才提到了协议层,那么现在是讨论网络究竟如何工作和演示 SOCK_DGRAM 的工作。当然,你也可以跳过这一段,如果你认为 已经熟悉的话。
朋友们,现在是学习 数据封装 (Data Encapsulation) 的时候了! 这非常非常重要。It’s so important that you might just learn about it if you take the networks course here at Chico State ;-). 主要的内容是:一个包,先是被第一个协议(在这里是 TFTP )包装(“封装”), 然后,整个数据(包括 TFTP 头)被另外一个协议(在这里是 UDP )封装,然后下 一个( IP ),一直重复下去,直到硬件(物理)层( Ethernet )。
当另外一台机器接收到包,硬件先剥去 Ethernet 头,内核剥去 IP 和 UDP 头,TFTP 程序再剥去 TFTP 头,最后得到数据。
现在我们终于讲到臭名远播的 网络分层模型 (Layered Network Model)。这种网络模型在描述网络系统上相对其他模型有很多优点。例如,你可以写一个套接口 程序而不用关心数据的物理传输(串行口,以太网,连接单元接口 (AUI) 还是其他介质。 因为底层的程序为你处理他们。实际的网络硬件和拓扑对于程序员来说是透明的。
不说其他废话了,我现在列出整个层次模型。如果你要参加网络考试,可一定要记住:
应用层 (Application)
表示层 (Presentation)
会话层 (Session)
传输层 (Transport)
网络层 (Network)
数据链路层 (Data Link)
物理层 (Physical)
物理层是硬件(串口,以太网等等)。应用层是和硬件层相隔最远的–他是用户和网络 交互的地方。
这个模型如此通用,如果你想,你可以把他作为修车指南。把他应用到 Unix,结果是:
应用层 (Application Layer) (telnet, ftp, 等等)
传输层 (Host-to-Host Transport Layer) (TCP, UDP)
Internet 层 (Internet Layer) (IP 和路由)
网络访问层 (Network Access Layer) (网络层,数据链路层和物理层)
现在,你可能看到这些层次如何协调来封装原始的数据了。
看看建立一个简单的数据包有多少工作?哎呀,你将不得不使用 "cat" 来完成 他们!简直是笑话。对于流式套接口你要作的是 send() 发送数据。对于数据报 式套接口你按照你选择的方式封装数据然后用 sendto()。内核将为你建立传输 层和 Internet 层,硬件完成网络访问层。这就是现代科技。
现在结束我们的网络理论速成班。哦,忘记告诉你关于路由的事情了。但是我不准备谈他。 如果你真的想知道,那么参考 IP RFC。如果你从来不曾了解他,也没有 关系,你还活着不是吗。
——————————————————————————–
structs
终于到达这里了,终于谈到编程了。在这章,我将谈到被套接口用到的各种数据类型。因为 他们中的一些太重要了。
首先是简单的一个:socket descriptor。他是下面的类型:
  int
仅仅是一个常见的 int。
从现在起,事情变得不可思议了。请跟我一起忍受苦恼吧。注意这样的事实: 有两种字节排列顺序:重要的字节在前面(有时叫 "octet"),或者不重要的字节在前面。 前一种叫“网络字节顺序 (Network Byte Order)”。有些机器在内部是按照这个顺序储存数据,而另外一些则不然。当我说某数据必须按照 NBO 顺序,那么你要调用函数(例 如 htons() )来将他从本机字节顺序 (Host Byte Order) 转换过来。如果我 没有提到 NBO, 那么就让他是本机字节顺序吧。
我的第一个结构(TM)–struct sockaddr. 这个数据结构 为许多类型的套接口储存套接口地址信息:
struct sockaddr {
    unsigned short  sa_family;  /* address family, AF_xxx    */
    char       sa_data[14]; /* 14 bytes of protocol address */
};
sa_family 能够是各种各样的事情,但是在这篇文章中是 "AF_INET"。 sa_data 为套接口储存目标地址和端口信息。看上去很笨拙,不是吗。
为了对付 struct sockaddr,程序员创造了一个并列的结构: struct sockaddr_in ("in" 代表 "Internet".)
struct sockaddr_in {
    short int     sin_family; /* Address family        */
    unsigned short int sin_port;  /* Port number         */
    struct in_addr   sin_addr;  /* Internet address       */
    unsigned char   sin_zero[8]; /* Same size as struct sockaddr */

};
这个数据结构让可以轻松处理套接口地址的基本元素。注意 sin_zero (他 被加入到这个结构,并且长度和 struct sockaddr 一样) 应该使用函数 bzero() 或 memset() 来全部置零。 Also, and this is the important bit, a pointer to a struct sockaddr_in can be cast to a pointer to a struct sockaddr and vice-versa. 这样的话 即使 socket() 想要的是 struct sockaddr *, 你仍然可以使用 struct sockaddr_in,and cast it at the last minute! 同时,注意 sin_family 和 struct sockaddr 中的 sa_family 一致并能够设置为 "AF_INET"。最后, sin_port 和 sin_addr 必须是网络字节顺序 (Network Byte Order)!
你也许会反对道:"但是,怎么让整个数据结构 struct in_addr sin_addr 按照网络字节顺序呢?" 要知道这个问题的答案,我们就要仔细的看一 看这个数据结构: struct in_addr, 有这样一个联合 (unions):
/* Internet address (a structure for historical reasons) */
  struct in_addr {
    unsigned long s_addr;
  };
他曾经是个最坏的联合,但是现在那些日子过去了。如果你声明 "ina" 是 数据结构 struct sockaddr_in 的实例,那么 "ina.sin_addr.s_addr" 就储存4字节的 IP 地址(网络字节顺序)。如果你不幸的 系统使用的还是恐怖的联合 struct in_addr ,你还是可以放心4字 节的 IP 地址是和上面我说的一样(这是因为 #define。)
——————————————————————————–
Convert the Natives!
我们现在到达下个章节。我们曾经讲了很多网络到本机字节顺序,现在是采取行动的时刻了!
你能够转换两种类型: short (两个字节)和 long (四个字节)。这个 函数对于变量类型 unsigned 也适用。假设你想将 short 从本机字节顺序 转换为网络字节顺序。用 "h" 表示 "本机 (host)",接着是 "to",然后用 "n" 表示 "网络 (network)",最后用 "s" 表示 "short": h-to-n-s, 或者 htons() ("Host to Network Short")。
太简单了…
如果不是太傻的话,你一定想到了组合 "n","h","s",和 "l"。但是这里没有 stolh() ("Short to Long Host") 函数,但是这里有:
htons()–"Host to Network Short"
htonl()–"Host to Network Long"
ntohs()–"Network to Host Short"
ntohl()–"Network to Host Long"
现在,你可能想你已经知道他们了。你也可能想:"如果我改变 char 的顺序会 怎么样呢? 我的 68000 机器已经使用了网络字节顺序,我没有必要去调用 htonl() 转换 IP 地址。" 你可能是对的,但是当你移植你的程序到别的机器上的时候,你的程序将 失败。可移植性!这里是 Unix 世界!记住:在你将数据放到网络上的时候,确信他们是网络字 节顺序。
最后一点:为什么在数据结构 struct sockaddr_in 中, sin_addr 和 sin_port 需要转换为网络字节顺序,而 sin_family 不需要呢? 答案是:sin_addr 和 sin_port 分别封装在包的 IP 和 UDP 层。因此,他们必须要是网络字节顺序。 但是 sin_family 域只是被内核 (kernel) 使用来决定在数据结构中包含什么类型的地址,所以他应该是本机字节顺序。也即 sin_family 没有 发 送到网络上,他们可以是本机字节顺序。
——————————————————————————–
IP 地址和如何处理他们
现在我们很幸运,因为我们有很多的函数来方便地操作 IP 地址。没有必要用手工计算 他们,也没有必要用 << 操作符来操作 long。
首先,假设你用 struct sockaddr_in ina,你想将 IP 地址 "132.241.5.10" 储存到其中。你要用的函数是 inet_addr(),转换 numbers-and-dots 格式的 IP 地址到 unsigned long。这个工作可以这样来做:
  ina.sin_addr.s_addr = inet_addr("132.241.5.10");
注意:inet_addr() 返回的地址已经是按照网络字节顺序的,你没有必要再去调用 htonl()。
上面的代码可不是很健壮 (robust),因为没有错误检查。inet_addr() 在发生错误 的时候返回-1。记得二进制数吗? 在 IP 地址为 255.255.255.255 的时候返回的是 (unsigned)-1!这是个广播地址!记住正确的使用错误检查。
好了,你现在可以转换字符串形式的 IP 地址为 long 了。那么你有一个数据结构 struct in_addr,该如何按照 numbers-and-dots 格式打印呢? 在这个 时候,也许你要用函数 inet_ntoa() ("ntoa" 意思是 "network to ascii"):
  printf("%s",inet_ntoa(ina.sin_addr));
他将打印 IP 地址。注意的是:函数 inet_ntoa() 的参数是 struct in_addr,而不是 long。同时要注意的是他返回的是一个指向字符的指针。 在 inet_ntoa 内部的指针静态地储存字符数组,因此每次你调用 inet_ntoa() 的时候他将覆盖以前的内容。例如:
  char *a1, *a2;
  .
  .
  a1 = inet_ntoa(ina1.sin_addr); /* this is 198.92.129.1 */
  a2 = inet_ntoa(ina2.sin_addr); /* this is 132.241.5.10 */
  printf("address 1: %s\n",a1);
  printf("address 2: %s\n",a2);
运行结果是:
  address 1: 132.241.5.10
  address 2: 132.241.5.10
如果你想保存地址,那么用 strcpy() 保存到自己的字符数组中。
这就是这章的内容了。以后,我们将学习转换 "whitehouse.gov" 形式的字符串到正确 的 IP 地址(请看后面的 DNS 一章。)
——————————————————————————–
socket()–得到文件描述符!
我猜我不会再扯远了–我必须讲 socket() 这个系统调用了。这里是详细的定义:
  #include <sys/types.h>
  #include <sys/socket.h>
  int socket(int domain, int type, int protocol);
但是他们的参数怎么用? 首先,domain 应该设置成 "AF_INET",就象上面的 数据结构 struct sockaddr_in 中一样。然后,参数 type 告诉内核是 SOCK_STREAM 类型还是 SOCK_DGRAM 类型。最后,把 protocol 设置为 "0"。(注意:有很多种 domain、type, 我不可能一一列出了,请看 socket() 的 man page。当然,还有一个"更好"的方式 去得到 protocol。请看 getprotobyname() 的 man page。)
socket() 只是返回你以后在系统调用种可能用到的 socket 描述符,或者在错误 的时候返回-1。全局变量 errno 中储存错误值。(请参考 perror() 的 man page。)
——————————————————————————–
bind()–我在哪个端口?
一旦你得到套接口,你可能要将套接口和机器上的一定的端口关联起来。(如果你想用 listen() 来侦听一定端口的数据,这是必要一步–MUD 经常告诉你说用命令 "telnet x.y.z 6969".)如果你只想用 connect(),那么这个步骤没有必要。但是无论如何,请继续读下去。
这里是系统调用 bind() 的大略:
  #include <sys/types.h>
  #include <sys/socket.h>
  int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
sockfd 是调用 socket 返回的文件描述符。my_addr 是指向 数据结构 struct sockaddr 的指针,他保存你的地址(即端口和 IP 地址) 信息。addrlen 设置为 sizeof(struct sockaddr)。
简单得很不是吗? 再看看例子:
  #include <string.h>
  #include <sys/types.h>
  #include <sys/socket.h>
  #define MYPORT 3490
  main()
  {
    int sockfd;
    struct sockaddr_in my_addr;
    sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */
    my_addr.sin_family = AF_INET;   /* host byte order */
    my_addr.sin_port = htons(MYPORT); /* short, network byte order */
    my_addr.sin_addr.s_addr = inet_addr("132.241.5.10");
    bzero(&(my_addr.sin_zero), 8);  /* zero the rest of the struct */
    /* don’t forget your error checking for bind(): */
    bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
   .
   .
   .
这里也有要注意的几件事情。my_addr.sin_port 是网络字节顺序,my_addr.sin_addr.s_addr 也是的。另外要注意到的事情是因系统的不同, 包含的头文件也不尽相同,请查阅自己的 man page。
在 bind() 主题中最后要说的话是,在处理自己的 IP 地址和/或端口的时候,有些工作 是可以自动处理的。
    my_addr.sin_port = 0; /* choose an unused port at random */
    my_addr.sin_addr.s_addr = INADDR_ANY; /* use my IP address */
通过将0赋给 my_addr.sin_port,你告诉 bind() 自己选择合适的端口。同样, 将 y_addr.sin_addr.s_addr 设置为 INADDR_ANY,你告诉他自动填上 他所运行的机器的 IP 地址。
如果你一向小心谨慎,那么你可能注意到我没有将 INADDR_ANY 转换为网络字节顺序!这是因为我知道内部的东西:INADDR_ANY 实际上就是 0!即使你 改变字节的顺序,0依然是0。但是完美主义者说安全第一,那么看下面的代码:
    my_addr.sin_port = htons(0); /* choose an unused port at random */
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* use my IP address */
你可能不相信,上面的代码将可以随便移植。
bind() 在错误的时候依然是返回-1,并且设置全局变量 errno。
在你调用 bind() 的时候,你要小心的另一件事情是:不要采用小于1024的端口号。所有小于1024的端口号都 被系统保留!你可以选择从1024到65535(如果他们没有被别的程序使用的话)。
你要注意的另外一件小事是:有时候你根本不需要调用他。如果你使用 connect() 来和远程机器通讯,你不要关心你的本地端口号(就象你在使用 telnet 的时候),你只要 简单的调用 connect() 就够可,他会检查套接口是否绑定,如果没有,他会自己绑定 一个没有使用的本地端口。
——————————————————————————–
connect()–Hello!
现在我们假设你是个 telnet 程序。你的用户命令你(就象电影 TRON 中一样)得到套接口 的文件描述符。你听从命令调用了 socket()。下一步,你的用户告诉你通过端口23(标 准 telnet 端口)连接到"132.241.5.10"。你该怎么做呢?
幸运的是,你正在疯狂地阅读 connect()–如何连接到远程主机这一章。你可不想让 你的用户失望。
connect() 系统调用是这样的:
  #include <sys/types.h>
  #include <sys/socket.h>
  int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
sockfd 是系统调用 socket() 返回的套接口文件描述符。serv_addr 是保存着目的地端口和 IP 地址的数据结构 struct sockaddr。addrlen 设置为 sizeof(struct sockaddr)。
让我们来看个例子:
  #include <string.h>
  #include <sys/types.h>
  #include <sys/socket.h>
  #define DEST_IP  "132.241.5.10"
  #define DEST_PORT 23
  main()
  {
    int sockfd;
    struct sockaddr_in dest_addr;  /* will hold the destination addr */
   sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */
    dest_addr.sin_family = AF_INET;    /* host byte order */
    dest_addr.sin_port = htons(DEST_PORT); /* short, network byte order */
    dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
    bzero(&(dest_addr.sin_zero), 8);    /* zero the rest of the struct */
    /* don’t forget to error check the connect()! */
    connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));
    .
    .
    .
再一次,你应该检查 connect() 的返回值–他在错误的时候返回-1,并 设置全局变量 errno。
同时,你可能看到,我没有调用 bind()。另外,我也没有管本地的端口号。我只关心 我在连接。内核将为我选择一个合适的端口号,而我们所连接的地方也自动地获得这些信息。
——————————————————————————–
listen()–Will somebody please call me?
Ok, time for a change of pace. What if you don’t want to connect to a remote host. Say, just for kicks, that you want to wait for incoming connections and handle them in some way. 处理过程分两步:首先,你听–listen(),然后,你接受–accept() (请看 下面的内容)。
除了要一点解释外,系统调用 listen 相当简单。
 int listen(int sockfd, int backlog);
sockfd 是调用 socket() 返回的套接口文件描述符。backlog 是 在进入队列中允许的连接数目。是什么意思呢? 进入的连接是在队列中一直等待直到你接受 (accept() 请看下面的文章)的连接。他们的数目限制于队列的允许。大多数系统的允许数目是20,你也可以设置为5到10。
和别的函数一样,在发生错误的时候返回-1,并设置全局变量 errno。
你可能想象到了,在你调用 listen() 前你或者要调用 bind() 或者让 内核随便选择一个端口。如果你想侦听进入的连接,那么系统调用的顺序可能是这样的:
  socket();
  bind();
  listen();
  /* accept() goes here */
因为他相当的明了,我将在这里不给出例子了。(在 accept() 那一章的代码将更加 完全。)真正麻烦的部分在 accept()。
——————————————————————————–
accept()–"Thank you for calling port 3490."
准备好了,系统调用 accept() 会有点古怪的地方的!你可以想象发生这样的事情: 有人从很远的地方通过一个你在侦听 (listen()) 的端口连接 (connect()) 到你的机器。他的连接将加入到等待接受 (accept()) 的队列中。你调用 accept() 告诉他你有空闲的连接。他将返回一个新的套接口文件描述符! 原来的一个还在侦听你的那个端口,新的最后在准备发送 (send()) 和接收 ( recv()) 数据。这就是这个过程!
函数是这样定义的:
  #include <sys/socket.h>
  int accept(int sockfd, void *addr, int *addrlen);
sockfd 相当简单,是和 listen() 中一样的套接口描述符。addr 是个指向局部的数据结构 struct sockaddr_in 的指针。This is where the information about the incoming connection will go (and you can determine which host is calling you from which port). 在他的地址传递给 accept 之前,addrlen 是个局部的整形变量,设置为 sizeof(struct sockaddr_in)。accept 将 不会将多余的字节给 addr。如果你放入的少些,那么在 addrlen 的值中反映 出来。
同样,在错误时返回-1并设置全局变量 errno。
现在是你应该熟悉的代码片段。
  #include <string.h>
  #include <sys/types.h>
  #include <sys/socket.h>
  #define MYPORT 3490  /* the port users will be connecting to */
  #define BACKLOG 10   /* how many pending connections queue will hold */
  main()
  {
    int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */
   struct sockaddr_in my_addr;  /* my address information */
    struct sockaddr_in their_addr; /* connector’s address information */
    int sin_size;
    sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */
    my_addr.sin_family = AF_INET;     /* host byte order */
    my_addr.sin_port = htons(MYPORT);   /* short, network byte order */
    my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
    bzero(&(my_addr.sin_zero), 8);    /* zero the rest of the struct */
    /* don’t forget your error checking for these calls: */
    bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
    listen(sockfd, BACKLOG);
   sin_size = sizeof(struct sockaddr_in);
    new_fd = accept(sockfd, &their_addr, &sin_size);
    .
    .
    .
注意,在系统调用 send() 和 recv() 中你应该使用新的文件描述符。 如果你只想让一个连接进来,那么你可以使用 close() 去关闭原来的文件描述 符 sockfd 来避免同一个端口更多的连接。
——————————————————————————–
send() and recv()–Talk to me, baby!
这两个函数用于流式套接口和数据报套接口的通讯。如果你喜欢使用无连接的数据报 套接口,你应该看一看下面关于 sendto() 和 recvfrom() 的章节。
send() 是这样的:
  int send(int sockfd, const void *msg, int len, int flags);
sockfd 是你想发送数据的套接口描述符(或者是调用 socket() 或者是 accept() 返回的。)msg 是指向你想发送的数据的指针。len 是 数据的长度。把 flags 设置为 0 就可以了。(详细的资料请看 send() 的 man page)。
这里是一些可能的例子:
  char *msg = "Beej was here!";
  int len, bytes_sent;
  .
  .
  len = strlen(msg);
  bytes_sent = send(sockfd, msg, len, 0);
 .
.
  .
send() 返回实际发送的数据的字节数–他可能小于你要求发送的数目!也即你告诉他要发送一堆数据可是他不能处理成功。他只是发送他可能发送的数据,然后 希望你以后能够发送其他的数据。记住,如果 send() 返回的数据和 len 不 匹配,你应该发送其他的数据。但是这里也有个好消息:如果你要发送的包很小(小于大约 1K),他可能处理让数据一次发送完。最后,在错误的时候返回-1,并设置 errno。
recv() 函数很相似:
  int recv(int sockfd, void *buf, int len, unsigned int flags);
sockfd 是要读的套接口描述符。buf 是要读的信息的缓冲。len 是 缓冲的最大长度。flags 也可以设置为0。(请参考recv() 的 man page。)
recv() 返回实际读入缓冲的数据的字节数。或者在错误的时候返回-1,同时设置 errno。
很简单,不是吗? 你现在可以在流式套接口上发送数据和接收数据了。你现在是 Unix 网络程序员了!
——————————————————————————–
sendto() 和 recvfrom()–Talk to me, DGRAM-style
"这很不错啊",我听到你说,"但是你还没有讲无连接数据报套接口呢。"没问题,现在我们开始 这个内容。
既然数据报套接口不是连接到远程主机的,那么在我们发送一个包之前需要什么信息呢? 不错,是目标地址!看下面的:
  int sendto(int sockfd, const void *msg, int len, unsigned int flags,
     const struct sockaddr *to, int tolen);
你已经看到了,除了另外的两个信息外,其余的和函数 send() 是一样的。 to 是个指向数据结构 struct sockaddr 的指针,他包含了目的地的 IP 地址和断口信息。tolen 可以简单地设置为 sizeof(struct sockaddr)。
和函数 send() 类似,sendto() 返回实际发送的字节数(他也可能小于你 想要发送的字节数!),或者在错误的时候返回 -1。
相似的还有函数 recv() 和 recvfrom()。recvfrom() 的定义是 这样的:
  int recvfrom(int sockfd, void *buf, int len, unsigned int flags
        struct sockaddr *from, int *fromlen);
又一次,除了一点多余的参数外,这个函数和 recv() 也是一样的。from 是 一个指向局部数据结构 struct sockaddr 的指针,他的内容是源机器 的 IP 地址和端口信息。fromlen 是个 int 型的局部指针,他的初始值 为 sizeof(struct sockaddr)。函数调用后,fromlen 保存着 实际储存在 from 中的地址的长度。
recvfrom() 返回收到的字节长度,或者在发生错误后返回 -1。
记住,如果你是用 connect() 连接一个数据报套接口,你可以简单的调用 send() 和 recv() 来满足你的要求。这个时候依然是数据报套接口,依然使用 UDP,系统 自动的加上了目标和源的信息。
——————————————————————————-
close() 和 shutdown()–Get outta my face!
你已经整天都在发送 (send()) 和接收 (recv()) 数据了,现在你准备 关闭你的套接口描述符了。这很简单,你可以使用一般的 Unix 文件描述符的 close() 函 数:
  close(sockfd);
他将防止套接口上更多的数据的读写。任何在另一端读写套接口的企图都将返回错误信息。
如果你想在如何关闭套接口上有多一点的控制,你可以使用函数 shutdown()。他能够让 你将一定方向的通讯或者双向的通讯(就象 close() 一样)关闭,你可以使用:
  int shutdown(int sockfd, int how);
sockfd 是你想要关闭的套接口文件描述复。how 的值是下面的其中之一:
0 – Further receives are disallowed
1 – Further sends are disallowed
2 – Further sends and receives are disallowed (和 close() 一样
shutdown() 成功时返回 0,失败时返回 -1(同时设置 errno。)
如果在无连接的数据报套接口中使用 shutdown(),那么只不过是让 send() 和 recv() 不能使用(记得你在数据报套接口中使用了 connect 后是可以 使用他们的吗?)
——————————————————————————–
getpeername()–Who are you?
这个函数太简单了。
他太简单了,以至我都不想单列一章。但是我还是这样做了。
函数 getpeername() 告诉你在连接的流式套接口上谁在另外一边。函数是这样的:
  #include <sys/socket.h>
  int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);
sockfd 是连接的流式套接口的描述符。addr 是一个指向结构 struct sockaddr (或者是 struct sockaddr_in) 的指针,他保存着 连接的另一边的信息。addrlen 是一个 int 型的指针,他初始化为 sizeof(struct sockaddr)。
函数在错误的时候返回 -1,设置相应的 errno。
一旦你获得他们的地址,你可以使用 inet_ntoa() 或者 gethostbyaddr() 来打印或者获得更多的信息。但是你不能得到他的帐号。(如果他运行着愚蠢的守护进程,这是 可能的,但是他的讨论已经超出了本文的范围,请参考 RFC-1413 以获得更多的信息。)
——————————————————————————-
gethostname()–Who am I?
甚至比 getpeername() 还简单的函数是 gethostname()。他返回你程序 所运行的机器的主机名字。然后你可以使用 gethostbyname() 以获得你的机器的 IP 地址。
下面是定义:
  #include <unistd.h>
  int gethostname(char *hostname, size_t size);
参数很简单:hostname 是一个字符数组指针,他将在函数返回时保存 主机名。size 是 hostname 数组的字节长度。
函数调用成功时返回 0,失败时返回 -1,并设置 errno。
——————————————————————————–
DNS–You say "whitehouse.gov", I say "198.137.240.100"
如果你不知道 DNS 的意思,那么我告诉你,他代表"域名服务 (Domain Name Service)"。他主要的功能是:你给他一个容易记忆的某站点的地址,他给你 IP 地址(然后你就可以 使用 bind(), connect(), sendto() 或者其他函数。)当一个人 输入:
  $ telnet whitehouse.gov
telnet 能知道他将连接 (connect()) 到 "198.137.240.100"。
但是这是如何工作的呢? 你可以调用函数 gethostbyname():
  #include <netdb.h>
  struct hostent *gethostbyname(const char *name);
很明白的是,他返回一个指向 struct hostent 的指针。这个数据结构是 这样的:
  struct hostent {
    char  *h_name;
    char  **h_aliases;
    int   h_addrtype;
    int   h_length;
   char  **h_addr_list;
  };
  #define h_addr h_addr_list[0]
这里是这个数据结构的详细资料: struct hostent:
h_name – Official name of the host.
h_aliases – A NULL-terminated array of alternate names for the host.
h_addrtype – The type of address being returned; usually AF_INET.
h_length – The length of the address in bytes.
h_addr_list – A zero-terminated array of network addresses for the host. Host addresses are in Network Byte Order.
h_addr – The first address in h_addr_list.
gethostbyname() 成功时返回一个指向 struct hostent 的 指针,或者是个空 (NULL) 指针。(但是和以前不同,errno 不设置,h_errno 设置错误信息。请看下面的 herror()。)
但是如何使用呢? 这个函数可不象他看上去那么难用。
这里是个例子:
  #include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <netdb.h>
  #include <sys/types.h>
  #include <netinet/in.h>
  int main(int argc, char *argv[])
  {
    struct hostent *h;
    if (argc != 2) { /* error check the command line */
      fprintf(stderr,"usage: getip address\n");
      exit(1);
    }
    if ((h=gethostbyname(argv[1])) == NULL) { /* get the host info */
      herror("gethostbyname");
      exit(1);
    }
    printf("Host name : %s\n", h->h_name);
    printf("IP Address : %s\n",inet_ntoa(*((struct in_addr *)h->h_addr)));
    return 0;
  }
在使用 gethostbyname() 的时候,你不能用 perror() 打印错误信息(因 为 errno 没有使用),你应该调用 herror()。
相当简单,你只是传递一个保存机器名的自负串(例如 "whitehouse.gov") 给 gethostbyname(),然后从返回的数据结构 struct hostent 中 收集信息。
唯一让人迷惑的是打印 IP 地址信息。h->h_addr 是一个 char *, 但是 inet_ntoa() 需要的是 struct in_addr。因此,我 转换 h->h_addr 成 struct in_addr *,然后得到数据。
——————————————————————————–
Client-Server Background
这里是个客户–服务器的世界。在网络上的所有东西都是在处理客户进程和服务器进程的交谈。 举个 telnet 的例子。当你用 telnet (客户)通过 23 号端口登陆到主机,主机上运行 的一个程序(一般叫 telnetd,服务器)激活。他处理这个连接,显示登陆界面,等等。
Figure 2. The Client-Server Relationship.
图 2 说明了客户和服务器之间的信息交换。
注意,客–服务器之间可以使用SOCK_STREAM、SOCK_DGRAM 或者其他(只要他们采用相同的)。一些很好的客户–服务器的例子有 telnet/telnetd、 ftp/ftpd 和 bootp/bootpd。每次你使用 ftp 的 时候,在远端都有一个 ftpd 为你服务。
一般,在服务端只有一个服务器,他采用 fork() 来处理多个客户的连接。基本的 程序是:服务器等待一个连接,接受 (accept()) 连接,然后 fork() 一个 子进程处理他。这是下一章我们的例子中会讲到的。
——————————————————————————–
简单的服务器
这个服务器所做的全部工作是在留式连接上发送字符串 "Hello, World!\n"。你要 测试这个程序的话,可以在一台机器上运行该程序,然后在另外一机器上登陆:
  $ telnet remotehostname 3490
remotehostname 是该程序运行的机器的名字。
服务器代码:
  #include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <string.h>
  #include <sys/types.h>
  #include <netinet/in.h>
  #include <sys/socket.h>
  #include <sys/wait.h>
  #define MYPORT 3490  /* the port users will be connecting to */
  #define BACKLOG 10   /* how many pending connections queue will hold */
  main()
  {
    int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */
    struct sockaddr_in my_addr;  /* my address information */
    struct sockaddr_in their_addr; /* connector’s address information */
    int sin_size;
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
      perror("socket");
      exit(1);
    }
    my_addr.sin_family = AF_INET;     /* host byte order */
    my_addr.sin_port = htons(MYPORT);   /* short, network byte order */
    my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
    bzero(&(my_addr.sin_zero), 8);    /* zero the rest of the struct */
    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
          == -1) {
      perror("bind");
      exit(1);
    }
    if (listen(sockfd, BACKLOG) == -1) {
      perror("listen");
      exit(1);
    }
    while(1) { /* main accept() loop */
      sin_size = sizeof(struct sockaddr_in);
      if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \
          &sin_size)) == -1) {
       perror("accept");
        continue;
      }
      printf("server: got connection from %s\n", \
                       inet_ntoa(their_addr.sin_addr));
      if (!fork()) { /* this is the child process */
       if (send(new_fd, "Hello, world!\n", 14, 0) == -1)
          perror("send");
       close(new_fd);
       exit(0);
     }
      close(new_fd); /* parent doesn’t need this */
      while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */
    }
  }
如果你很挑剔的话,一定不满意我所有的代码都在一个很大的 main() 函数 中。如果你不喜欢,可以划分得更细点。
你也可以用我们下一章中的程序得到服务器端发送的字符串。
——————————————————————————–
简单的客户程序
这个程序比服务器还简单。这个程序的所有工作是通过 3490 端口连接到命令行中制定的主机, 然后得到服务器的字符串。
客户代码:
  #include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <string.h>
  #include <netdb.h>
  #include <sys/types.h>
  #include <netinet/in.h>
  #include <sys/socket.h>
  #define PORT 3490  /* the port client will be connecting to */
  #define MAXDATASIZE 100 /* max number of bytes we can get at once */
  int main(int argc, char *argv[])
  {
   int sockfd, numbytes; 
    char buf[MAXDATASIZE];
    struct hostent *he;
    struct sockaddr_in their_addr; /* connector’s address information */
    if (argc != 2) {
      fprintf(stderr,"usage: client hostname\n");
      exit(1);
    }
    if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */
      herror("gethostbyname");
     exit(1);
    }
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
      perror("socket");

      exit(1);

    }

    their_addr.sin_family = AF_INET;   /* host byte order */

    their_addr.sin_port = htons(PORT);  /* short, network byte order */

    their_addr.sin_addr = *((struct in_addr *)he->h_addr);

    bzero(&(their_addr.sin_zero), 8);   /* zero the rest of the struct */

    if (connect(sockfd, (struct sockaddr *)&their_addr, \
                      sizeof(struct sockaddr)) == -1) {
      perror("connect");
     exit(1);
   }
    if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {
      perror("recv");
     exit(1);
    }
    buf[numbytes] = ‘\0’;
    printf("Received: %s",buf);
   close(sockfd);
    return 0;
  }
注意,如果你在运行服务器之前运行客户程序,connect() 将返回 "Connection refused" 信息。
——————————————————————————–
数据报 Sockets
我不想讲更多了,所以我给出代码 talker.c 和 listener.c。
listener 在机器上等待在端口 4590 来的数据包。talker 发送数据包到一定的 机器,他包含用户在命令行输入的东西。
这里就是 listener.c:
  #include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <string.h>
  #include <sys/types.h>
  #include <netinet/in.h>
  #include <sys/socket.h>
  #include <sys/wait.h>
  #define MYPORT 4950  /* the port users will be sending to */
  #define MAXBUFLEN 100
  main()
  {
    int sockfd;
    struct sockaddr_in my_addr;  /* my address information */
    struct sockaddr_in their_addr; /* connector’s address information */
   int addr_len, numbytes;
   char buf[MAXBUFLEN];
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
      perror("socket");
     exit(1);
   }
    my_addr.sin_family = AF_INET;     /* host byte order */
    my_addr.sin_port = htons(MYPORT);   /* short, network byte order */
    my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
    bzero(&(my_addr.sin_zero), 8);    /* zero the rest of the struct */
    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
                                   == -1) {
      perror("bind");
      exit(1);
   }
    addr_len = sizeof(struct sockaddr);
    if ((numbytes=recvfrom(sockfd, buf, MAXBUFLEN, 0, \
             (struct sockaddr *)&their_addr, &addr_len)) == -1) {
      perror("recvfrom");
     exit(1);
    }
    printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
    printf("packet is %d bytes long\n",numbytes);
    buf[numbytes] = ‘\0’;
    printf("packet contains \"%s\"\n",buf);
    close(sockfd);
  }
注意在我们的调用 socket(),我们最后使用了 SOCK_DGRAM。同时,没有 必要去使用 listen() 或者 accept()。我们在使用无连接的数据报套接口!
下面是 talker.c:
  #include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <string.h>
  #include <sys/types.h>
  #include <netinet/in.h>
 #include <netdb.h>
  #include <sys/socket.h>
  #include <sys/wait.h>
  #define MYPORT 4950  /* the port users will be sending to */
  int main(int argc, char *argv[])
  {
    int sockfd;
    struct sockaddr_in their_addr; /* connector’s address information */
    struct hostent *he;
    int numbytes;
    if (argc != 3) {
      fprintf(stderr,"usage: talker hostname message\n");
      exit(1);
    }
    if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */
      herror("gethostbyname");
      exit(1);
    }
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
     perror("socket");
      exit(1);
    }
   their_addr.sin_family = AF_INET;   /* host byte order */
    their_addr.sin_port = htons(MYPORT); /* short, network byte order */
    their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    bzero(&(their_addr.sin_zero), 8);   /* zero the rest of the struct */
   if ((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0, \
      (struct sockaddr *)&their_addr, sizeof(struct sockaddr))) == -1) {
      perror("sendto");
     exit(1);
    }
    printf("sent %d bytes to %s\n",numbytes,inet_ntoa(their_addr.sin_addr));
    close(sockfd);
    return 0;
  }
这就是所有的了。在一台机器上运行 listener,然后在另外一台机器上运行 talker。观察他们的通讯!
Except for one more tiny detail that I’ve mentioned many times in the past: connected datagram sockets. I need to talk about this here, since we’re in the datagram section of the document. Let’s say that talker calls connect() and specifies the listener’s address. From that point on, talker may only sent to and receive from the address specified by connect(). For this reason, you don’t have to use sendto() and recvfrom(); you can simply use send() and recv().
——————————————————————————–
阻塞
阻塞,你也许早就听说了。"阻塞"是 "sleep" 的科技行话。你可能注意到前面运行的 listener 程序,他在那里不停地运行,等待数据包的到来。实际在运行的是 他调用 recvfrom(),然后没有数据,因此 recvfrom() 说"阻塞 (block)" 直到数据的到来。
很多函数都利用阻塞。accept() 阻塞,所有的 recv*() 函数阻塞。他们之所以能这样做是因为他们被允许这样做。当你第一次调用 socket() 建立套接口描述符的时候,内核就将他设置为阻塞。如果你不想套接口阻塞,你就要调用函数 fcntl():
  #include <unistd.h>
  #include <fcntl.h>
 .
 .
  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  fcntl(sockfd, F_SETFL, O_NONBLOCK);
  .
  .
通过设置套接口为非阻塞,你能够有效地"询问"套接口以获得信息。如果你尝试着 从一个非阻塞的套接口读信息并且没有任何数据,他不会变成阻塞–他将返回 -1 并 将 errno 设置为 EWOULDBLOCK。
但是一般说来,这种轮询不是个好主意。如果你让你的程序在忙等状态查询套接口的数据, 你将浪费大量的 CPU 时间。更好的解决之道是用下一章讲的 select() 去查询 是否有数据要读进来。
——————————————————————————–
select()–多路同步 I/O
虽然这个函数有点奇怪,但是他很有用。假设这样的情况:你是个服务器,你一边在不停地 从连接上读数据,一边在侦听连接上的信息。
没问题,你可能会说,不就是一个 accept() 和两个 recv() 吗? 这么容易 吗,朋友? 如果你在调用 accept() 的时候阻塞呢? 你怎么能够同时接受 recv() 数据? "用非阻塞的套接口啊!" 不行!你不想耗尽所有的 CPU,不是吗? 那么,该如何是好?
select() 让你可以同时监视多个套接口。如果你想知道的话,那么他就会告诉你哪个套接口准备读,哪个又 准备好了写,哪个套接口又发生了例外 (exception)。
闲话少说,下面是 select():
   #include <sys/time.h>
   #include <sys/types.h>
   #include <unistd.h>
   int select(int numfds, fd_set *readfds, fd_set *writefds,
         fd_set *exceptfds, struct timeval *timeout);
这个函数监视一系列文件描述符,特别是 readfds、writefds 和 exceptfds。如果你想知道你是否能够从标准输入和套接口描述符 sockfd 读 入数据,你只要将文件描述符 0 和 sockfd 加入到集合 readfds 中。 参数 numfds 应该等于最高的文件描述符的值加1。在这个例子中,你应该设置该值 为 sockfd+1。因为他一定大于标准输入的文件描述符 (0)。
当函数 select() 返回的时候,readfds 的值修改为反映你选择的哪个文件 描述符可以读。你可以用下面讲到的宏 FD_ISSET() 来测试。
在我们继续下去之前,让我来讲讲如何对这些集合进行操作。每个集合类型都是 fd_set。 下面有一些宏来对这个类型进行操作:
FD_ZERO(fd_set *set) – clears a file descriptor set
FD_SET(int fd, fd_set *set) – adds fd to the set
FD_CLR(int fd, fd_set *set) – removes fd from the set
FD_ISSET(int fd, fd_set *set) – tests to see if fd is in the set
最后,是有点古怪的数据结构 struct timeval。有时你可不想永远等待别人发送数据过来。也许什么事情都没有发生的时候你也想每隔96秒在终端 上打印字符串 "Still Going…"。这个数据结构允许你设定一个时间,如果时间到了, 而 select() 还没有找到一个准备好的文件描述符,他将返回让你继续处理。
数据结构 struct timeval 是这样的:
  struct timeval {
    int tv_sec;   /* seconds */
    int tv_usec;  /* microseconds */
  };
只要将 tv_sec 设置为你要等待的秒数,将 tv_usec 设置为你要等待的微秒数就可以了。是的,是微秒而不是毫秒。1,000微秒等于1豪秒,1,000毫秒等于1秒。也就是说,1秒等于1,000,000微秒。为什么用符号 "usec" 呢? 字母 "u" 很象希腊字母 Mu, 而 Mu 表示 "微" 的意思。当然,函数返回的时候 timeout 可能是剩余的 时间,之所以是可能,是因为他依赖于你的 Unix 操作系统。
哈!我们现在有一个微秒级的定时器!不要计算了,标准的 Unix 系统的时间片是100毫秒,所以 无论你如何设置你的数据结构 struct timeval,你都要等待那么长的 时间。
还有一些有趣的事情:如果你设置数据结构 struct timeval 中的 数据为 0,select() 将立即超时,这样就可以有效地轮询集合中的 所有的文件描述符。如果你将参数 timeout 赋值为 NULL,那么将永远不会发生超时,即一直等到第一个文件描述符就绪。最后,如果你不是很关心等待多长时间,那么 就把他赋为 NULL 吧。
下面的代码演示了在标准输入上等待 2.5 秒:
   #include <sys/time.h>
   #include <sys/types.h>
   #include <unistd.h>
   #define STDIN 0 /* file descriptor for standard input */
   main()
   {
     struct timeval tv;
     fd_set readfds;
     tv.tv_sec = 2;
     tv.tv_usec = 500000;
     FD_ZERO(&readfds);
     FD_SET(STDIN, &readfds);
     /* don’t care about writefds and exceptfds: */
     select(STDIN+1, &readfds, NULL, NULL, &tv);
     if (FD_ISSET(STDIN, &readfds))
       printf("A key was pressed!\n");
     else
       printf("Timed out.\n");
  }
如果你是在一个 line buffered 终端上,那么你敲的键应该是回车 (RETURN),否则无论如何 他都会超时。
现在,你可能回认为这就是在数据报套接口上等待数据的方式–你是对的:他可能是。 有些 Unix 系统可以按这种方式,而另外一些则不能。你在尝试以前可能要先看看本系统 的 man page 了。
最后一件关于 select() 的事情:如果你有一个正在侦听 (listen()) 的套接口,你可以通过将该套接口的文件描述符加入到 readfds 集合中来看 是否有新的连接。
这就是我关于函数 select() 要讲的所有的东西。

如何开始创业(转)

一次成功的创业建立在以下三个条件上:优秀的合伙人,确实有需求的产品,以及尽可能少的启动资金。绝大部分创业失败是因为它们缺少了以上这些条件中的某一项,而那些完全具备这三点的创业往往会取得成功。

让人欣慰的是,当你认真考虑它们的时候,这三点条件都是可行的,虽然可能有一点困难。鉴于成功的创业应该会让创始人富有,我们可以得出结论:富有的生活是可以实现的,只是有一点困难。

如果说在创业方面只有一点我想要澄清的话,那就是:创业时,并没有需要特别出众的才华才能踏出的,神奇的一步。

创意

特别需要指出的是,创业并不需要特别优秀的创意。创业的主旨是通过给人们提供比他们现在拥有的东西更好一点的商品,以次货的需求。可是很多人们现在拥有的产品和服务是如此之差,以至于不需要多聪明的头脑都能想出将之改善的方法。

Google为例,开始时的计划仅 仅是创造一个简单易用不至于烂得让人骂娘的搜索引擎。为此他们做了三点创新:链接更多网页,对搜索结果进行排序,以及使用不带骚扰广告的清新简洁的界面, 因此总而言之,他们制作了一个很好用的网站。Google网站的技术含量是无庸置疑的,而总体计划更是直截了当。当现在他们已经有了巨大得多的野心和发展 时,这种简单的计划给他们带来一年10亿美元的收益。

世上还有许许多多的领域,和在Google出现之前的网络搜索领域一样落后。我可以想出好几种启发创业思路的方法,不过绝大部分归结于以下的方式:观察人们的某些行为和需求,并找出满足他们需要而又不是太差的一种技术或手段。

举例来说,目前那些约会网站做得比Google 出现之前的网络搜索服务还要糟糕得多。他们都使用同样简单的架构,倾向于用数据配对来代替真实世界的约会的重要性,水平甚至还不如一个大学生为了应付课程 而做的作业。与此同时,还有很多的资金可以投注到这一领域,约会网站是一个很有价值的生意,并且有可能通过成功的运作得到百倍以上的回报。

一个良好的创意,只是创业的第一步。许多未来的创业者认为,整个创业的过程只是最初的那个主意,以及剩下的执行细 节。而风险投资方对此有更清晰的了解,当一个创业者来到风投公司要求用他的创意换取进一步合作的时候,他甚至得不到一份保密协议。很显然,一个纯粹的创意 的市场价值,甚至不如签订一份保密协议的成本。

原始创意不值钱的另一个例证是,很多的创业者在其实践过程中对他们原本的计划做了很大的修改。微软创始时的经营计划是贩卖编程语言等软件,而他们现在的商业模式是在创业五年后被IBM扫地出门之后诞生的。

创意绝对是有价值的,但问题在于,它们很难在创业过程中转变为收益。创意不是那种很容易让别人按照你的思路去执行的东西,它们的价值在于其拥有者在实践中对原始计划不断思考和修正的过程。

创意并不是最重要的东西,那些拥有创意的人才是。善于工作的人可以把一个烂主意变好,可是再好好主意也帮不了一个笨蛋。

我指的善于工作的人是什么样的呢?在我创业的过程中学到的最有用的东西,就是雇佣员工的标准。你能够明白“猛兽一般的人”这个比喻吗?这句话可能很难翻译成其它语言,不过我认为每个美国人都明白它的意思。这是说,某些人对于他们的工作有点过于认真,以至于他们在工作的过程中跨过了职业需求的限度而进入到狂热的境界。

对于单个人而言,这个比喻确切的意思取决于工作性质的不同:一个绝不接受客人说不的推销员;一个在凌晨四点也不愿意留下代码中的bug 去睡觉的黑客(原文hacker,在这篇文章里不能仅指黑客,而是一个热情的程序员,可是下文中作者对软件工程师Engineer有鄙视的感觉,所以还是 做“黑客”解,译注);一个会冷不防打电话到纽约时报记者手机的公共关系专家;一个看到两毫米的误差就会觉得浑身不舒服的设计师。

在我的公司里,几乎每个人都是一头猛兽。我的销售主管,那个女人的顽强甚至让我对她电话另一头的潜在客户感到歉意。你都可以感受到他们在电话现那头挣扎,像鱼钩上的鱼一样,但是在签约之前,他们绝对不会得到任何逃跑的机会。

想一想你所认识的人,你会发现“猛兽”形态是很容易找到的。想象某些人的样子,然后在心里描绘下他们做那些“猛兽般”行为的状态。如果你发笑了,说明他们不是那样的人。在一个大公司中,这样的状态可能是不必要甚至不需要的,但在创业中,“猛兽”般的工作态度是绝对必须的。

对于黑客,我们有一些额外的标准。他确实特别聪明吗?如果是,他能够一丝不扣地完成一份工作吗?还有最后,鉴于部分很优秀的黑客会有一些不良癖好,我们是否能够忍受他们和我们一起工作也是指标之一。

而最后的测试只能筛选掉很少一部分人。我们可以接受一个天才的任何缺点,除了不断抱怨的那些。不过这些人通常不怎么优秀,所以我们的第三个测试基本上只是之前的补充。

大部分情况下,当那些讨厌的人努力装聪明的时候,他们会变得让人难以容忍。其实,越是聪明的人越是不会为此感到困扰。所以你会发现,那些充满天才的人总是较易使用“我不知道”“也许你是对的”和“我对xx事情不太了解”这类的句式。

这种技巧并不是一直有用的,因为人很容易受到环境的影响。在MIT的顾客满意部门,好像有一种叫做“装成一个什么都知道的猛男(我喜欢这个词,译注)”的传统。听说这种态度最早起源于Marvin Minsky(图灵奖获得者,译注),而与此相类似的所谓典型飞行员姿态,则是来自于Chuck Yeager(知名战斗机飞行员,猛男一个,译注)。就算是真正才华出众的人,在这个环境里也会显得有点太猛,所以你只能忍受他们。

这种人才选择方式让我们拥有Robert Morris了,我所见过最会说“我不知道”的一个人。(至少在他成为MIT的教授之前)。没有人会对Robert有所抱怨,因为他显然比任何人都要聪明,难得的是还没有任何脾气。

就像绝大部分创业活动一样,我们公司最初的合伙人仅仅是一群好朋友,而且连员工的招聘都主要通过朋友关系来进行。这是创业公司和大企业最显著的区别。和某人交几天朋友,能体会到大公司在面试中永远问不出的东西。

创业大半发生在大学周围,是因为那里是有才智的人的聚集地。MIT和斯坦福周围布满了高科技公司,并不是因为他们的学生在课堂上学到的东西。其实只要学校允许,他们宁可在课堂上唱野营歌。

如果你想要创业,和大学里的天才们一起进行会带来更好的机会,所以理论上来说你要努力和你在大学里看到的每一个聪明人交朋友,对吗?答案是不。优秀的技术人员不喜欢目的性很强的交流方式,你的努力不会有回报。

在大学里,你该做的是专注于你自己的项目。就算你不想创业,一个好的技术人员也应该做到这一点,因为这是唯一能够 真正学会程序技术的方式。在某些项目里你将会和别的学生合作,而这是最好的结识优秀黑客的方法。有些项目可能会进化成一个值得创业的机会,不过我建议不要 对此太过执着。别强制自己做任何事,只要和你欣赏的人一起做喜欢的工作就行了。

理想状态下,你会需要2至4个合作 者。只有两个人的创业是很困难的。而单独创业者,将会发现自己面临着巨大的精神压力。即使是比尔大门,传说中无视压力的名人,仍然需要找一个合作者一起创 业。不过你确实不需要像一张全家福照片一样多的合作伙伴,一方面是因为创业初期并不需要太多人,另一方面是因为越多人就越多分歧。在只有两三个人的情况 下,你们会因为失败的压力迅速地处理不同意见。而7、8个人一起干的时候,任何分歧都可能长时间逗留并造成分裂的小团体。投票表决并不是好方法,全体一致 才是创业的需要。

很多情况下,一个新公司都是基于技术型产业而建立,所以创始人需要招收技术人员。在网络泡沫时代,很多商科出身的 创业者寻求优秀黑客的帮助来制造他们的产品,其结果被证明并不理想。生意人对于技术问题并不理解,因为他们不知道产品的发展有哪些可选项,会面临什么困 难,有什么优势。而且他们也分不清哪个黑客更优秀,就算对于计算机领域的同业,人们也很难分清谁更优秀的问题,而一个单纯的生意人在挑选的时候就更像一场 轮盘赌了。

那么在创业时,商科背景的人是否是必须的呢?这个问题并没有确定的答案。当我创业的时候,我们认为是需要的,所以我们向周围的专业人士询问关于“商场的奥秘”的知识以及他们愿不愿意做我们的总经理。不过他们都拒绝了,所以我只能自己来当。不过后来我发现,做生意也没有那么困难和神秘,并不像物理学或者医学那样需要大量的学习,只要努力让别人买你的东西就好了。

我认为,之前我把做生意看成是很神秘的东西,原因在于我本身对它有厌恶感。我希望在纯净而高度脑力化的软件世界中工作,而不是和庸俗的客户及他们的蠢问题打交道。不希望参与某项工作的人往往会用一种保护性的能力不足来作推脱。Paul Erdos(著名数学家,译注)是很典型的例子,人们看到他甚至不懂得如何把一颗柚子切成两半。所以别人不得不为他做所有的生活琐事,从而让他能够把自己的全部时间投注在数学商。Erdos是一个极端的例子,不过绝大多数做丈夫的或多或少使用相同的手段。

当我必须放弃我的保护性能力不足之后,我发现做生意并不像我之前想象的那么困难和无聊。生意经中有很深奥的部分,例如税法和衍生产品的定价,但你无需在创业的时候掌握它们。所有创业所需要的知识在任何商学院甚至大学建立起来之前就已经被人们所熟知了。

如果你尝试在福布斯400强的管理者名单中标记出MBA学历的名字,你就会对商学院有新的重要认识。第一个MBA在第22位出现,Phil Knight,Nike的CEO。前50名中只有4个MBA学历,而相对的,福布斯400强中的管理者有相当大一部分是技术背景的。想想Bill Gates, Steve Jobs, Larry Ellison, Michael Dell, Jeff Bezos, Gordon Moore.(这些名字我想不需要翻译了。。译注),高科技类产业的规则看起来是由技术员而非生意人制定的。所以如果你希望用两年的时间给你未来的创业增添一点资本,学会一点黑客技术看上去比读MBA更有用。

有一个重要理由会让你希望把一个商科背景的人加入到创业的队伍中:总要有个人愿意并且能够关注客户的需求。有些人 认为,只有商科背景的人能做这件事。优秀黑客能够制作软件,不过不能设计它们。这种话及其荒谬。黑客没有理由因为懂得设计软件就不理解客户需求,纯正的生 意人也没有理由不懂得设计软件却能神奇地理解它们。

无论如何,如果你不能靠自己探寻客户需求,你就必须寻找一个能够这么做的合伙人。这是技术创业中最最重要的一环,绝大部分的创业是因为这个环节而失败的。

客户需求

并不是只有创业公司需要担心客户需求。我认为绝大部分公司失败的主要原因就是他们不能给客户提供想要的东西。以餐馆为例,绝大多数餐馆最终经营失败,其中约有四分之一甚至在第一年就关门大吉。可是你记得曾经有哪一家能做出真正美味的食物的餐馆倒闭吗?

餐馆只要能做出真正美味的食物就足以应付一切。优秀的口味带来高昂的价格,拥挤的人群,喧嚣,热闹的氛围,坐满的 座位,甚至态度恶劣的服务,而顾客们还是趋之若鹜。当然确实存在一些口味一般而靠小噱头吸引顾客的餐厅,但这样的经营方式会带来很大的风险。直接提供美味 可口的食物才是最为简单有效的方法。

在技术创业中,情况也是一样。你可能听说过创业失败的各种理由,可是有听说过拥有一个极端受欢迎的产品的公司失败的例子么?

几乎每一个失败的创业案例,最终的问题都是其客户失去了对其产品的需求。基本上,所有的失败看起来都是由“资金不足”所直接导致的,可是他们弄不到资金的原因几乎都一样:产品太烂,或者根本就没有一个完成的产品。

当我列出所有创业者都需要做的工作的时候,曾经很想要尽快作出一个产品的第一版。幸好我没有决定这么做,因为这种急功近利的方法不利于做出顾客想要的产品。只有通过发行试用版并根据客户反馈不断调整,才是创造出适合客户需求的产品的唯一方法。

另一个方法是我称为“孤注一掷” (Hail Mary)的策略。你可能对一个产品做出详细的计划书,雇佣一整队的工程师来开发它,一年之后发现你投入的二百万美元变成了一堆没人要的垃圾。在网络泡沫 的时代,这种情况并不少见,尤其在那些商业气息很浓的公司进入计算机技术领域的时候,他们都以为开发软件产品是一件可以完美地按照计划进行的事情。

我们从不认同这种做法。作为一个LISP流的黑客(程序语言的一种,两大黑客入门语言之一,另一个是Perl,译注),我遵循着快速原型开发的传统。并不是说这种方法是用于开发任何程序(至少不在这篇文章里),不过这种方法对创业阶段需要的软件而言是绝对必要的。

就像大部分创业公司一样,我们进入实际操作阶段以后对我们的计划进行了修改。一开始我们的目标客户是网络咨询公 司,可是他们显然不喜欢我们,因为我们的软件使用过于简单又配有自己的站点,他们的客户甚至可以直接把他们炒掉。我们认为还可以做一些网上目录供应商的生 意,因为网上销售可以成为他们现有生意的良好扩展。不过在1996年,这种生意很难做。公司的中层管理人往往把网络营销视为一项多出来的工作,而不是一个 机会。

我们得到了一些有进取精神的需要目录服务的公司的订单。其中还包括Frederick’s of Hollywood(有名的女装内衣……!!-_-,译注),那巨大的工作量真是对我们的服务能力的一大考验。不过大部分的客户都是些小公司,希望在网络 上寻求机遇的个体商户。有一些客户拥有自己的商店,不过大部分都只在网上销售。所以我们把目标转向这些小商贩来取代原本计划中的网络咨询公司和大型零售 商,也因此我们需要把软件做得更简单易用。

从这些经验中,我学会了一个重要原则。使你的技术易于使用是永远值得花精力去做的事。黑客们已经习惯于和电脑打交 道所以不了解普通人对于不熟悉的软件怀有的恐惧心理Stephen Hawking(霍金,译注)的编辑告诉他,他每在书里放进一个公式,书的销量就会减少一半。当你致力于使你的技术易于使用时,这条曲线将随着你使软件简 化的程度往上倾斜。易用性方面10%的进步,会带来的收益将是两倍的销量而不是仅仅10%的增长。

那要如何探寻客户的需求呢?观察。展销会是观察客户的最佳选择之一,它们往往不是用来争取新客户的,而是用来做市 场调查的。在展销会上我们并不仅仅做一些简单的演示,我们还教客户建设自己的网上上铺的方法。同时我们能够观察他们使用我们软件的情况,以及和他们讨论关 于产品的进一步需求。

大部分人把创业当成建设一家像苹果或谷歌那样的公司来看待。这些公司名气响亮,人尽皆知。但对于任何一个创业公司 来说,在利基市场(类似于细分市场,长尾概念)上或者基础工业领域中还有20个以上可以成就大事业的机会。所以当你希望创业成功的时候,最好把赌注投注在 这些方面。

从另一个角度来说,在已经有一个强大的品牌产品的市场中创业,成功的几率是相当小的。在“蓝海”(参见长尾理论) 中才有最好的创业机会。因为创业的基本原则是给人们提供比他们现在使用的东西更好一点的产品,所以那些目前水平低下的产业中才蕴藏着最好的机会。相信我, 你不会找到一个比大公司的IT部门的工作更烂水平的领域了,那些企业每年花费巨资在使用的软件上,可是回报却是一大堆的麻烦。这种不公平的现象意味着巨大 的机遇。

如果你想要找一个创业的机会,你可以尝试找一个中等规模的非技术公司待几个星期,专注于观察他们和电脑应用有关的活动。大部分优秀的黑客都不能够理解普通的公司员工对于电脑的恐惧心理,就像美国的富人们无法理解巴西贫民窟发生了什么一样。

当创业开始的时候,尝试为小公司写一些适合他们的软件,因为这样更容易卖出去。给大公司提供比他们现有的垃圾系统 更好一点的垃圾软件,是一件很花时间和金钱的工作。就算你可以用一只手黑掉Oracle的系统,你也不可能竞争过他们的销售人员。所以如果你希望用你较为 优秀的技术水平争夺客户,先从小公司做起。

从战略上来说,小公司业务更适合创业中的企业发展。在技术领域,低端产品总能侵蚀高端市场。把一些便宜货改的好一 些,其难度远小于把那些更好的软件改的便宜一些。所以低端出身的产品经过市场中的发展和创新,会逐渐地进步到可以打入高端市场的境界。Sun公司的主机就 是其中的典范,而Intel在和Sun合作的过程中完成这个过程,微软的Word软件通过插页和设计框架的简单功能打入桌面文件处理软件的竞争中,大众型 的数码相机生产商也会制作供给专业人士的昂贵玩具。Avid在录像处理系统中的发展,Apple紧随其后的成长,Henry Ford在已经被遥遥领先的汽车制造业中的成功,都是依靠这种模式。一种便宜而好用的产品,不仅是你创造销售额的利器,而且能够帮助你开拓更大的市场份 额。

如果有任何竞争对手的价格和易用性比你的产品优越,那你就要当心成为别人的靶子了

筹集资金

要使任何创业活动实现,你首先需要的就是启动资金。有些创业公司是自给自足的,比如微软,但绝大部分做不到。我认为明智的做法是寻找适当的投资人,因为依靠自有资金创业,你基本上只能做一个咨询类的公司,而这类型的业务很难转换成一个实业行的事业。

从资本角度考虑,创业就像一场考试。创业致富的方法并不是占有全部的股份,而是尽可能地最大化公司成功的机会。所以较好的做法是用一些股份来换取更高的成功几率。

对于大部分职业黑客而言,寻找投资者是一件神秘而可怕的事情。其实让我说,这只是一项简单乏味的工作。首先你需要几万美元的启动资金来开发你的软件的原型的费用。这种投资称为“种子资金”,只是小额的投资,而获取它们其实也很简单:只要开口问别人行不行就是了。

一般而言,你可以从那些独立投资人那里获取种子资金,这种投资称为“天使投资”,投资人往往是曾经靠技术创业成功的人士。在种子阶段,投资人并不要求你有一个详细的商业计划,他们会根据你的介绍做出快速的决定,有时资金在一周内就会到位——只要一份简单的合同。

我们启动Viaweb的资金是从我们的朋友Julian那里得来的一万美元天使投资,而且他还给了我们更多的帮 助。身为企业律师的他曾经是一个公司的CEO,所以我们从他那里得到了很多关于做生意的建议,还省去了我们处理自己的法律问题的麻烦。另外,他还带给我们 另两位天使投资人,解决了我们下一步的资金问题。

有些天使投资者,尤其是那些有技术背景的人,可能会只凭一个测试版的软件或者一次口头说明就相信你的创业计划。但是大部分投资人都会想要一份详细的计划书来搞明白他们到底投资了什么。

回想起来,当时我们的天使投资人问我要商业计划的时候,我确实为它发了好多的愁。“商业计划”,它显然涉及到“商 业”这个新奇的玩意,所以我觉得我得参考一些相关的书籍来学习怎样写好它,但是从书中却完全找不到答案。基本上,投资人会希望你给他们一个大体的描述包括 你想做什么和它能怎样赚钱,还有你自己的简历。你只要坐下把你曾经告诉过别人的那些希望写下来就好了。这件事情其实不需要花一整天去做,最重要的是你还能 在写下你的计划的过程中得到许多的启发。

得到投资以后,你要做的是建立一家公司。大致上开办一家公司并不困难,但问题在于你很难决定哪些人会成为你的合作 伙伴以及你们各占多少股份。两个同等水平的人平分并不困难,但是当你有好几个在工作在不同领域和层次的合伙人的时候,合理分配股份将是无比痛苦的。不过无 论如何,只要你们决定好了,这件事情就不能改变。

对于这件事,我没有什么好的建议。我只能说,你该尽力去做,努力做好它。不过实在要说的话,我有一个实践中的经验就是,当每个人都觉得他们得到的股份相对于他们的付出而言算是吃了一点小亏的时候,你的股权分配方式是最好的。

当然除了合作之外,开办一家公司还有很多事情要做。保险,营业执照,劳动补偿,和国税局打交道。我不太清楚还有什 么事情在清单上,因为我们的公司完全跳过了这些玩意。。1996年当我们得到了足以创业的投资时,我们也得到了一个了不起的CFO,他把一切安排的妥妥帖 帖的。不管怎么说,就算你没有把开办公司时该做的每件事都完成,也不会有人冲过来把你逮捕归案。对于创业者而言这真是天大的好事,不然鬼还敢去创业。

如果你得到投资又不能及时开办公司,你的部分合伙人将会有自己先出去单干的想法。这种事经常发生,而它对你们而言是很危险的。所以当你决定创业并分配好股权的时候,你应该让所有的合伙人签署一份将所有人的创意所有权归属于公司的协议,以保证每个人都只能为公司服务。

(如果我们在演电影,接下来的场景将会伴随着不祥的音乐)

当你这么做的时候,首先你要问清楚每个合伙人他们还签署过什么协议。对于创业公司而言最麻烦的问题之一就是知识产权问题。我们曾经有过,而它差点就把我们搞垮了,比任何一个竞争对手都更接近。。。

当我们正要被别的公司收购的关键时期,我们发现一个合伙人早些时候签署了一份将他的创意所有权交给某大公司以换取 进入大学的助学金的协议。理论上来说,这份玩意说明别人在我们的软件产权中占了很大的一份。所以我们不得不对收购行动采取急刹车来应付这一问题。鉴于我们 即将被收购,当时我们的现金流降低到一个很低的水平,而这个问题使我们不得不补充资金以维持公司的运行。可是当你们公司头上有知识产权问题存在的时候是很 难找到投资者的,没人愿意冒着个险。

我们当时的投资人得知我们现金短缺之后,立刻进行了一些针对性的活动。我并不想在这里详述,除了告诉各位所谓“天使投资”,仅仅是名字好听而已。创始人被要求在留下详细的服务器操作方法给投资人之后离开公司,而当这种事情发生时,收购企业把它当成压价的砝码。

这些问题最后奇迹般地得到解决。投资人回来了;我们的公司得到了新的估价;而那个大公司给出一份对我们的软件不拥有产权的声明;而6个月以后我们被Yahoo以比前一家公司搞得多的价格收购。所以这还算是个皆大欢喜的结局,虽然我的寿命可能因为这次事件被缩短了几年。

别犯我们的错误,在你开始创业之前搞清每个合伙人的知识产权归属问题。

当你建立你的公司以后,可能你会觉得,去敲有钱人家的门,请求他们为你们的小主意提供上万的贷款,是一件很冒昧的 事情。不过如果你站在有钱人的立场上看,这件事情是很容易实现的。他们都在寻求良好的投资机会,如果你的项目真的有钱赚,实际上他们很愿意提供资金。甚至 他们可能这样想:这家伙会成为下一个Google吗?

通常天使投资金对创业者而言是一桩公平的买卖。他们和你分享股权及远期收益,而他们的股份取决于你对自己公司的预期。如果你用百分之X的股权换取Y的资金,这意味着你对整个公司的定价。例如,如果你用5%股权来换取10万美元,那意味着你的公司的价值是2百万美元。

至于你如何判断自己公司的价值,并没有一个固定的方法。某种意义上来说,创业公司就是一场赌博。当我创业的时候, 我并没有认识到这点。Julian认为我们应该把公司定价几百万美元,而我认为把当时我们仅有的几千行代码换算成几百万美元是一件荒唐的事。最后我们把公 司定位于100万,因为Julian说没有人回味了价值一百万以下的公司投资。

那时我还没有了解到,我们公司的价值并不取决于我们当时所写的代码。它还取决于我们正确的思路和创意,以及之后我们付出的诸多努力。

筹集资金的下一步是接触真正的风险投资公司。不过不要等到你的钱都快见底了才找他们,风投做出决策是很慢的,他们需要花几个月。而当你和他们周旋的时候,最好不要现金短缺。

从风投那里搞钱比从天时投资人那里搞钱麻烦得多。资金数额通常上百万,所以整场交易需要你更多的时间和精力,来面对更繁重的工作。

有时候风投会希望在公司里设置一个他们选定的CEO,因为他们会觉得你需要一个有商业背景,成熟稳重的领导者。也 许有时候这是对的,不过比尔大门兄白手起家的时候又没有经验又没有商科背景,而看上去他混得很好。乔布斯用了一个成熟稳重有商业背景的人来管理他的公司, 结果差点毁了它。所以我认为那些所谓成熟稳重有商业背景的家伙们得到了过高的估计。我们曾经把他们称为“播新闻的”,因为他们都梳着干净的头发,用一种深 沉而自信的声音讲话,而且除了提词装置上显示的话之外什么都不知道。

我们和不少风投接触过,但最后决定完全依靠天使投资金进行我们的创业。主要是因为我们害怕一个名牌风投公司会用一 个新闻播报员来收拾我们。如果他只是在那里摆摆样子,那还好。可要是他想要干涉公司运行怎么办?这将会造成一场灾难,我们的软件太复杂了,他根本不可能弄 懂。我们公司的核心价值都在先进的技术上,因此基本上所有的战略决策都是依据与我们的技术发展的,对此我们不需要外行人多嘴多舌。

这也是当时我们的软件没有上市的原因之一。在1998年我们的CFO曾经建议我做这件事。那时候你可以通过做一个类似于狗粮专卖的门户网站来成为一家优秀的售卖有利润的真实产品的上市公司。不过我害怕这会导致我们搞来一个播新闻的,那种所谓“有华尔街腔调的人”。

我很高兴看到Google给了这种趋势一个嘴巴。他们上市的时候根本不理睬所谓的华尔街强调,而华尔街的投资者也不买他们的股票,现在华尔街的所有人都想要踢自己的屁股了。他们会学会重视下次机会的,有利可图的事情他们总是学的很快。

你会有很多的机会和风投们打交道,比你想的要多得多。因为这世界上有很多很多的风头公司,而根据我跟他们打交道的经验——你也会学到的——这完全是个卖方市场。就算现在,市场上也有无穷多的空闲资金在寻找优秀的投资机会。

风投公司是金字塔型的,在顶端有像Sequoia和Kleiner Perkins这样的名人,但是其下有许许多多你听都没听到过的家伙,其共同点就是他们的一块钱就是值一块钱。大部分风投的人会告诉你,他们不仅提供资金,还提供关系和建议,如果你是在和Vinod Khosla或John Doerr或Mike Moritz谈交易,这是没错的。不过这些建议和关系是很昂贵的,而你会发现他们的手下不同层级的人按照职位大小其智商直线下降。从金字塔的顶端下来一点你就会不得不和那些只懂从Wired杂志上获取新知识的银行家谈生意了。(你们的产品使用XML么?)(不明白,程序员才懂的蠢话吧,总之就是火星人的意思,译注)所以我建议你们对所谓的经验和关系的价值保持怀疑态度。基本上,风投只是资金的来源,我倾向于和任何最快提供资金的人谈生意。

你可能不知道该告诉风投多少关于你们的情况。鉴于他们可能有一天投资于你的竞争对手,你应该尽量诚恳。良好的计划 不需要藏头露尾,不过也不需要抬头名。总而言之,就像许多风投说的,他们对于创业者的兴趣大于对项目的兴趣。他们和你谈你的计划主要是为了评价你这个人, 而不是你的创意。所以只要你表现得明白你在做什么,你也可以保留一点隐私。

和尽量多的风投交流,即使你不想要他们的钱。因为:a)他们可能带来希望收购你的公司的人, b)如果你表现得很强势,他们就不敢投资到你们的竞争对手身上去。如果你只是想让他们认识一下你而不是问他们要钱,接触风投最有效率的方式是,在某些创业 公司的展销会上向他们展示。

当你真的得到了启动资金以后,该如何使用呢?尽量节省着用,这是我的建议。几乎每场失败的创业都是直接因为资金断档造成的。当然其中可能有很多深层次的原因,但是这个最的直接原因是我们应该努力避免的。

在网络泡沫时期,几乎每个创业公司都想着“快快搞大”。理想状态下这意味着尽快争取到更多客户,但 实际操作的时候却很容易演变成马上雇佣很多员工。就算你能避免如果你能争取到许多客户,那敢情好,可是这种期望往往是不切实际的。人们总是想要第一个进占 市场然后囊括所有客户,一点空间都不留给竞争对手。不过我认为在绝大部分生意中先入优势都不会大到这种境界。我们再次以Google为例,当他们创始的时 候搜索引擎市场看上去是一个垄断市场,大企业依靠百万美金的营销创立他们的品牌效应:Yahoo, Lycos, Excite, Infoseek, Altavista, Inktomi。显然1998年对于加入搜索引擎的竞争是太晚了一点。

不过Google的创始人们发现,品牌在搜索领域几乎没有什么价值可言。你只要在任何一点上能做出更好的产品,用户们就会蜂拥而至。作为对这一观点的佐证,Google从来不打广告。他们就像一家经销商,销售那些自己也乐于使用的产品。

Google超越的那些竞争者们如果将百万美元花在提升软件水平上,可能还会取得更好一些的成绩。对于未来的创业 者而言这是一个很好的警示,除非你处于一个产品没有本质差异的市场上,例如香烟雪茄洗涤剂之类,不然,做一大堆广告只说明你的业务正变得越来越差。而网络 业务不应该会有什么很类似的产品,那些约会网站猛打广告,正说明他们快要完蛋了。(Fee, fie, fo, fum,我闻到这些公司背后市场营销总监的体味了)(我认为这些词只是模仿音调,没有什么特别含义,译注)

受环境所迫,我们公司的业务成长缓慢,但回头看来却是好事一件。每个创始人都充分掌握了公司的每项工作。除了写软 件,我还必须做销售和客户服务的工作。销售业务并不好做,我虽然一直在坚持,但明显我没有一个优秀的推销员所需要的那种耐心和诚恳。我给潜在客户提供的信 息是:你不在网上做销售实在太愚蠢了,如果你要在网上做销售,不用我们的软件同样是很愚蠢的。这些信息都是正确的,但显然不能让客人感到愉快。

不过我很擅长做客户服务的工作。想象一下,一个客服不仅对产品知无不详,而且在产品存在bug的时候还会发自内心 地道歉,并立刻在和你打电话的时间内修好它。客户们简直爱死我们了,当然我们也很爱他们。因为当你只能通过口耳相传来发展的时候,你的第一批客户一定是那 些主动发掘到你的优点的聪明人。在创业的早期阶段,没有什么比有头脑的客户更有价值的了。如果你倾听他们的话,他们能告诉你们很多提升你们产品的竞争力的 方法。除了给你这些免费的建议,他们还正在付给你可爱的美金。

我们的公司在1996年正式启动,到年底的时候我们有了大约70个客户。鉴于当时是“快快搞大”的年代,我对我们 公司的弱小很是担忧。不过事实上我们的发展方向才是正确的,太快的做大会让你的公司难以转向。第一年是我们提升产品质量的好时机,到了年底的时候我们的产 品质量已经远远超过竞争对手的想象了。而且因为每个公司里的黑客们都已经有了充分的客户交流体验,我们对于网络营销的理解远超任何对手。

这些条件是我们创业成功的基石。没有比真正理解你的生意更重要的事了。你可能以为任何做生意的人理所当然的应该理 解自己的业务,其实不然。Google成功的秘诀可以简单地归纳为,他们了解搜索业务。当他们创业的时候我正在为Yahoo工作,而我知道Yahoo不明 白搜索这件事,因为有一次我尝试告诉公司高层我们拥有更好的搜索系统的必要性,而我从内线得到了这样的回复:我们Yahoo不要再只做一个“搜索引擎” 了,搜索业务只是我们网络业务的一小部分,贡献还达不到我们一个月的增长率。我们已经是一家“传媒企业”,“门户网站”,或者其它什么高级玩意,搜索业务 有没有都无所谓,就跟脐带一样剪掉也没关系。

确实,搜索业务只是整个页面中很小的一部分,但那是很重要的一部分,因为那是网络服务的起点。我想,Yahoo现在学到这一点了。

绝大部分网络服务商不明白的事,Google却了然于心。第一条就是,就算广告商付钱给你而用户是免费的,你也必 须把用户放在广告商之前。我最喜欢的一张保险杠贴纸上写着,“如果群众开始自主,那领导者只能跟随。”。引用到网络业务中,这句话可以改成“争取到所有的 用户,广告就会挤破你的门槛”。所以首先要为你的用户设计好你的产品,然后才去考虑如何利用它赚钱。如果你不把用户放在首位,那你的竞争对手将会有机可 趁。

你必须了解用户心理,才能创造出他们喜欢的产品。你的公司越大,这件事就越困难。所以我说“慢慢成长”,你花钱花得越慢,你就有越多的时间去研究客户。

另一个节省开支的用意是形成一种勤俭的文化。这是Yahoo也很擅长的一件事。Yahoo的总裁David Filo,却对自己私底下的称号“吝啬鬼”很自豪。我们一到Yahoo就收到了他的Email,他浏览了我们的工作目录之后,询问我们是否真的需要把那么 多个人资料存储在公司昂贵的RAID硬盘里。我对此印象深刻,Yahoo作为一家市值十亿记的公司,仍然能够注意硬盘中每一个字节的浪费。

当你从风投哪里弄到几百万美元之后,你可能会感到自己已经挺有钱了。你要搞清楚这只是一种幻觉,那些有丰厚利润的公司才是有钱的公司。资本并不代表利润,那只是投资人希望你用来获取利润的道具。所以除了银行里公司帐户那几百万,你们基本上还是一个穷公司。

创业初期的公司形象,应该是一个刚毕业的大学生,而不是一家律所。以酷和廉价代替昂贵和震撼的视觉效果。我们可以 从一家创业公司是否使用Aeron chairs(某种按摩椅的知名品牌,译注)来判断他们是否明白这个道理。在网络泡沫时代,Aeron chairs在创业者中很流行。尤其是当那些公司都使用同样的型号的时候,场面就像一群用风投的钱玩过家家的小朋友。我们公司使用的椅子连扶手都没有,当 年看上去有点寒碜,但回头想想,这也是我们在不知情的情况下就作对的重要事情之一。

我们公司处于Harvard Square(哈佛广场,文化胜地,译注)的一幢木制三层楼中。1970年之前这里是一间公寓,浴室里还有有爪足浴缸的存在(claw-footed bathtub,高级货,小的没见过也没听过,译注)。这房子墙壁上用铝箔填充来阻挡宇宙射线的裂缝,代表着它曾经有过某个思路很特别的主人。当某些大人 物来访问我们的办公室的时候,我们对于这幢房子的层次确实深感汗颜。不过事实上这里是一个很适合创业公司的地方,我们的角色不是那些平庸的制服组,而是虽 然弱小,却勇于开创突破的幼兽。这正是创业者该有的心态。

一幢老式公寓同时也是软件开发的好场所。如果你尝试一下,你会发现分割成立方体的空间很合适编写软件的状态。有没有发现黑客们在家里的小空间比在办公室里工作显得轻松自在得多?那你为何不把办公室弄得像嘉一样呢。

当你选择创业公司的地点时,不要仅仅挑选那些会让你们看上去比较专业的地方。专业这个词代表优秀的工作成果,而不是电梯和玻璃墙。我建议创业者们尽量避免驻扎在专业办公楼,租一个公寓就好。创业的时候,你会经常想要索性住在办公室里,那何不就弄个可以住的办公室呢。

除了更便宜且便于工作,公寓往往还比办公楼位于更好的地段,在创业中这是很重要的。生产力的关键在于晚饭后的加 班。这没有电话铃声骚扰的几个小时是工作出成果的最好时机。当你的员工成群结队地处去吃饭,在餐桌上讨论问题,然后回来解决它们的时候,你们的产品会发生 了不起的进化。一旦你的公司进入那种所有人一下班就开个车回郊区的家里吃晚饭的境界,某些特别重要的理念基本上就不复存在了。如果你一开始创业就进入这样 的阶段,那你只能求神保佑了。

今天如果我要再次创业,我只会考虑以下三个地点。on the Red Line near Central, Harvard, or Davis Squares (Kendall is too sterile); in Palo Alto on University or California Aves; and in Berkeley immediately north or south of campus. (地名,请恕我懒得翻译,译注)这些我所知仅有的有创业成功希望的地方。

节省开支最重要的方法就是雇佣尽量少的员工。我可能有点极端,但我还是觉得雇佣新员工是一个公司所能做的最烂的 事。在创业阶段,人工成本是巨大而令人最为讨厌的经常性开支。雇佣更多的人往往意味着过度的发展,甚至必须搬到一些不适合软件开发工作的地方。而最大的问 题是,雇佣更多的人会让你的工作效率降低:以前只要把头伸进某个办公室三言两语解决的问题,现在要找齐八个人一起开个大会。所以你应该雇佣尽可能少的员 工。

在网络泡沫时代很多创业公司采用了相反的方法,他们就想着尽快把自己做大,好像没有相关头衔的一个大部门你就没法做任何事情似的。大公司才可以这样做事情。不要雇佣人来填满你未来的组织结构图,雇佣新人的唯一理由是你有些想要做的工作没人能够完成。

既然雇佣不必要的员工又昂贵又没有效率,为什么几乎每个公司都这么干呢?我认为主要是因为人们喜欢有很多人为自己 工作的感觉。这是一种劣根性,尤其体现在CEO身上。如果你曾经掌握一家公司,你会发现人们问的最多的问题是你有多少雇员,这是别人判断你的身价的一种方 式。不仅仅是一般交往中人们会问,那些写新闻的也会注重这一点。而且他们对于上千人的公司会刮目相看,而10个人的就不屑一顾。

这太荒唐了,如果两家有相同收益的公司,员工数量较少的那家明显经营得更好。当别人问我我创业时有多少员工,我总 是回答“20个”,而他们就会摆出那种明显不以为然的表情。我曾经想过加上这么一句“不过我们的主要竞争对手,那个有140个雇员的家伙,一直被我们打得 落花流水。要不然我们用这两个数字间比较大的那个来申请贷款你看如何?”

考虑到办公室空间,你的员工数量最好保持在看上去紧凑和真的拥挤之间。任何一个读过大学的聪明人(nerds,类似于极客,本人认为用聪明人足以表达在这里的意思,明显作者喜欢新鲜的词汇,译注)都会明白这个道理。当你创业的时候,别忘了保持这个员工数量。

你有决心么?

问自己以下问题。我应该创业么?我行么?值得冒这个险么?

绝大部分人比他们自己所一直以为的更适合创业这件事,这是我写这篇文章的主要原因。世界上其实有比现在创业的人数更多10倍的潜在创业者,如果他们都进入市场,一切会变得更美好。

我现在才意识到,当时我的确已经是一个很适合创业的人,虽然这个想法曾经让我感到恐惧。作为一个LISP流的黑 客,我是被迫创业的,因为我原先打工的咨询公司出了麻烦,而市场上又没有多少使用LISP的公司。因为我实在不能容忍用另一种程序语言写代码(在1995 年,所谓另一种语言就是C++),我不的不考虑自己创立一家使用LISP写程序的公司。

我知道这听上去有点不可思议,但如果你也是一个LISP流的黑客你就会明白我的意思了。我在只有创业这一条路的时 候才选择开设自己的公司,仅仅因为这件事情本身在当时的我看来太过于困难了。有鉴于此,世上肯定还有很多适合创业的人却因为被这件事困难的外表吓阻而没有 这么做。

那么谁应该自己创业呢?一个23到38岁之间,想要一口气解决财政问题而不是在打工的地方无聊地消磨时光的黑客。

我不能给出一个优秀的黑客的定义。在一家一流大学里这个词可能可以指计算机专业排名前50%的学员。但其实你不需要在大学里学计算机就可以做一个黑客,比如我在大学里学的是哲学。

在你还年轻的时候,想要搞明白自己是不是真正优秀的黑客是很困难的。幸运的是,创业的过程会自动地对你们的水平做筛选。技术人员创业的动力在于,或者应该在于以挑剔的眼光看待现存的某项技术,并且发现他们的各种缺点和解决的方法。同时这也是一个优秀黑客所应该具有的特征。

我把创业的下限定于23岁是因为在创业之前,你需要自己看一下别人如何经营他们的公司,而不是因为你的头脑如何如 何不成熟。你的学习对象并不一定要选择创业公司。我用了一年时间为一家软件公司工作以偿还我的助学贷款,而这真是我成人后最糟糕的一年。不过虽然当时还没 意识到,我确实在那里学到了软件生意中一些很重要的知识。某种意义上来说,那家公司完全是反面典型:没有会议;没有多人掌握的核心代码;没有专门负责销售 和运营的人员;不做高端产品;不让人写太长的代码;不理会售后人员对于程序bug的意见;不仅最大努力就放弃;不从客户那里吸取教训;不把办公室从Cambridge搬到Route128,等等等等。不过反面教材和正面教材一样有效,甚至更有效。因为灵光一现的创意是很难复制的,但是避免错误却总是可能的。

另一个23岁之前很难创业的理由,是人们不会把太年轻的你当一回事。风投不会相信你的能力,他们只把你当成一个骗 取投资的小丑。客户们担心你的信誉,害怕你会突然撒手不管。正常情况下,就连你自己在某些方面都会怀疑自己。雇佣一个比你年长的人是很尴尬的,而21岁就 当老板的你可能只想选择21岁以下的家伙,这样当然会更难发现人才。

有些猛人乐于在18岁就开始创业。当比尔大门和保罗艾伦一起创办微软的时候,他才19岁。(Paul是22岁,所以这件事情可能不是我们所以为的那样特别。)如果你觉得,无论别人说什么,你都必须立刻开始创业,那就尝试去做吧。

另一头,我选择38岁作为创业的底线,是有很多理由的。首先是因为我觉得自己做老板所需要的体力巨大,很难想象一个将近40的人还能支持住。那时候我能够坚持每天工作到凌晨两三点,而现在我很怀疑自己的体力能不能做到。

另一方面,创业是件冒险的事情。如果你尝试去做,结果在26岁的时候破产了,那还好,许多创业者大约26岁时都破产过。不过38岁的时候,你大概就很难承受这种危险了——尤其是为了你的孩子考虑,如果你有的话。

最后一个问题可能相当沉重。你确定你真的想要自己创业么?从经济角度来考虑,你的职业生涯可能从此走到一条独木桥上。你不再有安稳地工作40年的权力了,取而代之的可能是像地狱一样艰苦的四年。甚至你还可能破产——这件事倒是不需要四年那么久。

在创业的时候,你可能几乎没有时间做工作以外的事情。因为即使在你休息的时候,你的竞争者们也在前进。我唯一的娱 乐活动是跑步,因为这是我保持健康的唯一手段,另加上15分钟的睡前阅读。3年中我只有两个月的时候有一个女朋友,而每两星期我去一次二手书店或者去朋友 家吃一次晚饭,每星期回父母那里一次。其它时间,全都在工作上了。

鉴于我的合作伙伴都是我的好朋友,工作还算是有趣。在10%的时间里它甚至相当让人喜爱。对于另90%的时间,我能说的只是,事后回头看看它们,还挺有意思的。比如Cambridge断电的6小时,还有我们灾难性的在办公室里使用汽油发电机的尝试,不过我可不想再经历一次。

我并不认为创业的过程会比你的打工生涯发生更多的恶心事件。其实我想总数还要少一点,但是因为它们都挤在一段短短 的时间内,所以看上去特别多。所以说,创业给你的最大回报就是时间。如果你在考虑开始做,首先想想你对自由的时间的感觉。如果你是那种不愿意勤恳工作40 年,而是希望一次性地解决经济问题的人,那你应该选择创业。

很多人需要在创业和学业之间做出选择。大学生正处于合适的年纪,并且也正是软件业合适的创业人选。你可能会担心开 公司会打乱你的学习计划而失去进一步深造的机会。不过在学校里就可以创业,在创业初期边读书边搞公司其实是很简单的。我们的三个创始人中有两个全天在学校 里,并且都拿到了文凭。几乎没有什么比一个延期毕业的学生更有冲劲的人了。

如果因为创业你必须离开学校,好歹这种痛苦不会持续太长时间。如果创业是失败的,一般它都会在你失去回到学校的机会之前就结束。如果它成功了,你就不再留恋无聊的助教生涯了。

如果你真的想创业,尽管去做吧。开公司并不是什么难事,你不需要理解什么“做生意的奥秘”之类的玩意。创造一些人们会喜欢使用的东西,然后尽量节省开支保证有钱赚,仅此而已。不是很简单么?

18+成人寓言,流氓的泡妞哲学

①蛇与乌龟的故事

一条大蟒蛇和一条小毒蛇是朋友。

这天他们在路边发现了一只巨大的乌龟。

蛇兄弟想,这么大的个儿,可是一顿美餐啊。

蟒蛇说:我来对付他。

于是蟒蛇施展自己的绝技,用身体将大乌龟牢牢地缠住。

而大乌龟早已将身体缩进了壳里,任凭蟒蛇怎么缠绕,也无法伤害到大乌龟。

泄气的蟒蛇,气喘吁吁地爬到了一边。

大乌龟谨慎地露出脑袋,在他露出脑袋的那一瞬间,小毒蛇闪电般地在乌龟脑袋上咬了一口,

大乌龟又急忙缩回壳中。但是几分钟后,大乌龟因为中毒而死了。

蟒蛇说:哇!我花了那么大力气也没能伤害乌龟,你却轻而易举地办到了啊。

小毒蛇说:因为我了解他的要害。

可是接下来的还是有一个问题,大乌龟死后依然缩在壳里,两条蛇都是吞食性的动物,

而他们又无法脱下乌龟的外壳,只好怏怏地离开了……

这个故事告诉我们:即使你擅长死缠烂打,也未必能泡到那个妞,要了解那个妞才可以。

这个故事还告诉我们:如果你无法脱下那个妞的衣服,就不要再花力气去泡她了。

②寄居蟹

一只公寄居蟹找到了一只很大的空贝壳,便把贝壳清理干净,做成了自己的房子。

有了房子的公寄居蟹很快找到了一只母寄居蟹,他们快乐地生活在这个大房子里。

每天他们出门,母寄居蟹就自由快乐地遨游,觅食,而公寄居蟹背着沉重的房子艰难地跟在母寄居蟹身后。

母寄居蟹游一段路就要停下来等公蟹。

这样的生活过了没多久,有一天母寄居蟹跟着一只无拘无束的龙虾一起游走了,再也没有回来,

而公寄居蟹无法丢下他沉重的房子,只能眼睁睁地看着母寄居蟹游远、游远、游远,渐渐消失,不见……

这个故事告诉我们:如果你有一所房子,那你泡妞的难度将降低。

这个故事还告诉我们:如果你的房子成为了你的重负,那么你以后的生活将变得痛苦不堪。
所以在决定是否分期买房的时候请先衡量一下得与失。

③别以为只有帅哥才会伤害女孩

一条不懂事的美丽小蛇在水边看见了一只有着漂亮花纹、皮肤超好的青蛙,不禁生出了爱慕之心。

小蛇对青蛙说:我们可以交往吗?

青蛙说:好啊好啊。

于是他们两个生活在了一起。

有一天,他们在睡觉的时候,小蛇在睡梦中不由自主地用身体将青蛙缠了起来,

青蛙感觉要窒息了,就奋力挣扎,用两条强壮而有力的后腿重重地蹬在小蛇的腹部,

弹了出去,然后迅速地逃走了,再也没有回来。

伤心的小蛇养好了身上的伤,却无法养好心中的伤,她对帅气漂亮的青蛙产生了恐惧感,

认为会被伤害,从此她过着单身生活。

这一天,一只丑陋的癞蛤蟆发现了小蛇,觉得她十分美丽,不禁生出了爱慕之心。

癞蛤蟆对小蛇说:我们可以交往吗?

小蛇看了看丑陋的癞蛤蟆,觉得他的眼神很真诚,她那颗寂寞的心动摇了,

她想这只癞蛤蟆这么丑陋,应该会好好珍惜她这么漂亮的小蛇的,于是她说:好吧好吧。

于是他们两个生活在了一起。

有一天,他们在睡觉的时候,小蛇在睡梦中不由自主地用身体将癞蛤蟆缠了起来,

癞蛤蟆感觉要窒息了,就奋力挣扎,他的背上喷出了毒汁,射进了小蛇的眼睛,

小蛇受痛展开了身体,癞蛤蟆趁机逃走了,再也没有回来。

这个故事告诉我们:别以为只有帅哥才会伤害女孩,丑男一样会伤害女孩,那么美丽的女孩你为何不去选择帅哥呢?

这个故事还告诉我们:适当的缠绵是可以的,但是如果你的性要求太频繁,给男人压力太大,那么男人会被你吓跑的。

④天鹅与鸭子

一只美丽的天鹅有一天落在地上时,看见了一只健壮的鸭子,她立刻被这只帅气的鸭子所打动,

她惊诧于鸭子不同于她同类的模样,不同于她同类气质,是那么的有型,那么的另类。

于是,天鹅向鸭子表明了爱意。受宠若惊的鸭子立刻接受了这份爱。

从此,天鹅与鸭子在土地上生活着,在泥塘边生活着。

天鹅那高贵而雪白的羽毛一天天被污脏了;天鹅那以前不会长期行走的美丽小脚红肿了;

天鹅失去了云彩的抚摩,蓝天的洗涤。

天鹅终于忍不住了,她总是在说:鸭子,鸭子,你学习飞翔啊,那我们就可以一起在高空中比翼双飞了。

鸭子为了天鹅而努力学习飞翔,可惜他只是一只鸭子,

想要飞翔,想要飞到和天鹅飞翔一样的高度实在是太难了,他实在是没有毅力了,于是他放弃了。

鸭子说:天鹅,你抓住我,带我去飞吧。

天鹅抓住鸭子,扇动翅膀,非常非常吃力地飞上了蓝天,在天上飞了一会儿就落地了。

鸭子笑了,鸭子觉得天上风景太美了,鸭子想爱上了天鹅真是好。

在那之后的日子里,鸭子每天都要求天鹅带他飞上天,而且要求飞翔的时间也越来越长,

如果天鹅不能达到要求他就会生气。

疲惫的天鹅因为爱着鸭子,虽然身心俱疲,却依然会答应鸭子的要求。

这一天,鸭子又让天鹅带他去飞上蓝天,天鹅勉强抓住鸭子飞上了,飞得很高,很高,很高,

然后天鹅低下头深深地吻了鸭子,就在鸭子感觉诧异的时候,天鹅松开了抓住鸭子的手……

这个故事还告诉我们:公主爱上穷小子的故事并非没有,只是结局未必会那么完美。无论如何,阶级总是存在的,门当户对未必就是坏观念。攀上一个富家女确实会令你生活质量提高,但并不代表你可以免于奋斗。富家女会让你飞得很高,但也会让你死得很惨。

这个故事告诉我们:做人要懂得知足,美女愿意让你上就很好了,千万不要要求太高,不要“天天想上”!

⑤男人好色并不是什么可耻的事
 
某公司新来了一位女同事,是位美艳少妇。是从公司的分部调来的,

分部和公司总部在两个城市,但是互相之间会有一些来往。
  
从分部其他同事处了解到,这个美少妇已经离异,且生活比较放纵,

跟很多男人都有暧昧关系。于是公司的两个男人便生出了上她的想法――――男人A和男人B。
  
男人A每天等到美少妇下班,故意和她一起乘坐电梯,然后趁机偷偷地碰一下美少妇的屁股,

或者碰一下美少妇的胸部,或者顶一下美少妇屁股。男人A想这样来勾引美少妇,以达到上她的目的。
  
可是,美少妇要么装着不知道,要么就的对他怒目而视,最终男人A放弃了。
  
男人B了解到美少妇之所以离婚是因为她的男人太软弱,她喜欢强势的男人。

有一天在电梯里,他粗鲁地堵住美少妇,很直接地说道:我想和你一夜情。

美少妇惊讶地张大了嘴巴,片刻又恢复正常,她答应了男人B。男人B从此便成为了美少妇的府上常客。
  
这个故事告诉我们:机会永远只留给有准备的人,有准备才能及时正确地抓住机会。
  
这个故事还告诉我们:男人好色并不是什么可耻的事,真正令人无法忍受的是猥琐!想上就上要上得精彩!千万不要猥琐又变态。

⑥别以为有文化就了不起,这个故事发生在古代。
  
说有一个秀才在酒楼吃饭,见到一个妓 女,便心生*念,欲上之。
  
于是,秀才冲妓 女叫道:为妓者过来!
  
妓 女听不懂他说的“为妓者”是什么意思,但是听懂了“过来”二字,就走到秀才身边。
  
秀才又说:其价几何?
  
妓 女只听懂了一个“价”字,便告诉他做一次的价格。   

秀才接着说:汝发黄矣,躯干色竭,请损其价。
  
妓 女骂了一句:损你老母!转身便走了。
   
这个故事告诉我们: 别以为有文化就了不起,一样会被别人藐视。
  
这个故事还告诉我们:男人好色并不可耻,可耻的是那些装逼的人!

⑦小象和猪
 
一只小象出门旅行,在路上碰到了同样旅行的小猪。   

小象看着小猪,忍不住哈哈大笑着说:你的鼻子那么短,真是太好笑了,太差劲了,哈哈。   

小猪反驳道:笑个P啊,你鼻子那么长,就象脸上长个J8似的,还笑呢。
  
两个小家伙互相嘲笑着前行,继续他们的旅行路程。  
 
他们来到了一颗苹果树前,又红又大的苹果挂满了树冠膨大的苹果树。两只小家伙不禁口水横流,垂涎三尺。
  
小象来到树下,用他的长鼻子轻松地将苹果击落下来。于是两只小家伙开开心心地吃起来。
  
小猪边吃边说:原来你的鼻子也不是那么讨厌嘛,嘿嘿。
  
吃完苹果,他们继续前行。
  
走着走着,他们来到了一块番薯地。
  
小猪说:看我的。
  
说完,小猪用他的鼻子去拱地,拱啊拱啊,把埋在地下的番薯都拱了出来。于是两只小家伙开开心心地吃起来。   
小象边吃边说:原来你的鼻子也不是那么差劲嘛,哈哈。
   
这个故事告诉我们:不要总以为自己的才是最好的,不要总看到别人的缺点,要学会看到别人的优点,取长补短,学为己用。
  
这个故事还告诉我们:不要以为长的就是好的,有时候短的也不错哦。长的有充实感,短的有灵活性,各有各的好嘛,各位女性朋友~~~~ (有什么想法~~~汗)

⑧人不可貌相,海水不可斗量
 
这一天,曹先生和曹太太在露天餐厅吃饭。
  
饭中,曹先生去上洗手间,饭桌前只剩下曹太太一人。
  
这时,一个衣着邋遢,蓬头垢面的男子突然坐到了曹太太的对面,

冲着曹太太傻笑,并说道:美女,我要和你干一晚上,嘿嘿。
  
曹太太又惊又怒,骂道:滚开,你这个臭流氓,神经病!
  
邋遢男子依然笑眯眯地说:美女,和我干一晚上吧,嘿嘿。
  
曹太太大叫起来,曹先生急忙从洗手间赶了回来,看见邋遢男子也吃了一惊,冲上前就要动粗。
  
此时,邋遢男子笑嘻嘻地说道:我刚赢了大奖,我想花一百万和这个美女干一晚上,嘿嘿。
  
曹先生一听,愤怒的脸变了几下,最终变成了笑容,

他柔声道:一百万啊,不知道先生是想在宾馆干还是在我家干呢?
  
此时的曹太太也脸色大变,一脸媚态地说:不知道先生是喜欢男上女下式,还是男下女上式呢?
  
刚说完,就看见一辆白车急刹车停在了他们旁边,车上冲出几个白大褂的男人将邋遢男子绑上车,

就那么走了,只留下一脸错愕的曹先生、曹太太和邻桌满脸鄙夷的食客们。
  
这个故事告诉我们:人不可貌相,海水不可斗量。   

这个故事还告诉我们:在利益的诱惑面前,如果要付出代价,一定要先确定自己会得到利益,再去考虑该不该付出代价。

⑨永远不要以为自己比别人聪明多少
 
某公司的一个男??会亲近她,希望能和她发生关系。
  
男职员绞尽脑汁地想啊想,终于他想了一个办法:公司的地下室是存放一些办公用品的地方,

几乎很少人会进去,而且隔音效果很好……
  
这一天公司里仅有男职员和美女以及其他几个人在加班,男职员想机会来了。
  
男职员以请美女帮忙一起到地下室拿一些办公用品为由,带着美女来到了地下室。
  
进了地下室后,男职员趁美女没注意把门给锁上了,然后大叫:糟糕!
  
美女问怎么了?
  
男职员说:这门被锁上了,从里面要有钥匙才能开,我钥匙忘记带了,真是糟糕啊。
  
美女说:啊!那怎么办啊?我们出不去啦。
  
男职员不停地安慰美女,安慰着安慰着,两个人就搂抱在了一起,

然后,两个人干柴烈火似的干了起来…… 一番云雨后,二人穿戴整齐。
  
男人点了根烟,心满意足地抽着,为自己的聪明计策洋洋得意。
  
这时候,美女说话了:你还不错,比我之前想象的要棒。

另外,告诉你,我和姐妹们打赌能不能吊上你,我赢了,哈哈。
  
说完,美女从衣服里掏出钥匙,打开门,高跟鞋哒哒哒地走了。
  
留在地下室的男职员目瞪口呆,错楞在那里。
  
这个故事告诉我们:永远不要以为自己比别人聪明多少,在你从别人身上得到利益时,可能更多时候别人从你身上获得了更多的利益。
   
这个故事还告诉我们:不要以为只有男人才是好色的,其实女人也会好色。

中国惠普前总裁孙振耀谈工作与生活

我有个有趣的观察,外企公司多的是25-35岁的白领,40岁以上的员工很少,二三十岁的外企员工是意气风发的,但外企公司40岁附近的经理人是很尴尬的。我见过的40岁附近的外企经理人大多在一直跳槽,最后大多跳到民企,比方说,唐骏。外企员工的成功很大程度上是公司的成功,并非个人的成功,西门子的确比国美大,但并不代表西门子中国经理比国美的老板强,甚至可以说差得很远。而进外企的人往往并不能很早理解这一点,把自己的成功90%归功于自己的能力,实际上,外企公司随便换个中国区总经理并不会给业绩带来什么了不起的影响。好了问题来了,当这些经理人40多岁了,他们的薪资要求变得很高,而他们的才能其实又不是那么出众,作为外企公司的老板,你会怎么选择?有的是只要不高薪水的,要出位的精明强干精力冲沛的年轻人,有的是,为什么还要用你?

从上面这个例子,其实可以看到我们的工作轨迹,二三十岁的时候,生活的压力还比较小,身体还比较好,上面的父母身体还好,下面又没有孩子,不用还房贷,也没有孩子要上大学,当个外企小白领还是很光鲜的,挣得不多也够花了。但是人终归要结婚生子,终归会老,到了40岁,父母老了,要看病要吃药,要有人看护,自己要还房贷,要过基本体面的生活,要养小孩……那个时候需要挣多少钱才够花才重要。所以,看待工作,眼光要放远一点,一时的谁高谁低并不能说明什么。

从这个角度上来说,我不太赞成过于关注第一份工作的薪水,更没有必要攀比第一份工作的薪水,这在刚刚出校园的学生中间是很常见的。正常人大概要工作35年,这好比是一场马拉松比赛,和真正的马拉松比赛不同的是,这次比赛没有职业选手,每个人都只有一次机会。要知到,有很多人甚至坚持不到终点,大多数人最后是走到终点的,只有少数人是跑过终点的,因此在刚开始的时候,去抢领先的位置并没有太大的意义。刚进社会的时候如果进500强公司,大概能拿到3k-6k/月的工资,有些特别技术的人才可能可以到8k/月,可问题是,5年以后拿多少?估计5k-10k了不起了。起点虽然高,但增幅有限,而且,后面的年轻人追赶的压力越来越大。

我前两天问我的一个销售,你会的这些东西一个新人2年就都学会了,但新人所要求的薪水却只是你的一半,到时候,你怎么办?

职业生涯就像一场体育比赛,有初赛、复赛、决赛。初赛的时候大家都刚刚进社会,大多数都是实力一般的人,这时候努力一点认真一点很快就能让人脱颖而出,于是有的人二十多岁做了经理,有的人迟些也终于赢得了初赛,三十多岁成了经理。然后是复赛,能参加复赛的都是赢得初赛的,每个人都有些能耐,在聪明才智上都不成问题,这个时候再想要胜出就不那么容易了,单靠一点点努力和认真还不够,要有很强的坚忍精神,要懂得靠团队的力量,要懂得收服人心,要有长远的眼光……

看上去赢得复赛并不容易,但,还不是那么难。因为这个世界的规律就是给人一点成功的同时让人骄傲自满,刚刚赢得初赛的人往往不知道自己赢得的仅仅是初赛,有了一点小小的成绩大多数人都会骄傲自满起来,认为自己已经懂得了全部,不需要再努力再学习了,他们会认为之所以不能再进一步已经不是自己的原因了。虽然他们仍然不好对付,但是他们没有耐性,没有容人的度量,更没有清晰长远的目光。就像一只愤怒的斗牛,虽然猛烈,最终是会败的,而赢得复赛的人则象斗牛士一样,不急不躁,跟随着自己的节拍,慢慢耗尽对手的耐心和体力。赢得了复赛以后,大约已经是一位很了不起的职业经理人了,当上了中小公司的总经理,大公司的副总经理,主管着每年几千万乃至几亿的生意。

最终的决赛来了,说实话我自己都还没有赢得决赛,因此对于决赛的决胜因素也只能凭自己的猜测而已,这个时候的输赢或许就像武侠小说里写得那样,大家都是高手,只能等待对方犯错了,要想轻易击败对手是不可能的,除了使上浑身解数,还需要一点运气和时间。世界的规律依然发挥着作用,赢得复赛的人已经不只是骄傲自满了,他们往往刚愎自用,听不进去别人的话,有些人的脾气变得暴躁,心情变得浮躁,身体变得糟糕,他们最大的敌人就是他们自己,在决赛中要做的只是不被自己击败,等着别人被自己击败。这和体育比赛是一样的,最后高手之间的比赛,就看谁失误少谁就赢得了决赛。

根源

你工作快乐么?你的工作好么?

有没有觉得干了一段时间以后工作很不开心?有没有觉得自己入错了行?有没有觉得自己没有得到应有的待遇?有没有觉得工作像一团乱麻每天上班都是一种痛苦?有没有很想换个工作?有没有觉得其实现在的公司并没有当初想象得那么好?有没有觉得这份工作是当初因为生存压力而找的,实在不适合自己?你从工作中得到你想要得到的了么?你每天开心么?

天涯上愤怒的人很多,你有没有想过,你为什么不快乐?你为什么愤怒?

其实,你不快乐的根源,是因为你不知道要什么!你不知道要什么,所以你不知道去追求什么,你不知道追求什么,所以你什么也得不到。

我总觉得,职业生涯首先要关注的是自己,自己想要什么?大多数人大概没想过这个问题,唯一的想法只是——我想要一份工作,我想要一份不错的薪水,我知道所有人对于薪水的渴望,可是,你想每隔几年重来一次找工作的过程么?你想每年都在这种对于工作和薪水的焦急不安中度过么?不想的话,就好好想清楚。饮鸩止渴,不能因为口渴就拼命喝毒药。越是焦急,越是觉得自己需要一份工作,越饥不择食,越想不清楚,越容易失败,你的经历越来越差,下一份工作的人看着你的简历就皱眉头。于是你越喝越渴,越渴越喝,陷入恶性循环。最终只能哀叹世事不公或者生不逢时,只能到天涯上来发泄一把,在失败者的共鸣当中寻求一点心理平衡罢了。大多数人都有生存压力,我也是,有生存压力就会有很多焦虑,积极的人会从焦虑中得到动力,而消极的人则会因为焦虑而迷失方向。所有人都必须在压力下做出选择,这就是世道,你喜欢也罢不喜欢也罢。

一般我们处理的事情分为重要的事情和紧急的事情,如果不做重要的事情就会常常去做紧急的事情。比如锻炼身体保持健康是重要的事情,而看病则是紧急的事情。如果不锻炼身体保持健康,就会常常为了病痛烦恼。又比如防火是重要的事情,而救火是紧急的事情,如果不注意防火,就要常常救火。找工作也是如此,想好自己究竟要什么是重要的事情,找工作是紧急的事情,如果不想好,就会常常要找工作。往往紧急的事情给人的压力比较大,迫使人们去赶紧做,相对来说重要的事情反而没有那么大的压力,大多数人做事情都是以压力为导向的,压力之下,总觉得非要先做紧急的事情,结果就是永远到处救火,永远没有停歇的时候。(很多人的工作也像是救火队一样忙碌痛苦,也是因为工作中没有做好重要的事情。)那些说自己活在水深火热为了生存顾不上那么多的朋友,今天找工作困难是当初你们没有做重要的事情,是结果不是原因。如果今天你们还是因为急于要找一份工作而不去思考,那么或许将来要继续承受痛苦找工作的结果。

我始终觉得我要说的话题,沉重了点,需要很多思考,远比唐笑打武警的话题来的枯燥乏味,但是,天下没有轻松的成功,成功,要付代价。请先忘记一切的生存压力,想想这辈子你最想要的是什么?所以,最要紧的事情,先想好自己想要什么。

什么是好工作

当初微软有个唐骏,很多大学里的年轻人觉得这才是他们向往的职业生涯,我在清华bbs里发的帖子被这些学子们所不屑,那个时候学生们只想出国或者去外企,不过如今看来,我还是对的,唐骏去了盛大,陈天桥创立的盛大,一家民营公司。一个高学历的海归在500强的公司里拿高薪水,这大约是很多年轻人的梦想,问题是,每年毕业的大学生都在做这个梦,好的职位却只有500个。

人都是要面子的,也是喜欢攀比的,即使在工作上也喜欢攀比,不管那是不是自己想要的。大家认为外企公司很好,可是好在哪里呢?好吧,他们在比较好的写字楼,这是你想要的么?他们出差住比较好的酒店,这是你想要的么?别人会羡慕一份外企公司的工作,这是你想要的么?那一切都是给别人看的,你干吗要活得那么辛苦给别人看?另一方面,他们薪水福利一般,并没有特别了不起,他们的晋升机会比较少,很难做到很高阶的主管,他们虽然厌恶常常加班,却不敢不加班,因为“你不干有得是人干”,大部分情况下会找个台湾人香港人新加坡人来管你,而这些人又往往有些莫名其妙的优越感。你想清楚了么?500强一定好么?找工作究竟是考虑你想要什么,还是考虑别人想看什么?

我的大学同学们大多数都到美国了,甚至毕业这么多年了,还有人最近到国外去了。出国真的有那么好么?我的大学同学们,大多数还是在博士、博士后、访问学者地挣扎着,至今只有一个正经在一个美国大学里拿到个正式的教职。国内的教授很难当么?我有几个表亲也去了国外了,他们的父母独自在国内,没有人照顾,有好几次人在家里昏倒都没人知道,出国,真的这么光彩么?就像有人说的“很多事情就像看A片,看的人觉得很爽,做的人未必。”

人总想找到那个最好的,可是,什么是最好的?你觉得是最好的那个,是因为你的确了解,还是因为别人说他是最好的?即使他对于别人是最好的,对于你也一定是最好的么?

对于自己想要什么,自己要最清楚,别人的意见并不是那么重要。很多人总是常常被别人的意见所影响,亲戚的意见,朋友的意见,同事的意见……问题是,你究竟是要过谁的一生?人的一生不是父母一生的续集,也不是儿女一生的前传,更不是朋友一生的外篇,只有你自己对自己的一生负责,别人无法也负不起这个责任。自己做的决定,至少到最后,自己没什么可后悔。对于大多数正常智力的人来说,所做的决定没有大的对错,无论怎么样的选择,都是可以尝试的。比如你没有考自己上的那个学校,没有入现在这个行业,这辈子就过不下去了?就会很失败?不见得。

我想,好工作,应该是适合你的工作,具体点说,应该是能给你带来你想要的东西的工作,你或许应该以此来衡量你的工作究竟好不好,而不是拿公司的大小,规模,外企还是国企,是不是有名,是不是上市公司来衡量。小公司,未必不是好公司,赚钱多的工作,也未必是好工作。你还是要先弄清楚你想要什么,如果你不清楚你想要什么,你就永远也不会找到好工作,因为你永远只看到你得不到的东西,你得到的,都是你不想要的。

可能,最好的,已经在你的身边,只是,你还没有学会珍惜。人们总是盯着得不到的东西,而忽视了那些已经得到的东西。

普通人

我发现中国人的励志和国外的励志存在非常大的不同,中国的励志比较鼓励人立下大志愿,卧薪尝胆,有朝一日成富成贵。而国外的励志比较鼓励人勇敢面对现实生活,面对普通人的困境,虽然结果也是成富成贵,但起点不一样,相对来说,我觉得后者在操作上更现实,而前者则需要用999个失败者来堆砌一个成功者的故事。

我们都是普通人,普通人的意思就是,概率这件事是很准的。因此,我们不会买彩票中500万,我们不会成为比尔盖茨或者李嘉诚,我们不会坐飞机掉下来,我们当中很少的人会创业成功,我们之中有30%的人会离婚,我们之中大部分人会活过65岁……

所以请你在想自己要什么的时候,要得“现实”一点,你说我想要做李嘉诚,抱歉,我帮不上你。成为比尔盖茨或者李嘉诚这种人,是靠命的,看我写的这篇文章绝对不会让你成为他们,即使你成为了他们,也绝对不是我这篇文章的功劳。“王侯将相宁有种乎”但真正当皇帝的只有一个人,王侯将相,人也不多。目标定得高些对于喜欢挑战的人来说有好处,但对于大多数普通人来说,反而比较容易灰心沮丧,很容易就放弃了。

回过头来说,李嘉诚比你有钱大致50万倍,他比你更快乐么?或许。有没有比你快乐50万倍,一定没有。他比你最多也就快乐一两倍,甚至有可能还不如你快乐。寻找自己想要的东西不是和别人比赛,比谁要得更多更高,比谁的目标更远大。虽然成为李嘉诚这个目标很宏大,但你并不见得会从这个目标以及追求目标的过程当中获得快乐,而且基本上你也做不到。你必须听听你内心的声音,寻找真正能够使你获得快乐的东西,那才是你想要的东西。

你想要的东西,或者我们把它称之为目标,目标其实并没有高低之分,你不需要因为自己的目标没有别人远大而不好意思,达到自己的目标其实就是成功,成功有大有小,快乐却是一样的。我们追逐成功,其实追逐的是成功带来的快乐,而非成功本身。职业生涯的道路上,我们常常会被攀比的心态蒙住眼睛,忘记了追求的究竟是什么,忘记了是什么能使我们更快乐。

社会上一夜暴富的新闻很多,这些消息,总会在我们的心里面掀起很多涟漪,涟漪多了就变成惊涛骇浪,心里的惊涛骇浪除了打翻承载你目标的小船,并不会使得你也一夜暴富。“只见贼吃肉,不见贼挨揍。”我们这些普通人既没有当贼的勇气,又缺乏当贼的狠辣绝决,虽然羡慕吃肉,却更害怕挨揍,偶尔看到几个没挨揍的贼就按奈不住,或者心思活动,或者大感不公,真要叫去做贼,却也不敢。

我还是过普通人的日子,要普通人的快乐,至少,晚上睡得着觉。

跳槽与积累

首先要说明,工作是一件需要理智的事情,所以不要在工作上耍个性,天涯上或许会有人觉得你很有个性而叫好,煤气公司电话公司不会因为觉得你很有个性而免了你的帐单。当你很帅地炒掉了你的老板,当你很酷地挖苦了一番招聘的HR,账单还是要照付,只是你赚钱的时间更少了,除了你自己,没人受损失。

我并不反对跳槽,但跳槽决不是解决问题的办法,而且频繁跳槽的后果是让人觉得没有忠诚度可言,而且不能安心工作。现在很多人从网上找工作,很多找工作的网站常常给人出些馊主意,要知道他们是盈利性企业,当然要从自身盈利的角度来考虑,大家越是频繁跳槽频繁找工作他们越是生意兴隆,所以鼓动人们跳槽是他们的工作。所以他们会常常告诉你,你拿的薪水少了,你享受的福利待遇差了,又是“薪情快报”又是“赞叹自由奔放的灵魂”。至于是否会因此让你不能安心,你跳了槽是否解决问题,是否更加开心,那个,他们管不着。

要跳槽肯定是有问题,一般来说问题发生了,躲是躲不开的,很多人跳槽是因为这样或者那样的不开心,如果这种不开心,在现在这个公司不能解决,那么在下一个公司多半也解决不掉。你必须相信,90%的情况下,你所在的公司并没有那么烂,你认为不错的公司也没有那么好。就像围城里说的,“城里的人拼命想冲出来,而城外的人拼命想冲进去。”每个公司都有每个公司的问题,没有问题的公司是不存在的。换个环境你都不知道会碰到什么问题,与其如此,不如就在当下把问题解决掉。很多问题当你真的想要去解决的时候,或许并没有那么难。有的时候你觉得问题无法解决,事实上,那只是“你觉得”。

人生的曲线应该是曲折向上的,偶尔会遇到低谷但大趋势总归是曲折向上的,而不是象脉冲波一样每每回到起点,我见过不少面试者,30多岁了,四五份工作经历,每次多则3年,少则1年,30多岁的时候回到起点从一个初级职位开始干起,拿基本初级的薪水,和20多岁的年轻人一起竞争,不觉得有点辛苦么?这种日子好过么?

资本靠的就是积累,这种积累包括人际关系,经验,人脉,口碑……如果常常更换行业,代表几年的积累付之东流,一切从头开始,如果换了两次行业,35岁的时候大概只有5年以下的积累,而一个没有换过行业的人至少有了10年的积累,谁会占优势?工作到2-3年的时候,很多人觉得工作不顺利,好像到了一个瓶颈,心情烦闷,就想辞职,乃至换一个行业,觉得这样所有一切烦恼都可以抛开,会好很多。其实这样做只是让你从头开始,到了时候还是会发生和原来行业一样的困难,熬过去就向上跨了一大步,要知道每个人都会经历这个过程,每个人的职业生涯中都会碰到几个瓶颈,你熬过去了而别人没有熬过去你就领先了。跑长跑的人会知道,开始的时候很轻松,但是很快会有第一次的难受,但过了这一段又能跑很长一段,接下来会碰到第二次的难受,坚持过了以后又能跑一段,如此往复,难受一次比一次厉害,直到坚持不下去了。大多数人第一次就坚持不了了,一些人能坚持到第二次,第三次虽然大家都坚持不住了,可是跑到这里的人也没几个了,这点资本足够你安稳活这一辈子了。

一份工作到两三年的时候,大部分人都会变成熟手,这个时候往往会陷入不断的重复,有很多人会觉得厌倦,有些人会觉得自己已经搞懂了一切,从而懒得去寻求进步了。很多时候的跳槽是因为觉得失去兴趣了,觉得自己已经完成比赛了。其实这个时候比赛才刚刚开始,工作两三年的人,无论是客户关系,人脉,手下,和领导的关系,在业内的名气……还都是远远不够的,但稍有成绩的人总是会自我感觉良好的,每个人都觉得自己跟客户关系铁得要命,觉得自己在业界的口碑好得很。其实可以肯定地说,一定不是,这个时候,还是要拿出前两年的干劲来,稳扎稳打,积累才刚刚开始。

你足够了解你的客户吗?你知道他最大的烦恼是什么吗?你足够了解你的老板么?你知道他最大的烦恼是什么吗?你足够了解你的手下么?你知道他最大的烦恼是什么吗?如果你不知道,你凭什么觉得自己已经积累够了?如果你都不了解,你怎么能让他们帮你的忙,做你想让他们做的事情?如果他们不做你想让他们做的事情,你又何来的成功?

等待

这是个浮躁的人们最不喜欢的话题,本来不想说这个话题,因为会引起太多的争论,而我又无意和人争论这些,但是考虑到对于职业生涯的长久规划,这是一个躲避不了的话题,还是决定写一写,不爱看的请离开吧。

并不是每次穿红灯都会被汽车撞,并不是每个罪犯都会被抓到,并不是每个错误都会被惩罚,并不是每个贪官都会被枪毙,并不是你的每一份努力都会得到回报,并不是你的每一次坚持都会有人看到,并不是你每一点付出都能得到公正的回报,并不是你的每一个善意都能被理解……这个,就是世道。好吧,世道不够好,可是,你有推翻世道的勇气么?如果没有,你有更好的解决办法么?有很多时候,人需要一点耐心,一点信心。每个人总会轮到几次不公平的事情,而通常,安心等待是最好的办法。

有很多时候我们需要等待,需要耐得住寂寞,等待属于你的那一刻。周润发等待过,刘德华等待过,周星驰等待过,王菲等待过,张艺谋也等待过……看到了他们如今的功成名就的人,你可曾看到当初他们的等待和耐心?你可曾看到金马奖影帝在街边摆地摊?你可曾看到德云社一群人在剧场里给一位观众说相声?你可曾看到周星驰的角色甚至连一句台词都没有?每一个成功者都有一段低沉苦闷的日子,我几乎能想象得出来他们借酒浇愁的样子,我也能想象得出他们为了生存而挣扎的窘迫。在他们一生最中灿烂美好的日子里,他们渴望成功,但却两手空空,一如现在的你。没有人保证他们将来一定会成功,而他们的选择是耐住寂寞。如果当时的他们总念叨着“成功只是属于特权阶级的”,你觉得他们今天会怎样?

曾经我也不明白有些人为什么并不比我有能力却要坐在我的头上,年纪比我大就一定要当我的领导么?为什么有些烂人不需要努力就能赚钱?为什么刚刚改革开放的时候的人能那么容易赚钱,而轮到我们的时候,什么事情都要正规化了?有一天我突然想,我还在上学的时候他们就在社会里挣扎奋斗了,他们在社会上奋斗积累了十几二十年,我们新人来了,他们有的我都想要,我这不是在要公平,我这是在要抢劫。因为我要得太急,因为我忍不住寂寞。二十多岁的男人,没有钱,没有事业,却有蓬勃的欲望。

人总是会遇到挫折的,人总是会有低潮的,人总是会有不被人理解的时候的,人总是有要低声下气的时候,这些时候恰恰是人生最关键的时候,因为大家都会碰到挫折,而大多数人过不了这个门槛,你能过,你就成功了。在这样的时刻,我们需要耐心等待,满怀信心地去等待,相信,生活不会放弃你,机会总会来的。至少,你还年轻,你没有坐牢,没有生治不了的病,没有欠还不起的债。比你不幸的人远远多过比你幸运的人,你还怕什么?路要一步步走,虽然到达终点的那一步很激动人心,但大部分的脚步是平凡甚至枯燥的,但没有这些脚步,或者耐不住这些平凡枯燥,你终归是无法迎来最后的那些激动人心。

逆境,是上帝帮你淘汰竞争者的地方。要知道,你不好受,别人也不好受,你坚持不下去了,别人也一样,千万不要告诉别人你坚持不住了,那只能让别人获得坚持的信心,让竞争者看着你微笑的面孔,失去信心,退出比赛。胜利属于那些有耐心的人。

在最绝望的时候,我会去看电影《The Pursuit of Happyness》《Jerry Maguire》,让自己重新鼓起勇气,因为,无论什么时候,我们总还是有希望。当所有的人离开的时候,我不失去希望,我不放弃。每天下班坐在车里,我喜欢哼着《隐形的翅膀》看着窗外,我知道,我在静静等待,等待属于我的那一刻。

原贴里伊吉网友的话我很喜欢,抄录在这里:

每个人都希望,自己是独一无二的特殊者

含着金匙出生、投胎到好家庭、工作安排到电力局拿1w月薪这样的小概率事件,当然最好轮到自己

红军长征两万五、打成右派反革命、胼手胝足牺牲尊严去奋斗,最好留给祖辈父辈和别人

自然,不是每个吃过苦的人都会得到回报

但是,任何时代,每一个既得利益者身后,都有他的祖辈父辈奋斗挣扎乃至流血付出生命的身影

羡慕别人有个好爸爸,没什么不可以

问题是,你的下一代,会有一个好爸爸吗?

至于问到为什么不能有同样的赢面概率?我只能问:为什么物种竞争中,人和猴子不能有同样的赢面概率?

物竞天择。猴子的灵魂不一定比你卑微,但你身后有几十万年的类人猿进化积淀。

入对行跟对人

在中国,大概很少有人是一份职业做到底的,虽然如此,第一份工作还是有些需要注意的地方,有两件事情格外重要,第一件是入行,第二件事情是跟人。第一份工作对人最大的影响就是入行,现代的职业分工已经很细,我们基本上只能在一个行业里成为专家,不可能在多个行业里成为专家。很多案例也证明即使一个人在一个行业非常成功,到另外一个行业,往往完全不是那么回事情,“你想改变世界,还是想卖一辈子汽水?”是乔布斯邀请百事可乐总裁约翰·斯考利加盟苹果时所说的话,结果这位在百事非常成功的约翰,到了苹果表现平平。其实没有哪个行业特别好,也没有哪个行业特别差,或许有报道说哪个行业的平均薪资比较高,但是他们没说的是,那个行业的平均压力也比较大。看上去很美的行业一旦进入才发现很多地方其实并不那么完美,只是外人看不见。

说实话,我自己都没有发大财,所以我的建议只是让人快乐工作的建议,不是如何发大财的建议,我们只讨论一般普通打工者的情况。我认为选择什么行业并没有太大关系,看问题不能只看眼前。比如,从前年开始,国家开始整顿医疗行业,很多医药公司开不下去,很多医药行业的销售开始转行。其实医药行业的不景气是针对所有公司的,并非针对一家公司,大家的日子都不好过,这个时候跑掉是非常不划算的,大多数正规的医药公司即使不做新生意撑个两三年总是能撑的,大多数医药销售靠工资撑个两三年也是可以撑的,国家不可能永远捏着医药行业不放的,两三年以后光景总归还会好起来的,那个时候别人都跑了而你没跑,那时的日子应该会好过很多。有的时候觉得自己这个行业不行了,问题是,再不行的行业,做得人少了也变成了好行业,当大家都觉得不好的时候,往往却是最好的时候。大家都觉得金融行业好,金融行业门槛高不说,有多少人削尖脑袋要钻进去,竞争激励,进去以后还要时时提防,一个疏忽,就被后来的人给挤掉了,压力巨大,又如何谈得上快乐?也就未必是“好”工作了。
  太阳能这个东西至今还不能进入实际应用的阶段,但是中国已经有7家和太阳能有关的公司在纽交所上市了,国美苏宁永乐其实是贸易型企业,也能上市,鲁泰纺织连续10年利润增长超过50%,卖茶的一茶一座,卖衣服的海澜之家都能上市……其实选什么行业真的不重要,关键是怎么做。事情都是人做出来的,关键是人。

有一点是需要记住的,这个世界上,有史以来直到我们能够预见得到的未来,成功的人总是少数,有钱的人总是少数,大多数人是一般的,普通的,不太成功的。因此,大多数人的做法和看法,往往都不是距离成功最近的做法和看法。因此大多数人说好的东西不见得好,大多数人说不好的东西不见得不好。大多数人都去炒股的时候说明跌只是时间问题,大家越是热情高涨的时候,跌的日子越近。大多数人买房子的时候,房价不会涨,而房价涨的差不多的时候,大多数人才开始买房子。不会有这样一件事情让大家都变成功,发了财,历史上不曾有过,将来也不会发生。有些东西即使一时运气好得到了,还是会在别的时候别的地方失去的。

年轻人在职业生涯的刚开始,尤其要注意的是,要做对的事情,不要让自己今后几十年的人生总是提心吊胆,更不值得为了一份工作赔上自己的青春年华。我的公司是个不行贿的公司,以前很多人不理解,甚至自己的员工也不理解,不过如今,我们是同行中最大的企业,客户乐意和我们打交道,尤其是在国家打击腐败的时候,每个人都知道我们做生意不给钱的名声,都敢于和我们做生意。而勇于给钱的公司,不是倒了,就是跑了,要不就是每天睡不好觉,人还是要看长远一点。很多时候,看起来最近的路,其实是最远的路,看起来最远的路,其实是最近的路。

跟对人是说,入行后要跟个好领导好老师,刚进社会的人做事情往往没有经验,需要有人言传身教。对于一个人的发展来说,一个好领导是非常重要的。所谓“好”的标准,不是他让你少干活多拿钱,而是以下三个。

首先,好领导要有宽广的心胸,如果一个领导每天都会发脾气,那几乎可以肯定他不是个心胸宽广的人,能发脾气的时候却不发脾气的领导,多半是非常厉害的领导。中国人当领导最大的毛病是容忍不了能力比自己强的人,所以常常可以看到的一个现象是,领导很有能力,手下一群庸才或者手下一群闲人。如果看到这样的环境,还是不要去的好。

其次,领导要愿意从下属的角度来思考问题,这一点其实是从面试的时候就能发现的,如果这位领导总是从自己的角度来考虑问题,几乎不听你说什么,这就危险了。从下属的角度来考虑问题并不代表同意下属的说法,但他必须了解下属的立场,下属为什么要这么想,然后他才有办法说服你,只关心自己怎么想的领导往往难以获得下属的信服。

第三,领导敢于承担责任,如果出了问题就把责任往下推,有了功劳就往自己身上揽,这样的领导不跟也罢。选择领导,要选择关键时刻能抗得住的领导,能够为下属的错误买单的领导,因为这是他作为领导的责任。

有可能,你碰不到好领导,因为,中国的领导往往是屁股决定脑袋的领导,因为他坐领导的位置,所以他的话就比较有道理,这是传统观念官本位的误区,可能有大量的这种无知无能的领导,只是,这对于你其实是好事,如果将来有一天你要超过他,你希望他比较聪明还是比较笨?相对来说这样的领导其实不难搞定,只是你要把自己的身段放下来而已。多认识一些人,多和比自己强的人打交道,同样能找到好的老师,不要和一群同样郁闷的人一起控诉社会,控诉老板,这帮不上你,只会让你更消极。和那些比你强的人打交道,看他们是怎么想的,怎么做的,学习他们,然后跟更强的人打交道。

选择

我们每天做的最多的事情,其实是选择,因此在谈职业生涯的时候不得不提到这个话题。

我始终认为,在很大的范围内,我们究竟会成为一个什么样的人,决定权在我们自己,每天我们都在做各种各样的选择,我可以不去写这篇文章,去别人的帖子拍拍砖头,也可以写下这些文字,帮助别人的同时也整理自己的思路,我可以多注意下格式让别人易于阅读,也可以写成一堆,我可以就这样发上来,也可以在发以前再看几遍,你可以选择不刮胡子就去面试,也可以选择出门前照照镜子……每天,每一刻我们都在做这样那样的决定,我们可以漫不经心,也可以多花些心思,成千上万的小选择累计起来,就决定了最终我们是个什么样的人。

从某种意义上来说我们的未来不是别人给的,是我们自己选择的,很多人会说我命苦啊,没得选择阿,如果你认为“去微软还是去IBM”“上清华还是上北大”“当销售副总还是当厂长”这种才叫选择的话,的确你没有什么选择,大多数人都没有什么选择。但每天你都可以选择是否为客户服务更周到一些,是否对同事更耐心一些,是否把工作做得更细致一些,是否把情况了解得更清楚一些,是否把不清楚的问题再弄清楚一些……你也可以选择在是否在痛苦中继续坚持,是否抛弃掉自己的那些负面的想法,是否原谅一个人的错误,是否相信我在这里写下的这些话,是否不要再犯同样的错误……生活每天都在给你选择的机会,每天都在给你改变自己人生的机会,你可以选择赖在地上撒泼打滚,也可以选择咬牙站起来。你永远都有选择。有些选择不是立杆见影的,需要累积,比如农民可以选择自己常常去浇地,也可以选择让老天去浇地,诚然你今天浇水下去苗不见得今天马上就长出来,但常常浇水,大部分苗终究会长出来的,如果你不浇,收成一定很糟糕。

每天生活都在给你机会,他不会给你一叠现金也不会拱手送你个好工作,但实际上,他还是在给你机会。我的家庭是一个普通的家庭,没有任何了不起的社会关系,我的父亲在大学毕业以后就被分配到了边疆,那个小县城只有一条马路,他们那一代人其实比我们更有理由抱怨,他们什么也没得到,年轻的时候文化大革命,书都没得读,支援边疆插队落户,等到老了,却要给年轻人机会了。他有足够的理由象成千上万那样的青年一样坐在那里抱怨生不逢时,怨气冲天。然而在分配到边疆的十年之后,国家恢复招研究生,他考回了原来的学校。研究生毕业,他被分配到了安徽一家小单位里,又是3年以后,国家第一届招收博士生,他又考回了原来的学校,成为中国第一代博士,那时的他比现在的我年纪还大。生活并没有放弃他,他也没有放弃生活。10年的等待,他做了他自己的选择,他没有放弃,他没有破罐子破摔,所以时机到来的时候,他改变了自己的人生。你最终会成为什么样的人,就决定在你的每个小小的选择之间。

你选择相信什么?你选择和谁交朋友?你选择做什么?你选择怎么做?……我们面临太多的选择,而这些选择当中,意识形态层面的选择又远比客观条件的选择来得重要得多,比如选择做什么产品其实并不那么重要,而选择怎么做才重要。选择用什么人并不重要,而选择怎么带这些人才重要。大多数时候选择客观条件并不要紧,大多数关于客观条件的选择并没有对错之分,要紧的是选择怎么做。一个大学生毕业了,他要去微软也好,他要卖猪肉也好,他要创业也好,他要做游戏代练也好,只要不犯法,不害人,都没有什么关系,要紧的是,选择了以后,怎么把事情做好。

除了这些,你还可以选择时间和环境,比如,你可以选择把这辈子最大的困难放在最有体力最有精力的时候,也可以走一步看一步,等到了40岁再说,只是到了40多岁,那正是一辈子最脆弱的时候,上有老下有小,如果在那个时候碰上了职业危机,实在是一件很苦恼的事情。与其如此不如在20多岁30多岁的时候吃点苦,好让自己脆弱的时候活得从容一些。你可以选择在温室里成长,也可以选择到野外磨砺,你可以选择在办公室吹冷气的工作,也可以选择40度的酷热下,去见你的客户,只是,这一切最终会累积起来,引导你到你应得的未来。

我不敢说所有的事情你都有得选择,但是绝大部分事情你有选择,只是往往你不把这当作一种选择。认真对待每一次选择,才会有比较好的未来。

选择职业

职业的选择,总的来说,无非就是销售、市场、客服、物流、行政、人事、财务、技术、管理几个大类,有个有趣的现象就是,500强的CEO当中最多的是销售出身,第二多的人是财务出身,这两者加起来大概超过95%。现代IT行业也有技术出身成为老板的,但实际上,后来他们还是从事了很多销售和市场的工作,并且表现出色,公司才获得了成功,完全靠技术能力成为公司老板的,几乎没有。这是有原因的,因为销售就是一门跟人打交道的学问,而管理其实也是跟人打交道的学问,这两者之中有很多相通的东西,他们的共同目标就是“让别人去做某件特定的事情。”而财务则是从数字的层面了解生意的本质,从宏观上看待生意的本质,对于一个生意是否挣钱,是否可以正常运作有着最深刻的认识。

公司小的时候是销售主导公司,而公司大的时候是财务主导公司,销售的局限性在于只看人情不看数字,财务的局限性在于只看数字不看人情。公司初期,运营成本低,有订单就活得下去,跟客户也没有什么谈判的条件,别人肯给生意做已经谢天谢地了,这个时候订单压倒一切,客户的要求压倒一切,所以当然要顾人情。公司大了以后,一切都要规范化,免得因为不规范引起一些不必要的风险,同时运营成本也变高,必须提高利润率,把有限的资金放到最有产出的地方。对于上市公司来说,股东才不管你客户是不是最近出国,最近是不是那个省又在搞严打,到了时候就要把业绩拿出来,拿不出来就抛股票,这个时候就是数字压倒一切。

前两天听到有人说一句话觉得很有道理,开始的时候我们想“能做什么?”,等到公司做大了有规模了,我们想“不能做什么。”很多人在工作中觉得为什么领导这么保守,这也不行那也不行,错过很多机会。很多时候是因为,你还年轻,你想的是“能做什么”,而作为公司领导要考虑的方面很多,他比较关心“不能做什么”。

我并非鼓吹大家都去做销售或者财务,究竟选择什么样的职业,和你究竟要选择什么样的人生有关系,有些人就喜欢下班按时回家,看看书听听音乐,那也挺好,但就不适合找个销售的工作了,否则会是折磨自己。有些人就喜欢出风头,喜欢成为一群人的中心,如果选择做财务工作,大概也干不久,因为一般老板不喜欢财务太积极,也不喜欢财务话太多。先想好自己要过怎样的人生,再决定要找什么样的职业。有很多的不快乐,其实是源自不满足,而不满足,很多时候是源自于心不定,而心不定则是因为不清楚究竟自己要什么,不清楚要什么的结果就是什么都想要,结果什么都没得到。

我想,我们还是因为生活而工作,不是因为工作而生活,生活是最要紧的,工作只是生活中的一部分。我总是觉得生活的各方方面都是相互影响的,如果生活本身一团乱麻,工作也不会顺利。所以要有娱乐、要有社交、要锻炼身体,要有和睦的家庭……最要紧的,要开心,我的两个销售找我聊天,一肚子苦水,我问他们,2年以前,你什么都没有,工资不高,没有客户关系,没有业绩,处于被开的边缘,现在的你比那时条件好了很多,为什么现在却更加不开心了?如果你做得越好越不开心,那你为什么还要工作?首先的首先,人还是要让自己高兴起来,让自己心态好起来,这种发自内心的改变会让你更有耐心,更有信心,更有气质,更能包容……否则,看看镜子里的你,你满意么?

有人会说,你说得容易,我每天加班,不加班老板就会把我炒掉,每天累得要死,哪有时间娱乐、社交、锻炼?那是人们把目标设定太高的缘故,如果你还在动不动就会被老板炒掉的边缘,那么你当然不能设立太高的目标,难道你还想每天去打高尔夫?你没时间去健身房锻炼身体,但是上下班的时候多走几步可以吧,有楼梯的时候走走楼梯不走电梯可以吧?办公的间隙扭扭脖子拉拉肩膀做做俯卧撑可以吧?谁规定锻炼就一定要拿出每天2个小时去健身房?你没时间社交,每月参加郊游一次可以吧,周末去参加个什么音乐班,绘画班之类的可以吧,去尝试认识一些同行,和他们找机会交流交流可以吧?开始的时候总是有些难的,但迈出这一步就会向良性循环的方向发展。而每天工作得很苦闷,剩下的时间用来咀嚼苦闷,只会陷入恶性循环,让生活更加糟糕。

孙振耀撰文谈退休并畅谈人生

文/中国惠普前总裁 孙振耀

虽然离开惠普仅有十五天,但感觉上惠普已经离我很远。我的心思更多放在规划自己第二阶段的人生,这并非代表我对惠普没有任何眷恋,主要还是想以此驱动自己往前走。

万科王石登珠穆朗玛峰的体验给我很多启发,虽然在出发时携带大量的物资,但是登顶的过程中,必须不断减轻负荷,最终只有一个氧气瓶和他登上峰顶。登山如此,漫长的人生又何尝不是。

我宣布退休后,接到同事朋友同学的祝贺。大部分人都认为我能够在这样的职位上及年龄选择退休,是一种勇气,也是一种福气。

还有一部分人怀疑我只是借此机会换个工作,当然还有一些人说我在HP做不下去了,趁此机会离开。
我多年来已经习惯别人对我的说三道四,但对于好友,我还是挺关心大家是否真正理解我的想法,这也是写这篇文章的目的。

由于受我父亲早逝的影响,我很早就下定决心,要在有生之年实现自己的愿望,我不要像我父亲一样,为家庭生活忙碌一辈子,临终前感伤,懊恼自己有很多没有实现的理想。

一本杂志的文章提到我们在生前就应该思考自己的墓志铭,因为那代表你自己对完美人生的定义,我们应该尽可能在有生之年去实现它。

我希望我的墓志铭上除了与家人及好友有关的内容外,是这样写着:

1.这个人曾经服务于一家全球最大的IT公司(HP)25年,和她一起经历过数次重大的变革,看着她从以电子仪表为主要的业务变革成全球最大的IT公司。

2.这个人曾经在全球发展最快的国家(中国)工作16年,并担任HP中国区总裁7年,见证及经历过中国改革开放的关键 最新突破阶段,与中国一起成长。

3.这个人热爱飞行,曾经是一个有执照的飞行员,累积飞行时数超过X小时,曾经在X个机场起降过。
4. 这个人曾经获得管理硕士学位,在领导管理上特别关注中国企业的组织行为及绩效,并且在这个领域上获得中国企业界的认可。

我费时25年才总结1和2两项成果,我不知还要费时多久才能达成3和4的愿望,特别是第4个愿望需要经历学术的训练,才能将我的经验总结成知识。

否则我的经验将无法有效影响及传授他人。因此重新进入学校学习,拿一个管理学位是有必要的,更何况这是我一个非常重要的愿望。

另一方面,我25年的时间都花在运营(operation) 的领域,兢兢业业的做好职业人士的工作,它是一份好工作,特别是在HP,这份工作也帮助我建立财务的基础,支持家庭的发展。

但是我不想终其一生,都陷入在运营的领域,我想象企业家一样,有机会靠一些点子 (ideas)赚钱,虽然风险很高,但是值得一试,即使失败,也不枉走一回,这也是第4个愿望其中的一部份。

Carly Fiorina 曾经对我说过“这个世界上有好想法的人很多,但有能力去实现的人很少”,2007 年5月21日在北大演讲时,有人问起那些书对我影响较大,我想对我人生观有影响的其中一本书叫“Trigger Point”,它的主要观点是:人生最需要的不是规划,而是在适当的时机掌握机会,采取行动。

我这些愿望在我心中已经酝酿一段很长的时间,开始的时候,也许一年想个一两次,过了也就忘掉,但逐渐的,这个心中的声音,愈来愈大,出现的频率也愈来愈高,当它几乎每一个星期都会来与我对话时,我知道时机已经成熟。

但和任何人一样,要丢掉自己现在所拥有的,所熟悉的环境及稳定的收入,转到一条自己未曾经历过,存在未知风险的道路,需要绝大的勇气,家人的支持和好友的鼓励。有舍才有得,真是知易行难,我很高兴自己终于跨出了第一步。

我要感谢HP的EER提前退休优惠政策,它是其中一个关键的Trigger Points,另一个关键因素是在去年五六月发生的事。

当时我家老大从大学毕业,老二从高中毕业,在他们继续工作及求学前,这是一个黄金时段,让我们全家可以相聚一段较长的时间,我为此很早就计划休一个长假,带着他们到各地游玩。

但这个计划因为工作上一件重要的事情(Mark Hurd 访华)不得不取消。这个事件刺激了我必须严肃的去对待那心中的声音,我会不会继续不断的错失很多关键的机会?

我已经年过50,我会不会走向和我父亲一样的道路?人事部老总Charles跟我说,很多人在所有对他有利的星星都排成一列时,还是错失时机。

我知道原因,因为割舍及改变对人是多么的困难,我相信大部分的人都有自己人生的理想,但我也相信很多人最终只是把这些理想当成是 幻想,然后不断的为自己寻找不能实现的藉口,南非前总统曼德拉曾经说过,“与改变世界相比,改变自己更困难”,真是一针见血。

什么是快乐及有意义的人生?我相信每一个人的定义都不一样,对我来说,能实现我墓志铭上的内容就是我的定义。

在中国惠普总裁的位置上固然可以吸引很多的关注及眼球,但是我太太及较亲近的好友,都知道那不是我追求的,那只是为扮演好这个角色必须尽力做好的地方。

做一个没有名片的人士,虽然只有十多天的时间,但我发现我的脑袋里已经空出很多空间及能量,让我可以静心的为我Chapter II的新生活做细致的调研及规划。

我预订以两年的时间来完成转轨的准备工作,并且花多点时间与家人共处。这两年的时间我希望拿到飞行执照,拿到管理有关的硕士学位,提升英文的水平,建立新的网络,多认识不同行业的人,保持与大陆的联系。希望两年后,我可以顺利回到大陆去实现我第四个愿望。
 
毫不意外,在生活上,我发现很多需要调整的地方。

二十多年来,我生活的步调及节奏,几乎完全被公司及工作所左右,不断涌出的deadline及任务驱动我每天的安排,一旦离开这样的环境,第一个需要调整的就是要依靠自己的自律及意志力来驱动每天的活动,睡觉睡到自然醒的态度绝对不正确,放松自己,不给事情设定目标及时间表,或者对错失时间目标无所谓,也不正确,没有年度,季度,月及周计划也不正确。

担任高层经理多年,已经养成交待事情的习惯,自己的时间主要花在思考,决策及追踪项目的进展情况,更多是依靠一个庞大的团队来执行具体的事项及秘书来处理很多协调及繁琐的事情。

到美国后,很多事情需要打800号电话联系,但这些电话很忙,常让你在waiting line上等待很长的时间,当我在等待时,我可以体会以前秘书工作辛苦的地方,但同时也提醒我自己,在这个阶段要改变态度,培养更大的耐性及自己动手做的能力。

生活的内容也要做出很大的调整,多出时间锻炼身体,多出时间关注家人,多出时间关注朋友,多出时间体验不同的休闲活动及飞行,一步步的,希望生活逐步调整到我所期望的轨道上,期待这两年的生活既充实又充满乐趣及意义。

第一个快乐的体验就是准备及参加大儿子的订婚礼,那种全心投入,不需担忧工作数字的感觉真好。同时我也租好了公寓,买好了家具及车子,陪家人在周末的时候到Reno 及Lake Tahoe玩了一趟,Lake Tahoe我去了多次,但这次的体验有所不同,我从心里欣赏到它的美丽。

但同时我也在加紧调研的工作,为申请大学及飞行学校做准备,这段时间也和在硅谷的朋友及一些风险投资公司见面,了解不同的产业。

我的人生观是“完美的演出来自充分的准备”,“勇于改变自己,适应不断变化的环境,机会将不断出现”,“快乐及有意义的人生来自于实现自己心中的愿望,而非外在的掌声”。

我离开时,有两位好朋友送给我两个不同的祝语,Baron的是“多年功过化烟尘”,杨华的是“莫春者,风乎舞雩,咏而归”,它们分别代表了我离开惠普及走向未来的心情。

我总结人生有三个阶段,一个阶段是为现实找一份工作,一个阶段是为现实,但可以选择一份自己愿意投入的工作,一个阶段是为理想去做一些事情。

我珍惜我的福气,感激HP及同事、好朋友给我的支持,鼓励及协助,这篇文字化我心声的文章与好友分享。