卓有成效的程序员

卓有成效的程序员
自动化法则

    计算机原本就该从事简单重复的工作。只要把任务指派给它们,它们就可以一遍又一遍毫不走样地重复执行,而且速度很快。但却经常看见一种奇怪的现象:人们在计算机上手工做一些简单重复的工作,计算机则在大半夜里扎堆闲聊取笑这些可怜的用户。

    我们应该利用作为程序员的优势,看到普通用户无法看到的东西,培养larry所说的“懒惰,急躁和傲慢”让计算机高效地为我们工作:命令行是如此地高效,脚本是如此地方便,衔接两个小工具能达到如此神奇的效果。。。

古代哲人

1. 亚里斯多德的“事物本质性质和附属性质”理论:致力本质复杂性,去除附属复杂性。你现在想解决问题A,在解决A的问题中遇到了问题B,接着你去解决问题B,戏剧性的是你遇到了很多接二连三的问题C,D,E,或者在很多年后,程序才出现问题C,D,E,可是你的最初问题是A,不是吗?B,C,D等等都是附属性质,当这些附属性质越来越多,越来越复杂的时候,也是开始思考另一个解决A的办法的时候了。(如果作为学习,可以试着去解决那些附属性质)

2. 笛米特法则:任何一个对象或者方法,它应该只能调用下列对象:该对象本身,作为参数传递进来的对象,在方法内创建的对象。这么做的主要目的是信息隐藏,同时使类的耦合更加松散。

3. “古老”的软件传说。了解历史才能更好地创造历史。读读那些“古老”的“宝典”(如《程序员修炼之道》《人月神话》《Smalltalk Best Practice Patterns》),会学到很多有用的东西,或许你会发出一生惊叹。“当你的老板要求你使用一个低质量的代码库时,不需要在崩溃中咬牙切齿,告诉他:你正“站在侏儒的肩膀”上的陷阱中,然后他就会明白不仅仅只有你才觉得那是个坏主意。”

拥抱多语言编程

   “每个语言都有自己擅长的地方”(我的想法)。比如perl特别适合文本处理,用来处理网页也很好(毕竟有些从服务器上返回的数据就是用perl返回的,所以用perl也会比较合适)。

    计算机语言就像鲨鱼,要是保持静止就会死。

    Java的创造都们实际上创造了两样东西:Java语言和Java平台。后者就是我们摆脱历史包袱的途径(Java语言的特性包含了一些它本该可以忽略的东西,如Java程序初始化的顺序和从0开始的数组)。读到本文我才开始理解平台的深刻意义。

    举两个例子(Groovy和Jaskell)说明。

    Groovy是一种开源的编程语言,它给Java带来了动态语言的语法和功能,它会生成Java字节码,因此可以在Java平台上运行。在Java之后十多年里浮现出来的各种语言很大程序上影响着Groovy的语法:Groovy支持装饰,较松散的类型系统,“理解”迭代的集合,以及很多现代编程语言的改进特性。而且它可以编译成纯正的Java字节码。用Groovy写成的代码简洁且并不比用Java写的代码效率低多少,而且能充分借用Java平台的优势。

    Jaskell是运行在Java平台上的Haskell版本。Jaskell拥有函数式程序设计语言的优势:函数不改变外界的状态,纯粹的函数式语言压根没有“变量”概念;函数式语言对多线程的支持比命令式语言要强得多,用函数式语言更容易写出强壮的线程安全的代码,对并发支持也比较好(我想这是Erlang流行的原因)。同时Jaskell也能借用Java平台的优势。

     Java平台借用这些多语言特性,一定会走得更好,走得更远。不过,在带来好处的同时,也带来了一个问题:多语言应用程序更难高度,解决这个问题最简单的办法也跟现在一样:靠严格的单元测试来避免在调试器上浪费时间。

     多语言开发风格会把我们带向领域特定语言(Domain-specific Language,DSL)。我们会以一些专门的语言为基础,创造出非常有针对性的,非常专注某一问题域的DSL。抱定一种通用语言不放的年代就快结束了,我们正在进入一个专业细分的新时代。大学时代的Haskell教材还在书架顶上蒙尘吗?该给它掸掸灰了。

     ps: 我们也可以以C++为基础,来创造一种DSL,思考。



链接: 卓有成效的程序员




你可能感兴趣的:(卓有成效的程序员)