31

假如时光倒流,我要这样学编程

 3 years ago
source link: https://mp.weixin.qq.com/s/fBNJBnAB6-hiS0QY9HNVGw
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

>点击上方“ 编程大叔 关注<

看看你有多少好友也关注了我

yqQzQb3.jpg!web

Photo From Internet

相信每个初入计算机编程大门的小白都会有很多问题?例如我应该学习哪门编程语言?学习了这门编程语言我能进入 BAT 大厂吗?除了编程语言我还要学习什么?

网上有很多文章讲述初学者应该如何去学习,内容五花八门,错综复杂。文章翻了又翻,初入编程大门的小朋友们最终还是无法下定决心,反而看了以后开始变得更加迷茫,怀疑自己的智商。

y263iuq.jpg!web

在这里我想要说的是,我和你一样曾经也迷茫过,不是因为你太笨,而是因为互联网上的知识太多了,作为初学者的你根本不知道如何抉择。

我和你一样,曾经迷茫过,但庆幸的是我最后找到了答案,打开了计算机编程的大门。

如今作为一个编程近十载的老码农,我想就此将我的经验分享与你。此文仅代表的我的个人观点,欢迎一起讨论学习。

我将编程生涯分为了三个阶段,并且我会告诉你这三个阶段你分别要掌握什么样的技能,以及这三个阶段你可以做什么样的事情。

三个阶段

站在食物链顶端的程序员必然会经历过三个阶段。

悲催的是有些人整个职业生涯都处于第一阶段,而还有一部分停留在了第二阶段,只有少量的人才能进入第三阶段。

这三个阶段分别是:码农(代码民工)、程序员 和 架构师。

接下来我们一起详细聊聊这三个阶段:

第一阶段:码农

vYzUbem.jpg!web

每个程序员都会从码农做起。

还记得大学上第一节 C 语言课程的时候老师问谁有编程经验,教室里面有十来个同学举起手来,然而那时候我不知道编程是什么。没错,很多人还没进入大学就达到了码农阶段。

码农到底是什么,如何定义码农?

码农知道如何跟机器交流,他可以编写计算机能读得懂的文字。

当遇到一些问题时候,码农可以将问题转换为计算机可以读懂的代码,让计算机帮助我们干活(不管三七二十一,先 run 起来再说)。

如何你在这个阶段感觉到非常痛苦和难受,那么你应该认真思考一下是不是适合程序员这个职业。

如果 feel so good,那么恭喜你,你有可能会成为一个不错的程序员。

然而可悲的是,很多人在整个职业生涯中都处于码农这一阶段。

但是我要告诉你的是,这一阶段的你虽然能干活,但是很容易被年轻人替代,因为随着你年纪的增长,年轻人会比你更有活力,而且他们可以忍受拿更少的钱,搬更多的砖头。

如果你只是个码农,你的晋升机会也会很少,同时意味着你的薪水也会较少。

如果你想加入 BAT 级别的大公司,这个阶段的你会处处碰壁,面试一次被打击一次,你会面到开始怀疑人生,自暴自弃。

因此你需要掌握更多的技能,然后达到第二个阶段,成为一名 程序员

第二阶段:程序员

UFvIb2f.jpg!web

在这个阶段,你可能接触了至少 2 门编程语言,一个动态类型语言和一个静态类型语言。

程序员本质上是一个高级的码农,那么我们该如何进一步提升自己呢?

码农编写可以正常 run 起来的代码,俗称搬砖。而程序员呢,是编写高质量高性能的可以 run 的代码,俗称高级搬砖(哈哈哈)。

那想成为程序员你需要掌握哪些技能呢:

  • 了解代码最终如何变成硬件芯片可以理解和执行的指令。

  • 了解如何让代码有效利用计算机资源,例如 处理器、内存和网络。

  • 了解如何使用数据结构和算法编写高效的代码。

  • 了解代码质量很重要,并且会编写测试代码。

到此你是不是被吓到了,成为程序员居然还有这么多知识要学习,安安静静地做一个码农不香吗。

我要告诉你的是,码农很多,但是真正基础扎实的程序员并不多。如果你能静下心来修炼内功,达到这一阶段,BAT 的大门将随时为你敞开,你会收获更多的东西。

绝大多数人一辈子都会停留在这个阶段,直到退休。

第三阶段:架构师

MzieQrm.jpg!web

很悲催的告诉你,编程永无止尽,你需要不断的去学习去进步。

当你到达这个阶段时候,你会站在一个更高的角度,对系统的全局的思考比对细节的细腻了解更多。

你对设计大型分布式系统有扎实的了解,并且知道如何构建高可用,高并发,高可伸缩的大型分布式系统。

你永远不会停止学习,并且始终关注前沿的技术,当然你可能也会创造出一些技术。

在这个级别上,你可能会负责公司的大型项目,并且管理着一个团队,团队里面有几个骨干程序员和多个码农来完成工作。

你可能会经常和其他团队开会讨论和制定技术方案,同时你需要有出色的社交和领导才能。

如上就是我认为的程序员职业发展的三个重要阶段,那么接下来我们一起聊聊在这三个阶段我们该如何去学习,逐步打怪升级走向程序人生的巅峰。

1 - 编程

首先考虑如何成为一个码农,在这个阶段你往往会有这样的困惑,我到底该学哪门编程语言?

Java,Python,C#,Ruby,Go,JavaScript 。。。

其实你不应该为选择编程语言发愁,因为这个阶段,重要的不是特定的编程语言,而是一些编程的概念。这些概念在几乎所有其他编程语言中都适用。

当你成为经验丰富的程序员时,学习一种新的编程语言所需的时间不超过一个星期,所以不要浪费时间去纠结 “完美的” 编程语言,因为根本不存在,也没有必要。

话虽如此,我还是会推荐 2 门编程语言给你,从最简单的开始慢慢建立自信心,打怪升级从编程中获得乐趣。

Python

uqMNVrr.jpg!web

我强烈建议你从 Python 开始学习。

为什么?

因为 Python 是一门非常易于学习的语言,它真的,真的,真的很容易!

Python 是一门高级的编程语言,使用它可以非常快速的开发出一个程序,正如 Python 之父的名言:人生苦短,我用 Python。

夸张一点说,100 行 Java 代码完成的事情,Python 只要一行就搞定了。

那么如何学习 Python 呢?

在此推荐一下廖雪峰大神的在线图文 Python教程,这是比较全面的一套教程。

如果要继续简单点,你还可以在这个在线学习网站开始学习:Python 基础教程。

当然最好还是要搭配一本书一起学习,我推荐一下《Python 编程从入门到实战》,喜欢读纸制书的同学,它可以是你的一个选择。

NBZRNvq.jpg!web

Java

学完 Python 之后,我强烈建议你学习另外一门语言 Java。学习 Java 将会把你带入面向对象的世界,这是和面向过程完全不同的编程思想。

Python是一种动态类型的语言,而 Java 是一种静态类型的语言,此时你可能一脸懵逼,当你学完这两种语言之后你会茅塞顿开。

Python 和 Java的组合是很好的入门方法,学习他俩你会掌握到几乎所有的编程概念,为以后学习其他编程语言打下扎实的基础。

我要告诉你的是,Python 和 Java 目前在企业里被大量使用,同时 Python 是机器学习首选语言,Java 是大数据生态的核心语言,学习他们也会更利于你找到一份好的工作。

对于 Java 的学习,初期我建议你主要学习 Java Core 知识,等到熟悉以后再去学习高阶知识。此时,我不再会推荐你去在线网站学习,因为你已经拥有了编程基础,同时有了很强的动手能力,我会推荐你从书籍入手。

学习 Java 当然少不了经典的 Java 编程思想,我推荐 Bruce Eckel 大师的最新 Java 巨作《 On Java 8 》,这是内容相当充实的一本书,学完它你将掌握 Java 编程的核心技能,同时关于 Java 语言的面试题对你来说将会是小菜一碟,不信你读读看?

fi63Qfv.jpg!web

如果此时你仍然不满足,我会推荐你去学习一下 Java 之父 James Gosling 鼎力推荐的 《 Effective Java 》,它将教会你如何写出高效的 Java 代码,学完此书你的 Java 技能将会更上一层楼,此时你已经甩掉一大部分 Java 码农。

bmUjUb6.jpg!web

此处我要恭喜你!你已经获得码农资格证!

2 - 计算机的构造

此时你已经可以写出大量的代码,但是你真的明白计算机底层究竟发生了什么吗?

假设你编写了一个非常简单的程序,打印 Hello World 到屏幕上。

例如用 Python 来编写:

hello = 'Hello World'
print(hello)

在硬件级别,变量分配(hello = 'Hello World')是什么意思?字符串 'Hello World' 在硬件中如何表示?结果如何显示在你的屏幕上?

归根结底,计算机只是硬件芯片和电线的集合。

计算机到底是怎么理解我们的代码,并且完美的执行呢?小朋友你是否有很多问号?

uYJ3Mzz.jpg!web

事实是,代码只是最表面的东西。代码下还有许多其他层,它们一起互相协同工作,最终执行了我们输入的代码指令。

相信此时你已经迫不及待的去解决头上的众多问题,不要着急,我推荐一本书给你。

faQFJbU.jpg!web

这本书从最基础的角度介绍了硬件,编译器,链接器和操作系统,非常适合初学者。

它将告诉你,如何创建一种编程语言,如何创建编译器和链接器,最后创建操作系统。

3 - 算法和数据结构

现在你处于高度兴奋状,此时你的编程思维发生了转变。

因为现在,你知道代码之下计算机是怎么运行的,硬件是如何工作的。

你知道硬件资源是有限的,并且了解如何高效利用有限的资源。

但是还不够,我们要学习算法和数据结构。数据结构和算法是进入 BAT 大厂的必考项目,当然我们学习数据结构和算法也不仅仅是为了进入大厂,归根结底还是为了写出高效的代码,具体可以参考我之前的文章:面试了一个月,到底要不要刷算法?我有了答案。

在算法和数据结构方面,如果你已经掌握了 Java 编程,那么我推荐你从下面这本书入门:

YBjYba2.jpg!web

好吧,书确实挺厚的,但是书中的内容绝对值得你去花时间学习,学完此书,你将扎实的掌握数据结构和算法。

如果你不喜欢选择这本以 Java 描述的算法书,如下这本也是一个不错的选择:

EBvAZvb.jpg!web

4 - 网络

到目前为止,我们还没有谈到网络,生活在互联网时代,我们的程序不可能仅仅单机运行,因此作为一名合格的程序员掌握网络是必不可少的。

基础知识是枯燥的,寻找一本有趣的书是非常有必要的。

MVVjEfn.jpg!web

如上《计算机网络:自顶向下的方法》是一本超级容易理解的书,它涵盖了你需要知道的所有的网络基础知识,同时也是一本你可以用来垫桌角,适当时间查询的资料书。

学完此书,相信你会回来感谢我的推荐。

5 - 操作系统

如果你按照我推荐的学习顺序,此时知道了计算机的组成原理,网络,算法数据结构,那么是时候开始学习操作系统了。

操作系统基本采用 C 语言编写,所以你需要一些 C 语言的基本知识。

操作系统是非常繁杂庞大的知识体系,了解它的各个方面的所有细节非常耗时。我不建议你陷入细节,除非你想成为一名操作系统研发人员。

在这里,你只需要掌握基本操作系统概念,然后继续前进,不要被繁杂的细节揪住。

学习操作系统你可以参考如下这本书:

VrEVfqm.jpg!web

恭喜你!此时你已经是一名合格的程序员了!

6 - 分布式系统

分布式系统是关于构建和设计可伸缩的软件系统,避免单点故障。这要求我们站在更高的层次考虑问题,而不是专注于如何编写一个模块组件(程序员和码农)。

举个例子,例如你想要和你的好朋友通过软件进行聊天通讯,你租用了一台服务器,上面运行了聊天服务端,你和朋友的电脑上都运行了聊天客户端,此时你们可以开始愉快的聊天了。

相信通过前面的学习过程,这对你来说简直易如反掌。

但是当你的朋友的朋友知道了这个工具,也想加入进来,朋友的朋友的朋友也知道了,你的客户满满的变得巨多无比。

现在,你的服务每秒可以收到数百万个聊天客户端的请求。

假如此时你的聊天服务器出现故障怎么办?

数百万的请求将无法得到满足,此时应该开始考虑分布式系统设计问题了。

分布式系统是在单台机器无法满足我们的请求时候,将多台机器通过软件连接在一起,共同对外提供服务。

当请求量增加时,我们可以灵活的添加服务节点。同时如果某个节点故障后,整个系统仍然可以对外提供服务。

此处,我推荐《分布式系统概念与设计》,它可以帮助你掌握分布式系统设计的基本原理。

mEvyA32.jpg!web

7 - 机器学习

JVFfEvR.jpg!web

机器学习是一个横跨计算机科学,数学和统计学的领域,它是个硬骨头。

但是在当今时代,它被无处不在的使用!

例如每天刷抖音的小朋友应该深有体会,刷抖音一时爽,一直刷一直爽,都是机器学习搞的鬼,拼命的推荐你喜欢的东西。

即使你不从事相关的工作,我也建议那你学习了解一下它。

为什么?万一机器哪天会自己写代码了怎么办(哈哈哈)。

但是想要做这样的事情,我们还需要有数学和统计学基础,以及一些机器学习类库,例如,Python 的 Scikit-Learn。

机器学习主要有 2 种方法,一种方法和我们学习计算机基础知识类似,上来就是干,先学习类库撸代码,然后再补充理论知识(个人更喜欢这种);另外一种方式是先学习理论,数学、统计学和机器学习算法,这种方法在前期比较枯燥,初学者容易受挫。

当年学习 Java 我就采用了第一种方法,先直接撸代码,做项目,然后再巩固理论知识。这种方法容易形成正反馈,写代码一时爽,一直写代码一直爽。

一定有很多人采用这种方式,是的小朋友请举手。

qUbmyuU.jpg!web

但这种方法的缺点是,有时候比较难理解为什么这样做,这样做就没 Bug 了,因为我们缺少了理论知识。

相信你一定听说过大名鼎鼎的 Andrew Ng,他在 Coursera 发布的课程可以作为你的机器学习入门课程,这门课程里面没有采用 Python,采用了另外一门语言,具体原因相信你看到就懂了,Andrew 老师会细细的告诉你,哈哈。

如果你确确实实照我说的学习了上面的机器学习课程,那想必你应该已经知道了 Kaggle,去吧体验用技术赚钱的快感,嘿嘿。

恭喜你成神了!现在我认为你是一名架构师了!

感谢你的阅读,我为你准备了一份《高级 Java 面试指南》,点击在看,关注公众号,回复 " 礼物 " 获取。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK