guiying

ADO对象的使用

在上一遍文章中我们说了VB中基于ADO的数据库访问,接下来让我们一起来看一下ADO的七个对象,其中我们会重点讲述Command和Recordse两个对象。

我们先通过下面这张图对ADO的七个对象有一个大概的了解:

 

 计算机生成了可选文字: 非独立对象+l错公吴才,J象,依性连接对象。保存访问数据库过程中发生的错误,可以通免应用程序意外终止ErrorConneCtion连接对象,用于创建数据深连接。,一‘赞何数据库操作的革础’ACtiy6C0nnC6tion睁.-J'.,参数对象,依假于命令对象.用于为参数查询提供数据。同时使用参敛对象和命令对象,可使数据库对查询进行预编译,从而提高执行速度Act肠廿eConned.on属忖p己r己nleter鹿卜Command命令对象用于执行动作查询、、‘电沪z产:.:'-、,甘鱿。协.方法碑子护户一夕护,户户l字段对象,依枚于记录集对象。获得记录染中的每一个字段的伯息FieldReCOrdset记录集对象。保存来自葵本表或命令对象返lr.]的结果。使用记录集对象几乎可以完成所有的数据操作属性对象,除了Error错误对象以外,拼一个对象都有。可以访问特定对象的主要伯息Property甲

 

     从图中的关系线以及我们可以看出,当我们通过Connection对象与数据源建立连接以后,既可以通过Recordset对象对数据进行操作,也可以通过Command命令对象来执行查询,然后在传送给Recordset对象进行数据操作。

下面我们先说Recordset对象:

计算机生成了可选文字: adusecllent:客户端临时表,可以提供重新排序和使用索引查找记录等adUseserver:服务器端临时表,由服务器端的被检索的数据源维护ACtiVeC0nn仁etion代表数据源的活动连接CUrS0rLOCationadlockReadonlv,默认值,只读,无法更改数据adL0ckpessimistic:保守式记录锁定,在编辑时立即锁定数据源adLockoptimistic:开放式记录锁定,执行updata方法时锁定记录adlockoatc卜optimistic,开放式批更新,执行updataoatch方法时锁定记录Open打开记录集。例如:objrs.open(’·soL〔cT口令rROM系统用户wH〔R〔用户名=,’王永俊,'")LockTypeR6COrdSRecordCount:确定记录集中的记录数测试当前记录位置是否位于记录集的第·个记录之前.如果位于则返回丫rue,否则返回falseBOf测试当前记录位置是否位于记录集的最后一个记录之后。如果位于则返回下rue,否则返回falseEOf,HOVeFirstMOVeNeXtMOVeL日StMOVePreVIOUS

例如:

        

[vb] view plaincopyprint?
  1. Dim objCn As New Connection         Dim objRs As New Recordset  
  2.     Dim strCn As String  
  3.     Dim strSQL As String  
  4.            '建立数据库连接  
  5.         objCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _  
  6.                                                 "Data Source=" & App.Path \实例1.mdb"  
  7.         objCn.Open  
  8.         '执行查询命令,获得用户登录口令  
  9.         strSQL = "SELECT 口令,身份  FROM 系统用户 WHERE 用户名='" & UserName & "'"                                                                                     
  10.         Set   objRs.ActiveConnection = objCn  
  11.         objRs.Open (strSQL)  
  12.         With objRs               '创建客户端的记录集  
  13.             .CursorLocation = adUseClient       '指定使用客户端光标  
  14.             .CursorType = adOpenStatic          '指定使用静态光标  
  15.             .Open "系统用户", objCn, adOpenStatic, adLockReadOnly  
  16.         End With  
  17.         ShowData (lngPage)                   '显示当前记录页数  

我们来说一下Command对象:

使用Command对象之前,我们需要执行一下步骤:

   1.通过设置ActiveConnection属性是打开的连接与Command对象关联。

   2.使用CommandText属性定义命令(如SQL,储存过程)的可执行文本。

   3.使用commandType属性指定命令类型。通过Parameter对象和Parameters集合定义参数化查询或存储过程参数。

   4.使用Execute方法执行命令并在适当的时候返回Recordset对象

   5.使用 CreateParameter方法创建一个与命令相关的新的参数对象。

   6.将Command对象传递给Recordset的Source属性以便获得数据。

具体实现:

[vb] view plaincopyprint?
  1. Private Sub Form_Load()  
  2.         Dim strcn As String  
  3.         Set objCn = New Connection  
  4.         strcn = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;" & "Data Source=" & App.Path & "\实例5.mdb"  
  5.         objCn.ConnectionString = strcn  
  6.         objCn.Open  
  7.           
  8.         '创建执行参数查询的command 对象 objcmd  
  9.           
  10.         Set objCmd = New Command  
  11.         Set objCmd.ActiveConnection = objCn   '创建连接  
  12.           
  13.         With objCmd  
  14.             .CommandText = "select * from 系统用户 where 用户名 like ?" & "and 身份 like ?"  
  15.             '定义命令的可执行文本  
  16.             .CommandType = adCmdText  '指定命令类型  
  17.         End With  
  18.         '为command对象创建参数  
  19.         Dim parm As New Parameter  
  20.             Set parm = objCmd.CreateParameter("用户名", adVarChar, adParamInput, 10)  
  21.             objCmd.Parameters.Append parm  
  22.             Set parm = objCmd.CreateParameter("身份", adVarChar, adParamInput, 10)  
  23.             objCmd.Parameters.Append parm  
  24.             et objRs = New Recordset  
  25.           
  26.           
  27.         objCmd("用户名") = "%" & Trim(txtUserName) & "%"    '%是什么意思???  
  28.           
  29.   
  30.         objCmd("身份") = "%" & txtStatus & "%"  
  31.           
  32.         Set objRs = objCmd.Execute() '返回recordset对象  
  33.             lbl4 = ""  
  34. End Sub  

 

我们还可以在一个Recordset对象实体中使用command对象:

[vb] view plaincopyprint?
  1. Set cmd.ActiveConnection = cn  
  2. cmd.CommandText = strSql  
  3. cmd.CommandType = adCmdText  
  4. rs.Open cmd, , adOpenStatic, adLockOptimistic  

 

posted @ 2012-07-27 22:23 手心上的冰山 阅读(648) | 评论 (0) | 编辑 收藏
 
简简单单的生活

今天在QQ上看到姐的留言,说爸妈吵架了。我以为当孩子都大了,而孙子也都好几岁了,他们也该消停消停了吧。

也许至少在这几年里我没有看到过他们吵过架,在我很小的时候,吵架是常有的事,有一次我印象很深刻,

妈妈出走了,好几天找不到,我被带到舅舅家,那时的我哭着喊着,一个几岁的孩子,任何人都拿我没办法。

我也知道,这给我造成了心理上的伤害,我很害怕。

 

渐渐的长大了,自己也谈了恋爱,我们也是偶尔的会闹矛盾,有时候也会吵。也慢慢的明白了,这个世界本来

就是这样的,没有永久的和谐,但我只是希望,这只是生活中的一段小插曲而已,希望它会慢慢的褪去。

 

如今我一人在北京,一年半了,只过年的时候回去过一次,姐说想让我回家一趟,当看到亲人这样要求的时候,

我不知道该如何,是无奈还是愧疚。

为了生活,我失去了很多,曾经我希望,是无牵无挂的。曾经我梦想,是无忧无虑的。

可这一切看来,我们不可能独善其身,总有想念的人,总有要做的事,总有我们无法释怀的,总有我们不得不做出选择的。

 

一年前为了梦想来到北京,我以为这里是一个新的开始,离开了家的束缚,我以为在这里我可以找到快乐,逃脱了家的闷闷不乐。

我以为...而这仅仅只是我以为。现在什么都变了。

 

我有大大的梦想,但我深知,那实现不了。我只是把它铭记在心中。

现在我只想要简简单单的生活,不需要轰轰烈烈,不需要哭哭啼啼。

 

这半年来一直想找个理由辞去工作,去过一段真正属于自己的生活,每隔一段时间我都会定一个日期,"那一天就是我离开的日子"

可每次都艰难的度过了那个我认为的末日,我的身体很累,而现在心也要累了,一直矛盾着,我留下来的唯一理由也许就是为了糊口,

等有一天我足够承受生活的时候,也许我该走了。

我怕我做不到。当周末真正来临的时候,

突然我变的手足无措了,不知道干什么,所以我害怕,当我真正的自由的时候,也许就该颓废了。

我也一直在坚持,哪怕一天。 每天清晨起床的时候,就心想,还好,我还有工作,我还有事情可以做。

posted @ 2012-07-27 22:20 手心上的冰山 阅读(1219) | 评论 (1) | 编辑 收藏
 
jface获得treeview中某一行某一列 变色

此处用的是CheckboxTreeViewer  和treeview大同小异

 

首先获得Point

tree.addMouseListener(new MouseListener() {
   
   @Override
   public void mouseUp(MouseEvent e) {
    
   }
   
   @Override
   public void mouseDown(MouseEvent e) {
    point = new Point(e.x, e.y);
   }
   
   @Override
   public void mouseDoubleClick(MouseEvent e) {
    
   }
  });

 

其次根据point获得TreeItem  再变色

tv.addCheckStateListener(new ICheckStateListener() {
   public void checkStateChanged(CheckStateChangedEvent event) {
    // If the item is checked . . .
    TreeItem ti = tree.getItem(point);

    // 也可以不用point

    // TreeItem ti = ((TreeItem) tv.testFindItem(event.getElement()));
    if (event.getChecked()) {
     tv.setSubtreeChecked(event.getElement(), true);
     ti.setBackground(0, Display.getCurrent().getSystemColor(SWT.COLOR_RED)); //获得当前行的第一列 并设置RED色
    } else {
     tv.setSubtreeChecked(event.getElement(), false);
     ti.setBackground(0, Display.getCurrent().getSystemColor(SWT.COLOR_CYAN)); //获得当前行的第一列 并设置CYAN色

    }
   }
  });

posted @ 2012-07-24 21:58 手心上的冰山 阅读(1063) | 评论 (0) | 编辑 收藏
 
沟通是感情保温法宝

沟通是当今世界必可或缺能力之一.如何让别人更能了解自己?很简单.只要肯张开你的嘴巴即可.

张开你的嘴巴,愿意让别人了解自己,这样,自己就不会感觉孤独.

人的需求,总结起来,基本都一样.正如马斯洛把人的需求分为七个层次,形成一个金字塔.从最低到最上面分别是:生理需求,安全需求,归属于爱的需求,尊重的需求,认识的需求,审美的需求,自我实现的需求.金字塔形状从下往上,逐渐变窄.说明越往上做到的人不多.生理需求基本上大家都能够解决,处于吃饱不饿的状态.但是越往上,沟通越重要.

感情无论是亲情,友情还是爱情,情情重要,情情要沟通.

 

血浓于水的亲情

 

当谈论各种感情的时候,想必大家都会把亲情排在首位.是呢.也许在你最快乐的时候,你想不到与家人分享.但是当你在最痛苦最悲伤的时候,是谁给你力量挺过来,又是谁默默无私不求任何回报的支持你奉献着他自己?是亲情,是一辈子都不能忘怀的苍老的爸妈.

但是亲情也是需要不断沟通,让他们了解你的内心的想法,同时也可以多多了解了解他们的辛酸,他们的不容易.

若是父子之间多沟通,也不会产生过激的矛盾,也不会产生父子反目成仇,最终酿成不堪的后果.这样,孩子多多理解父母,父母多多理解孩子.

 

感激一生师生情

 

对于我们每个人来说,在我们从顽皮稚童到青涩少年再到风华正茂的生命历程中,老师是值得我们感恩的人和尊重的人.虽是一把烛火,却燃尽自己,照亮别人.

老师,您是大桥,为我们连接被割断的山峦,让我们走向收获的峰巅;您是青藤,坚韧而修长,指引我们采撷到崖顶的灵芝和人参。当苗儿需要一杯水的时候,绝不送上一桶水;而当需要一桶水的时候,也绝不给予一杯水。适时,适量地给予,这是一个好园丁的技艺。

但是老师的职责不仅仅是教书,最为关键的在于是分析学生的内心状态。每个学生,因为家庭环境,生活环境不同造成性格心态不同,所以,学生的性格心态,都是需要老师来分析的.再说,学生的性格,也不能一槌定音,不能因一面而断定怎么怎么,其实,接触的人不同,表现的性格肯定有所不同而已。正所谓到什么山唱什么歌一样。若是都一样,岂不是被人笑话。即使一个整天活泼开朗嘻嘻哈哈的人到一个陌生人面前,肯定一开始是文文静静的,随后不断交流,才会逐渐表现其外向的性格。但是不能第一面文静就断定这个人是内向,不爱说话什么的吧。那样的话,是不是太武断,对此人有点不公平?并且人的性格也是随环境不断变化的,正所谓没有一成不变的,变才是真正不变的。所以人的性格心思,貌似很难猜透哦,不够大体了解,已经很可以了。并且男女差异也蛮大的,男孩子还是相对于可以吧。毕竟社会对其要求甚大,所以胸怀也相对于强大。

时刻了解学生的动态,对症下药.现在时代是如此开发,只靠静态观察揣摩是远远不够,必须进行时时交流沟通,这样才能做到因材施教.

 

纯净似水的友情

 

我很难想象没有朋友的日子,也很难想象没有[朋友的人.正如一位名人所言,没有朋友的天空是黑暗的.我的世界里也坚决不能没有朋友.没有朋友的日子是孤独的,没有诉说的对象是痛苦的,没有谈心的知己是伤不起的呀.

但是,朋友之间也是需要时常聊天,保持联系的呀.为什么有些人的qq动态一直提示,有事没事经常联系,曾经再好的朋友,也是需要时常慰问的,再好的友谊也是需要不断维持的.若是N久不联系,再好的朋友之间也会产生一种说不出来的别扭.所以逢年过节,发个短信,打个电话问候一声.其实费不了多长时间,费不了多少钱.朋友是买不来的,纯洁的友谊是拿俗气的金钱换不回来的,所以不必在乎那一条短信,三四分钟的电话聊天.

在我的生命中,朋友是不可或缺的.对待朋友,以一种真诚的态度对待.我相信,你对他如何,将来他也对你如何.朋友多了,路好走.走的舒心,走的心情舒畅,精神爽了,吃啥啥香,干啥啥行.

posted @ 2012-07-24 21:57 手心上的冰山 阅读(991) | 评论 (1) | 编辑 收藏
 
伟大的程序员是怎样炼成的?

  英文原文:What makes a great software engineer?

  原文发布于 2009-8-21

  近几周,一份反映 Netflix 公司企业文化的报告在网上广为流传。 这份报告里列举了很多Netflix公司里令人称赞的做法,包括这个公司是如何的招聘和辞退员工的。 里面有大量的信息是描述Netflix公司是怎样对待员工的,这使Netflix公司变成了一个很有吸引力的工作场所。报告里面提到过有一个关于员工所期望的内容的清单,但没有把清单列出来。 报告的开始部分就谈及了企业价值问题,而且是按照员工的立场角度写的,可惜并没有把这个问题展开。

  我并不在Netflix工作 —— 你也知道 (我在 Yahoo!工 作) —— 但我深切的感觉到,不管你在哪里工作,成为一个优秀的员工、优秀的软件开发工程师的过程是一样的。 下面所列举的都是伟大的程序员所具有的经验和品质。

  只做正确的事

  对于软件这一行的人,我们有个很大的挑战,就是如何能够用正确的方法做事情。什么是正确的方法,这依赖于你在做什么和为谁做。而究竟所谓 “正确的方法”里都包括了什么内容,这并不是重点,重点是你是否能坚持按照这种方式做事。初级程序员的问题通常是不能做到坚持,而资历较深的程序员却能始终坚持原则。 也许会有一个“非常紧急”的项目,或者这个项目很特殊,不能按常规过程开发。这只是个假象。 好的程序员知道即使在任何情况和环境下都要坚持做正确的事情。如果说按正确的方式开发将导致不能按时完成任务,那么,他们就会知道,这个项目是不能按时完工的。 不要妥协,工程质量是你作为一个优秀程序员的唯一终极证明。 确保你所有的代码都是在正确的方法下100%正确的写出的。要按一个优秀的程序员的标准来要求自己。

  甘愿受苦

  听起来很傻,但却是真的,优秀的程序员都乐于承担工作上给他们带来的痛苦。你说出一个伟大的程序员,我都能告诉你,在他或她的职业生涯里,各个阶段,都曾有花好几天时间去解决一个问题的经历。优秀的程序员品味着困难给他们带来的挑战,这让他们日以继夜,他们明白,问题必须要解决掉。

  不太优秀的程序员就不一样了,他们在刚刚碰到有麻烦的迹象时就先想到要寻求帮助。在问题面前,他们习惯于去寻求帮助,而不是自己去努力解决这个问题。他们最喜欢的一句话是:“帮我看看这个问题”。伟大的程序员的第一反应是我要自己解决这个问题。解决问题是种技能,是优秀的程序员非常看重的一种技能。

  好的程序员是通过痛苦的磨练才成为伟大的程序员的。痛苦的磨练是说当你对这个问题实在无能为力时才去请求外援。求助就意味着认输, 所有尽量减少这种处境的发生。甘愿受苦。和问题做不懈的斗争。这就是你要学会的。

  注意: 我并不是说你不能寻求他人的帮助。我说的是,你首先要尝试自己去完成任务,如果你不能完成,再寻求帮助。不要在自己没有努力过前就轻易的求助。你经常会发现,当你知道了解决方法后,你才认识到,你用自己的力量本也能解决这个问题的。

  学无止境

  如果有人敢声称他不需要再学任何新的知识,我是绝对不愿意和他共事的。在有些行业,你也许很多年不学新的东西也能干的很好,但软件技术革新的如此之快,你不能不时刻关注。你的老板是由于你有某些技能才花钱雇你的,如果你的技能已经落伍、过期了,那你也就没有价值了。 想成为一名伟大的程序员,你首先要承认你不是无所不知,你必须每天都要努力的寻找、学习新的知识。

  在你现在的公司里或组织里寻找能让你学习、让你钦佩的人。在复杂的问题上征求他们的意见,看看他们是怎么思考的。向他们介绍你的解决思路,请他们给予批评指点。如果在你的周围你不能找出一个能作为你的导师的人,这要么是你还没有认真的寻找,要么是你留在了一个不该留的公司里。如果你在现在的工作上不能学习进步,那是到了你该换个工作的时候了。

  要阅读网上的博客。关注一些研讨会。与其他程序员交流。伟大的程序员从不停止学习。

  分享知识

  有一些程序员认为,他们的唯一价值所在就是他们所拥有的知识,于是,分享出他们的知识就会让他们的价值降低。这是大错特错了。让你有价值的不是你的知识,而是如何运用你的知识给公司创造价值。难道还会有比分享知识给他人更能给公司创造价值的方法吗?

  我曾经面试过一家公司,知识不共享、相互保密、相互提防的理念在这家公司里根深蒂固。在这样的环境里,员工之间形成了一种恶性竞争的关系,这直接导致了勾心斗角和诬陷中伤的产生。我可不想在这样的公司里工作。如果每个人都对自己知道的事情讳莫如深,那你什么都学不到。

  伟大的程序员希望他人也能知道自己所掌握的知识。他们并不担心会因此而失去优势,因为他们相信大家都会这样做。伟大的程序员乐意看到他们的同伴成长、成功。一个公司,它应该被一群喜欢知识共享的人组成,就像人们在运动场上,让团队的每个对员都强大起来,整个团队才会强大。

  伸出援助之手

  伟大的程序员从来不会说“这不关我的事”。他们总是愿意伸出援助之手。他们经常在做自己的工作之余,去帮助那些编程新手。如果有件任务必须按时完成,而又没有其他人能胜任,伟大的程序员会主动承担起这项任务。他们从来不嘲笑来请求帮助的人,即使问题是那么的小、那么无意义、无价值。伟大的程序员重视他们的团队,愿意为团队做任何的事情。不管是要去写1,000行的代码,还是去编辑一个图片,伟大的程序员都会立即站出来帮助完成。

  十年磨一剑

  伟大的程序员不是天生的,是后天炼成的。他们是本文上面提到的那些因素造就的,加上还要通过努力的工作。如果你是刚刚意识到这些,那还不晚,你仍然有充分的时间来成为一个伟大的程序员。耐心是关键。伟大的程序员不是在旦夕之间就可以成就的。有些人可能要花上数年,有些人则需要十几年。没有人为你写血泪史。好的公司当发现你有成为伟大程序员的潜质时,会帮助你,为你提供舞台。而你会通过你的努力工作、让你的团队进步来证明自己。要坚定,要自律,通往伟大程序 员的道路会很长。

  更新 (5 Sep 2009):针对“甘愿受苦”段内容增加一个声明。好像很多人都误解了我的观点。

  声明: 本文里的所有观点和立场都是来自 Nicholas C. Zakas 本人 ,跟 Yahoo!, Wrox 出版公司,O’Reilly 出版公司, 或其他人没有任何关系。我只代表我自己,不代表他们。

posted @ 2012-07-21 22:10 手心上的冰山 阅读(1097) | 评论 (1) | 编辑 收藏
 
一次谷歌面试趣事

  英文原文:A Google Interviewing Story  

  很多年前我进入硅谷人才市场,当时是想找一份高级工程师的职位。如果你有一段时间没有面试过,根据经验,有个非常有用的提醒你应该接受,就是: 你往往会在前几次面试中的什么地方犯一些错误。简单而言就是,不要首先去你梦想的公司里面试。面试中有多如牛毛的应该注意的问题,你可能全部忘记了,所 以,先去几个不太重要的公司里面试,它们会在这些方面对你起教育(再教育)作用。

  我第一家面试的公司叫做gofish.com,据我所知,gofish这家公司如今的情况跟我当时面试时完全的不同。我几乎能打保票的说,当时 我在那遇到的那些人都已不再那工作了,这家公司的实际情况跟我们这个故事并不是很相关。但在其中的面试却是十分相关的。对我进行技术性面试的人是一个叫做 Guy的家伙。

  Guy穿了一条皮裤子。众所周知,穿皮裤子的面试官通常是让人“格外”恐怖的。而Guy也没有任何让人失望的意思。他同样也是一个技术难题终结者。而且是一个穿皮裤子的技术难题终结者——真的,我做不到他那样。

  我永远不会忘记他问我的一个问题。事实上,这个问题是非常的普通——在当时也是硅谷里标准的面试题。

  问题是这样的:

  假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些。从算法上讲,什么方法能最快的查出所有小字符串里的字母在大字符串里都有?

  比如,如果是下面两个字符串:

  String 1: ABCDEFGHLMNOPQRS

  String 2: DCGSRQPOM

  答案是true,所有在string2里的字母string1也都有。如果是下面两个字符串:

  String 1: ABCDEFGHLMNOPQRS

  String 2: DCGSRQPOZ

  答案是false,因为第二个字符串里的Z字母不在第一个字符串里。

  当他问题这个问题时,不夸张的说,我几乎要脱口而出。事实上,对这个问题我很有信心。(提示:我提供的答案对他来说显然是最糟糕的一种,从面试中他大量的各种细微表现中可以看出来)。

  对于这种操作一种幼稚的做法是轮询第二个字符串里的每个字母,看它是否同在第一个字符串里。从算法上讲,这需要O(n*m) 次操作,其中n是string1的长度,m是string2的长度。就拿上面的例子来说,最坏的情况下将会有16*8 = 128次操作。

  一个稍微好一点的方案是先对这两个字符串的字母进行排序,然后同时对两个字串依次轮询。两个字串的排序需要(常规情况)O(m log m)+ O(n log n) 次操作,之后的线性扫描需要O(m+n) 次操作。同样拿上面的字串做例子,将会需要16*4 + 8*3 = 88加上对两个字串线性扫描的16 + 8 = 24的操作。(随着字串长度的增长,你会发现这个算法的效果会越来越好)

  最终,我告诉了他一个最佳的算法,只需要O(n+m) 次操作。方法就是,对第一个字串进行轮询,把其中的每个字母都 放入一个Hashtable里(成本是O(n)或16次操作)。然后轮询第二个字串,在Hashtable里查询每个字母,看能否找到。如果找不到,说明 没有匹配成功。这将消耗掉8次操作——这样两项操作加起来一共只有24次。不错吧,比前面两种方案都要好。

  Guy没有被打动。他把他的皮裤子弄的沙沙响作为回应。”还有没有更好的?“他问道。

  我的天?这个家伙究竟想要什么?我看看白板,然后转向他。”没有了,O(n+m)是你能得到的最好的结果了——我是说,你至少要对每个字母至少访问一次才能完成这项操作——而这个方案是刚好是对每个字母只访问一次“。我越想越确信我是对的。

  他走到白板前,”如果这样呢——假设我们有一个一定个数的字母组成字串——我给每个字母分配一个素数,从2开始,往后类推。这样A将会是2,B 将会是3,C将会是5,等等。现在我遍历第一个字串,把每个字母代表的素数相乘。你最终会得到一个很大的整数,对吧?然后——轮询第二个字符串,用每个字 母除它。如果除的结果有余数,这说明有不匹配的字母。如果整个过程中没有余数,你应该知道它是第一个字串恰好的子集了。这样不行吗?“

  每当这个时候——当某个人的奇思异想超出了你的思维模式时,你真的需要一段时间来跟上他的思路。现在他站在那里,他的皮裤子并没有帮助我理解他。

  现在我想告诉你—— Guy的方案(不消说,我并不认为Guy是第一个想出这招的人)在算法上并不能说就比我的好。而且在实际操作中,你很可能仍会使用我的方案,因为它更通 用,无需跟麻烦的大型数字打交道。但从”巧妙水平“上讲,Guy提供的是一种更、更、更有趣的方案。

  我没有得到这份职位。也许是因为我拒绝了他们提供给我的一些讨厌的工作内容和其它一些东西,但这都无所谓了。我还有更大更好的目标呢。

  接着,我应 聘了become.com。在跟CTO的电话面试中,他给我布置了一道”编程作业“。这个作业有点荒唐——现在回想起来,大概用了我 3天的时间去完成。我得到了面试,得到了那份工作——但对于我来说,最大的收获是这道编程作业强迫我去钻研并有所获。我需要去开发一个网页爬虫,一个拼写 检查/纠正器,还有一些其它的功能。不错的东西。然而,最终,我拒绝了这份工作。

  终于,我来到了Google面试。我曾说过Google的面试过程跟外面宣传的很一致。冗长——严格,但诚实的说,相当的公平。他们在各种面试过程中尽最大的努力去了解你、你的能力。并不是说他们在对你做科学研究,但我确信他们是努力这样做。

  我在Google的第四场面试是一个女工程师,老实话,是一场很无聊的面试。在前面几场面试中我表现的很好,感觉到我的机会非常的大。我相信如果不做出什么荒唐事情来,十拿九稳我能得到这份工作。

  她问了我一些关于排序或设计方面的非常简单的问题,我记不清了。但就在45分钟的面试快要结束时,她对我说”我还有一个问题。假设你有一个一定长度的由字母组成的字符串。你还有另外一个,短些。你如何才能知道所有的在较短的字符串里的字母在长字符串里也有?“

  哇塞。Guy附身了。

  现在,我完全可以马上结束这场面试。我可以对她说“哈哈,几个星期前我就知道答案啦!”,这是事实。但就是在几个星期前被问到这个问题时——我 给出的也是正确的答案。这是我本来就知道答案的问题。看起来就好像是Guy为我的这次面试温习过功课一样。而且,可恶,人们通常是通过上网来搜集面试问题 ——而我,我可以毫不客气的说,对于这些问题,我不需要任何“作 弊”。我自己知道这些答案!

  现在你们可能认为——就在她问出了问题之后,在我准备开始说出在脑海里构思完成的最后的演讲之前——你们可能会想,我应该是,当然该,从情理上 讲,镇定的回答出这个问题,并且获得赞赏。可糟糕的是,事实并不是这样。打个比喻,就像是她问出来问题后,我在脑子里立即举起了手,并大叫着“我!嗨! 嗨!我知道!让我来回答吧!”我的大脑试图夺走我对嘴巴的控制权(这事经常发生),幸亏我坚强的毅力让我镇定下来。

  于是我开始回答。平静的。带着不可思议的沉着和优雅。带着一种故意表现出来的——带着一种,我认为,只有那种完全的渊博到对古今中外、不分巨细的知识都精通的人才能表现出来的自信。

  我轻描淡写的说出来那种很幼稚的方案,就好象是这种方案毫无价值。我提到了给它们排序,就好像是在给早期的《星际迷航》中的一个场景中的人物穿上红T恤似的。最后,平淡的,就好像是我决定了所有事情的好坏、算法上的效率,我说出了O(n+m) 一次性方案。

  我要告诉你——尽管我表明上的平静——这整个过程我却在做激烈的挣扎,内心里我在对自己尖着——“你个笨蛋,赶紧告诉她素数方案!”

  当我完成了对一次性算法的解释后,她完全不出意外的认可的点了下头,并开始在笔记本上记录。这个问题她以前也许问过了一百次,我想大部分的人都能回答上来。她也许写的是“回答正确。无聊的面试。正确的回答了无聊的字符串问题。没有惊喜。无聊的家伙,但可以留下。”

  我等了一会。我让这种焦灼的状态持续的尽可能的长。我可以发誓的说,如果再耽搁一分钟,我一定会憋出脑血栓、脱口说出关于素数的未解之谜。

  我打破了沉默。“你知道吗,还有另外一个,可能是更聪明的算法。”

  她二目空空的抬头看了一眼,仅在瞬间闪现过一丝希望。

  “假设我们有一定长度的字符串。我们可以给每个字母分配一个素数,从2开始。然后我们把大字串中的每个字母代表的素数相乘得出一个数,用小字串中的每个字母代表的素数去除它。如果除的过程中没有产生余数,则小字串是大字串的一个子集。”

  在此时,我猜,她看起来就像是Guy当时把相同的话说给我听时我表现出来的样子。而我演讲时泰然自若的表情没了,眼睛瞪大,说话时稍微带出来一些唾沫星子。

  一会儿后,她不得不说了,“可是…等一下,有可能…是的,可以这样!可是如何…如果…噢,噢,可行!简洁!”

  我得意洋洋的吸了一口气。我在我的面试记录里写下了“她给了我一个‘简洁’的评语!”在她提出这个问题之前我就确信能得到这份工作,现在我更加确信了。还有一点我十分确信的是,我(更准确的说是Guy)给了她今天的好心情。

  我在Google干了3年,生活的十分愉快。我在2008年辞职去到一个小公司里做CTO,之后又开办了一个自己的公司。大概是一年前,我偶然的在一个创业论坛会上遇到了Guy,他记不得我了,当我向他细述这段往事时,他对他那条皮裤子大笑不已。

  话说回来,如果这个故事里有什么教育意义的话——永远不要冒失的首先去应聘你梦想的公司,应先去应聘那些你不看好的职位。你除了能从这些面试中获得经验外,你指不定能遇到某个能为你的更重要的面试铺路的人呢。事实上,这个经验在你生活中的很多其它事情上也适应。

  说正经的,如果你有机会想找一个解决问题的高手——雇佣Guy比谁都强。那个家伙很厉害。 

  (在这些陈年旧账里发现的一点技术瑕疵:字母有可能重复而字符串可能会很长,所以必须要有统计。用那个最幼稚的解决方案时,当在大字符串里找到 一个字符后就把它删掉,当这样仍然是 O(n*m)次。在Hashtable里我们会有一个key->value的计数。Guy的方案在这种情况下仍然好用。)

posted @ 2012-07-21 22:09 手心上的冰山 阅读(871) | 评论 (0) | 编辑 收藏
 
傻逼的老板,苦逼的程序员

近日较火的一帖子就是京东员工按时上下班遭“被离职”。话说一员工入职一个多月以来,每天保质保量完成任务,没迟到过,没早退过,按时上下班。因为没有加班,被京东开除,领导的理由是:按时上下班,没有奉献精神。坑爹啊。

 

人剥削人的社会现象是永远都存在的,然而当文明越来越发达的今天,人对于自我的思考也就越多。以现在社会生产力,人的生存早已不成问题,当人们解决了生存问题,解决了生活问题,肯定就会对自己长久的发展开始了思考。

 

对比着目前的状态,思索未来的道路。

 

若现在的企业还沿用着古老的方式,压榨剥削着人们,我认为这个企业就是在为自己挖掘坟墓,努力地挖坑,然后把自己给埋了。埋了就埋了,还想着在坑爹,谁会呆在这样的公司。而现在,这种傻逼的公司,傻逼的老板太多了,你按时下班他就会感觉着心里不舒服,觉得给你发那多工资亏了,只有在对你不断的压榨中才能找到心理的平衡。不去寻求高效的管理,高效的开发,单纯的靠加班又不给加班费来降低成本,完成目标,这样的企业能有什么竞争力。

 

试想一下,头天晚上加班到深夜,第二天还要早早上班,即便不昏昏欲睡,效率也会大大降低,就这样磨洋工,混日子,哪还有什么工作积极性,如此恶性循环,长此以往,身体也会搞垮掉。没有周末,没有节假日,每天还要加班的深夜,谁堪承受。身体是革命的本钱,把身体都累垮了,给你再多的钱又有什么用呢,只有工作没有休息,赚了钱都消费不出去,那赚钱还有什么意义。苦逼的程序员啊,加班加班,30岁的年龄80岁的心脏。看一博客,说有一个漂亮女人和一个帅哥在吃KFC,说了句“没事的,我们还有的是时间,我老公是做IT的,他现在还在加班呢!”,老公是做IT的……听着欲哭无泪啊。谁想加班,谁还会去做IT……

 

看一个员工的能力,要看他单位时间内完成的工作量,八小时工作的时间就精力高度集中,高效完成任务,下班就好好休息。学要学好,玩要玩好。如果仅凭他是否加班来评定那将是多么扯淡,当一员工老是要加班才能完成别人都能按时完成的任务,那就要对他的能力产生怀疑了,或者是他在别人工作时打酱油去了。若一个公司有加班费,而员工本来没什么任务也呆在公司混时间赚加班费,这样的员工也不会有什么大的作为,甚至要对其人品产生质疑。这样的加班对公司,对员工都没什么意义。

 

所以啊请不要成为傻逼的公司,请不要再做傻逼的老板了。IT公司,想要真的有所作为,请不要再加班了,有木有,有木有啊……

 

如真是紧急情况需要加班,也不能说不行,但也要通过调休或者加薪的方式对员工补偿回来。并且加班的持续时间不能过长,要是连续加班两周估计就会有人受不了,更要把这种紧急加班情况减少到最低。

posted @ 2012-07-21 22:08 手心上的冰山 阅读(1039) | 评论 (1) | 编辑 收藏
 
仅列出标题
共2页: 上一页 1 2 
 
<2025年8月>
日一二三四五六
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

 导航

  • BlogJava
  • 首页
  • 发新随笔
  • 发新文章
  • 联系
  • 聚合
  • 管理

 统计

  • 随笔: 17
  • 文章: 0
  • 评论: 10
  • 引用: 0

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔档案

  • 2012年8月 (8)
  • 2012年7月 (9)

搜索

  •  

最新评论

  • 1. re: oracle函数之case和decode的用法区别及性能比较
  • re: oracle函数之case和decode的用法区别及性能比较
  • --黄冰冰
  • 2. re: cas ajax登录方式跨域时session丢失问题解决
  • 需要修改CAS Server的源码?
  • --Liuzy
  • 3. re: 离职引发的诸多感触
  • 评论内容较长,点击标题查看
  • --思达商智
  • 4. re: 离职引发的诸多感触
  • 同感啊. 年纪大了, 有了老婆孩子, 就很难殊死一搏, 去做自己想做的事情了. 但总觉得如果此生连一件拿到出手的作品都没有, 实在是太遗憾了.
  • --黑灵
  • 5. re: 算法学习之字符串左移和右移
  • 评论内容较长,点击标题查看
  • --罗来枫

阅读排行榜

  • 1. oracle函数之case和decode的用法区别及性能比较(22454)
  • 2. Linux中常用命令学习总结(7742)
  • 3. 算法学习之字符串左移和右移(6698)
  • 4. cas ajax登录方式跨域时session丢失问题解决(3354)
  • 5. 让数据库游标变得简单(2876)

评论排行榜

  • 1. 离职引发的诸多感触(2)
  • 2. cas ajax登录方式跨域时session丢失问题解决(1)
  • 3. 算法学习之字符串左移和右移(1)
  • 4. oracle函数之case和decode的用法区别及性能比较(1)
  • 5. 多两个“0”带来的思考(1)

Powered by: 博客园
模板提供:沪江博客
Copyright ©2025 手心上的冰山