blogjava-凯发k8网页登录

blogjava-凯发k8网页登录http://www.blogjava.net/killme2008/category/19802.html生活、程序、未来zh-cnsun, 09 dec 2012 22:26:16 gmtsun, 09 dec 2012 22:26:16 gmt60博客搬迁http://www.blogjava.net/killme2008/archive/2012/12/10/392701.htmldennisdennissun, 09 dec 2012 17:24:00 gmthttp://www.blogjava.net/killme2008/archive/2012/12/10/392701.htmlhttp://www.blogjava.net/killme2008/comments/392701.htmlhttp://www.blogjava.net/killme2008/archive/2012/12/10/392701.html#feedback1http://www.blogjava.net/killme2008/comments/commentrss/392701.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/392701.html很久没有更新博客,没想到更新是搬迁公告。这个博客累计的访问量突破百万,是我建立的时候完全没有想过的事情。博客对我来说更多是记录、记忆的地方,我时常因为想不起某个东西,来翻自己的博客,查找旧知,发现新知。阅读很多人的博客,也是我跟踪、学习新知的主要方式。虽然微博兴起,不过博客作为更系统性的记录的地方,不会过时。

非常感谢blogjava提供这么优秀的平台。只是我今年给自己的一个目标是建立自己的博客,因此现在要搬迁,加上其实现在也写的少,其实搬迁不搬迁,意义也不大了。算是一个通告,有兴趣的可以订阅我的新博客,没兴趣的请自行略过,谢谢大家。

新博客地址:
rss地址:

新博客的第一篇记忆是《》,从现在开始,这个博客将不再发布任何新的文章,已有的也不会删除,部分可能会导到我的知识库上去。

最后,祝福blogjava越办越好。


dennis 2012-12-10 01:24 发表评论
]]>
clojure中文专业技术社区http://www.blogjava.net/killme2008/archive/2012/09/25/388498.htmldennisdennistue, 25 sep 2012 04:51:00 gmthttp://www.blogjava.net/killme2008/archive/2012/09/25/388498.htmlhttp://www.blogjava.net/killme2008/comments/388498.htmlhttp://www.blogjava.net/killme2008/archive/2012/09/25/388498.html#feedback0http://www.blogjava.net/killme2008/comments/commentrss/388498.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/388498.html
最近在公司大佬的支持下,建立了一个clojure语言中文方面的博客和问答网站,欢迎任何对clojure这门基于jvm之上的函数式语言感兴趣的童鞋贡献原创文章或者资料,申请帐号请看。

博客地址:  
问答网站:  

欢迎转发和注册使用,谢谢。

邮件列表仍然使用google group:

dennis 2012-09-25 12:51 发表评论
]]>
工作近况http://www.blogjava.net/killme2008/archive/2012/03/16/372074.htmldennisdennisfri, 16 mar 2012 14:59:00 gmthttp://www.blogjava.net/killme2008/archive/2012/03/16/372074.htmlhttp://www.blogjava.net/killme2008/comments/372074.htmlhttp://www.blogjava.net/killme2008/archive/2012/03/16/372074.html#feedback7http://www.blogjava.net/killme2008/comments/commentrss/372074.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/372074.html
    正式介绍下我们公司,大boss是youtube创始人查德•赫利(chad hurley)和陈士骏(steve chen),我们在中国的boss是前google员工/耶鲁的博士,更多关于团队成员的介绍请看,我的同事们真的很强大,我要学习的地方很多。我们做的产品是从雅虎手上买下来的delicious.com,不过中国团队运作的是美味书签——。我们刚在3月1号开始做public beta,预计会在4月份的时候正式对外开放注册。我们的团队博客在。

    我在团队里做的事情还是偏向后端,这一个月来做的事情更偏向运维之类,搞搞solr复制、mysql复制、程序监控之类,将原来只是简单了解过的东西动手做了一遍,能亲手实践的感觉不错。在此过程中要感谢锋爷和刘帅哥的帮助,再次感谢。淘宝的同事们开源了metaq和gecko,我也做了点工作,都在。几个维护的开源项目都没有太大进展,很惭愧,还被人催发新版本,能承诺的是周末发xmemcached的新版本,主要还是修bug。本来要写个clojure世界的系列文章,因为响应寥寥,也不是很有动力写下去。杂七杂八读了几本书,都没读完,这一个月杭州太冷了,雨下个不停,不过终于这一周开始晴天了,希望老天爷别再掉眼泪。

    收拾收拾心情,整装待发,希望新的一年里能做出点不同的东西。
    

dennis 2012-03-16 22:59
]]>
第二次cn-clojure线下聚会http://www.blogjava.net/killme2008/archive/2012/02/09/369655.htmldennisdennisthu, 09 feb 2012 04:37:00 gmthttp://www.blogjava.net/killme2008/archive/2012/02/09/369655.htmlhttp://www.blogjava.net/killme2008/comments/369655.htmlhttp://www.blogjava.net/killme2008/archive/2012/02/09/369655.html#feedback0http://www.blogjava.net/killme2008/comments/commentrss/369655.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/369655.html    去年(我靠,已经是去年了)首次在上海组织了第一次cn-clojure的线下聚会,详细可以看。今年,我们将在北京举行第二次cn-clojure的聚会,时间大概在2月底或者3月初,具体地点待定,欢迎任何对clojure语言或者lisp语言感兴趣的朋友参加,如果有想分享的技术topic更好 :d。

    如果你要参加,请参加下面的报名调查,填写真实的姓名和邮箱。如果有想分享的topic,可以填写调查或者直接邮件给我。
    报名链接:

    我们将在议程、时间和地点确定后发邮件给报名的朋友,确认参会的具体时间和地点。
    邮件列表:

dennis 2012-02-09 12:37
]]>
最近做的一些事情http://www.blogjava.net/killme2008/archive/2012/01/15/368548.htmldennisdennissun, 15 jan 2012 04:50:00 gmthttp://www.blogjava.net/killme2008/archive/2012/01/15/368548.htmlhttp://www.blogjava.net/killme2008/comments/368548.htmlhttp://www.blogjava.net/killme2008/archive/2012/01/15/368548.html#feedback19http://www.blogjava.net/killme2008/comments/commentrss/368548.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/368548.html    很久没写blog了,写写最近做的一些工作,给感兴趣的朋友做参考。
    首先是我们的的“复制品”metamorphosis做了1.4版本,实现了同步复制方案,broker本身也做了很多优化,总体而言meta是一个非常成熟可用的产品了。甚至可以说是我在淘宝做的最好的一个产品。有些朋友总是问我们为什么不直接用kafka,而要另写一个?这里做个统一的解答。
(1)kafka是scala写的,我对scala不熟悉,也不待见,考虑到维护和语言熟悉程度,用java重写仍然是最好的选择。
(2)其次,kafka的整个社区非常不活跃,发展太慢,而我又不愿意去学习scala来参与社区发展,那么唯一的出路就是自己写。
(3)kafka的一些工作不能满足我们的要求,比如一开始它连producer的负载均衡都没有,它的消费者api设计还是比较蛋疼的。它也不支持事务,没有考虑作为一个通用的mq系统来使用。并且它也没有高可用和数据高可靠的方案。
(4)我们做了什么呢?
a.用java彻底重写整个系统,除了原理一致,整个实现是彻底重新实现的。
b.我们提供了生产者的负载均衡(仍然是基于zk),重新设计了消费者api,更符合 jms的使用习惯。
c.我们提供了事务实现,包括producer和consumer端的,包括本地事务和符合xa规范的分布式事务实现。
d.我们提供了两种数据高可靠方案:类似mysql的异步复制和同步复制方案。通过将消息复制到多个节点上来保证数据的高可靠。
e.我们提供了http协议的实现,并且本身使用协议也是类似memcached的文本协议,内部也增加了很多统计项目,可以以memcached的stats协议的方式来获取纯文本的统计信息。整个系统运维很方便。
f.提供了很多扩展应用:广播消费者的实现,多种offset存储的实现(默认的zookeeper,还有文件和mysql),tail4j用于作为agent发送日志,log4j appender扩展用于透明地使用log4j发送消息,hdfs writer用于将消息写入hdfs,storm spout用于将消息接入storm做实时分析,基本上形成一套完整的工具链和扩展。
g.一些其他功能点:group commit提升数据可靠性和吞吐量,连接复用,集群下的顺序消息发送,消息数据的无痛迁移和水平扩展,web管理平台等。

    meta未来会走开源的路子,不过不会是我来推动的,估计是在今年会有进展。

    我最近还写了一些小项目值得一提,首先是这个轻量级的表达式执行引擎发布了2.2.1版本,主要是这么几个改进:
(1)支持多维数组变量的访问,如a[0][0]
(2)添加expression#getvariablenames()用于返回表达式的变量列表
(3)添加aviatorevaluator#exec方法来简化调用
(4)bug修正等。
    maven直接升级:
 <dependency>
                        
<groupid>com.googlecode.aviatorgroupid>
                        
<artifactid>aviatorartifactid>
                        
<version>2.2.1version>
        
dependency>

    其次,这个handler socket的客户端,由新浪微博的@赵鹏城实现了inc/dec协议,添加了incr和decr方法用于更新计数,感谢他的贡献,如果你需要这两个功能可以自己从github拉取源码并构建打包,暂时不准备发布到maven。

    第三,关注高可用的transaction manager实现的可以关注下我的项目,这是一个基于这个开源jta实现,提供基于bookkeeper的高可用的tm项目。将事务日志写到高可用的bookkeeper上,并利用zookeeper来做到故障的透明迁移,某个tm挂了,可以在其他机器上从bookkeeper拉取日志并恢复。代码已经稳定并做了性能测试,没有做进一步的破坏性测试。是一个比jotm和atomikos更靠谱的开源jta实现,并且性能也好上很多,代码质量更不用说,建议有兴趣的可以看一下。我也为它贡献了,日志写入性能提升了近一倍。

    最后,我在clojure上做了一些事情,首先是为项目贡献了两个patch:利用curator做zookeeper交互和添加storm.ui.context.path选项,前者被作者接受,后者暂时只对我们有用。前者让storm跟zk的交互更可用,后者是为storm ui添加了可选的相对路径。你都可以在尝试,curator的patch在storm 0.6.2上发布,现在还是snapshot状态。昨天晚上牙痛睡不着,半夜写了个,用于统计分析clojure stm运行状况,诸如事务运行次数和时间,事务的重试原因和次数等,可以针对每个dosync的form做统计,有兴趣也可以看下。不过我其实更想将这个功能加入到clojure核心,会尝试提交下pull request。

   还有个工作上的变迁,我将在2月1号正式从呆了近三年的淘宝离职,加入一支充满活力的创业团队。从稳定的大公司出来,去加入一家初创公司,不能说没有风险,但是我还是想去接受新的挑战,愿意更新我的知识结构,愿意向牛人们学习。我在某个blog上说我今年遇到了人生中最大的挑战和转折,并不是说这个事情,而是我的儿子今年患了一场重病,庆幸在很多人的帮助和关心下,他勇敢地挺了过来,度过最困难的一关,现在还在继续治疗。我要感谢很多人,感谢淘宝,感谢我的tl华黎和锋寒,感谢我的同事和朋友林轩,感谢我们的hr,感谢三年后打交道的很多同事。没有他们,我今年真的过不了关,没有他们,我也不能进入淘宝并呆上快三年。

   最后的最后,我要特别感谢我的儿子,谢谢你的降生,谢谢你今年的勇敢,谢谢你给我们全家带来的快乐,谢谢你继续陪着我们 ,也希望你新年继续勇敢地坚持下去,我们必将战胜一切。     
   

dennis 2012-01-15 12:50
]]>
我的一些“偏见”http://www.blogjava.net/killme2008/archive/2011/11/30/365238.htmldennisdenniswed, 30 nov 2011 14:50:00 gmthttp://www.blogjava.net/killme2008/archive/2011/11/30/365238.htmlhttp://www.blogjava.net/killme2008/comments/365238.htmlhttp://www.blogjava.net/killme2008/archive/2011/11/30/365238.html#feedback14http://www.blogjava.net/killme2008/comments/commentrss/365238.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/365238.html    在豆瓣发了一些牢骚,索性多说一些我个人对人对事的偏见,既然是偏见,就不会让人舒服,事先声明是扯淡,不想浪费时间的人略过。

1.我们要远离新浪微博,新浪微博跟twitter不一样,twitter是为了让每个人的信息的更好更快地传播而设计的,而新浪微博是为了让权威的声音更好更快地传播而设计的。迷恋上新浪微博,你要么是权威,要么是跟随权威。成为权威的,免不了沾沾自喜,真以为自己成了“权威”。更可怕的是你不可避免地要生活在相互吹捧和喧嚣中。

2.在编写代码之外,我们可能需要更多的手艺傍身,例如木匠或者厨师,以免在乱世的时候因为不需要程序员而饿死。ps.计算弹道轨迹的程序员除外。

3.据说真正的牛人从不跳槽,作为大多数不是牛人,以及已经远离牛人行列的我们(跳槽超过3次以上),跳槽仍然是你提升自己的有效途径,无论是薪水还是技术。

4.写简历的技巧,我慢慢领悟到了,少点技术术语,多点成效和应用,打动了hr过了第一关之后,再去跟技术人员扯淡。

5.简历要定时更新,你可以理解成定时提醒下猎头和hr,关注我啊,关注我啊。

6.强烈地拥抱文本化,配置文本化(没人会脑残地用二进制当配置文件吧?),协议文本化,婚姻文本化。

7.一切不以加薪为目的的挽留,都是耍流氓,这不是我的原创。

8.有趣比实用重要,没趣味的东西,给钱也不去做(好吧,我说假话)。

9.对新潮的东西保持一点警惕,如果这个东西三个月后还有人在谈论,那可以关注下

10.代码永远比文档、博客真实和靠谱,阅读代码习惯了,跟阅读文档没啥区别。

11.少关注博客和新闻,戒掉看google reader的习惯。现在更多地看maillist上的讨论和问题,真正重要的东西你永远不会错过。

12.不追求完美,等你完美的时候别人已经是事实标准。

13.大型的技术聚会不是为技术人员准备的,这是大公司给员工的度假福利和领导们的吹水时间。只有在小型的技术聚会上才能看到一些有价值的东西,任何稍微跟商业沾一点边的几乎都没有太大价值,我说的是国内。

14.80%的分享都只对演讲者有益,该sb的还是sb,该牛b的还是牛b。最有效的分享是结对编程和结对review。分享和培训最大的意义是让行政们觉的自己的存在价值很大。

15.国内翻译国外经典>国内原创精品>国外原版,这个原则对英语好的人除外。

16.极其讨厌要求强制缩进的语言,比如python。

17.标榜是一种人生态度,装b装久了你就真牛b了。

18.凭啥不造轮子,你们造轮子舒坦了,爽快了,就不让别人造了。我造轮子我快乐。

19.偏见不全是坏事,坏的是不愿意改变偏见。


    扯淡时间结束。

dennis 2011-11-30 22:50
]]>
我写的这些opensource项目http://www.blogjava.net/killme2008/archive/2011/10/09/360311.htmldennisdennissun, 09 oct 2011 12:23:00 gmthttp://www.blogjava.net/killme2008/archive/2011/10/09/360311.htmlhttp://www.blogjava.net/killme2008/comments/360311.htmlhttp://www.blogjava.net/killme2008/archive/2011/10/09/360311.html#feedback15http://www.blogjava.net/killme2008/comments/commentrss/360311.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/360311.html    将自己在googlecode和github上的所有项目过了一遍,整理一张列表,列下一些还有点价值和用处的项目,都不是什么great job,纯粹是为了工作需要或者乐趣写的东西,看官要是有兴趣也可以瞧瞧。

 一 java相关

1.,还算是比较多人使用的一个java memcached client,优点是效率和易用性,缺点是代码写的不怎么样,两年前发展到现在的东西,以后还会继续维护。

2.,看的时候顺手写的客户端,我们公司内部某些项目在用,可能还有其他公司外的朋友在用,后来同事聚石贡献了一个扩展项目,更易于使用,他写的代码很优雅漂亮,推荐一看。暂时没有精力维护。

3.,一个很初级的表达式执行引擎,行家看到肯定要笑话我。不过语法上很符合我自己的口味,我们自己的项目在用,也有几个朋友在用,会继续维护。

4.,一个玩具,其实是模仿libevent的一个java实现,对nio或者libevent的实现机制感兴趣的还可以看看。

5. ,我fork的kilim实现,修改了nio调度器,使用多个reactor做调度效率更高,并添加了一个httpclient的实现。

二 android项目

学习android完全是玩票性质,有3个项目,对初学android开发的可能有点参考价值。

1.,一个天气预报和告警的widget插件,ui太丑了。
2.,写来记录儿子体重变化的小工具,可以自定义项目和生成曲线图,我自己还在用。
3.,最近写的杀进程工具,绝对轻量级,没广告,也是我自己在用。

三 clojure项目

1.,一个用clojure实现的scheme解释器,基于sicp这本书的解释器实现。
2.,类似的分布式部署和管理的dsl实现,挺好玩的,也有朋友在用,我自己还用不上,sunny有写了个很方便的lein插件。

clojure还写了一堆烂尾项目,就不拿出来恶心人了。

四 其他

1.,一个展现和管理zookeeper的web应用,我们自己在用,基于node.js实现。
2.,一个erlang的web shell实现,可以在浏览器里做erlang编程,被一些开源项目比如membase用到了。

    写这些东西对我自己最有好处,如果能顺便给他人带来好处,那是额外的好处。最近正处于我自己一生中也许是最大的转折关头,不能更新blog了,最后,祈求诸天神佛能带来奇迹。

dennis 2011-10-09 20:23
]]>
记首次cn-clojure线下聚会http://www.blogjava.net/killme2008/archive/2011/08/09/356106.htmldennisdennistue, 09 aug 2011 06:09:00 gmthttp://www.blogjava.net/killme2008/archive/2011/08/09/356106.htmlhttp://www.blogjava.net/killme2008/comments/356106.htmlhttp://www.blogjava.net/killme2008/archive/2011/08/09/356106.html#feedback3http://www.blogjava.net/killme2008/comments/commentrss/356106.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/356106.html
    这个聚会是由江宏首先提议的,我参与协助。目的是让长三角地区对感兴趣,或者正在使用的朋友当面认识和交流一下。会议的组织过程一波三折,首先是会议地点本来定在了上海google办公室,但是后来google那边又说不让过去,我再联系了原来淘宝网的同事火狐,经过他的努力和帮助,最终将地点确定在了上海大众点评。要感谢大众点评网和火狐的帮助,不然这次活动估计就黄了。会议的日期选定也比较偶然,跟七夕撞在了一天,并且8月6号这天说台风“梅花”要在江浙一带登陆,上海要刮多少级多少级的大风,加上我和杭州的几个朋友过去要坐高铁,那心里就七上八下了,搞不好就要被“掩埋”了。我们还开玩笑说最好买火车中段车厢的票为妙。

    8月6日一早,和同在淘宝的杨冬,加上两位做ror的朋友一起出发,天气没有想象的糟糕,高铁一个小时就到了,转地铁到大众点评网大概也才中午12点左右。打了电话给火狐,一起吃了饭然后就直奔大众点评网。大众点评网的前台大厅装修也是非常熟悉的橙色,很意外周6有很多人,后来才知道是在搞招聘会和培训。这时候,江宏他们也从昆山赶到了,火狐帮我们定的会议室很大,足够容纳20号人左右。陆续有人达到,到约定的1点的时候,我记的是来了大概11还是12个人,还有几个朋友在路上,因此我们决定推迟到1点半再开始。最终来的人估计有15个以上,估计报名的都来了。

    1点半正式开始,首先是我来讲《clojure概览》这个topic,主要是一个clojure语言的介绍。这个是我上周开始准备的,在去年《clojure的魅力》的基础上做了删减和增加,听取江宏的意见增加了示例和引子。上周也在我们的团队讲过一次。轻车熟路,也为了给后面的topic留出时间,我讲的比较快,大概40分钟就结束了。

    接下来是孙宁(sunng87)讲《clojure开发的生命周期管理》,我对clojure的周边工具并不熟悉,趁机更好地了解了很多 clojure开发过程中用到的工具和资料,推荐对clojure开发感兴趣的朋友看下。尝试了下,比我预期的要好,遗憾的是还没有语法高亮,推荐初学clojure的朋友可以尝试下这个轻量级的ide。目前最好的clojure ide还是idea里的la clojure插件。最后孙宁顺便广告了下插件,这是孙宁构建的一个的lein插件,他还贡献了一个类似python里的clojure dsl实现,让clojure-control更易用。

    接下来是江宏介绍他们开发这个纯clojure实现的网站中使用的技术,以及遇到的问题和经验。这个网站基于这个框架实现的,前端采用backbone.js,后端是mongodb和postgresql,可以说都是非常“新潮”的技术。他在谈遇到问题的时候,提到clojure的stack trace又长又丑,这一点深有体会,clojure的异常堆栈包含了java和clojure的,整个调用链相对较长,非常不利于问题的排查,不知道后续clojure会不会对这一点做出改进。

    接下来是林晴介绍他们一个用scala实现的类似domino的企业oa系统,不过他这个例子给我的感觉更多是发挥了mongodb的schema free的特点,没有体现出使用scala的好处来。我对scala的观点一直很明确,scala想做jvm上的c ,从个人角度不喜欢这种多范式的语言,并且语法不符合我的胃口,特别是类型系统这块特别复杂,我怕我在写scala的时候还要参考一本厚厚的reference,这不是我想要的。而clojure的核心就非常小,相对符合我的期望。

    作为东道主的火狐介绍了的新架构以及他们从.net往java迁移的经验,他们的新架构也是做服务化和中心化,对于.net和java平台来说,迁移更多是从人力成本和一些其他因素决定的,当然,迁移最重要的还是要有公司高层的全力支持,特别重要的一点是如何让老员工也参与这个过程。因为老员工对现有系统和业务最熟悉,将他们排除在外闭门造车是注定要失败的。

    最后是同样来自昆山文石的吴哲介绍如何在半天内实现一个html 5的游戏,他介绍的非常有趣,processing本身是一门编程语言,有人将它移植到了js上,可以直接在支持html5上浏览器展现,效果相当cool。巧合的是我在回去后的第二天去书店的时候,竟然在某个角落看到《》这本书,买了下来准备了解下。做数据图形化的同学可以关注下。

    总体来讲,这次聚会的效果超过我的预期,在超强台风的阴影下和七夕爱情的感召下还有这么多人赶过来,作为组织者之一非常感动。并且topic讲座也让我学习了一些东西,最重要的是当面认识了一些网上交流过的朋友,给我印象深刻的是看起来非常老成的孙宁,完全不像个85后。还有个印象深刻的细节是现场的5,6台mbp,这里面还是因为有同学是在搞ror的因素。

    最后,给下slide的链接如下:

1,我的《》,源码在上。
2,孙宁的《》,和。
3,江宏的《》,他们开发的网站
4,吴哲的《》
5,火狐的《》
6,
 

dennis 2011-08-09 14:09
]]>
编程语言的选择很重要http://www.blogjava.net/killme2008/archive/2011/08/06/355926.htmldennisdennissat, 06 aug 2011 15:51:00 gmthttp://www.blogjava.net/killme2008/archive/2011/08/06/355926.htmlhttp://www.blogjava.net/killme2008/comments/355926.htmlhttp://www.blogjava.net/killme2008/archive/2011/08/06/355926.html#feedback9http://www.blogjava.net/killme2008/comments/commentrss/355926.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/355926.html这里,题目是《》。简单来讲这文章就是鼓吹python的,然后举了很多例子说python描述算法比lisp容易。这个无需多说,图灵模型本来就比lambda演算更适合描述算法。

    我想说的是,文中明明提了,peter norvig说的是:
就更一般意义上的编程而言,在google和其他地方,我认为语言的选择并不如其他方面的选择那么重要:如果你有了正确的总体架构、正确的程序员团队、正确的开发过程(能够快速开发、持续改善),那么很多语言都能胜任;但如果以上的东西你没有,那无论选择什么语言,你都会陷入一团糟。

   这句话的意思很明显,在google或者其他什么地方,编程语言的选择,比之正确的架构,正确的团队以及正确的开发过程,对最终任务的完成影响不是那么大。但并非所谓"编程语言的选择不重要“,这种断章取义的题目除了吸引眼球外,没有任何益处。
    很多编程语言都可以胜任你要完成的编程任务,你完全可以用c去写cgi,用汇编去写消息中间件,只要你有正确的架构,正确的团队和开发过程,你应该总能完成任务。但是选择适当的编程语言可以让你事半功倍,更少的代码,更高的开发效率。从ror以及动态语言的流行来看,选择编程语言,真的很重要。

    除非你的规模达到google的程度,性能意味着美元,一秒的优化意味着成千甚至上亿的dollar的时候,也许你可以说下编程语言的选择不重要。

    最后,我还想鄙视下分享这篇文章的大爷们,你们真的看了文章吗?还只是冲着这标题,急急忙忙地献宝式地分享了?咱们淡定点行不?

dennis 2011-08-06 23:51
]]>
长三角地区的技术交流活动http://www.blogjava.net/killme2008/archive/2011/07/27/355154.htmldennisdenniswed, 27 jul 2011 08:19:00 gmthttp://www.blogjava.net/killme2008/archive/2011/07/27/355154.htmlhttp://www.blogjava.net/killme2008/comments/355154.htmlhttp://www.blogjava.net/killme2008/archive/2011/07/27/355154.html#feedback1http://www.blogjava.net/killme2008/comments/commentrss/355154.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/355154.htmlhttp://hjiang.net/archives/484

clojure-cn要组织周期性的线下技术交流活动了。如果你热爱程序设计的相关技术,并且住在长三角一带,欢迎来参与活动。只要填一下这个调查表就可以:


更多:
    关注我的blog的朋友应该都知道我这一年都一直在关注这门语言,后来还搞了个。的公司在使用clojure做商业项目,他们公司可能是国内唯一在使用clojure的商业团体,他上周跟我提起想搞这么个活动,促进对clojure学习和使用的交流,并且不局限在clojure语言本身。今年其实给自己一个目标也是去尝试推动一些事情,我对clojure纯粹是技术上的兴趣,未来也不排除去找一份专职写clojure的工作,如果你或者他(她)对clojure语言(或者函数式语言)感兴趣,欢迎来参加这次聚会,填写下这个调查表:。

    我们在调查完成后统计下大家的兴趣点和地理分布,最后决定在哪里举办,以及确定talk列表和聚会形式等。

    我还申请了一个域名 ,在github上建了个page,这件事的进展会放到这个网页上。



dennis 2011-07-27 16:19
]]>
做基础产品的体会http://www.blogjava.net/killme2008/archive/2011/05/22/350752.htmldennisdennissun, 22 may 2011 02:30:00 gmthttp://www.blogjava.net/killme2008/archive/2011/05/22/350752.htmlhttp://www.blogjava.net/killme2008/comments/350752.htmlhttp://www.blogjava.net/killme2008/archive/2011/05/22/350752.html#feedback6http://www.blogjava.net/killme2008/comments/commentrss/350752.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/350752.html      一个公司大了,总有部分人要去做一些通用的东西给大家用,我这里说的基础产品就是这类通用性质的东西,不一定高科技,但是一定很多人依赖你的东西来完成各种各样的功能。做这样的东西,有些体会可以说下。

    首先,能集中存储的,就不要分布存储,数据集中存储有单点的危险,但是比之分布式存储带来的复杂度不可同日而语。况且集中式的存储也可以利用各种机制做备份,所谓单点风险远没有想象中那么大。

   其次,能利用开源框架的,就不要重复造轮子。程序员都喜欢造轮子,但是造轮子的周期长,并且不一定造的更好。在强调开发效率的互联网时代,如果能直接利用现有框架组装出你想要的东西,迅速占领市场,比你造的高性能、高可用、高科技的轮子更实用。这个跟做新产品开发有点类似,迅速组装,高效开发,然后再想办法改进。

   第三,要文本,不要二进制。协议要文本化,配置要文本化。不要担心性能,在可见的时间里,你基本不会因为文本化的问题遇到性能瓶颈。

   第四,要透明,不要黑盒。基础产品尤其需要对用户透明,你的用户不是小白用户,他们也是程序员,而程序员天生对黑盒性质的东西充满厌恶,他们总想知道你的东西背后在做什么,这对于查找问题分析问题也很重要。怎么做到透明呢?设计,统计,监控,日志等等。

   第五,要拥抱标准,不要另搞一套。已经有了久经考验的http协议,你就不要再搞个sttp,有了amqp协议,你就不要再搞个bmqp。被广泛认可的标准是一些业界的顶尖专家制定出来的,他们早就将你没有考虑到的问题都考虑进去了。你自己搞的那一套,随着时间推移你会发现跟业界标准越来越像,因为面对的问题是一样的。使用标准的额外好处是,你有一大堆可用的代码或者类库可以直接使用,特别是在面对跨语言的时候。

    第六,能share nothing,就不要搞状态复制。无状态的东西是最可爱的,天然的无副作用。水平扩展不要太容易。

    第七,要将你的系统做的越不“重要”越好,如果太多的产品依赖你的系统,那么当你的系统故障的时候,整个应用就完蛋了。我们不要担这个责任,我们要将系统做的越来越“不重要”,别人万一没了你也能重启,也能一定时间内支撑正常的工作。

    第八,要专注眼前,适当关注未来。有远见是好事,但是太多远见就容易好高骛远。为很小可能性设计的东西,没有机会经历实际检验,当故障真的发生的时候,你也不可能完全信赖它。更好的办法是将系统设计得可介入,可在紧急情况下人工去介入处理,可介入是不够的,还要容易介入。

    第九,不要对用户有假设,假设你的用户都是smart programmer,假设你的用户不需要位运算,假设你的用户要同步不要异步。除非你对这个领域非常熟悉并实际使用过类似的东西,否则还是不要假设。

    第十,咳咳,似乎没有第十了,一大早憋了这么篇无头无脑的blog,大伙将就看看。







dennis 2011-05-22 10:30
]]>
cn-clojure群组建立http://www.blogjava.net/killme2008/archive/2011/01/28/343727.htmldennisdennisfri, 28 jan 2011 11:39:00 gmthttp://www.blogjava.net/killme2008/archive/2011/01/28/343727.htmlhttp://www.blogjava.net/killme2008/comments/343727.htmlhttp://www.blogjava.net/killme2008/archive/2011/01/28/343727.html#feedback5http://www.blogjava.net/killme2008/comments/commentrss/343727.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/343727.html     在国内,语言的用户估计是小众中的小众,没有多少人听说,也没有多少人使用,资料也大多数是英文的,讨论也只能上国外论坛。因此,我想建立一个cn-clojure的google group,供大家交流和学习clojure语言。群组地址(需要翻墙):

   现在没人,就我一个。我也会在群组里放些学习资料,欢迎任何对clojure感兴趣的朋友加入。



dennis 2011-01-28 19:39
]]>
2010年的小小总结http://www.blogjava.net/killme2008/archive/2011/01/01/342110.htmldennisdennissat, 01 jan 2011 01:08:00 gmthttp://www.blogjava.net/killme2008/archive/2011/01/01/342110.htmlhttp://www.blogjava.net/killme2008/comments/342110.htmlhttp://www.blogjava.net/killme2008/archive/2011/01/01/342110.html#feedback3http://www.blogjava.net/killme2008/comments/commentrss/342110.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/342110.html     首先,还是利用下这个,查看下我10年读过的书,看过的电影




    读书:读的太少,也可以看到,技术方面的更少,如果要说推荐,我只会推荐《programming clojure》作为学习clojure的入门,并且推荐《构建高性能web站点》作为了解一个网站构建的方放面面的入门书。

    电影:今年进电影院的次数也寥寥无几,主要还是重看了莱昂纳多的作品,《盜梦空间》很惊艳,《钢铁侠2》很失望。

     去年的愿望:读完《算法导论》——2/3,继续深入erlang,探索erlang在工作中的实际应用——几乎没有,加强对其他系统的了解以及大型网站构建方面的学习——小小一些了解,希望能全家一起去旅游一次,希望能将老爸老妈接过来玩一段时间——没有做到。
  
     工作:状态并不好,还是尝试努力去做了一些事情,包括参与一些分享,更多参与他人的代码复查和设计审查等。抱怨、牢骚少了一些,相对淡定了。

     2011年:还是不谈大的愿望,从以往的经验来说,很难靠谱。也许有一个相对明晰的目标:提高自制力和计划性。




dennis 2011-01-01 09:08
]]>
我的第一个android练习http://www.blogjava.net/killme2008/archive/2010/12/11/340361.htmldennisdennissat, 11 dec 2010 11:35:00 gmthttp://www.blogjava.net/killme2008/archive/2010/12/11/340361.htmlhttp://www.blogjava.net/killme2008/comments/340361.htmlhttp://www.blogjava.net/killme2008/archive/2010/12/11/340361.html#feedback2http://www.blogjava.net/killme2008/comments/commentrss/340361.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/340361.html。入手了一台moto xt701,下单后悔来想换里程碑,但是京东打包太快,客服不让换,这个很奇怪,我想用更多钱买东西反而被拒绝,看来京东处理太快也不一定是优点

    买了几本android相关的书,下决心好好学习一下,在读完一本加半本的情况下决定开始做个练习程序,最后的结果就是为乐天气这个小软件。为乐天气不仅仅是个烂大街的天气预报软件,它从google weather api抓取天气状况信息并显示在桌面widget,还提供了两个我个人很需要但还没有在其他天气软件上看到的功能:恶劣天气告警和气温变化告警——当有雨雪天气或者气温变化超过一定幅度的时候主动通知我,这对我这个常常不知道带伞并且家里有小孩的人比较有用。来几张运行在xt701上的截图:






  

    写程序总共花了3天,程序虽小,但基本上覆盖了android提供的一些基本机制:activity显示组件、service负责信息抓取、桌面widget、通过intent在组件之间交互、handler处理界面更新、国际化和资源管理、利用preferences保存配置以及使用application保存全局数据等等。android开发给我的感觉是,入门还是相当容易的,如果熟悉java甚至j2me,那么学习android的入门成本还是很低的,因此从长期来看,做这一行的一般应用门槛不高,也会像现在的java市场一样吸引大量开发者。如果说对独立开发者特别有价值的方向,应该还是游戏方向,做游戏不仅仅是技术,更多还是创意和推广,另外想在android做出效果非常出色的游戏,还需要去学习opengl和数学算法之类,需要熟悉c/c ,本质上跟传统的游戏开发没有太大区别,这个门槛就相对高一些。

   我将这个小程序发到了国内的几个market,从下载情况来看,尽管都非常少,但是91助手的应用汇还是最多,其次是安卓市场,再后面是爱米软件商店,从后台体验上来说,最好的还是eoeandroid社区的优智市场,不过人气貌似不旺。
    从我接触移动开发的这一周来看,我很兴奋,原来现在这个行业已经这么火热,有太多新鲜的东西我没有尝试过,有太多很有创意的小应用小游戏存在,有大量的开发者早就在从事这个激动人心的领域,我太out了,希望现在关注还来得及。


dennis 2010-12-11 19:35
]]>
我的java学习推荐书目http://www.blogjava.net/killme2008/archive/2010/11/11/337788.htmldennisdennisthu, 11 nov 2010 03:13:00 gmthttp://www.blogjava.net/killme2008/archive/2010/11/11/337788.htmlhttp://www.blogjava.net/killme2008/comments/337788.htmlhttp://www.blogjava.net/killme2008/archive/2010/11/11/337788.html#feedback9http://www.blogjava.net/killme2008/comments/commentrss/337788.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/337788.html     一直有这么个想法,列一下我个人认为在学习和使用java过程中可以推荐一读的书籍,给初学者或者想深入的朋友一些建议,帮助成长。推荐的的都是我自己读过,也会推荐一些朋友读过并且口碑不错的书籍。

一、基础类
1、《thinking in java》,入门第一位是建立正确的概念。
2、《core java》,我没系统读过,这本书更贴近实践,更多api的介绍,同样,更新也更频繁。

二、进阶类
1、《effective java》,在熟悉语法、api之后,你需要知道最佳实践和陷阱,没有比这本更好的。
2、《java puzzlers》,通过谜题介绍一些你可能没有注意到的边角料,作为趣味读物也不错
3、《深入java虚拟机》,翻译一般,但不可不读,最好结合最新的jvm规范来读。

三、特定领域
1、网络编程:
(1)
o'reilly的《java nio》,很多人都推荐,我个人觉的一般,基本上只是个api更详细的说明文档,o'reilly的java系列很多都是这样。
(2)我更推荐这本《fundamental networking in java》,由浅入深教你怎么做java网络编程,并且介绍很多背景知识,甚至介绍了各种最佳实践、网络编程模型以及java socket在不同平台之间的差异等等。

2、并发编程:
(1)《java concurrency in practic》,并发领域必读经典。
(2)《java并发编程:设计原则与模式》,同样是doug lea的作品。
(3) 《java threads》,入门读物。

3、web编程,这块我许久未接触了,就不推荐了,有兴趣的朋友可以补充下。

四、模式与设计

1、《设计模式》,gof的经典。
2、《设计模式精解》,应该有最新版,个人认为更适合入门。
3、《head first设计模式》,更轻松的入门读物。
4、《企业应用架构模式》
5、《分析模式——可复用对象模型》
6、《面向模式的软件体系结构》,国内貌似翻译了3卷,绝对经典,可惜翻译较差。
7、《重构——改善既有代码设计》,想写好代码必读。
8、《重构与模式》,给我印象很深的 xml构建的例子,在我的代码里应用到了。

五、方法论
1、《敏捷软件开发》
2、《测试驱动开发》,你不一定要tdd,但是你一定要学会做单元测试。
3、《agile java》,也可以作为java入门读物。
4、《快速软件开发》
5、《面向对象分析与设计》,oo设计必读。
6、《unix编程艺术》,打开你的眼界。

六、java之外
0、《代码大全》,编程的百科全书,必读。
1、《unix网络编程》,学习网络编程必读书。
2、《c 网络编程》上下两卷,介绍ace的,但是其中对各种模式运用的介绍非常值的一读。
3、《joel说软件》,编程文化
4、《人月神话》、《人件》
5、《卓有成效的程序员》,给我很大启发的一本书。
6、《程序员修炼之道》
7、《计算机程序的构造与解释》,必读
8、《算法导论》,可以作为参考书
9、《深入理解计算机系统》
10、《编译原理》龙书,最新版用java解释,我没有读完,顺便提下。






dennis 2010-11-11 11:13
]]>
读某文有感http://www.blogjava.net/killme2008/archive/2010/11/02/336789.htmldennisdennistue, 02 nov 2010 05:25:00 gmthttp://www.blogjava.net/killme2008/archive/2010/11/02/336789.htmlhttp://www.blogjava.net/killme2008/comments/336789.htmlhttp://www.blogjava.net/killme2008/archive/2010/11/02/336789.html#feedback6http://www.blogjava.net/killme2008/comments/commentrss/336789.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/336789.html这篇文章啦,咱也不废话,不遮掩。几点感想:

1、首先,这篇文章很多的“我听说”、“据说“、我和……聊脱,他们都表示很郁闷“、“我就听说过一些……”诸如此类的道听途说,我觉的这不是“工程师”该说的话,请不要用可能,好像,听说这样的字眼,请给我数据,给我地点,给我程序。

2、其次,文中作者提到的yahoo的优秀点,在淘宝我都发现了传承,我估计是学习yahoo中国的,比如发布流程、比如知识库、比如很有特色的技术大学培训、比如鼓励创建自动化工具等等,我不知道作者有没有在阿里集团的子公司待过,或者来淘宝待过,如果来过呆过,我想不会没看见。

3、第三,google是商业公司,百度是商业公司,阿里更是商业公司,没有销售人员的付出,工程师的劳动成果何以体现?你的薪水从哪里来?工程师文化或者销售文化,这不重要的,重要的是你能否认同,能否感受到尊重,不能可以用脚投票。

4、个人感觉,阿里是非常富有理想主义的公司,点滴改变着我们的生活,不知不觉,淘宝、支付宝已经改变了很多人的生活。在我看来,这些都是很伟大的创造,伟大的“技术”,创造的社会效益显而易见。

5、脱离商业的技术不存在,计算炮弹轨迹的需求诞生了计算机,美国国防部催生了互联网,网络购物的需要诞生了淘宝,在不健全的信用社会网络交易的需要诞生了支付宝。

6、关于个人崇拜,你是成年人,你有自己的价值观,你有自己的世界观,如果你那么容易被人忽悠,那也是活该。

7、如果哪天公司免费发淘公仔,我也去抢啊,哦,抢过一回口碑卡。

8、以偏概全,会掩盖了很多人的努力工作。
 





dennis 2010-11-02 13:25
]]>
bambook使用感受http://www.blogjava.net/killme2008/archive/2010/08/15/328882.htmldennisdennissun, 15 aug 2010 04:56:00 gmthttp://www.blogjava.net/killme2008/archive/2010/08/15/328882.htmlhttp://www.blogjava.net/killme2008/comments/328882.htmlhttp://www.blogjava.net/killme2008/archive/2010/08/15/328882.html#feedback3http://www.blogjava.net/killme2008/comments/commentrss/328882.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/328882.html     接下来是漫长的等待,本以为上海到杭州最多两天,没想到查看订单状态一直停留在配货状态,这让习惯了京东神速的我很着急,不过看起来盛大文学还是一直在改进这个订单系统,后来将宅急送的订单查询也融合到订单里面,用户可以查看自己的东西当前在哪里。3天后终于收到货,中间发生了一个小插曲,我发现订单状态变成了完成,显示我已经签收,而我实际上没有收到快递公司的电话,更何况签收?打电话给客服,客服叫我别着急,他们先查查。后来才知道公司是统一代收快递,小邮局代收了,给我发了邮件才知道。盛大的客服还是很负责任的,后来打电话向我确认情况才知道是虚惊一场,实在不好意思。物流这块,我觉的盛大这次内测做的并不好,看看bambook官方论坛那么多抱怨就知道,发货太慢,并且客服的反馈都是复制粘帖,一律说什么产品销售火爆,发货快不起来的鬼话。这是内测呀,才发多少台,只能说前期准备不是特别充分。

    先看照片,我儿子很喜欢bambook







     外观我觉的还是很漂亮,我没有用过其他的电子书产品,bambook给我的感觉还不错,屏幕是6寸的电子墨水屏,还有一些快捷键方便翻页、查看书架等,还有一个摇杆作为确认键,也可以翻页以及调整选项等。背面是奥运火炬的祥云图案,这些网上已经有很多评测照片了,我就不多说了。从硬件上,bambook还是很让我满意的。不过没有提供阅读灯挺让人遗憾,不知道会不会作为配件提供,thinkpad的键盘灯是非常棒的设计,如果能有阅读灯,那就可以不打扰家人读书了。

    这是我第一次接触电子墨水屏,曹老大跟我说会有残影的问题,入手后发现果然有这个现象,但是不细看还是很难看出来,对阅读没有任何影响。相反,这种屏幕对读书还是极好,在阳光下也可以正常阅读,并且只有在有变化的时候费电,非常省电,我拿到手连续看了两天小说,电池显示还至少一格电。通过云梯——bambook提供的客户端软件,可以修改字体,修改成微软雅黑,终于不用捧着个笔记本在床上看书。

    bambook至少提供了3种上网方式:usb连接pc代理上网、wifi以及3g网络。目前3g卡还不行,usb我没测试。公司和家里都是无线网络,在公司可以正常连接,但是在家里却不行。后来发现这是因为bambook无法输入sid,而我家的sid广播是禁止掉的,为了让bambook能联网,只好修改路由器配置了。这一点不是很好,对家庭用户来说,通常还是会禁止sid广播。bambook上网只能连接盛大的云中书城,包括起点、榕树下等盛大文学下面的网站。这些网站大多数是一些网络文学作品,我尝试搜索一些文史类的读物都没有找到。网络小说我还是会读,比如最近又重新看《庆余年》(bamboook里这本书是免费的),但是买bambook可不仅仅是为了读网络小说。还是希望云中书城能多一些其他方面的书籍,不过内容建设是个长期的过程,倒是不着急,毕竟还在内测阶段。

   bambook允许传入自有书籍,但是需要转换成它的内部测试,利用云梯这个客户端软件。云梯目前只支持windows,我的机器是ubuntu,不过尝试了下在virtualbox虚拟机上的xp里也可以正常使用。我尝试转换了txt和pdf文件,都可以正常转换,比较离奇的是txt转换后的文件还更大。pdf这是重点,我还是想在bambook上阅读一些技术文档,这些文档大多数是pdf格式。遗憾的是bambook对pdf转换的支持并不完善,章节索引没了不说,转换后的格式在6寸屏幕上的排版很糟糕,诸如图表、代码之类的跟原文档比起来很不适合阅读。事实上,我是很不理解为什么要自定义格式,如果说是为了保护商业凯发k8网页登录的版权,但是你又允许上传自由书籍,自由书籍还需要经过这么一个转换步骤,还不如原生支持一些常见格式。bambook的os是基于anroid开发的,我相信原生支持pdf这样的常见格式肯定不是特别大的问题。pdf文档这个问题在凯发k8网页登录官网上也有很多讨论,从客服的反馈来看是有计划改进,拭目以待吧。

   接下来说说我认为bambook软件上可以改进的一些小地方,首先是刚才提到的网络连接问题,允许用户输入隐藏的sid。网络在不用一段时间后会自动断开,这个时间我估计了下是10-15分钟左右,但是没有找到可以这个时间的地方,这个选项还是应当开放给用户来选择。字体上我也希望能自定义字体,目前是预先定义了几个大类,你只能在这几个大类里选,我还是希望能输入数值自定义字体大小,好像字体的设置还有个bug,设置的字体不会保存,在下次继续阅读的时候还需要重新设置。另外,就是那些提示框比较傻,非要我点下确认才消失,提示框应当在几秒内自动消失,这对用户体验更好。书架也应当允许分类,现在是一股脑堆在一起,几本书还好,多了就比较麻烦了。书架的更新和内容的更新应当分离,有时候我只是想更新下书架,并不想更新内容。
   硬件上我希望尽快出个套套,这东西白的稀里哗啦,很容易弄脏和摔坏,有个套套比较好,最好套套上能再带个阅读灯那就更好了。充电方式也应当再多样化一点,目前只能连到pc充电,并且是无论如何都要会自动充电,应当让用户决定连接的时候是否充电才对。云梯在格式转换上还要下更大功夫才行,当然,我更希望是直接原生支持pdf了,不过从一个盛大的朋友那了解到这是比较困难的。

   总之,内测998这个价,bambook还是物有所值的,硬件上很好,软件上问题不少,内容建设上还有很多要做的事情,例如我希望以后每天早上能直接用bambook看当天的报纸,哪怕是要钱订阅的。在淘宝上查了下,bambook内测这个版本转手也能卖到1200甚至更多,还是挺抢手的。庆幸的是bambook可以刷固件,等哪天升级的时候,希望这些软件上的小问题能有个比较好的凯发天生赢家一触即发官网的解决方案。

   



dennis 2010-08-15 12:56
]]>
面试别人的感想http://www.blogjava.net/killme2008/archive/2010/07/25/326687.htmldennisdennissun, 25 jul 2010 15:00:00 gmthttp://www.blogjava.net/killme2008/archive/2010/07/25/326687.htmlhttp://www.blogjava.net/killme2008/comments/326687.htmlhttp://www.blogjava.net/killme2008/archive/2010/07/25/326687.html#feedback0http://www.blogjava.net/killme2008/comments/commentrss/326687.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/326687.html
    今年我被分配了不少参与面试应聘者的任务,大多数是做电话面试,偶尔做f2f的面试。这是我第一次这么频繁地面试别人,过去我都是被别人面试。主要想谈谈一些感想,从面试官的角度给面试者一些建议。因为做面试官的经验就这么多,我大概地讲,有兴趣的大概地看。

    面试者需要首先知道自己是想应聘什么职位,很多人的简历到我这里来,都不知道自己是面试什么职位,那么聊的时候就经常对不上号,原来你不是我们想要那种人,我不是去应聘你这个职位。我想在投简历的时候需要明确下自己想来这家公司做什么,这样可以更明确一些,节省大家时间。并且面试者准备起来也能更充分一些。

    做电话面试的时候,我比较怕那种声音很小的朋友,听起来费劲,我问起来费劲。我提问的方式,一般是喜欢穷追到底,根据对方的描述即兴发问,一方面查看知识掌握得牢固不牢固,一方面查看反应能力怎么样。如果你声音很小,我发问的频率降低了,我对面试者的评价也自然降低了。

    另外,做电话面试,面试者最好能在接电话的时候找个安静的地方,背景的嘈杂也会影响面试的效果,有时候不得不我去提醒对方找一个安静一些地方。您老做其他公司的电话面试,还是别当着同事老板的面嘛。

    公司还有做视频面试,视频面试的时候一般是通过旺旺,做语音聊天,这时候面试者还是需要注意下个人的举止。面对面的时候,大家会小心注意一些,但是做视频面试的时候,由于你面对只是一个摄像头,没有那么紧张,一些举止可能不恰当。有一次我视频面试一个同学,面试聊着聊着,他都将脚抬到桌子上,对着摄像头了,尽管我并不介意,但是遇上其他面试官就不一定那么好说话了。这位同学最后没过,不过不是我这关刷下的了。

    我看简历的时候,一般都是先看项目经历,基本上你做过什么项目,大体能告诉我你擅长的技术方向,接下来看个人简介,与你的项目经历是否符合,如果你描述了你擅长什么,精通什么,那么后续的面试我就问这些东西。当然,如果你的技术方向跟我们的要求完全不吻合,那我可能只是打个电话走过场。
    简历上能让人眼前一亮的地方包括:除了java之外,你还会python、ruby甚至scheme之类的其他语言;你参与了某些开源项目;你对某个领域的技术特别擅长,并且做过这方面的学习研究;你做过性能优化,系统调优之类的功能;你描述了对某个系统做出的一些优化或者改进;你有自己的技术博客;你读过某些开源项目的源码;你指导过别人的工作……
    简历上让人疲倦的地方:一堆同类项目的罗列,没有鲜明的描述,没有说明你在项目里做了什么;只有项目罗列,没有个人描述;只有结果,没有过程;只有一堆名词,没有特别擅长的亮点。

    这大半年来,也面试了不少牛人,但是最后能进来的却是寥寥无几,我觉的特别牛的,可能老大们觉的某个方面不合适,也可能待遇上谈不拢,最终都来不了,很可惜。我也提议过改进面试的方式,不仅仅是聊天式的面试,最好能增加一个上机面试,给一道很简单的题目,你做出来看看,不仅仅看程序写的对不对,更多看看你写的代码是否符合工程规范,是否有单元测试,变量命名是否合理,在思路上有没有亮点等等。我总觉的简单地通过面谈来考察一个人是很难靠谱的,程序员还是要以代码说话。后来也写了个上机面试的提纲,不过最终这件事情也是不了了之。

   另外,面试通过其实应该是万里长征的第一步,公司在招进一个人之后,基本上是不管不问了,这也可以理解,毕竟都是成年人了;但是对于外地来的员工,很多都是独身一人就跑到杭州来的,情感上适应是第一步,还有找房子、熟悉周边环境等等琐事。既然在前期招聘已经花了很大力气,如果可以在员工入职后稍微关心下新入员工的状况,这是特别划算的买卖。入职刚转正的员工马上走人,这对公司的损失更大。



dennis 2010-07-25 23:00
]]>
工作随笔——2010-07-24http://www.blogjava.net/killme2008/archive/2010/07/24/327027.htmldennisdennissat, 24 jul 2010 12:51:00 gmthttp://www.blogjava.net/killme2008/archive/2010/07/24/327027.htmlhttp://www.blogjava.net/killme2008/comments/327027.htmlhttp://www.blogjava.net/killme2008/archive/2010/07/24/327027.html#feedback1http://www.blogjava.net/killme2008/comments/commentrss/327027.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/327027.html     转眼间快到8月,已经过去了两个季度,是时候稍微总结下干了什么,以后想干什么。从春节到现在,我仍然是做淘宝的消息中间件notify的开发,中间额外去做了一个多月的另一个项目的开发,重拾了web开发的一些东西。
   
    这半年来notify的改进集中在通讯层的改造,引入amqp的订阅模型,以及将重要消息从oracle迁移到mysql做ha方案,这一过程是一个慢慢稳定系统的过程。新版本刚出来的时候有不少bug,有些bug很严重,幸运的是没有造成严重的后果,再一次提醒我小心,小心,再小心;小心是一方面,工作有没有做到位是另一个方面,暴露出来的问题还是单元测试不全面,以及麻痹大意心态下的不警惕,对关键代码认识不清,code review也没有做到位等等。

    notify做到现在,剩下的问题是一些很难解决,又非常关键性的问题,如消息的去重,消息的顺序性,以及消息的可靠存储。我说的这些问题都是在分布式集群环境下需要解决的问题,如果仅仅是单台服务器,这些问题的解决还算不上特别困难。消息的去重,基本的思路是在客户端和服务器之间各自维持一个状态,用于保存当前消息的处理情况,依据这个情况来做消息的去重,但是状态的保存对服务器和客户端来说都是一个额外的负担,并且很难做到可靠的存储,如果状态丢了,去重的目的就没办法做到。activemq里是在服务器和客户端都维持了一个bitmap做重复的检测,但是这个bitmap大小必然是受限的,并且无法持久保存的。消息的在集群环境下的顺序性,涉及到集群环境下的事件的时间顺序问题,除了使用分布式锁来保证一致性之外,暂时也没有好的思路去解决。消息的可靠存储,今年我们的目标至少是脱离oracle,目前实现的ha mysql双写的实现已经开始部署到交易这样的核心系统上,第三个季度将慢慢地全部切换过去。下一步的目标是将消息存储到key-value系统上,但是需要解决的是索引的问题,因为消息的恢复涉及到查询,并且需要根据一些特殊条件做查询以应付诸如尽快恢复重要消息这样的功能,因此目前的一些key-value系统要么在索引功能上太弱,要么在集群功能上太弱,要么在大数据量存储上有局限,因此不是特别切合我们的场景,因此一个可行的方案是将消息的header继续存储在关系数据库,方便做查询,而将数据较大的body存储在key-value上,减轻数据库的负担。今年,我们还是希望能在以上3个方向某个方向做出突破。

   这半年来技术上的收获,第一个季度业余时间都去打游戏了,没方什么心思在学习和工作上,后来去学习了下asm,总算对java的byte code,以及jvm执行byte code过程有了个理解,然后利用asm去搞了aviator这个项目。接下来开始做服务器的seda改造,这个过程完成了部分,但是不满意,seda的模型过于理论化,模型是好的,但是在stage controller的实现上目前没有可供参考的经验,做到资源的自动控制更需要实际的测试和实践,基本的指导原则只能作为参考。另外,最近下决心去重构整个项目,从一个一个类看起,看到不爽的地方马上去做重构,这个过程,我又去重看了下《重构》中的原则,在谈论诸如分布式、海量数据存储、云计算这样的大词之前,我需要的做的仍然是将代码写好,写的漂亮。也许是时候回到本源,再去重读下《设计模式》,重读下《重构》,既然我还在写java代码,那还是希望写的更好点。
   另外,我现在喜欢上了clojure语言,并且正儿八经地找了本书好好学习,从源码和bytecode入手去理解它的实现。我为什么喜欢clojure?
   首先,它是lisp的方言之一,lisp的优点它全有,lisp的缺点它能想办法避免。clojure也有宏,也有quote,也有将procedure as data的能力,clojure的数据结构都是immutable,此外还是persistence,避免了immutable数据大量拷贝带来的开销。clojure的数据结构还天生是lazy的,表达能力上一个台阶。clojure在语法上更多变化,某些程度上降低了括号的使用频率,这一点有利有弊。clojure的内在原则是一致的,核心语法非常简单,它没有多种范式可供选择,因此没有scala那样复杂的类型系统,没有为了包容java程序员引入的oo模型(有替代品),使用clojure最好的方式是函数式地,但是它的扩展能力允许你去尝试各种范式。

   其次,clojure对并发的支持更符合一般程序员的理解,它只是将锁替换成了事务,利用stm去保存可变状态,但是却避免锁带来的缺点——死锁、活锁、竞争条件。它没有引入新的模型,这对习惯于用锁编程的同学来说,stm没有很大差异,你可以将它理解成内存型数据库。

   第三,最重要的一点,clojure是实现于jvm之上的,java上的任何东西它都能直接利用,并且利用type hint之类的手段可以做到性能上没有损失。尽管java语言有千般不是,但是寄生于整个平台之上的开源生态系统是任何其他社区都很难比拟的,放弃java平台这个宝库,暂时还做不到。过去学习scheme,学习common lisp,更多的目的是开阔眼界,现在能实际地使用,还能有比这更幸福的事情吗?

   下半年技术上想学习什么呢?除了clojure之外,我想去看下haskell,了解下什么是mond,除此之外,就是收收心将《算法导论》读完吧。另外,收起对awk和shell编程的偏见,好好熟悉下这两个工具,dirty and quickly的干活有时候还是很重要的。

    我还是个典型的码农,喜欢写代码,喜欢尝试新东西,至少热情和好奇心还残存一些,那么就继续当好码农吧。
 


dennis 2010-07-24 20:51
]]>
我的西大学历证书http://www.blogjava.net/killme2008/archive/2010/07/20/326594.htmldennisdennistue, 20 jul 2010 01:12:00 gmthttp://www.blogjava.net/killme2008/archive/2010/07/20/326594.htmlhttp://www.blogjava.net/killme2008/comments/326594.htmlhttp://www.blogjava.net/killme2008/archive/2010/07/20/326594.html#feedback0http://www.blogjava.net/killme2008/comments/commentrss/326594.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/326594.html     本人的西大学历证书,如果你也想要一本,请到 自动生成。







dennis 2010-07-20 09:12
]]>
告别圣托尔多http://www.blogjava.net/killme2008/archive/2010/07/10/325688.htmldennisdennisfri, 09 jul 2010 16:10:00 gmthttp://www.blogjava.net/killme2008/archive/2010/07/10/325688.htmlhttp://www.blogjava.net/killme2008/comments/325688.htmlhttp://www.blogjava.net/killme2008/archive/2010/07/10/325688.html#feedback0http://www.blogjava.net/killme2008/comments/commentrss/325688.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/325688.html 托尔多正式宣布退役了,下个赛季他将会留在国际米兰做青训方面的工作,他在2000年欧洲杯上的经典表现将永载史册。他为国际米兰效力了十年,这也是我看国米比赛的十年。





dennis 2010-07-10 00:10
]]>
阿根廷回家了http://www.blogjava.net/killme2008/archive/2010/07/04/325177.htmldennisdennissat, 03 jul 2010 16:08:00 gmthttp://www.blogjava.net/killme2008/archive/2010/07/04/325177.htmlhttp://www.blogjava.net/killme2008/comments/325177.htmlhttp://www.blogjava.net/killme2008/archive/2010/07/04/325177.html#feedback0http://www.blogjava.net/killme2008/comments/commentrss/325177.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/325177.html    布尔迪索、德米凯利斯这样的著名漏勺,还有古铁雷斯这样的牛b后卫,想进决赛完全在做梦。
   什么艺术足球,什么功利足球,看看德国队的配合,脸红不?
   只会在弱队身上刷数据到伊瓜因,给米利托擦鞋都不配。
   梅球王被吹捧得太多了,相对于真小人的c罗,小动作、下阴招的梅球王终于带着0进球到记录回家了。88,阿根廷,世界清净了。当然,马上有一帮恶心阿迷矫情地唱着“阿根廷别为我哭泣”为他们的“潘帕斯雄鹰”招魂呢。


  



dennis 2010-07-04 00:08
]]>
缓存的分代http://www.blogjava.net/killme2008/archive/2010/06/05/322822.htmldennisdennissat, 05 jun 2010 02:13:00 gmthttp://www.blogjava.net/killme2008/archive/2010/06/05/322822.htmlhttp://www.blogjava.net/killme2008/comments/322822.htmlhttp://www.blogjava.net/killme2008/archive/2010/06/05/322822.html#feedback5http://www.blogjava.net/killme2008/comments/commentrss/322822.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/322822.html     类似分代的思想在很多地方可以用到,分代的本质是根据对象生命周期的不同做区别处理,而不是采取一刀切的方式来提高系统的处理效率。推而广之,比如缓存的使用,现在很多web应用都采用了类似memcached这样的缓存挡在数据库前面分担负载,那么你可以将memcached理解成new代,而数据库是old代。memcached中存储的是查询的热点数据,新鲜火热,但是易失,并且在数据更新的时候被移除;而数据库保存了所有的数据,当缓存没有命中的时候才去查询数据库并存储到缓存。new和old这只是简单的二代划分,事实上现在越来越多的系统是多级缓存,页面缓存、memcached缓存、jvm内部缓存、查询缓存等等直到数据库,从web页面到后端是一个越来越old的过程,缓存对象持续的生命周期逐渐增长直到persist状态。
    具体到jvm内部缓存,我们通常使用lru算法来实现一个安全有限的缓存,如直接继承linkedhashmap将可以实现一个简单的lrumap。基于内存使用上的考虑,我们会给lrumap设定一个最大的capacity,当数据量超过这个capacity的时候将最近最少访问的元素移除来容纳新的元素。这样处理产生的问题是这个capactity不能设置得太大,因为怕内存不够用,但是不够大的结果可能是命中率没有那么高(跟你的场景相关),那么如何在保存内存安全的前提下更进一步缓存更多的对象呢?答案也是分代。lrumap默认存储的都是对象的强引用,我们知道java还有其他3种引用类:soft,weak和phantom。其中soft引用是在jvm内存不够的时候进行回收,weak引用是在垃圾回收碰到的时候会被回收,显然weak->soft->strong三类引用的生命周期可以划分为3个代,我们将可以实现一个可以容纳更多对象的lrumap:lrumap设置两个阀值,一个是强引用的最大阀值,这个不能太大,一个是软引用的最大数目,当超过第一个阀值的时候,不是将lru替换出来的对象移除,而是替代转换为软引用存储;如果软引用的数目也超过阀值,那么可以将软引用这个map里的对象lru替换成weak引用存储或者简单移除。处理元素查询的时候,多了一个步骤,在查询强引用未果的情况下,需要再去查询软引用集合,不过都是o(1)复杂度的查询,不会成为明显的瓶颈。通过将缓存对象分代,我们实现了容难更多缓存对象的目标,大部分对象以强引用的形式存储,被lru替换出去最近最少访问的元素以软引用存储,它们在内存不够的时候被垃圾回收,保证了内存使用上的安全性。我们在系统中采用了类似这样的缓存,缓存的命中率有了明显的提高。
    题目是《缓存的分代》,其实谈的是分代这种常见的设计或者说技巧,在需要处理大量对象的场景中,不采用一刀切的方式,而是根据对象的特点进行适当的分代处理,带来的效率提升可能是惊人的。

    ps.关于这个罗嗦两句,我是这个小组的成员,有人质疑我的目的是为了赚推荐费,这个不能说没有,不过主要目的还是招人,我们很缺人。那么多要求可以归结为一句话:我们找java基础良好、对并发通信有丰富实践经验、写代码相对靠谱、为人相对靠谱的人。那些要求并非硬性,如果你觉的合适,尽管投简历,谢谢。我们小组做的东西我认为还是有价值的,也很有挑战,淘宝内部的很多应用都在使用,如果你希望你做的产品被成千上万的人每天使用,欢迎加入。

     

   



dennis 2010-06-05 10:13
]]>
最近写的一些bughttp://www.blogjava.net/killme2008/archive/2010/06/05/322813.htmldennisdennisfri, 04 jun 2010 17:06:00 gmthttp://www.blogjava.net/killme2008/archive/2010/06/05/322813.htmlhttp://www.blogjava.net/killme2008/comments/322813.htmlhttp://www.blogjava.net/killme2008/archive/2010/06/05/322813.html#feedback0http://www.blogjava.net/killme2008/comments/commentrss/322813.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/322813.html     毫不惭愧地说,我也是今年才开始有意识地去做回顾bug这件事情,今天回顾下最近写出来的这几个bug:三个是麻痹大意导致的,一个是switch语句竟然没写break,一个是并发bug,一个是考虑问题不全面导致的问题。这里主要还是想讲那三个麻痹大意写出来的bug,都是在急匆匆修改问题的情况下写出来的,本意是为了解决原有的bug,在自以为很有信心地情况下匆忙地修改代码,没有认真做review,没有添加单元测试,在解决问题的同时引入了新的问题。
    这些愚蠢的bug修正起来非常简单,但是为什么那个时候却没有发现呢?我自省下,还是盲目自信导致的,因为快速地修复bug似乎很能给人一种虚假的快感:瞧,这个问题我修正起来很快,我是代码快枪手,哦耶~,修复也还罢了,如果能再补充下测试,也许这些问题就能避免,但是我却又一次自信过了头。我在想,如果下次还遇到这种需要快速修改问题的时候我该怎么做,我该先深呼吸下,停一停,先想想怎么改再动手,想想风险点,改完之后至少review三遍,并且一定要添加这些情况的测试。尽管我相信以后我还会写下一些愚蠢的bug,但是希望能让自己少后悔一点点。



dennis 2010-06-05 01:06
]]>
淘宝分布式产品组诚聘java工程师(此招聘长期有效)http://www.blogjava.net/killme2008/archive/2010/06/03/322630.htmldennisdennisthu, 03 jun 2010 08:05:00 gmthttp://www.blogjava.net/killme2008/archive/2010/06/03/322630.htmlhttp://www.blogjava.net/killme2008/comments/322630.htmlhttp://www.blogjava.net/killme2008/archive/2010/06/03/322630.html#feedback27http://www.blogjava.net/killme2008/comments/commentrss/322630.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/322630.html联系邮箱: boyan@taobao.com
简历格式: 最好是纯文本格式

淘宝分布式产品组诚聘java工程师,有兴趣的请联系,谢谢,此招聘长期有效。具体职位和要求如下:

消息中间件资深java工程师
工作地点:杭州
职位描述:
负责消息中间件的设计、开发等工作

职位要求:
1、扎实的java开发基础知识
2、java多线程、并发以及网络通信有深厚的经验
3、熟悉大规模分布式系统架构,熟悉分布式存储系统
4、热爱技术,对技术有不懈的追求。
5、熟悉消息中间件,并了解消息中间件原理的优先考虑

分布式数据层资深java工程师
工作地点:杭州
职位描述:
负责分布式数据层的设计、开发等工作

职位要求:
1、扎实的java开发基础知识
2、java多线程、并发以及网络通信有深厚的经验
3、对jdbc,jpa,jta有深厚的理解
4、熟悉常见的分布式存储凯发天生赢家一触即发官网的解决方案
5、热爱技术,对技术有不懈的追求
6、熟悉数据层的原理和应用
7、熟悉关系数据库模型、有分布式事务相关经验优先

java框架和工具开发工程师
工作地点:杭州
职位描述:
1、 设计、开发、改进基于java的工具和框架。
2、 指导开发团队使用工具和框架,解决疑难问题。

职位要求:
1、 熟悉并自如运用java语言及jdk类库,具备良好的编程习惯。
2、 熟悉多种java开源项目,精通目前主流的java开源项目的使用方法和设计理念。有独到见解者更佳。
3、 熟悉oop理念及常见设计模式。
4、 熟悉eclipse开发平台,了解eclipse plugin的开发。
5、 视野广阔,了解业内发展动态。
6、 喜爱专研,精益求精,有较强的学习能力。
7、 善于交流,乐于分享。
8、 具备英文阅读能力和书写能力。

应用管理工具开发工程师
工作地点:杭州
职位描述:
1、承担应用、系统管理工具及其他相关的工具、应用的开发
2、大规模应用管理相关技术的预研工作

职位要求:
1、两年及以上开发java或php开发经验
2、对技术充满兴趣,有扎实的编程基础
3、对经历过的产品、项目有深入的理解,而不仅停留在开发



联系邮箱: boyan@taobao.com
简历格式: 最好是纯文本格式

附注: 如果管理员觉的放在凯发k8网页登录首页不合适,请拿下,不好意思,招人不容易啊。


dennis 2010-06-03 16:05
]]>
爸爸和儿子的对话http://www.blogjava.net/killme2008/archive/2010/06/01/322429.htmldennisdennistue, 01 jun 2010 03:18:00 gmthttp://www.blogjava.net/killme2008/archive/2010/06/01/322429.htmlhttp://www.blogjava.net/killme2008/comments/322429.htmlhttp://www.blogjava.net/killme2008/archive/2010/06/01/322429.html#feedback0http://www.blogjava.net/killme2008/comments/commentrss/322429.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/322429.html
爸爸:你今天乖不乖?
儿子:啊
爸爸:有没有想爸爸?
儿子:啊
爸爸:吃饭了没?
儿子:哦
爸爸:有没有吃饱啊?
儿子:呃
……
     今天是儿童节,昨天晚上带小家伙去买玩具,儿子很替老爸省钱,自己只挑了气球。最后还是老爸老妈狠狠心给他买了画板和音乐小屋子,庆幸的是儿子很喜欢,一个晚上在那边“打电话”。儿子,节日快乐,希望你健康成长,快乐每一天。






dennis 2010-06-01 11:18
]]>
冠了http://www.blogjava.net/killme2008/archive/2010/05/23/321647.htmldennisdennissat, 22 may 2010 21:53:00 gmthttp://www.blogjava.net/killme2008/archive/2010/05/23/321647.htmlhttp://www.blogjava.net/killme2008/comments/321647.htmlhttp://www.blogjava.net/killme2008/archive/2010/05/23/321647.html#feedback0http://www.blogjava.net/killme2008/comments/commentrss/321647.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/321647.html







dennis 2010-05-23 05:53
]]>
代码自我审查的一些体会http://www.blogjava.net/killme2008/archive/2010/05/18/321219.htmldennisdennismon, 17 may 2010 16:28:00 gmthttp://www.blogjava.net/killme2008/archive/2010/05/18/321219.htmlhttp://www.blogjava.net/killme2008/comments/321219.htmlhttp://www.blogjava.net/killme2008/archive/2010/05/18/321219.html#feedback4http://www.blogjava.net/killme2008/comments/commentrss/321219.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/321219.html 1、首先态度需要端正,做代码的自我审查并不是否定自己,而是给自己将工作做得更好的一次机会。在审查过程中要尽量将自己作为一个旁观者的心态去审查自己的代码,尽管这比较困难。

2、代码审查离不开重构,在审查过程中发现任何坏味道都请使用重构去改善,发现缺乏测试的地方要及时补充测试,不要让bug遗漏。

3、代码的自我审查可能不是越早越好,隔一段时间之后回去看自己写的东西,对一些设计上的选择能有更客观的评价,在审查的过程中可能需要重新去理解代码,在此过程中可以检查自己代码的可读性,并思考如何改善可读性,切记代码首先是给人读的

4、审查过程中需要记录下一些犯下的错误,以及当时为什么会犯下这样的错误,建立自己的bug数据库,并时常review,在以后的工作中避免同样的错误。

5、代码的自我审查应该是一个持续性的过程,而非特定时间的特定行动,时常审查自己的代码,不仅能辨析自己的得失,还能够进一步提高自己在未来工作中的设计能力和预见能力。

6、代码的自我审查跟团队成员之间的相互review并不矛盾,在相互review之前做一个自我审查,有助于提高review的效率,包括可读性的提高和一些一般错误的避免。

7、代码自我审查的一些常见注意点:
(0)自认为绝不会出错,并且从来没有审查过的代码。
(1)注意else语句,if条件下的子语句通常可能是个正常的流程,而else意味着异常的情况或者特殊的场景,你可能特别注意怎么处理正常的情况,却忽略了else子句的实现细节,如该释放的锁没释放,该递减的计数没有递减,该赋予特殊值却没有赋予等等。
(2)注意空的方法,没有方法体的方法,是不需要实现?还是忘了实现?
(3)注意switch语句,有没有忘了break?这种错误通过findbugs之类的静态代码检查工具都能避免。
(4)注意大块的注释,为什么这么多注释?是代码写的很糟糕?还是遗留的注释?遗留的注释会误导人,要及时删除。
(5)注意一些看起来“不合常理”的代码,这样的代码很多都是基于所谓性能考虑而优化过的代码,这样的优化是否还需要?是否能去除这些“奇怪”的代码也能实现正常的需求?
(6)对客户端的使用有假设的代码,假设用户只会这么用,假设用户只会用到返回对象中的某些属性,其他属性一定不会用到?不要对客户代码做假设!这个客户代码包括外部用户和调用这个模块的内部代码。
(7)标注了fixme、todo之类task标签的代码,是否忘了修复bug,实现功能?
(8)任何超过15行以上的方法,这些方法是否能拆分成更细粒度的方法,并保持在同一个抽象层次上?
(9)任何在代码中出现的常量值,是否应该提取出来成为单独的常量,常量的默认值设置是否合理?
(10) 任何持有容器的代码,提供了放入容器的方法,是否提供了从容器中移除对象的方法?确保没有内存泄漏的隐患。
(11)重构中提到的其他坏味道,别放过它们,但是也不要追求完美,oo不是圣杯,如果能简单的实现一个算法,你不要引入3个对象和4个接口。
(12)在review最后能列出一张清单,开列下该项目面临的风险点,并提出解决办法,然后按照这张清单去review关键代码,着重检查异常情况下的处理。风险点的review,我建议可以放在后面,在一般性错误解决之后进行,此时你对代码也将再度变的熟悉。


dennis 2010-05-18 00:28
]]>
欧冠半决赛的一张销魂图片http://www.blogjava.net/killme2008/archive/2010/04/29/319719.htmldennisdennisthu, 29 apr 2010 10:54:00 gmthttp://www.blogjava.net/killme2008/archive/2010/04/29/319719.htmlhttp://www.blogjava.net/killme2008/comments/319719.htmlhttp://www.blogjava.net/killme2008/archive/2010/04/29/319719.html#feedback1http://www.blogjava.net/killme2008/comments/commentrss/319719.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/319719.html



dennis 2010-04-29 18:54
]]>
妈妈,我不想走http://www.blogjava.net/killme2008/archive/2010/03/24/316398.htmldennisdenniswed, 24 mar 2010 01:48:00 gmthttp://www.blogjava.net/killme2008/archive/2010/03/24/316398.htmlhttp://www.blogjava.net/killme2008/comments/316398.htmlhttp://www.blogjava.net/killme2008/archive/2010/03/24/316398.html#feedback0http://www.blogjava.net/killme2008/comments/commentrss/316398.htmlhttp://www.blogjava.net/killme2008/services/trackbacks/316398.html ——纪念不幸逝去的孩子们!
妈妈
你为什么在哭泣
今天不是我的生日
为什么在我身旁点燃红烛
没有歌声
也没有小朋友
只有你的泪水
在不停地淌流
妈妈,拽紧我的手
我不想走
妈妈
你为什么在哭泣
今天我又惹你生气
是我没完成作业
还是我偷偷在玩游戏
你打我吧
你骂我吧
千万不要把我抛弃
妈妈,拽紧我的手
我不想走
妈妈
你为什么哭泣
是老天不公
还是你的爱没将我留住
天堂没有阳光
也没有鸟语花香
我不去那边当天使
今生只想做你的心头肉
妈妈,拽紧我的手
我不想走

来自网易网友评论,新闻链接《》




dennis 2010-03-24 09:48
]]>
网站地图