1) 是否有语法错误,编译错误,编译警告。 做法:下载最新代码,将编译警告级别提升到最高,检查output信息。 2)是否符合需求,完成requirement文档要求的内容,不能多,也不能少。 注意:即使发现有问题代码,如果与需求关联不大,不要涉及。 应该让每次enhancement和bug fix最简洁,牵涉范围最小,影响到组件最少。 3)是否符合编码规范: a) 注意等号前后,操作符前后的空格和tab,行尾不要有多余空白字符 b) 注意命名规范,少用缩写形式,少用2/3/ex这种增强版 c) 对于循环局部变量,注意少用I,j在较长代码中(三四行OK) d) .. 4)代码美感 a) 不能有嵌套的if-for-switch-while出现 b) 不能有非常复杂的条件判断表达式(用于if-while之类) c) 足够的注释,对于复杂操作,对于条件判断,可以注释。尽量让代码自己说明自己。 d) 如果代码不能在短时间内理解,或者稍作解释就可以理解,应该看看能否有更简洁的方式 e) 函数不要过长,不能超过一屏显示,最多不应该超过2-3屏。 f)经常问自己是否有更好的办法,更简洁明了的代码形势 g) 一个函数只做一件事,如果需要多个功能,再写一个 h) 少用boolean 作为参数切换功能,用withXXXcase, usingXXXcondition函数名字来自说明。道理同g) i) 少用重载功能,没必要类似函数用一个名字,既然有不同函数实现,那么应该有不同条件描述,可参考h)的命名 j) 抽象层次不要过多,不要过早和过多考虑设计模式/抽象/抽取通用功能这些事情,这些在代码重构阶段可以修改调整。 5)逻辑 a) 参考上一条4),基本上有足够美感的代码,逻辑上问题都不大 6)杂项 a) 性能的关注应该基于profiling data,而不是猜测 b) 代码的正确与否,不是基于猜测而是基于test case c) 扩展性不需要考虑过多,有一点点就好 d) 时时问自己,这个函数/变量/逻辑判断/.. 有没有必要,是不是可以删掉的 e) 时时问自己,如果不用手动测试,自动化测试自己这段代码,可以不可以?如何实现?(MEF or 数据界面分离… )可否通过脚本、工具自动化某些流程?
分类: tech
-
我的code review规则
-
新浪微博的不科学研究
首先说明,这篇文字只是我个人的一些看法,借用问答形式展现,不具备什么科学性也没有详细的数据收集分析。
我的新浪微博 http://weibo.com/sagasw
微博现状?
如果说网络产品,2011年最火的毫无疑问是微博,几大门户基本上都推出了微博产品,据我观察,基本上排名顺序是:新浪、腾讯、网易与搜狐不确定。新浪微博现在投入最大,宣传最火爆(不过也没有SB到购买春晚关键字的地步)。腾讯微博还是依托它庞大的用户群,但是腾讯微博的缺点也很明显,就是马化腾没有像新浪管理层那样全力投入。没有全力投入,现状就是腾讯还有其它类似微博的产品,比如腾讯空间说说,这就像自己跟自己打架。
微博是什么?微博能做什么?
微博是什么,很难说清。你可以把它作为一个新闻来源,现在各种突发事件,很快就会在微博上爆炸式传播。也可以把它作为个人自言自语、自怜自爱的一个日记本,只不过这个日记本是公开的。或者可以把它当做微型的论坛,评论回复发言各种功能也都有。
微博的特点?
使用微博的最大特点是快捷方便。借助智能手机上面的程序(用fashion的方式叫app),拍照、上传、写两句话一分钟搞定。在博客时期,徐静蕾就有类似微博化的倾向,几句话就是一篇博客。但是博客特点是有内容才好看,太短了就像是敷衍。而微博可以简单到就是一句话,一个字甚至就一张图片。
现在新浪微博上的话题大致分成几种:心灵鸡汤,名人名言类的,抚慰心灵类的,冷笑话什么的,这一类将来会慢慢减少,但是现在还是挺多的。其次是朋友聊天型的,也就是把微博当成聊天工具来用,另外自言自语当成日记使用也是一种变型,我们可以称之为社交性内容。再就是讨论问题的,有些能争论到骂街,但是微博的短小决定了很难争论出什么一二三来,到最后就是各自回家吃饭罢了。再有就是新闻类的,把网站新闻或者文章链接贴上来,也许加上一两句评论,比如什么南方周末之类的媒体。
前世今生?与Twitter比较?
首先得说,微博不是新浪发明的,而且现在最火的也不是新浪而是twitter。我的Twitter账号是:http://twitter.com/sagasw
twitter与新浪微博相比有如下特点:
1)Twitter不排除删某些违法贴,但是新浪微博上删帖大多不是因为违法,这个不多展开说明。
2)使用Twitter需要一定的技术手段或者需要身在国外,所以中文用户数量相比新浪微博差了几个量级,大多数Twitter上非政治言论几乎在新浪微博上有同步的内容
3)现在新浪微博上的IT技术讨论已经超过Twitter,这也是因为用户数量导致的
4)新浪微博多了很多花哨的功能,比如评论转发,比如微博群等等,但是评论和转发相比而言比较难区分,另外微群功能基本上是废的
5)Twitter的API非常大方,但是新浪微博的API质量以及Quota都太小气了,而且所谓的微群功能还没有API
微博为什么要140个字?
140个字是一个很有意思的限定。这个设定来自Twitter的140个字限制,而Twitter限制来自手机短信140个字。但是新浪微博是140个中文字,而Twitter是140个英文字,换成中文其实是70个字,也就是一个正常短信的长度。但是新浪微博140个中文字其实就很奇怪,因为手机短信不可能一次发140个中文。
但是140个字的限定,其实还有一些好处的。首先一点就是字数限制让内容变得简洁,跑题一下说,其实微博最好的问题就是古诗,比如五言七言,文字优美还表达了很深含义。如果想多写字,那简单啊,使用博客发长文章就好了。说到这里还得评论某个很搞笑的功能,就是把长文字变成一个图片贴上去,这功能太蛋疼了。字数限定的第二个好处是,大家都不必写长文字,所以几句话的自言自语也不会有人说什么,就是快餐一样的快捷,也不会期望有什么太深刻的内容。
微博的营销策略?
微博本身怎么赚钱是一个大问题,至少我现在没发现微博赚钱的方式,广告、话题营销都是其它Web载体用过的,很难说微博用了就会不一样。但是微博庞大的客户群以及更重要的微博人际关系,应该是可以挖出宝贝的。
但是对于大多数需要服务的产品而言,建立官方微博已经是势在必行的事情了。学校、公司、政府机关、产品、个人都可以建立自己的品牌,回应粉丝的问题,广而告之发布各类信息、新闻、链接等等。先别想着用微博赚钱,把微博做一个广告载体或者是服务窗口,把人气旺起来。
微博的不足?
微博求快求关注度,以及话题的时效性,导致微博有些不足。话题本身求新求快,有时候很难保证话题内容的正确性,所以产生了谣言以及辟谣功能,有些是真谣言,有些。。。其次,为了吸引眼球,话题可能偏于低俗化,比如每篇必加上一张性感美图,但是与内容一点也不搭。或者是由于微博本身发的太快,导致某些”明星“的真性情真水平都表露出来,霸气侧漏了,实在不该。
微博的发展?
有人说新浪微博最终会把新浪拖垮,有人说Twitter估值过高,我一介屁民实在也没法看透将来如何。但是就如今的发展趋势来看,网络产品的趋势是:短小化(或者说快餐化)、移动化(便携化)、平民化、社交化,而微博就是最符合这个发展趋势的。就此来看,至少一两年时间不会有新的网络产品代替微博,我很看好微博发展。
另外现在微博数据是一个很有意思的东西,因为微博内容相比博客或者是论坛,内容相对比较真实,所以数据应该可以挖掘出很多东西,针对这个社交特性可以做不少开发,不过我现在没想好能做什么,看各位高人的了。
-
C++工程实践 值语义–读后感及补充
C++ 工程实践(8):值语义 http://www.cnblogs.com/Solstice/archive/2011/08/16/2141515.html
由于近期一直不做C++,看着都有些陌生了,阅读速度并不快,而且C++这块实际上陈硕提到的方面,以前用得不多。但因为这里面很多概念与C#共通,所以也不难理解。
下面是一些问题以及相关资料的补充。
1)“标准库里的 complex<> 、pair<>、vector<>、map<>、string等等类型也都是值语意,拷贝之后就与原对象脱离关系”
如果对C#的字符串类型稍有了解,便知道它们都有类似intern的机制,在Ruby中则为Symbol,另外微软BSTR类型也会做类似字符串驻留。目的都是让字符串字面值在内存中只有一份,使用者都指向同一份好了。
稍做实验便可得知标准库中string是值语义。但是对于模版类型,比较有疑问,因为它们都不是完整类型,怎么说明是值语义?
关于值语义,我这里也有一个解释,不一定对。对于值语义类型他们的拷贝是所谓的深拷贝(byte by byte),而引用类型常规拷贝是所谓的浅拷贝(shallow copy),只不过大家指向同一个引用。对于引用类型的取值也与值类型不一样,是先取引用地址,然后从这个地址取内容,相当于两个动作。
关于shallow copy http://en.wikipedia.org/wiki/Object_copy#Shallow_copy
2)“值语义,引用语义”。在C#中有值类型和引用类型,对照的更为明显一些。另外,在C语言中全部都是值语义,不存在引用语义。
3)”Java 有 value object 一说,按(PoEAA 486)的定义,它实际上是 immutable object”。
对于C#,值类型都来自于System.ValueType。
4)另外与本文列举模版类比如vector不同的是,在loop中,C#中的范型类型可以修改其内容,但是修改以后再继续使用iterator就会跑出异常,因为对象中有个version信息,修改后会增加。而C++中没有这种机制,loop中修改vector内容是OK的。
5)POD,Plain Old Data,类似C语言Structure这样。没有什么包装多态vtable这些东西,按byte拷贝没有问题。
http://en.wikipedia.org/wiki/Plain_old_data_structure
6)对象语义的 object 由于不能拷贝,我们只能通过指针或引用来使用它。
C#所谓managed heap,专门存放对象语义的object实例。
7)“一旦使用指针和引用来操作对象,那么就要担心所指的对象是否已被释放,这一度是 C++ 程序 bug 的一大来源”.
个人感觉这是本文中工程实践味道最浓的部分。对象互相通知生存状态变化,是很麻烦。如果你再用个object pool机制,那就更麻烦。
8)一个 smart pointer 应该是 weak reference,否则会出现循环引用,导致内存泄漏
在C#中也有weak reference机制,保证可以观察对象生存状态,又不至于影响到GC.
9)SGI Assignable concept
http://www.sgi.com/tech/stl/Assignable.html
10)值语义是C++语言的三大约束之一
这里面的三大约束,没找到来源(update http://blog.csdn.net/Solstice/article/details/5455835),在wiki上http://en.wikipedia.org/wiki/C%2B%2B
Philosophy. In The Design and Evolution of C++ (1994), Bjarne Stroustrup describes some rules that he used for the design of C++: ... ...
11) RVO返回值优化
http://en.wikipedia.org/wiki/Return_value_optimization
==================================
从这篇文章以及我个人感受而言,要么用语意定义更为明确,语言更为规范的C#做面向对象开发,要不使用C语言来开发。C++真是有些鸡肋。如果用C++,也可以把它学好以后,在工作中当成Enhanced C来使用。
-
关于线程Thread、协程Coroutine、生成器Generator、yield资料
关于Green Thread(绿色环保线程)、Native Thread,以及线程的一些普及问题,下面这个presentation最为翔实
http://www.slideshare.net/tmm1/threaded-awesome-1922719
另外毫无疑问要看看维基百科上的这一条 http://en.wikipedia.org/wiki/Thread_%28computer_science%29
如果你像我一样也喜欢Lua这个支持协程http://en.wikipedia.org/wiki/Coroutine (或者我们可以称之为Green Thread)特性的编程语言,这一篇论文非常值得参考,印象中这一篇论文以及《revisiting coroutine》介绍了为什么Lua不实现抢先式以及continuation的设计思路 www.inf.puc-rio.br/~roberto/docs/corosblp.pdf http://www.inf.puc-rio.br/~roberto/docs/MCC15-04.pdf
这一篇教程可以帮助你了解Lua协程的基本用法http://lua-users.org/wiki/CoroutinesTutorial
有人也许质疑Lua的协程功能不支持C函数扩展,那么可以试试大名鼎鼎的LuaJit作者出品的Coco http://coco.luajit.org/
喜欢中文资料的可以参考TimYang这篇介绍http://timyang.net/lua/lua-coroutine/
另外如果想实战使用的可以试试copas http://keplerproject.github.com/copas/manual.html
我也有翻译一篇Lua协程与Python Generator比较的文字 http://sunxiunan.com/?p=1654
还有使用Lua协程实现斐波拉切 http://sunxiunan.com/?p=1689
关于Native Thread,还有一个词语叫做Fiber纤程,意思是比纤程更细微轻量,好像Pthread和Windows都有支持。印象中看到过一篇文字说C#的yield就是利用Fiber实现,这个问题先放着。http://en.wikipedia.org/wiki/Fiber_%28computer_science%29 另外也有人称之为绿色环保线程 http://en.wikipedia.org/wiki/Green_threads
Erlang也有类似术语,叫做Green Process,大致意思差不多(?)。
Python相关概念http://en.wikipedia.org/wiki/Generator_%28computer_programming%29
前面提到了一个continuation概念 http://en.wikipedia.org/wiki/Continuation 不过好像前面Lua论文里面提到过,设计一个正确continuation的程序太复杂(就我看来能正确理解coroutine这种简化级别continuation的都不容易),所以很少有程序语言支持(smalltalk?)。
-
DotNet程序员面试问题评估
欢迎各位Dotnet程序员回答。不需要回答出具体问题,只要标记大致程度即可。
1什么是DotNet的CLR? CLR作用是什么?A不知道 B知道很少 C知道一些 D非常了解
2 DotNet中如何使用Win32的DLL?(没有reference可以添加)
A不知道 B知道很少 C知道一些 D非常了解
3 C#使用什么关键字实现可变个数参数(variable number parameters)?
A不知道 B知道很少 C知道一些 D非常了解
4 C#中的weak reference是什么?用于什么场合?
A不知道 B知道很少 C知道一些 D非常了解
5 C#中的using dispose模式是什么?用于什么场合?
A不知道 B知道很少 C知道一些 D非常了解
6 C#中Garbage Collection是什么?简介GC的internal工作方式(如果你是微软开发人员,如何实现GC)?
A不知道 B知道很少 C知道一些 D非常了解
7 C#中的关键字as, yield, out/ref, virtual/abstract/override?
A不知道 B知道很少 C知道一些 D非常了解
8 Strong name signature是什么?有什么用?
A不知道 B知道很少 C知道一些 D非常了解
9 字符串intern暂留机制是怎么一回事?
A不知道 B知道很少 C知道一些 D非常了解
10 Windows平台下多进程通讯方式?越多越好
A不知道 B知道很少 C知道一些 D非常了解
11 Delegate, Event, Action, Func都是什么?
A不知道 B知道很少 C知道一些 D非常了解
12 MVC, MVP, MVVM设计模式?
A不知道 B知道很少 C知道一些 D非常了解
13 除了工厂模式和单例模式,列举并且简单介绍你知道的设计模式以及应用场合?
A不知道 B知道很少 C知道一些 D非常了解
14 C#中overload和override如何实现?
A不知道 B知道很少 C知道一些 D非常了解
15 接口和抽象类有什么区别?都应用在什么场合?
A不知道 B知道很少 C知道一些 D非常了解
16 LINQ是什么?写一个简单的LINQ语句?
A不知道 B知道很少 C知道一些 D非常了解
17 C# Lambda是什么?写一个简单的lambda?
A不知道 B知道很少 C知道一些 D非常了解
18 C#中class与struct区别?
A不知道 B知道很少 C知道一些 D非常了解
19 是否听说过或者了解MEF, Unity, Prism?
A不知道 B知道很少 C知道一些 D非常了解
20 面向对象设计思想/原则有哪些?(SOLID)
A不知道 B知道很少 C知道一些 D非常了解
21 如何实现一个plugin插件可扩展系统?
A不知道 B知道很少 C知道一些 D非常了解
22 DotNet中的LinkedList与SortedList有什么不同?内部如何实现?
A不知道 B知道很少 C知道一些 D非常了解
23 设计一个字符串类(不能使用类库中的string class)?简要说明关键方法
A不知道 B知道很少 C知道一些 D非常了解