基于自然语言的软件工程和程序设计(中)
软件发展至今无论是编程语言还是软件工程乃至是互联网的趋势发展都是飞速发展。于是我们便迷茫于这样形形色色的语言和概念之间无所适从。其实我们不妨返璞归真回到最初让我们从语义出发来讨论这形形色色的种种你是否恍然大悟呢5. 面向过程是先总后分的行文顺序相信大多数程序员都和我一样C语言都是自己的第一门语言那么面向过程的这个概念也自然深入人心。其实我相信每个人心中的思维都是面向过程的。“我们应该先干嘛再干嘛”。这是每个人在做一件事情前的常规思维编程时也是一样我们在实现一个方法或者在完成一个功能时都会去想应该先做什么再做什么然后我们会相应地把一个方法拆分成若干个子方法这就是我们传统的面向过程的编程。我们把这种方式称之为“自顶向下”的编程思维。在做一件事情之前我们要了解这件事情是什么然后再去想这件事情应该怎么做。这种与我们常规的对应叫做记叙文说得难听一些我们可以称之为流水账。我们不妨说得偏激一点面向过程的核心不在于方法而在于过程。面向过程本是没有方法的后来为了可读性才增加了方法这个概念。本就是辅助当然可有可无。概括起来面向过程的编程方式是先总后分的行文方式先知道总体意思再逐条去写。6. 面向对象是先分后总的行文顺序逐渐地我们开始接触了Java,C#等面向对象的语言但是我们是否却始终没有办法扭转思维来找到如何来面向对象呢抑或是我们经常为了面向对象而面向对象呢我们究竟错在了哪我就是按照常规的语义来分析整个的项目那为什么无法面向对象呢错只错在我们解析语法的角度出现了问题。在上文中我提到了我在高中时非常常用的一种记叙方式就是我会在文章的题记前先把开场的主人公全部都陈列出来其中包括他们的主要性格以及简要概括他们的陈年往事。如此做的原因是因为文章的故事结构比较复杂。那么我会做的是首先在提纲上列去所有的主人公然后想清楚他的主要性格之后再去根据他的性格来为他设定一些事件最后根据这些事件安排这些主人公的出场顺序以及人物之间的关系。这也得出了我对面向对象的核心思想的概述以人为本。这里的人不仅仅是人是指所有存在的生物乃至非生物。换句话说所有需要有行为的物体。可以是人可以是计算机甚至可以是一个衣柜。面向对象的核心不在于业务逻辑的过程而在于找到所有的“人”然后知道每个人都能做什么最后我们再把这些行为加以组装而已。概括起来面向对象的编程方式是先分后总的行文方式在文章伊始每件事情都不知道自己是在干嘛只是在表达着自己。知道最后才会发现原来这些事情的作用是这个样子的。有这样一本书叫像堆积木一样做软件。我不清楚这本书的内容是什么但是这个题目很形象面向对象的基础实现过程实际上就是在做积木每个积木都不知道自己未来会干嘛而当积木都做好了之后堆积木就变得简单而易行了。7. 并发式编程是交错式的行文顺序随着软件对性能要求的逐渐提升并发已经成为了我们不可回避的话题从Erlang到C#4.0的并行库再到显卡编程的盛行并发编程已经逐渐走到了我们的面前。在高中时有一种文体非常盛行我也曾多次尝试最后的分数也还不错。这种问题是在行文时分别描述两件事情或多件事情这几件看上去毫无关系只是由每一段的ABCDabcd等不同的符号来标识然而这些事情到最后却揭示的同一道理或者是最后他们在同一场景汇聚来构成了故事的结局。这种文体在新概念作文大赛上屡有出现。其实这就对应着我们常规意义上的并发编程。每件事情和每件事情之间从局部上没有着直接联系但是最后宏观上他们都是在为了做同一件事情达到同一个目的。就像装配脑袋某天在群里讨论的冒泡排序的并发版——奇偶排序一样从微观上对奇数排序和对偶数排序没有必然联系实则他们在完成着同一项工作。8. 重谈总体行文我一直在编程中都很强调一点语义的重要性完美的编程语言应该是与自然语言完全对应的可以把一篇文章翻译成与之对应的计算机语言发展到那时程序员就真的变成了翻译工作只需要把对应的需求文档无需设计翻译成计算机认识的一串串代码就可以了。我们究竟如何分析一个软件需求。在我看来软件的创造过程实则就是语义的分析过程。当拿到一份需求时按照面向对象的软件工程思想我们应该首先做到提取出这份需求文档中所有的“主人公”然后找到这些主人公每个人都可以干嘛能干嘛要干嘛。然后为之建立模型。这是面向对象的过程。然后是每个行为的分析过程要做这个行为我们要先怎么做再怎么做为这个行为建立相应的流程图这是面向过程的分析过程。接下来我们可以分析某个行为怎么做是否可以一边干嘛一边干嘛。这是面向并发的建模过程。当我们要描述某个算法时我们可以说这个算法要怎么做只是基于语义的描述例如斐波那契数列要用第一个数加上第二个数这其实就很有可能是一个函数式编程的产生过程。最后是组装也就是堆积木的过程。我们的积木都已经做好了我们只需要按照不同的业务逻辑去把这些积木搭起来就可以了。也就是说当我们建立一个项目时首先建立人物传记面向对象然后对人物的经历进行描述面向过程。最后成文时我们可以用交错式行文方式对其重组并发式。那么好我们概括下整个的过程面向对象分析--面向过程分析---在过程的细节上并发或者函数式---组装时再次考虑并发。9. 小议过时说经常会听到这样的声音未来是面向服务的未来是面向对象的面向函数的面向过程已经过时了之类的话。其实看过我上面的分析过程一个完整的工程只靠着某一种编程范式是行不通的一个工程的搭建需要的是各种范式的配合使用每种范式都有着它所擅长的部分。就像面向对象再好用也无法脱离了面向过程而单独存在哪怕你的原子拆分得再细也无法逃开对每件事情进行分析的过程况且还有着业务逻辑组装过程的存在。而面向函数面向并发再强大他也无法取代面向对象在分析一个大型项目中自底向上这样巨大的优势。因此任何编程范式皆无过时说。就像语言之争一样每种语言都有着其合适的应用范围谈语言优劣过时与否我觉得毫无必要。下文简介在下文中我会对对全文进行一个总体的总结以及语义与面向对象的关系设计模式与语义的关系并且会浅谈个人认为未来语言的发展方向等等敬请关注谢谢。