相信很多初学编程的朋友都有这样的苦恼:为什么我感觉自己基础都掌握了,但是学校的课程结束后再进行编程时还是什么都不会呢?
通常新手程序员会以不同的方式来表达这个疑问,比如:
“我通过在线课程学习了Python,但是我还是不知道怎么用它来编程。”
“我知道这个理论,可是怎么把它运用到我的代码里啊?”
“我知道while循环,但我就是不知道何时何地使用它们。”
“循环数组变量我都知道,然而我不知道如何将他们组合起来。”
现在在我们来客观的谈一谈这个问题。
首先要说的是,如果你觉得自己基础都掌握了,但是就是不能在没有他人指导的情况下写出一个程序,那么我只能说你并没有真正掌握这些基础知识。
我能理解你面对这一情况内心的沮丧,但是你要知道这是成为一名优秀程序员必经的一个阶段,所以即使你有千百个不愿意也不得不面对这个现实。
接下来我们就来探讨一下,为什么那么多学生会在上完编程课程后不能“顺利出师”,并会针对这个问题给大家一些小建议,希望能助你在优秀程序员的路上越走越远。
一、造成这一问题的原因
1.“人造”的编程环境
造成这个问题的一大因素是在线编码课程为学生提供了一个“人造”的编程环境,在这个“人造”的编程环境中学生们通常都会在一个已经包含了指令和提示的网页上练习代码。
然而这并不是编程真正的打开方式。所以课程结束后,当没有人再为学生提供这样一个“虚假”“舒适”的编程环境时,面对真正的编程环境,学生们就开始不知所措,失去了目标和方向。
当然,在线课程提供这种“人造”的编程环境并不是全然不好的。因为建立一个真正的编程环境通常是很复杂并且在真正的编程环境里进行编程会让初学者感到沮丧。而在线课程提供的这种“人造”的编程环境允许你不用建立起自己的编程环境就可以获得许多编程经验。
然而,这种“舒适的”编程环境虽然在一定程度上减轻了你在初学编程阶段的挫折苦痛,但是它也只是将学习编程的挫折苦痛拦截到课程结束后,等课程一结束,它们就会出现在你面前。
2.过度的指导
当你结束了一个在线课程,或是学习完一本书,或是在现实编程中接受他人建议时,你都能从中得到很多的提示和指导。在这种情况下,你甚至可以在刚拿到一个程序时就能知道你要输入什么甚至知道这个程序的最终结果。
然而当你试图自己建立一个项目的时候,你只能看到一片空白的输入框:没有指令、没有提示、更没有人告诉你下一行要输入什么。像这样从一个简单的环境跳到一个困难的环境,你自然会感到惊慌失措甚至自我怀疑。
接受过度指导的另一个后果是:学习了语法但没有学习到编程的概念。
语法就是你输入的特定编程语言的文本,比如if和 while。但是每种语言的语法都是不尽相同的,而你在学习编程时,不只是要学习编程语言的语法,更重要的是要学习他们的概念,比如分支和迭代。
了解概念能让你理解代码实际上能做成什么,以及代码如何用不同的语言实现。
所以如果有人说他们知道while循环,但是不知道何时何地使用它的话,那他们肯定还没有真正理解迭代的概念。
但是,我并没有说接受指导是不好的。因为当你刚开始学习的时候,你肯定需要有人来指点迷津。如果完完全全自学没有接收到任何建议指导的话,你可能会像一只无头苍蝇一样在编程世界里盲目飞行。
而在你的编程生涯的每个阶段,你也都需要有人来指导你,但是一定不要接受过多的指导。因为作为初学者,如果接受了过多的指导就会给你一个错觉:编程很简单。这就会造成当你不能成功地独自写出程序时,对自己的编程人生感到怀疑。
九章算法所有在线课程都配套课后算法实战作业,通过 lintcode online judge, 为你创造独立完成代码的良好环境。学完课程后,同步独立完成作业,可以收获意想不到的进步。
二、如何解决这个问题
1.创建一个真正的编程环境
每种编程语言需要的编程环境都是不同的。
想要创建一个真正的编程环境,首先,你需要一个文本编辑器或一个IDE(集成开发环境)。然后你需要找出对你正在学习的语言来说最适合的编辑器并安装它。
其次,你需要知道如何创建并运行一个包含代码的文件。
如果你是使用一个IDE来作为你的文本编辑器,例如:Visual Studio、Xcode或Eclipse,那么这个功能就会被构建到IDE中。你就需要了解如何创建一个新项目以及需要点击什么按钮来运行代码。
但是如果你没有使用IDE,那么你可能就需要学习如何利用命令行来运行代码。你可以找一些入门指导或者上YouTube看一些免费的教学视频来学习使用命令行。
最后,一旦你可以编写代码,并且能够正常运行程序,那么基本上你就开始正式步入专业程序员的道路了。
2.从刷算法题开始,疯狂积累代码量
当你还是一个新手的时候,你需要疯狂的积累你的代码量,你可以从基本的问题出发,做一些简单的问题,怎么输入数据,怎么输出数据,然后熟悉各种数据结构,各种常见算法,疯狂的刷题。
比如,lintcode 就是一个很不错的刷题网站。不会怎么办!看答案。推荐在这里对照查看lintcode算法题的答案:http://www.jiuzhang.com/solution/ 。先了解答案是怎么写的,然后自己实现一遍。
一般来说,刷题应该循序渐进,从易到难。你可以先从easy难度的问题做起,每一个程序也就20-40行左右,甚至你可以一旦AC,反复提交,以增强自信心,虽然这只是一个玩笑,但是它可以让你提高你对编程的自信,对编程的喜爱,当你有自信的时候,你才能真正的把一件事情做好。当你反复解决一个又一个的问题的时候,你要告诉自己我是个天生的编程者!然后你就可以挑战更高难度的问题,当你积累到10W以上的代码量的时候,你会发现你会有一个质变。一切将变的顺手。当以前要想半天的语句,现在信手拈来。恭喜你跨出了很重要的一步。
3.从小项目做起
尝试去做一些稍微超过自身水平的项目并不是一件坏事,因为你可能会发现它很有趣并且它能激励你学习更多的东西;但是从另外的角度来看,如果浪费了不少时间项目却毫无进展,也会让你感到灰心、沮丧。
一千个人就有一千个哈姆雷特,适合别人的方法不一定就适合你。所以当激励法对你起反作用的时候,也许你就该考虑从基础的小项目做起了,毕竟所有东西都是从零开始的。
刚开始的时候,你可以编写一些基于文本的程序,因为编写这种程序比编写其他程序相对来说更容易一些,它只需要掌握:如何在屏幕上显示字符串;以及如何获取用户输入的字符串。
确实基于文本的程序写出来并不像3D图形的程序写出来那样酷炫。然而如果你想要写3D图形的程序,你就必须对集合、线性代数和微分都有一定程度的了解。而即使是写出一个带有按钮和文本框的普通GUI也是很难的,更别说写出一个3D图形的程序了。
当然这也一定程度上取决于你所学习的编程语言,也许你所学习的编程语言不需要你懂多少数学,但是需要你多多少少对面向对象的程序设计和复杂的对象图有较为深入的理解。
我的建议是:先设计一段时间的文字游戏。比如做一些像“猜数字”、“多选题”等小游戏来进行一场小小的文字洗礼;又或者,设计一些可以在现实生活中派上用场的小程序,可以是一个时间跟踪器,又或者是在你的学习或工作上能够帮助到你的计算公式;然后你就可以通过这些小项目来深入学习你所选择的编程语言的所有特性。
4. 练习白板写代码
你必须不需要任何指令地从零开始编写自己的代码。也就是说你要从一个空白文档(白板、白纸等)开始,然后在不听从任何指示的情况下自己敲出每行代码。
从这一步开始意味着你已经准备好迎接腥风血雨了。因为后面你将花费大量的时间进行调试,并要尝试理解每个bug。但是在每次检测和修复bug的时候,你的编程技能都能得到相应提高,并且你也能获得真正的编程经验。这就是作为程序员学习和成长的方式。
当然你也可以通过查看别人的代码来获取经验,但是你不能直接复制黏贴,因为如果你直接复制黏贴的话,这样的学习将毫无意义。你要做到的是:认真分析别人的代码;得出它是如何正常运行的结论;然后再运用获取的经验来进行独立编程。
5.不懂就问:懂得如何寻求帮助
在学习编程的过程中,你肯定会遇到一些你自己无法解决的问题和一些你无法靠自己修复的错误。虽然这只是你学习编程的一部分,但如果你已经花了2h+来尝试解决你的问题未果时,为了提高工作效率,就应该转向寻求专业帮助了。
然而有些学生在学习编程时会在没有尝试过自己解决问题的情况下立刻寻求别人的帮助,这不管是在IT领域还是其他领域,都是不被赞成的。因为不管出现了什么难题,都要自己先去尽力解决才有学习的意义。不然最终还是回到了“靠着别人的指导过活最终自己什么也没学到”这个问题上。
那么我们应该如何寻求帮助呢?
基本的问题你可以先google一下,网络世界那么大,单靠这个你就能解决不少问题。
如果你遇到一些靠个人之力无法解决的问题,要注意的是即使他人帮助你解决问题,也不要直接把别人的答案复制黏贴到你的问题上。你要做的是分析答案并了解错误背后的原因,只有这样当你下次再遇到相同的错误的时候,才能靠自己修复错误。
另外,如果你经常遇到一些靠个人之力无法解决的问题,最有可能的原因是你做的项目太大了以至于远远超过了你的自身水平,这里就要重申一下上一条建议:从小项目做起,一步一步提升自己的水平。
6.正确的提出问题并寻求帮助
也经常会有初学者羞于提问或拒绝提问,很大一部分原因是他们认为编程社区里面的那些大神有些不友好甚至态度有些令人生畏,所以他们不想跟这些人打交道,这对于初学者来说是非常可怕的事情。
其实,虽然有些专业的程序员会在回答时有些“直言不讳”,但是如果你以正确的方式提出你的问题,你会发现社区里的很多大神是非常友好的,并且他们往往能够一针见血的点出你的问题所在,同时能给出解决方案。
如果你根据下面的指导提出问题,肯定可以吸引很多友好的程序员帮助你解决问题。可能还能防止一些虽然脾气有些暴躁但是很善良的程序员一边帮你解决问题一边对你发脾气。
发布出确切的错误点。这是最重要的一个部分,因为如果回答问题的人没看到确切的错误信息,就意味着他们要浪费自己的时间来找出你的程序的错误所在再给予解决方案。
如果你也不知道确切的错误信息,那么请说明你推测的会发生错误的部分,和实际发生的情况。比如:“我希望输出5,但却实际输出了7”。通常,问题不出现在你的代码中,而出现在你期望和实际的差异中。所以如果你没有阐述你期望得到的结果,你能得到的回答就只有类似“这代码看起来很好啊”或者“这代码有什么问题啊”这样的回答。
粘贴出你的所有代码。一般情况下,看不到完整的代码来调试问题是很困难的。如果代码不是太多,最好的提问方式就是将代码完整粘贴到Github Gist和 http://Pastebin.com 中,然后把相关链接放在问题里。
复制出来的代码格式要正确,而不是简单的复制黏贴。你要学会如何对你的代码进行排版,使它看起来更便于阅读。
举个例子,正确的复制格式它应该是:
def foobar
- puts 1 + 2 / 3 end
而不是:
def foobar
puts 1 + 2 / 3
end
指出你已尝试过的方法。这证明你已经尽力了,而不是有问题没有进行思考就直接扔出来让大家帮忙。
使用正确的编程术语。虽然你还只是一个初学者,并不能将所有的专业术语都使用正确。但是你最好还是尽自己所能使用正确的专业术语。因为努力学习常用专业术语并正确使用它们对你以后的发展也是很有帮助的。
三、总结
最后总结一下这篇文章所提到的建议
给自己创建一个真正的编程环境,使用IDE或者空白文本编辑器(白板)来编写程序。
一定要从头到尾自己编写所有的代码,不要在没有理解的情况下直接复制黏贴他人的代码来欺骗自己。
从小项目开始做起,编写一些基于文本的程序来练习你正在学习的编程语言,然后再慢慢的进行一些更大更复杂的项目。
疯狂的练习,编写大量的代码。在学习理论知识的时候就要不断地尝试把理论应用到自己的代码当中。学习、实践;学习、实践;学习、实践······
要先学会自己解决问题,当自己解决无果,陷入困境时,要懂得如何寻求帮助。
不要羞于提问或拒绝提问,要懂得运用正确的方式寻求他人的帮助。
毋庸置疑,学习编程并不容易。特别是当你刚刚上完编程课程,开始走上自己的独立编程之路时,这种感觉就会更加的强烈。但是请你不要就此质疑自己的编程能力,除了一小部分天才之外,谁不是一步一步从小菜鸟走上大神之路的呢。
最后,在这里也祝愿大家都能在编程之路上愉快的越走越远。