查看原文
其他

去携程实习了!

沉默王二 沉默王二 2022-07-13

大家好,我是二哥呀。

今天奶奶过 80 岁生日,我和妹妹回老家给她老人家祝寿,车上,我们谈起了毕业后去哪里工作的话题。老读者应该知道了,我毕业后去的苏州,从个人情感上来说,我是非常喜欢苏州的,不仅景美,人也美,哈哈。

毕业后去哪个城市,其实对于我们程序员来说,还是蛮重要的,这在很大程度上决定了你未来的职业发展。

首先,尽量选择一线城市,比如说北上广深杭,这里的机会多,薪资起点高,技术紧跟潮流。其次,可以选择省会城市,比如说成都、南京、武汉,薪资相对还不错,技术也跟得上,还可以作为长期发展的根据地,没有意外基本上就在这里定居了。

我当时从苏州回洛阳的原因其实很简单,因为——爱情。加上实习的一年时间,我在苏州了工作了三年半,当时刚涨了一波薪资,签了新的合同,在公司的发展前景也很不错。但为了爱情,必须忍痛离开,异地你懂的。

当时对在洛阳的发展其实是挺悲观的,没想到,这些年,凭借自己的努力,发展的还算是有声有色。我身上的这些变化,老读者应该感受得很明显,尤其是身边的一些同学,基本上都觉得我特别不可思议,完全超出了他们的认知程度。

我心里其实对我妹是有规划的,这点她也很清楚,所以她想毕业后去北京做 Java 开发。其实也不一定非要去北京,上海、广州、深圳、成都、杭州这些城市都是可选项。

去这些城市,有一个天大的好处,就是起步的薪资会相对较高。这么说吧,一个水平还算不错的程序员,即便是工作了五六年,在郑州这样的二线城市,能拿到一万五的薪资算是表现好的了。

对于北京这样的一线城市来说,情况就完全不同了,如果学历 OK,表达能力强,能击中面试官的痛点,起薪拿到两万是没有问题的,如果还有其他优秀的加分项,拿到的薪水会比这个数目高得多。

退一万步说,即便是拿不到这个数,也会比二三线城市好很多。

薪资拿到这个数难不难,当然是有难度的,但只要找到方法,自己肯去努力,就有很大机会拿得到。给大家晒张图,我之前在票圈提到过。

一个读者,也是洛阳的,刚好是我老乡,半年前给我说,准备自学 Java,还是机械专业的,明年秋招找工作。这不,半年过去了,他就找到了,现在去携程实习去了,薪资水平还不错。

携程和 BAT 这些大厂在薪资上肯定是有差距的,但携程也算是国内能排上号的互联网公司了。考虑到这个读者还是非科班,只花了半年的时间,所以我觉得还是挺牛逼的。

一面的时候他曾给我发消息,说面试官问他 Java 虚拟机栈方面的知识点,没回答上来,我就立马写了那篇文章甩给他,没想到,万万没想到,还真的帮上了忙,二面的时候就回答的很顺利。

其实我也没帮他太多,更多的还是靠他自己的努力!

看到这,肯定有读者按捺不住了,想问二哥,“都问了哪些问题啊,能不能分享一下啊。”那必须滴,二哥已经帮大家问过了。

先说一面的知识点:

  • Java 的基本数据类型以及占用的内存大小;
  • Java 内存模型;
  • 线程间通信;
  • 线程池参数以及意义;
  • MySQL 的锁;
  • 遇到并发问题该怎么办;
  • 字符串常量池以及相关问题;
  • 网络通信协议。

再说二面的知识点:

  • Spring 的 IoC;
  • 让你写一个类似于 MyBatis 的 ORM 框架,你会怎么写;
  • 数据库并发操作会带来哪些问题,以及如何解决;
  • MySQL 默认的隔离级别是什么;
  • 数据库索引相关的知识点;
  • JVM 的相关知识点;
  • 了解过那些设计模式;单例模式口述一下;
  • 快排;

可以看得出,都是非常基础的知识点,有些很零碎的他没记起来,不过没关系,我在这个基础上帮大家再梳理一下。

1)集合类,面试经常被问到的知识点有:ArrayList 和 LinkedList 的区别,它们在增删改查时的时间复杂度;HashMap 的数据结构,底层是通过数组+链表实现的,当链表的大厂大于 8 时,转为红黑树,推荐大家看一下这篇文章,美团技术团队出品的。

https://zhuanlan.zhihu.com/p/21673805

看完了这篇,面试官再问 HashMap 基本上就可以对答如流了。

2)多线程并发,面试一般都会问进程与线程的区别、synchronized、volatile、锁、ConcurrentHashMap、CopyOnWrite、线程池、CAS、AQS 等等这些知识点。推荐大家看看我之前给大家推荐过的一份小册子,阿里的几位大佬写的,名字叫《深入浅出 Java 多线程》,离线版可以在后台回复“并发”关键字拉取,在线版的地址如下:

http://concurrent.redspider.group/

多线程并发这块要学习到什么程度呢?我来问一个,在使用线程池时,因为使用了无界队列,远程服务异常的情况下导致内层飙升,怎么解决呢?

3)Java 虚拟机,并发编程和 Java 虚拟机应该说是 Java 的知识体系中最重要,也是最难的两块了,也是面试必问的题目。其实学习 Java 虚拟机不只是为了面试,还能帮我们更深入地理解 Java 这门语言,也能为线上排查问题打下基础。关于 Java 虚拟机的知识点,我用思维导图列一下,大家可以按图索骥,去阅读相对应的文章。

要想学好 Java 虚拟机,必须得啃周志明老师的《深入理解 Java 虚拟机:JVM 高级特性与最佳实践》,目前已出到第三版。如果觉得比较难懂的话,其实可以到 GitHub 上看看我给你推荐的这份读书笔记。

https://github.com/TangBean/understanding-the-jvm

其中 Java 内存管理机制和 Java 虚拟机程序执行需要重点掌握,至于虚拟机性能监控以及故障处理,其实可以放到工作以后再去实践会好很多。

4)框架原理,我建议大家不要对学习框架有任何的抵触,不要总觉得学习 Spring 全家桶很 low,其实不是的,学会了 Spring 全家桶,你就可以上手做练手项目,做了练手项目,你就会感觉学过的那些知识都可以落地了。

学习框架当然不能只停留在会用的层面上,还得懂一些原理,比如说 Spring 的 AOP、IoC、DI 等等,@Guide 哥的《面试突击》解释得很清楚,一起来看一下。

AOP(Aspect-Oriented Programming),也就是面向切面编程,能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

IoC(Inverse of Control),也就是控制反转,是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。DI(Dependency Injection),也就是依赖注入,原来叫 IoC,能让人更加直观和清晰地理解其背后所代表的含义。

如果还不理解的话,可以看看《码农翻身》,里面讲的更生动一些。

5)数据库,面试中最经常问的就是 MySQL 和 Redis。关于 MySQL 的学习,我之前也推荐过学习资料,书的话就是《SQL 必知必会》和《高性能 MySQL》,在线学习网站的话,就上 MySQL Tutorial,内容还是非常全面的,下图是 MySQL 在面试中常见的知识点。

MySQL 的数据是存在硬盘上的,而 Redis 的数据是存在内存中的,所以读写速度非常快,于是 Redis 就广泛应用于缓存了。除了做缓存之外,Redis 也经常用来做分布式锁,甚至消息队列。

像 Redis 的内存淘汰机制、持久化机制、缓存穿透、缓存雪崩等等是面试中经常被问到的点,学习资料的话,推荐看一下老钱的《Redis 深度历险:核心原理与应用实践》。

6)计算机基础的相关知识,这就包括操作系统、计算机网络、数据结构与算法等等。

操作系统,也就是 Operating System,是管理计算机硬件和软件资源的程序,是计算机的基石,像 Unix 是用 C 语言写的。记得大学阶段,最经常用到的一个快捷键就是 Ctrl+Alt+Delete,为了调出 Windows 的进程管理程序,看哪个比较占内存就把它给强制结束掉,免得打游戏的时候电脑卡死,嘿嘿。

操作系统负责的工作有:管理设备、文件读写、控制进程、管理内存等等,算是所有软件中的老大,掌握着生杀大权。推荐的学习资料有《现代操作系统》、《深入理解计算机系统》,两本用来压泡面或者垫显示器的神书。

套用 @Guide 哥在他的知识星球里说的一段话就是:

操作系统中的很多思想和经典算法,都可以在日常开发使用的各种工具或者框架中找到影子。

比如说 Redis 和操作系统的高速缓存就很像,Redis 是用来解决程序处理速度和访问 MySQL 速度不对等的问题,而内存就是用来解决 CPU 处理速度和访问磁盘等外存速度不对等的问题。

现在想想,觉得挺遗憾的,大学阶段没有把计算机网络这门课学好。当时把所有的重心都扑到了 Java 这门编程语言上,但其实我的专业是计算机网络。

像下图中的这些计算机网络的相关知识点也是面试中的常客:

像《TCP/IP 详解,卷 1》是讲解网络协议的经典书,不过学习难度比较大,可以看一看《图解 HTTP》以及《网络是怎样连接的》这两本书,有大量的图片穿插,阅读起来就不会那么枯燥。

数据结构与算法,@程序员吴师兄画过一副思维导图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。

常见的数据结构有数组、链表、栈、队列、哈希表、二叉树、堆和图;常见的算法有递归、排序、二分查找、哈希算法、贪心算法、分治算法、回溯算法和动态规划等。

可能很多时候,我们会觉得数据结构与算法不重要,不如直接学习 Java、学习 Python 更直接一点。但我想说的一点是,学习数据结构和算法能让我们学到一种思想:就是如何把现实问题转化为计算机语言来表示(来自《码农翻身》的作者刘欣大佬)。

另外一个很现实的问题是,面试要考,尤其是一些大厂,很喜欢考。

最后,二哥必须要说的一点是,月薪两万只是一个数字,每个人的情况都是不同的,不同的城市,不同的公司,不同的面试官,不同的学历,不同的面试表现

但要学习的内容我觉得还是很具有普适性的,虽然没有总结得很完全,但是我觉得这些都是非常必须的,从去携程实习的这个读者给出的面试题就能看得出。

另外,二哥要强调的一点是,一定要实战能力强,到了实习的时候能独立地把安排的活给完成了。

希望大家多来给报喜呀~~~~

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存