clq271520093

我的最新闪存
Never give up
 
 

与我联系

  • 发短消息

搜索

 

常用链接

  • 我的随笔
  • 我的空间
  • 我的短信
  • 我的评论
  • 更多链接
  • 我的参与
  • 我的新闻
  • 我的标签

留言簿

  • 给我留言
  • 查看留言

我参加的小组

  • ASP.NET
  • web标准设计
  • 蛋蛋日语学堂
  • 每日一句英语
  • 设计模式
  • Web技术联盟
  • jQuery
  • 每天一句日语
  • 软件工程师日语
  • 沪江日语电台博客园分站

我参与的团队

  • .net企业应用开发(0/0)
  • asp.net开发团队(0/0)

我的标签

  • 20080410(1)
  • 用C#2.0实现网络蜘蛛(1)
  • 成功并不像你想象的那么难 (1)
  • 26-29岁未婚女子的共同特点可操不可爱(1)
  • http://chuang.csdn.net/page/fcfbc496-dd9e-4df9-88f(1)

随笔分类

  • 生活哲学 (rss)

随笔档案(2)

  • 2008年8月 (1)
  • 2008年4月 (1)

文章分类(4)

  • 健康养生(2) (rss)
  • 赚钱创意(2) (rss)

技术

  • .NET 程序员必备工具下载
  • Anytao
  • Benny Ng 的猫博客 (rss)
  • McrosoftASP.NET
  • 微软ASP.NET官方网站
  • OOP80
  • Service Is Living
  • Service Is Living
  • Sonne & Cynthia の幸福生活
  • SQL注入漏洞
  • webabcd博客
  • 包建强的开源地带-博客园精华集 (rss)
  • 代震军BLOG
  • 机会来了,你准备好了吗 (rss)
  • 景春雷 (rss)
  • 三省吾身
  • 伍迷家园
  • 伍迷家园
  • 项目那点儿事
  • pm
  • 彧轩
  • 中国最年轻的编程爱好者
  • 专著web

日语学习

  • 初级日语--沪江
  • 和风日语论坛
  • 沪江学习网

网络资源

  • bt下载
  • 松偶合空间

英语学习

职场成长

  • 项目管理-德仔工作室
  • 职场天地-天涯-技术以外的工作能力
  • 职场天地-天涯-技术以外的工作能力
  • 职场天地-天涯-技术以外的工作能力

最新评论

阅读排行榜

  • 1. 朋友,请不要焦虑 [转][收藏](20)
  • 2. 20080410(9)

评论排行榜

  • 1. 朋友,请不要焦虑 [转][收藏](0)
  • 2. 20080410(0)

Powered by: 博客园
模板提供:沪江博客
博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅订阅 | 管理

2009年1月23日

【创业故事】蒋涛 从程序员到老总经历

http://chuang.csdn.net/page/fcfbc496-dd9e-4df9-88f1-4d164efc9487

对于每一个程序员来说都是尴尬的年龄,仿佛舞台上不知不觉间已经谢幕,而自己仍在独舞;创业,对于每一个程序员来说都是曾经想过或者正在憧憬的梦 想,可是梦想与成功之间难以逾越的距离却也让多少人望而却步……蒋涛,这位曾经的程序员,如今的CSDN掌门人、《程序员》杂志总编辑,当他一路走过时, 也许我们可以从他的背后找到一些值得借鉴的经验,至少会给自己一些创业的勇气。


蒋涛:从程序员到老总

他曾经是一个程序 员,他了解程序员最关注什么、最需要什么,所以当他决定不再写程序时,他为所有的程序员建造了一个成长的平台、一个交流的家园,他就是CSDN的掌门人 ——蒋涛。蒋涛的头衔很多,从CSDN掌门人、总经理一直到总编辑,可是我还是愿意叫他“软件人”,因为不管他的角色在如何转变,其实都从未离开软件。

也许正如蒋涛所说:软件是一个非常特殊的产业,一旦进入就再难挣脱。

曾经“失业”

1991年,是那个时代的中国大学生都不会忘记的一年,因为从那年起,大学生毕业不再包分配,而自主择业、双向选择第一次登上了中国高校的历史舞台,蒋涛就是那年的毕业生。

蒋涛应该算是优秀的学生,毕业后他回到了家乡武汉,成为武汉市工商银行科技处的一名职员。一直以来,银行的工作都是大多数人梦寐以求的美差,但是蒋涛却在银行只呆了一年就选择了离开。

蒋涛说:“那时的工作实在是百无聊赖,还没有实现信息化办公的银行,科技处根本形同虚设,在那里不需要技术只需要关系和资历,而除了技术再无其它的我在那里既感受不到工作的乐趣,也看不到自己明天的希望,所以只有选择辞职。”

辞职后的蒋涛来到了深圳,这个邓xiao平南巡刚刚走过的地方,这个改革开放的试验田。在那里,蒋涛找到了自己第一份跟软件有关的工作,他被应聘到巨人集团,成为了一名编程人员。讲到此处,蒋涛幽默地说:“可以说1992年是个转折,对国家是,对我也是!”

呆 在巨人集团的三年,是蒋涛踏踏实实做程序的三年,更是为蒋涛以后走向管理层奠基的三年。在那里,蒋涛从一个最底层的程序员做起,一直做到中文应用软件部门 经理。蒋涛对于那段人生一定有着深厚的感情,因为时至今日,当我问起他时,他还不无自豪地告诉我他在巨人曾经领导开发过国内第一块手写版,虽然现在看来程 序并不复杂,但是在当初那个还在使用windows2.0的时代,这无疑是个不同凡响的工程。


很难给蒋涛的这段人生一个准确的定义。这段时间他在不停歇地漂与泊,不停歇地转换角色,一变再变。不过如果没有这段时间的积累和沉淀,如果没有这段时间带给蒋涛那么多来自于各行各业的信息和经验,那末也就不会有他今天的成功。

走 出“巨人”前的蒋涛,已经是个不大不小的“官”——中文应用软件部门经理,所以蒋涛并不是一个人“远走高飞”,而是带着整个部门一起离开的。蒋涛说,95 年的深圳是创业者的乐园,因为那里有太多的风险投资人。也许是“一朝被蛇咬,十年怕井绳”,也许是深圳的创业氛围深深地影响了他,蒋涛不再想去寻觅落脚之 地,而是决定自行创业。于是,当一位做房地产的老板决定给他的项目投资后,蒋涛带着他的老部下成立了一家软件公司。公司定位于做定制软件,而作为原部门经 理的蒋涛则顺理成章地成为老总,这无疑也是蒋涛人生历程中的第一次创业。

一年后,公司花光了第一笔投资,而此时,蒋涛才发现自己的投资商原来是一家集体企业。而这家企业的改朝换代,也就注定公司失去了投资来源,于是蒋涛的第一次创业因断炊而告终。

这 次失败并没有让蒋涛气馁,相反,这次创业的经历教会了他太多的东西:“那次经历让我认识到,作为一名软件企业的老总,不仅需要技术,需要懂得管理,更需要 有市场意识。做软件首先要了解市场,了解市场需要什么;其次要正确评估自身的能力,看自己到底有没有能力满足这种需要,这样一来才不会导致公司在业务定位 上出错。我的这次失败就是没有找准定位,其实当年如果投资可以继续的话,我们一定会吸取教训、转型业务,只不过当年没能有这个机会。”

以后的日子里,蒋涛做过许多,他曾经待业在家沉淀自己、思考人生;他曾经在金山做副总,体会作为管理者所必须具备的素质;他甚至曾经再度尝试创业——北京豪杰公司虽然在蒋涛的创业史中只是昙花一现,但他还是深刻体会到了成功所必需的“为”和“不为”。

如果说第一次创业给了蒋涛创业的决心的话,那么以后的这段时间对于蒋涛来讲无疑是一种历炼,这些历炼让他积累了经验,蓄势待发把握真正属于自己的机遇。

应运而生的成功

1998年蒋涛待业在家,刚刚迈过而立之年的他开始酝酿自己人生的又一次创业。经历和现实都让蒋涛认识到“靠技术创业”对于他而言已经不再现实,可是除了技术自己还有什么,他百思不得其解,只得天天对着电脑发呆。

象所有的程序员一样,蒋涛习惯收集一些对自己编程有价值的专业资料,久而久之,这些资料就充满了机器的每一个角落,而如何整理成了他最头疼的一件事。待业在家的蒋涛百无聊赖之下决定和朋友一起把这些资料分门别类进行整理,而后以光盘的形式出版。

《程 序员大本营》的畅销,无疑给了蒋涛创业的信心;但是光盘的存储局限性也使得《程序员大本营》很难再有广阔的发展空间,蒋涛开始思索新的途径。不知是 1999年互联网的热度点燃了蒋涛的灵感,还是作为技术人员的蒋涛发现了国内技术网站的空白,总之在他的心中开始有了网站的最初模型:多功能,综合性,和 《程序员大本营》互相依存、相辅相成。就这样,在1999年3月,国内第一家软件类技术专业网站应运而生!网站有着一个脱胎于MSDN的宏亮名字—— CSDN(中国软件网),简简单单的几个字无疑蕴含了蒋涛对于它的期望——不仅要做时间上的第一,更要成为国内技术型专业网站中的第一权威。

如 果说CSDN网站的诞生是来自于蒋涛的灵感,那么CSDN网站的成功则是因为蒋涛多年来之于软件业的坚持和积累。蒋涛曾经是最前沿的技术人员,所以他可以 如此真切地了解程序员的所需、所好;蒋涛有一群传媒界的好朋友,所以他会想到利用网站的专业技术资源办杂志;蒋涛曾经致力于技术类丛书的评论,所以他会想 到做图书,为软件开发者提供最专业的书籍和最实用的范例,让他们真的能够在书中找到“黄金屋”;蒋涛曾经是软件项目的管理人,蒋涛深知他们最缺前沿技术, 所以他会想到做前沿技术的培训,让无暇顾及新技术的软件人再也不用担心被淘汰的宿命……蒋涛曾经经历过软件行业内的太多角色,所以他想着为每一种角色提供 权威的、前沿的、最全面的服务,这无疑也使得以CSDN网站为核心的业务平台日渐丰腴:1999.12CSDN网站独具特色的积分制专业论坛推 出;2000.10创办面向专业开发人员的杂志《程序员》,填补了中国技术综合刊物的空白;2001.3CSDN网站举办“首届全国优秀共享软件及自由软 件评选活动”,成为中国共享软件和自由软件发展的重要里程碑;2001.9推出《程序员大本营》2001系列,这一系列三年累计正版销售16万 套;2002.1推出《程序员增值合订本》,成为当年十大技术畅销书之一,开创国内杂志合订本销售记录;2002.3《程序员》杂志推出包括IT技术十大 人物,IT技术十佳作者,IT技术十佳图书业内十佳评选;2002.7CSDN网站全面改版,网站注册会员突破30万;2003.6与电子工业出版社联合 成立博文视点( www.broadview.com.cn)资讯有限公司,专注于计算机专业图书出版;2003.7创办《CSDN开发高手》,面向软件技术学习和提高的 杂志;2003.10创办IT专业电商网第二书店(www.dearbook.com);2003.12与中科院软件所联合举办“首届中国软件技术大会 ”,是国内首次非厂商的独立软件技术大会;2004.3与微软(中国)公司,国际CMP媒体集团联合创办《MSDN开发精逊;2004.5CSDN网站正 式推出Blog服务,第二书店开通广州、上海直属分站。

仅仅五年的时间,CSDN网站就已经从一个点发展到一条线,从一条线延伸到一个 面。回顾CSDN网站五年来的成长历程,蒋涛不无感慨,他说自己并没有成功,他的理想是建立以CSDN网站为核心,整合包括期刊杂志、图书出版、电子商 务、教育培训、会展活动的多种业务,形成独特的立体式互动运营模式,为软件开发者和软件开发及应用企业提供权威的、前沿的、全面的服务。时至今日,整个平 台的搭建工作已经完成了3/5,剩下的2/5还在酝酿之中。蒋涛希望可以在06年完成整个平台的搭建,到那时公司就会有了可持续性发展的基础,到那时他才 认为自己成功了。

采访手记:

第一次见到蒋涛,觉得他既象一名程序员,也象一位记者,后来我终于明白了他为什么会同时具备两种气质,因为他是一名软件传媒人,他在以传播的理念经营着软件产业。

看着蒋涛新制定的CSDN“立体式互动运营模式”图,仿佛看着蒋涛过去和未来的人生。记得有人说过,人生就是跳舞,只不过音乐的不同让我们有了迥异的舞步。那蒋涛应该是在伴着施特劳斯的圆舞曲舞动人生,三步舞出一个圆,三步舞出一个圆,而圆心却永远只有一个——软件。

蒋涛解惑创业

记者:您从技术人员转型成为管理人员的过程中,遇到过的最大瓶颈是什么?

蒋 涛:最大的瓶颈就是自我心态的调整。程序员一般以自我为中心,靠技术吃饭,一旦转为管理人员,就会因为脱离了技术而萌生一种失落感,这是程序员转型过程中 最大的一个问题。作为程序员,即使有很好的技术,也不一定要永远沿着一条路走下去,很多时候你需要走其他的路才会有突破性的发展。不过转走其他的路线也并 非意味着要完全脱离技术,相反,每一行都有自己领域的知识,软件业也不例外。很多时候正是因为你有这方面的专业技能,才能更好地把握发展机会,拥有比别人 更加开阔的发展道路。


蒋涛:我想对于每一个创业者而言,最大的困难都是发不出工资。我还算幸运,没有遇到过这样的情形,不过在公司刚开始成立的那半年,处于生存期的我们在生命线上苦苦挣扎,那半年我没有拿过一分钱的工资。不过我还是坚持了下来,因为我相信自己一定会成功。

记者:您认为创业成功有捷径吗?

蒋 涛:如果说有的话,就是坚持!每一个公司运营之初都会有自己的一段生存期,在这段时期只要还有一丝希望就一定不要放弃,坚持下来的就会有机会,就会成功。 这样的例子有很多,像金山就是,金山的坚韧使得她拥有了比任何公司都旺盛的生命力。不过这种坚持是需要条件的,最起码要有资金上的支持。

记者:您曾经做过经理人,如今是自己在创业,您认为经理人和创业者这两种角色最大的区别在哪里?

蒋涛:打个比方来说吧,如果公司在某个时期遇到了很多发展障碍,如果您是在公司里做“经理人”,那么与你无关的障碍你就可以置之不理;但是如果你是创业者,是自己做公司,那么就不会存在与你无关的障碍了。

记者:您是程序员转型创业者的成功典范,那么您的公司里有没有像您这样转型创业的程序员呢?

蒋涛:有。

记者:您对他们持什么态度?

蒋 涛:我认为这是一种正常现象,当一个人觉得企业的发展速度和他自身的发展速度不能匹配时,就很容易想到自己创业,我本身就是这样的人。我的公司中辞职创业 的员工我会力所能及地支持他,我觉得这对于公司而言并不是一件坏事,而且从某种意义上来讲这是一件好事,这说明我们公司是可以培养人才、有利于员工成长 的。不过如果员工是拿和我同样的技术去创业,并和我做恶性竞争的话,那么自然是比较郁闷的事情,如果有这种事情发生的话,我只能诉诸于法律。

posted @ 2009-01-23 09:54 无澍 阅读(15) | 评论 (0) | 编辑
 

2008年8月13日

朋友,请不要焦虑 [转][收藏]
最近,园子的里老有朋友问我,学习的方法,问我怎样才能成为高手,其实我算不上什么高手,顶多,就一IT民工,平常搭搭架子,堆堆积木,在某些方面,我甚至没有入门。

     问这些问题的朋友,都非常不错,非常的上进,你们都很想做点什么,但又找不到适合自己的学习方式,你们看到网上一些朋友写的一些洋洋洒洒的技术文章,很是羡慕,常自叹不如;你们常想,为什么我还是”菜鸟“?我什么时候能成”大牛“?这样的想法,或多或少,都在你们的脑海中冒出过;其实,这一切的一切都不能说明谁谁不够优秀,不够聪明;你们只是缺少信心而已,缺少体现自己价值的时机,或者说你们的价值得不到大众,或者说老总的肯定与认可;所以有部分朋友,开始焦虑,开始疑惑。

 

    先不说其他的,咱们先说说焦虑给我们身体都带来些什么?你是否感觉,头稍微有点张,而且特别容易累,记忆力开始减退,同事刚刚交代事,你不一会就忘了;稍有不如意的地方,你暴跳如雷,你自己都不知道,为什么要发脾气。事后,你时常为自己的过激行为向老婆,或女朋友道歉,当然你一般是不会向同事发脾气的。还有非常明显的一点,你皮肤的油脂明显分泌得比平常多,此时你的头发,比平常都油,而且稍微有脱发的现象,不信你去看看你的键盘,或者你的枕头,没错吧?

 

    种种现象,在此就不一一列举了。如果你有上叙两种以上的情况,那说明你已经非常危险了,要不了多久,你的记忆力会大大的减退,你的头发会一天比一天少。我想,你也不想秃顶吧?

 

    要治疗此病症,也不难,但也不简单;一般从两方面入手,一是物理治疗,即身体肌理上的治疗,二是心理治疗,这也是根本,正所谓象又心生。先说说物理治疗,平常要少窝在办公室,多走动走动,即使你没什么事。下班后,不要马上打开你那该死的电脑,请把你的”本本“扔进柜子里,扔保险箱也行,你可以打打球,或者爬爬山,或者游游泳,如果这些条件都没有,你可以跑跑长跑,如果你觉得跑步也累,那就陪女朋友去看看电影,逛逛大街。

 

    只要坚持一两周,你会明显感觉你不失眠了,你难道没感觉你的脚步也轻了几许?甚至脾气都小了点吗?

 

    光做这些,还不够,得有心里治疗,心理治疗的唯一办法,就是在一段时间内提高自己,让自己的价值得到体现。你应尽快溶入你的团队,并发挥自己的力量,不要怀疑自己的能力,你完全够格,你不要老想着,你技术不好,你这个技术细节没打通,那个技术问题没搞定,先别管那么多,先溶入团队,尽量承担多的任务,show一把自己,给自己找点信心;话又说回来,又有几个项目的技术问题,需要你去考虑的呢?项目组长干什么的?项目经理干什么的?

 

    当然,你不能把你的全部精力,都花在项目开发上(可能有些老总不太喜欢听),有些朋友总认为自己做过两个项目,觉得自己牛,还用买书吗?大错特错,一个技术,你如果没有系统的学习过,你算不上真正理解了她,就好象有的高手,一笔试就”框瓢“。所以,你得买上两本好书,晚上,在你最清醒的时候看一两章,记住,千万不要一次把书全看完了,因为你下次再看的时候,就没什么悬念,就没了激情,所以 好东西要慢慢品。

 

    再者,人的记忆都是有时限的,有什么好想法,或者某个技术解决方法,尽量用笔,或者用键盘敲出来,不要掖着,因为你掌握的技术在某种程度上讲,压根算不上技术。尽量和朋友共享,只有共享了,其他人才能发现问题,你也才能更好的进步。

 

    经过上面的一些治疗方法,你是否已经感觉好多了?当然,要痊愈,还得靠自己不断修炼,以达“笑傲江湖”的境界...

 

结束语

    这些,都是本人一年前的感受,或许在某些方面有失偏颇,大家可以一笑而过,希望对那些正在摸索焦虑的朋友,带来点福音...

posted @ 2008-08-13 09:16 无澍 阅读(20) | 评论 (0) | 编辑
 

2008年5月14日

成功并不像你想象的那么难 [转]
很多事情并不是因为难到我们不敢做、做不了,而是因为我们不敢做事情才难的。

    1965年,一位韩国学生到剑桥大学主修心理学。在喝下午茶的时候,他常到学校的咖啡厅或茶座听一些成功人士聊天。这些成功人士包括诺贝尔奖获得者,某一些领域的学术权威和一些创造了经济神话的人,这些人幽默风趣,举重若轻,把自己的成功都看得非常自然和顺理成章。时间长了,他发现,在国内时,他被一些成功人士欺骗了。那些人为了让正在创业的人知难而退,普遍把自己的创业艰辛夸大了,也就是说,他们在用自己的成功经历吓唬那些还没有取得成功的人。作为心理系的学生,他认为很有必要对韩国成功人士的心态加以研究。

    1970年,他把《成功并不像你想像的那么难》作为毕业论文,提交给现代经济心理学的创始人威尔.布雷登教授。布雷登教授读后,大为惊喜,他认为这是个新发现,这种现象虽然在东方甚至在世界各地普遍存在,但此前还没有一个人大胆地提出来并加以研究。惊喜之余,他写信给他的剑桥校友、当时正坐在韩国政坛第一把交椅上的人朴正熙。他在信中说,“我不敢说这部著作对你有多大的帮助,但我敢肯定它比你的任何一个政令都能产生震动。”

    后来这本书果然伴随着韩国的经济起飞了。这本书鼓舞了许多人,因为他们从一个新的角度告诉人们,成功与“劳其筋骨,饿其体肤”、“三更灯火五更鸡”、“头悬梁,锥刺股”并没有必然的联系。只要你对某一事业感兴趣,长久地坚持下去就会成功,因为上帝赋予你的时间和智慧够你圆满做完一件事情。后来,这位青年也获得了成功,他成了韩国泛业汽车公司的总裁。

    温馨提示:人世中的许多事,只要想做,大都能做到,该克服的困难,也都能克服,用不着什么钢铁般的意志,更用不着什么高超的智力、技巧或谋略。只要一个人还在朴实而饶有兴趣地生活着,不懈地努力,他终究会发现,造物主对世事的安排,都是水到渠成的。

posted @ 2008-05-14 17:44 无澍 阅读(3) | 评论 (0) | 编辑
 

2008年4月25日

用C#2.0实现网络蜘蛛-转

摘要:本文讨论了如何使用C#2.0实现抓取网络资源的网络蜘蛛。使用这个程序,可以通过一个入口网址(如http://www.comprg.com.cn)来扫描整个互联网的网址,并将这些扫描到的网址所指向的网络资源下载到本地。然后可以利用其他的分析工具对这些网络资源做进一步地分析,如提取关键词、分类索引等。也可以将这些网络资源作为数据源来实现象Google一样的搜索引擎。
关键词:C#2.0,Html,网络蜘蛛, 键树,正则表达式

一、引言

    在最近几年,以Google为首的搜索引擎越来越引起人们的关注。由于在Google出现之前,很多提供搜索服务的公司都是使用人工从网络上搜集信息,并将这些信息分类汇总后作为搜索引擎的数据源。如yahoo公司一开始就是通过数千人不停地从网上搜集供查询的信息。这样做虽然信息的分类会很人性化,也比较准确,但是随着互联网信息爆炸式地增长,通过人工的方式来搜集信息已经不可能满足网民对信息的需求了。然而,这一切随着Google的出现而得到了彻底改变。Google一反常规的做法,通过程序7*24地从网上不停地获取网络资源,然后通过一些智能算法分析这些被下载到本地的网络资源,最后将这些分析后的数据进行索引后就形成了一套完整的基本上不需要人工干预的搜索引擎。使用这种模式的搜索引擎甚至可以在几天之内就可获取Internet中的所有信息,同时也节省了大量的资金和时间成本。而这种搜索引擎最重要的组成部分之一就是为搜索引擎提供数据源的网络蜘蛛。也就是说,实现网络蜘蛛是实现搜索引擎的第一步,也是最重要的一步。

二、网络蜘蛛的基本实现思想和实现步骤

    网络蜘蛛的主要作用是从Internet上不停地下载网络资源。它的基本实现思想就是通过一个或多个入口网址来获取更多的URL,然后通过对这些URL所指向的网络资源下载并分析后,再获得这些网络资源中包含的URL,以此类推,直到再没有可下的URL为止。下面是用程序实现网络蜘蛛的具体步骤。

    1. 指定一个(或多个)入口网址(如http://www.comprg.com.cn),并将这个网址加入到下载队列中(这时下载队列中只有一个或多个入口网址/)。
    2. 负责下载网络资源的线程从下载队列中取得一个或多个URL,并将这些URL所指向的网络资源下载到本地(在下载之前,一般应该判断一下这个URL是否已经被下载过,如果被下载过,则忽略这个URL)。如果下载队列中没有URL,并且所有的下载线程都处于休眠状态,说明已经下载完了由入口网址所引出的所有网络资源。这时网络蜘蛛会提示下载完成,并停止下载。
    3. 分析这些下载到本地的未分析过的网络资源(一般为html代码),并获得其中的URL(如标签<a>中href属性的值)。
    4. 将第3步获得的URL加入到下载队列中。并重新执行第2步。

三、实现数据的输入输出

    从实现网络蜘蛛的步骤中我们可以看出,下载队列的读、写URL的操作一直贯穿于整个系统中。虽然这个下载队列可以用.Queue类实现,但是各位读者要清楚地知道,在互联网上的URL可不是几十个、几百个这么少。而是以千万计的。这么多的URL显然不能保存在内存中的Queue对象中。因此,我们需要将它保存在容量更大的存储空间中,这就是硬盘。
    本文采用了一个普通的文本文件来保存需要下载和分析的URL(这个文本文件也就是下载队列)。存储格式是每一行为一个URL。既然将URL都保存在了文本文件中,就需要对这个文本文件进行读写。因此,在本节实现了一个用于操作这个文本文件的FileIO类。
    在实现FileIO类之前,先来说一下要如何操作这个文本文件。既然要将这个文件作为队列使用,那么就需要对这个文件进行追加行和从文件开始部分读取数据操作。让我们首先来实现向文件中追加行操作。实现代码如下:

    向文件中追加行的实现代码
// 这两个变量为类全局变量
private FileStream fsw;
private StreamWriter sw;

// 创建用于向文件中追加行的文件流和StreamWriter对象
public void OpenWriteFile(string file)
{
if (!File.Exists(file)) // 如果文件不存在,先创建这个文件
File.Create(file).Close();
// 以追加模式打开这个文件
fsw = new FileStream(file, FileMode.Append ,FileAccess.Write, FileShare.ReadWrite);
// 根据创建的FileStream对象来创建StreamWriter对象
sw = new StreamWriter(fsw);
}
// 关闭写文件流
public void CloseWriteFile()
{
if (fsr != null)
fsw.Close();
}
// 向文件中追加一行字符串
public void WriteLine(string s)
{
sw.WriteLine(s);
sw.Flush(); // 刷新写入缓冲区,使这一行对于读文件流可见
}

    在实现上述的代码时要注意,在创建FileStream对象时,必须使用FileShare.ReadWrite,否则这个文件无法被两个或两个以上的Stream打开,也就是说下面要介绍的读文件流将无法操作这个被写文件流打开的文件。从文件中读取行的实现代码如下:

    从文件中读取行的实现代码
// 这两个变量为类全局变量
private FileStream fsr;
private StreamReader sr;

// 创建用于读取文件行的文件流和StreamWriter对象
public void OpenReadFile(string file)
{
if (!File.Exists(file)) // 如果文件不存在,首先创建这个文件
File.Create(file).Close();
fsr = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Read,
FileShare.ReadWrite);
sr = new StreamReader(fsr);
}
// 关闭读文件流
public void CloseReadFile()
{
if(fsr != null)
fsr.Close();
}
// 从文件中读取一行
public string ReadLine()
{
if(sr.EndOfStream) // 如果文件流指针已经指向文件尾部,返回null
return null;
return sr.ReadLine();
}

    除了上述的读写文件的代码外,FileIO还提供了一个IsEof方法用来判断文件流指针是否位于文件尾部。IsEof方法的实现代码如下如下:

IsEof方法的实现代码
// 用于判断文件流指针是否位于文件尾部
public bool IsEof()
{
return sr.EndOfStream;
}

    FileIO类不仅仅用于对下载队列的读写。在后面我们还会讲到,网络蜘蛛通过多线程下载网络资源时,每一个线程将自己下载的网络资源保存在属于自己的一个目录中。每个这样的目录都有一个index.txt文件,这个文件保存了当前目录的网络资源的URL。向index.txt文件中追加URL也用到了FileIO(index.txt不需要读取,只需要不断地追加行)。


四、线程类的实现

    要想使网络蜘蛛在有限的硬件环境下尽可能地提高下载速度。最廉价和快捷的方法就是使用多线程。在.net framework2.0中提供了丰富的线程功能。其中的核心线程类是Thread。一般可使用如下的代码创建并运行一个线程:

    在C#中使用线程的演示代码
private void fun()
{
// 线程要执行的代码
}
public void testThread()
{
Thread thread;
thread = new Thread(fun); // 创建一个Thread对象,并将fun设为线程运行的方法
thread.Start(); // 运行一个线程
}

    虽然上面的代码比较简单地创建并运行了一个线程,但是这段代码看起来仍然不够透明,也就是客户端在调用线程时仍然需要显式地使用Thread类。下面我们来实现一个用于创建线程的MyThread类。C#中的任何类只需要继承这个类,就可以自动变成一个线程类。MyThread类的代码如下:

    MyThread类的实现代码
// 任何C#类继承MyThread后,就会自动变成一个线程类
class MyThread
{
private Thread thread;
public MyThread()
{
thread = new Thread(run); // 创建Thread对象
}
// 用于运行线程代码的方法,MyThread的子类必须覆盖这个方法
public virtual void run()
{
}
public void start()
{
thread.Start(); // 开始运行线程,也就是开始执行run方法
}
// 使当前线程休眠millisecondsTimeout毫秒
public void sleep(int millisecondsTimeout)
{
Thread.Sleep(millisecondsTimeout);
}
}


    我们可参照如下的代码使用MyThread类:

    测试的ThreadClass类的代码
class ThreadClass : MyThread
{
public override void run()
{
// 要执行的线程代码
}
}

// 测试ThreadClass类
public void testThreadClass()
{
ThreadClass tc = new ThreadClass();
tc.start(); // 开始运行线程,也就是执行run方法
}

    各位读者可以看看,上面的代码是不是要比直接使用Thread类更方便、直观、易用,还有些面向对象的感觉!

五、用多线程下载网络资源

    一般来说,网络蜘蛛都是使用多线程来下载网络资源的。至于如何使用多线程来下载,各个版本的网络蜘蛛不尽相同。为了方便和容易理解,本文所讨论的网络蜘蛛采用了每一个线程负责将网络资源下载到一个属于自己的目录中,也就是说,每一个线程对应一个目录。而在当前目录中下载的网络资源达到一定的数目后(如5000),这个线程就会再建立一个新目录,并从0开始计数继续下载网络资源。在本节中将介绍一个用于下载网络资源的线程类DownLoadThread。这个类的主要功能就是从下载队列中获得一定数量的URL,并进行下载和分析。在DownLoadThread类中涉及到很多其他重要的类,这些类将在后面的部分介绍。在这里我们先看一下DownLoadThread类的实现代码。

    DownLoadThread类的代码
class DownLoadThread : MyThread
{
// ParseResource类用于下载和分析网络资源
private ParseResource pr = new ParseResource();
private int currentCount = 0; // 当前下载目录中的网页数
// 用于向每个线程目录中的index.txt中写当前目录的URL
private FileIO fileIO = new FileIO();
private string path; // 当前的下载目录(后面带“\")
private string[] patterns; // 线程不下载符合patterns中的正则表达式的URL
public bool stop = false; // stop为true,线程退出
public int threadID; // 当前线程的threadID,用于区分其他的线程

public DownLoadThread(string[] patterns)
{
pr.findUrl += findUrl; // 为findUrl事件赋一个方法
this.patterns = patterns;
}
// 这是一个事件方法,每获得一个URL时发生
private void findUrl(string url)
{
Common.addUrl(url); // 将获得的URL加到下载队列中
}
private void openFile() // 打开下载目录中的index.txt文件
{
fileIO.CloseWriteFile();
fileIO.OpenWriteFile(path + Common.indexFile);
}
public override void run() // 线程运行方法
{
LinkedList<string> urls = new LinkedList<string>();
path = Common.getDir(); // 获得下载目录
openFile();
while (!stop)
{
// 当下载队列中没有URL时,进行循环等待
while (!stop && urls.Count == 0)
{
Common.getUrls(urls, 20); // 从下载队列中获得20个url
if (urls.Count == 0) // 如果未获得url
{
// 通知系统当前线程已处于等待状态,
// 如果所有的线程都处于等待状态,
// 说明所有的网络资源都被下载完了
Common.threadWait(threadID);
sleep(5000); // 当前线程休眠5秒
}
}
StringBuilder sb = new StringBuilder();
foreach (string url in urls) // 循环对这20个url进行循环下载分析
{
if (stop) break;
// 如果当前下载目录的资源文件数大于等于最大文件数目时,
// 建立一个新目录,并继续下载
if (currentCount >= Common.maxCount)
{
path = Common.getDir();
openFile();
currentCount = 0; // 目录
}
// 每个下载资源文件名使用5位的顺序号保存(没有扩展名),
// 如00001、00002。下面的语句是格式化文件名
string s = string.Format("{0:D5}", currentCount + 1);
sb.Remove(0, sb.Length);
sb.Append(s);
sb.Append(":");
sb.Append(url);
try
{
// 下载和分析当前的url
pr.parse(url, path + s, patterns);
Common.Count++;
// 将当前的url写入index.txt
fileIO.WriteLine(sb.ToString());
currentCount++;
}
catch (Exception e)
{

}
}
urls.Clear();
}
}
}
}

六、分析网络资源

    对下载的网络资源进行分析是网络蜘蛛中最重要的功能之一。这里网络资源主要指的是html代码中<a>标签的href属性值。状态和状态之间会根据从html文件中读入的字符进行切换。下面是状态之间切换的描述。

状态0:读入'<'字符后切换到状态1,读入其他的字符,状态不变。
状态1:读入'a'或'A',切换到状态2,读入其他的字符,切换到状态0。
状态2:读入空格或制表符(\t),切换到状态3,读入其他的字符,切换到状态0。
状态3:读入'>',成功获得一个<a>,读入其他的字符,状态不变。为了更容易说明问题。在本文给出的网络蜘蛛中只提取了html代码中<a>中的href属性中的url。本文中所采用的分析方法是分步进行提取href。首先将html代码中的<a>标签整个提出来。不包括</a>和前面的字符,如<a href="http://www.comprg.com.cn">comprg</a>中只提取<a href="http://www.comprg.com.cn">,而comprg</a>将被忽略,因为这里并没有url。
本文使用了一个状态机来的提取<a>,这个状态机分为五个状态(0 至 4)。第一个状态是初始态,最后一个状态为终止态,如果到达最后一个状态,说明已经成功获得了一个<a>

    状态机如图1所示。



图1

    最后一个双环的状态是最终态。下面让我们来看看获得<a>的实现代码。

getA方法的实现
// 获得html中的<a>
private void getA()
{
char[] buffer = new char[1024];
int state = 0;
String a = "";

while (!sr.EndOfStream)
{
int n = sr.Read(buffer, 0, buffer.Length);
for (int i = 0; i < n; i++)
{
switch (state)
{
case 0: // 状态0
if (buffer[i] == '<') // 读入的是'<'
{
a += buffer[i];
state = 1; // 切换到状态1
}
break;
case 1: // 状态1
if (buffer[i] == 'a' || buffer[i] == 'A') // 读入是'a'或'A'
{
a += buffer[i];
state = 2; // 切换到状态2
}
else
{
a = "";
state = 0; // 切换到状态0
}
break;
case 2: // 状态2
if (buffer[i] == ' ' || buffer[i] == '\t') // 读入的是空格或'\t'
{
a += buffer[i];
state = 3;
}
else
{
a = "";
state = 0; // 切换到状态0
}
break;
case 3: // 状态3
if (buffer[i] == '>') // 读入的是'>',已经成功获得一个<a>
{
a += buffer[i];
try
{
string url = getUrl(getHref(a)); // 获得<a>中的href属性的值
if (url != null)
{
if (findUrl != null)
findUrl(url); // 引发发现url的事件

}
}
catch (Exception e)
{
}
state = 0; // 在获得一个<a>后,重新切换到状态0
}
else
a += buffer[i];
break;
}
}
}
}

    在getA方法中除了切换到状态0外,其他的状态切换都将已经读入的字符赋给String变量a,如果最后发现变量a中的字符串不可能是<a>后,就将a清空,并切换到状态0后重新读入字符。
在getA方法中使用了一个重要的方法getHref来从<a>中获得href部分。getHref方法的实现如下:

    getHref方法的实现
// 从<a>中获得Href
private String getHref(string a)
{
try
{
string p = @"href\s*=\s*('[^']*'|""[^""]*""|\S+\s+)"; // 获得Href的正则表达式
MatchCollection matches = Regex.Matches(a, p,
RegexOptions.IgnoreCase |
RegexOptions.ExplicitCapture);

foreach (Match nextMatch in matches)
{
return nextMatch.Value; // 返回href
}
return null;
}
catch (Exception e)
{
throw e;
}
}

    在getHref方法中使用了正则表达式从<a>中获得href。在<a>中正确的href属性格式有三种情况,这三种情况的主要区别是url两边的符号,如单引号、双引号或没有符号。这三种情况如下所示:
情况1: <a href = "http://www.comprg.com.cn" > comprg</a>
情况2: <a href = 'http://www.comprg.com.cn' > comprg</a>
情况3: <a href = http://www.comprg.com.cn > comprg</a>
    getHref方法中的p存储了用于过滤这三种情况的href,也就是说,使用正则表达式可以获得上述三种情况的href如下:

从情况1获得得的href:href = "http://www.comprg.com.cn"
从情况2获得得的href:href = 'http://www.comprg.com.cn'
从情况3获得得的href:href = http://www.comprg.com.cn/

    在获得上述的href后,需要将url提出来。这个功能由getUrl完成,这个方法的实现代码如下:

getUrl方法的实现
// 从href中提取url
private String getUrl(string href)
{
try
{
if (href == null) return href;
int n = href.IndexOf('='); // 查找'='位置
String s = href.Substring(n + 1);
int begin = 0, end = 0;
string sign = "";
if (s.Contains("\"")) // 第一种情况
sign = "\"";
else if (s.Contains("'")) // 第二种情况
sign = "'";
else // 第三种情况
return getFullUrl(s.Trim());
begin = s.IndexOf(sign);
end = s.LastIndexOf(sign);

return getFullUrl(s.Substring(begin + 1, end - begin - 1).Trim());
}
catch (Exception e)
{
throw e;
}
}

    在获得url时有一点应该注意。有的url使用的是相对路径,也就是没有“http://host”部分,但将url保存时需要保存它们的完整路径。这就需要根据相对路径获得它们的完整路径。这个功能由getFullUrl方法完成。这个方法的实现代码如下:

getFullUrl方法的实现代码
// 将相对路径变为绝对路径
private String getFullUrl(string url)
{
try
{
if (url == null) return url;
if (processPattern(url)) return null; // 过滤不想下载的url
// 如果url前有http://或https://,为绝对路径,按原样返回
if (url.ToLower().StartsWith("http://") || url.ToLower().StartsWith("https://"))
return url;
Uri parentUri = new Uri(parentUrl);
string port = "";
if (!parentUri.IsDefaultPort)
port = ":" + parentUri.Port.ToString();
if (url.StartsWith("/")) // url以"/"开头,直接放在host后面
return parentUri.Scheme + "://" + parentUri.Host + port + url;
else // url不以"/"开头,放在url的路径后面
{
string s = "";
s = parentUri.LocalPath.Substring(0, parentUri.LocalPath.LastIndexOf("/"));
return parentUri.Scheme + "://" + parentUri.Host + port + s + "/" + url;
}
}
catch (Exception e)
{
throw e;
}
}

    在ParseResource中还提供了一个功能就是通过正则表达式过滤不想下载的url,这个功能将通过processPattern方法完成。实现代码如下:

    processPattern方法的实现代码
// 如果返回true,表示url符合pattern,否则,不符合模式
private bool processPattern(string url)
{
foreach (string p in patterns)
{

if (Regex.IsMatch(url, p, RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture)
&& !p.Equals(""))
return true;
}
return false;
}
    ParseResource类在分析html代码之前,先将html下载到本地的线程目录中,再通过FileStream打开并读取待分析的数据。ParseResource类其他的实现代码请读者参阅本文提供的源代码。

七、键树的实现

    在获取Url的过程中,难免重复获得一些Url。这些重复的Url将大大增加网络蜘蛛的下载时间,以及会导致其他的分析工具重复分析同一个html。因此,就需要对过滤出重复的Url,也就是说,要使网络蜘蛛下载的Url都是唯一的。达到这个目的的最简单的方法就是将已经下载过的Url保存到一个集合中,然后在下载新的Url之前,在这个集合中查找这个新的Url是否被下载过,如果下载过,就忽略这个Url。
    这个功能从表面上看非常简单,但由于我们处理的是成千上万的Url,要是将这些Url简单地保存在类似List一样的集合中,不仅会占用大量的内存空间,而且当Url非常多时,如一百万。这时每下载一个Url,就要从这一百万的Url中查找这个待下载的Url是否存在。虽然可以使用某些查找算法(如折半查找)来处理,但当数据量非常大时,任何查找算法的效率都会大打折扣。因此,必须要设计一种新的存储结构来完成这个工作。这个新的数据存储结构需要具有两个特性:

    1. 尽可能地减少存储Url所使用的内存。
    2. 查找Url的速度尽可能地快(最好的可能是查找速度和Url的数量无关)。

    下面先来完成第一个特性。一般一个Url都比较长,如平均每个Url有50个字符。如果有很多Url,每个Url占50个字符,一百万个Url就是会占用50M的存储空间。而我们保存Url的目的只有一个,就是查找某一个Url是否存在。因此,只需要将Url的Hashcode保存起来即可。由于Hashcode为Int类型,因此,Hashcode要比一个Url字符串使用更少的存储空间。
    对于第二个特性,我们可以使用数据结构中的键树来解决。假设有一个数是4532。首先将其转换为字符串。然后每个键树节点有10个(0至9)。这样4532的存储结构如图2所示:



图2

    从上面的数据结构可以看出,查找一个整数只和这个整数的位数有关,和整数的数量无关。这个键树的实现代码如下:

    KeyTree的实现代码
class KeyTreeNode // 键树节点的结构
{
// 指向包含整数下一个的结点的指针
public KeyTreeNode[] pointers = new KeyTreeNode[10];
// 结束位标志,如果为true,表示当前结点为整数的最后一位
public bool[] endFlag = new bool[10];
}
class KeyTree
{
private KeyTreeNode rootNode = new KeyTreeNode(); // 根结点
// 向键树中添加一个无符号整数
public void add(uint n)
{
string s = n.ToString();
KeyTreeNode tempNode = rootNode;
int index = 0;
for (int i = 0; i < s.Length; i++)
{
index = int.Parse(s[i].ToString()); // 获得整数每一位的值
if (i == s.Length - 1) // 在整数的最后一位时,将结束位设为true
{
tempNode.endFlag[index] = true;
break;
}
if (tempNode.pointers[index] == null) // 当下一个结点的指针为空时,新建立一个结点对象
tempNode.pointers[index] = new KeyTreeNode();
tempNode = tempNode.pointers[index];
}
}
// 判断一个整数是否存在
public bool exists(uint n)
{
string s = n.ToString();
KeyTreeNode tempNode = rootNode;
int index = 0;
for (int i = 0; i < s.Length; i++)
{
if (tempNode != null)
{
index = int.Parse(s[i].ToString());
// 当整数的最后一位的结束标志为true时,表示n存在
if((i == s.Length - 1)&& (tempNode.endFlag[index] == true))
return true;
else
tempNode = tempNode.pointers[index];
}
else
return false;
}
return false;
}
}

    上面代码中的KeyTreeNode之所以要使用结束标志,而不根据指针是否为空判断某个整数的存在,是因为可能存在长度不相等的整数,如4321和432。如果只使用指针判断。保存4321后,432也会被认为存在。而如果用结束标志后,在值为2的节点的结束标志为false,因此,表明432并不存在。下面的UrlFilter使用了上面的键树来处理Url。

    UrlFilter类的实现代码
// 用于将url重新组合后再加到键树中
// 如http://www.comprg.com.cn和http://www.comprg.com.cn/是一样的
// 因此,它们的hashcode也要求一样
class UrlFilter
{
public static KeyTree urlHashCode = new KeyTree();
private static object syncUrlHashCode = new object();
private static string processUrl(string url) // 重新组合Url
{
try
{
Uri uri = new Uri(url);
string s = uri.PathAndQuery;
if(s.Equals("/"))
s = "";
return uri.Host + s;
}
catch(Exception e)
{
throw e;
}
}
private static bool exists(string url) // 判断url是否存在
{
try
{
lock (syncUrlHashCode)
{
url = processUrl(url);
return urlHashCode.exists((uint)url.GetHashCode());
}
}
catch (Exception e)
{
throw e;
}
}

public static bool isOK(string url)
{
return !exists(url);
}
// 加处理完的Url加到键树中
public static void addUrl(string url)
{
try
{
lock (syncUrlHashCode)
{
url = processUrl(url);
urlHashCode.add((uint)url.GetHashCode());
}
}
catch (Exception e)
{
throw e;
}
}

}

八、其他部分的实现

    到现在为止,网络蜘蛛所有核心代码都已经完成了。下面让我们做一个界面来使下载过程可视化。界面如图3所示。



图3

    这个界面主要通过一个定时器每2秒钟获得个一次网络蜘蛛的下载状态。包括获得的URL数和已经下载的网络资源数。其中这些状态信息都保存在一个Common类的静态变量中。Common类和主界面的代码请读者参阅本文提供的源代码。

九、结束语

    至此,网络蜘蛛程序已经全部完成了。但在实际应用中,光靠一台机器下载整个的网络资源是远远不够的。这就需要通过多台机器联合下载。然而这就会给我们带来一个难题。就是这些机器需要对已经下载的Url进行同步。读者可以根据本文提供的例子,将其改成分布式的可多机同时下载的网络蜘蛛。这样网络蜘蛛的下载速度将会有一个质的飞跃。



参考文献:

1. Programming C#, 4th Edition By Jesse Liberty
2. Professional C# 2005 byChristian Nagelet al.
3. Core C# and .NET By Stephen C. Perry
4. Working with Microsoft Visual Studio 2005 by Craig Skibo, Marc YoungandBrian Johnson
5. Professional C# 2005 with .NET 3.0 by Christian Nagel, Bill Evjen, Jay Glynn, Morgan SkinnerandKarli

posted @ 2008-04-25 17:13 无澍 阅读(24) | 评论 (0) | 编辑
 

2008年4月10日

[转贴]深圳八年职场与人生感言
很快就要买掉深圳的房子回乡下自己折腾了。真舍不得深圳,谨以多年来的职场和生活感悟献丑如下:
  1、良好的心态很重要,找到好的单位不要得意忘形,一下子不得志也不要郁闷。无任何时何,不要让心灵都扭曲了。
  2、遇到挫折一定要找人倾诉,就算你不喝酒不抽烟,也要打破这个戒律。放松比压抑更好,健康的人格是迎接下一步挑战的强力武器。
  3、不要过分埋怨别人尔虞我诈、阴奉阳违。你能与狼共舞,适应社会,才能实现你的理想。一些事业有成之人士忍受事事非非、评头论足、指指点点,真是忍辱负重。没有代价,确实很难实现自己的目标。千万不要吃不了葡萄就说葡萄是酸的。
  4、不随便用成功定义自己,成功是无止境的。打工再成功也难以超越老板,小老板又难以与大老板相比。山外有山,天外有天,给自己合理定位,既不要满足现状,也不要苛求自己。要脚踏实地,一步一步不断抬升自己。自己跟自己比,今天与昨天比。
  5、做好自己的职业规划,相信科学,测试自己的心理和其它特性,准确定位,然后通过自己的努力满足实现自己规划目标所需的条件,过程当中也要及时纠正与调整。登上一百米的高峰再畅谈如何征服二百米吧。打工就暂时不要妄想搞上市公司,等你有了你自己的企业再作打算吧。深圳健力宝俱乐部教练组组长郭瑞龙说的幸福定律是:不要老想着幸福如何来临,到时幸福自然就会来临。当你到达某种高度所要想的问题不是你今天能想到的。
  6、如果自己不想做大事情或不适合做,在一个单位里呆着就不要这山望那山高。但理财和投资的理念应贯穿你的生活始终。时间一长,你就会发现,平平凡凡打工,精耕细作理财,也能有一番天地。无论你的处境如何,记住,今日有酒今日醉使不得。
  7、无论应聘什么岗位,觉得自己与竞争者毫无优势可言,一位要费点心机,尽量表现与众不同的地方。自尊和尊严是两码事,舍弃自尊可以赢得尊严。如何你觉得有信心,那么表现自我吧。记住,无论你放在哪个环境,都有胜人一筹的地方。
  8、不管你的老板或上司向你吹嘘或承诺很多,也要保持清醒的头脑,即自重。不要把过多的希望寄托在别人身上,做好自已的事,才能给自己希望,也时也赢得别人的尊重和赋予你更多的发展空间。瓜熟蒂落,水到渠成。不要寄托某个政党会给你共产主义社会,《国际歌》唱得好:世界上从来就没有救世主,只有靠自己。
  9、天下打工是一家,不管你身处何位,不要自卑,不要自大,不管别人怎么待你,不要看不起别人。每个人都有自己的生活方式,一个普通的生产女工,挣几百元一个,她所带给乡下家人的富足和快乐,不见得会少于几千、上万月薪的人士。
  10、不要另眼看待一些职业(包括妓女、摆地摊的、真乞丐),有生存才有人权,而且有的还要养家糊口,供人读书。国家大环境造成的现象,请你给予足够的宽容。要鄙视就鄙视政府官员的腐败及官僚作风,还有杀人、放火、绑架者吧。
  11、经营人际关系,包括与客户的关系,诚信第一,切切不可为了某种目的而去“收卖”别人,也不要一昧地认为别人靠近你是为了揩你的油。只有永远的利益,没有永远的朋友,这是一句好话,但为利益所驱而交朋友确实不受欢迎。有时君子之交谈如水,体现做人的境界,何乐而不为呢?在深圳这个环境里,这样做更显弥贵。
  12、 推销,永远都是推销你自己,有如谈恋爱。所以要经营好自己,才能经营好产品。所以推销法则,第一、自己,第二、产品,第三、口才。
  13、善待自己,不要为了事业而忽略了亲人、朋友和人生百味。此外,学会保护自己,打工赚钱,不能忽视劳动保护和职业安全。还有一个职业风险,比如拿回扣,也要企业环境里的潜规则,安全第一。如果是私人企业老板辛苦创业,这时候你做企业的偷手既不安全也不仁义。
  14、 文明从自我做起,如公车上让位,排队办事等等。心灵的舒坦虽然不能换取物质,但可以赢得明天。
  15、如果觉得一段时候毫无进展,就想办法突破自己。跳槽、轮岗、换岗、学习,抽烟、喝酒、跳舞、游泳等等,做自己以前没做过或很久不做了的事情。不作死水,活水才有生命。
  16、富士康有句话:成功者找方法,失败者找理由。另外再加多两句,天生我材必有用,车到山前必有路,有路就有丰田车。未来国家发展,社会进步,必将人手一部车,所以现在每车的千万不要发愁,小车会有的,更不用说面包了,关键是方法,方法对头,只是时间快点而已。
  17、用人不疑,疑人不用-------不对。应该:信任人很好,但监控人更好。这是从管理体制、管理学上来说的,不要误解。不要自已认为自己是个良民,老板信任你是对的,老板不信任你是错的。信任需要长期的磨合。要想成为老板的战友,需要时间,需要耐心,需要诚心。
  亲爱的朋友,我无意也无权将我的思想强加于任何人,有不同观点的敬请慷慨发表,以便更多大众受益。凡读过的不妨留过名,以鼓励我将更的感悟与大家分享。因为时间关系,我们还有下次分享。谢谢、谢谢!
posted @ 2008-04-10 23:12 无澍 阅读(7) | 评论 (0) | 编辑
 
[转贴]怎样规划你毕业以后的人生
我自己呢,先是在国营的研究所混了4年,后来到一家公司干了6年,2002年出来自己做公司,现在也就是混了一个温饱吧,算是有房有车,有点积蓄,但是不多,还有一个可爱的女儿。回首这10来年,有一些经验和教训。
1.要有一个职业生涯的规划。首先需要定位自己做什么合适,是做买卖还是做技术,一条路走到黑;当然,做了技术,后来改行也行;
2.做技术,就是要做精做深,成为这个行业的这个技术的专家;最好就是去国内的大公司,才能全面学到东西,能够给你培训的机会;如果大公司进不去,先到小公司练技术,找机会再到大公司去镀金,学高深的技术。千万不要自己做产品,要做也是对这个行业熟悉了,再去做。
3.积极争取机会。积极争取学习和进步的机会。比如,做技术,就需要多锻炼,多学习,来提高自己的水平。一门技术,只要有机会去学习,都能学的会;要是没有机会,天才也没有办法学到这个技术。柳传志就说,杨元庆就是“哭着喊着要进步”,实际上,就是争取自己的机会;当然,这种强烈的进步欲望,也是领导看重的地方。每一步都走在前面,积累10年,你就有了比其他人更多的机会了。
4.积累个人的信誉。从你的职业生涯的第一天,就要按照诚信的原则办事。要做到,当人们提起你的名字的时候,说,这哥们还不错,做事还行。
5.注意利用资源。如果你有有钱的亲戚、成功的长辈或者朋友,可以充分利用这些机会,得到更加顺利的发展前景。
6.注意财富的不断积累。人生要想得到自由,财富是很关键的。否则,永远仰人鼻息,永远看人脸色。人都是势利眼。今后的家庭、职业生涯,金钱的积累很重要,没有钱,永远不能开张自己的事业,得到更多的机会;财富要做到逐年积累,你才能家庭生活幸福。没有钱是不可能有幸福的家庭的。
7.注意人脉的积累。最终,事业要靠在社会上的人脉的资源。要注意认识在你这个行业的人,结交他们,最终他们会成为你事业上的助力。
8.寻求贵人相助。要找大老板来帮助你,得到大老板的赏识。想想看,大蛋糕,切一点就够了,小蛋糕,都给你也吃不饱啊。
9.多听听成功的前辈和成功的朋友的意见。注意少听家里长辈的意见,尤其是都已经退休的长辈,他们对社会的认识还停留在很久以前,而这个社会已经发生很大的变化呢。最重要的是,长辈有时候会强求你做一些事情,但是,最终的结果他们是不负责的。只有你才能对自己负责。
欢迎朋友们都能提出自己的看法。
posted @ 2008-04-10 23:08 无澍 阅读(6) | 评论 (0) | 编辑
 
程序员--工作,将来如何打算,,日语~~--转-来自沉睡海洋的随感录,上篇也是
元旦以来就没有再做程序员的工作,而是改行做起了软件销售,就卖自己曾经开发的软件。发现自己的时间陡然增加了许多,竟然可以一场不少的看NBA了,这在做程序员的四年里面是想都不敢想的,或许可以偶尔去看,但不可能看这么多哦。

回头过来想象,觉得程序员是个可敬同样也很可悲的职业,至少我觉得在国内是这样。可敬的是,程序员可以为了解决某个技术难题,或者为了紧张的项目进度,常常废寝忘食,没日没夜的加班。技术水平与日俱增。很快到达一个高度,成为圈子中的高手,公司中不可缺少的万金油。可悲的是,随着无休止的加班,自己的生活全没了,程序就是生活的全部,每天除了吃饭睡觉就是写程序。很少有自己的生活,看看依然奋斗在第一线的同志们就知道了,好多连交女朋友的时间都没有。

每个人都需要好好规划自己的人生规划自己的职业,特别是程序员。如果不做规划,过些年年龄大了,有家有口的时候,再想加班去解决技术问题已经是很困难了。家庭不允许,生活不允许,身体也不允许。

那么程序员该如何规划自己的职业生涯呢?

前段时间,博客园里面大家都在写自己2008年的愿景与规划,可是又有多少人做到了自己长久的规划呢?前面我没有去写,因为那个时候转型过渡期,软件研发部门的事情需要去做,销售部门的事情需要去学习,忙的不可开交,现在终于空闲了,可以多和园子里面的朋友交流一下了。

其实我一直都很喜欢.NET程序,也一直都在这个圈子里面摸爬滚打,不做程序员了,不妨碍我仍然是个不错的程序员和项目经理。在客户谈项目的时候我不用向其他销售一样需要有售前工程师做支持,只要不开发我都可以和客户去沟通。技术方案也可以自己写,也可以详细规划好了之后交给售前咨询去写。自己的时间充裕了之后,也常常学习跟踪微软新的平台,还常常给软件研发部门做公司内训,交流自己曾经的心得体会。

至少我已经给自己做了规划,并且付诸行动,做了一名软件销售,你呢?

posted @ 2008-04-10 23:02 无澍 阅读(20) | 评论 (0) | 编辑
 
当程序员转行去做销售 --转
发表了一些感慨,放着好好的程序员不做,转行做了销售,没想到,有好几个朋友给我留言,讨论怎么转行做销售。这里还是谈谈我自己的想法,也想向一些做的比较成功的前辈讨教一些经验。

我觉得对于还在程序员岗位上奋斗的朋友,如果您有计划或者有想法转行去做销售的话,有几个事情是需要注意的,毕竟销售员和程序员是完全不同的两个职业,两种不同的职业状态。

第一,   收入的不同。

其实在我看来,收入的不同包含两个概念,首先是收入模式的不同,可以说大部分的程序员都是拿死工资,或者偶尔有一些项目奖金,然后年中或者年终的时候,给你象征性的涨一点,除非是公司里面的核心开发人员或者技术牛人,否则基本上也就那样,每个月固定收入,多也多不到哪里少也少不到哪里,而销售人员则不同,基本上是靠业绩说话,各家公司考核方式略有不同,签单提成的形式各不相同,但都收入都无一例外的和业绩挂钩,签单多了收入就多,所以常常各个月之间的收入差距会比较大。其次是收入数量的不同,特别对于刚刚从程序员转行做销售人员,很少能极快进入状态哗啦啦狂签单的,都会有个适应期,适应期之中签单往往不多,那么这段时间常常只能拿到基本工资,对于做程序员时稳定的而且不高不低的收入来说,是个不小的挑战。一旦上手之后,增长速度应该会比程序员要快一点。如果很久过去了发现自己还是不能上手,那还是建议您考虑做其他职业了。

第二,   工作时间和性质不同。

程序员最大的特点是什么?加班!我想各位看官没几个不同意的吧,而你们见过几个销售员也如此加班呢?当然,不是说程序员就没有休息的时候,销售员就一概不加班。当程序员为了某个功能抓耳挠腮拼命加班的时候,或许销售员正在某处陪客户喝酒,一顿猛灌,搞得全身上下无一处不是酒味,喝得胃里面翻江倒海无处发泄,还要满脸堆笑,想着下半场和客户去哪里HAPPY他才能满意。也有时候当程序员在家上网聊天泡MM的时候,或许你们的销售员正在公司通宵加班做标书准备投标文件,因为第二天就要赶去投标,而客户发标时只给了两天的准备时间。

每个职业都有自己的难处,所以当程序员想转行做销售员时,就要换位思考,如果做了销售员,那种生活你受得了么?

不过总得来说,销售员在时间上要比程序员要宽裕的多,毕竟考核是以签单数来说话而不是工作量来说话,呵呵。

第三,   客户看你的眼光不同。

当我们还是程序员,还是项目经理的时候,客户总是拿你当专家,当老师,当工程师看待,你说的技术上的东西,客户常常会认真考虑,毕竟没见过几个程序员尖嘴猴腮到处骗人的。而一旦转行做了销售员,就完全是另外一码事了,尽管对技术也很精通,也不必你的项目经理水平差,可是,在客户眼里,你首先是一个销售人员,其次才是个技术专家,所以你说的每句话,客户常常先不从技术考虑,而是常常在想是不是为了卖你的产品才会如此介绍的。所以在客户心目中,你做程序员时候树立起来的专家形象,老师形象会大打折扣。

第四,   工作时的心态不同。

我们常常在网上看到微软工程师,google工程师工作环境是多么舒适,多么随意,可以有弹性的工作时间,可以在公司玩篮球,甚至还可以在公司养宠物,可是大家有没有想过他们的销售人员呢?他们的销售人员也如此惬意么?我想这些大多数是为工程师准备的吧,他们的销售人员多半是要在外面西装笔挺的和客户洽谈合同细节呢,哪里有那么随意呢?而且还有很重要的一点,客户是不会和你玩弹性工作制的,约好的几点中,一分钟都不能迟到,否则就是没有没有信用的表现,在客户严重一旦有了不好的形象,再想签单就很难咯。

第五,   做人的心态不同。

跳出程序员这个圈子后,回头再看看程序员,觉得大多数程序员都比较单纯,当然这并没有贬低程序员的意思,只是说程序员把自己大部分的精力都花在了精益求精自己的程序上,或者都花在了没完没了的项目中,压根就没有时间去考虑那么多做人的道理,所以常常不经意间就把别人得罪了,自己还不知道,如果遇到个心态比较好的人,会不怎么计较的,知道程序员嘛,就那样。如果遇到个心态不好的,给你记仇,就比较惨了,后果,很难预料。

做销售人员不一样,得常常考虑这些事情,做客户时常常关心竞争对手是否来抢单了,合作伙伴是否有什么其他动作了,对客户说话要常常小心,要关注每个细节,懂得察颜观色,不求每句话都那么动听悦耳,但一定不能得罪客户,否则客户都想和别人谈合同了,你还乐呵呵的蒙在鼓里,每天屁颠屁颠的往客户那边跑。

       程序员如何做销售呢?我也没有弄明白,这些只是我转行做销售以来的一些感触,希望能给想转行还没有转行的同学一点帮助,也请各位大虾给我点帮助,说说自己的一些看法和经历。

posted @ 2008-04-10 22:57 无澍 阅读(78) | 评论 (0) | 编辑
 
20080410

第一次发表,留个纪念!

posted @ 2008-04-10 22:41 无澍 阅读(9) | 评论 (0) | 编辑
 

2008年3月24日

网站设计中43个你应当避免的错误
1. 用户必须在几秒钟知道网站是做什么的。注意力是因特网上最有价值的货币。 如果访问者无法在几秒钟之内得知你的网站的方向,他很有可能转而访问其他网站。 你必须迅速地告诉访问者为什么要在你的网站上花费时间。 
    2. 让网站易于速读。因特网不是书,因此没必要使用大段的文字。 也许我访问你的网站时我正在忙于其他工作,我不得不迅速读完所有内容。 项目符号、标题、副标题、列表,这些都能帮助读者迅速找到他想要的内容。

    3. 不要使用难于阅读的花哨字体。当然,某些字体可以让网站精彩纷呈。 不过它们容易阅读吗?如果你的主要目的是传递信息并让读者阅读, 你应该让阅读过程舒服些。

    4. 不要用小字体。如上一条所述,你得让读者阅读时感到舒服。 虽然我的Firefox有放大功能,但如果必须放大才能看清一个网站的话, 我就再也不会去访问它了。

    5. 不要打开新浏览器窗口。我的第一个网站曾经经常这么做。 原因很简单,在新窗口中打开外部链接,用户就不必离开我的网站。 错!让用户决定如何打开链接,否则浏览器上大大的后退按钮就没必要存在了。 不用担心用户离开你的网站,在必要的时候他们会回来的。

    6. 不要改变用户的浏览器窗口大小。用户有权控制自己的浏览器。 如果你改变窗口大小,你会在他们面前失去信用。

    7. 不必要时不要让用户注册。直白地讲,我上网是为了获取信息,不是为了别的。 不要强迫我注册并留下我的电子邮件以及其他信息,除非特别必要(比如你 能提供的消息非常有价值)。

    8. 不要在未经访问者同意的情况下为他们订阅电子杂志。 不要在访问者注册时自动给他们订阅电子杂志。 不请自来的邮件可不是个交朋友的好办法。

    9. 不要过多使用Flash。Flash不仅会增加网站的读取时间, 过度使用甚至会让访问者感到不快。只有当静态页面无法表达你的意图时 才使用Flash。

    10. 不要播放音乐。早些年Web开发者都喜欢在网站中集成音乐,结果他们失败了。 记住,永远不要使用音乐。

    11. 当你必须使用声音时,让用户启动它。有时你必须使用声音文件, 比如你要给用户发送一份演讲,或者你的教程包含声音。这没问题,但要让用户来控制, 让用户点击“播放”按钮,别在打开网页的瞬间播放声音。

    12. 不要让标志弄乱你的网站。社交网络和社区的标志会让你的网站看起来十分不专业。 就算是奖章和荣誉等标志也应当放到“关于我们”页面上。

    13. 不要使用“点击进入”页面。用户访问到内容的步骤越少越好。

    14. 注意要留下联系方式。最差的莫过于网站没有留下联系方式的了。 不仅对访问者不友好,而且对你也没好处,你会错过珍贵的反馈信息。

    15. 不要影响“后退”按钮的动作。这是网站可用性的最基本的理念。 在任何情况下都不能影响“后退”按钮的动作。比如,打开新窗口会破坏它, 某些Javas cript链接也会破坏它。

    16. 不要用闪烁的文字。除非你的访问者来自1996年,否则别用闪烁文字。

    17. 避免复杂的URL结构。一个简单的基于关键字的URL结构不仅能提高你的搜索引擎排名, 还能让访问者在访问之前了解网页内容。

    18. 用CSS布局,不要使用表格。HTML表格曾经被用于页面布局, 但没有必要拘泥于此,尤其是在CSS诞生之后。CSS更快、更稳定, 并能提供更多的特性。

    19. 保证用户可以搜索整个网站。搜索引擎带来因特网革命的原因,就是 它使得信息查找变得十分容易。别在你的网站上唱反调。

    20. 避免使用下拉菜单。用户应当直观地看到所有导航选项。 下拉菜单会造成混乱,并且会隐藏访问者真正要找的信息。

    21. 使用文字做导航栏。文字导航不仅速度快,而且更稳定。 例如,有些用户上网时会关闭图片。

    22. 如果需要链接到PDF文档,一定要注明。你一定有过点击链接之后, 浏览器就像死掉一样等待Acrobat Reader启动,只为了打开一个(你不想看的)PDF? 这是个不小的麻烦,因此一定要在指向PDF的链接旁特别说明,使用户可以采取相应措施。

    23. 不要用多种版本让访问者迷惑。你想用哪种带宽?56Kbps?128Kbps?Flash版还是HTML版? 嗨,我只想快点看到内容!

    24. 不要在内容中混合广告。在内容中混合广告(如Adsense)也许会增加短期内的广告点击率, 但从长远角度来看,这会减少网站的人气。愤怒的用户会离开的。

    25. 使用简单的导航结构。过犹不及。这个规则通常适用于人和选择上。 确保你的网站的导航结构单纯简洁。你不想让用户在查找信息时遇到麻烦吧?

    26. 避免内容介绍。别强迫用户在访问到真正内容之前看某些东西。 这很令人愤怒,除非你提供的信息是用户必须的,否则他不会等下去。

    27. 不要使用FrontPage。这一点也适用于其他廉价的HTML编辑器。 它们让页面设计变得更方便,但其输出结果将会非常低级,不兼容不同的浏览器, 并且会包含错误。

    28. 保证你的网站兼容大部分浏览器。浏览器并不完全相同,在解释CSS和其他 语言的方法也相差甚远。不管你是否愿意,你应当让网站兼容市面上的常用浏览器, 否则你会永远地失去部分读者。

    29. 保证在链接上添加有意义的文字。以前我经常犯这个错误。告诉人们“点击这里”很容易, 但这没有效果。要保证链接文字有意义。它使得访问者知道点击链接之后将出现什么, 也能为链接指向的外部站点带来SEO效果。

    30. 不要在状态栏中隐藏链接。用户还必须能在状态栏中看到链接指向哪里。 如果你隐藏了链接(即使是由于其他原因),那么你也会丧失信誉。

    31. 使链接可见。访问者应能轻易识别出哪些能点击,哪些不能。 确保链接的颜色有强烈的对比(标准的蓝色通常是最好的)。可能的话, 最好加上下划线。

    32. 不要在普通文本上添加下划线或者颜色。除非特别需要,否则不要为普通文字添加下划线。 就像用户需要识别哪些能点击一样,他们不应当将本不能点击的文字误认为能够点击。

    33. 改变访问过的链接的颜色。这一点对于提高网站可用性非常重要。 改变访问过的链接颜色有助于用户在网站中定位,确保他们不会不经意地 访问同一页面两次。

    34. 不要使用动态GIF。除非你有需要动画的广告条,否则避免使用动态GIF。 它会使网站看上去很业余,并且会分散访问者的注意力。

    35. 给图像添加ALT和TITLE属性。ALT和TITLE不仅会带来SEO效果,而且 对盲人有很大帮助。

    36. 不要用令人不快的颜色。如果用户连续阅读10分钟后觉得头疼, 那么你最好选择别的配色方案。根据你的目的决定设计(例如,创造一种氛围 使得用户将注意力放在网站内容上,等等)。

    37. 不要弹出窗口。这一点涉及任何种类的弹出窗口。即使用户要求使用, 弹出窗口也不宜使用,因为它会被弹出窗口拦截功能阻拦。

    38. 不要使用Javas cript做链接。远离那些点击之后执行一小段Javas cript的链接, 它们经常给用户带来麻烦。

    39. 在页面底部放置有意义的链接。访问者在找不到所需信息时通常会滚动到页面最底端。 作为最后的手段,你应当在页面底部放一个“联系我们”页面的链接。

    40. 避免网页过长。如果用户老是需要滚动才能看到内容,他通常会采取的做法是 跳过它们。如果你的网站正好如此,那么应当缩短内容并优化导航结构。

    41. 禁止使用水平滚动条。虽然垂直滚动条可以接受,但水平滚动条却远非如此。 现在的流行分辨率是1024x768,要确保网站能容纳在其中。

    42. 禁止出现拼写或语法错误。这不是网站设计的错,但却是影响网站整体质量的重要因素。 确保链接和文字中没有拼写或语法错误。

    43. 如果你使用图片认证,要保证能看清其字符。有些网站将图片认证作为对抗垃圾评论的方法, 或是在注册表单上使用。其中有个问题就是,用户经常需要叫上全家人来讨论图片上到底是什么字母
posted @ 2008-03-24 14:15 无澍 阅读(1) | 评论 (0) | 编辑
 
仅列出标题