就在前天,一个学弟入职了字节跳动,拿到的薪资要比 20k 高不少。私下里,我俩交流的也很多。
说实话,后端程序员,比如说 Java、Go、C++ 这些编程语言的使用者,只要能做到下面这些,拿到一二线城市超过 20K 的薪资还是不难的。
各大公司的笔试基本都考这个,《剑指 Offer》上的所有题目如果能背下来,LeetCode 刷个一百到三百道题,参加过 ACM 竞赛的也可以。
《剑指 Offer》,指的是《剑指 Offer:名企面试官精讲典型编程题》这本书,里面剖析了 50 个典型的程序员面试题,包括基础知识、代码质量、解题思路、优化效率和综合能力等 5 个方面。
LeetCode,一个在线刷题网站,包含了海量技术面试题,包括算法、数据结构 和 系统设计等 1000+ 题目,能帮助大家快速地提高编程技能,轻松拿下世界知名 IT 企业的梦幻 Offer。
LeetCode 上收录了 75 道《剑指 Offer》上的技术面试考题,有位运算、哈希表、堆、字符串、数组、查找、栈和队列、树、递归与循环、链表等多类题目。
ACM 竞赛,由 ACM(AssociationforComputingMachinery,美国计算机协会)组织,是世界各地计算机程序设计者大显身手的舞台,也是世界一流大学展现教育成果的最佳窗口。
算法题虽然被很多人不屑,就像古代的八股文一样,但企业都这么考,不准备的话,很难不挂!
计算机存储、组织数据的方式,包括数组、链表、栈、二叉树、哈希表等,算法是解决问题的方案,为数据结构服务。算法能对数据结构中的数据进行各种处理,比如查找数组中的数据,或对其进行排序等等。
在 Java 中,数据结构一般可以分为两大类:线性数据结构和非线性数据结构。哈哈,这个非字很有灵魂吧?
线性数据结构有数组,代表作除了数组本身,还有 ArrayList;还有链表,代表作是 LinkedList;还有栈,遵循后进先出的原则,也就是“Last In First Out”(简称 LIFO)——最后的一个进的,最先出去;还有队列,只允许在队尾添加数据,队首移除数据。队列在 Java 中的出现频率非常高,有各种不同的类来满足不同的场景需求。像优先级队列 PriorityQueue、延时队列 DelayQueue 等等。
非线性数据结构有树,由 n(n>0)个有限节点组成的一个具有层次关系的集合。之所以叫“树”,是因为这种数据结构看起来就像是一个倒挂的树,只不过根在上,叶在下;还有哈希表,也叫散列表,是一种可以通过关键码值(key-value)直接访问的数据结构,它最大的特点就是可以快速实现查找、插入和删除;还有图,由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G 表示一个图,V 是图 G 中顶点的集合,E 是图 G 中边的集合。
虽然不需要在面试官前面手推各种数据结构的时间空间复杂度,也不需要手写红黑树、B 树、B+ 树,最起码要清楚 ArrayList 与 LinkedList 之间的差异,要知道 HashMap 的扩容机制。
计算机是由 CPU、内存、显示器这些设备组成的硬件,但我们大学毕业后,往往从事的是软件方面的开发工作。那怎样才能在硬件和软件之间自由穿梭呢?答案就是学好计算机组成原理。
弄明白了计算机的组成原理,也就对整个软件开发有了一个系统的认知,不论是计算机的硬件原理,还是软件架构,都能很好的驾驭,随之而来的,我们的职业发展机会也就更多了。
计算机组成原理这门课完全可以用一个词来概括,就是“抽象”。在我看来这也是整个计算机设计中所蕴含的的灵魂。
把《深入理解计算机系统》这本书吃了吧!
当今这个时代,没有网络简直无法生存,哪怕是在电梯里的一分钟,我都受不了那种手机没有网络的状态。我们所学的编程知识,如果脱离了网络,将变得毫无意义,因为没有哪个编程语言是要在单机环境下运行的。
计算机网络这门课实在是太重要,几乎是面试必问的内容,什么 TCP/IP 三次握手,四次挥手,TCP 和 UDP 的区别,HTTP 协议等等。
一开始学 Java 的话,可能会觉得计算机网络没什么用武之地,等到你开始接触 Tomcat,接触 Nginx,接触网络编程,比如 BIO 和 NIO,以及网络编程框架 Netty,你就会感慨,要是劳资当初把计算机网络这块的知识打牢该多好呀。
入门书有《图解 HTTP》、《图解 TCP/IP》、《网络是怎样链接的》,再深入的话推荐《计算机网络:自顶向下》。
为什么要学习操作系统呢?
第一,面试要考;
第二,无论学习哪门子编程语言,比如说 Java、C/C++,都需要和操作系统打交道,像 Java 中的多线程技术,其实是由操作系统来负责进程和线程管理的;
第三,学习操作系统,还能学到内存分配方面的知识。
可以先看一看《现代操作系统》,知道 OS 的大概;然后再看《操作系统—精髓与设计原理》、《Linux内核设计与实现》,达到这样一个水平:
Linux 的话,推荐《鸟哥的 Linux 私房菜》。
学习一门编程语言,如果不去操作下数据,就感觉这门编程语言空有皮囊却没有灵魂,对吧?要想学好数据,首先要学习一下 SQL,推荐《SQL 必知必会》,然后是 MySQL,推荐《高性能 MySQL》。
再拓展的话,还有 Redis,互联网技术领域中使用最广泛的存储中间件,推荐《Redis 深度历险:核心原理与应用实战》。
还有 MongoDB,非关系型数据库,推荐《MongoDB权威指南》。
我认为设计模式是初中级程序员迈向高级程序员的必经之路。有不少程序员,前期冲劲十足,但后继乏力,都是吃了设计模式的亏。在工作的前几年,大部分程序员都处于熟悉编程语言的阶段,也就是处于“技”的阶段,随后就要进入“术”的阶段了。在编程领域,“术”的典型代表就是“设计模式”。
大家都听说过,学习设计模式非常的重要,那么为什么这么重要呢,设计模式到底是什么?打个比喻学编程就像学武功一样。
武功要练得很牛逼,有两样东西不能丢。第一,是内功;第二,是武功秘籍。内功对应到编程就是我们编程基础能力,那编程的设计模式就可以想象成武术中的武功秘籍。
推荐《设计模式之禅》,我认为是设计模式领域 3 本经典著作之一,也是我们国内程序员写的一本书,趣味化十足,读起来也非常容易理解。
这里拿 Java 为例。
第一部分,Java 基础
学 Java 基础的话,我推荐两本,一本《Java 核心技术卷》,一本《Head First Java》。
《Java 核心技术卷》分为上下两册,上册的难度较低,可以在最短时间内刷完,尤其是有了 C语言的编程基础后,再刷这本书可以说是手到擒来。下册涉及到的内容有流与文件(☆)、XML、网络(☆)、数据库编程、国际化、Swing、AWT、JavaBean、安全(☆)、脚本编译和注解处理、分布式对象、本地方法(☆),没有标星的内容我认为可以略过。
《Head First Java》更有趣一些,里面有很多小游戏,很活泼的一本书。
两本书之间的风格差别比较大,之前就有读者给我反馈说,《Head First Java》有点驾驭不了,那就挑《Java 核心技术卷》。
刷完任意一本书后,可以看一看《Java 编程思想》,看自己是否能驾驭得了。因为思想的东西嘛,只有经过一些实践后才能有所感悟,否则就像王阳明一开始对着竹子格物一样,屁也格不出来,有了后面领军作战的经验,以及到地方上体验艰苦生活的感受后就开创了心学。
如果 Java 编程思想看起来确实比较痛苦的话,可以看一看《On Java 8》,GitHub 上有开源的中文翻译版,作者是同一个人。
上面提到的这 4 本书里面都还保留了图形程序设计的内容(AWT 和 Swing),我认为是完全可以跳过的,希望后面出版社再版的时候能把这些内容全部删除,定价估计就降了,但他们不一定会这么干。
Java 是一门面向对象的编程语言,所以三大特性:封装、继承、多态是必须要掌握的,然后是异常处理、IO、集合和并发编程。只要这些内容掌握了,可以说 Java 的基础知识就全部掌握了。
大部分 Java 程序员都要从事 JavaWeb 的相关开发工作,要开发 JavaWeb,自然就离不开 Spring 的系列框架。甚至可以这么说,没有 Spring 的 Java 项目是不存在的。
要学习 Spring,能读的书不多,我能想到的只有《Spring实战》,坦白地说,这本书很一般,但市面上比它好的书,我还不知道。学完 Spring,就要学 SpringMVC。
然后是 MyBatis,不用找书看了,直接看官方文档就行,讲得特别好。本身 MyBatis 也没有特别难的东西,就是一些 XML 配置和动态 SQL。
Spring+SpringMVC+MyBatis 这三个学完,可以说你就具备了开发企业级应用的能力了。
然后是 Spring Boot,我推荐看大哥纯洁的微笑的博客,访问量在千万级别以上,影响了无数的初学者,我个人强烈推荐。链接就不用我贴了,直接搜“Spring Boot”关键字就行了。
如果说你已经掌握了 Spring、SpringMVC、MyBatis、Spring Boot 等内容,就有能力进行一些真正有用的应用项目开发了,比如说学生管理系统、商城系统、博客系统、秒杀系统等等。
如果你觉得这些系统无从下手的话,其实可以到 GitHub 或者码云上去找,很快就能找到一大堆。为了节省大家的时间,我直接给大家推荐两个。一个微人事,一个 mall,可以直接到 GitHub 上搜。
工欲善其事必先利其器,掌握了下面这些工具,学习起来其他的内容也会更加顺手,不用瞎折腾。
Intellij IDEA,编写 Java 程序的最佳 IDE,必须得掌握。
接下来是 Maven,可以帮助我们解决 jar 包的烦恼。看《Maven 实战》就可以了。
然后是 Git,工作中是必须掌握的,看《Git 权威指南》就好了。
这些内容学完后,就可以准备找工作了,但在找工作之前,一定还要做两件事。这两件事对找到一份心满意足的工作至关重要,缺一不可。拼命学习了这么长时间,就剩下这最后两个关键节点了,怎么能不锦上添花。
对于还在校的学习编程的学弟学妹们,我还几句掏心掏肺的话想要 BB。
大家应该听过这句话,“互联网时代,选择比努力更重要。”于是,大多数人就在纠结,到底该选择什么才能不那么努力就轻而易举的得到,到底选择什么才能不后悔。
但大多数人往往会忽略一件事,说“选择比努力更重要”这句话的人,其实付出了很多很多常人看不到的努力。
很多人听说 IT 行业很吃香,于是倔强的选择了 IT,这是对的,互联网虽然已经很卷了,但仍然处在蓬勃发展的阶段,很多地方都充满了机会。
我要告诉大家的是,既然选择了,就要付出努力,不要轻言放弃。
很多事情,短时间内都是没有答案的,只有把时间线放得长一点,才能验证选择到底是否正确。
我妹学了有小半年的编程了,她就经常给我抱怨,“编程太难了!”
说句实在话,编程确实不是一件容易的事儿,我上大学那会,也觉得编程难,难得想要放弃!真的,一点不骗大家。
现在不是放寒假了嘛,我就没看见过我妹打开电脑敲过代码,每天用得最多的一个软件,大家不用猜应该就知道,它叫“抖音”。
抖音是一件国民级的软件,的确给我们带来了很多欢乐和感动,我不讨厌它也不喜欢它,因为对于那些自制力差的人来说,抖音悄无声息地就把他们的时间消耗殆尽。
卡耐基的《人性的弱点》里阐述了一个发人深省的观点:
99% 的情况下,不管犯下多么严重的错误,人们都会优先归咎于他人。
例子我就不再举了,我也有过这样的想法。一开始学编程很难,于是同学们不约而同地都把责任归咎到了老师那边,认为是老师自己学艺不精,所以才没办法把我们教好。
但事实上,这就是人性的弱点,我们都在想方设法地为自己找借口,找一个看起来很合理的接口。
编程难不难,我估计没人敢说容易,哪怕是出了名的大佬们。可正因为难,才有价值,不是吗?因为难,就不学了吗?
答案也显而易见,“不一定。”
我每周会去三次健身房,每次都会见到一个人,他的肚子好像一直就那么大。他没有请私人教练,也没有练习器械,单纯的就是在跑步机上慢走,走大概 20 分钟左右。
在我看来,他很努力也很自律,然而这样的努力,往往收不到任何的效果。
这也就是为什么,常常有人会抱怨,“为什么那谁谁谁努力了就成功了,而我没有呢!”
每天把输出“hello world”的程序敲上一百遍,坚持一百天,这样学编程的话,效果可想而知,是学不好的。努力,并不是不断地做重复性的工作。
真正的努力,需要花费足够多的时间,并且要不断的寻求突破。
就拿学习 Java 来说吧,一开始可能要先学习 C 语言,打下坚实的基础,如果没有学的话,直接开始学 Java 也行,但以后有时间的话,还是要补一补的,好处很多。从 Java 基础知识,到面向对象编程,到网络编程,到多线程并发,到 Java 虚拟机,到性能优化。
这一条线下来,还不够。还要学习工具,比如说 IDE、Git、Maven;还要学习框架,比如说 Spring、MyBatis、Spring Boot;还要学习数据库,比如说 MySQL、Redis 等等。
对,我们常说,做任何事情之前,都要先定个目标,这样做起事情来就有了动力,不至于漫无目的。
但,如果做什么事情都奔着一个目标去,会感觉很累,累到有时候你会丧失信心。
我们可以把“我要学好编程”作为目标,也可以把这个目标简单做下拆分,比如说先入门再进阶,然后再拓展。更甚至,可以抱着一种“玩一玩”的心态,也没什么大不了的。
我喜欢看王小波的书,但一开始,我并不知道有王小波这个人,而在通过一个叫《一个人的书房》的播客节目了解到的。这个播客里提到了《沉默的大多数》,于是我就买来读了读,觉得有趣得不得了,然后我就又买了时代三部曲,然后就读啊读。
等到我要写作的时候,莫名其妙地,就受到了王小波的影响,写出来的文字就带有一些“幽默风趣”在里面。
但如果一开始,我是抱着一种我要把文章写得有趣,再去读王小波的作品的话,没准我会读得很困难,因为我可能会静不下心来,我想从书里面挖掘“有趣”,可能就失去了阅读的兴趣。
同样的,如果我们抱着一种“玩一玩”的心态来学习编程的话,没准真能把编程学好。但如果我们抱着一种“我一定要把编程学好”这种心态的话,没准在遇到困难的时候就放弃了,因为我们定下来的目标很难完成,以至于我们有一种负罪感,这种学习状态下,学好是一件很难的事,学不好倒是一件很容易的事。
把目标降到最低,也是为什么我们在学习一门编程语言的时候要敲“hello world”的原因。
学完上面这些内容,大家就可以准备找工作了,但在找工作之前,一定还要做两件事。这两件事对找到一份心满意足的工作至关重要,缺一不可。拼命学习了这么长时间,就剩下这最后两个关键节点了,怎么能不锦上添花。
1)first blood
一定要刷面试题,做到有备而战。就像打战一样,如果只是招募到兵员,却不训练,上了场,根本就不经打,只有训练有素的士兵,在场上作战的时候才能做好攻守平衡,应付自如。
2)double kill
一定要准备一份让面试官耳目一新的简历,很多初学者容易忽略的一个点就是,随随便便整一份简历,然后就开始投递,结果就像石沉大海一般,没有回响。作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深处说,简历就是一块敲门砖,它通过白纸黑字的方式告诉招聘方,我是谁,我想来贵公司担任什么职位,我能够完成什么样的工作,我能够为公司带来什么价值,我期望的薪资是多少。
OK,这两件事准备充足了,就大胆地往前冲吧,相信我,就像我的师弟一样,你也一定能找到一份满意的工作,20K的工作等着你。
如果你想要学习Java的话,我给你分享一些Java的学习资料,你不用浪费时间到处搜了,从Java入门到精通的资料我都给你整理好了,这些资料都是我做Java这几年整理的Java最新学习路线,Java笔试题,Java面试题,Java零基础到精通视频课程,Java开发工具,Java练手项目,Java电子书,Java学习笔记,PDF文档教程,Java程序员面经,Java求职简历模板等,这些资料对你接下来学习Java一定会带来非常大的帮助,每个Java初学者都必备,请你进我的Java技术qq交流群自行下载,所有资料都在群文件里,进去要跟大家多交流学习哦。