自从村上春树写了《当我谈跑步时我谈些什么》什么之后,”当我们在吃饭的时候我们在吃什么”之类的各种文章出现了很多。村上在谈“我”的时候没什么问题,因为他怎说自己那是他自己的事。但是,如果我们写“当我们”的时候就问题大了,因为“我们”不知道特指谁,关键是你会发现这个“我们”显然、突然、竟然不是“咱们”。所以,当我看到《当我们在学习编程的时候,我们在学什么》的时候,作为初学者的我只能对某些文章叹为观止了,它对某些资深程序员可能帮助是巨大的,也展示了作者大量的思考与实践,非常棒。我这篇仅仅针对初学者给若干老生常谈的小建议。所以,本博客标题应该是《对CS新生编程学习的若干老生常谈的建议》
既然是老生常谈,很多观点就不再详细论述,简单粗暴一点吧。
第一建议:学编程首先要编程
学编程首先要编程。这很废话,是吗?那么,请问,在学编程的时候新生们真地动手了吗?至少,我知道很多同学没有!我记得就这个学期,开学两周后,我问过一个同学,学编程了吗?答:学了。再问:写了什么程序?答:在看书,还没写程序。完蛋!这是学习编程的错误方式。
第二建议:学编程要面向问题
CS专业是一个面向问题、分析问题、解决问题,并探讨解决问题的洞见的一门学科。所以,在写完第一个HelloWorld程序之后,就应该面向问题编程。
作为初学者,特别是知道一些基本概念的初学者会抗议,算法是以后学习的内容,为什么我才学编程就要我懂算法,我算法贼差了。不是如此的,就好比父母教孩子讲话,肯定不是从语法教起,而是针对某个目的教孩子如何表达,然后逐步教如何组织话语,而写作文是很久之后的事情。题外话,很可能你们大部分的作文都不如一个两岁孩子的话更具有目的性!
这个建议的言外之意就是编程不面向语法!唉,语法不对编译都不通过,你好意思让我不面向语法。我只是建议不要面向语法学习,没让你编译不通过嘛。能编译通过是容易的,编译通过了程序不按常理出牌是更痛苦的.....
第三建议:学习编程也是学习计算机基础知识的过程
很多同学不理解,为什么要学习二进制、知道变量的长度,不理解为什么我经常强调使用黑乎乎的小窗口在命令行下工作。基础知识而已,并不是什么怪癖或者高要求。顺便吐槽一句,新生培养计划竟然没有了数字逻辑这门课。也许是”我们又不学习设计芯片“、 ”硬件知识没必要学太多“等的论调的结果吧。我非常不认同,基础知识就是基础知识,该学的还是要学。
再比如”黑乎乎的小窗口“其实代表的时候操作系统的基础知识,除了Windows,我们不是还有Linux、Unix吗?
从学习基础知识这个意义上看,CS新生学C语言绝对是首选。
第四个建议:程序 = 数据结构 + 算法
从这个意义上看,初学者在基本语法稍微掌握之后,最好的训练方法就是进入到基础数据结构:数组、排序、栈、队列等等。且慢,这不是大二的课程吗?你要求怎么这么高?建议而已。如果有更好的训练手段,随便用。
第五个建议:编程需要规范
规范对我们意味什么?死板!对了,该死板就死板,一点都不能乱。死板意味什么?高效!规范包括:格式、注释、命名。
很多吐槽,注释不知道写什么啊,狗屎一样的程序还写那么多注释。说得倒也没错。但是,你们应该这样安慰自己,注释过的程序好歹是注释过的狗屎,而那些牛皮哄哄的程序员写出来没有注释的程序就单纯只是狗屎而已。相信我,如果你的HelloWorld程序没有注释,过两年你也会忘记这个程序是干啥用的。
第六个建议:编程学习是一个长期且艰苦的过程
这个我就不懂了,因为我一直以来都是编程的初学者,学了几十年还只是掌握一点点皮毛。不通过长期艰苦的训练想成为好的软件工程师,不可能!这算个什么建议?劝不学的建议。大一也许某些同学还在犹豫是不是要努力,一犹豫下去大二直接就放弃,准备混文凭了。放弃是一种内力、外力相互结合的并深思熟虑的结果。遗憾的是,放弃之后你可做的选择太少。
这个建议可以作为一个参考指标,那些对自己的成功还抱有期待的同学也不妨衡量一下吧,你真的付出了很多努力在编程吗?如果没有,真的不要羡慕别人的成功了。咸鱼就应该有咸鱼的态度,多跟我学摸鱼吧。