Java工程师的核心竞争力

Java工程师的核心竞争力
软实力
业务理解,对自己所处的业务有比较深刻的理解。主动去熟悉一个领域内的业务知识,这其实对后续需求的开发更有利。
明确自己所做的事情对整个业务的影响,清楚当前业务的发展情况,瓶颈在哪里。

如果已经工作三年了,最好长期深耕一个业务域,这样才会对这个业务的业界设计、业务难点、业务解决方案有长期的积累。
常见的业务域:支付、金融、广告、电商交易、数据平台、投放、营销、玩法、风控、用户、直播、内容、算法(搜索、个性化推荐)、IM 消息推送。

有大型互联网开发经验,国内大型互联网开发经验者优先。

技术热情,长期写博客、经常在公司内分享也是一大优势,因为这表达了你对技术的热情和对技术的探究。

强大的方法论,认真执行可以超过 90% 程序员:
1. 把事情想明白,说清楚,跟别人商量好。做一件事情需要多个人团队合作,一定要先达成共识,不要团队成员之间对概念的理解都不同就开始做事情了。
提升自己的沟通能力分为两个方面:
1).快速理解别人说的话所表达的意思
2).让别人快速的理解你说的话所表达的意思

2. 写代码,要注意以下几点:
a. 代码健壮性(永远不要相信外部依赖是靠谱的,要做好对自己系统的保护。)
b. 条件分支是否覆盖全面(每一个条件分支都应该有对应的处理逻辑)
c. 边界条件
d. 异常判断(尤其是 RPC 超时)
e. 简单的设计(多采用约定大于配置的思想,避免太多外部依赖)
f. 打印日志(对于查询接口如果调用多次返回的内容不一样时,需要打印当时调用的上下文和返回值;对于抛异常的情况,必须把入参和异常码打印到日志中)
g. 编码规范
h. 写单测,基本做到无 bug 提测

3. 工作中做好计划和进度跟踪,沟通和汇报,不把问题遗留到变成事故。
不要忽视任何一个线上告警、错误日志、checklist、编码规范,要对它们有敬畏之心。

4. 思考和分析,如何优化目前的工作流程,引入工具和方法,提升生产效率
多跟业务方去沟通,了解他们的通点,看我们用技术的手段如何去帮助他们。

5. 把自己工作中用到的技术用熟,搞清楚底层原理、优缺点、适用场景
6. 不断接触新技术的思想和工具,完善自身知识体系结构
7. 深入学习至少一个常用开源项目,源码层面系统掌握这门技术
8. 持续学习和技术内容输出,每个星期产生 1 篇原创技术文章
9. 业务能力 + 经验积累 + 技术硬实力

10. 推动力,提效降本,拿到结果
a. 通过平时的工作发现目前产品上或者系统架构上存在的问题,然后去思考如何彻底去解决这些问题,并最终提出解决方案解决这些问题。而且还要主动去推动解决方案的落地和执行。
b. 只有真正的了解了业务的难点,去抽象建模用代码的方式去解决这些难点,这才是很重要的一个能力

11. 接需求时一定要把领域内的职责划分清楚,职责划分大到整个架构,小到方法应该属于哪个类合适
a. 接需求时要评估职责划分的合理性,数据容量,合法性,对用户有没有歧义,需不需要灰度,业务语义是否理解一致

二、项目经验
高并发
高并发的套路:接口异步化、多级缓存、资源静态化(多用于秒杀的业务场景)、接口调用并发化、加机器。
高可用
高可用的方法有很多,比如:系统隔离、限流、降级、容灾(比如:商品 feed 流,如果查询商品列表接口挂掉了,可以从 CDN 去拉取容灾数据做一个缓冲,而不是直接给用户展示空白页面)等。
高扩展
如何让业务可以更加快速的迭代?
稳定性
一些公司稳定性规范的执行。比如:大促封网、大促前压测、评估容量、发布时必须检查 checklist、代码 review、单测覆盖率、弱依赖是否可以降级等。
提效降本
把系统的设计做成组件化、配置化、流程编排化、产品化。
业务产品化经验
如何把一个业务做成一个产品,对外打包输出自己的能力,给业务方带来价值?
对产品未来发展的规划能力
这个非常考验你对产品的熟悉程度、对业务的理解、对技术的理解。

如何让现有的系统可以快速的响应业务的发展,这个需要业务和技术的打通。比如:在熟悉整体业务的条件下对业务系统进行模块化、组件化、配置化、平台化。

这个是很大的亮点。
领域设计
领域设计其实就是看你对模块化设计的掌握程度。比如:微服务业务应该怎么拆分?业务边界如何划分?
三、技术实力
以下技术串起来其实就是四条主线:
1. 清晰的知道自己所写的每一行 Java 代码在语言层(编译器层)、JVM 层、OS 层、CPU 等硬件层干了什么。
2. 清晰的知道从浏览器发送的一个 http 请求/App 端发起的一个网络请求最终是怎么到达应用机器去执行业务代码的。
3. 出一个业务场景,可以想出多种技术方案,并最终 trade-off 选择最适合当前场景的技术方案,且这个技术方案要足够的简单。
4. 遇到问题要有清晰的排查思路。
Java 语言
Java 基础语法、集合、并发、JVM 等。
框架源码
先把基础打好再去看源码,不要为了看源码而看源码。框架源码其实是设计模式(策略、模板、构造器、工厂、代理等)、设计原则(SOLID)、面向对象基础(封装、继承、多态、抽象)、分布式理论(CAP定理、BASE理论、2PC协议、3PC协议、一致性算法Paxos、一致性协议Raft 等)、NIO(reactor、epoll 等)、并发编程(volatile、cas、synchronized、AQS、线程池等)、软件设计方法论(分层、中间层等)、性能优化(对象池、内存性能优化等 TODO 系统性能调优必知必会)的最佳实践。

上面这些基础知识你真的会了吗?记住:理解概念并不意味着会用、用好,所以学完基础后我们在平时的工作和学习中,还是要多思考为什么这么做?

推荐几个学习资料:
1. 软件设计之美
2. 坏代码的味道
3. 设计模式之美

Spring、Tomcat、Dubbo、Kafka、Netty、Zookeeper 等。
计算机基础
操作系统、计算机网络、计算机体系结构、编译原理、数据库。
数据结构和算法
Java 集合源码以及 letcode 简单、中等级别的题目。
系统设计
系统设计其实也可以分为很多类型:
1.强数据一致性:支付、金融
2.高并发读:商详、投放、cdn
3.高并发写:秒杀、下单
4.规则引擎:风控的决策引擎、规则引擎、营销系统
5.数据中心:投放的数据中心、风控的数据中心、DMP(人群圈定的数据中心)
6.消息报中心:交易消息报、支付消息报
7.与外部渠道交互的:保险系统、网关前置

四、总结
绝大多数知识都是相通的,是可以举一反三的。所以,精于基础,广于工具。
所有的上层应用都是对基础的理论知识和思想的封装、高层次的抽象。比如:
搞清楚操作系统,你就知道原来语言是殊途同归的。
搞清楚数据结构,你就知道为什么所有语言都会有数组、链表、哈希,什么时候该怎么用。
搞清楚设计模式,你去看绝大部分框架原理的时候效率都会成倍增长。
把基础的理论知识和思想尽可能的搞清楚,语言、框架、工具,广泛涉猎。
面对一百个不同的需求,用一种工具,不管是否合理是否适配,都能够实现它们,这应该就是你所说的精。能够快速的从一百种工具中选择合适的工具并上手,实现对应的需求,这叫解决问题的能力。

 

posted @ 2022-06-25 22:47  大自然的流风  阅读(201)  评论(0编辑  收藏  举报