软件思考系列之二

软件思考系列之二
                                      —— 该如何来学习程序设计?
邓 辉
万恶之源——复杂性
软件开发所面临的根本问题就是应对日益增加的复杂性,这些复杂性可能来自于软件本身、所涉及的问题领域、参与软件开发活动的人以及协调软件开发活动中各个元素的过程等。当所面临的复杂性超出了人们的理解范围时,就会造成混乱和危机。为了能够有效地降低这些复杂性,人们想出了很多方法。这些方法涉及软件开发的各个方面。举例来说,在过程方法方面,计划驱动方法试图通过遵守严格的过程来降低协调方面的复杂性,而敏捷方法试图加强人之间的沟通、协调以及期望管理来降低人以及问题领域所导致的复杂性。同时,人们也通过提出各种新的程序设计方法和语言来提高自身应对软件本身复杂性的能力。
遗憾的是,我们在学习程序设计和语言时,往往忽视了提高应对复杂性能力方面的内容,而把精力放在了语法等一些低层次的细枝末节之上,对程序设计本身产生了很大的误解。当语言本身存在缺陷、教育不当时,后果就变得更加严重。这种状况对提高我们的处理复杂性的能力带来很大的障碍。在本文中,我仅仅关注于程序设计这个问题,就该如何来学习程序设计展开讨论,希望对大家有所帮助。
认识程序设计
虽然程序最终是运行在计算机上的,但是程序设计本身却和计算机没有多少联系。计算机革命为我们带来的是一场思维方式以及思维表达方式的革命。引用《Structure and Interpretation of Computer program》前言中的一段话就是:
“The computer revolution is a revolution in the way we think and in the way we express what we think. The essence of this change is the emergence of what might best be called procedural epistemology -- the study of the structure of knowledge from an imperative point of view, as opposed to the more declarative point of view taken by classical mathematical subjects. Mathematics provides a framework for dealing precisely with notions of ``what is.'' Computation provides a framework for dealing precisely with notions of ``how to.''”
而程序设计活动正是这种思维活动和思维表达的体现,好的思考和表达方式可以显著降低我们在“how to”时的复杂性。这种活动的核心就是:模块化(分而治之),而达成这个目标的最为有效的手段就是 ―― 抽象。
还有另外一个非常重要的问题和能否有效地学习程序设计密切相关,那就是表达设计所用的实现语言。一个程序设计如果没有通过实现语言表达出来,如果不能运行和验证,那不是真正的设计,用UML画出来的图示也不是真正的设计,只不过是一些粗糙的想法。程序设计必须用实现语言表达出来,才是真正的、准确的设计。因此,实现语言本身的特性会直接影响到学习的效果。
程序设计语言
一门优秀的程序设计语言不仅仅只是提供一些指挥计算机去完成某些任务的手段。这门语言必须也要是提供一个框架,在这个框架中我们可以组织我们的思想。因此,在我们学习一门语言时,应该特别关注于该语言提供的“组合简单思想去形成复杂思想”的手段。同样,用《Structure and Interpretation of Computer program》中的话来讲:
“Every powerful language has three mechanisms for accomplishing this:
 primitive expressions, which represent the simplest entities the language is concerned with,
 means of combination, by which compound elements are built from simpler ones, and
 means of abstraction, by which compound elements can be named and manipulated as units.
    ”
其中,“means of abstraction”是最重要,最值得学习和关注的一点。好的程序设计语言,可以使你把精力放在如何去构建更好的抽象上去,并且为你提供了一种自然的表达方式,而不会使得一些无关的细节干扰你的思路和表达。
在开始学习程序设计方面,C族语言表现的最为糟糕。因为作为初学者,你无法把精力放在程序设计本身的学习上去,而是被许多语言的细节和陷阱困扰,大部分精力都花费在如何解决语言为你设置的障碍上去。看看我们所学习和阅读的东西吧,其中要么就是琐碎的语言语法细节,也就是primitive expressions层面的东西,要么就是一些语言的缺陷所导致的陷阱,要么就是一些稀奇古怪的语法分析(比如:“i+++++++++”,请告诉我结果。),要么就是提出一个错误的问题(比如:C语言中,两个指针能相加吗?),然后长篇大论的进行解释。在这种学习和教育氛围中,听到“什么OOP、AOP都一样,最终不都是二进制吗”之类的话就不奇怪了。
在程序设计学习方面:Lisp、Smalltalk、Ruby、Python是首选的实现语言。如果有正确的教育C++也还不错。Java、C#这些中间过渡语言也还行。C、Basic、Fortran最差。等真正掌握了好的程序设计思想模式之后,再去学习其他东西就会事半功倍。
语言对于学习程序设计的影响实例研究
Lisp、Smalltalk、Ruby和Python
C++
Java、C#
C
待续. . . . . .

发布了28 篇原创文章 · 获赞 1 · 访问量 17万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章