作为一名青椒,这几年在大学的教学工作做下来,发现无论是计算机专业的学生,还是把编程作为公修课的其他专业学生,很多人内心都有一个灵魂拷问——为什么我认真听课,认真看书书,几个月甚至一年下来但还是写不好代码?!
为什么学了很久很久编程,还是只会写一些简单的算法题?
为什么学了几个月编程,还是写不出哪怕100行的小项目?
为什么好不容易坚持看完了语法,却发现内容全没记住?
我是不是天生和编程无缘,写不出代码是不是就必须放弃编程?
以上现象你中招了吗?
不要怕,你不是一个人,我刚学编程那会儿也是这样的。不仅是我,我相信还有很多同学是这样,那到底是什么神秘的力量在阻止我们学会编程呢?又该如何打破这个魔咒呢?
一、降低目标:明确学编程的目标和初衷
首先我们要想明白自己为什么学编程,学到什么程度为止。这个问题根据不同的身份,会有不同的答案。如果你是一名计算机专业的学生,那自然要建立完整的知识体系,从算法到数据结构再到各类框架,都是要进行系统学习的。这时候你的学习目标是整个体系,要求自然会高,过程自然会慢,我们在这篇文章里不展开讨论,我们今天主要讨论一下针对非计算机专业的学生——学编程的核心到底是学什么?
实际上,学习编程,对大多数非计算机专业的人来说,就是在当前这个时代,获得一种直觉——在学习、工作、生活中碰到问题时,可以大概的判断这个问题或想法是否可以交给计算机解决,并在这个过程中逐渐建立一个看待世界的新维度、新视角。
因此,我们要降低对编程的要求,我们不能要求自己做到像专业的程序员那样从无到有从零到一百的去搭建一个完整的项目,这不符合我们跨专业学编程的初衷,就像你学数学,学化学,学物理,但你并不会做个数学家化学家物理学家。
我们的目标是能将问题从编程的角度建模,并且能利用网络资源,开源代码等快速找到需要的模型,进行修改和调试,然后解决自己的某个小问题,这就足够了。
二、以练为学:编程不是知识,而是一门手艺
我们从小到大的学习都是学习知识,流程一般是课前看书预习,上课听讲,下课做作业,然后复习考试。但是学手艺可不是这么学的。回忆你小时候学游泳,学乐器,学开车。需要记忆知识体系掌握各类原理和知识点之后再开始练习吗?显然不是这样的。
教练是不是就强调一点:别废话,练就完了!
回归到线上编程本身的职能定位,不管是当前主流的录播模式,还是各类花哨的互动网课,又或是实时直播的方式,其实本质上都无法构成学习编程的全部客观要素。这是因为任何课堂本质上,终归都是一种入门方式和辅助手段。而我们想要真正掌握一个技能掌握一门手艺,都是要通过反复的练习、实践,不断的反馈迭代,才能越来越熟练,最终完全掌握。正如格拉德威尔所说,“1万小时的锤炼是从平凡变成大师的必要条件”。
就像开车和学英语一样,你想要熟练掌握,就要在学的时候放弃速成的想法,慢慢来才是最快的。编程和其他技能类似,唯有更多的练习,才能让你形成思维习惯,掌握各类建模的套路,甚至变成条件反射和肌肉记忆。
编程和投资理财一样,期待收获和成长时,要时刻提醒自己铭记复利思维:不怕进步小,就怕停下脚。这也是所有“手艺”学习的通用思维。持续的使用和持续的思考,会让你对这个陌生领域的理解逐渐加深,会把散落的知识点逐渐在练习的过程中,织结成网,最终融会贯通顺手拈来。开始也许每天的进步很小,小到你自己很难察觉到。但是这个时候只要咬牙坚持住,假以时日,你就会收获复利带给你的成果。
当然练习也要遵循一定的技巧和规律,不能毫无计划,也不要冲动盲目。那么该如何进行有效的学习和练习呢?
三、知识爆炸的年代,坚持三个不要
现在这个知识爆炸的时代,任何领域都有大量的资料,也有大量的前人做的很好的基础工作,甚至是伟大的成果。那么我们如何进行更有效率的学习呢,我认为坚持三个不要:
不要学什么都先买本教材,试图系统的从头读到尾。特别是在编程领域,最好的资料莫过于官方的文档,最全面也最权威,而且在持续的更新。但即便是官方文档,我们也没有必要从头到尾顺序阅读,你会发现你读着读着,前面读过的内容居然又更新了,气人不气人,永远读不完。正确的方法是当做工具来用,当做字典来用。互联网和搜索引擎就是你的脑力补充,在这个信息爆炸的时代,掌握如何检索知识远比如何记忆知识重要的多。
不要随便拿篇文章就读,不比较、不思考的阅读,就是在挥霍时间。知识爆炸和自媒体导致的另一个问题,就是网络上各类内容质量参差不齐,谬误百出。如果你阅读的代码或者文章质量低下,甚至是充满错误,那很可能不只浪费时间,还会带来错误的引导,甚至会让你离初衷渐行渐远。因此阅读的时候一定要花时间鉴别和选择优质内容,我们要时刻考虑时间成本,机会成本和沉没成本。
不要过于“勤奋”,什么都自己从头开始搞。互联网的红利之一,就是共享和迭代。我们要善于利用互联网上大量的开源项目,大量的共享代码。站在别人的肩膀上,总不会太矮。同时我还建议大家也积极共享自己的成果,除了可以给别人提供便利,也可以收获大家的反馈,进而提升自己的能力。
想明白这些之后呢,问题就变得简单了,具体到跨界学编程这个领域,我总结出来以下几个小技巧,大家可以参考一下。
1、语法很重要,但无需逼迫自己记忆之后再写代码。回忆上小学你第一次学写作文的时候,是不是还有很多字不认识,词汇量也很小,甚至一篇文章一大半都是拼音?老师不会等我们掌握了所有常用字,学会了严谨的语法之后,才让我们写作,是不是?编程也是这个道理,语法记不住没关系,参数含义记不清也没关系,重要的是我们要赶紧动手写起来,遇到记不清楚的语法我们可以翻课件,查官方文档,问老师,问同学。一次两次不会,三次五次记不清楚,但我相信十次八次之后,你一定可以记住了,就算记不住,也知道去哪可以快速查到解决方案。
2、用电脑之前,先用人脑。编程和写作很像,网络上有大量的资源可以参考借鉴,有大量的开源社区可以供我们拿来利用,但不假思索的复制一千篇文章,仍然对你的写作几乎毫无帮助。因此,同样的,这个模式要千万要避免,很多同学直接复制别人的代码,点下运行发现报错,然后就直呼太难了我放弃或者直接去提问‘代码跑不通怎么办?!’。这个是学编程中的大忌,问题出在哪里呢?因为缺少了思考的过程。
首先要思考去哪里检索,优质的、专业的内容社区要比泛泛的撒网更有成效也更节约时间。然后要带着思考看代码,看懂你复制的这个代码是如何构建的,之后才是动手去修改和调试。运行出了错误,仍然是继续思考这个错误反馈的是什么问题,如果解决不了要进一步去谷歌百度,看看大家是怎么解决这类错误的。
只有不断的投入思考,练习才有意义。你快速进步的过程,不是复制代码,而是不断的自己去解决问题,直到调试完成,得到你想要的结果。
3、使用目标驱动的方法,采取验证学习的策略。把教材和官方资料当做字典,看书查资料是辅助,动手才是主动。极端一点,甚至可以除了必要的文档,其他一律不看。先把编程的基础语法都亲自动手逐一完成一遍,最简单的办法就是看一个知识点之后马上去验证。验证不是指看着示例代码敲一遍,而是跟实战一样的,自己设想一个用到这个知识点的问题场景,然后试着修改示例代码去解决自己的提问。
四、比编程更重要的,是编程思维
日常教学中,时不时会有同学绝望的给我说,“无论如何努力,一写代码就头大,一看程序就懵圈,实在是没办法,可能是和编程天生八字不合......”那是不是不写代码真的就得放弃编程了呢?答案是否定的。
《Computational Thinking》作者就曾倡议,计算机科学的教授应当为大学新生开一门称为“怎么像计算机科学家一样思维”的课,面向非专业的,而不仅仅是计算机科学专业的学生。因此事实上,写代码只是一种向计算机传达信息的方法,而真正重要的,不是代码如何写,而是你是否具备“编程思维”。
举个简单的例子,如果你不会开车,是不是就不能从北京到上海了呢?显然不是,只要你知道从北京到上海是有路的,是可以跑汽车的,你即便不会开车,也可以让别人开车载你去,对不对?真正可怕的,不是不会开车,而是你不知道有车,不知道有路,不知道从北京到上海有多少种可达途径——即不知道这个问题的数据结构和算法思维。
如果说我们现在的问题是“在北京,想去上海”,那么我们其实都会自动的调用大脑的程序思维,例如我们会先把问题建模,输入条件是“出发地北京,目的地上海”,其中的常量是“出发时间,出行人数”,变量是“不同的交通工具和出行方式”,判断条件为“预算费用,到达时间,天气等等”,最后我们会根据常量,依托条件,筛选和改变变量,最终输出一个“从北京到上海的出行方案”,要求更高一点,你可以优化算法,得到一个时间、预算、精力均衡的“最优出行方案”。你看,面对简单的问题,我们不自觉的就已经在调用编程思维了。
然而面对一些复杂的问题的时候,我们就需要主动的,有意识的去培养和应用自己的编程思维,计算思维,从而能够将复杂问题进行有效的拆分,降维,从容有序的去解决。正如《写给所有人的编程思维》一书中所说,编程的核心,不是编程语言,也不是语法,甚至不是算法或数据结构本身。而是如何分解问题,从中发现规律,建立解决问题的模型,映射到合适的数据结构和算法上,然后才能写程序实现。
也就是说,写代码是最后一步,也是最没有技术含量的一步,重要是前面的思考和建模的过程。
因此,如果你对写代码厌烦至极,你大可以把最后这个繁琐的劳动交给我们计算机专业的人去“搬砖”,你只需要清楚的知道你想要什么,正确的利用编程思维,将你的问题进行建模和映射,那至于代码本身,只要你向程序员传达,就可以得到自己需要的代码了,将来这也许会成为一个服务,成本也会越来越低,甚至就像你出门打车一样方便。
乔布斯乔帮主说,每个人都应该学习编程,因为它教会你如何思考。那么如何先抛开代码,训练自己的编程思维呢?复杂的数据结构该如何理解呢?如何将各类抽象的算法映射到日常生活中去呢?又该如何把工作学习中的问题进行拆解建模,选择合适的解决框架呢?
为此,我们会推出一个“编程思维”的专题,在这个专题中,我们不讲代码,而会给大家逐个将计算机编程中的抽象概念,用大家都能理解的方式进行解读,力求能够让非计算机专业的人,都能更轻松的掌握编程思维。欢迎大家持续关注。
网友评论