从编程语言的角度来看,首先是熟练使用语法、标准类库、常用类库。要做到这点相对容易,一些非计算机科班生也能做得特别好。如果做不到这点,则称不上是一名合格的程序员。其次是掌握语言执行细节,需要有操作系统、编译原理等计算机专业知识,掌握这些知识有利于写出高性能的代码。
而优秀的程序员(或者说架构师的入门标准)往往能更好的理解软件工程。
首先是代码的正确性,即功能正确性,做不到这一点,一切免谈。
其次是代码的可维护性,要理解一点,代码不是写给自己看的,而是写给别人看的,否则软件将难以维护。要做到这点不容易,为此我们往往会定义一个组织内部的编码规范、注释规范、模块封装规范、设计原则等,并结合软件开发管控流程,诸如需求评审、设计评审、测试用例评审、安装和升级过程评审等,尽可能的让软件代码以更加标准、其他人更容易理解的方式出现。有的时候,我们宁可放弃代码性能,也要让代码更可读,因为性能瓶颈往往是架构和关键路径决定的,大部分代码不在关键路径上,优化他们的性能没有太大意义。做到这点需要有大量的经验。
第三就是测试友好性。一般只有优秀的程序员才会注意到这一点。要知道测试人员测试代码的主要手段就是写测试用例,测试友好性就是让测试人员很容易构造测试用例,否则难以构造测试用例,甚至无法构造,只好手工测试或者线上测试。例如,我们需要写一个程序分析数据库的数据。没经验的程序员会构造一个函数,参数是数据库的用户名、密码、表名等信息,返回值就是分析结果。这个时候,为了测试,测试人员需要构造一个伪数据库、表,伪造一些记录,然后进行测试……这非常不友好。正确的做法是把连接数据库的过程与从数据中分析结果的过程分离,把后者变成一个更单纯的算法,使得测试人员可以专门测试这个算法,这样测试可以更容易、更全面。
第四就是运维友好性。很多人把代码写好了以后,发现部署是一件难事,因为代码总是假定整个操作系统只有这一个程序在运行。更容易被忽略的是软件的后续升级。很多人在开发的时候压根儿就没考虑这点,等到要发布新版本的时候才意识到。例如在设计接口或者设计存储格式的时候不加接口或格式版本号,又例如有个模块是个单点,它一升级整个系统就要停机……这些问题给日后升级造成了麻烦。
最后才是代码的执行性能。正如我刚才说的,性能只出现在架构和关键路径上,不在关键路径上的代码,先不用关心代码性能,一心一意让代码更可读、更容易测试、更容易安装和升级。
幸运的是,Java是一门非常优秀的语言,在开发效率和执行效率之间、易用性和严谨性之间都有很好的平衡。
个人觉得查bug的时候迅速一点,别人需要上网搜索的东西个人可以马上说出来,因为搜索过好多次,仅此而已。
可是,这真的是精通吗?我觉得还差得远。我认识一个人,在他面前大多数人,包括我,都只是个孩纸。(毕竟经验值与学习能力是很强的)
通常你不需要和他争论技术问题,他说得出口的,就是正确的。技术问题包括系统架构、算法设计、某行代码在JIT之后在什么硬件架构上大概跑几个纳秒。在他的眼里,任何一段Java程序他可以告诉你大致花费了多少个CPU cycle,似乎从Java代码到机器码(不是JVM的byte code)的中间过程都被本能地跳跃了。他可能是我认识的最精通Java的人,可我不是他,无法知道他的体验。但是,从跟他的交流中我可以很明确地感受到两个字:自信。
1 计算机基础
这部分内容是计算机相关专业同学的课程,但是非科班的小伙伴(譬如在下)就需要花时间恶补了。
特别 是计算机网络,操作系统,数据结构这三门课程。 至于编译原理,个人大概懂一点就行了,我也只看过简单的概念和状态机相关的内容,并不是特别重要。
2 Java编程
这里的Java编程部分包含了很多内容。我们可以分别看看,大概归纳一下就是这几个部分。
Java基础
这里的Java基础包括基本语法,集合类框架,以及一些高级特性,比如反射,注解等等。
Java基础的知识点非常多,所以要真正搞懂也没有那么简单,另外,随着时间推移,一些新特性也需要得 到我们的重视,比如时下流行的JDK8。
设计模式
我一直觉得设计模式可以和Java基础一块学,所以我也把它放在这里。当然,一些真正使用到设计模式的 地方,譬如JDK的集合类,IO流等等,也需要你足够重视。
Java Web技术
Java Web技术包括J2EE,以及web框架,乃至一系列常用的组件
1 J2EE主要包括的就是servlet,jsp这些比较复古的web开发组件了。虽然现在直接用它们的情况比较少, 但是我们还是需要花一些时间去掌握它们的。
2 web框架常用的就是Spring了,相应的,hibernate和mybatis也需要了解一下。
3 同时,JavaWeb开发时的常用类库,比如jnuit单元测试,log4j日志工具,以及构建工具maven,都属 于我们要掌握的范畴。
4 最后,要注意的是,Web相关的一些基本知识,比如HTTP协议,网络安全基础,也是我们要考虑的部 分。
Java并发技术
Java的并发技术泛指Java的多线程技术,以及JUC包里的并发类,比如线程池,并发工具类,阻塞队列等 等。
Java并发技术完全可以独立出来学习,是Java进阶知识的一大重点。
Java网络编程和服务器
这一块内容是Java中比较复杂但也很重要的一块内容。比如BIO,NIO,AIO的一些使用和原理,以及tomcat 这类web服务器,甚至是netty这种网络编程框架,都是可以去了解和学习的内容。
Jvm基础与调优
JVM是提供Java程序运行的一个进程,学习JVM知识,也是我们的必经之路。除了看懂《深入理解jvm虚 拟机》以外,我们还要学习的内容就是JVM调优,使用合适的工具诊断问题,最后解决问题。
这部分内容在面试中呈现的不仅仅是GC,内存分区,以及类加载器,也包括了我所说的JVM调优问题。
3 Linux
作为后台同学,常年被面试官问linux相关的问题,所以觉得学好linux还是蛮重要的,除了基本命令以外, 最好还能了解一些shell脚本,甚至是内核相关的知识,这方面是我的一个弱项。
4 数据相关
在这个路线图里,数据部分囊括了非常多的数据源,我们可以来看看都有哪些是我们需要掌握的。
关系数据库Mysq
这个不必多说,人手都要会,不管是基础的crud,索引,抑或是进阶的存储引擎,分布式方案等,我们都 需要对应掌握。
缓存
如Redis,memcache一类的缓存,作为后端开发者的我们也需要对应掌握,当然,它们的高级特性,以 及分布式方案,也是必备的知识点。
搜索引擎
基于Lucene的solr,elasticsearch这类搜索引擎,本质上也是数据源,但是并不是后端必备的内容,不过 学一学也没有坏处啦。
大数据
海量数据处理的场景越来越多,大数据技术如hadoop,storm等也越来越火,但是大数据应用一般会由专 业的大数据工程师来做,所以我们学一些基本内容也就足够了。
5 算法和数据结构
算法一直是校招同学面前的一座大山,作为后端同学来讲,除了基本的数据结构算法以外,也要会一些高 级的算法,譬如dp,搜索,贪心等等。 另外,通过LeetCode等题库来刷题的方式来巩固算法也是公认的好办法了。
6 分布式
最后一个部分,也是内容最多,覆盖面最广泛的部分了。分布式相关的技术实在太多了,我们这里也会做 一下简单的归纳。
web架构
先了解web架构的发展会对分布式的学习有更好的理解,毕竟架构的发展也对应着分布式技术的发展。
分布式理论
这部分内容包括分布式的发展演化,base理论和cap理论等等,学习分布式技术之前,最好能对这部分概 念有一定了解。
一致性问题
强一致性的解决方案:事务和锁,弱一致性的方案:消息队列。
分布式session
一个常见的问题,也有多种解决方案
分布式缓存
和上面说的缓存一样,只不过这里侧重缓存的分布式方案
分布式数据库
这里指的数据库的分布式方案,也包括hbase这种分布式数据库。
负载均衡
负载均衡也是一个值得探讨的话题,一般我们讨论的是七层和四层负载均衡
消息队列
消息队列是一个比较复杂的分布式组件,我们可以了解常用消息队列比如amq,kafka等的实现。
服务化
服务化的核心包括rpc,服务注册中心等等。分布式服务相关技术也是后端同学必须掌握的内容
虚拟化
虚拟化同样不是后端同学必须掌握的内容,只不过现在越来越多的服务部署方式使用的是docker和云服务 的方式。所以了解一下也没有什么不好的。
当然学无止境,技术的更新天天变,还是要每天坚强学习;每个企业的项目不同,技术理念不同,但是最初的规范是统一的