焦油坑与激情

先来听我说几个真实的故事:

     上周面试了一个开发人员,这个人所有的面试题都答出来了。各方面我们需要的知识也掌握了,但是在初试中,这个人就被我们三个面试官一并否决了。 原因很简单,这个面试者提供的答案都是能解决问题,但几乎都是效率最差的方案;另外,从一些面试题中,可以看出这人很多时候,把开发工作当成一个应付差事的工作来做,而不是作为自己的兴趣来做。缺乏激情,工作只是应付差事,仅仅是由于有几年工作经验,才能答出我们的面试题。这样的人不要也罢。

     另外一个故事,公司有个开发组,在他们组发生过这样一件事情:有次在一个界面布局文档中,有几个很明显的错别字。提交到某个开发人员那里后,开发人员在知道是错别字的前提下,不跟其它相关人员沟通,在WEB页面上,仍然采用了这个错别字。

     再一个面试中听到的故事:在问面试者为何离开前一个公司的时候,有个面试者说了这样一种情况,一个10个多人的开发团队,忙了一年,产品还没有上线,需求还在因为Boss的灵感不断,还在不断修改中,最后他觉得对这个项目和这个公司失去了激情,为此他决定寻找新的工作机会。

     种种原因,没能或不再把编程工作当作一种乐趣,没有成就感,这是上面三个故事产生的根源。这是我的看法。

     不仅仅程序,编程系统产品在焦油坑中苦苦挣扎,程序员们也在焦油坑中苦苦挣扎。下图是人月神话第一章的插图:拉布雷阿的焦油坑壁画(Mural of La Brea Tar Pits)。我们每个人都象其中的动物一样,时时刻刻陷身在焦油坑中,都在苦苦的挣扎中。

人月神话 焦油坑

     说自己陷身焦油坑,有这个,哪个苦恼。谁没有苦恼,人在各个阶段都会有大量的苦恼存在,在苦恼中仍然有激情,这才是重要。

     有时候,我就在关注身边的程序员,去想他们为何会有这样、那样的行为发生。分析的其中一个结果就是:程序员的水平差别很大程度是看他是否有编程的激情。

     比如:刚毕业的大学生,差的,好的我都看到过,好的一个在还有半年才毕业的时候,就被我拉到公司工作了(这个人后来由于想自己创业,离职了,不过这个人的激情我非常佩服)。而差的,在面试中一些非常简单问题的答题,让我差点吐掉。要知道,我面试刚毕业者,一般不是考具体应用,而是重点考察算法、数据结构的简单知识,而这些知识,大学里是必修的。

     有哪些方面可能成为程序员有激情的原因?

     在人月神话的第一章《焦油坑》中提到编程行业“满足我们内心深处的创造渴望和愉悦所有人的共有情感”提供了五种乐趣:

  • 创造事务的快乐; 
  • 开发对其它人有用的东西的乐趣;
  • 将可以活动、相互啮合的零部件组装成类似迷宫的东西,这个过程所体现出令人神魂颠倒的魅力;
  • 面对不重复的任务,不断学习的乐趣;
  • 工作在如此易于驾驭的介质上的乐趣--纯粹的思维活动--其存在、移动和运转方式完全不同于实体物件;

 从我的角度来理解,就是以下两个方面:

  • 编程的结果导致的激情,包括创造事务,以及创造的事务被其它人认可。
  • 编程的过程,把一行行代码组装成一个功能强大的产品,组装中引入自己正在关注的一些技术,算法,模式。这个算法是我设计的,为此带来的一系列乐趣。

      编程的结果和过程,很多时候受制于其它人的。这时候必然会对你在这方面的乐趣产生限制。

      越是大公司,越是大型的系统,这种限制越多。另外,日企的严格开发规范,我觉得是对这些限制达到极致的表现。所以我个人肯定不会去日企。也不建议去日企。有些技术牛人,没有去大企业,可能的一个原因是因为他想把自己这些编程乐趣保留在一个更大的范围。

      另外,微软开发流程我知道的可能比较多点。我就说说我对微软开发中的乐趣说说我的看法,毕竟我不在微软,可能不一定对。

1、我觉得在微软开发团队,测试人员的开发乐趣比开发人员的开发乐趣要更多。

       开发人员需要有产品经理的各种文档作限制,他的最大开发乐趣可能是在设计各种更优秀的算法来保证界面功能可用。

而测试人员则需要用各种工具(包括自己开发的,使用脚本等)来测试各种场景。比如我挺佩服的施凡,有段时间,他为了测试Live Meeting,自己在设计写个语音机器人,来完成这个测试。

2、工作产品被很多人使用的成就感,这点大家应该都很明白,就不细说了。

       上面说的是针对个人的编程激情,很多时候,周围人的习惯会影响你也会慢慢具有这个习惯,这就是团队,环境在潜移默化的感染者您。

如何让团队保持激情?

以下只是我个人的看法,并不一定使用于你的环境。

1、制度化,并以身作则。

       比如我带领的CSDN论坛相关产品开发团队,有个制度就是每周四,组内一个成员介绍自己最近关注的技术。这个制度我没有往整个公司推广,是因为我觉得推广到整个公司,平均分配到每个人身上,就是4、5个月才轮到一个人一次,对于个人学习的督促作用一点用都没有了。

2、工作节奏松劲轮换,不能一直以一个节奏来进行。

     该加班的时候就加班,该放松的时候就放松。注意不能一直是一个节奏,如果一直是一个节奏,那么人很容易懒散。

总结:

      最近在看《人月神话》,其中的很多知识点感触很深,很浅显的一个道理,如果让自己一个人去慢慢悟的话,就不知何时才能出来。

      回到本文讨论的主题,如何让自己保持激情?如何让团队保持激情?这是每一个程序员,每一个项目经理都要考虑的事情,只有有激情的团队才能产生伟大的作品。才能跟上时代的步伐。

2007-9-2 11:14:00 by 蝈蝈俊.net 【评论: 12,阅读:996 】

 

 

理解缓存

  最近公司一直在招人,我作为主考官之一 。经常会提问的一个问题,就是让用户介绍自己在缓存方面的经验和心得。绝大多数的面试者只能说ASP.net的页面缓存和局部缓存,稍稍有点经验的,会提到企业库的缓存,只有很少的人会知道Memcached(一个分布式的缓存)。而对于缓存的一些基本思想,却没有一个人能说出来。

  现在的技术人员,很多时候,不管三七二十一,把一个个实体丢到缓存中,然后在用的时候,就从缓存中去找这个实体。而不会考虑缓存的其他方面因素。所以他们在提到缓存时,想到的才只能是一个个的缓存实现的方法,而不是缓存的思想。

  那么,肯定就有人问,蝈蝈俊,那你理解的缓存思想是如何的呢?下面我就一一来说出我理解的缓存。

 

Q:什么样的缓存才是好缓存?

  能解决问题的缓存就是好缓存。这句话简直就是废话,相当于白猫、黑猫,抓住老鼠的就是好猫。

  那在解决问题前提下,哪个缓存才是好缓存呢? 这个问题我的答案是:缓存命中率高的缓存是好缓存。

  在解决问题前提下,命中率高的缓存比命中率低的缓存,在硬件投入上可能会比较小,同时缓存的数量比命中率低的缓存数量也可能少,这样寻址的速度肯定比较快。所以命中率高的缓存是好缓存。

 

缓存的命中率

  一个缓存的实体在被丢到缓存中后,在这个实体被缓存的期间(这个实体被缓存的生命周期内),如果外部一次都没有使用过它,这个缓存实体的命中率就是0。这个实体被请求的次数越多,它的缓存命中率越高。

  上面说的是缓存中一个实体的命中率。对于缓存整体来说,它的命中率则是上面各个被缓存的个体的命中率分布图。

  对于缓存来说:通常最常使用的个体之占总体的很小一部分。最不常使用的占整体的很大一部分。如下图所示:

缓存的命中率一般分布图

  所以我们经常会看到类似这样的数据:

  缓存的1万个元素中,有100个被频繁的使用,几乎每分钟都会被使用一次。2000个数据,每小时被请求一次。3000个数据,每天被请求一次,剩下的数据,被丢到缓存中后一次都没有被使用过。

  现在硬件发展很快,如果我们只是需要缓存1万个数据的话,我们完全可以做到不管这1万个数据是否被使用到,全部丢到缓存,这样只要找数据,肯定缓存中有这个数据。而不需要作额外的运算,或者不需要向数据库发出请求。

  但是:硬件发展快,数据量发展也快。小型的网站,缓存1万条数据,也就全部缓存了。但是大型网站最少也是上百万的数据量或者上T级别的数据,这些数据量显然不能都丢到缓存。这时候设计一个合理的缓存方案,提高缓存的命中率,就非常重要。而且是必须的。

 

提高缓存命中率的一些常见方法

  纯技术的角度来说,我们只有记录了用户的单位时间的请求数,并依照这个信息来把最常被使用的数据缓存起来。

  但更多的时候,我们是根据业务逻辑来提高缓存命中率的。比如:去年,前年发表的博客,这类文章的浏览请求,一般一天至少可怜的几次。一般不应该缓存到内存中。

  又比如,回复数多的帖子,一般被请求数会比回复数少的帖子会被更多人次看到。 

  我们应该通过上面逻辑,根据我们实际业务逻辑,提供一个缓存算法,提高缓存的命中率。让在我们硬件允许的条件下,缓存适当的数据,而不是所有数据。

 

  一个反面的例子就是:不管三七二十一,一个大型的博客站点,一篇文章被用户请求的时候,发现不在内存缓存中,就从数据库中读出,然后丢到缓存。

  要知道,现在爬虫程序很多的。另外,博客这类搜索引擎友好的站点,决大多数的访问压力是搜索引擎搜索过来的。而这些访问一般都是1小时,或者1天之内,对某篇文章只有几次甚至1次请求,之后再也没有了。上面作缓存的方法,命中率会非常低的。

  这里也许就有人会问,郭红俊,既然你不建议我缓存这些博客的内容,但是我如何提高我站点的性能呀,我至少得保证我博客站点不会速度慢的无法响应用户请求呀。

  这个问题的解决方案有很多,一个最简单的方法就是把这些博客做成静态Html页面,也就是文件系统的缓存,文件系统因为硬盘的原因,可以简单理解成可以无限扩容,这样就可以把很多命中率低的内容进行缓存。

  如果你的页面需要一些动态逻辑判断,你可以把数据缓存成XML文件,然后服务器段整合这些XML文件,或者是包含文件。这也是种不错的方法。

 

说了这么多缓存命中率的问题,简单汇总一下缓存命中率的观点

  1. 小型网站可以全部数据缓存,一般压力也不会很大,可以忽略缓存命中率问题。
  2. 大型服务无法全部数据缓存,只能部分数据缓存,这时候就需要架构师设计出对该业务逻辑适用的缓存方法,尽可能的提高缓存的命中率。
  3. 提高命中率的方法大多是跟业务逻辑捆绑的,需要跟具体问题具体分析
  4. 对于不能被内存缓存的数据,最简单的提高性能方法就是使用文件缓存。
  5. 文件缓存可以整个内容缓存成一个静态文件;也可以是整个页面的一个区域被缓存成一个文件,然后被包含;也可以是把一个实体序列化成XML文件进行缓存。

 

下面我们看看缓存的其他几个不那么重要的方面:

 

缓存的生命周期内的活动

  永久不过期,永久不变更的内容,这类东西就不应该放在缓存。缓存是临时的存储,而不是永久的,所以缓存的生命周期是有限的。

  它依次可能会经历如下活动:

  1. 进入缓存。(进入缓存的时候,可能需要指定它以后的过期策略,如果不指定,需要使用系统默认的过期策略)
  2. 从缓存中获得它,注意,这时候需要处理线程安全的问题。
  3. 更新缓存,注意,也需要考虑线程安全问题
  4. 离开缓存,这个可能是外部请求,也可能是缓存根据过期策略把它清理掉。

 

缓存的过期策略

  一般我会问,你所接触的缓存中,碰到过那些缓存过期策略?

  最常见的几种过期策略如下:

  多长时间没有被请求,则过期,最典型的就是ASP和ASP.net 提供的 Section 功能。其实它就是一个缓存。

  依赖于文件变更的缓存,一旦文件被修改,缓存则过期,典型的是 WEB站点的 Web.config ,一旦这个文件变更,不但缓存重起,IIS进程也会进行一次释放工作。

  在此基础上,可能看到很多依赖关系的缓存过期策略。比如依赖于数据库的缓存过期策略。

  当然,业务逻辑里可能会有更复杂的过期策略,必须CSDN新版积分制论坛中,帖子列表缓存会在列表数据缓存达到600时,把它清理到550条数据。

  又比如新积分制论坛帖子的缓存过期,则是没有任何列表引用这个帖子后,则这个帖子过期。

 

缓存的同步问题

  使用缓存,则意味着同样的数据,可能有多份并存。如果你的代码没有考虑某种情况,导致了这两份数据不一致了。这时候就会有问题发生。

  解决方法很简单,把你的业务逻辑,代码触发情况都考虑清楚,不要遗留没有触底的地方。

  简单的方法会导致你的代码逻辑变得非常复杂。

  这也就是有些人,在非必要的时候,建议你不要用缓存的原因。一旦开始使用缓存,你就应该准备增加大量的代码来处理数据同步的问题。

 

初始化填充缓存数据

  有时候在缓存被初始化后,还需要预先填充一些数据到缓存中。这就是缓存数据的初始化操作。

  缓存数据的初始化操作需要考虑以下问题:

  1. 需要多长时间进行初始化,一般如果是站点的话,我们可能在 Global.asa 的 Application_OnStart 中处理这个初始化工作。初始化的一般不能太久,这时候就是考验我们代码优化的能力了。
  2. 初始化的时候,一般是批量导入数据,而不是我们正常使用的时候,一次处理一个数据。

 

 总结:

  本文介绍了我对缓存的一些观点,而没有深入涉及到具体的缓存技术。希望通过本文的讲述,让只会缓存用法不懂缓存思想的人有初步的了解。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值