Section 1
-
Core Java,就是 Java 基础、JDK 的类库,很多童鞋都会说,JDK 我懂,但是懂还不足够,知其然还要知其所以然,JDK 的源代码写的非常好,要经常查看,对使用频繁的类,比如 String,集合类(List,Map,Set)等数据结构要知道它们的实现,不同的集合类有什么区别,然后才能知道在一个具体的场合下使用哪个集合类更适合、更高效,这些内容直接看源代码就 OK 了
-
多线程并发编程,现在并发几乎是写服务端程序必须的技术,那对 Java 中的多线程就要有足够的熟悉,包括对象锁机制、synchronized 关键字,concurrent 包都要非常熟悉,这部分推荐你看看《Java 并发编程实践》这本书,讲解的很详细
-
I/O,Socket 编程,首先要熟悉 Java 中 Socket 编程,以及 I/O 包,再深入下去就是 Java NIO, 再深入下去是操作系统底层的 Socket 实现, 了解 Windows 和 Linux 中是怎么实现 socket 的
-
JVM 的一些知识,不需要熟悉,但是需要了解,这是 Java 的本质,可以说是 Java 的母体, 了解之后眼界会更宽阔,比如 Java 内存模型(会对理解 Java 锁、多线程有帮助)、字节码、JVM 的模型、各种垃圾收集器以及选择、JVM 的执行参数(优化 JVM)等等, 这些知识在《深入 Java 虚拟机》这本书中都有详尽的解释, 或者去 oracle 网站上查看具体版本的 JVM 规范.
-
一些常用的设计模式,比如单例、模板方法、代理、适配器等等,以及在 Core Java 和一些 Java 框架里的具体场景的实现,这个可能需要慢慢积累,先了解有哪些使用场景,见得多了,自己就自然而然会去用。
-
常用数据库(Oracle、MySQL 等)、SQL 语句以及一般的优化
-
JavaWeb 开发的框架,比如 Spring、iBatis 等框架,同样他们的原理才是最重要的,至少要知道他们的大致原理。
-
其他一些有名的用的比较多的开源框架和包,Netty 网络框架,Apache common 的 N 多包,Google 的 Guava 等等,也可以经常去 Github 上找一些代码看看。
section 2
每逢长假都会有很多程序员跳槽,十一、过年是跳槽黄金时刻,尤其是过年。过年的时候年终奖到手,没有了多少牵挂,年终同学同事聚会比较多,沟通的就多,各种工作机会的消息也相应会多,所以跳槽的机会也就会多。跳槽就必不可少的要经过面试,那么作为一个 Java 程序员需要准备哪些面试知识呢?下面就给大家说说。
-
集合框架
从上图可以看到主要是 Collection 和 Map 的继承类和 Iterator 的实现类,重点掌握 ArrayList、LinkedList、Vector、Stack、PriorityQueue、HashSet、LinkedHashSet、TreeSet、HashMap、LinkedHashMap、TreeMap、WeakHashMap、EnumMap、TreeMap、HashTable 的特点和实现原理,还有多线程使用场景和插入多还是删除多的时候使用什么样的集合类效率会更高。 -
IO 框架
主要掌握 Reader、Writer、InputStream、OutputStream 的继承类,重点掌握字节流 (FileInputStream、FileOutputSteam、BufferedInputStream、BufferedOutputStream、DataInputStream、DataOutputStream) 和字符流(FileReader、FileWriter、BufferedReader、BufferedWriter、InputStreamReader、OutputStreamWriter),并熟练运用。还有就是 NIO 的工作原理要知道。 -
String 相关
主要考察对 String 的处理,顺带考察多线程和算法,大公司就是喜欢考察字符串的算法,主要是字符串查找或者剔除,多线程打印字符串,超大字符串处理。 -
异常处理
掌握 Throwable 继承类,理解 Error 和 Exception 的区别,理解运行时异常和编译异常的区别,掌握异常的处理方法,掌握 try、catch、finally、throw、throws 关键字的意义,掌握 try-catch-finally 语句的执行顺序,掌握异常的工作原理,知道常见的异常有哪些。 -
多线程
如何创建和启动一个线程,有哪些方法?多线程如何交互,线程之间的调度、让步、合并,如何同步?生产和消费者模型。还有就是掌握线程安全、线程池,死锁。 -
JVM 知识
掌握常见的垃圾回收机制,掌握程序计数器、堆、栈、方法区的作用,掌握类的加载机制。掌握内存分代模型和工作原理。掌握 JVM 启动参数常见配置,了解 JVM 调优。 -
数据结构与算法:
掌握常见查找和排序算法实现及其时间、空间复杂度。掌握常见数据结构如链表、队列、栈的基本原理和实现。
section 3
经常主持对高级工程师和中基层 Tech Leader 的面试,一年下来总有百八十场,我给大家分享一下我对于高级工程师的定位吧,虽然我主要负责. Net 团队,但是对于其他语言应该也是适用的。
一、理论基础: 高级工程师必须有较好的理论基础,既包含一些基础的学科知识,也要包含个人专攻方向的前沿理论。我遇到过形形色色的求职者,有人自称精通领域模式,却不明白什么是聚合根(领域根)。甚至有人无法列举常用的非线性结构,更别提伪码实现和应用场景分析了。这些人普遍振振有词地说, 我有丰富的开发经验,项目需要实现的功能我都能做出来,我只是没有去记那些术语名词。抱歉,你不是没有记术语名词,你是根本没有潜心看技术文章的心态,你所谓的学习就是看一些诸如《21 天精通 Java》,《7 天,从菜鸟到专家》之类的垃圾书,或者看点视频。那么你这个高工,比别人高在哪里呢?当单位需要你代表团队和合作机构沟通,甚至发表专栏的时候,你是不是也准备跟大家讲” 这个东西我不知道该怎么讲,大家可以看一下我的代码 “。只有代码可秀的人是码农,不是高工,所以我给这类求职者的综评是中 + 封顶。
二、工作经验: 高级工程师必须有过在项目中担心核心模块开发或者整体架构设计的经验,并且项目越高大上越好,比如你在互联网企业搞过读写分离的实现,你在电商搞过秒杀算法,你在电信行业做过网络层,我必定会高看一眼。如果你就仅仅只是一个人全栈搞过几个小网站,啪啪啪一大堆成熟框架用得倍溜,那么你只是一个装配工。我给这类求职者的综评是中 + 封顶。
三、培养潜力: 高级工程师必须有全局思维,如果在你过往的工作历程中,你对你兄弟团队或者部门的工作情形一问三不知,甚至于一个项目中,你只懂自己的模块,其他同事负责的模块你就只会 call 个 API,那么你就是一个很难再进一步的人。对于企业来说,有你不多,无你不少,所以我给这类求职者的综评是中 + 封顶。
四、沟通能力: 高级工程师在技术团队中是绝对的核心人中,小项目中你就是负责人,大项目中你也要负责带新人,那么良好的沟通能力必不可少,如果你仅仅是自己一个人心里亮堂,你对企业的价值就要大打折扣。这类求职者,我也有录用过不少,因为程序员木讷可以说是一种共性,在这方面没法太挑剔,但是我给他们的综评是高 - 封顶。
section 4
如果要应聘高级开发工程师职务,仅仅懂得 Java 的基础知识是远远不够的,还必须懂得常用数据结构、算法、网 络、操作系统等知识。因此本文不会讲解具体的技术,笔者综合自己应聘各大公司的经历,整理了一份大公司对 Java 高级开发工程师职位的考核纲要,希望可以帮助到需要的人。
1、Java 基础
1.1 Collection 和 Map
- 掌握 Collection 和 Map 的继承体系。
- 掌握 ArrayList、LinkedList、Vector、Stack、PriorityQueue、HashSet、 LinkedHashSet、TreeSet、HashMap、LinkedHashMap、TreeMap、WeakHashMap、EnumMap、 TreeMap、HashTable 的特点和实现原理。
- 掌握 CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap 的实现原理和适用场景。
1.2 IO
- 掌握 InputStream、OutputStream、Reader、Writer 的继承体系。
- 掌握字节流 (FileInputStream、DataInputStream、BufferedInputStream、 FileOutputSteam、DataOutputStream、BufferedOutputStream) 和字符流 (BufferedReader、InputStreamReader、FileReader、BufferedWriter、 OutputStreamWriter、PrintWriter、FileWriter),并熟练运用。
- 掌握 NIO 实现原理及使用方法。
1.3 异常
- 掌握 Throwable 继承体系。
- 掌握异常工作原理。
- 了解常见受检异常 (比如 FileNotFoundException)、非受检异常(比如 NullPointerException) 和错误(比如 IOError)。
1.4 多线程
- 掌握 Executors 可以创建的三种 (JAVA8 增加了一种,共四种) 线程池的特点及适用范围。
- 掌握多线程同步机制,并熟练运用。
1.5 Socket
- 掌握 Socket 通信原理。
- 熟练使用多线程结合 Socket 进行编程。
2、Java 虚拟机
2.1 JVM 内存区域划分
- 掌握程序计数器、堆、虚拟机栈、本地方法栈、方法区(JAVA8 已移除)、元空间(JAVA8 新增)的作用及基本原理。
- 掌握堆的划分:新生代(Eden、Survivor1、Survivor2)和老年代的作用及工作原理。
- 掌握 JVM 内存参数设置及调优。
2.2 类加载
- 掌握类的加载阶段:加载、链接(验证、准备、解析)、初始化、使用、卸载。
- 掌握类加载器分类及其应用:启动类加载器、扩展类加载器、应用程序类加载器、自定义加载器。
3、J2EE
- 掌握 JSP 内置对象、动作及相关特点和工作原理。
- 掌握 Servlet 的特点和工作原理。
- 掌握 Spring 框架的 IOC 和 AOP 实现原理(反射和动态代理)。
- 至少掌握一个 MVC 框架(Spring MVC,Struts 等)的工作原理,并熟练运用。
- 至少掌握一个 ORM 框架 (Hibernate,MyBatis 等) 的工作原理,并熟练运用。
4、数据结构与算法
- 掌握线性表和树的特点并熟练运用。
- 掌握常用排序和查找算法:插入排序 (直接插入排序、希尔排序)、选择排序 (直接选择排序、堆排序)、交换排序 (冒泡排序、快速排序)、归并排序,顺序查找、二分查找、哈希查找。
- 熟练运用常见排序和查找算法思想解决编程问题。
- 了解几大基本算法:贪心算法、分治策略、动态规划。
5、计算机网络
- 掌握网络的分层结构,及每层的功能特点。
- 掌握 TCP/IP 的通信原理 (三次握手、四次挥手)
6、数据库
- 掌握复杂的 SQL 语句编写。
- 掌握数据库的优化(SQL 层面和表设计层面)。
- 至少掌握一款数据库产品。
- 熟悉高并发、大数据情况下的数据库开发。
7、Web 技术
- 掌握 AJAX 的工作原理。
- 至少熟悉一款 JS 框架 (比如 JQuery)。
8、设计模式
- 熟悉常见的设计模式。
- 会将设计模式理论应用到实际开发中。
9、Linux
- 熟练运用 Linux 常见命令。
- 熟悉 Linux 操作系统基本概念及特点。
- 熟悉 Shell 脚本。
10、操作系统
- 掌握操作系统的进程管理。
- 了解操作系统的 I/O。
11、正则表达式
- 掌握常见正则表达式符号。
- 熟练运用正则表达式解决实际问题 (比如匹配电话号码、邮箱、域名等)。
Section 5
- h5edu 的源码
- pure– 响应式 css 框架
- Hadoop 大数据
- ERP 系统开发
- linux
- freemarker
- weblogic/jobss
- webwhpere
- webservice http://www.iteye.com/topic/1135747
- bootstrap
- HTML5
- android
- css/jslever
- spring aop ssh ssm 徒手搭建
- jquery 源码分析融汇
- 缓存 echacge
- 并发
- 页面静态化
- UML
- shell
- pathy
- github
- 网络编程
- ExtJS
- 网络爬虫
- 设计模式
- 多线程与并发
- 第三方支付 / 登录
============= 高级工程 =============
1、Core Java 部分
这是最基础的, 对于一个 java 高级开发 / 设计人员, 你需要对这一部分达到精通的水平, 重点内容如下:
- 面向对象编程思想 (封装继承多态接口)
- 字符串处理
- java.lang 包, java.util 包等常用包
- java 异常处理
2、Java 高级部分
- Java I/O 流
- Java 多线程技术
- Java 网络编程
- Java Swing
后两项可以了解即可, 如果项目需要可以深入研究
3、前端基本技能
- HTML + CSS 网页开发
- JavaScript
- Jquery
- 浏览器兼容性 CSS hack(了解)
4、熟练使用 JSP + Servlet 进行开发
5、MVC 设计模式, 原理, 以及相关框架, 如 Struts
6、SSH 框架
7、缓存技术 session & cookie
8、熟练使用一种以上 Java 开发工具
Eclipse/MyEclipse/Jbuilder/Jcreator
9、熟练使用 XML
JDOM w3c.dom SAX
10、Java 设计模式
工厂模式, 单例模式 ==
11、Java 反射机制
反射的各种用法
12、了解或熟悉 C, C++, .NET
13、熟悉 JDK 的配置, 环境变量
14、数据库 oracle 必学, 其他最好了解一种以上 (mysql,sql server,access==)
oracle: 视图, 索引, 存储过程, 触发器, 游标, 包, 常用函数 ==
15、数据库原理
事务的原理, 锁机制, 表连接, 复杂查询语句 (工作经验), 性能调优, 锁表以及解决方案 ==
16、JDBC, 连接池
17、Ajax, 反向 Ajax
18、HTTP 协议, request 和 response 的原理, HTTP status(了解常用的),Https 原理
19、熟悉 Linux 基本命令, 使用过 Linux/Unix 系统, 可以编写 shell 脚本, 可以在 Linux 上部署项目
20、了解 windows 系统批处理脚本 bat
21、了解 HTML5, 最好学习过
22、熟悉一种 JS 框架, 如 Prototype
23、J2EE 原理 熟悉一种以上 web 容器如 Tomcat,JBoss,websphere,weblogic==
24、熟悉 ant 或 maven
25、熟悉一门脚本语言, 如 python ,ruby
- 了解 php/ asp
27、了解 ftp 协议及原理
28、熟练使用 Junit 测试, 熟悉 Mockito 等测试工具
29、熟悉 javac,javadoc,native,native2ascii 等常用命令
30、熟悉常用的排序算法, 如冒泡排序, 快速排序等, 最好自己研究过一些的算法, 下面的这个就是我曾经研究过的一个:
http wenku baidu com /view/391db3f0941ea76e58fa04e9 点 html
http://wenku.baidu.com/view.391db3f0941ea76e58fa04e9.html
31、了解 Flex(不学也没关系)
32、了解敏捷开发模式
33、工作流 workflow 至少用过一种, 如 OSworkflow, 了解原理
34、使用过 VPN 了解其原理
35、熟悉 jstl 表达式和 el 表达式
36、熟悉 webservice,WSDL,SOAP
37、图片处理, 如图片上传, 预览, 限制大小等, 下面共享一 (垃圾勿喷):
http wenku baidu com/view/05337bfc770bf78a6529541b 点 html
38、版本控制工具, CVS VSS SVN
39、JSON 技术, JSON+AJAX
40、分页技术, 最好自己实现过不仅仅是用过要知道原理
41、Java Mail
42、Java 读写 txt,excel
JXL 技术
43、JVM 原理, JVM 内存管理, GC,Java 堆栈池
44、熟练使用下面的工具:
- office 办公软件, word,excel,ppt 等
- plsql,sqldevelop 数据库开发工具
- outlook 大公司都用
- ue 编辑器
- 浏览器控制台, 调试
- SHH/PUTTY 远程
45、UML 建模工具 Rational Rose 等
46、使用 log4j
47、使用过开放 API 如百度地图, 腾讯街景, 新浪微博等
48、页面静态化技术 (伪静态页面)UrlRwriter
49、报表技术, 使用过报表制作工具, 如水晶易表
50、定时任务, 如 Spring batch, 学会自定义 batch 任务 (不适用第三方工具)
51、了解 uuid
52、B/s 和 C/s 架构
53、正则表达式
54、了解 JNDI JMS
55、ERP
56、unicode 编码, 乱码的解决
57、开源网络编辑器, 如 ckEditor
58、二进制原理
59、使用过, 了解开源论坛框架, 如 discuzz
60、GWT ,Closure 框架
61、了解 大数据, 云计算
62、搜索引擎搜索技术
63、软件工程, 项目管理
- 你需要精通面向对象分析与设计 (OOA/OOD)、涉及模式(GOF,J2EEDP) 以及综合模式。你应该十分了解 UML,尤其是 class,object,interaction 以及 statediagrams。
- 你需要学习 JAVA 语言的基础知识以及它的核心类库 (collections,serialization,streams,networking, multithreading,reflection,event,handling,NIO,localization,以及其他)。
- 你应该了解 JVM,classloaders,classreflect,以及垃圾回收的基本工作机制等。你应该有能力反编译一个类文件并且明白一些基本的汇编指令。
- 如果你将要写客户端程序,你需要学习 WEB 的小应用程序 (applet),必需掌握 GUI 设计的思想和方法,以及桌面程序的 SWING,AWT, SWT。你还应该对 UI 部件的 JAVABEAN 组件模式有所了解。
JAVABEANS 也被应用在 JSP 中以把业务逻辑从表现层中分离出来。 - 你需要学习 java 数据库技术,如 JDBCAPI 并且会使用至少一种 persistence/ORM 构架,例如 Hibernate,JDO, CocoBase,TopLink,InsideLiberator(国产 JDO 红工厂软件) 或者 iBatis。
- 你还应该了解对象关系的阻抗失配的含义,以及它是如何影响业务对象的与关系型数据库的交互,和它的运行结果,还需要掌握不同的数据库产品运用,比如: oracle,mysql,mssqlserver。
- 你需要学习 JAVA 的沙盒安全模式 (classloaders,bytecodeverification,managers,policyandpermissions,
codesigning, digitalsignatures,cryptography,certification,Kerberos,以及其他) 还有不同的安全 / 认证 API,例如 JAAS(JavaAuthenticationandAuthorizationService),
JCE (JavaCryptographyExtension),JSSE(JavaSecureSocketExtension),以及 JGSS (JavaGeneralSecurityService)。 - 你需要学习 Servlets,JSP,以及 JSTL(StandardTagLibraries) 和可以选择的第三方 TagLibraries。
- 你需要熟悉主流的网页框架,例如 JSF,Struts,Tapestry,Cocoon,WebWork,以及他们下面的涉及模式,如 MVC/MODEL2。
- 你需要学习如何使用及管理 WEB 服务器,例如 tomcat,resin,Jrun,并且知道如何在其基础上扩展和维护 WEB 程序。
- 你需要学习分布式对象以及远程 API,例如 RMI 和 RMI/IIOP。
- 你需要掌握各种流行中间件技术标准和与 java 结合实现,比如 Tuxedo、CROBA,当然也包括 javaEE 本身。
- 你需要学习最少一种的 XMLAPI,例如 JAXP(JavaAPIforXMLProcessing),JDOM(JavaforXMLDocumentObjectModel),DOM4J,或 JAXR(JavaAPIforXMLRegistries)。
- 你应该学习如何利用 JAVAAPI 和工具来构建 WebService。例如 JAX-RPC(JavaAPIforXML/RPC),SAAJ (SOAPwithAttachmentsAPIforJava),JAXB(JavaArchitectureforXMLBinding),
JAXM(JavaAPIforXMLMessaging), JAXR(JavaAPIforXMLRegistries),或者 JWSDP(JavaWebServicesDeveloperPack)。 - 你需要学习一门轻量级应用程序框架,例如 Spring,PicoContainer,Avalon,以及它们的 IoC/DI 风格 (setter,constructor,interfaceinjection)。
- 你需要熟悉不同的 J2EE 技术,例如 JNDI(JavaNamingandDirectoryInterface),JMS (JavaMessageService),JTA/JTS(JavaTransactionAPI/JavaTransactionService)