众所周知,现在计算机是“宇宙机”,很多人想转计算机,但是真正能够学好计算机编程的人非常少。不少的人选择了去培训机构突击几个月,然后找一份搬砖的工作作为跳板,希望积累经验过一两年后可以跳槽,实现人生的飞跃。

理想很丰满,现实很骨感,很多人在工作一两年后还是感觉自己进步很慢,有太多的东西不懂,焦虑感很强,同时也不知道如何进一步提升自己。本文将尝试给读者介绍一条硬核的打怪升级之路。

学习什么东西?

学校里面教得大多数是理论,而培训机构教的大多数是 API 和框架的使用。前者缺乏实践,而后者则是浮沙筑高台,遇到底层一点的问题就摸瞎。

首先,对于编程来说,基础是非常关键的,因为上层的东西都是通过抽象一层一层搭建起来的,如果遇到复杂的问题,你往往需要从底层原理出发去寻找答案。

其次,你光知道理论和能否把理论优雅地落地,这里面又差了好几个层次。为什么很多项目里面都会有大量的屎山代码?我们都学过面向对象,学了设计模式,懂很多设计原则,但是在具体落地的时候,还是把代码写得很乱?

只有把理论学习和工程实践结合起来才能够让自己的技术水平不断地精进。

理论学习

理论学习最核心的部分,其实就是计算机专业里面设置的那些课程:数据结构与算法、操作系统、计算机网络,数据库,分布式系统设计、图形学、编译原理、人工智能与机器学习等等。这些课程的学习,一定要找最好的学习资料,向最好的老师来学习,这样才能够做到事半功倍。而现在全世界范围内的公开课解决了这个问题,这里有一份北京大学的本科生整理的《CS自学指南》,我觉得不非常不错。

对于这些课程的学习,如果你不是科班出身的话,一定要刷一遍。如果你是科班出身,也可以不时地刷一刷,提升自己的理论素养,说不定下一次在解决一些系统问题的时候可以给自己带来一些灵感。

而且这些知识是不会随着技术的发展被淘汰的,至少短时间内是不可能。这意味着你学会了这些知识,它可以管好几十年,这个投入非常地划算。

理论学习的时间,我认为如果你每天能抽出 2 小时来提升自己的话,理论至少应该占一个小时。当然,在学习方法上面,肯定是做中学效果最好,如果只是看书或者视频而不去实践地话,学习效果会大打折扣。

实践学习

关于实践部分,我建议读者一定要有自己的爱好。这个爱好可以是一个编辑器(比如 Emacs),可以是一门语言(比如 Python),可以是一个特定的领域(比如游戏开发)。有了热爱,你才能为之每天甘心付出而不知疲倦。

  • 学习吃饭的技能。一定要学习和使用业内最先进的技术,比如 Web 领域一定要使用 Vue 或者 React,如果你还在学习 JQuery 可能就会比较被动。游戏领域就要学习 Unity3D,Unreal 和 Cocos Creator,学习其他的 GameMaker 之类的技术可能也会比较吃亏,因为用的公司实在是非常之少。这部分你投入的时间一定要占比较大的比重,因为工作中提升自己是最快的,你有动力和意愿去提升。

  • 学习可以迁移的技能。尽可能地学习跨平台且开源的技术,不要跟某些私有公司绑定地太死,这样你下次在换工作的时候才会更有优势。

  • 学习可以带来复利效应的技能。这些技能可以不断地丰富你的工具箱,让你在面对一个具体问题的时候有更多地可选方案,同时也能帮助你在做一些决策时更有效率,因为你掌握的信息越多,你的决策越有效。

跟谁学?

一定要向大师学习,像高手学习。这个行业的人才是非常多的,一定要找到比你厉害的人并且向他们学习。

那么去哪里找这些人呢?这里我分享我自己的一些小技巧:通过 Github 为出发点,找到知名项目的主要贡献者的个人主页,然后从个人主页中找到他的 Twitter 或者知乎帐号。然后关注他们,看看这些优秀的人每天都在关注些什么东西,读了哪些书,看了哪些演讲视频,目前正在做些什么项目。

可以经常逛逛 Reddit,Medium 和 Youtube,关注一些你觉得分享内容特别好的创作者,订阅他们的博客 RSS,收听他们的 Podcast(如果有的话),躺在床上不想编程的时候,可以看看他们每年在各种 XXX Conf 上的演讲,GDC 视频,WWDC 或者 Google IO 的视频,给他们点赞分享,让他们更愿意分享。

融入到更大的全球社区中去,增长自己的见识,而不要做一个只会面向百度和 CSDN 编程的码农。

怎么学?

每个人都有自己的学习方法,有人喜欢看书学习,有人喜欢看视频,有人喜欢看教程。这些都没有问题,但是重要的是,一定要看最有价值的内容,抵制垃圾。

看书要只看经典,这个在《CS 自学指南》中有提到,Github 上面也有人整理了很多对程序员影响非常大的书单,这些书都可以买来读一读。

看视频的话,我推荐在学习一些新技术的时候可以使用一下。因为刚开始入门会遇到非常多地障碍,很容易被卡住而停滞不前。看视频可以非常好地解决这个问题,但是不要迷恋看视频来学习。因为视频的信息密度是不如文字版的,同样多的信息量,你看视频可能要比看文字版多出 2-3 倍的时间。不过对于演讲或者会议的视频,这个因为缺少文字版,还是可以多看看。

我个人是比较喜欢看教程来学习的,一篇好的教程可以帮忙你很快地学会一个东西,让你有一个基础去深入学习下去。这里我强烈推荐 https://www.raywenderlich.com/,我以前翻译了这个网站上面非常多的 Cocos 教程。现在这个网站已经包含了大量的移动开发和游戏开发的教程了,入门首选。(教程比视频更节省时间)

编程毕竟是一个工程活,想要学好它离不开大量的编码实践,每天保证一定的编码量是非常关键的。程序员练习编码就跟跳水运动员每天练习跳水一样,练习地越多,掌握地就越好。这里的练习指的是有针对性地练习,而不是把简单的 Hello World 练习千百编。要学习不同的编程范式,思考各种技术需要解决的问题和引入的问题,理解每一项技术背后的原理,在思考的基础之上实践效果会更好。

多与人讨论,多参与开源项目,在 Github 的 Issue 列表上面与全世界最优秀的开发者进行方案的讨论,编程设计的讨论等等。

一些学习心态

  • 终身学习, 不要太着急,十年学会编程

  • 集中精力并且管理好自己的精力(看视频放在碎片时间,编码留好大段连续时间),每次学习 1-2 小时,每天保持在学习比偶尔通宵达旦学习要好,细水长流。

  • 空杯心态,不断提高自身的认知,可以每年学习一门新的编程语言,学习一个新的工具(比如 Emacs),学习一些新的框架和技术来扩展自己的视野。

  • 定时总结输出,写博客,写 Side Project,分享输出会让你的学习更有效率。

  • 积极锻炼身体,避免颈椎问题、腰椎问题和眼睛的问题,这个也非常关键。