为什么有的人学了那么久编程还是只会写“Hello World”?

  1. 云栖社区>
  2. 大数据前沿>
  3. 博客>
  4. 正文

为什么有的人学了那么久编程还是只会写“Hello World”?

技术小能手 2018-10-15 14:14:39 浏览1064
展开阅读全文

二胖前几天在公众号后台收到了一个读者的留言,他有很多很多学习资料,但就是不知道学什么、也不知道该从何学起,学了很久还只会写个Hello World。

根据我的经验,除了这个问题,很多同学应该还会遇到如下问题:

为什么有的人学了很久很久编程,还是只会写一些简单的算法题?

学了几个月编程,还没有写出超过100行的小项目。

好不容易看完了一本书,合上却发现前面的内容全忘了。

我相信,很多学习编程的同学都想切实地做出一个项目,比如可以真正被使用的软件。

可是很多人搞来搞去,永远都只会写控制台程序,不是动态规划就是贪心。

以上现象你中招了吗?

不要怕,你不是一个人,我刚学编程那会儿也是这样的。不仅是我,我相信还有很多同学是这样,那到底是什么隐形的力量在阻止我们学会编程呢?

我总结了以下几个原因,如果你中招了,可以考虑参考一下解决方案哦。

1

千万不要把刷题和编程划等号

先问大家一个问题,学习编程的你有没有刷过OJ(OJ指在线编程练习)。

我相信大部分人都有过刷题的经历或是现在正想开始刷题。

我曾经也是,一闲下来就迫不及待地打开一些刷题网站不停刷题,今天刷动态规划,明天刷最短路......为了AC一道题,我曾一天都忘了吃饭。

直到有一天,我突然发现了一个问题——我究竟为什么要刷题?

不知道各位刷题是为了什么。

提升编程能力?

如果是这样,那么问题来了...... 

刷题真能提升编程能力吗?

如果能。

那么问题又来了......

什么是编程能力?

你可能又会说:“会刷题!”

噢!恍然大悟,原来刷题是为了提升编程能力,编程能力提升以后刷题就更容易了......

这好像是个无解的问题 ......

不知道各位有什么高见没有,如果有,请务必留言告诉我,谢谢!集思广益嘛。

为了调动大家的积极性,二胖还专门买了一本书送给一位幸运的朋友。

什么书呢?如下图,一本刷题专用的算法书。

f23eb51b2b601717fffbd1d3b2e2a90b9973f042

这本书共400多页,79块钱呢,书已经买好了,二胖还自恋地签上了名,快来参与吧!

谁中奖呢?这次我们玩个透明的方式,由小程序定,随机选。

要求很简单:

只要你是二胖公众号的粉丝就行。

小程序码已经放在文末了,本周日21:30开奖。

好了,绕了一个大圈,先暂且不管这个无解的问题,我们继续聊刷题。

昨天有个读者在公众号后台问我刷题的事情,我想她(没错,是个妹子)可能遇见了我当年遇到过的问题——每日一题。她还问我是否需要多做题,好像她也不知道为什么要刷题,但是就是每日一题......

cfa62195ae9cc31f1169913397c8ef8a3b3b6f8a

好了,我来讲下我对刷题的理解吧。

我先讲一个我和ACM的故事。

首先解释一下什么是ACM,ACM的英文全称是International Collegiate Programming Contest,简单来说就是一个大学生程序设计竞赛。计算机学院和软件学院的同学肯定知道这个竞赛,也有很多人参与。

由于我是被调剂到计算机专业的,所以在大学前对计算机的相关行业并不是特别了解。在我懵懵懂懂地入学时,学校有各种课外社团宣讲招新,其中有个社团就是由ACM爱好者组成的。听完那场宣讲会我只有一个感觉:牛逼的人都参加ACM。

对,我并不是因为爱好,只是觉得参加了ACM就比别人懂得多。这种心理就和高中参加课外补课班的感觉一样,有种私下里偷学了很多知识,看谁都是傻逼的感觉。

所以我报名参加了ACM,可能是因为我大一的时候编码能力太弱,没入选,也就和ACM失之交臂。

我并不是因为当初没被选上参加ACM而“怀恨在心”,才在这里吐槽。我并不是吐槽ACM不好,其实参加ACM对提升思维能力是很有好处的。

我想吐槽的是很多人无理由地参加ACM——从众心理。很多人生怕别人参与了ACM就比自己学得多,所以别人做什么他就要做什么,就像人人都说机器学习牛逼,你就跟着去学,结果什么都学不好。

学习任何一个技能,要么是因为爱好,能从中获得快感,要么能提升自己。

学编程,刷题一定是要的,但一定不是盲目地刷。

第一遍刷题是将你学习的算法和数据结构理论变成实践,强化知识。

刷题有助于我们将抽象的算法转化为具象的代码实现,让我们明白其中的原理。

比如你用C++、Java或是Python把9大算法都实现一遍以后,你就知道其中的原理,之后就没必要再继续刷同类型的题了。

很多搞竞赛的同学会“背代码”,目的就是为了AC题目,因为在打比赛的时候不允许联网,也不允许查资料。而在真实的开发环境中,我们用不着去背代码,随手谷歌百度一下就OK,我感觉背代码很浪费生命。

我们需要培养自己的技术选型能力、方案选择能力,具体是指:

当遇到实际业务和需求的时候,你需要知道在什么场景下使用什么样的数据结构和算法,然后通过查询或调库使用这些算法。

技术是服务于业务的,编程是为了解决问题。

当然,以上言论都是我自己的理解,你可以有不同的看法,但是我不接受反驳。

第二遍刷题是在你找工作面试的时候将各种算法写给面试官看。

为找工作刷题无可厚非。就像高考一样,我们需要一套选拔的机制,面试中手写代码的过程就能直接体现一个人的代码能力。为了拿到一个好的offer,你必须刷题,关于刷题的事情我也在我之前找工作的系列文章中提到过,感兴趣的同学可以自行查看,此处就不过多套路。

以上两点就是我自己“刷题”方式,我大学时就在这两个时期全身心地投入刷题,其他时间我就做其他的事情了,做什么事情呢?后文我们继续聊。

总结一下就是,不管是编程还是任何其他学科的学习,我们一定要明白自己学习的意义,如果仅仅是因为从众,而根本不知道自己为什么要做这件事情,那么还是先搞清楚自己为什么要做,否则很多时候都是在做无用功。

2

死磕原理

死磕原理指的是什么?

举个简单的例子。

大家要是学过树或图的遍历算法,肯定知道最基本的两个遍历方式:

DFS和BFS(这里有北外的同学吗?)其实就是深度优先遍历和广度优先遍历。

不明白没关系,我先简单解释下。就拿最简单的二叉树举例,下面是一个二叉树。

d8697a228871bf8c9d681aa7bf570ba5b5462abb

如果要从A点出发遍历完所有的点。

深度优先遍历就是“不撞南墙不回头”,从A点一直往下走到尽头才往回走,在发现新路后又继续往下走,所以遍历顺序是:A-B-D-E-C-F-G。

宽度优先遍历就是“先走完上一层再走下一层”,所以遍历顺序是:A-B-C-D-E-F-G。

那么问题来了,死磕原理和二叉树遍历有毛关系?

不瞒您说嘞,关系大着呢...

我们把二叉树比喻成一个知识体系。

第一层A代表了你所学的所有的专业知识。

第二层代表大学本科阶段的各个科目,比如B有可能是Python课程,C有可能是算法和数据结构,当然还有很多其他的科目,如高数,英语等,我就不一一列举了。

试问大家一个问题,如果挂了几科第二层的课程,能毕业吗?

好像是不能毕业的。

那现在假设某个同学第二层的课程全部通过得以顺利毕业,他将进入到研究生阶段。

这时候他会选择一个“方向”继续“深造”。

请注意上面红色的词语。

本科生阶段是面向于“面”的教育,就是啥都教给大家;

研究生阶段是面向“点”的教育,是建立在本科阶段对自己专业的整个体系有了初步了解后做出的选择,他可能会选择自己感兴趣的方向继续学习。

所以,如果他选了B方向,那么他将继续攻克D和E。

和学习编程一样,第二层就像是你肯定要学习的编程语言、算法、数据结构等学科,学好它们才能写出一个靠谱的程序。

再往后的第三层,是你可能在研究生阶段主攻的机器学习、人工智能等知识,或是架构方向、图像处理等方向。

”死磕原理“的定义渐渐清晰了:

我们不要一个胡同走到黑,初学编程的时候,一定要多多了解各个学科之间的联系。

人的精力是有限的,如果你一直在一门课上搞啊搞的,缺点有三:

  1. 你很可能很久都写不出来一个像样的程序,自信心受到打击;
  2. 你可能会做很多无用功。一些学科需要其他学科的知识做铺垫,而仅仅在一门课中闭门造车会浪费大量的时间;
  3. 你可能会陷入造轮子的境地。

那到底有什么好的方法可以学习编程吗?

有的!

还是举个例子,我们学数据结构的时候不是有很多已经封装好了的数据结构吗?比如C++中的Vector,Python中的dict、list等,你们有看过它们是怎么实现的吗?

如果你看过Vector的实现方式,你肯定会感叹它的动态扩展内存有多么巧妙。

你自己能把这个数据结构写出来吗?

注意,上面标红的字,正是很多人编程学得慢的重要原因之一。

什么知识都要强调自己能写出来。

我刚学数据结构那会儿也是这样想的,当时我在心中定下一个宏大的目标,要自己实现课本上所有的数据结构。所以我花了很长时间去写一些现有的数据结构,也成功地写出了一些,如平衡二叉树、红黑树......

可真的花费了我很多时间......

我又陷入了沉思......

可以直接用的东西,我为什么要去写呢?

初学的时候,我建议大家还是面向“面”去学习,我们可以了解某个数据结构的内部原理,但先不要尝试自己去实现。遇到一个场景,我们知道选择什么样的数据结构去使用就好。然后学完原理之后,大家就可以学一些算法和一些小的框架了。

不瞒您说,如果只是一味地学习编程语言语法和刷题是学不会编程的。

一定要去看一些框架、做一个项目,然后运用你现在学习的这些知识,把它们融合起来。在实践的过程中你会发现自己还欠缺很多其他的知识,这时你再去有针对性地学习,知识转化率才高。这个项目可以是一个Web,一个App,或者一个爬虫系统。

为了让大家更理解,我举个自己的例子吧,下文图片有点多,但请大家耐心看完。

当时本科毕设,女朋友的老师希望她做一个与高考志愿填报相关的调研。但是她无从下手,这种情况只有我上了。

我的想法是用最直接的方式去展现高校录取的变化规律,可以做一个展示高考录取情况的数据分析网站,绝对亮瞎老师们的钛合金......好像不对,绝对让老师们目瞪口呆。然后我用两周时间搞出了下面这个网站,是边学边搞的,不知道的东西就查。

Web主页:

87711ef0d5f396afe57381941ef8d77afa7a674a

数据查询功能:

603a2c1ecb51b5ac6b06ffa8fdf31149423a3858

数据可视化与对比功能:

02d6072dfe4bf7c35ee1091d4b6465fbf35c6a9e

5606fe92ab543ba55e091dc4e4cab9c61b4cb3dc

这个项目运用到了哪些知识呢?

  1. 爬虫,我抓了上千万条数据,项目完成后我的爬虫技术提高了很多。
  2. 数据分析能力,为了进行数据可视化,我又学习了echarts的使用。
  3. Web知识,可以通过PHP搞出一个网站。
  4. 前端编码能力,虽然我搞的网站有点丑,不过好歹在过程中理解了前端工程师的一些工作。
  5. 数据库,对数据库的使用更加熟悉。

同时,我知道了自己的不足之处,在做项目的过程中快速迭代,不断更新自己的知识,得以进步飞速。

如果你永远刷题刷题刷题,估计等毕业了也还是只会刷题刷题刷题。

3

一口吃成一个胖子

“一口吃成一个胖子”的贪婪心理也是一个阻碍大家学习编程的绊脚石。

还是举个例子:

我们学习一个框架或者学着做一个项目的时候,可能文档或课程说明上会写“学习本课程之前需要先会Java、数据结构、数据库、操作系统等知识”。

但你肯定不是全会啊,怎么办?立马放下这个项目去学习上述课程?

这就是典型的“一口吃成一个胖子”的表现。我们做项目的时候不要怕自己这不会,那也不会。不会先上谷歌百度查一下,或者先直接参考别人的代码,然后自己把问题记下来,后面再去深究。

当你成功做出第一个项目后,你就会大受鼓舞,再去做第二个、第三个,然后就起飞了。

万事开头难。

4

一点建议

一定要采取项目驱动式的学习方法,不管是编程还是其他科目,我们除了系统学习,还一定要建立一条“发现问题,解决问题”的学习路径。

一开始做项目,不用自己去做,先找个别人的项目来看。如果找不到项目,出门右拐github。

顺便给大家推荐一篇我的知乎万赞文章:

这可能是我见过最好的编程指南

看完你会回来给我点赞的。

本文作者:二胖并不胖

本文来自云栖社区合作伙伴“大数据前沿”,了解相关信息可以关注“大数据前沿

网友评论

登录后评论
0/500
评论
技术小能手
+ 关注
所属云栖号: 大数据前沿