随笔-19  评论-21  文章-0  trackbacks-0
自动化法则

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

    我们应该利用作为程序员的优势,看到普通用户无法看到的东西,培养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,思考。



链接: 卓有成效的程序员




posted on 2010-07-10 12:40 hex108 阅读(758) 评论(4)  编辑 收藏 引用 所属分类: Read the book

评论:
# re: 卓有成效的程序员 2010-12-03 02:05 | flagman
使用C++ template metaprogramming,不就可以定义DSL吗?

只是这样的实现,目前的问题是还没有办法保证定义出的DSL是type-safe的。  回复  更多评论
  
# re: 卓有成效的程序员 2010-12-03 15:32 | hex108
@flagman

呵呵,你说的问题是存在的(这个问题我再仔细想想。。。), 3Q ~
相对于卓有成效的程序员(http://ishare.iask.sina.com.cn/f/10584969.html)里提供的关于DSL例子 ,我更喜欢《程序员修炼之道》(http://forum.eviloctal.com/thread-33274-1-1.html)第二章12节领域语言 对 DSL的应用。 我这里说的DSL也是想侧重于“新发明”一种小的语言,在这个小语言里,一条简单的语句能执行复杂的功能,让抽像层次更高,比如:sendMail(from,to,content)为发email的函数, 这样我们就可以直接调用sendMail了(感觉好像是提供了库函数了。。。)。  回复  更多评论
  
# re: 卓有成效的程序员 2011-10-19 19:13 | high PR Backlinks
thanks for it.  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理