计科专业大一学生一枚，如何提高编程能力？
Part I 昨天，有朋友发现清华《招生指南》里有我的特写，我赶紧去看了看。能被选中自然是不胜荣幸，但是说我记录了一万多页笔记，实际上是报道上出了偏差。 我在答辩的PPT里面说的是看过的书超过一万页，其中大一看过的书占了很大一部分。那时候，我刚入学，几乎什么都不懂，就疯狂看书，K&R/C primer / C++ primer plus/python学习手册 看了个遍。但是有些抽象的东西，看书就是看不明白；也有些边边角角的东西，书上讲得特别细，但是实际上使用频率低。 后来，一次偶然的机会，有个朋友找到我一起做外包项目。今天看来，那是个很简单的项目，就是帮学校的某个实验室的网站增加个上传文件的功能，但是当时我才大一，完全不懂网络开发，为了项目硬着头皮学各种知识，而且都是实干导向：IIS怎么用、http://ASP.NET怎么写、怎么把代码插入在HTML页面里……项目是在2017年的劳动节假期完成的，我记得特别清楚。 做完这个项目之后，我赚了500块钱。那是我第一次知道，原来程序员赚钱这么容易。在这样正反馈激励下，我后来又接了一些外包项目，包括给某几个数学大会做网站维护等等。要用的技术都是现学的，需要什么学什么，而且做多了之后就能有一种直觉，似乎自己知道什么知识是重要的、什么知识是不重要的。 所以说，编程是一门实践，不动手是学不会的。 前段时间，孙家广院士为我们讲课，向我们分享了他的成长经历。 孙院士在清华读书的时候，为了帮别人修半导体收音机去学习电子机械；他在毕业之后在清华参与筹办计算中心的时候把学校的唯一一台计算机修好了，在这个过程中从计算机底层到软件全精通；他在90年代做出的国产CAD软件更是一举把国外垄断公司AutoCAD的产品价格从几万元降低到了几百块，让中国的制造业摆脱了传统的绘图板，走向了信息化。 孙院士在我们入学时就送给我们三句话，他的人生经历，可以作为这三句话的完美注脚。 所以说，编程是一门实践，不动手是学不会的。 我最近在学习强化学习，一直很苦恼，难于下手。 强化学习领域的创始人Richard S. Sutton和Andrew G. Barto在2018年出版了《强化学习导论·第二版》，我想，2018年出版的书，应该是对强化学习非常全面的概述了吧，学完这本书，就可以说是精通强化学习了！ 抱着这样的心态，我花了半个多月把这本书粗略地看了一遍。 看完之后依旧很苦恼。书里每句话掰开看大部分能看懂，连起来看完一遍，却不记得他讲了什么。书里面介绍了那么多种算法，也不知道它们具体适用于什么场景。 这个时候，我看到了朋友 @Trinkle 开源的天授项目，一个优雅精巧的强化学习平台，居然主体代码只有两千多行。于是我转变思路，通过阅读这个项目的代码来了解强化学习。由于我和 @Trinkle 也比较熟，看到不懂的代码就向他请教，学习起来就很开心。阅读代码过程中发现一些bug、以及 @Trinkle 说想加一些feature，我就顺手加了，没想到已经写了一千多行了，成为项目contributor之一。 通过看代码、运行试验，我现在对强化学习能有个整体上的认识了，不敢说精通，略懂略懂。 所以说，编程是一门实践，不动手是学不会的。 有些重要的事情，即使说了三遍，依然不能让人记住里面的道理。所以我不仅说了三遍，而且还加了这么多故事，满足知乎用户听故事的欲望。 苦口婆心说这么多，大家明白我想干什么了吗？ 快去给我们的 天授 项目点个star吧 今天刚好是高考结束的一天，接下来马上是招生季了。 祝大家高考顺利，欢迎大家报考清华大学！ 巧的是，今年开始，我将成为一名带班辅导员，带的就是今年入学的新生。 我在清华大学的计算机大类的软件学院等你来！ 
当你提出这个问题的时候，总有人会告诉你，你应该学习这个，学习那个，亦或是刷题根本没用，你应该去做项目，你看这个视频没什么卵用，你应该自己去实现一遍，亦或是你应该使用xxx框架，xxx语言，做一个xxx系统，这样你才能学到很多…… 恕我直言，这些跟放屁没什么两样。对于一个编程新手，很多事情都是陌生的，即使拿到一个文档，也不知道如何去使用它们。因为根本找不到切入点，找出我该如何入手，万事开头难。 想要提高编程能力，我们首先要知道什么是编程能力。能把程序写出来就是编程能力高了么，ACM总冠军选手编程能力就高么，他们高，高在解决脑经急转弯问题的能力上，这是遗憾的，当然什么是编程能力这本身就是一个很大的问题，这里不做过多展开。 编程本质就是一门技术，一门手艺活，最好有老师傅带着你，告诉你这部分你可以先完成，那部分你也可以先入手，一点一点的积累，从小部分做到整体，孰能生巧游刃有余。 但是很不幸，你的学习中不会有这样的老师傅，你需要靠自己寻找机会，我把这样的寻找机会的步骤分为三步： 具体该如何做呢？ 当你还是一个新手的时候，你需要疯狂的积累你的代码量，你可以从基本的问题出发，做一些简单的问题，怎么输入数据，怎么输出数据，然后熟悉各种数据结构，各种常见算法，疯狂地刷题。相信我，大一大二是你刷题的黄金时期。比如LintCode 领扣就是一个很不错的刷题网站，不会怎么办！看答案，了解怎么写，然后自己实现一遍。（推荐一个刷题神器LeetCode / LintCode 答案查询） 你可以先从easy难度的问题做起，每一个程序也就20-40行左右，甚至你可以一旦AC，反复提交，以增强自信心，虽然这只是一个玩笑，但是它可以让你提高你对编程的自信，对编程的喜爱，当你有自信的时候，你才能真正的把一件事情做好。 LintCode上的企业面试题库收集得很全、很新，但部分需要VIP，我这边找到了： 直接血赚￥99！ 关于刷题，还可以参考我以前的一些回答： 当你反复解决一个又一个的问题的时候，你要告诉自己我是个天生的编程者！然后你就可以挑战更高难度的问题，当你积累到10W行以上的代码量的时候，你会发现你会有一个质变。一切将变的顺手。当以前要想半天的语句，现在信手拈来。恭喜你跨出了很重要的一步。 你该去找实习了。当你有了第一步作为铺垫以后，你应该去业界提高你的编程能力，这个很重要。什么是编程能力，用程序去解决真正的问题，你的程序写得更让人能读懂，这是编程能力；你的程序高效可维护，这是编程能力；你的程序被review的次数很少，质量很高，这是编程能力；你能快速理解一个小项目，小模块在做什么，怎么做的，这也是编程能力。 所以你应该去公司，有mentor指导你的情况下，去做一些事情，参与到团队中去。同时实习生的面试门槛比Full time会低很多，只要你把第一步做好了，好好的准备面试，拿到一个不错的实习也问题不大（实习生也更容易拿到return off）。 当你实习结束以后，做一下总结，业界到底在干什么，业界使用的技术到底有哪些，他们平时的编程工具等等这些都是值得你学习的地方，你可以用你学到东西尝试着去做一些简单的project。你会发现原来毫无头绪的事情，慢慢变得清晰起来。疯狂地训练，超强的自信心，去工业界实习一下，你就会明白我要什么，我要为了我所想要的做什么。