
到这里，我估计《程序员练级攻略》系列文章你都已经了解个大概了，不知道此时此刻你有什么样的感受？这份攻略其实是给了一个进阶的地图，也罗列了很多书籍和文档。但我可以确定地说，只是看这些列表，你肯定会抱怨说头都要大了，而且，你可能还会觉得纸上谈兵，不知道怎么把这些知识转变成自己的能力，尤其是你的工作中没有这些场景，你都可能不知道怎么实操。

所以，在这里，我把我个人相关的实践都写一下，这样会让你更好地掌握这份攻略。如果大家有更好的方法，也欢迎留言。

对于本攻略来说，你并不需要按顺序学习，你可以从自己喜欢的切入点，按自己喜欢的路线学习，通常来说，有如下的一些注意事项。

- 《入门篇》和《专业基础篇》中的那些书和文章，你肯定是得认真精读的，这是基础。但是也没有必要揪住细节不放，重要的是知道这个技术的“解题思路”，抓住其中的重点，一个技术的关键点就那么几个。
- 《高手成长篇》的相关书籍、文章和论文，你不一定全读，可以挑感兴趣的内容研究。
- 《修养篇》和《设计篇》里的内容，你可能要经常拿出来读，因为这些都是经验，随着你的成长，以及阅历的增加，你每次读都会收获更多新东西，正所谓常看常新。另外，你还可以顺着这些东西找到更多的“修养”和“设计”。

但是读这些资料，很多人都是记忆式的学习方式。但，你也知道，记忆学习是简单粗暴的，所以也很容易忘，如果你不实操一下，就不会有具体、真实的感觉。所以，一定要动手实践。

下面是一些配合程序员练级攻略中技术成长的相关的建议。

**首先，你需要建一个自己的实验室**。咱们讲了很多内容，看完之后，你要动起来，徒手把环境搭出来，写一些实验性的程序验证或感受一下相关的技术点，出了问题也要自己进行调试和修复。因为只有这样，你才可以获得一些感性认识。

- 《入门篇》和《专业基础篇》都有很多的编程语言要学，你并不需要一下全部都学，但是为了你可以一个人solo，你需要至少学一个后端和一个前端语言，我给你的建议是 Java 和 JavaScript。
- 在《入门篇》和《专业基础篇》我都给了一些实践项目，如果你没有太多的工作经验，这些实践项目会对你的学习非常有帮助。因为在实现代码的时候，你会遇到很多细节问题，这些细节问题会倒逼你去看文档，去Google，去提问，这相当于是把你扔到具体的问题场景里锻炼你、打磨你。
- 对于《数据结构》，其实都是在围绕增删改查的相关性能，在平衡时间和空间。对于《算法》则要么这些数据结构的操作，要么就是数学逻辑的推导，比如动态规划。这些东西可能在你的生活当中用不到，但是你可以把它作为一个脑筋体操来不断训练自己的数学思维。
- 对于《高手成长篇》中的很多东西，也是需要你自己先搭个环境，自己写一些Hello World式的程序先体会一下那些知识。比如内存分配、异步I/O模型、locker-free、JVM和字节码操作，还有浏览器原理等等这些东西，写几个小程序就可以体会到了。而还有一些中间件的知识，你也是可以搭个环境自己玩玩，并且最好能够搭出一些比较高级的用法。

**其次，把你的实验室升级成一个工作室**。工作室和实验室不一样的地方是，实验室只是在做一些验证型的实验，以跑通一个小技术功能为主。而工作室则是要以完成一个比较完整的软件功能为主，也就是说，可以让别人/用户来用的东西（哪怕很丑很难用，但是可以让别人来用）。这个阶段，我给你如下的几个建议。

- 你得选用一个主流的开发框架，并且在写这个软件的时候，你需要有一定的修养，比如有不错的编程风格，追求代码的可读性，有一定的测试案例，等等这些我们在《修养篇》和《软件设计篇》里提到的东西。这个时候，你需要大量学习一些优秀项目的代码，因为你可以在开源软件中找到一些不错的代码实现（你可以做一些源码分析的事，但不是去整理其中的编程逻辑，而是要去学习代码组织的方法）。然后你需要照葫芦画瓢似的练习，无论你完成得好不好其实都没有关系，这就像画画一样，一开始总是画的很不好的，但是只要你坚持，并且多思考别人为什么要写成那样，那么，我相信你提高得也会很快。
- 你需要完成一个能用的项目，对于选择什么样的项目，这里，我也有几个建议。第一，从自己的痛点出发，写一个能解决自己问题的东西。第二，临摹别人的作品，复刻一个其它的成功产品。有人说，学好一门语言或是一个开源软件最好的方式，就是用想学/喜欢的编程语言翻译下这个开源软件，比如，你用Go语言翻译一下某个Java的组件。第三，深度参与一些你喜欢的开源项目。第四，在工作中找到风险可控的项目和需求。
- 你最好跟别人一起组队升级打怪。这里需要注意的是，一定要找好队友，要那种有热情，爱专研，能相互打气的队友，千万别找那些为自己的不努力找各种各样借口的人。
- 在这个工作室中，你还可以尝试使用各种前沿的或是你没有玩过的技术和中间件。这里，你需要注意的是你一定要使用一些高级技术，比如一些高级算法，或是分布式技术等。
- 当你的东西做好后，一定要做压力测试或Benchmark，这样你才知道自己产品与其他软件的差距，然后还会逼着你对自己的系统或软件进行调优。

**最后，把你的工作室升级成工厂**。工作室与工厂最大的差别就是，工作室是比较自我比较随意的，而工厂是有相关的工业标准的，是有一整套的规范和标准的。对此，有如下的一些建议：

- 当有了“工作室”的能力后，一般来说，你就可以去头部的互联网公司或是一些技术公司了。但是你一定要在一些核心的项目或产品工作，也就是说，你要在那些有技术挑战的地方工作，并在那里收割更多的经验和技能。
- 你需要读各种各样的RFC、论文、Specificaiton、标准化文档，还要使用工业级的工程能力要求自己，比如，CI/CD这样的软件流程。你得不断告诉自己，把代码提高到可维护、可扩展，甚至可重用的级别。
- 你必须对技术有更深入的了解，对软件开发的套路和各种trade-off还有各种解决方案的优缺点都非常熟悉。这就需要你了解软件内部的设计和原理，并知道优缺点和使用场景。
- 你需要开始追求软件运行的SLA，也就是能在什么样的性能下做到多少个9。还要关注系统的可运维性，也就是你需要为你的软件做很多的配套设施。就像为了汽车，建加油站，建4S店，建公路，建交通管理部门……
- 你需要找那些有工业素养的工程师一起讨论或工作。这类的工程师有丰富的工作和项目经验，也见过大世面。他们通常来说会对外有输出（不是那些写微信公众号的人，或是在知乎上输出的人，而是那些在软件开发工作上有丰富工程经验的人）
- 这个时候，对于你要做的软件，你不仅仅只是为了完成，你追求的是一种技术高度，追求那种严谨和科学的态度。你已经把这个软件当成了自己作品，变成了自己的名片，你在等待接受别人的学习和膜拜。

好了，基本就是上面这些，你还要记住我的学习能力一文中的那个学习金字塔，在上面的过程中不断地输出你的认识和体会。

最后，我用下面的几个观点来结束这篇文章，希望对你有所帮助：

- 带着一些具体的问题来学习，能够让你更有感觉，也容易获得正反馈和成就感。
- 开拓视野，尽可能只读英文社区的一手文章，这样你会得到更有营养的知识。
- 多问为什么，为什么要设计成这样，为什么要有这个技术，到底解决了什么样的问题？这会让你对技术有更深的认识。
- 学会归纳总结，在不同的技术中找到相似或是相同的东西，更容易让你触及技术的本质。
- 把自己的理解用自己的语言表达出来，对外输出，这是最好的学习方式。
- “动手”和“坚持”，这是一个动手能力很强的学科，不动手，你什么都不可能学精、学深。这是一个需要你不断坚持的事，在这条路上，你有很多很多的理由可以让你放弃，只有坚持才有可能有突破。
