专栏 | 九章算法程序员
网址 | http://www.jiuzhang.com面试
一般新手程序员会以不一样的方式来表达这个疑问,好比:算法
“我经过在线课程学习了Python,可是我仍是不知道怎么用它来编程。”编程
“我知道这个理论,但是怎么把它运用到个人代码里啊?”小程序
“我知道while循环,但我就是不知道什么时候何地使用它们。”数组
“循环数组变量我都知道,然而我不知道如何将他们组合起来。”bash
如今在咱们来客观的谈一谈这个问题。微信
首先要说的是,若是你以为本身基础都掌握了,可是就是不能在没有他人指导的状况下写出一个程序,那么我只能说你并无真正掌握这些基础知识。网络
我能理解你面对这一状况心里的沮丧,可是你要知道这是成为一名优秀程序员必经的一个阶段,因此即便你有千百个不肯意也不得不面对这个现实。数据结构
接下来咱们就来探讨一下,为何那么多学生会在上完编程课程后不能“顺利出师”,并会针对这个问题给你们一些小建议,但愿能助你在优秀程序员的路上越走越远。
1、形成这一问题的缘由
1.“人造”的编程环境
形成这个问题的一大因素是在线编码课程为学生提供了一个“人造”的编程环境,在这个“人造”的编程环境中学生们一般都会在一个已经包含了指令和提示的网页上练习代码。
然而这并非编程真正的打开方式。因此课程结束后,当没有人再为学生提供这样一个“虚假”“温馨”的编程环境时,面对真正的编程环境,学生们就开始不知所措,失去了目标和方向。
固然,在线课程提供这种“人造”的编程环境并非全然很差的。由于创建一个真正的编程环境一般是很复杂而且在真正的编程环境里进行编程会让初学者感到沮丧。而在线课程提供的这种“人造”的编程环境容许你不用创建起本身的编程环境就能够得到许多编程经验。
然而,这种“温馨的”编程环境虽然在必定程度上减轻了你在初学编程阶段的挫折苦痛,可是它也只是将学习编程的挫折苦痛拦截到课程结束后,等课程一结束,它们就会出如今你面前。
2.过分的指导
当你结束了一个在线课程,或是学习完一本书,或是在现实编程中接受他人建议时,你都能从中获得不少的提示和指导。在这种状况下,你甚至能够在刚拿到一个程序时就能知道你要输入什么甚至知道这个程序的最终结果。
然而当你试图本身创建一个项目的时候,你只能看到一片空白的输入框:没有指令、没有提示、更没有人告诉你下一行要输入什么。像这样从一个简单的环境跳到一个困难的环境,你天然会感到惶恐不安甚至自我怀疑。
接受过分指导的另外一个后果是:学习了语法但没有学习到编程的概念。
语法就是你输入的特定编程语言的文本,好比if和 while。可是每种语言的语法都是不尽相同的,而你在学习编程时,不仅是要学习编程语言的语法,更重要的是要学习他们的概念,好比分支和迭代。
了解概念能让你理解代码实际上能作成什么,以及代码如何用不一样的语言实现。
因此若是有人说他们知道while循环,可是不知道什么时候何地使用它的话,那他们确定尚未真正理解迭代的概念。
可是,我并无说接受指导是很差的。由于当你刚开始学习的时候,你确定须要有人来指点迷津。若是完彻底全自学没有接收到任何建议指导的话,你可能会像一只无头苍蝇同样在编程世界里盲目飞行。
而在你的编程生涯的每一个阶段,你也都须要有人来指导你,可是必定不要接受过多的指导。由于做为初学者,若是接受了过多的指导就会给你一个错觉:编程很简单。这就会形成当你不能成功地独自写出程序时,对本身的编程人生感到怀疑。
九章算法全部在线课程都配套课后算法实战做业,经过 lintcode online judge, 为你创造独立完成代码的良好环境。学完课程后,同步独立完成做业,能够收获意想不到的进步。
2、如何解决这个问题
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和 Pastebin.com 中,而后把相关连接放在问题里。
复制出来的代码格式要正确,而不是简单的复制黏贴。你要学会如何对你的代码进行排版,使它看起来更便于阅读。
举个例子,正确的复制格式它应该是:
def foobar
puts 1 + 2 / 3
end
复制代码
而不是:
def foobar
puts 1 + 2 / 3
end
复制代码
指出你已尝试过的方法。这证实你已经尽力了,而不是有问题没有进行思考就直接扔出来让你们帮忙。
使用正确的编程术语。虽然你还只是一个初学者,并不能将全部的专业术语都使用正确。可是你最好仍是尽本身所能使用正确的专业术语。由于努力学习经常使用专业术语并正确使用它们对你之后的发展也是颇有帮助的。
3、总结
最后总结一下这篇文章所提到的建议
1 给本身建立一个真正的编程环境,使用IDE或者空白文本编辑器(白板)来编写程序。
2 必定要从头至尾本身编写全部的代码,不要在没有理解的状况下直接复制黏贴他人的代码来欺骗本身。
3 从小项目开始作起,编写一些基于文本的程序来练习你正在学习的编程语言,而后再慢慢的进行一些更大更复杂的项目。
4 疯狂的练习,编写大量的代码。在学习理论知识的时候就要不断地尝试把理论应用到本身的代码当中。学习、实践;学习、实践;学习、实践······
5 要先学会本身解决问题,当本身解决无果,陷入困境时,要懂得如何寻求帮助。
6 不要羞于提问或拒绝提问,要懂得运用正确的方式寻求他人的帮助。
毋庸置疑,学习编程并不容易。特别是当你刚刚上完编程课程,开始走上本身的独立编程之路时,这种感受就会更加的强烈。可是请你不要就此质疑本身的编程能力,除了一小部分天才以外,谁不是一步一步从小菜鸟走上大神之路的呢。
最后,在这里也祝愿你们都能在编程之路上愉快的越走越远。