一些计划和总结

来源:互联网 发布:创维电视如何连接网络 编辑:程序博客网 时间:2024/05/17 20:24

昨天看了一篇bat的面试小结,今早也看了一篇。
然后反观自己的技术实力,的确差了点火候,想要跨上一个大点的平台,还需要更多的积累。
如果现在有个后人的来想我请教进入bat的路径,我觉得我有经验给他指条明路,而不至于多费时间走弯。
根据我的计划,在两到三年内我都要在技术的洪流中前行,争取能将自己的技术实力提升到一个能够独挑一方的高度,所以多参照一些别人的想法,不失为一种捷径。
下面是一些印象深刻的经验分享:

既然是社招,工作经验是必须的,三年以上最好,上面的几个JD里也体现了。然后是技术方面,结合自己的体会,总结下面几点:

基础知识必须要扎实

语言基础,计算机基础,算法和基本的Linux运维等

针对Java语言,需要对集合类,并发包,IO/NIO,JVM,内存模型,泛型,异常,反射等都有比较深入的了解,最好是学习过部分源码。这些知识点都是相通的,在面试中也可以体现。

从源码的角度,可以深入到哈希表的实现,拉链法以外的哈希碰撞解决方法,如何平衡内部数组保证哈希表的性能不会下降等;

从线程安全的角度,可以扩展到HashTable、ConcurrentHashMap等其他的数据结构,可以比较两种不同的加锁方式,RetreenLock的实现和应用,继续深入可以考察Java内存模型,Volitale原语,内存栅栏等;横向扩展可以考察有序的Map结构如TreeMap、LinkedHashMap,继而考察红黑树,LRU缓存,HashMap的排序等知识。

Java方向的中高级职位,会比较重视对虚拟机的掌握,诸如类加载机制,内存模型等,这些在程序的优化和并发编程中都非常重要。

算法方面,基本的排序和查找算法,对递归,分治等思想的掌握。如果算法基础不太好,推荐《编程珠玑》等,每一章都很经典。

计算机基础方面,比如TCP/IP协议和操作系统的知识也是必备的,这些都是大学计算机专业的基础课,也是做开发基本的素养。

系统设计能力

设计模式,造轮子的能力,各种缓存和数据库应用,缓存,中间件技术,高并发和高可用的分布式系统设计等。

大型互联网公司每天要面对海量的请求,都会考察分布式系统的架构和设计,如何构建高并发高可用的系统。另外因为用户基数比较大,一个细微的优化可能会给带来很大的收益,所以对一些技术栈的掌握要求都比较深入。比如对MySQL数据库,需要知道相关的配置和优化,业务上来以后如何分库分表,如何合理的配置缓存,一个经验丰富的服务端开发人员,也应该是一个称职的DBA。

对常用的开发组件,比如中间件,RPC框架等都要有一定的了解,虽然工作中可能用不到我们自己造轮子,但是掌握原理才会得心应手。这部分知识主要靠工作积累,推荐《大型网站技术架构与Java中间件实践》,还有曾贤杰的《大型网站系统架构与实践》,里面对大型网站的演变,服务治理和中间件的使用做了很详细的阐述。

作为业务开发人员,有必要了解压力测试相关的指标,比如QPS,用户平均等待时间等,可以帮助你更好的了解自己的系统。

软性指标

快速学习,良好的沟通能力,以及对相关行业的了解。

公司招聘会比较看重一个人的学习能力,是不是值得培养,很多公司校招的毕业生薪资会倒挂工作多年的老员工,也是这样。像沟通习惯,逻辑分析能力,这些都属于软实力,短时间内很难提高,需要长期的养成和持续不断的投入。好多公司还会看重所在行业,虽然是做业务,但是对产品和行业的了解也很重要。比如互联网金融类公司的岗位,如果有过支付和银行相关的系统开发经验肯定会有加分,这点和每个人的长期规划有关。

有了方向,接下来就是如何提高,说一些自己的感想。

很多时候,除非你的工作内容就是要应对高并发,海量用户等场景,否则通过加班或者说重复性的工作,其实很难有提高。技术人员最直接的提高方式,还是需要跳出来,在工作以外审视自己,比如广泛的阅读技术书籍,多去论坛和各路牛人交流,了解主流互联网公司的技术栈,有针对性的去学习和了解。同时也可以适当的了解一些产品或者设计的知识,以点带面,复合人才肯定更受欢迎,对待面试,要像和妹子约会一样,表现自己平常的一面就可以了。

另:

刷leetcode的题目 从牛客网和google上搜集面试题,分门别类的进行整理,每天都回顾一下
拓宽自己的知识面,学习一些新的知识,比如当时流行的docker,更侧重学习其原理
加深自己对一些底层的OS知识的理解,比如epoll的原理、docker的cgroup机制和namespace机制的实现、文件系统VFS的实现、Linux信号、管道等的实现。

此外在贴一个阿里的java面试考点:

  1. 一面: HashMap原理, JAVA内存模型,排序算法,JAVA多线程实现,JAVA线程和进程区别
  2. 一面: Spring IOC Spring AOP是干嘛的
  3. 一面: HashMap,put和get同时操作 treemap实现,红黑树 concurrenthashmap 聚簇索引和非聚簇索引(出现次数少)
  4. 一面: HashMap源码,线程有几种状态,怎么互相转化,HTTP状态吗,Session,Cookie区别,排序算法,事务的ACID,索引的实现机制(B+树),优缺点
  5. 一面: Post和get区别,http缓存,DNS解析,排序
  6. 一面: List和set区别,linklist和arraylist区别,应用场景,hashmap多线程concurrenthashmap
    怎么实现,jam参数,gc参数,lock和synchronized,http 302 https具体数据传输流程
  7. 一面: Map的Key要求,HashMap实现原理,JDK1.8 HashMap改动(引入红黑树)
  8. 一面: Spring MVC底层实现,进程和线程区别,哈希如何解决冲突,数组和链表在内存中表型形式,平衡二叉树,红黑树,HTTP/HTTPS过程 OSI 7层模型
    TCP三次握手
  9. 一面: TCP连接断开过程,为什么要三次握手 数据库隔离级别,序列化级别有什么优缺点 内存泄漏如何检测,介绍堆和栈 10 一面: Object类方法,error/exception/runtime
    exception区别,JVM垃圾回收,linux查看日志文件,*9数据库四大特性,事务隔离级别,幻读 ClassLoader 11 一面:
    SpringMVC和Struts比较,为什么要用spring有什么优点,启动线程方式,线程池有几种,干什么用。JVM加载过程,JAVA内存模型,排序
    12 一面: 三次握手,超时重传。TCP保证可靠性,拥塞控制,滑动窗口协议 由http升级为https需要哪些操作 http 2 了解过吗
    hashCode与equals的区别联系。自动拆装箱 线程同步,并发操作怎么控制

综合来看,所有的招聘要求,都有一些共同点:
理解java的基本语法(集合,hashmap的安全性和底层实现,反射,Nio,数据库连接池原理和实现等)
理解jvm(包括调优,内存模型,垃圾回收算法和classloader,双亲委派模型等)
对db有较为深入的理解(包括底层的实现,性能的测试和调优,红黑树和b+树的应用,不同引擎的应用场景,分布式部署db等)
掌握高效并发(包括Volitale原语的底层实现,线程的安全性,锁,同步代码块等)
理解并能够熟练运用主流框架(Spring,SpringMVC和hibernate,mybatis等)
熟练运用算法(快排冒泡,分治 DFS 动态规划等)
接触过前沿的或者最新的技术(关注ES6-前端方向,java8和之前版本的对比,Spring boot ,docker等)

原创粉丝点击