Archive for the ‘技术’ Category
写在Code Review之后
一期项目接近尾声,后半周一直奉命组织代码评审。作为平台部成员,一直很庆幸自己不用太过于考虑繁琐的业务,可以尽量专注在平台功能的开发优化和支持。这样项目开发过程中所需要的各种琐碎杂事也就理所当然落到我们头上,比如Code Review、发布脚本、上线方案等等。这其实倒也挺好,从本位中暂时脱离出来,去做一些编码之外的事情,既可以拓展自己知识面,又可以从多种维度去了解项目,加深对系统各个方面的理解。
道理总是在有了经历之后,才会有真切的体会。之前只作为局外人参与过一次评审会,而且当时会上气氛并不算太热烈。这次吸取前人“失败”的教训,流程上略微作些变动,结果也比之前稍微理想点。大概有以下三点,略作记录:
1)提前四天把评审要求和代码发给所有成员。不只是让经验丰富的老员工作评审,也给新人作评。可以调动新人参与的积极性,为四天后的正式讨论会活跃气氛作基础。就跟在学校上课一样,课前预习总是更易于保证课程质量;参与的人越多,才越容易有思考的碰撞。
2)会上让所有人轮流发言,有问题集体讨论。之前的评审会,只有主席一个人在从头讲到尾,其他人过于被动导致现场气氛不够热烈。同时这个发言方式也从另一方面督促大家在之前认真做好自己的评审工作,不然会上没什么讲的可就尴尬了。
3)拉头头作阵。一方面可以保证评审会秩序,另一方面会上遇到一些比较纠结的问题,也可以由他给予较为合理的解释,类似于专家评委。
这次评审会应该还算是比较充实丰满的,至少会上气氛还比较活跃,荣誉归于现场压阵的头头。之前参与的项目,因为各种原因,貌似都没有做过代码评审。这次经历,感觉很好,总结下我想到的几个优点:
1.保证代码质量。
这点是从项目本身来讲的,不用多说了,代码评审会检查出一些隐藏的BUG。而高质量的代码是工程牢靠健壮的基础。
2.讲述自己的处理逻辑,整理思维。
“当初写下这段代码的时候,只有我和上帝知道为什么这么写。现在,只有上帝才知道了。”
—来自某同事的MSN签名。
09年8月份左右,我在河南CRM现场开发了几个业务新需求。今年上半年再回去参与另一个项目时,当时交接的同事拿着当初我的代码找到我,问为什么这样写。我一脸茫然,无言以对…我想很多Coder应该都遇到过这样的尴尬吧。评审过程中,一些比较复杂的逻辑处理会被揪出来,这时你可以好好整理下自己的思维,想想自己当初为什么这么做,顺便练习下怎么说服那些评委了,讨论过程中也许还有会更好的解决方案出来,也是一个提高的过程。
3.评审交流中可以答疑解惑,学习到更多技术知识。
我觉得对于Coder来说,这是一个大大的好处,尤其是新人。Java平台的一个优点是有很多现成的框架产品可以使用,开发人员并不需要关注技术细节,专心业务处理就可以了。而正由于这种不透明性,对于很多技术细节的实现,很多人是一知半解的,只是记住怎么去使用组件。这有几个弊端:a.过于依赖别人提供的框架,脱离底层实现。改天换个框架,自己又是啥都不懂。b.如果不是很理解平台封装的一些具体实现过程,一旦开发过程中出现一些平台引起的Bug,没法跟踪定位,就只能望洋兴叹了。c.长期偏离技术,侧重业务,会将自己限死在行业里,限制发展(当然这条不适合已经确定了自己终身方向的同学)。
在评审会中,可以提出自己对一些组件使用的疑问。为什么要这么用?底层是如何实现的?有大牛们在,应该会得到很好的解答。另外在评审过程中,往往也会牵扯出一些业务知识,可以加深自己对系统的理解。
4.可以帮助建立知识库。评审中记录下大家在开发过程中经常暴露出来的问题,可以在下次项目中进行重点宣贯,一定程度上避免同样的问题出现。
Read the rest of this entry »
逆向最长匹配算法的实现
中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。
逆向最长匹配法是基于字符串匹配的一种分词算法,即按从右至左的顺序对句子循环扫描字符串,并与所提供的关键词表进行比较,如存在则提取出该串作为关键词。相比较正向最大匹配法,逆向匹配的分词精度略高于正向匹配。
算法的程序实现核心代码如下:
while (startIndex >= 0) { //循环取字符串
str = title.substring(startIndex, endIndex);
for (int i = 0; i < str.length(); i++) {
ss = title.substring(startIndex + i, endIndex);
if (matchlist.contains(ss)
&& this.ifexit(words, ss, type)) { //去重
if (type == TERM_TYPE) {
wdto = new WordModel();//dto封装了关键词及其权重
wdto.setWord(ss);
wdto.setValue(this.computeWithTfx(ss, title2));//计算权重
words.add(wdto);
} else {
words.add(ss);//不需要计算权重则add字符串
}
title = title.substring(0, startIndex + i);
if (title.length() > maxlength) {
startIndex = title.length() - maxlength;
endIndex = title.length();
} else {
startIndex = 0;
endIndex = title.length();
}
break;
}
if (i == str.length() - 1) {//若匹配不成功则移位截取新串
startIndex = startIndex - 1;
endIndex = endIndex - 1;
}
}
}
我的方向,当始终铭记!
之前林MM让写一个切分文件的程序,都以为只是临时用下,能用就行了。所以,只写了个java类实现了切分等功能。上周又接到通知说,要整合到web系统里,做成一个界面。想也没想,就答应下来。因为当时写这个是很easy的,现在,无非是再多个界面,方便用户使用而已,用app写两个框就ok了。可是,真正到写的的时候才发现,根本不是我之前想的那样,还有很多问题完全被我忽略了!
java的io系统,因为懒,我一直停留在很久以前一个相当初级的认识上,从没有花时间去认真地看下。以前需要的时候,也只是简单的实现功能就扔下了。现在真正用到了,才感觉书到用时方恨少。自学的弊端一下子凸显出来了,很多东西根本没有一个系统学习的过程,全都是平时用到了才会大概去了解下,如果不是经常碰到的知识点,也不会有特别深刻的印象。而如果一直停留在以前的认识上,不去深入,这里始终都是一个薄弱环节,最后吃亏的还是自己。
想想以前在绿岛,都是把开发当成是一个学习的过程,所以会不停地提出新的要求,然后尽量用新的技术去实现,这样便给了自己一个不停充电的机会。可从7月份到现在,我基本没有再学到新东西,除了公司的app。很多现在流行的产品都是大概了解下就不管了,确实周围也没有这样的氛围去深入学习使用。在一个集体里就是这样,你只要把分配给你的任务按时完成就ok了,不需要你学习太多新的东西,也不强迫你深入研究。诚然,量变引起质变,这样的工作方式,经过很长一段时间,个人的能力和素质肯定也会得到一个提高。但这并不是我所追求的,我不可以一直沉溺在这样一个相对稳定的环境下。积极学习、补充新的知识,不断提高自己的综合素质,才是我应有的工作方式和态度!
My way, consistency is the key !