写在前面:

本文探讨学习编程过程中会遇到的一些困境,以及这些问题的背后原因。

在文章后半部,我会介绍我们编程教室即将开展的“学习小组”活动,此活动面向付费学员,你也可以现在加入

如果你对于活动不感兴趣,或者对“付费”排斥,那你可以只看前面或者现在直接关闭文章。但如果你想参与,请务必认真阅读活动说明。我不希望你是因冲动而加入,原因在后面我会解释。


编程学习困境


请思考一下,在你学习编程的过程中,是否有过以下经历,或正在面临类似的局面:

  • 网上有很多资料,不知道从哪里看起

  • 跟着教程一样地做,运行结果就是不一样

  • 也看完了某个教程和视频,似乎明白了,但还是没法自己写代码

  • 想要从事某个方向或者开发出某个软件,不知道需要学什么

  • “入门”了很多次,每次过两个月就又全忘了


“从入门到放弃”不只是一句玩笑话,确实有太多的问题让编程初学者停留在入门阶段。


为什么会这样?


抛开编程本身的难度、思维方式,以及学习环境、学习者的动力等因素之外,我想谈一点常被人忽略或刻意回避的原因:


编程技能不是一个线性的学习过程


我见过不少人会问,某某课程的大纲是怎样,或者你能不能列我一个学习路径,让我能顺着看下去。放在某一个特定的技能点上,这个大纲可能是存在的。但从更宏观的角度来看,编程技能一定是一个网状结构,好比下图所演示:


周,Crossin带你一起学爬虫_java


python语言是其中的一个点,网页前端基础是另一个,数据分析、服务器部署、爬虫、数据结构……都是不同的点。这些点有大有小,有的点展开来,又是由更多的小点组成。这些点之间互相连接,有的是另一些的必要前序,有的则互为关联。


一个程序员脑中的技能图谱,就是各类的技能点,以及点和点之间的关联关系。他会对他擅长领域的那一系列点很熟悉,而当遇到新的问题时,则会寻找必要的新技能点,把它吸收到自己的技能图谱中。


但对于很多新手来说,并不了解这个网状结构的存在,于是就会存在一些问题:

  1. 缺少整体认知,并不了解完成一个任务需要多少相关的知识。比如听人说零基础学习三个月python就可以去做人工智能开发。实际上,python基础只是人工智能相关技能树中非常底部的一个技能点而已,只是完成了这个技能,抬头望向人工智能,自然还是一脸懵。

  2. 学习目标不具体,觉得我按照某个教程学就可以了。这样的问题在于,学了一阵子之后,就不知道自己在看的内容到底是用来做什么的,而且越看问题越多。因为技能树上的节点错综复杂,如果你不是目标驱动型,而是想先按照某个标准“学完”,那很可能陷入信息的泥潭。学习编程的本质是学习“解决问题”,你连问题都没有,要怎么学呢?

  3. 不清楚哪些是必要技能,即使目标明确了,比如我要做一个可联网的微信小程序,在完全没有经验的前提下,依然是难以入手的,只能停留在照搬例子的程度。


以部署服务器为例,如果我写一篇教程告诉你怎么在阿里云的一台服务器上运行你用 python 写的网站,篇幅不会太长,网上类似教程不少。但这里面牵涉到技能点包括 python、web框架、web服务器、数据库、防火墙、域名、Linux命令、权限管理、远程登录……甚至Vim文件的保存都可能让你卡上2个小时(这不是玩笑,StackOverflow上一个如何退出Vim的问题已经有200万次浏览)。如果你不在你的技能树上去点亮这些相关技能,把它们关联起来,而只追求一条从起点到终点的捷径,那对于开发来说几乎是没有意义的。即使你照着教程成功操作,下一次只要出现一点点偏差你可能就束手无策了。


编程学习不是一个单纯的技能培训,达到一定的训练时长就能上岗的事情。它需要学习者主动去思考,如何用代码去解决问题。代码、框架、工具都是手段,解决问题才是目的。有个很流行的10000小时理论:做一件事,只要你坚持10000小时,就会成为专家。但对编程来说,如果你永远照着别人代码抄而不思考,即使学了10000个小时,也只会成为一名极为熟练的打字员。


大学计算机专业为什么要在四年上那么多专业课?目的就是为了给学生建立起这个技能树的基础。相比之下,即使针对某个方向进行短期的培训,点亮几个必要技能点,同样也可以达到完成某个任务的程度,但这两种技能结构的强壮性显然是不一样的。


所以要怎么办?


对于学习者来说,我的建议是:

  1. 明确一个目标,这个目标越具体越好(比如写一个程序每天定时发邮件提醒自己要给女朋友发消息)

  2. 然后以这个目标为终点,反向了解你需要学习的技能(比如需要了解发送邮件、定时任务、python基础)

  3. 最后朝着目标去逐个点亮这些技能点

  4. 回到 步骤1,确定下一步的目标,不断重复这个过程,迭代式地学习。


然而,这里有个矛盾的点。我作为一个初学者,连基础都还没掌握呢,我哪能知道完成一个目标需要哪些技能?


于是只有去找有经验的人寻求帮助,或者去网上寻找相关的指南


学习小组


做编程教室这六年来,解答类似的疑问已经很多次了。我觉得现在有条件给类似的学习者提供一个更完善的解决方案。


之前我做了问卷调查,根据学员的需求,接下来我们会重点在语言基础、爬虫、数据分析、网站开发等方向开展一系列的“学习小组”活动。一个小组相当于一个技能点,里面会设定任务,以及完成这些任务所需的知识点和思路。每次小组的学习周期不会太长,类似于敏捷开发中的 Sprint(冲刺),在短周期内集中完成一个目标。通过这样化整为零的方式,帮你把一棵技能树切分成很多小组,逐个点亮。


我们提供什么?


  1. 给你一个脉络。以我熟悉领域的经验,给你提供一个整体的认知,让你了解达到某个目标应该学什么

  2. 协助你点亮一个个技能点。给你提供学习建议,告诉你怎么学,并在过程中答疑解惑

  3. 任务驱动式学习。不断给你抛出问题,锻炼你解决问题的能力。设定规则,指导并监督任务的完成。

  4. 为学习者提供一个共同学习的组织


目前,小组的开展还在初期,今年下半年预计开展不少于 7 个小组

基础类:①实例学python - ②刷题小组

数据类:③爬虫基础 - ④数据可视化 - ⑤pandas/numpy 学习

Web类:⑥django入门 - ⑦Linux网站部署

(具体小组可能会有微调,见后续通知)


小组学习模式


注意!如果你有意参与学习小组,请务必先确认了解我们的学习模式!


  1. 前面已提到,小组是任务驱动式的学习。主要有两种:一种是我们有设定好的开发任务,你需要在规定时间内完成。我们会提供完成任务所需的参考资料、解题思路,并提供相关的集中讨论、答疑和参考解答代码。另一种是组队刷题/刷书/刷教程,我们会挑选优质的学习资料,在学习期限内共同学习,同样提供集中讨论和答疑。

  2. 无论上述哪种模式,都需要学习者主动参与,而不是被动听课。我们不是培训班。如果没有按时完成任务,会被移出小组。

  3. 考虑到很多学习者都是业余时间学习,所以小组的进度设定不会特别紧,但仍然需要你在一段时间内保证足够的学习时间

  4. 参与一两个小组不可能让你实现质的飞跃,编程学习是一个长期的过程。


所以,如果你没有主动学习的意识、没有足够的学习时间、没有长期学习的心态,请勿参与我们的学习小组,这里恐怕不适合你。我不希望通过夸大其词、虚假承诺来刺激任何学习者冲动付费。参与进来,我们就是要在学习之路上一起走下去的同行者,需要相互的信任,你们走得越远,我们编程教室也就走得越久。所以这也是我在开头为什么说,不希望你因冲动而加入。


爬虫小组介绍


首期我们推出的是 21天爬虫实战小组


另外预告一下,面向零基础的 实例学Python小组也会在近期开启。


适合人群

对网络爬虫感兴趣,或想从事爬虫/反爬/数据分析等相关岗位


所需基础

已经掌握一定的Python基础,对于基础的语法、常用的类型、字符串处理、函数、模块等已经了解,可以通过增加输出和阅读报错信息调试代码中的问题(debug)


适用场景

从网络上采集数据

监控在线信息的变动

对公开数据进行分析或预测

实现自动发帖、自动回复等功能


学完能做什么?

调用网络接口

批量下载多媒体文件

采集大部分网站信息

结构化保存数据


周,Crossin带你一起学爬虫_java_02

小组任务概要


  1. 安装相关工具,了解爬虫,使用 requests 网络请求库

  2. 通过豆瓣 API 抓取 Top250 电影信息,保存至 CSV 文件,并下载电影海报

  3. 用 Chrome 开发者工具分析网页请求

  4. 模拟登录状态和初步的反爬

  5. 利用 bs4 解析网页信息

  6. 结构化抓取信息,综合练习