要想成为软件开发的专家,需要我们完整了解软件开发的流程,并在关键部分掌握丰富经验。
需要我们了解设计模式和算法的细微差别,同时遵循软件开发的最佳实践,包括创造性和思考力,为编程问题提供合适的解决方案。
实现这一目标需要掌握服务器端开发、客户端开发、DevOps运维、云计算、网页设计、分布式系统、数据库、编程规约、代码管理、基础设施管理、可扩展性、安全性待方面的能力。
你可能未必全部掌握以上内容。但是可以尝试从表层了解绝大部分内容,然后再深入掌握其中几个技术。
以下给各位列出开发者缺乏的几个主要技术能力,而技术管理者或架构师在招聘这些职位时应该熟悉检查这些要素。
Web框架
Spring 和 MyBatis 可以说是 Java Web 开发者必学的两个框架了,因此对这两个框架有必要做一个深入的了解。
对于 Spring 来说,其整个源码体系太过于复杂,所以我们还是得抓住重点。对于 Spring 来说,最重要的是其 AOP 和 IoC 的实现,以及其容器体系和常用的接口。而对于 MyBatis 来说,其体系相对没有 Spring 那么复杂,所以可以稍微深入一些。
RPC框架
在所有 RPC 框架中,dubbo 可以说是最通用的一个了。所以如果你所在的公司没有自研的 RPC 框架,那么你不妨可以将 dubbo 作为你的学习框架。
对于 RPC 框架来说,其实无非就是封装对象代理,最后通过与服务提供者进行网络通信。但是如何进行封装,如果进行负载均衡的实现,这就考验一个框架设计者的功力了。
一致性框架
对于分布式系统,非常重要的一个组件就是一致性框架。在这些框架中,最常见的两个是 Zookeeper 和 Eureka。Zookeeper 实现了 CAP 中的 CP(即注重强一致性),而 Eureka 则是实现了 CAP 中的 AP(即注重可用性)。
虽然平常我们都将 Zookeeper 和 Eureka 作为服务化的协调组件,基本上没有什么机会深入学习。但是有机会还是可以深入了解一下的。
消息队列
消息队列可以说是实现业务解耦以及突发流量的利器。而在大型业务场景中,最常用的就是 Kafka 和 RocketMQ 了,因此弄懂这两个消息队列的原理基本上就足够用了。
对于消息队列,建议先选择一个深入研究,先弄懂其基本原理,之后再阅读源码验证想法。因为 RocketMQ 是基于 Kafka 改进的,所以建议先从 Kafka 入手研究。Kafka 研究得差不多了,RocketMQ 的研究也会进展飞速。
缓存框架
缓存框架可以说是高并发下必用的一个框架了,但我们经常只是使用它,而不知道起内部的原理和构造。因此找个时间深入学习下原理,还是很有必要的。
网络框架
对于一些网络项目,例如聊天 IM 等,就需要用到 Netty 等框架。而 Netty 又是这类网络框架的佼佼者,通过对其源码的研究,可以学到不少知识。
搜索框架
对于一些搜索功能的项目,单纯的数据库 SQL 查询已经无法满足需求了,这时候 ElasticSearch 的学习和研究就提上议程了。有时间的话,研究学习一下还是很有必要的。
增量订阅框架
Canal 和 Otter 框架可以帮助你获得数据库的变化信息,从而更方便地做业务扩展。对于这类框架,属于特定领域的细分框架,有时间可以研究一下。
编码规范
编码规范有助于确保良好的开发实践和产品开发。要了解一些最重要的编码规约:
DRY(不要重复自己),SOLID , TDD , 防御性编程
设计模式
设计模式在软件开发中是一种常见的,可重复使用的解决方案,可解决软件中的常见问题。软件开发者要了解一些常见的Design Partern是非常重要的,还有更重要的是要能够识别给定问题的正确设计模式。如MVC、Singleton、DAO、Facade、Proxy、Adapter、Strategy和Absract Factory等一些一流开发者使用的设计模式。
服务器端开发
在较复杂的软件系统中,后端会有各种各样的逻辑。作为后端开发人员,处理应该程序的业务逻辑就要面临很多挑战。任何开发人员都能够编写代码,但是只有有经验的开发人员才可以写出具有高性能、可伸缩性和可靠性都好的高质量代码。开发优秀软件的过程涉及的领域包括大量科学、数学、计算机等专业知识,有处理的思维和经验非常重要。
高速缓存
数据缓存的各种机制(文件、数据库、内存、反向代理、HTTP....)
内存管理
Java有一个非常好的垃圾收集器,能够自动管理内存,清理未使用的对象并释放一些内存。但是一个资深的Java开发者需要对内存的工作原因有一个非常透的理解,这样才能写出高性能和优化的应用程序。
了解以下概念至关重要:
堆栈,堆,强引用,弱引用,转义引用,如何引用字符串,垃圾收集过程,meta空间,垃圾收集器类型。
异常处理
这是一个相当重要,也是一个比较大的话题,我们后续会再写关于它的专门文章。现在,列出一些处理异常的一些良好实践:
1、遵循“错误优先”原则使软件更可靠
2、不要捕捉无法恢复的异常
3、不要记录完异常后,又将异常抛出来
4、选择正确的层来处理异常(例如:DAO不知道是数据库的故障如何处理,但是服务层可以知道)
5、如果无法从异常中恢复,则优先选择未经检查的异常
IO操作
了解I/O操作的成本以及可能出现的不可预知的结果。
异步编程
使用线程实现Java中的异步编程,它也是Java平台的基础部分,有效使用并发对于构建高性能应用程序非常重要。
比如线程池、死锁、生产者-消费者、原子性、不可变对象、信号量等等词汇对资深开发人员来说不应该是新东西。
批处理
在实际场景中,编写批量作业非常普遍。通常执行重要的任务,有一些基本规则:
1、每个任务应该按输入、处理过程与输出进行划分;
2、始终轮询批量输入数据;
3、处理器应该是线程安全;
4、产出物应该为原子属性;
5、存储工作结果;
6、要考虑EIP模式。
分布式计算
在现代世界中,分布式计算是指使用分布式系统来解决计算问题。然而,分布式系统与传统系统不同,具有非常高的复杂性。当用户开始高速增长资源消耗较大时,有分布式系统工作经验的工程师会在此时发挥作用。微服务软件体系结构是分布式计算以及分布式体系结构所有的优点与折衷的一个很好的例子。
而今,微服务是当今软件工程师之必备技能,就需要我们对分布式系统有丰富的经验。
比如容错性,可用性与一致性,分布式事务/事件、同步与异步通信,分布式认证,分布式应用,共识应用程序等非常重要。
数据库
精确掌握与数据库从通信到获取数据中要涉及的所有成本,如连接握手、数据传输等情况。清楚了解原子事务以及如何确保数据一致性。因此,数据库管理是软件开发人员的必备技能。
数据库用于管理数据,这是一项艰巨的任务,即使不考虑将业务逻辑添加到数据库中。 在大型IT系统中,数据库在安全性,可伸缩性,容量和可用性方面面临着诸多挑战。我们要考虑加密,复制,分片,大数据等问题。 了解数据库的工作方式以及如何优化它以及每项处理消耗的成本(例如,占用内存、CPU数)将有助于有效设计系统的数据库管理。
DevOps
主力开发工程师要有能推动DevOps的文化理念和实践的能力,在所有运维步骤中做到自动化,提高高质量和高速度交付应用程序与服务能力。代码部署或配置基础设施必须为自动化,且要灵活以及受到监控。
一个强大的开发者应该很好地了解从测试,发布到部署和基础架构管理的全开发生命周期。需要我们了解云计算,Linux,网络,容器,工程管理等。
代码管理
鉴于代码的重要性,只有主力开发人员才能够掌握代码生命周期,并力促软件工程最佳实践。 为此,需要你熟谙源代码管理系统,比如Git,对分支策略,版本控制,分布式修订控制,另外还有代码质量保证工具,代码间的通信和依赖管理,配置管理等有清晰的思维。
安全
Web安全是件很难处理的事情,一部分取决于许多外部参数; 软件工程师需要遵循构建安全Web应用程序的最佳实践与准则。
主力工程师需要对信息安全有较深的理解,不仅要如何避免构建不安全与容易受攻击的系统,还需要知道保护用户的隐私。
一个伟大的开发人员需要能够创建一个指南来处理前10个Web应用程序安全风险。 在Web应用程序中,我们有更多需要工程师关注安全威胁,其中包括如下:
1、上传文件检查;
2、密码暴力破解;
3、会话到期处理;
4、会话来源验证;
5、通过网络安全通信;
6、安全的Cookie访问;
7、用户凭证处理。
欢迎工作一到五年的Java工程师朋友们加入JavaQQ群:219571750,群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
网友评论