好好先生很多人避免“函数式vs面向对象”的辩论,于是他们成为了“好好先生”。这种人没有原则的认为,任何能够解决当前问题的工具就是好工具。也就是这种人,喜欢使用shell script,喜欢折腾各种Unix工具,因为显然,它们能解决他“手头的问题”。
然而这种思潮是极其有害的,它的害处其实更胜于投靠函数式或者面向对象。没有原则的好好先生们忙着“解决问题”,却不能清晰地看到这些问题为什么存在。他们所谓的问题,往往是由于现有工具的设计失误。由于他们的“随和”,他们从来不去思考,如何从根源上消灭这些问题。他们在一堆历史遗留的垃圾上缝缝补补,妄图使用设计恶劣的工具建造可靠地软件系统。当然,这代价是非常大的。不但劳神费力,而且也许根本不能解决问题。
所以每当有人让我谈谈“函数式vs面向对象”,我都避免说“各有各的好处”,因为那样的话我会很容易被当成这种毫无原则的好好先生。
符号必须简单的对世界建模从上面你已经看出,我既不是一个铁杆“函数式程序员”,也不是一个铁杆“面向对象程序员”,我也不是一个爱说“各有各的好处”的好好先生。我是一个有原则的批判性思维者。我不但看透了各种语言的本质,而且看透了它们之间的统一关系。我编程的时候看到的不是表面的语言和程序,而是一个类似电路的东西。我看到数据的流动和交换,我看到效率的瓶颈,而这些都是跟具体的语言和范式无关的。
在我的心目中其实只有一个概念,它叫做“编程”(programming),它不带有任何附加的限定词(比如“函数式”或者“面向对象”)。我的老师Dan Friedman喜欢把自己的领域称为“Programming Languages”,也是一样的原因。因为我们研究的内容,不局限于某一个语言,也不局限于某一类语言,而是所有的语言。在我们的眼里,所有的语言都不过是各个特性的组合。在我们的眼里,最近出现的所谓“新语言”,其实不大可能再有什么真正意义上的创新。我们不喜欢说“发明一个程序语言”,不喜欢使用“发明”这个词,因为不管你怎么设计一个语言,所有的特性几乎都早已存在于现有的语言里面了。我更喜欢使用“设计”这个词,因为虽然一个语言没有任何新的特性,它却有可能在细节上更加优雅。
编程最重要的事情,其实是让写出来的符号,能够简单地对实际或者想象出来的“世界”进行建模。一个程序员最重要的能力,是直觉地看见符号和现实物体之间的对应关系。不管看起来多么酷的语言或者范式,如果必须绕着弯子才能表达程序员心目中的模型,那么它就不是一个很好的语言或者范式。有些东西本来就是有随时间变化的“状态”的,如果你偏要用“纯函数式”语言去描述它,当然你就进入了那些monad之类的死胡同。最后你不但没能高效的表达这种副作用,而且让代码变得比过程式语言还要难以理解。如果你进入另一个极端,一定要用对象来表达本来很纯的数学函数,那么你一样会把简单的问题搞复杂。Java的所谓design pattern,很多就是制造这种问题的,而没有解决任何问题。
关于建模的另外一个问题是,你心里想的模型,并不一定是最好的,也不一定非得设计成那个样子。有些人心里没有一个清晰简单的模型,觉得某些语言“好用”,就因为它们能够对他那种扭曲纷繁的模型进行建模。所以你就跟这种人说不清楚,为什么这个语言不好,因为显然这个语言对他是有用的!如何简化模型,已经超越了语言的范畴,在这里我就不细讲了。
我设计Yin语言的宗旨,就是让人们可以用最简单,最直接的方式来对世界进行建模,并且帮助他们优化和改进模型本身。
然而这种思潮是极其有害的,它的害处其实更胜于投靠函数式或者面向对象。没有原则的好好先生们忙着“解决问题”,却不能清晰地看到这些问题为什么存在。他们所谓的问题,往往是由于现有工具的设计失误。由于他们的“随和”,他们从来不去思考,如何从根源上消灭这些问题。他们在一堆历史遗留的垃圾上缝缝补补,妄图使用设计恶劣的工具建造可靠地软件系统。当然,这代价是非常大的。不但劳神费力,而且也许根本不能解决问题。
所以每当有人让我谈谈“函数式vs面向对象”,我都避免说“各有各的好处”,因为那样的话我会很容易被当成这种毫无原则的好好先生。
符号必须简单的对世界建模从上面你已经看出,我既不是一个铁杆“函数式程序员”,也不是一个铁杆“面向对象程序员”,我也不是一个爱说“各有各的好处”的好好先生。我是一个有原则的批判性思维者。我不但看透了各种语言的本质,而且看透了它们之间的统一关系。我编程的时候看到的不是表面的语言和程序,而是一个类似电路的东西。我看到数据的流动和交换,我看到效率的瓶颈,而这些都是跟具体的语言和范式无关的。
在我的心目中其实只有一个概念,它叫做“编程”(programming),它不带有任何附加的限定词(比如“函数式”或者“面向对象”)。我的老师Dan Friedman喜欢把自己的领域称为“Programming Languages”,也是一样的原因。因为我们研究的内容,不局限于某一个语言,也不局限于某一类语言,而是所有的语言。在我们的眼里,所有的语言都不过是各个特性的组合。在我们的眼里,最近出现的所谓“新语言”,其实不大可能再有什么真正意义上的创新。我们不喜欢说“发明一个程序语言”,不喜欢使用“发明”这个词,因为不管你怎么设计一个语言,所有的特性几乎都早已存在于现有的语言里面了。我更喜欢使用“设计”这个词,因为虽然一个语言没有任何新的特性,它却有可能在细节上更加优雅。
编程最重要的事情,其实是让写出来的符号,能够简单地对实际或者想象出来的“世界”进行建模。一个程序员最重要的能力,是直觉地看见符号和现实物体之间的对应关系。不管看起来多么酷的语言或者范式,如果必须绕着弯子才能表达程序员心目中的模型,那么它就不是一个很好的语言或者范式。有些东西本来就是有随时间变化的“状态”的,如果你偏要用“纯函数式”语言去描述它,当然你就进入了那些monad之类的死胡同。最后你不但没能高效的表达这种副作用,而且让代码变得比过程式语言还要难以理解。如果你进入另一个极端,一定要用对象来表达本来很纯的数学函数,那么你一样会把简单的问题搞复杂。Java的所谓design pattern,很多就是制造这种问题的,而没有解决任何问题。
关于建模的另外一个问题是,你心里想的模型,并不一定是最好的,也不一定非得设计成那个样子。有些人心里没有一个清晰简单的模型,觉得某些语言“好用”,就因为它们能够对他那种扭曲纷繁的模型进行建模。所以你就跟这种人说不清楚,为什么这个语言不好,因为显然这个语言对他是有用的!如何简化模型,已经超越了语言的范畴,在这里我就不细讲了。
我设计Yin语言的宗旨,就是让人们可以用最简单,最直接的方式来对世界进行建模,并且帮助他们优化和改进模型本身。