`

我学到的一些关于编程的事儿(转)

 
阅读更多

原文地址:Some things I’ve learnt about programming—- ByJohn Graham-Cumming

 

我已经从事编程 30 年了,用过的机器包括从现在看来很差的(基于 Z80 和 6502)到最新的,用过的语言包括 BASIC,汇编语言,C,C++,Tcl,Perl,Lisp,ML,occamarc,Ruby,Go等等。

下面是我学到的一些关于编程的事儿:

0. 编程是一门手艺而不是科学或工程

编程更接近于一门手艺而不是科学或工程。它是技能和经验的组合,它需要通过工具来表达出来。一个手艺人会选择特定的工具(有时候他们会自己去做)然后学习用它去创造。

在我看来这就是手艺。我认为最好的工程师更加接近于钟表匠而不是桥梁建筑师或者是物理学家。当然因为对逻辑和数学的应用,编程看起来像是科学或工程,但是本质上它就是你拿你手上的工具去做东西。

既然编程是一门手艺,那么我们就不难理解为什么在编程中经验,工具,直觉很重要。

1. 诚实是最好的方针

编程的时候我们经常为了看看发生了什么或者让一个程序跑起来去试试一些代码,但是却并不真正地理解到底发生了什么。比如:你决定要调用一个 API,仅仅因为它神奇地让 Bug 消失了;再比如,在程序中插入一行printf,因为它让程序不再崩溃。

这些都是对自己不诚实的例子。你必须问自己:“我是否知道我的程序到底做了什么事情?为什么做这个事情?”。如果你不知道,你迟早会陷入麻烦。明白一个程序做了什么是程序员的责任,计算机只会精确地做它被告诉去做的事情,而不是你想要它做的事情。

诚实需要你对自己非常严格。你必须非常严格地确定你已经知道你的程序干什么,为什么这么干。

2. 简化,简化,再简化

Tony Hoare说过:

有两种方式构建软件设计:一种把软件做得非常简单以至于明显没有缺陷,另一种是把它做得非常复杂以至于找不到明显的缺陷。第一种方法要难得多。

简化,重构,删除。

我把 Hoare 的话改了一下:“在每一个大型复杂的程序里面,都是一些小而优雅的程序在把同样的事情做对。”

和这个相关的是“小块松散组合”哲学。通过一些相互通信的部分去构建一个程序,而不是构建一个单独的大程序。这也是 UNIX 如此成功的部分原因。

3. 不要依赖调试器,但是性能分析器不一样

我几乎从来不用调试器。我的程序会打印日志,我知道我的程序到底干了什么。大部分时候我可以从日志中看出发生了什么而不用借助调试器。

我不用调试器的原因是因为我认为它会导致你懒于思考。当遇到一个 Bug 的时候,很多人都会去设置断点,然后检查内存或者变量的值。我们很容易被这样迷人的工具所吸引,因为思考看起来会花费更多的时间。如果你的程序非常复杂,你必须需要一个调试器,那么你或许应该回去看看第二点。

(题外话:尽管说了这么多,但是一个我非常尊重的程序员,John Ousterhout,似乎会把整天的时间都花在 Windows 调试器上)。

另一方面,如果你需要了解你的程序的性能,那么性能分析器是非常重要。你不会被一个性能分析器所吸引。

4. 代码重复会让你很受伤

不要重复你自己。你的代码中的每一件事情应该只做一次。

这是第二点的一个特例。甚至是一点小小的代码重复都会在将来给你带来麻烦。

5. 对语言要随便一点

有些人对一门特定的语言很着迷,所有的东西都用它去做。这是一个错误。没有一门语言是适合所有的编程任务的。

关键是你要明白当你遇到问题的时候你要从你的工具箱里面拿什么语言去处理。工具箱中的工具当然是越多越好。试试不同的语言,试着用它做些东西。

如果你用下 Python 或者 ML,你会觉得 List Comprehension 很强大;或者你可以尝试下 Go,看看它是如何处理并发的;或者你可以用用 Perl,看看它处理字符串是多么地灵活;或者你可以用 PHP 去快速搭建一个动态网页。

我讨厌语言战争。失败者才会参与语言战争,因为这个争吵的东西本身就是个错误。比如说,在我的手上,PHP 就是个悲剧,但是在别人会用得很爽。对于 C++ 也是一样的道理。

6. 发展一个软件要比构建一个容易

这也和第二点有关。从一个小的部分出发,然后慢慢发展起来。如果你正在解决一个问题,那么从你要解决的问题的一个部分开始发展要比在问题的基础上设计一个庞大的架构容易。

当你从一开始就创建了一个庞大的架构,你就错了,你做了一个拜占庭式的复杂而死板的迷宫,你会发现自己很难去改变它。反过来,如果你从一些相互协作的小的部分出发,那么当你意识到从一开始你就把一个问题搞错了以后,重构起来将会非常容易。

这个的根本是你无法知道一个正确的架构到底长什么样子。这是因为你很难知道你的程序的外部输入会是什么样子。你也许认为你知道,比如,你的邮件服务器所需要处理的 TCP 流,或者是收件人的个数是多少,或者是垃圾邮件长什么样子。有些外部的数据会让你的假设失效。如果你的假设已经融合在一个大的,复杂的,难以改变的程序里,那么你真是麻烦大了。

7. 学习计算机的每一个层次

我觉得对从 CPU 到你所用的语言有一个认识是非常重要的。理解计算机的每一个层次非常重要。

当你需要处理性能问题的时候这就非常有用。我想起一个事儿,这个事情我依然记得很清楚,一个客户给我们公司发了一个 Window 2000 的崩溃截图,图上有一些内存和寄存器的信息。当我们知道他所用的程序的版本后,我们就找到了是一个空指针的问题导致了这个现象。

8. 我还不够年轻至足以知道一切

我依然有很多的东西要去学。有一些语言我想要接触还没有怎么接触过(Erlang,Clojure);有些语言我有所涉猎但是并不精通(JavaScript);有一些知识点我根本就不懂(monads)。

PS:我还没有提到过测试。我应该加上这一点,因为我确实认为对任何不是马上就扔掉的代码,测试用例都是非常重要的。也许再写 30 年的代码我就可以对“单元测试提升了软件质量吗?”这个问题有了一个答案。我写代码有时候写单元测试,有时候不写,我不知道这个问题的答案,尽管我更倾向于写单元测试。

 

原文链接: http://www.goldendoc.org/category/translation/

分享到:
评论

相关推荐

    《编程那些事儿》 程序设计思想

    没用,是的,因为要给你一个情景,你才能理解它,仅仅让你去学一个知识,而知识和众多其它知识之间相似而微有不同,如果不给出它被产生时的历史和它所处的架构 ,那么我们就会迅速迷惑,更遑论运用它,因为我们不是...

    Java编程那些事儿

    《Java编程那些事儿》适用于各类Java编程人员,既适合初学Java编程的各类高校学生、培训机构学员进行编程学习,也适合作为Java程序员加深Java编程理解的参考用书。

    Java编程那些事儿系列文章.pdf(全)

    东西不错,和大家共享!原作者为陈跃峰,这里仅供学习交流用。

    学编程的文档

    就像我前面日志里提到的,伊娃和芳来旧金山跟我学编程。在这篇博客中,我会介绍我是怎么教她们的,我构建教她们的方式的理由,以及这种方法是怎么起作用的。按时间顺序去列明她们所学到、做到的那些事儿很简单,但是...

    Java编程那些事儿.pdf

    本书以通俗易懂的语言和代码示例介绍Java语言编程的各种知识,是一本指导初学者进行自学编程,并通过相关章节附带的练习融会贯通相关技术的入门书籍。本书按照技术学习的顺序,依次介绍了计算机基础知识、建立Java...

    《编程的那些事儿》对大家的编程很有帮助

    《编程的那些事儿》对大家的编程很有帮助,书中的方法和经验很值得大家学习,是一本编程的绝对的好书!

    java编程那些事儿

    学习JAVA基础看他 很不错 相信你会喜欢的 这个是小弟自己做的 不好的地方请多多包含

    linux内核编程和linux那些事儿

    linux内核编程和linux那些事儿两篇电子文档,个人认为对学习Linux的只是很有帮助,和大家分享一下

    U盘的那些事儿.doc编程资料

    U盘的那些事儿.doc编程资料

    编程的那些事儿 2010最新发布

    哲语有云,动身的时候到了,有的人去生,有的人去死,只有上帝知道,于是这个问题被回归到“ To Be ? Or Not To Be ”的问题,是生,是死,只有上帝知道。 但是,人类对真理的探索和对知识的追求,却从来没有因为...

    Linux那些事儿之我是USB(第2版).pdf

    本书基于2.6.22内核,对USB子系统的大部分源代码逐行进行分析,系统地阐释了Linux内核中USB子系统是如何运转的,子...对于Linux内核开发者,也可以通过本书学习到很多Linux高手开发维护一个完整子系统时的编程思想。

    编程的那些事儿.pdf

    本书内容涵盖计算机原理,c/c++程序语法 ,算法与数据结构,设计模式,等等。本书最大特点是不是学院派的说教,引导我们明白程序设计中什么最重要 高清带书签版本。

    编程狂人第九期(2014-1-20)

    目录 业界新闻 Java 8最终发布日期敲定,即使有bug也要发布 Rust 0.9发布,改进了线程模型 oos 0.2.1 发布, C++ 的 ORM 框架 ...学编程就像选家具:去宜家还是从种树开始? 龙泉寺:如何用互联网思维管理一家寺庙?

    java那些事儿chm版本

    Java编程那些事儿系列文章(全集) 整理好的chm 作者:陈跃峰 来源:http://blog.csdn.net/mailbomb

    针对“VC++的那些事儿”的MDI应用示例

    显示MFC框架的MDI编程,其中代码的注释非常详细,如果你按照本人在“VC++的那些事儿”中描述的学习思想去学习,应该对VC++编程的代码阅读大有收获。自定义类的代码类几乎是一行注释一行代码,MFC框架的生命周期的...

    Linux那些事儿_linux初学者宝书

    本书基于2.6.22内核,对usb子系统的大部分源代码逐行进行分析,系统地阐释了linux内核中usb子系统是如何运转的,子...对于linux内核开发者,也可以通过本书学习到很多linux高手开发维护一个完整子系统时的编程思想。

    指针那些事儿

    指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串; 并能象汇编语言一样处理...只要作到这些,指针也是不难掌握的。

    headFirst java核心技术 java编程思想

    java学习三本神书:headfirst.pdf以故事性语言讲解java中的那些事儿,读起来不枯燥。java核心技术.pdf 知识讲解特别细致,java编程思想适合有基础的人,知识讲解更加深入。

    关于Scala那些事儿

    Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala 运行在Java虚拟机上,并兼容现有的Java程序。java、Scala都是基于JVM的编程语言(文件编译成class...

Global site tag (gtag.js) - Google Analytics