程序设计思维

这个题目很大,而我只想谈谈自己对于《SICP》的一点思考。

《SICP》的全名是《Structure and Interpretation of Computer Programs》,中文译名《计算机程序的构造与解释》。这是MIT的一本经典教材,一本编程世界几乎人尽皆知的魔法书。我看了很久,还没有看完。。。但是每次看都感觉有收获,掩卷而思都会有点心潮澎湃,今天尤甚,在火车站等车的时候看得入神差点没赶上车,囧。

我今天就不介绍这本书的内容了,这些等我读完了再来做个全面的介绍,这次我只想把今天看书的收获记录下来。

《SICP》里有很多示例代码,我一开始老看着别扭,今天我对这个别扭的原因进行了深入的思考。在给出代码前,它会先对这个程序要解决的问题以及解决的方法进行适当的描述,然后就是代码,这个时候你会感觉这段代码几乎就是对上面解决问题的方法的一种Scheme(本书采用的语言,Lisp的一种方言,具有很好的函数式特性)风格的描述,但是里面用的这些子函数到底是在哪里定义的啊,怎么就突然拿来用了呢?正当百思不得其解的时候,继续往下看,它就会对这些子函数的实现进行描述,然后给出代码。

我之所以觉得别扭,是因为我平常写程序的时候都是想着怎么才能一步步实现这个功能,然后开始编码,如果之后在写别的代码的时候发现跟之前写的代码有一些可以共用的部分,就把共用的部分提取出来进行封装,向外提供调用接口。这种方式我想应该是大部分人的思维方式。但是在《SICP》中并非如此,由于Scheme支持函数式编程,抽象粒度更细(以函数为单位,而不是对象或者类),所以作者是站在一个很高的抽象层面上看待问题,理清问题的脉络,很快地给出一个原型,这个原型已经解决了问题,但是它还不能运行,因为其中还有许多没有定义的函数。接着再使用同样的方法,把这些子程序看做一个个单独的问题,像之前一样分别理清思路,定义好这些子原型,这些子原型中可能还会用到一些没有定义的函数,再重复上述过程,一直到所有代码都能被Scheme解释器理解执行。这种思维可以看做是一种递归式的思维,自上而下去看待问题,所以说函数式编程中递归真是无处不在啊。运用这种思维写出来的代码具有很好的模块性,分层清晰,可读性高又易于扩展,很多子模块将来都可能用到,就感觉,明明是为了写应用,一不小心写了一堆库。

《SICP》的精髓在于合理的抽象和管理复杂度,我觉得这也是编程和软件工程的精髓。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

编程的智慧特点

  编程是一种创造性的工作,是一门艺术。精通任何一门艺术,都需要很多的练习和领悟,所以这里提出的“智慧”,并不是号称一天瘦十斤的减肥药,它并不能代替你自己的勤奋...

3376
来自专栏知识分享

3-学习GPRS_Air202(需要知道的关于Lua的一些基本的知识)

1985
来自专栏养码场

若你想入职面试阿里系公司,不妨看看这位资深Java的面试经

上上周分享了占小狼面试阿里系的面经文章:《一位资深Java的阿里系公司实战面试经验,套路还是面试官的多》 ,蛮受大家欢迎的。看到大家在社群里的好评与点赞,占小狼...

2102
来自专栏企鹅号快讯

Python从零基础到精通!小白也能学会!

引言 Functional Programming(函数式编程)的概念最早起源于LISP,由约翰·麦卡锡在1958年创立,最早提出了自动垃圾回收的理念,这一理念...

2115
来自专栏

消失的魔术:隐藏在js引用和原型链背后的超级能力

js这门语言有很多诟病,然而很多被无视的点,构成了js最为美妙的语言特性。这篇文章将带你走进魔术般的引用型数据类型和原型链背后,寻找那些被遗忘的超能力。并且,基...

1202
来自专栏人工智能LeadAI

python与数据科学应用

数据科学简介与应用 数据科学主要以统计学、机器学习、数据可视化以及(某一)领域知识为理论基础,其主要研究内容包括数据科学基础理论、数据预处理、数据计算和数据管...

3805
来自专栏数据科学

面向过程到面向对象再到面向函数

拿到问题,识别输入输出,脑海里先产生一个实现输入到输出的大致思路。 如果这个开始按着思路去实现代码,就会写出一堆处理过程,这个时候,程序只有原始的输入输出和中间...

3572
来自专栏WeTest质量开放平台团队的专栏

有的UE画不好PPT,好的测试却靠Python加薪

                 测试开发者的共同关注! 作者:jhouyang,腾讯资深后台开发工程师。 WeTest导读 想要升职加薪,强大的专业能力很...

1694
来自专栏web前端教室

a=b=c,但a不等于c?这是什么鬼

昨天在网上乱翻资料,发现一道题,很有意思,是这样婶的, var a = {n:1}; a.x = a = {n:2}; console.log(a.x); 答案...

2705
来自专栏CDA数据分析师

人生苦短,为什么我要用Python?

本教程的目的是让你相信两件事:首先,Python 是一种非常棒的编程语言;其次,如果你是一名科学家,Python 很可能值得你去学习。本教程并非想要说明 Pyt...

723

扫码关注云+社区

领取腾讯云代金券