我们逐渐在工作当中找到了状态,部署生命周期不再是神秘的难题,代码审查的速度也终于超过了代码编写。最重要的是,我们开始发布真正能够运行的成果。
但是接下来,我们可以松懈吗?当然不行!对知识的探索,永远是我们时刻追求的目标。
在克服惰性方面,一种务实的方法是坚持学习那些能够帮助我们在面试中表现更好的知识。
如此一来,我们就会拥有一种明显的进步以及值得始终坚守的目标。
请关注以下五个方面——
低级/库设计
系统设计
并发
设计模式
一般编码惯例
我在本文中给出的资源主要与 Java 相关,但大家肯定也能找到针对其他语言的类似资料。无论如何,这里提到的大部分设计理念与语言无关。
低级/库设计
如果大家回顾一下 Uber、亚马逊等企业在第 2/3 轮软件开发工程师面试当中提出的问题,就会发现其中至少会有一轮主要涉及此类低级设计方向。我听说过的两大常见场景分别是:
设计一套记录器库
使用 Java 语言实现流框架
我特别喜欢这个关于记录器的问题;因为根据求职者的业务水平,大家可能会想到多种多样的答案。
这里大家可以先着手试试。在完成之后,请各位思考以下几个问题:
您是否将实现分解为不同的接口?或者说使用了一个超类来涵盖一切?
您是否考虑到类当中的线程安全问题?
您的记录器是单体的吗?采用懒惰加载还是急切加载?为什么?
它具备可插拔性吗?第三方可以利用其它实现来扩展您的库吗?
垃圾收集机制是如何实现的?您是否创建了过多对象?
Log4j2 是一套设计上极为出色的记录工具,感兴趣的朋友可以点击此处参考它的实现思路。
我暂时没找到其它更好的低级设计资源。如果各位有什么好主意,请在评论中不吝赐教。
系统设计
开发人员们可能更熟悉“设计问题”这种表述。我听说过的具体案例包括:
设计一套 URL 缩短系统
设计 Twitter 的 NewsFeed 系统
这里我向大家推荐Donne Martin的《设计入门》。虽然篇幅很长,但这确实是一种优秀的广度优先方法,能够帮助大家快速熟悉系统设计原理。
至少,大家应该熟悉以下知识:
异步与同步写入;消息队列
一致性模式——特别是最终一致性
数据库类型(SQL 与 NoSQL)以及规模伸缩
不同级别的缓存
将问题陈述分解为不同的独立服务
这里我要向大家推荐《深入理解系统设计访谈》。其中详细探讨了系统设计的具体问题,包括我之前提到的两个例子。虽然属于付费资源,但绝对物有所值。
并发
并发性是初级工程师与高级工程师之间的一大核心区别。很多朋友可能想象不到,并发实际上非常难以实现。
这里推荐大家阅读《Java 并发实践(Java Concurrency in Practice)》一书。在读完之后,大家应该会对以下问题拥有更深刻的理解:
Java 的内存模型
发生前关系
虚假唤醒调用
易失性与同步性
线程安全、等待与通知等
如果大家使用的是其他编程语言,也请参考对应的书籍。总之,如果没能彻底掌握相关概念,我们将很难对竞争条件进行调试。
Educative 的《Java 多线程与并发(Java Multithreading and Concurrency)》 也是很好的资源,推荐大家阅读其中的概念,而后结合常见的面试问题进行理解。
设计模式
虽然面试一般不会问到这些问题,但在研究不同的设计用例时,大家或多或少都会接触到。
而在了解了相关概念之后,我们就会意识到这些模式无处不在。举几个例子:
Adapter — Arrays.asList()
Decorator — Collections.synchronizedCollection(new ArrayList<>())
Prototype — Immutables.copyOf()
Command — Runnable interface
Strategy — java.util.Comparator#compare()
StackOverflow 中列出一份长长的 Java 核心库模式清单,推荐大家了解一下。
我也尝试过阅读经典的《设计模式:可重用面向对象软件中的元素(Design Patterns: Elements of Reusable Object-Oriented Software)》,但我承认我真的啃不下来。
但我也试过《深入浅出谈设计模式(Head First Design Patterns)》,这看起来不像是技术读物,但却给我带来了巨大的帮助。
这本书里的故事选得很好,清晰梳理出了类似模式之间的微妙差别。我花了一个周末读完了它,真的是干货多多又有趣。
过一阵子我想再回去啃啃《可重用面向对象软件中的元素》,这本书同样极具价值,只是比较硬核、对开发经验的要求更高。
一般编码惯例
看书、看书、再看书
《高效 Java(Effective Java)》。这是大家熟悉 Java 表达与最佳实践的理想方法。其中分为 90 个独立的主题,每个主题都长达数页。因此,我们可以选择与当前工作内容相关性最强的部分。
《清洁代码(Clean Code)》——有了这本书的帮助,大家能够更快更方便地阅读并审查其他人编写的代码。与《高效 Java》类似,我同样推荐大家有选择地阅读这本书中的对应章节。
熟练掌握您的 IDE
好吧,这一点跟面试没什么关系。但说真的,熟练掌握 IDE 能够极大提升编程的效率与趣味性!
我个人使用 IntelliJ,还安装了一款“Key Promoter X”插件。每当我使用了能够通过快捷键实现的鼠标操作时,它都会发出提醒。只需要几周,大家就能掌握快捷键操作并让自己看起来专业万分~当然,这都是被提示磨出来的。如果大家使用的是其他 IDE,也可以试试类似的小工具。但我还是强烈推荐 IntelliJ,真的很棒。
《42 项 IntelliJ 提示与技(42 IntelliJ Idea Tips and Tricks)》是 YouTube 上的一段讲座,大家可以通过这种有趣的方式熟悉 IntelliJ 中提供的各种常用功能。
这份清单挺长的,不过大家不用着急,阅读的意义不在于读完,而在于借此改善自己在日常工作中的体验。加油!
顺便说一句,这份清单主要面向已经拥有 0 到 4 年开发经验的人群。如果各位还没开始工作,请先从 Leet Code 入手,等有了一定积累之后再阅读这份书单。
一般来说,直到接触现实场景中的实际系统之后,大家才会遇到设计概念层面的问题。
相关书籍
下面,我再立足各个基础方向推荐一本好书,尽可能把它们组织成一个学习体系。
Effective Java — Java 最佳实践入门,阅读难度很低。
Clean Code — 助您快速掌握编码中的经验法则。
Java Concurrency In Practice — 用于掌握并发机制的基础书籍。
Head First Design Patterns — 有趣、有效的面向对象设计思维学习方式。
Designing Data Intensive Applications — 我见过的最高级别的技术类书籍,包含极为丰富的系统设计知识——但也非常难啃,建议大家一次读一点慢慢消化。
原文链接:
Growing pains — Becoming an Intermediate developer
评论 1 条评论