明确目标
进入互联网行业,不管是实习,还是正式工作,要记住,从入行这一刻起,就要不停的学习、不停的思考,最好是根据自己的优缺点、喜好,订个明确的目标,自己到底想走哪条路线,是纯技术路线、不想太关心业务?产品经理?程序员只是过渡、想走管理?还是在互联网公司捞几年钱然后就转行?
-
对技术特别感兴趣:那毫无疑问,技术这条路,其实也没有上限,你可以去极客时间app上看看那些大牛们
制定计划、逐步实行
听起来有点土、老生常谈了对吗?但我觉得这个当真是最朴实、最简单、也最实用的道理。
我目前在某央企、某互联网公司都做过程序员这个岗位。互联网行业,给我最大感触就是变化快、对于程序员的要求也越来越高,各种红利基本已经耗尽,前些年很多人看程序员赚钱、纷纷转行做程序员,这个恐怕后续会越来越难,从面试所考察内容就有直观感受,虽然每年大家都会说“互联网寒冬”、公司难,但从2019年年末开始,明显考察的内容越来越深、难。比如有如下一些题目(下面主要以java程序员举例,毕竟需求量大):
-
java实现单例模式有哪些?知道DCL(双重锁检查)吗?为何要这么写?是否需要加volatile?
-
java里synchronized关键字,锁膨胀的过程?
-
java 线程池的7个参数?为何阿里开发规范建议自己创建线程池、不要用JDK工具方法创建?
-
java AQS是什么?用AQS手写一个锁?
-
java里类加载的双亲委托模型?JDBC是如何打破双亲委托模型的?
-
JVM垃圾回收器有哪些?各自算法?怎么搭配?
-
JVM调优?
-
kafka为何速度那么快?
-
常见MQ有哪些?特点是什么?
-
spring cloud有哪些组件?spring cloud 和spring boot的关系?怎么实现高可用?
-
……
上述还只是一部分,做一个合格的Java程序员实在太难了……目前就社招而言,想成为一个比较好的java程序员,能够脱颖而出、受大厂青睐的话,一般下面这几方面,至少得会,并且最好有一方面非常精通:
-
java多线程、高并发相关
-
JVM,会调优
-
mysql
-
MQ
-
redis
-
zookeeper
越是薪资高的岗位,要求越高。互联网公司,java程序员需求量很大,但已经不是找个培训班、上1个月学学spring mvc、会CRUD操作就可以胜任工作的时代了。可能实际工作里,确实用不到那么多,哪怕是阿里这种技术公司,同样如此。但“面试造火箭,进去拧螺丝”,那些受青睐的大厂们,就是因为能做那些岗位的人太多、他们需要筛选、优中选优,尽可能找到进来就能立刻干活儿的人,所以面试越来越难。
对于校招生
我的建议就是:
-
基础一定要扎实
-
尤其数据结构、算法、操作系统、计算机网络等。校招生刚入职时一般不会安排太重要的工作(大牛学弟学妹们除外,我只是说多数情况),所以大家可能参加工作后的前两年以为这些课不重要。但越往后,越是想往程序员这条(不归)路上深入走,就会发现这些课实在太重要了。那些大部头的书(类似操作系统第6版、CSAPP、重构这种书),早晚还是得仔细看。我目前在翻的书大家可以体会一下:
-
深入理解JVM 周志明,第三版(一块砖头……)
-
高性能Mysql 第三版(又一块砖头……)
-
redis设计与实现 (计划中、暂时还没时间看的一块砖头……)
-
java并发编程的艺术 方腾飞
-
zookeeper 分布式过程协同技术详解
-
-
-
一定要看源码
-
作为校招生,应该试着去看JDK 源码(比如HashMap ConcurrentHashMap AQS等),spring 源码可以尝试一下,这两个都是设计比较好的,源码中往往有很多注释,可以让你了解作者为何这样/那样实现,对于你自己的编程能力提高很有帮助。同时,这个对于校招有加分。
-
等到社招时,基本看源码是必问的,到时候会更深,比如,大家应该听说过netty,这玩意如果你看过源码、特别清楚原理,恐怕过面试so easy。只是举例子,netty这个估计对于在校生有些难,建议从JDK spring开始,养成读源码的习惯。
-
-
想进大厂,务必刷刷算法题
-
推荐极客时间的付费专栏《数据结构和算法之美》并尽量按作者提到的这个目录 https://github.com/wangzheng0822/algo 自己实现一下。
-
算法题,还是得刷刷leetcode,可以参与leetcode-cn每天刷题打卡的活动,持之以恒。
-
B站 花花酱 刷题视频(我没看,但B站上貌似看的人很多),或是覃超大魔王 五毒神掌刷题法(他的这个刷题法在B站有公开视频,我觉得不错,有按照他的思路在练习,有条件的可以参加下极客时间 算法训练营,不过网上有流出视频,可以找找)
-
labuladong 算法小抄,这个强烈推荐,有算法模板、习题分析 https://labuladong.gitbook.io/algo/di-ling-zhang-bi-du-xi-lie 有公众号labuladong
-
最重要的是务必自己去练手、不要以为看题解就理解了,要不断、反复练习,一道题刷几遍,简单到不能再简单(比如二叉树按层遍历),可以不用再练,但只要还有不理解、再次遇到时没法在5min内有思路的leetcode题目,都要隔段时间练习的。
-
工具:anki, leetcode 探索中的学习任务
-
算法资料:
-
-
-
加入一些技术群/刷题群,看大家是怎么学的
-
学习是一件反人类的事,很容易懈怠。加群,多看看网上有多少人在一起学习,可以方便相互交流,同时相互激励、避免自己偷懒。
-
-
持续学习,有输出
-
如果是学编程语言、各种框架,必须自己手写demo、跑程序、看看效果。最好养成学东西时尽量写笔记/博客的习惯,这样逐步积累,经年累月下来会非常可观。
-
-
找项目练手
-
网上,github上可以练手的项目很多,这个可以根据自身情况,自己找一下,一般培训机构都会选择网上商城,因为涉及的业务场景复杂、各种框架、中间件用的比较多,这里就不好推荐哪个了。
-
-
极客时间
-
极客时间的内容做的不错,每天听听卖桃者说,听听大牛们的观点,有条件的根据自己兴趣买些课学习,上面的课有不少质量相当高,以下仅推荐(我不是带货的,是真的不错的专栏哦),这些大佬们讲课往往是实际项目经验+理论知识,有些甚至能拿来直接用、解决工作中的问题:
-
陈皓 《左耳听风》
-
王争 《数据结构和算法之美》
-
丁奇 《mysql 45讲》
-
李玥 《消息队列高手课》
-
-
-
谷歌评分卡
-
技术的道路很长,可以参考谷歌评分卡,给自己打打分
-
以下翻译取自:https://www.jianshu.com/p/b1f57417320d
0 – you are unfamiliar with the subject area.(0 -你不熟悉主题领域。)
1 – you can read / understand the most fundamental aspects of the subject area.(1 -你可以阅读/了解主题领域最基本的方面。)
2 – ability to implement small changes, understand basic principles and able to figure out additional details with minimal help.(2 -能够实现小的变化,理解基本原理,并能在最小的帮助下找出更多的细节。)
3 – basic proficiency in a subject area without relying on help.(3 -在不依赖帮助的情况下,熟练掌握某一科目。)
4 – you are comfortable with the subject area and all routine work on it: (4 -你对主题领域和所有日常工作都很熟悉:) For software areas – ability to develop medium programs using all basic language features w/o book, awareness of more esoteric features (with book).(对于软件领域来说,能够使用所有基本的语言来开发中等的程序,使用w/o book,了解更深奥的特性(带书)。) For systems areas – understanding of many fundamentals of networking and systems administration, ability to run a small network of systems including recovery, debugging and nontrivial troubleshooting that relies on the knowledge of internals.(对于系统领域——了解网络和系统管理的许多基础知识,能够运行一个小型的系统网络,包括恢复、调试和依赖于内部知识的重要故障排除。)
5 – an even lower degree of reliance on reference materials. Deeper skills in a field or specific technology in the subject area.(5 -对参考资料的依赖程度更低。在某一领域或某一特定技术领域有较深的技能。)
6 – ability to develop large programs and systems from scratch. Understanding of low level details and internals. Ability to design / deploy most large, distributed systems from scratch.(6 -能够从头开始开发大型程序和系统。了解低层次的细节和内部信息。能够设计/部署大多数大型的分布式系统。)
7 – you understand and make use of most lesser known language features, technologies, and associated internals. Ability to automate significant amounts of systems administration.(7 -你理解并利用最不知名的语言特征、技术和相关的内部信息。能够自动化大量的系统管理。)
8 – deep understanding of corner cases, esoteric features, protocols and systems including “theory of operation”. Demonstrated ability to design, deploy and own very critical or large infrastructure, build accompanying automation.(8 -深刻理解角落案例,深奥的特点,协议和系统,包括“操作理论”。演示了设计、部署和拥有非常关键或大型基础设施的能力,并建立了相应的自动化。)
9 – could have written the book about the subject area but didn’t; works with standards committees on defining new standards and methodologies.(9 -本可以写关于主题领域的书,但没有;与标准委员会一起制定新的标准和方法。)
10 – wrote the book on the subject area (there actually has to be a book). Recognized industry expert in the field, might have invented it.(10 -写在主题领域的书(实际上必须有一本书)。业内公认的业内专家,可能已经发明了它。)
TCP/IP Networking (OSI stack, DNS etc)
Unix/Linux internals
Unix/Linux Systems administration
Algorithms and Data Structures
C
C++
Python
Java
Perl
Go
Shell Scripting (sh, Bash, ksh, csh)
SQL and/or Database Admin
Scripting language of your choice (not already mentioned) _
People Management
-