跳到内容

文章类别:编程

是什么造就了伟大的程序员?

回想起来就像是在昨天。那是2000年,在数据结构课程的课堂上,Pargas博士站在前面给我们讲一些关于数据结构的话题,一个SSH的画面投影在我们前 面的墙上。有人问了一个问题,他说了一些东西,差不多是这样的话“是这样,如果你想成为一个真正的计算机科学家,你需要从现在开始就使用vi编辑器”。

 

我想他是在笑谈,课后感觉他说的话并不是完全的正确,但作为年轻且容易被感染的我,回到寝室立刻就开始学习如何使用vi。学习过程不容易,花费了不 少时间,但一旦掌握了其中的窍门,我发现,使用vi的确可以更快的做事情。

时间推到6年前,那时我对TextMate十分的着迷。我的工作是做Java开发,但同时我学习Rails,在业余时间开发一些Rails项目。那 时几乎所有我读的文章和观看的视频都是说明和演示如何使用TextMate来完成文本编辑工作的方法技巧的。事实上,我每天都在使用的Eclipse想要 把我变成一头蠢猪。于是,我买了一台Mac电脑,开机后十分钟内我就买了一套TextMate装了上去。

说老实话,这两种编辑器没有一种使我成为一个更好的程序员。

 

优秀的工具并不会把你变得更优秀。你使用的工具确实很重要。事实上,它们非常棒。但老虎伍兹即使用几根树枝也能把我们全部打败,梅西即使不穿鞋也能 把我们踢的很惨,拉斐尔-纳达尔即使使用一个60年代产的老式木质网球拍也能把我们任何一个人打败。该死,他即使用乒乓球拍也能打败我们。技术,知识,以 及锻炼出来的经验是你在与人对比中最重要的部分。 阅读更多 »

你的老板会因为你拼命编写代码而感谢你吗?

程序员热衷于长时间地工作。我想说的是,你就承认吧,你的工作/老板并没有让你这样做,你自己要这样做而已。当然,我知道,也许并非所有程序员都喜欢长时间的编程。不过肯定的是,随着加班成为业内的普遍现象,至少一半的程序员必须喜欢加班,不是吗?

我早已听到以下这类借口。“不,不是那样的,我们只是喜欢炫酷的技术活,而且不想遗留未解决的问题。实际上,加班是一件好事,它让我们变得出色!”

我认为,你不能只见树木,不见森林。从某个角度来说,你这样做并非为了自己,而是为了“某个人”。无须质疑,他也许是个高尚的人,但你并不是他的奴隶。从其他角度来说,你有多少次加班,是为了解决问题,研究新技术,编码实现某些东西,以及在截止时间之前完成任务?但是,你在业务上是机智过人的程序开发者,你在帮助公司获得成功。公司管理者已经向你说明了公司的经济状况——必须这样做,公司依靠你。我想说的是,除非这个管理者现在就在你旁边,半夜2点还在陪你聊天,否则他的话将一文不值。

让我来讲述一个朋友曾经跟我说过的故事。这个故事是关于一个天才程序员的,姑且叫他John吧。 阅读更多 »

程序员的七大坏毛病

1.- 所有的程序都写的很烂,除了我的。
我要告诉你一个坏消息,兄弟,所有的程序都写的很烂,包括你的。无论你在上面花多少功夫,其他大多数程序员总是会认为你写的代码很烂、他们能写出比你好10倍的程序。

如何纠正:不要挑剔别人的程序,有一天也许你的程序会被人放在聚光灯下挑剔。要保持客观和专业的评论,不要轻易判断。要谦虚,从周围人哪里学习经验,警戒自己不要写出这么糟的程序。

2.- 我几秒钟就能把它改好,不用走变更流程了。
抄捷径充满诱惑,每个人都想抄捷径。有时候抄捷径是必要的,但总的来说,抄捷径是危险的,非常危险,应该避免这样做。走捷径也许会节省你数小时的时间,但如果走错了,它可能会给你带来数月的麻烦。

如何纠正:遇到需要慎重处理的事情时不要太过自信。让其他人来复查你的所作所为。如果你计划要走捷径,请确保让你的负责人知道这样做的理由以及其中的风险。每次在走捷径时最好都让你的经理来确认实施成功,也就是“让他给你擦屁股”。

3.- 这是个几分钟就能搞定的事。
在我的家乡Barcelona,那里的圣家族大教堂让我非常的自豪,它的举世闻名来自于它的美丽,也来自于它的建筑完工日期的规划(它动工于1882年,目前仍未完工),但这可能是因为他们没有让一个程序员去估计这个完工时间,否则的话,估计出的完工所需的时间很可能2周。

如何纠正:从一开始,你就必须严肃的认识到,对于一个有一定规模的软件开发过程来说,进行精确的时间评估是不现实的,我们能做的只是猜测。同样要记住的非常相似一点是,我们通常会发现有很多事情根本不能预见到它们会花去我们数倍于我们初始估计的时间,我通常的做法是把估计的时间乘上1.5或2。

阅读更多 »

Javascript的匿名函数

一、什么是匿名函数?

在Javascript定义一个函数一般有如下三种方式:

  1. 函数关键字(function)语句
    function fnMethodName(x){alert(x);}
  2. 函数字面量(Function Literals)
    var fnMethodName = function(x){alert(x);}
  3. Function()构造函数
    var fnMethodName = new Function('x','alert(x);')

上面三种方法定义了同一个方法函数fnMethodName,第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而这个函数是没有名字的,即匿名函数。实际上,相当多的语言都有匿名函数

二、函数字面量和Function()构造函数的区别

  1. 虽然函数字面量是一个匿名函数,但语法允许为其指定任意一个函数名,当写递归函数时可以调用它自己,使用Function()构造函数则不行。
    var f = function fact(x) {
      if (x < = 1) return 1;
      else return x*fact(x-1);
    };
  2. Function()构造函数允许运行时Javascript代码动态的创建和编译。在这个方式上它类似全局函数eval()。
  3. Function()构造函数每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。
  4. 用Function()构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。
    var y = "global";
    function constructFunction() {
        var y = "local";
        return new Function("return y");  //  无法获取局部变量
    }
    alert(constructFunction()());  // 输出 "global"
    

和函数关键字定义相比Function()构造器有自己的特点且要难以使用的多,所以这项技术通常很少使用。而函数字面量表达式和函数关键字定义非常接近。考虑前面的区别,虽然有消息说字面量的匿名函数在OS X 10.4.3下的某些webkit的引擎下有bug,但我们平常所说的匿名函数均指采用函数字面量形式的匿名函数。更多详细内容可以阅读《JavaScript: The Definitive Guide, 5th Edition》的Functions那章。 阅读更多 »

陪伴我作为程序员的9句名言

本文是从 9 Quotes that stayed with me as a developer 这篇文章翻译而来。

我 发现名人名言能激励人,鼓舞人或有时是煽动人,下面就是我这些年来最喜欢的几句。有时一本书能对你如何写程序或如何解决一个问题具有实实在在影响。有时一 句简单的话已足够让你质疑对正在编写的代码的态度。有时候我惊讶于有些人如此的深谙这些藏在我心里多年、只是从未宣讲出来的道理。

“设计是一个发现问题、而不是发现解决方案的过程” —— Leslie Chicoine

“功能说明书里不存在可操作性” —— 37 Signals

“过去的代码都是未经测试的代码” —— Michael Feathers

“任何傻瓜都能写出计算机可以理解的代码。好的程序员能写出人能读懂的代码” ——Martin Fowler

“测试是来表明bug的存在而不是不存在” —— Edsger Dijkstra

“简单不先于复杂,而是在复杂之后” —— Alan Perlis

“Real developers ship” —— Jeff Attwood

“没有绝世神功” —— Frederick Brooks

“过去的33年里,我每天早上看着镜子问自己:“今天是我生命的最后一天吗?我是否要去做今天该做的事?”一天一天太多次 是“不是”,我知道这需要改变…所有的事情 —— 所有身外的期望,所有的骄傲,所有的对困难和失败的恐惧 —— 这些东西在死亡面前立刻消失的无影无踪,只剩下真正重要的东西。想着自己即将死去,这是让我避免落入担心失去什么的陷阱里的最好的方法。” —— Steve Jobs