自由的公司环境是造就优秀程序员的摇篮

优秀的程序员都有什么共同之处?工作经验?薪水待遇?完成任务花的时间的多少?事实证明,跟这些都不相关。 很奇怪,来自同一个公司的程序员们的表现都基本上处在同一水平。为什么? 这最重要的因素是他们所处的工作环境能给他们提供的舒适程度:“… 最能干的程序员所工作的公司几乎都能给他们最大的隐私权,最大的个人空间,最大的控制他们的物理空间的自由度,最少的外界干扰。” 来自: 《Quiet: The Power of Introverts in a World That Can’t Stop Talking》: 为了证明这些,DeMarco和他的同事Timothy Lister设计了一个称之为“Coding War”竞赛的研究计划。这个竞赛的目的是要能清楚最好的程序员和最烂的程序员都有哪些特征;大约有来自92个公司的600名程序员参加了竞赛。他们每个人都要设计,开发,测试一个程序,在上班时间,在他们平时工作的地方完成。每个参与者都有一位来自同一个公司的同伴。然而,他们之间相互独立,没有任何的联系。后来证明这是这个竞赛的一个至关重要的特点。 当结果出来后,这些人的编程能力被证明有着巨大的差距。最优秀的和最差的之间的效能比是10:1。顶级程序员比中等水平的程序员也要高出2.5倍。当 DeMarco 和 Lister 试图解开是什么导致这样惊人的差距时,那些他们以为可能的因素——比如工作阅历,薪资待遇,甚至完成竞赛题花去的时间长短——这些都跟这样的结果关系不大。具有10年工作经验的程序员并不比只有2年经验的表现的优秀。有一半处于中上等水平的程序员的收入比余下一半处于中下等水平的程序员的收入要少10%——尽管前者比后者的能力有的要高出两倍。那些编写出“零错误”程序的程序员相较于那些程序中有错误的程序员,他们完成竞赛题所花的时间更少,而不是更多。 这是一个迷,但是他们发现了一个很有意思的线索:来自相同公司的程序员或多或少都处在同一能力水平,即使是他们并不在一起工作。这是因为那些顶级程序员所工作的公司几乎都能给他们最大的隐私权,最大的个人空间,最大的控制他们的物理空间的自由度和最少的外界干扰。最有效率的程序员中有62%的人说他们的公司尊重他们的隐私,而相对的那些表现最差的程序员中只有19%这样说。最差的程序员中有76%的人说经常被没必要的因素干扰,而那些最优秀的程序员中只有38%这样说。

C++中不能在派生类中对父类函数进行重载

查看如下代码段: [c light=”false” toolbar=”false”] #include<iostream> using namespace std; class B { public: int f(int i) { cout << “f(int): “; return i+1; } // … }; class D : public B { public: double f(double d) { cout << “f(double): “; return d+1.3; } // … }; int main() { D* pd = new D;… Continue reading C++中不能在派生类中对父类函数进行重载

Memory Management in Objective-C

基本法则: You own any object you create You create an object using a method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy” (for example, alloc, newObject, or mutableCopy). 你用alloc, new, copy或者mutableCopy消息创建出来的对象,所有权归你。 You can take ownership of an object using retain A received object is normally guaranteed to remain valid within the method it was received in, and… Continue reading Memory Management in Objective-C

C++函数传引用问题一则

今天碰到一个C++问题,体现了基础知识不够好。在这里总结一下问题的来龙去脉。 首先我参照SAFE_DELETE(这个MACRO应该用过微软C++的都熟悉)写了一个SAFE_DESTROY_DELETE。用于传入CWnd*后先DestroyWindow再delete指针。 [c light=”false” toolbar=”false”] void SAFE_DESTROY_DELETE(CWnd* pWnd) { if (pWnd) { if (::IsWindow(pWnd)) { pWnd->DestroyWindow(); } SAFE_DELETE(pWnd); } } [/c] ​在写这个函数的时候我只是想到不要用Macro,这样可以有一个编译器的类型检查。这里面其实有一个比较低级的错误。开始没发现,你能看出来吗? 然后发现这个错误后我试图把函数修改一下,为了不动到其他会调用此函数的地方,我灵机一动,改了一处,觉得应该就可以了。修改后如下: [c light=”false” toolbar=”false”] void SAFE_DESTROY_DELETE(CWnd* &pWnd) { if (pWnd) { if (::IsWindow(pWnd)) { pWnd->DestroyWindow(); } SAFE_DELETE(pWnd); } } [/c] 编译后发觉一堆错误。VC2010的错误信息如下: error C2664: ‘SAFE_DESTROY_DELETE’ : cannot convert parameter 1 from ‘ B* ‘… Continue reading C++函数传引用问题一则

异常的使用场合

什么时候应该用异常,如果不用异常,直接用返回值来代表各种各样的错误是否合理?这个问题曾经在程序语言的学习阶段问过自己,后来也就含糊的理解了。今天看到了MSDN中有这样的一段话,又自己过了一下异常这一个概念,感觉对于加深理解有帮助,MSDN引用如下: When to Use Exceptions Three categories of outcomes can occur when a function is called during program execution: normal execution, erroneous execution, or abnormal execution. Each category is described below. Normal execution The function may execute normally and return. Some functions return a result code to the caller, which indicates the outcome of the… Continue reading 异常的使用场合