posted @
2006-07-27 19:03 崛起的程序员 阅读(239) |
评论 (0) |
编辑 收藏
诸位,咱当电子工程师也是十余年了,不算有出息,环顾四周,也没有看见几个有出息的!回顾工程师生涯,感慨万千,愿意讲几句掏心窝子的话,也算给咱们师弟师妹们提个醒,希望他们比咱们强!
[1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手!
[2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!
[3]不要去做技术高手,只去做综合素质高手!在企业里混,我们时常瞧不起某人,说他“什么都不懂,凭啥拿那么多钱,凭啥升官!”这是普遍的典型的工程师的迂腐之言。8051很牛吗?人家能上去必然有他的本事,而且是你没有的本事。你想想,老板搞经营那么多年,难道见识不如你这个新兵?人家或许善于管理,善于领会老板意图,善于部门协调等等。因此务必培养自己多方面的能力,包括管理,亲和力,察言观色能力,攻关能力等,要成为综合素质的高手,则前途无量,否则只能躲在角落看示波器!技术以外的技能才是更重要的本事!!从古到今,美国日本,一律如此!
[4]多交社会三教九流的朋友!不要只和工程师交往,认为有共同语言,其实更重要的是和其他类人物交往,如果你希望有朝一日当老板或高层管理,那么你整日面对的就是这些人。了解他们的经历,思维习惯,爱好,学习他们处理问题的模式,了解社会各个角落的现象和问题,这是以后发展的巨大的本钱,没有这些以后就会笨手笨脚,跌跌撞撞,遇到重重困难,交不少学费,成功的概率大大降低!
[5]知识涉猎不一定专,但一定要广!多看看其他方面的书,金融,财会,进出口,税务,法律等等,为以后做一些积累,以后的用处会更大!会少交许多学费!!
[6]抓住时机向技术管理或市场销售方面的转变!要想有前途就不能一直搞开发,适当时候要转变为管理或销售,前途会更大,以前搞技术也没有白搞,以后还用得着。搞管理可以培养自己的领导能力,搞销售可以培养自己的市场概念和思维,同时为自己以后发展积累庞大的人脉!应该说这才是前途的真正支柱!!!
[7]逐渐克服自己的心里弱点和性格缺陷!多疑,敏感,天真(贬义,并不可爱),犹豫不决,胆怯,多虑,脸皮太薄,心不够黑,教条式思维。。。这些工程师普遍存在的性格弱点必须改变!很难吗?只在床上想一想当然不可能,去帮朋友守一个月地摊,包准有效果,去实践,而不要只想!不克服这些缺点,一切不可能,甚至连项目经理都当不好--尽管你可能技术不错!
[8]工作的同时要为以后做准备!建立自己的工作环境!及早为自己配置一个工作环境,装备电脑,示波器(可以买个二手的),仿真器,编程器等,业余可以接点活,一方面接触市场,培养市场感觉,同时也积累资金,更重要的是准备自己的产品,咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品,拿出象样的产品,就可技术转让或与人合作搞企业!先把东西准备好,等待机会, 否则,有了机会也抓不住!
[9]要学会善于推销自己!不仅要能干,还要能说,能写,善于利用一切机会推销自己,树立自己的品牌形象,很必要!要创造条件让别人了解自己,不然老板怎么知道你能干?外面的投资人怎么相信你?提早把自己推销出去,机会自然会来找你!搞个个人主页是个好注意!!特别是培养自己在行业的名气,有了名气,高薪机会自不在话下,更重要的是有合作的机会...
[10]该出手时便出手!永远不可能有100%把握!!!条件差不多就要大胆去干,去闯出自己的事业,不要犹豫,不要彷徨,干了不一定成功,但至少为下一次冲击积累了经验,不干永远没出息,而且要干成必然要经历失败。不经历风雨,怎么见彩虹,没有人能随随便便成功!
posted @
2006-07-25 10:22 崛起的程序员 阅读(213) |
评论 (1) |
编辑 收藏
美国东部时间2004年9月29日早上10:58分(北京时间2004年9月29日晚10时58分),中国互联网人才招聘服务网站51job(前程无忧)成功登陆美国纳斯达克,开盘价为每存托股18.98美元,当天收市价为21.15美元,比发行价每股14美元上涨51%。前程无忧此次共发行了604万股美国存托股(ads),共筹得资金8453万美元……作为51job的创始人之一,首席执行长甄荣辉拥有公司30.6%的股份,是公司的第一大股东。”在国庆长假前的9月30日,国内各大媒体、网站纷纷报道了上述消息。
随着前程无忧的成功上市,又一个十亿(人民币)级的富翁走进了人们视线。也许人们津津乐道的是富豪们的身价排名,或是艳羡于他们“一夜暴富”的传奇,但是,在故事中的主人公看来,“事实上,成功一点都不难!最难的是:想成功,但没有计划!如果你有一个5年或者10年的成功目标,而且能够周密地计划,坚定地执行,那么,因为计划,成功率还是很高的。”
如果成功是能够被计划的,那么,出身于香港平民家庭的寒门“虎子”甄荣辉(1962年出生,属虎)依靠清晰的人生定位、严谨的职业发展路径计算、锲而不舍的努力与坚持,一步一步实现人生目标的创富故事将是可以被复制的……懵懂少年初识愁滋味无知贪玩的少年第一次经受了人生磨难,置之死地而后生的遭遇警醒了他内心深处的精英梦;洗澡排队、上厕所排队、做饭排队,香港平民的生存环境给他上了人生第一课:做任何事必须把握好时间与效率,看准了时机一定要毫不迟疑地冲上去。
少年时期的甄荣辉并没有显露出大器将成的先兆,反而以“懒”著称。
1962年甄荣辉出生在香港一个最普通的平民家庭。其父母是从广东“移居”到香港的,他和妈妈以及另外七八家20多口人“蜂居”在一套总面积不到80平米的公寓内,在这种高度拥挤状况下,做饭要排队,洗澡要排队,上厕所也要排队。做任何事必须要把握好时间与效率,这是家庭环境带给甄荣辉的重要一课。
炎热的夏天是最难过的。为了排队洗澡,他一放学就把洗漱用品准备好,然后每隔5分钟去洗澡间探查一次,一俟对方洗完走出房门,他一个箭步马上就冲了进去。生存的艰难,教育了一个十几岁的孩子,一定要抓住机会,看准了时机一定要毫不迟疑地冲上去。就从“抢”洗澡室开始,甄荣辉小小年纪便有了竞争意识。
因为父母都忙于打工挣钱养家,没有人顾及他的功课,于是那个时候的他每天回家把书包一扔就坐在沙发上看电视,然后看到很晚就去睡觉,尽可能地睡,一天睡16个小时。“我不是几天,几个月,而是几年的时间我都在跟自己说,哎呀,你怎么可以这么懒呢?每天到睡觉的时候我也会自责:今天一天又什么活也没干!明天一定不能这样!但是到了明天,依然还是看电视、睡觉,睡觉、看电视……”这样懒的直接后果是,在1979年他中学会考时,全香港30多家预科学校,没有一家愿意要他,因为他的中学实在太烂了。如果不能念预科,不能念大学,对于他这样一个毫无背景的平民家庭的孩子而言,前途是渺茫的。他第一次开始考虑前途问题,告诉自己:再苦再难一定要考上大学。“有一天我在烈日下排了很长很长的队去报名,好不容易挤上去,人家一看我的中学,皱皱眉说不要。拿着报名表出来,后面还有一大群人在排队。在太阳下烤得太久,我都几乎有些中暑了,但我还要打起精神去找下一所学校。我一边打着出租车找学校,一边告诉自己,如果过了这一关,一定要努力读书。”
人是需要一些难关才会成长的。经过这一次的打击,甄荣辉的自我意识开始觉醒,他仿佛变了一个人似的,开始知道发奋努力了。最后,他进入了一所位于偏远而荒凉的山上的预科学校。经过1979年到1981年两年预科的努力,他以优异成绩考入了香港中文大学工程系。
小小工程师胸怀鸿鹄志
香港这个成熟的商业社会教育他,走工程师的路很稳定,但是不会有大的成功,而走商业的路,就像在满布鲨鱼的大海,游得快就会赢,否则会被吃掉。为了获得更大的成功,他进入hp香港公司,成为一名顶级sales。
成长时期的磨难都是锻炼。不管是从小学、中学还是高中,甄荣辉和他的同代人一样,一直处于一种熙熙攘攘的竞争环境中,千军万马要挤一条踏向成功的独木桥。“所以,对于竞争来说,我从小也就习惯了。”
在英国统治下的香港,甄荣辉接受的是英国精英教育的熏陶,一定要成为社会精英人士,爬上去了就是爬上去了。香港这个成熟的商业社会教给他的第一课,是让他对商业的重要性有了认识,他的创业意识亦有所萌芽了。
1984年甄荣辉大学毕业时,大学组织了一次就业辅导,有来自ibm sales的销售总监及香港电讯的总工程师来给学生讲课。那时他想:如果我要成功的话,20年后我会是他们中的哪一位?了解他们的工作及看过当场表现后,甄荣辉直觉上很想做sales的工作。“走工程师的路肯定是很稳定,走商业的路,就好像在满布鲨鱼的大海,游得快就会赢,否则会被吃掉。”自信自己会游得快,向往有更大的成功,甄荣辉选择了挑战度高的商业工作,进入hp的sales & marketing部门,成为一名销售工程师。
hp的工作薪水不错而且稳定。他第一个月工资就是4900港元。甄荣辉似乎天生具有销售才干,三年后,他就成为公司的销售冠军。而到第四年,他每天只需工作不到两个小时,就可以完成业绩。“那个时候是蛮舒服的。因为你有一批大客户在你的手里面,你把他们伺候好了,这个客户其实是很难丢掉的。”那时他每天十点钟出去拜访客户,之后就没事了,但他不敢回家,怕回家老妈操心说,你干嘛这么早回来,是不是给炒鱿鱼了?于是他就去电影院看电影,一个礼拜看两三场电影,看到后来电影都没得看了,就跑到图书馆睡觉。
轻轻松松就能拿到30万(港元)的年薪收入(包括销售提成),而且作为销售状元,在hp的发展前景光明,这样的环境是很多人所羡慕的,但是甄荣辉却开始不满足,觉得挑战不够大。“我分析自己的现状,觉得这么发展下去,只有两个选择。一种选择是改变自己,适应环境。哎呀,你不要要求这么高了。还有一个就是改变环境。其实你会发现mba是一个很好的换环境的踏脚石。你可以在高科技公司里做事,你也可以去做咨询管理顾问,或者是去投资银行,还可以去消费品行业工作……学一个mba可以给你好多路的。”甄荣辉决定放弃hp的工作去读mba。
“小聪明”赢得大机会
mba毕业后的年薪将会在15万美元以上,而且有机会成为企业高级管理人员。他放弃了hp30万港元的年薪和稳定而轻松的工作,将全部的积累用作mba学费。他最终选择去欧洲念书,“因为欧洲学校只需要1年时间,不仅花钱少,而且还能早挣钱。”
1984年加入hp时,月工资是4900港元,当甄荣辉1988年离开hp的时候,他的年薪达到30万港元,他把在hp攒下的积蓄作为念mba的学费。当时他申请的是法国insead商学院。之所以选择这所学校,是因为它学时只有一年,而且学校知名度并不逊于美国院校。“读美国学校mba需要2年时间,而欧洲学校只需要1年时间。因此,去欧洲读书不仅花钱少,而且还能早挣钱。”他是这样计算的。
当他决定离开hp时,他接受了平生第一次专访,正是在那次访问上,他第一次清晰表达了自己的人生愿望。“我记得是一份计算机周刊方面的杂志,他们到惠普来采访销售架构。后来发现我是销售冠军,结果我又去念书,他们就来采访我。他们问我的人生目标,我说我希望毕业20年以后成为一个企业高级管理人员。”那时,他是25岁。
要去法国念书,必须会法语,可是甄荣辉当时没有任何法语基础,他又一次要挑战自己的极限了。他花了三个月来突击强化法语,但是在考试那天,他依然没有太多把握。不过,他发现法语考试主要是面试,由主考老师问几个问题,时间大约为15至20分钟。他担心自己的语言不过关,如果让老师放开问,自己听不懂再答不上来不就麻烦了!他事先准备好20多分钟的讲演内容。当面试老师提出第一个问题后,他就一口气地回答下去,一直回答了20分钟,根本没有给主考老师提问下一个问题的工夫。结果,他就这样通过了入学语言考试。
勤奋成就百万年薪经理人
“我要先在国外工作一段时间,看看国外公司是如何运作的。而有国外工作的经历,即使以后回香港也能对我的简历更有帮助。”在四个不同的工作意向中,他最后选择进入贝恩国际策略顾问公司英国办事处。
mba毕业以后,甄荣辉面临着几种选择:一是回香港工作,二是留在国外工作,或者加入高科技企业,或者进入咨询管理公司。四个方向的工作他都有选择的机会,“我决定要先在国外工作一段时间,因为刚出来一年就回香港,没有机会看看国外是怎么运作的,对我的简历可能也不是很有帮助。而选择做咨询,是因为它比较新鲜,可以接触不同的事情,见识面广。”最后,他选择了贝恩国际策略顾问公司(bain & company),先在其英国办事处工作。
尽管选择进入贝恩公司,对他是反复权衡之后的理性选择,他很喜欢这份工作,但贝恩却给了他一个下马威。上班三天之后有一个项目汇报会,他参加了这个两小时的会议,却发现有70%的内容都听不懂。连会议都听不懂,还怎么开展工作?他给远在香港的妈妈打电话说可能很快要回香港了。在这次会议上的受“辱”经历给他以巨大的打击,他明白自己还得要拼命努力,就像当初考大学,当初学习法语一样,爱拼才能赢。
经过半年的磨合,他发现和其他英国同事相比,语言是自己的短处,而分析推理能力是自己的长处。于是,甄荣辉把工作重点放到了项目调查方面,收集了大量数据,进行调查分析,并从中找出许多从前别人没有看到的东西。最初,他的工作是咨询顾问,当他把事先经过大量调查分析后的资料提供给项目经理时,项目经理似乎惊呆了,因为很少有一个咨询顾问工作像他那样深入。慢慢地,所有贝恩英国公司的经理们都点名要求甄荣辉加入他们的队伍。正是由于这样苦干加巧干,当该年贝恩英国要裁员三分之一时,他一个华人却被保留下来。
在加入贝恩两年多后,甄荣辉顺利地从咨询顾问升到经理。1991年他被派驻香港建立办事处,业务发展迅速。很快,在他一手策划下,贝恩又在北京开设了办事处,他出任贝恩中国总裁。1994年,32岁的甄在加入贝恩4年半后,成为贝恩公司历史上最年轻的副总裁以及最年轻的合伙人之一。这在“不up(提升)就out(离职)”、聪明人成堆的咨询公司实属难得。
“亿万富翁梦”的诱惑
做一个百万年薪的职业经理人,“薪水很高,职务也很稳定”,但是永远不会成为有影响力的企业家。“中国未来20年高速发展的经济环境将造就一批百亿级的富豪”,这一诱惑使得他不辞辛苦,屡次创业。
“作咨询顾问,每天接触到不同的客户,为不同的案子服务。今天你可能是被客户用直升机直接接到他们公司总部的楼顶上,你感受了大公司的豪华气派;明天你没准又要坐长途汽车在农村奔波,与泥土牛粪为伴。二者的巨大差异,让你深深感受到这个世界好像不公平。钱好像很重要,但是有些东西还不只是金钱带来的差异。然后你就会想,人生到底追求什么呢?”在成为年薪百万的财务自由人后,甄荣辉不再是那个为抢厕所而煞费苦心的少年小伙,不再是因为有钱能多吃一碗饭而高兴的大学生,不再是那个第一次拥有自己爱车而在雨中飙车的浪漫青年,他开始思考“人活着为什么”等哲学层面的问题,能够做一些更有社会影响力的事情,成为他的追求目标。
在甄荣辉的记忆中,1995年的一段经历对他触动很大:“那时我正负责百威啤酒的项目,贝恩总部也过来了一个高级合伙人专门负责这个项目。我们陪着百威啤酒董事长august busch在中国各地考察,贝恩的高级合伙人从来没来过中国,我全程陪同。有一天晚上,我们和老外在一起喝酒聊天,他们说在中国未来发展的二十年里面一定会出现十几位十亿美元家产的富翁。听到这句话,我心中咯噔一下,因为我以前没想过这个问题,但仔细一想觉得很有道理。香港在60年代到80年代的高速发展中,产生了十多个十亿美元的大富翁,大陆未来20年的高速发展难道不能产生新的富翁吗?你既然相信了在中国未来?0年会有几十个富豪出现,那你再想一想,自己还有机会排上吗?”
在大陆经济快速发展的大潮中,香港人甄荣辉做起了“亿万富翁梦”。对他而言,“这个出发点不是钱的问题,而是一种成就感。钱不一定就代表成就,但是在某种程度上还是反映了事业的成功,或者在市场上的影响力。”
天上不会掉下馅饼,更不会掉下财富。要实现“亿万富翁”的理想,坐在办公室等待,或者安于做一个朝九晚五的打工族肯定是不可能的,必须要投资,要创立自己的企业。去管理顾问公司的人一般做了两三年就都想出来自己做事,甄荣辉最初其实也是有过创业的想法与尝试。早在1991年,他就投资做了一种用声音传递邮件的系统,后来他还投资做过磁性材料等等,两次创业均以失败告终,但也使他学到了不少东西,“创业需要很大的精力,你必须全职去做;同时,团队也很重要。”
遭受过两次创业失败的打击,如果不敢再尝试,就此放弃,也就没有今天的前程无忧以及今天的甄荣辉了。从失败中总结出了一些经验与教训,1998年甄荣辉又开始尝试新的投资项目——人力资源服务。
互联网创造了新机会
互联网经济的兴起,给甄荣辉带来新的机会,风险投资成了最热的话题。甄荣辉想借此良机把网站作大,决定引入风险投资。他为前程无忧网设计了一个美好的前程:引入投资、上市、做成国际品牌。
1998年甄荣辉和他的创业伙伴成立了一家人力资源服务公司。
之所以选择这个领域,与他的一段经历分不开。1994年,当时任贝恩公司中国区总裁的甄荣辉需要招募新人,他先在一份英文媒体上刊登了招聘信息,但效果很差。后来,经北京同事指点,他选择了北京人爱看的一份当地媒体,结果反馈很好。但甄荣辉自己却感到当时报纸的印刷质量太差。当时香港的《南华早报》每周有多达200多页的招聘专版,人力资源市场十分活跃。但是,比香港人口还多的北京却没有这样一份专业的招聘纸媒体。他隐约找到了市场的需求空白。
到了1998年,大陆的人才交流市场日趋活跃,无论是用人单位还是求职者个人,他们迫切需要一个更专业的、定位于白领青年的招聘渠道。市场已经成熟!甄荣辉经人介绍,和《中国贸易报》合作,首先在北京推出了《中国贸易报.前程招聘专版》。北京《前程招聘专版》的推出,获得了很大成功,受到了企业以及求职者的普遍欢迎。受到北京市场的启发与鼓舞,甄荣辉和他的创业团队,开始在全国复制北京模式。五年多,在全国19个城市与当地媒体合作,推出了针对当地市场的《前程招聘专版》。
1999年,互联网经济正在全球兴起,网络给甄荣辉带来了新的机遇。
1999年1月,甄荣辉先在上海推出了career-post.com网站,当然内容只能算是《前程招聘专版》的电子版,是一些企业招聘信息的集纳。1999年底,互联网经济开始膨胀,风险投资成了最热的话题。甄荣辉想借此良机把网站作大,决定引入风险投资。他为自己设计了一个美好的梦想:引入投资、上市、做成国际品牌。网站也因此易名为无忧工作网(51job.com)。无忧工作网的赢利模式十分符合中国国情,也受到国外风险投资者的青睐,很快,在2000年2月,一笔金额为1400万美元的投资进入了甄荣辉的创业公司。
2000年以前,甄荣辉在前程无忧的角色还只是一个“天使投资人”,不参与具体的经营管理。等到2000年1400万美元的风险投资进入后,公司发展需要他全力以赴地投入,这时,他再次面临着人生的选择:是继续做一个百万美金年薪的打工皇帝,还是放弃眼前的舒适去做一个前途未卜的小公司的ceo,领取6万美元的年薪?此时,甄荣辉已经37岁,在贝恩干了11年,如果继续待下去,“薪水很高,职务也很稳定”,但“那时就有些怕,觉得可能再干20年还是这样”。同时,互联网的起飞让他看到挑战背后的巨大机会:“在互联网业,即使你去年做得成功,过了一个年头必须重新洗牌。这种充满刺激的感觉很过瘾。可以赢得很大,也可以输得很大,完全看自己的机遇与功力。”
2000年4月,甄荣辉经过慎重考虑,决定离开贝恩,出任前程无忧ceo。
做中国人的ge公司
也许你看不清路,但你能看得见那里有一座山,那就是你的目标。我一直相信人才服务这块业务有前景,我相信我们有一天是能做到10亿美元的;我希望有一天,前程能像ge公司那样成为行业典范,影响更多的中国企业乃至跨国企业。
甄荣辉认为他的成功“一半是运气,一半是努力”。一直有好运气的甄这次也不例外。
2000年2月,前程无忧的1400万美元风险投资到位,而到了2000年4月,网络经济的泡沫开始破灭,很多创业网站不能再在投资市场上拿到钱了。而有了这笔投资,前程无忧却获得一个空间去慢慢成长。“有了这几年的时间给我们成长,我们可以把我们的规模做大,把我们的管理做好,把我们的市场地位巩固。”中国的人才市场正处在发育阶段,机会无限,前程无忧得以随着中国人才市场的成熟而成长,在甄荣辉看来,“这是非常幸运、非常快意的事”。
前程无忧的发展,其实并非一帆风顺,也有过十分艰难的时候。2000年、2001年网络泡沫破灭,全球经济放缓,9.11事件后众多跨国企业招聘计划冻结,2003年又遇到sars事件,形势似乎从来不是一片光明。在最艰难的时候,甄荣辉有没有过后悔,有没有想过放弃?
“我们知道人才服务这一块肯定是值得做的,即使最早在北京的东花市小学起步的时候我们也看得见。香港《南华早报》的招聘周刊有200多页,我们的《前程招聘专版》到现在还没有发展到200多页。所以,我知道成功的机会肯定是有的,而且这个机会只有在中国才能找到。日本的人才网站每年几十个亿美元的营业收入,我相信我们有一天是能做十亿美元的。但是你说是哪一天呢,我也说不出来。你说到底有多长时间呢,你到底要做多少东西才能得到呢,这个可能是摸着石头过河。但是信心我是一直有的。”甄荣辉从来没有怀疑过自己的选择。
据新浪财经报告显示:从1999年到2002年的三年间,前程无忧营业收入就增长了25倍。到2002年,整个财年度实现盈利,销售收入约2000万美元,2003年销售收入为3544万美元,增长77%。2004年前三季度销售收入为4386万美元,较去年同期增长80%。“我们不断加快速度开设办事处,现在已在全国20个城市开设有分公司或办事处;我们又不断开发新产品,为客户提供招聘猎头、培训测评和人事外包等十多项专业的人力资源服务……我们的产品线很长,服务很深入,和客户的联系紧密。这就是我们的竞争优势。”
四年前甄荣辉放弃贝恩的百万年薪而出任前程无忧6万年薪的ceo时,他的计划是将51job运作上市,但这只是一个开始,他心中还有一个更宏伟的梦想——要做一间中国人的ge公司。在甄荣辉理想中,“当企业成为一个行业或企业群里的典范,它的影响力可以超过它规模的数倍甚至数十倍。譬如ge公司,它的影响力是全球的,经营ge不再是经营一个企业那么简单,它在经营企业人的思想,它在与世人分享领先的管理经验。现在,前程无忧还很小,但我希望有一天,前程能像ge公司那样成为行业典范,影响更多的中国企业乃至跨国企业。”
这不是一个5年10年的工程,20年够不够呢?“在我退休之前,我希望能够实现这个愿望。”甄荣辉又开始了一个新的人生计划!
posted @
2006-07-25 10:22 崛起的程序员 阅读(380) |
评论 (0) |
编辑 收藏
对synchronized(this)的一些理解
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用.
举例说明:
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
package ths;
public class Thread1 implements Runnable {
public void run() {
synchronized(this) {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
}
}
}
public static void main(String[] args) {
Thread1 t1 = new Thread1();
Thread ta = new Thread(t1, "A");
Thread tb = new Thread(t1, "B");
ta.start();
tb.start();
}
}
结果:
A synchronized loop 0
A synchronized loop 1
A synchronized loop 2
A synchronized loop 3
A synchronized loop 4
B synchronized loop 0
B synchronized loop 1
B synchronized loop 2
B synchronized loop 3
B synchronized loop 4
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
package ths;
public class Thread2 {
public void m4t1() {
synchronized(this) {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
}
public void m4t2() {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
public static void main(String[] args) {
final Thread2 myt2 = new Thread2();
Thread t1 = new Thread(
new Runnable() {
public void run() {
myt2.m4t1();
}
}, "t1"
);
Thread t2 = new Thread(
new Runnable() {
public void run() {
myt2.m4t2();
}
}, "t2"
);
t1.start();
t2.start();
}
}
结果:
t1 : 4
t2 : 4
t1 : 3
t2 : 3
t1 : 2
t2 : 2
t1 : 1
t2 : 1
t1 : 0
t2 : 0
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
//修改Thread2.m4t2()方法:
public void m4t2() {
synchronized(this) {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
}
结果:
t1 : 4
t1 : 3
t1 : 2
t1 : 1
t1 : 0
t2 : 4
t2 : 3
t2 : 2
t2 : 1
t2 : 0
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
//修改Thread2.m4t2()方法如下:
public synchronized void m4t2() {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
结果:
t1 : 4
t1 : 3
t1 : 2
t1 : 1
t1 : 0
t2 : 4
t2 : 3
t2 : 2
t2 : 1
t2 : 0
五、以上规则对其它对象锁同样适用:
package ths;
public class Thread3 {
class Inner {
private void m4t1() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t1()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}
private void m4t2() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}
}
private void m4t1(Inner inner) {
synchronized(inner) { //使用对象锁
inner.m4t1();
}
}
private void m4t2(Inner inner) {
inner.m4t2();
}
public static void main(String[] args) {
final Thread3 myt3 = new Thread3();
final Inner inner = myt3.new Inner();
Thread t1 = new Thread(
new Runnable() {
public void run() {
myt3.m4t1(inner);
}
}, "t1"
);
Thread t2 = new Thread(
new Runnable() {
public void run() {
myt3.m4t2(inner);
}
}, "t2"
);
t1.start();
t2.start();
}
}
结果:
尽管线程t1获得了对Inner的对象锁,但由于线程t2访问的是同一个Inner中的非同步部分。所以两个线程互不干扰。
t1 : Inner.m4t1()=4
t2 : Inner.m4t2()=4
t1 : Inner.m4t1()=3
t2 : Inner.m4t2()=3
t1 : Inner.m4t1()=2
t2 : Inner.m4t2()=2
t1 : Inner.m4t1()=1
t2 : Inner.m4t2()=1
t1 : Inner.m4t1()=0
t2 : Inner.m4t2()=0
现在在Inner.m4t2()前面加上synchronized:
private synchronized void m4t2() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}
结果:
尽管线程t1与t2访问了同一个Inner对象中两个毫不相关的部分,但因为t1先获得了对Inner的对象锁,所以t2对Inner.m4t2()的访问也被阻塞,因为m4t2()是Inner中的一个同步方法。
t1 : Inner.m4t1()=4
t1 : Inner.m4t1()=3
t1 : Inner.m4t1()=2
t1 : Inner.m4t1()=1
t1 : Inner.m4t1()=0
t2 : Inner.m4t2()=4
t2 : Inner.m4t2()=3
t2 : Inner.m4t2()=2
t2 : Inner.m4t2()=1
t2 : Inner.m4t2()=0
posted @
2006-07-19 10:55 崛起的程序员 阅读(304) |
评论 (0) |
编辑 收藏
Configuration cfg = new Configuration().configure("/hibernate.cfg.xml");
for (Iterator iter = cfg.getTableMappings(); iter.hasNext();) {
Table table = (Table) iter.next();
for (Iterator iterator = table.getColumnIterator(); iterator.hasNext();) {
Column column = (Column) iterator.next();
System.out.println(column.getName());
}
}
posted @
2006-07-17 11:39 崛起的程序员 阅读(432) |
评论 (0) |
编辑 收藏
摘要: Spring Aop Step-By-Step
学习笔记(上)
www.uusam.com
最近由于工作需要,要求掌握关于
Spring
方面的东西。所以花了两个星期的时间来学习
Spring
的基本知识,主要包括
Ioc
...
阅读全文
posted @
2006-07-05 17:26 崛起的程序员 阅读(349) |
评论 (0) |
编辑 收藏
MRX3F-47B9T-2487J-KWKMF-RPWBY(VOL 中国工商银行版)
QC986-27D34-6M3TY-JJXP9-TBGMD
DG8FV-B9TKY-FRT9J-6CRCC-XPQ4G(VOL 上海政府专用)
使用
XP修改器修改成为以上任意一个序列号。修改完成后到如下地址验证是否通过,优先选择中国工商银行版本,有的xp使用上海政府专用的序列号不行。
http://www.microsoft.com/genuine/downloads/WhyValidate.aspx?displaylang=zh-cn验证结束!
验证成功后,可以下载更新安装Media Player 11 和 IE7。
posted @
2006-07-05 15:31 崛起的程序员 阅读(2970) |
评论 (1) |
编辑 收藏
Sun公司一名员工自己创作的歌,关于Java EE 5,很有意思的一首歌,程序员业余生活也可以这么丰富!
地址:http://tap.javalobby.org/javaee5.mp3
歌词:
Ladies and gentlemen, this is Java EE 5!
One, two, three, four, five
There's a technology I use day and night
For my application with a web frontend
They told me to use .Net
But I really don´t wanna
So many bugs I fixed last week.
My code is neat and talk is a cheap
I like Glassfish, JSF, persistence API
And as I continue you know they´re gettin´ sweeter
So what can I do I really beg you my Lord
To me codin' it´s just like a sport
All the bad code from the past, let me dump it
Please set in the trumpet
A little bit of injection in my life
A little bit of persistence by my side
A little bit of NetBeans is all I need
A little bit of EJB's what I see
A little bit of standards in the sun
A little bit of XML all night long
A little bit web services here I am
A little bit of code makes me real man
This is Java EE 5!
Jump up and down and move your code around
Shake your head to the sound bury bad code under ground
Move one step left and one step right
One to the front and one to the side
Refactor it once and refactor it twice
If it looks like this you're doin´ it right
A little bit of injection in my life
A little bit of persistence by my side
A little bit of NetBeans is all I need
A little bit of EJB's is what I see
A little bit of standards in the sun
A little bit of XML all night long
A little bit web services here I am
A little bit of code makes me real man
This is Java EE 5!
本文来源:http://www.blogjava.net/Andyluo/archive/2006/06/30/javasong.html
posted @
2006-07-04 08:47 崛起的程序员 阅读(330) |
评论 (0) |
编辑 收藏
1.下载http://www.eu.apache.org/dist/jakarta/tomcat-5/
这里注意,在jakarta-tomcat-5.0.28.exe以前是有默认的admin模块,在jakarta-tomcat-5.5.9.exe则没有安装默认的admin模块,这时http://127.0.0.1:8080/admin打开时则会出现
Tomcat's administration web application is no longer installed by default. Download and install the "admin" package to use it.
因此我们现在需要下载"admin"package 包
把jakarta-tomcat-5.5.x.zip 与 jakarta-tomcat-5.5.x-compat.zip 与 jakarta-tomcat-5.5.x-admin.zip
三个文件解压在同一个目录中
(如果使用jdk1.4,才需要compat.zip用jdk1.5就可以免了这个。)
2.修改jakarta-tomcat-5.5.x\conf\tomcat-users.xml.
添加管理员账号lizongbo,密码为lizongbopass.
新xml如下:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="lizongbo" password="lizongbopass" roles="admin,manager"/>
</tomcat-users>
有时在%CATALINA_HOME%\server\webapps\admin\WEB-INF\web.xml里面也要做些修改
<!-- Security is active on entire directory -->
<security-constraint>
<display-name>Tomcat Server Configuration Security Constraint</display-name>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<!-- Define the context-relative URL(s) to be protected -->
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.do</url-pattern>
<url-pattern>*.html</url-pattern>
</web-resource-collection>
<auth-constraint>
<!-- Anyone with one of the listed roles may access this area -->
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<!-- Login configuration uses form-based authentication -->
<login-config>
<auth-method>FORM</auth-method>
<realm-name>Tomcat Server Configuration Form-Based Authentication Area</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
<!-- Security roles referenced by this web application -->
<security-role>
<description>
The role that is required to log in to the Administration Application
</description>
<role-name>admin</role-name>
</security-role>
无论是 Authetication ( 身份验证 还是 Authorization ( 权限管控 都只有设置相关的 admin ROLE, 当你想要新增或修改相关的 AA, 就必须修改这一个文件, 来符合你的环境.
3.修改jakarta-tomcat-5.5.x\conf\server.xml来解决编码问题。
(给Connector 添加URIEncoding参数,参考http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx)
(可以设置成GB18030)
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="200"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"
compression="on" compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml"/>
<Connector port="8009"
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" URIEncoding="GBK"/>
4.启用支持gzip压缩.
(http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1&i=81169)
添加下列属性
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml"
5.设置虚拟主机。
在jakarta-tomcat-5.5.x\下建立文件夹vhost\www.mydomain.com。
然后修改jakarta-tomcat-5.5.x\conf\server.xml
<Engine defaultHost="localhost" name="Catalina">
<Host appBase="vhost/www.mydomain.com" name="http://www.mydomain.com/">
</Host>
<Host appBase="webapps" name="localhost">
</Host>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
</Engine>
6.添加数据库驱动,更新mail.jar和actiovation.jar
复制mysql-connector-java-3.0.16-ga-bin.jar,pg74.215.jdbc3.jar到 jakarta-tomcat-5.5.x\common\lib\
还有javamail 1.3.2的mail.jar,jaf-1_0_2的 activation.jar
msSQl 2000 JDBC sp3,msbase.jar,msutil,jar,mssqlserver.jar
7.配置SSL
参考 http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html
D:\j2sdk1.4.2_06\bin>%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA
输入keystore密码: lizongbossl
您的名字与姓氏是什么?
[tomcat5.5.x]: tomcat5.5.x
您的组织单位名称是什么?
[jakarta]: jakarta
您的组织名称是什么?
[apache]: apache
您所在的城市或区域名称是什么?
[hzcity]: hzcity
您所在的州或省份名称是什么?
[gdp]: gdp
该单位的两字母国家代码是什么
[CN]: CN
CN=tomcat5.5.x, OU=jakarta, O=apache, L=hzcity, ST=gdp, C=CN 正确吗?
[否]: y
输入<tomcat>的主密码
(如果和 keystore 密码相同,按回车):
(必须密码一致,因此直接回车)
然后再把userhome(例如:C:\Documents and Settings\lizongbo\)下的.keystore复制到
tomcat的conf\目录下。
(例如:D:\jakarta-tomcat-5.5.x\conf\.keystore
配置jakarta-tomcat-5.5.x\conf\server.xml
加上
<Connector port="8443"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="conf/.keystore"
keystorePass="lizongbossl"> <!--与先前设置的密码一致-->
</Connector>
8.禁止文件目录列表,
修改jakarta-tomcat-5.5.x\conf\web.xml,把listing设置为false
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
9.指定了自己的javaEncoding
(参考 http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>javaEncoding</param-name>
<param-value>GB18030</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
10.添加rar,iso等的mime-type映射
避免在浏览器里直接打开。
<mime-mapping>
<extension>mht</extension>
<mime-type>text/x-mht</mime-type>
</mime-mapping>
<mime-mapping>
<extension>rar</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
<mime-mapping>
<extension>iso</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
<mime-mapping>
<extension>ape</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
<mime-mapping>
<extension>rmvb</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
<mime-mapping>
<extension>ico</extension>
<mime-type>image/x-icon</mime-type>
</mime-mapping>
10.1对html静态页面设置编码
<!-- 修改下面两行以支持静态超文本的自动编码
-->
<mime-mapping>
<extension>htm</extension>
<mime-type>text/html;charset=gb2312</mime-type>
</mime-mapping>
<mime-mapping>
<extension>html</extension>
<mime-type>text/html;charset=gb2312</mime-type>
</mime-mapping>
</web-app>
11.添加welcome-file-list,并调整顺序。
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
posted @
2006-06-20 19:50 崛起的程序员 阅读(311) |
评论 (0) |
编辑 收藏
--h --help
|
打印常用启动参数的描述。 |
--cp:p additional_classpath
|
将指定的类路径附加到 IDE 的类路径之前。 |
--cp:a additional_classpath
|
将指定的类路径附加到 IDE 的类路径之后。 |
--fontsize size
|
设置字体大小,在 IDE 用户界面中用磅表示。如果未使用此选项,则字体大小为 11 磅。 |
--jdkhome jdk_home_dir
|
注意:测试 IDE 时是采用所支持的 Java 2 SDK 版本进行的,并且该版本与 IDE 捆绑在一起;因此,在大多数情况下,不需要使用此开关。 对于所有支持的平台(除 Mac OS 之外),缺省 JDK 就是与本产品捆绑在一起的 JDK,它位于 <安装目录>/java 中。对于 Mac OS,缺省 JDK 为计算机上安装的最新 JDK。
请使用指定的 Java 2 SDK 版本而不要使用缺省的 SDK。在 Microsoft Windows 系统中,缺省情况下,加载器会在注册表中查找并使用最新的可用 SDK。
请在升级 IDE 使用的 SDK 之前,备份用户目录。如果以后需要恢复到先前的 JDK,可以切换到已备份的用户目录,从而确保不丢失任何设置。
要切换 IDE 的用户目录,请使用 -userdir 开关。
|
--Jjvm_option
|
将指定的标志直接传递给 JVM。 |
--locale language[:country[:variant]]
|
使用指定的语言环境。支持的语言包括: 英语 (en)、西班牙语 (es)、韩语 (ko)、日语 (ja)、法语 (fr) 以及简体中文 (zh_CN)。 例如,在 <系统驱动器>:\Program Files\Sun\Creator2\bin 目录下,键入:
creator.exe --locale es
|
--userdir userdir
|
显式指定用户目录,该目录是存储用户设置的位置。 如果在 UNIX 系统中未使用此选项,则缺省情况下存储位置为$HOME/.Creator/2_1 。
在 Microsoft Windows 系统中,缺省位置是您第一次启动 IDE 时指定的位置。在大多数情况下,该位置为<系统驱动器>:\Documents and Settings\<用户名>\.Creator\2_1 。
您可以在“关于”对话框中确定当前的用户目录。选择“帮助”>“关于”,然后选择“详细信息”标签。此标签列出了用户目录位置以及其他产品详细信息。 |
posted @
2006-06-09 16:27 崛起的程序员 阅读(152) |
评论 (0) |
编辑 收藏