先给你讲个故事, 看看你有没有类似的经历.
有一天, 你去参加同学聚会, 和老友们举杯畅谈, 他们告诉你, 不学编程就要 out 了, 从全球趋势来看, 编程这把火已经烧了很多年. 英国早从 2014 年 9 月起, 就规定 5-16 岁的学生都必须学习编程, 苹果 CEO 库克表示全世界各地都应该开设编程课程.
回到家中, 你辗转反侧, 觉得自己跟不上时代潮流, 扼腕叹息:"廉颇老矣, 尚能饭否?" 焦虑之余, 你开始疯狂搜索编程, 百度, 知乎, 搜狗, 你方唱罢我登场. 一顿操作之后, 你的嘴里念念有词:"Wow, 会编程的人好酷, 牛逼, 都是大神." 感叹之余, 你觉得不能纸上谈兵, 临渊羡鱼, 不如退而织网. 于是乎, 你开始了自学编程之路. 听人说, 算法是编程的核心, 学好算法可以一招鲜, 吃遍天. 别人说在嘴里, 你听在心里, 马上买了一本《算法导论》, 打算死磕算法. 你没日没夜的攻读,'算法基础'那一小章, 你鼓捣了大半个月, 还是云里来雾里去的.
然而, 心高气傲的你是不会屈服于'算法基础'这只拦路虎的, 你开始逛各种论坛, CSDN, 博客园, 简书, 知乎都在你的常逛 list 上. 你充分利用一切碎片时间, 上地铁刷一下, 吃饭时刷一下, 睡前刷一下, 刷得不亦乐乎, 刷不完的果断收藏. 等到收藏超过 100 篇未读的时候, 你终于发现收藏 = 永不再读, 这让你沮丧. 更让你沮丧的是, 你买的那本《算法导论》已经在书架上躺了好久. 为了弄懂'算法基础', 你把《算法导论》打入了冷宫. 比这更残酷的是, 从你信誓旦旦说要学编程以来, 你连一行代码都没敲过, 一个程序都没跑起来.
你越来越焦虑, 终于有一天, 你彻底崩溃了, 自怨自艾道:"老子骨子里就是个文科生, 赶什么时髦? 学什么编程? 学来学去老是做无用功有意思吗? 安安静静地写文章不好吗?"
写文章的人不一定学不了编程, 作家王小波就是中国早期程序员, 曾经自己编了一套 DOS 下的独立输入法. 真正阻止你学编程的也不是深奥的算法, 而是你错误的学习方法. 自学编程不等于做无用功, 盲目, 焦虑地自学才是. 读到这里, 你肯定满脸疑惑:"我到底哪里做错了?"
首先, 自学的初衷不是焦虑, 盲目, 而是解决问题. 李小龙当年刚回香港, 在《欢乐今宵》上节目, 节目组请来了一名拳师, 想考验他能不能推到对方. 拳师也摆好架子等他来推, 结果李小龙一拳打在对方脸上. 李小龙想表达的是: 在真实的实战中, 没有人会等你摆好架势, 只冲着你规定的地方打过来. 学习也是同样的道理. 在真实生活中, 环境和知识都一直在动态变化中, 你不可能像学校里一样, 系统的学好, 学完一门知识, 然后坐在教室等着不超纲的考试. 大部分时间, 生活会先给你一个考试, 然后你根据问题, 自己找出关键词, 开始学习. 所以, 学习的起点不是某人在酒桌上蜻蜓点水的一句话, 也不是某人在朋友圈晒的一本书, 推荐的一篇微信文章, 更不是这个行业的一个经典教材引发你的焦虑, 而应该是你真实遇到的一个问题. 遇到问题, 动手写, 犯错, 改正, 再犯错, 再改正, 这是学编程最重要的过程.
其次, 自学尤其是自学编程往往不是线性的. 我们从小到大在学校学习, 都有一本教科书, 往往按着预习, 听讲, 练习, 复习的路径学习, 所有的教材也如出一辙: 每个章节所涉及的知识点之间, 全都是线性关联, 第一章学好了, 才有基础学第二章. 而社会的知识结构不仅不是这样的, 而且几乎全都不是这样的. 工作中, 生活里充满了各式各样的 "提前引用", 即想要理解当前的知识点, 需要依赖你未来才能理解的某个或某些知识点. 如果还是按照校园时代的线性思维来学习的话, 很有可能就像故事中的主人公一样, 最终学不下去. 拿编程来说, 动不动啃《算法导论》的人, 要不是有很深厚的数学基础, 肯定吃不消. 生活很少教我们按部就班, 它给我们的测试往往是超纲的, 这就要求我们不断更新和迭代. 互联网的发展给我们带来的最大启发就是迭代, 从门户到搜索, 从搜索到移动互联, 从简单的网页交互, 到如今热闹的小视频社交, 技术和生态一直在更新和迭代. 同样, 自学也是一个不断更新和迭代的过程. 编程是一门活到老, 学到老的手艺, 有些很抽象的概念, 一开始看不懂没关系, 先脑子里有个大概的印象, 然后依葫芦画瓢写几段代码, 自己动手实践, 写完之后再总结, 归纳, 整理, 组织相关的知识点, 实战经验多了, 再回头来看最初的难点, 你自然能够豁然开朗. 比如说 python 中的 return, 很多初学 python 的人, 对 return 疑惑不已, 字面上是返回, 那它到底返回什么, 又返回到哪里呢? 有人可能会给你解释:"return 语句就是将结果返回到调用的地方, 并把程序控制权一起返回." 对于初学者来说, 这个解释也不好理解. 没事, 先实践起来.
拿下面这四行代码来说, 你可以想象你开了一家工厂, 雇佣工人来干活, 这个工人 (worker) 在你的指导下, 用 a,b, c 三个材料, 装配出了 x 和 y 两个成品. 但是程序里的装配和工厂不同, 用过的材料不会消失. 这样, 这个工人手里就有了 a,b,c,x,y 五样物品. 他怎么知道你要的是哪个呢? 所以 return 的作用就是, 在这种时候告诉工人你到底想要什么东西, 是一个 iPhone 手机壳还是整台 iPhone. 毫无疑问, return x 和 return y 是完全不一样的结果. return x 是当你让这个工人帮你干活时(调用函数), 他最后会把产成品 x 交到你手上, 而当你输入 return y 的时候, 干活的工人会把产成品 y 给你. 举个例子, worker(1,2,3),return x 的结果为 1+2=3,return y 的结果为(1+2)*3=9. 这样实践一下, 你对于 return 是不是有了更深的理解?
- def worker(a,b, c):
- x = a + b
- y = x * c
- return y
看完我的分析, 蓦然回首, 你是不是觉得道路明朗了许多, 你肯定很想问: 怎样自学才高效呢?
在自学过程中, 有个方法特别管用, 就是用输出倒逼输入, 你逛论坛, 刷文章, 看视频教程都没问题, 关键是要有输出, 光有输入可是不行的. 而最好的输出就是实践, 把自己听到的, 看到的, 读到的, 转化为你独立编写的一个个程序, 岂不妙哉?
文章开头故事里的主人公就陷入了盲目输入, 却无输出的泥潭. 他的输入表面上看上去渠道很多元化, 然而这些输入并没有带来有效的输出. 还有一个很多人都不知道的点, 你的输入很有可能是制约你进步的紧箍咒. 输入也是有讲究的, 盲目输入会带来信息超载. 全世界每天有 4000 本书出版, 超过 4 亿个字; 纽约时报一天的文字量等于牛顿同时代的人一生的阅读量; 一个专业领域, 每天大概有有近 4000 篇文章正在产生. 就算你火力全开, 疯狂地输入相关知识, 也还是难免有漏网之鱼. 而且, 在茫茫的信息汪洋中, 信息质量参差不齐, 保不准你输入的就是一些边角料, 反而让你裹足不前. 这儿分享桥水 (全球著名对冲基金) 创始人瑞. 达利欧在《原则》一书中阐述的观点:"正确的决策很多时候需要依赖可信度加权." 学习同样也需要可信度加权, 不是所有的资料都全盘接收, 而是有选择的相信, 用老祖宗的话来说, 要取其精华, 弃其糟粕. 信息爆炸时代, 最重要的不是增加信息, 而是筛选和删除信息.
除此之外, 要勇于跳出舒适区, 刻意练习. 刻意练习这个概念由美国心理学家安德烈. 艾莉克森博士提出, 即有目的的学习, 指的是把要学习的内容分成有针对性的小块, 对每个小块进行重复练习. 在武术训练中, 非常强调分解练习. 首先你要把整套动作过一遍, 看教练是怎么做的. 然后把它分解为多个动作, 每个动作分解为多个步骤, 一个一个地练习. 在这种训练中, 动作一定要慢, 只有慢下来才能感知动作的内部结构, 注意到自己的错误. 画家要采风, 棋手要打谱, 律师要学习案例, 政客要读历史, 科学家要看论文, 马拉松运动员每周至少要累计 150 公里的跑量. 大部分的学习都不是一蹴而就的, 往往是练习 - 反馈 - 练习 - 反馈 - 练习 - 反馈 - 学成. 刻意练习的关键是随时获得有效的反馈. 拿自学编程来说, 这是一个很容易获得反馈的领域, 当你写的程序跑不起来时, 意味着你要 debug, 你得把你写的代码分成一小段一小段, 逐句检查, 直到找出 bug.
当然, 鼓吹刻苦的鸡汤想必大家都喝腻了. 事实是, 很多人即使整天坐在书桌前埋头苦学, 时长达到甚至远超学霸, 实际效果却远远达不到学霸的水平. 问题的关键在于你的思维和学习方法, 在于你的学习时间是否得到了高效利用, 是否能通过高效学习把知识转化为你真正的实力. 只是如果你注意力涣散, 身在书桌前, 神游天地间; 如果你好不容易学完了, 转眼又忘得一干二净; 如果你写了很多代码却不会举一反三, 同一个知识点换了个问法又被难住了; 如果你对于你所学习的领域缺乏好奇心和探索精神, 只是当一天和尚, 敲一天钟, 没有刻意练习. 那么, 花费再多的时间, 又有什么成效呢?
扪心自问一下, 你上一次坐下来长时间专注于学习, 是什么时候呢? 似乎这件事变得越来越难以做到, 因为我们的生活已经有太多的干扰: 必须要点的微博, 朋友圈点赞, 支付宝蚂蚁森林收能量...... 诱惑源源不断, 切割了我们在学习上的很多可能性. 我们接受了太多无效输入, 自然也不会产生高效的输出. 读到这, 你可能又要问我了:"该怎么办才好呢?"
比起一味地延长学习时间, 更'刻意'地学习更重要. 学习从来都不是一个阶段的事, 更不是一件轻松的事, 但是我们可以优化我们的学习路径, 比如给自己创造一个干扰项少的学习环境. 拿自学编程来说, 你需要的就是一台电脑. 在学习的时候, 你最好离手机远一点, 并关掉电脑版微信, QQ 和一些乱七八糟的应用. 你可能会有疑惑:"那遇到问题向谁请教?"
在这里, 有一个开发学习平台 --XUE.cn, 这是基于 Jupyter Lab 技术深度定制的可交互学习环境, 无需单独安装任何软件, 打开网页就可以边学边写, 即时运行代码得出结果; 上手书籍《自学是门手艺》原本就是终身学习达人所著, 一边教编程一边教自学, 让你得到了鱼, 还得到了渔; 你还可以在浏览器的阅读界面与代码的作者作者的代码互动, 哪里不理解问哪里自己动手试一试; 每章还有配套练习以及学习攻略, 习题让你及时获得学习反馈, 巩固知识点, 攻略提供难度, 时间, 自学小贴士等, 让你从容安排学习计划, 轻松上手学习; 最后, XUE.cn 上再牛的达人都是业余自学而成, 形成了开放包容的学习氛围, 新手小白在这里可以轻松无压力地发起讨论和求助.
- defTeachYourSelf(anything):
- while not create(something):
- learn()
- practice()
- return TeachYourSelf(another)
- TeachYourSelf(coding)
上面这段代码是 Xue.cn 写给大家的几行代码, 基于 python 的任何交互环境都可以运行. 当然, 如果你不想安装 python 运行环境, 也没问题. 你只需要打开 Xue.cn, 不需要安装任何程序, 你也可以随时随地写代码.
来源: http://www.mzh.ren/self-study-programming-is-useless?.html