利用计算机的目的是为了解决问题,我们可以将程序看做是解决问题的过程和结果的描述。这跟我们用流程和规范来指导做事并无本质的区别,而且更为简单。因此我们希望计算机有一天能理解我们的自然语言,这样,我们利用自然语言就可以与计算机交流,并指挥计算机做事。但无论是自然语言还是现有的编程语言,都需要计算机能够理解,这种理解与和他人进行交流时的理解也是一致的。因此如何清晰地,准确的对要做的事情进行组织和表达就非常关键。这也从另外一个角度告诉我们,编程的能力和我们日常工作的表达(含组织)能力是相通的。但需要注意的是这种组织和表达,可以是说(语音),写(文字),做和思维的单项或组合。目前编程中的组织和表达主要倾向于文字和思维。这也是有些朋友不太会讲,但会做(编程)的原因。
人类在工作,学习和生活中积累的很多经验,在编程中是非常有用的。因为编程本身就是将我们处理事情的模拟过程数字化而已。因此,在我们编程过程中遇到问题时,我们应该积极主动的向过去(经验)和现在(其他领域)学习。不需要将编程看成是一个神秘的东西。比如,面向对象和面向过程的编程思想,一系列的设计模式等都来自于现实生活。这也提醒着我们,如果在编程过程中遇到问题,可以抛开编程针对计算机的思维定势,看看没有计算机,我们会怎么做。
我们知道对于自然语言来说都包含语音,词汇和语法三要素。对于编程语言来说是基于自然语言的,因此构成上会有些差异,语音是取用自然语言的语音。词汇则比自然语言的词汇少很多。编程语言只有基本的词汇,这个词汇就是我们编程语言中的关键字。同样,编程语言的语法也比自然语言的语法简单很多。编程语言的词汇和语法虽然比自然语言简单很多,但编程语言是非常严格的。一般不允许多义和歧义。
不同的编程语言一般都有自己的词汇和语法,但其实差异并不是特别大,在词汇上:数据类型词汇(字符串,数字等),流程表达词汇(语句,判断,循环),辅助词汇(注释)。语法上的相似性其实更大(可以参考编译原理)。编程语言之间的最大差异,我觉得来自于基本类库(但这本质上又不算语言本身的差异)。而高级语言与低级语言的差别主要是词汇方面。强类型与弱类型语言的差异主要来自于对于数据类型的处理上。主流的高级语言中主要有C风格,Pascal风格等。我们上大学的时候,具体的语言只学了一门,一般的课程涉及到编程都是用伪代码,这种伪代码介于自然语言和编程语言之间。而如果要实践,可以很容易根据伪代码转换成目标编程语言。
基本词汇加上顺序(隐含的),分支和循环三个表达流程的要素就构成了编程语言组织和表达的基础。面向过程和面向对象的最大区别在于程序的组织方式方面。面向服务,面向方面编程更多的则是一种视角的区别。后面会比较详细的讨论到这些内容。
由于计算机本身的特性,编程语言的词汇和语法虽然比较简单,但正是因为这种简单使得编程复杂化,工作量惊人。比如”把订单保存到数据库里",对于自然语言来说,表达很简单。但对于编程语言来说却需要大量的语句来表达(如果直接用01指令来实现,再牛B的程序员要完成这个任务,都不是一两天能搞定的)。因此封装,复用就变得非常重要。
1)如果编程过程中不明白业务如何处理的时候,可以想象手工如何做;
2)提高自己的组织和表达能力对于工作,学些,生活和编程都非常有用;
3)工作和生活中的一些经验模式也可以用于编程设计中。(可以使用场景类比法)。建议在学习设计模式的时候,应该多思考一下实际生活的中的类似场景。
关于设计模式,我前面有很多文章。有兴趣可以参考。