返回到【全文目录】
目录
3.1 学习计算机,从编程入手
程序是计算机的灵魂
学习计算机绕不开程序设计
用编程进入计算机世界
计算机的神通广大,已经是有目共睹。
赞叹着计算机的神奇,我们不禁要问,这个穿越了时光隧道来到我们身边的人造精灵,究竟为什么会有如此强大的功能?计算机是从何处“学”得了如此多、如此高深的本领?
现在要隆重请出的,是英雄的主角——程序。正是有了程序,计算机在与棋王卡斯帕罗夫的周旋中取得胜利,模拟空战得以惟妙惟肖,计算机能听会说,互联网光芒四射。
时至今日,我们所用的计算机,都称之为冯•诺依曼结构的计算机,由运算器、控制器、存储器、输入设备、输出设备五类基本设备所组成。这些部件各尽其职,提供了各种复杂的功能。计算机要完成不同的任务,需要的就是这些功能的组合。计算机能提供的资源,分为硬资源和软资源,就是我们常说的硬件和软件。
硬件,港台地区称“硬体”,英语中称为hardware,直译就是“五金”。在我小的时候,五金店都算得上是大商店,而现在都是小铺面,里面买的东西,是生活中必需的各种工具、部件和劳动防护用品。计算机的硬件,也都是这些摸得着看得见的东西。不论是体积庞大的超级计算机,还是摆在办公室和家里的台式机、可以随处携带的笔记本电脑,以及形影不离的智能手机,我们能够看得到的,都有一个外壳,里面装着电路板,电路板上有集成电路,集成电路上有各种器件和线路。就这样装配好的计算机,只是一个没有活力的躯干,徒有一身硬功夫却没有用武之地。要让它具有活力,就要激活它、操纵它,让它按照人的意志工作。
与硬件的名称相对应,那些使用计算机的技术资源,我们将其统称为软件,港台地区称为“软体”,英语中称为software。一个人,如果只有躯体,而没有思想,无法将其称为一个完整的人。软件就是计算机的“思想”的载体。正是由于有了丰富多彩的软件,才能够让计算机的硬件提供的功能得以应用和发挥,存储大量的信息,进行高速的运算,以此组合出更强大、更复杂、千姿百态的功能。
软件的核心是程序,计算机的工作就是执行计算机程序。计算机程序,就是人们为使用计算机解决某种问题,用计算机可以识别的指令,编制成的指令序列,清楚地指示计算机每一步该做什么的工作。根据指令的安排,计算机完成了人要求它做的工作。开始学习编程的同学要知道这样的内幕:
计算机程序在幕后干的这些事情,如果不去想永远不知道。事实是,如果没有程序,计算机什么事情也做不了,缺少了程序的打理,计算机只能是一件摆设。
程序,不愧是计算机的灵魂!
程序的“水平”越高,计算机就越能干,越聪明。具有高速处理能力的计算机硬件加上“聪明”的程序,使计算机有了强大的功能,千变万化的程序使计算机无所不能。
程序是由人设计出来的,设计程序的工作常被人称为“编程”,从事编程工作的人就是程序员。计算机无论有多么神奇,都是执行人编制的程序,按照人的意图行事的,程序的水平高低完全取决于设计程序的人的水平。让它怎么干,它就怎么干,这是一件非常过瘾的事情。当我们抛开这个小孩过家家的想法,换上一种说法,设计程序是一件非常具有创造性的工作。
学习计算机的人,一般都从程序设计学起。程序设计的能力是从事相关研究、开发的基本能力。通过学习程序设计,会逐步了解计算机的工作原理,会逐渐领会到计算机机械化、自动化地完成任务的本质。这种以程序设计优先的入门学习模式被广泛采用。会使用一种程序设计语言,会解决一般的问题之后,渐次地围绕着程序设计的方法、解决问题需要的算法、计算机内部结构与工作原理、工程组织方法等各个专题,学习一些课程,借此形成一定的知识结构,掌握学科的思维方式,一位合格的专业人才就此走向社会。
这种程序设计优先的方式并不是学习计算机的唯一方式。比我大十岁左右的那一批人学习计算机采用过一种算法优先入门的模式。有的人是在大四的时候,才有机会见着了真的计算机,才有机会将自己编的程序在真的计算机上运行。他们的程序已经先在自己的大脑中“执行”好了,才有机会使用昂贵的计算机,追求的是一次就出正确结果。这种方式由于我们社会的进步和条件的改善已经不再使用,但这给当代大学生的启示是,编程更加注重人本身,而不是一说编程就必须独占一台计算机。
也有少部分人采用硬件优先的入门模式学习计算机。先从电路、计算机组装或计算机硬件系统开发入手了解计算机,再继续学习高级程序设计等。这种模式常见于微电子、电子信息系统、通信等专业的学生,以及一些业余的计算机爱好者。
由此看来,要学习计算机,绕不开程序设计。这可是愁坏了在学习编程中打不开局面的同学。于是有人写信来问:“想在IT行业发展,但是不学编程,可以吗?”
有大量非计算机类专业的人员在IT行业从事工作,从这个角度,“可以不编程”是一种回答。行业中有大量的如营销、策划、客服、信息采集、编辑等非技术岗位。这些岗位上的人员在工作中不需要编程。但是这些岗位需要其他方面的知识和技能储备。相关人员大多没有学过编程,他们走进入IT行业是发挥的是他们自己专长。
学习了计算机类专业的,但在工作中不编程的,大抵有两类人:一类转岗去了非技术岗位,另一类做的是比编程更加宏观或抽象的工作。转岗去了非技术岗位的,又有两种情况:一种是本身在其他方面的能力、优势更强,能在其他岗位上发挥着更大的作用,另一种是技术水平实在不行,无奈选择而已。这两种情况的差距是显然的。从事比编程更加宏观的工作包括担任项目经理、产品经理等技术管理类工作的,也包括从事架构师、系统分析师等高级技术工作的。不少计算机研究人员日常的工作中,从事理论、算法等抽象层次的研究更多一些,看不到他们需要编写多少代码,在团队中有人为他们写程序,要知道,这些人是很擅长编码的,只是不需要他们亲自去编码而已。有一点值得注意,“可以不编程”和“可以不会编程”是两回事。
用纯粹不编程的岗位和专注于编程的岗位进行分类,走的是两个极端。实际上,IT行业的工作大多是有一定技术含量的,编程能力放在那里,就是镇山之宝。有编程能力,可以做得更好,而不会编程的,人手不够也能顶一顶,但其中的差别不是一点两点。例如,负责计算机系统、网络系统运行和维护的运维人员中,有人通过分析系统运行中出现的效率问题,通过命令行或编写脚本程序,为几千台机器组成的机群做系统优化,这样的人编程功夫一定不弱,只不过是没有去做写程序的工作罢了;而有的运维人员却只会做换个内存、配个网卡之类的工作。两种运维人员的不可替代性,包括从工作中能够得到的回报,相差甚远。当遇到行业波动时被动应对的人会是谁,也就很显然了。
一些人洒脱地表白:我将来搞硬件开发,不学编程了;我毕业后就去卖电脑,不用编程的。诸如此类的观点还可以有很多。我们要正视的是,提出了“学计算机是否可以不编程”问题的人,一定是在编程中遇到了困难,这是问题的根本。在编程学习中遇到了困难,是很正常的现象,但要想办法克服。学会了编程,这个问题就解决了。人生的奋斗刚刚开始,专业的学习刚刚起步,不必到处给自己找一个“可以不编程”的理由而放弃这份突破。有人声称对编程不感兴趣,大多只是没有投入地编程,没有体会到编程中存在的乐趣而已。在编程中不起步、起不了步,很多的时候是让一些人的言论拽住了脚步,被自己的畏难心理统治了心灵而已,还有什么“码农很苦逼”、“逻辑思维差”、“女生不适合”,不去试一试,永远不知那河水有多深,不去搏一把,舒服地泡在持续加热的温水中,那不应该是年轻人的选择。
既然已经是计算机类专业的学生,要将学业进行下去,程序设计优先的模式是当前的共识,学会编程,绕不开。一位大四了还不会编程的学生被分配到我的手下做毕业设计,在我的“高压”政策下,依靠他的努力,做出来了要求的设计。他意识到了自己是能编程的,对编程也是有兴趣的。他后来没有如预先打算的那样被迫转行,而是悔恨为什么没有早些行动起来。有位做了高管的学生说,他就用编程中练出来的指挥计算机工作的思维安排公司的事务,那不是一般的条理清楚。
学计算机,先学会编程,这是一个常识。至少,学习了计算机类专业而不会编程,这是一件说不出口的事。
有的同学在编程学习开始时吃了苦头,赌气说:“学会编程的都是非人类!”其实编程语言都是标准的人造物,更何况使用编程语言写程序呢。编程学习,对大多数大学生来讲,是进入大学后的一件新鲜事,需要去适应。找到了方法和节奏,学会编程就会是件顺理成章的事。放弃成见,卸下包袱,找到方法,困难的时候顶一顶,就和《料理鼠王》中小老鼠雷米信奉的名言“Everyone can cook”一样,我们可以见证“Everyone can code”!
对大多数计算机类的大学生,程序设计能力的培养是在大学刚开始就起步的。要修读的课程名称通常称之为“×语言程序设计”,所用的语言有C、C++、Java、Python,各有道理。这门课程属于专业基础课,是几乎所有专业课程的“先修课”,以掌握一门程序设计语言,熟练运用其语法和语言功能,掌握程序编码、调试到最终成功运行的完整过程为培养目标。在学习过程中,学生要通过对具体问题进行分析、进行初步的算法设计和编码的训练,具备基本的算法设计和编程能力,并通过实践训练,培养学生规范的程序设计风格,严谨的程序设计思想。
在程序设计课的支撑下,后续的课程将逐步拓展专业知识和能力,学习第二门程序设计语言会紧随其后。编程语言有很多,各有其适用性,发展也很快,一个优秀的IT从业人员要有能力使用几种编程语言工作,并且要有能力在需要的时候自学新的语言;为了能描述更复杂的数据,以及设计出高质量的程序,要学习关于数据结构、算法设计和算法分析的知识;学习编译过程和技术,关注的是语言处理的一般理论和技术,也使学习者对编程语言的理解达到一个新的层次;在操作系统中,会学到管理和有效利用计算机软、硬件资源,以及为用户提供交互操作界面的各种技术方法;计算机图形学、并行计算等课程,学习的是特定领域中的算法与程序设计方法。实际上,对于计算机组成原理、计算机体系结构、微机原理、嵌入式系统、计算机网络等这些所谓偏重于硬件和系统的课程,到处也是编程的味道。
这是大学中围绕编程能力的发展制定出的学习路线。大学课程有一定的衔接性,后面的课程需要用到前面的课程作为基础,而程序设计是所有专业课的基础。后续所有的专业课程都是建立在会编程的前提上的。不少课程的考核是不需要用写代码的形式体现的,很多编程基础不扎实的学生得到了及格或更好的分数也能够理解,但是他们的所学不能和编程联系起来,学得的知识就是空洞的。编程学习的起步不顺利,可以理解,暂时也可以接受,然而这个问题要尽早解决,越早越好。
狭义地理解,编程就是写出代码。要求初学者会运用某一种特定语言的语法规则,根据别人设计好的算法,写出求解问题的程序,完成调试、运行,这是编程的初始阶段的基本要求。广义地讲,一切和IT有关的事情都是编程。时下不少IT学子知道编程的重要性,然而在口口声声重视的“编程”中,仅仅只是将目标定格为学习某一门语言,而忽视其他更为重要的思维和方法的训练,这是一种非常有害的理解,在深入学习中应当纠正过来。
学会编程,就是找到了一条通往计算机世界的路径,我们的脚步可以借此通向更远的前方。和IT行业内的人士交流,复杂性、效率、架构、模式等等一系列的术语贯穿其中,这些需要在围绕编程的学习中去体会。学会程序设计的过程,是对计算机内部工作机理和计算机作为一个系统的理解过程,编程,是登堂入室的台阶。
学会编程,是计算思维习得的过程。通过丰富的程序设计的经历,抽象、理论、设计的基本学科形态得以建立,计算科学和计算机工程中需要的知识和技能由此累积。编程能力的提高,不仅是对在校学生的要求,在相关岗位上工作过程,也是编程能力进一步持续提高的过程。IT技术人员可以吃的老本,不在于哪种语言运用有多熟练,而在于计算思维所支撑的学习能力和解决问题的能力。
学会编程的过程,也是对一个人品质塑造的过程。面对扑面而来的上百个错误提示不慌不忙,一一排除;面对成百上千行,甚至更多代码行中潜在的运行错误,哪怕就是只在偶然的情况下才出现的微小错误,也能长时间专注其中,直至bug现出原形;有不达目的不罢休的偏执,也有知错即改的坦然,有沉浸其中的稳重,也有投身创造的激情。这样的品质,经过了编程学习过程的历练才能得到,成为未来应对一切挑战的底气。
学会编程,真不是会写那么几个语句那样简单。学会编程,其意义也并不仅在于会编几个程序。
返回到【全文目录】【下一节】