《程序设计与数据结构》电子版是周立功教授数年苦心经营的成果,已免费分享给电子工程师和大学团体,在微信官方账号回复【程序设计】后即可在线阅读。书籍内容出版后,电子行业出现了学习热潮。本微信官方账号经周立功教授授权,从今天开始连载本书内容,愿意分享。
第一章是程序设计的基础
在学习编程的时候,很多初学者往往会陷入这样的误区,总是把阻碍个人成长的原因归结为机会的缺乏。其实问题的根源在于缺乏方法论,很少有人把“知道是什么,知道为什么”作为自己的学习标准,进而远远没有掌握很多编程风格。
其实编程中的数据结构和算法都是围绕着各种类型的数据和需求来开发的,完成这些任务的载体是各种变量。所以,只要我们抓住变量的三要素(即变量的类型、值、地址)并贯穿其中,所有问题都迎刃而解。
1.1思想的力量
《思想者》是法国雕塑家罗丹创作的一座雕像,他强调了它的核心内涵——思想,人的综合思维。尤其是在20世纪初,人们把它视为改造世界的力量的象征。显然,思想的力量是巨大而无限的。无论是做大事还是做小事,都和思想息息相关。
1.1.1过程主题
1.限制和抽象
结构化编程的“限制”和“抽象”是人类处理复杂软件的有效方法之一。为了使程序简单易懂,Edsger Dijkstra主张禁止使用goto,将程序控制流程限定为“顺序、分支、循环”三种组合。虽然面向结构的编程实现了控制流的结构化,使程序流结构化,但是要处理的数据却没有结构化。虽然面向过程的编程降低了程序的复杂性,但是随着数据类型的增加,管理程序处理内容和数据对象所带来的程序复杂性也越来越高。
当一部分计算任务需要独立实现时,可以定义为一个函数,因为它可以实现计算逻辑的分离,利用函数名使代码更清晰,利用函数使同一代码可以在程序中多次使用,减少了调试程序的工作量。
因为实际应用中可能用到成千上万个函数,为了得到正确的结果,需要保持处理和数据的一致性,所以人们想到了数据抽象技术。数据抽象是数据和处理方法的结合,数据的处理和操作必须通过预定义的方法进行。所以面向过程的编程引入了模块的抽象概念,所以可以说程序是由模块组成的,模块是由功能组成的,一个模块就是一个过程。由于不同结构中的数据是由函数或进程管理的,所以在设计程序时可以对这些模块进行抽象、设计、编码和测试,最后将这些模块有机地结合起来,形成一个完整的程序。
2.函数分解方法
通常解决复杂问题的方法是从分析问题开始,把一个大问题分解成几个小问题和子模块,从而解决每个小问题,实现每个子模块。最后,这些子模块由主功能按照一定的顺序调用,组织业务逻辑流程,最终解决问题。从这样的问题出发,用算法作为基本构件构建复杂系统的开发方法,称为结构化或面向过程编程。
如何编写更容易应对需求变化的代码?与其写一个大函数,不如让它更模块化,也就是用模块化来封装变更。虽然模块化有助于提高代码的可理解性,使代码更容易维护,但模块化并不能治愈一切,因为模块化有两个问题,即低内聚和高耦合。
假设您想给main中调用的每个子进程添加一个参数,以传递一些额外的信息。同时,每个子过程都必须将这些信息传递给自己的子过程。这种现象被称为连续变化。系列变更是指某一个流程的变更会传递到它的子流程,这些子流程会一直延续到所有分解层次。显然,面对软件维护,包括软件测试、调试和升级,自上而下的设计方法有着致命的缺陷。由于面向过程编程强调从软件的功能特性出发进行思考,所以将系统划分为若干功能模块,模块之间的耦合度尽可能的小。其实这种方式并不能很好的模拟现实世界,它的思维方式有着固有的缺陷。
在面向过程的编程中,我们经常会遇到这样的问题,一个bug被修改了,另一个又出了问题,所以很多bug都源于修改代码。其实理解代码的运行原理,发现bug,防止不良副作用,需要花费很多时间,但是修改bug的时间很短。副作用引起的bug最难发现。如果一个函数处理很多不同的数据,一旦需求发生变化,就会出现更多的问题。需求变化会对软件开发和维护产生很大的影响,因为只关注功能会导致一系列不可避免的变化。
由于用户的需求总是在变化,我们无法阻止这种变化。与其抱怨变化,不如改变开发流程,这样才能更有效的应对变化。这就是面向对象编程是如何作为抵抗软件复杂性的一种手段出现的。
1.1.2思维差异
学习的最高境界是“知其所以然”,但真正达到这个境界的人并不多,这是每个人人生的梦想目标。如果你已经进入了这样的转型,那么所有的问题都会迎刃而解。将不再受年龄限制,与性别无关。
其实牛和普通人的差距不是知识和经验的多少,而是思维方式的不同。为什么编程语言、操作系统、控制论都是美国人发明的?他们似乎天生就有自上而下分析问题的直觉和由特殊到一般的概括思维。美国之所以在当今IT领域处于绝对领先地位,完全是因为教育的结果。
我们常常嘲笑美国白领计算能力差,认为中国教育重在练“基本功”,掩盖了忽视培养学生“创造力和思维能力”的问题。但美国教育非常重视“创造力”的培养,让学生根据个人兴趣去学习。比如拿六个学期的物理和数学来说,只有两个学期的化学和生物。不仅可以在学校上大学课程,大学还认可学生在高中学习大学课程的学分,甚至可以利用假期学习任何大学感兴趣的内容,比如哲学、Java等。
中国的教室应该举手,而美国的教室鼓励言论自由。中国的教育采用灌输,考试采用填鸭式;中国的考试处于危险状态,单人单桌,主监考和副监考戒备森严。美国教育善于激励学生,不断推动他们提出新问题。美国经常参加开卷考试,一周之内就可以交。中国考试的主要目的是为了淘汰,而美国考试的目的是为了找出自己的不足,检查和填补空白,以利于未来的发展。
如果中国学生不同意老师的结论,他们会受到批评,而在美国课堂上,他们会受到表扬。中国学生盲目崇拜老师和权威,美国老师喜欢和学生聊天。他们是好朋友。中国的中学生一年上八个月的课,每天在学校的时间在11个小时左右。而美国学生一年只有1000小时左右,学校时间短,课业负担轻,让他们有更多的空闲时间去做自己感兴趣的事情。
由于缺乏创造力和思维能力的差异,我们对许多问题的理解出现了大量的知识盲点或黑洞,从而将严格的科学知识分离开来,成为一个孤立的知识孤岛。即使你非常努力地学习,甚至花更多的时间在企业实习,仍然很难取得更大的突破。
在自我训练的过程中,我深深体会到,对问题的学习往往会感受到传统思维的影响。《异形》一书指出“人们眼中的天才是非凡的,不是因为它在天赋上超群,而是因为它做出了不断的努力。一万小时的磨炼,是任何人从平凡变得不平凡的必要条件。”我开始觉得很迷茫,因为我花了一万多个小时。
在微信官方账号后台回复关键词【程序设计】,可以在线阅读整本书。
微信官方账号介绍
致远电子官方微信微信官方账号,拥有500名工程师的研发测试分享平台,为您提供电子行业领先的产品技术和解决方案。
1.《知其然知其所以然 周立功:知其然知其所以然,为学习之最高境界》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《知其然知其所以然 周立功:知其然知其所以然,为学习之最高境界》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/fangchan/705212.html