从小白到 Github 斩获 90k Star! 聊聊学习编程的正确姿势!
如果你看到这篇文章,恭喜你!不论是初入编程领域的小白,还是已经在工作几年的老手,这篇文章都将对你有很大的帮助。建议看到最后。相信我!一定会有收货。
这篇文章我会试着给你带来一个更加不一样的编程能力提高实战指南。如果你觉得这篇文章对你有用的话,也不要白嫖好吧!点个在看或者赞就是对我最大的鼓励。欢迎转发让更多人看到这篇文章,一起变强!
先来说一下自己的情况!我从小学就开始接触电脑,不过到了大学之后才接触编程,整个大一都很迷茫,编程很少,也不知道如何提高自己的编程能力。大二的时候,自己加入了学校的一个技术组织,自此之后,便真正开启了自己疯狂的大学自学编程之路。
自学编程路上,Github 绝对对我帮助最大。我在大二就开始接触 Github 了,当时就觉得上面有太多不错的学习资源了。到了大三下学期,自己就想着说要不也尝试着做一下开源呗!然后,我就从比较好入手的 Java 学习和面试指南入手。到目前未知,我的所有的开源项目累计接近 90k star,并且收获了 4.6k 的关注。
说到 Github 其实也挺惭愧的!因为我的大部分项目都没有提供英文版本。实际上,如果你要做开源的话,本着开源精神,最好能有一份英文翻译版。
好的!下面我们就开始正文!想要自己编程变得更强的小伙伴记得多记笔记。
1. 选择一个合适的电脑
学习编程前至少要有一个稍微适合一点的电脑吧!
关于电脑选择,我觉得不要纠结是买 Mac 还是 Windows。作为一个使用了 Windows 开发 4 年,Mac 开发一年的人客观地说,两者对于编程效率的影响没有你想的那么大。特别是在你初学编程的阶段,是完全没太大区别的。
Mac 的性价比更低,一台合格的 Mac 开发本 1 万 2 起步。虽然它确实好一些,但是选择电脑的时候还是要根据自己实际经济情况来决定。
另外,一定不要选择内存低于 8g 的电脑,有条件的话最好能 16g。
2. 六个黄金原则
很多人可能会觉得说,我们学习编程,首先是要找一门编程语言好好开始学,比如我在上大学的时候最开始接触的是 C 语言。
我觉得非也!就我自己作为一个从大学自学编程一路一路踩坑的过来人来说,我觉得学习编程第一步应该是要搞清楚学习编程有哪些必备的网站?我们是如何查资料的?我们是如何解决问题的?国内外有哪些技术社区比较好?......
初次之外,你还要搞明白学习编程不是参加应试考试。
2.1. 了解常见的学习编程网站
了解学习编程有哪些必备的网站之后,你才能更好地进行自学。
一般情况下,但凡是初学编程的同学,往往都需要课后进行持续学习的。一是因为你可能刚学编程,老师教的东西你听不明白。二是因为程序员这个行业本身就需要不断学习。三是因为大学里面教的东西往往和社会实际需要脱节,只有自学才可以让你技术和社会不脱节。
推荐几个我常用的学习编程的网站:
a.中国大学 Mooc
上面有很多名校的课程和国家精品课程比较适合我们夯实编程基础。比如下图是南京大学的一门关于软件工程的大学选修课。
b.慕课网
上面有很多比较适合入门的免费课程。另外,如果你需要实战项目视频资源的话,也可以在慕课网找到(慕课网打钱!!!)。
c.哔哩哔哩
是的,你没看错!看 B 站也能学习!B 站上面有很多优秀的学习资源以及优秀的 UP 主比如 Guide 哥。
d.LeetCode
国内的公司慢慢开始向国外的面试形式靠拢,手撕算法已经是很多大厂的标配了,不论是社招还是校招。LeetCode 这个网站的话,是我们平时刷题必备的一个网站。
在你初学编程的阶段,也可以经常去上面找一些简单难度的算法题来做。
e.极客时间
主打付费学习的一个付费学习社区(极客时间私聊我打钱哈!)。不过课程的质量大部分都挺高的,我自己也看了里面很多的课程,并且很多课程都是 Java 领域大佬级别的人物讲的。
2.2. 拓展视野,好的技术社区是你成长的助力器
了解了国内外有哪些比较好的技术社区之后,你才有机会认识到更多更优秀的程序员,看到更多对你有帮助的东西。而不是说,整个人的思想都局限在学校。这点是很重要很重要的! 比较好的技术社区的话有:Github(稳居第一位好吧!开源项目交流社区)、Stackoverflow(一个程序设计领域的问答网站,网站允许注册用户提出或回答问题。和知乎很像,重大的一点不同是 Stack Overflow 可以对问题进行打分)、v2ex、掘金、csdn、segmentfault 、知乎......。
3.学会使用 Googgle 搜索,学习和解决问题效率提升一个档次
知道了要使用 Google 搜索之后,你学习编程的和解决的问题可以提升一个档次。如果你实在是无法越过那道墙的话,可以试试必应搜索。
2.3. 不要把学习编程还当做学生时代的应试考试来看
你或许也发现了。很多成绩特别特别优异的同学,他们的编程能力其实并不好。在大学的时候,那些编程能力最强的往往是那些成绩比较一般的。
为什么会这样呢?
我觉得主要是一个思维的转变问题。很多人学习编程的时候,总是想着我要把这个 API 记下来,把这个库的用法记下来。这样学习,导致的结果只有一个那就是你会很难受!因为,这些根本不是要死记硬背的东西啊!真还当这是上课考试啊!你要从如何用你学的东西来解决实际编程问题出发,站在做一个实际的项目的角度来学习。
拿我自己来说:我平时也会写 Python,基本就是自己看着官方文档或者一些书籍的教的语法跟着写。如果哪个地方不会了,我就去查一下。
2.4. 不要害怕阅读英文文档
大部分最新的资料/技术都是国外那边的,基本上大部分都是英文的。据说 90% 以上的程序员都不习惯直接看英文文档,都会选择看别人的翻译/总结或者书籍。但是,书籍或者别人的翻译/总结都会比较慢,而且难免会有个人主观因素影响翻译效果。
这个时候很多人就会说了我的英语不好啊!完全看不懂英文文档。
别担心!有道翻译和谷歌翻译就是你最好的老师。如果是使用 Chrome 浏览器的话,我还推荐你安装一个 Mate Translate 插件。 这个插件对于网页阅读英文文档太友好了,可以一站式翻译您的网页以及标记的文字段落。使用效果如下图所示:
2.5. 多看优秀的代码
不看优秀的代码,你写的代码质量很难提高。
虽然要多看优秀的代码,但是也不要被 “最佳实践” 所束缚,很多时候实际是根本不存在适用于任何场景的“最佳实践”,没有银弹。
有哪些优秀的代码值得学习呢?
拿 Java 来说,不知道阅读什么源码的话,可以先从 JDK 的几个常用集合看起。另外,我比较推荐看 Dubbo 的,因为感觉会稍微相对容易一点,模块划分清晰,注释也比较详细。搞清楚了 RPC 的基本的原理,知道如何自己实现一个 RPC 框架之后,看起来就没那么吃力了。
另外,随便一个框架的源码都 10w+行了,都看一遍是不可能的。要挑选比较重要的地方看,就比如看 Spring 源码的话你一定要看 IoC 和 AOP,要知道一个 Spring Bean 是如何一步一步被创建出来的。你要看 Spring Boot 源码的话就要知道 Spring Boot 的启动机制是啥,Spring Boot 是如何实现自动配置的。
2.6. 多读好书
一定要多看好书!像《重构》、《代码大全》、《代码整洁之道》这类书是程序员标配、必读的书籍。
看书相比于零散的看一些文章学习更加系统。当然,网上也有很多比较系统的学习资源,比如你要学习 Java 的话,可以看我开源的 JavaGuide (「Java 学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识)。
3. 选择一门适合的编程语言入门
初学编程第一步就是选择一门适合自己的编程语言入门。
选择的时候,无非是要从下面几点考虑:
难易程度:一般建议初学编程应该选择一门稍微简单点的比如 Python、 C、Java。 发展前景 :确定你要学习的编程语言发展前景是不错。就比如相比于 PHP ,我肯定更推荐你学习 Java。 市场需求 :有了市场需求之后,工作岗位才会多,找工作也会相对容易。 薪资水平 :薪资水平实际和编程语言不是那么相关,和个人实际能力相关。不过,相同能力下某些编程语言的薪资确实要稍高一些。
下面这份数据来自 TIOBE 官网统计的 2020 年 7 月份编程语言排行榜,也可以作为你的参考。从统计结果可以看出,C、Java、Python 还是很强势的,这弟兄仨基本常年就是前三(Java 和 C 经常争第一)。另外,R 语言的进步也很快,同样值得关注。
再来看一下 PYPL 指数。这份指数数据主要描述的编程语言的受欢迎程度,具体受欢迎程度是由分析 Google Trends 得出。从统计结果可以看出,Python、Java、Javascript 三者稳居前三。
再来看一下编程语言的平均薪资水平和使用年限。这份数据来自于 Stack Overflow 2019 Survey 。我们需要格外关注的是 Go 语言。Go 语言背靠谷歌,薪资比较高也不奇怪。并且,国内现在很多大公司比如腾讯使用 Go 进行项目开发的越来越多了。
相信你看了上面这么多关于编程语言的介绍之后,你一定可以选择一门适合自己的编程语言进行学习和深入。
4. 不要被编程语言所束缚
编程语言只是工具。我们的确需要有一门比较擅长的编程语言,但是,不是任何时候,我们做任何东西都要使用这一门编程语言来做。比如 Java 适合网站开发而 Python 更适合做数据分析。选择合适的语言做合适的事情很重要。 再比如你想要做全栈开发的话,还可能需要掌握多门编程语言。拿我自己来说,也算是半个全栈开发,我主要是以 Java 做后端开发,Javascript 来进行前端开发。
5. 多实践
我见过很多人学习编程一年多了,自己敲的代码可能还不到 1000 行。然后, 你让他做用自己学的编程知识做个什么东西,他就蒙了。
学习编程以及提高编程能力最直接的办法就是实践!不断实践!特别是在编程初期的时候,积累代码量格外重要。
就比如你学习 Java 后台开发的时候,能不能通过自己学过的知识独立做个网站呢?再比如你搞懂了某个框架原理之后,能不能模仿着去写一个简单的呢?
我们实际项目开发中是比较忌讳造轮子的,但是,实际学习过程中造轮子绝对是最自己百利而无一害的! 就比如我之前搞懂了 RPC 的原理之后,就自己动手写了一个简单的 RPC 框架。我的 RPC 框架肯定是无法和 Dubbo 这类已经这么成熟的相提并论。但是,在自己去写 RPC 框架的时候,更加加深了自己对于 RPC 框架的认识。实现的过程中,遇到了很多问题,解决问题的过程中也提高了自己的编程能力。总而言之,造轮子是一种特别能够提高自己系统编程能力的手段。
多实践不是说拿到问题就直接开始写代码、不是不学习理论知识。多问自己 why ,而不是 what。 就比如技术选型的时候,相同的功能可能有不同的解决方案,你是人云亦云地不顾项目实际需要去选择,还是自己经过详细的对比呢?想当然肯定是根据自己项目的实际需要,然后经过各种对比之后选择!
“ talk is cheap, show me code”这句话虽好,但是请不要忘记思考!换句话说就是:多写代码虽好,可不要贪杯哦!
6. 多修炼内功
不要沉迷框架,多花点时间去修炼内功——底层技术。很多人觉得在学校里面学的数据结构和算法、计算机组成原理、操作系统这些东西工作之后根本用不到。然后,就想当然地觉得这些东西不重要。
如果你暂时觉得这些东西没有用,很可能是现在学习某门技术只是浮于表面。举个例子:如果你要看懂框架或者某个类库的源码,那数据结构是必须要搞懂的吧!如果你要培养和提高自己解决问题的能力,那算法肯定是必须吧!
为什么要修炼内功?
技术更新换代快 :我们前几年可能还在用 Spring 基于传统的 XML 开发,现在几乎大家都会用 Spring Boot 这个开发利器来提升开发速度,再比如几年前我们使用消息队列可能还在用 ActiveMQ,到今天几乎都没有人用它了,现在比较常用的就是 Rocket MQ、Kafka 。技术更新换代这么快的今天,你是无法把每一个框架/工具都学习一边的,底层技术就是你快速上手他们的瑞士军刀。 懂得底层技术的人更有竞争力 :现在的程序员这么多,你如何能和别人拉开差距?单纯就靠使用框架的能力么?这些随便从培训班抽一个人可能都会做的工作无法成为你的核心竞争力。
拿 Java 举例子,有哪些比较底层的技术呢?
算法和数据结构、计算机网络和操作系统(适用于任何编程语言的底层技术); 框架的源码; Java 程序运行的基础—JVM; ......
7. 多总结、多分享、多输出
总结知识不是把自己学到的东西按照老师的说法完完整整的整理下来,而是结合自己的理解和补充整理下来。
将自己学到的东西分享出来,一方面能检验自己是否掌握,另一方面还能加深自己的理解和认识。
分享和输出的方式有很多种,给大家推荐几种最常见,同时也是我最常用的学习方式。
7.1. 写博客
可以养成写博客输出的习惯。我在之前有写过一篇文章来说为什么要写博客:程序员写博客很重要吗? 。
简单来说,主要有下面 👇🏻 几点原因:
对知识有更加深的认识,让自己的知识体系更加完整 督促/倒逼自己学习 可能会带来不错的经济收入 提升个人影响力 拥有更多机会 好的博客会成为面试加分项
这个时候,你肯定就纠结了:我该在哪里写博客呢?
作为一个从大二开始就坚持写博客,期间折腾了无数次个人网站的我来说: 我推荐先找一个不错的博客平台比如掘金,然后在博客平台上写博客,后面可以自己搭建自己的博客网站。
这个时候,你肯定又要纠结了:我该怎么搭建自己的博客呢?
Emm...这部分要格外好好看,适当记笔记哈,小伙伴们!给大家推荐几个最好也是最常见的搭建博客网站的方法,想要免费高速个人博客网站的小伙伴们不要错过。
搭建难度 | 是否需要服务器 | 易用性 | SEO | |
---|---|---|---|---|
Hexo | 易 | 非必须 | 中 | 一般 |
Vuepress | 易 | 非必须 | 易 | 友好 |
Docsify | 易 | 非必须 | 易 | 不友好 |
Wordpress | 中 | 必须 | 易 | 友好 |
Halo | 中 | 必须 | 易 | 一般 |
综上,我还是比较推荐 Vuepress 和 Docsify 的。 关于如何使用 Docsify 搭建一个自己的博客网站,我还写过一篇文章手把手教你搭建:《手把手教你搭建一个文档类型的网站!免费且高速!》 。而且,我还提供了配套的视频教程。就很贴心好吧!记得给 Guide 哥点个赞 👍!
有了自己的网站后,你可以将自己的文章整理成一个系列,然后部署在自己的网站上,自己想看的时候就可以随时查阅。你也可以将文章同步到其他博客平台来扩大自己的影响力。
我整理 7 个常见的技术平台供大家参考:
7.2. 项目组内分享
一般公司都会有内部的技术讲座以及博客平台。
你可以在公司或者项目组内部组织技术讲座,这样不仅可以增加自己的存在感,还能提高自己的表达能力。
你也可以在公司内部的博客平台分享自己写的博客,这样你写的东西就能被更多人看到了!
7.3. 做开源项目
你可以在 Github 分享很多东西,你的学习笔记、自己做的实战项目、自己造的轮子......(资源类的不太推荐,太容易侵权)。虽然,现在 Github 被很多人单纯玩成了引流工具。但是,整体来说 Github 整体技术环境和氛围还是很不错的!
另外,最好的话是要给项目弄一个英文版本,项目代码中的注释最好也要是英文的。毕竟是开源,最好是能准守开源精神使用世界通用语言(这一点我自己也没做好,反思!)。
总结
这篇文章,我站在自己的这些年自学的角度,掏心窝子地说了很多话。看了这篇文章之后,哪怕你只学会了要使用 Google 搜索我都觉得开心,也希望这篇文章能够影响到更多人。
另外,文中讲了很多编程领域不可争的事实或者说正确姿势比如:不要以学生时代应试考试的方式学习编程、多实践、造轮子是一种特别能够提高自己系统编程能力的手段等等。说了这么多,如果你没有将这些学习编程的正确姿势用到自己平时学习中的话,这篇文章对你的帮助可能非常有限。
这一期原创分享就结束了!让我们一起变强!!!
2020-07-15 1:36 Guide哥