写点什么

走向中级程序员的路上,我们给你总结出了一条捷径

  • 2019-08-30
  • 本文字数:2536 字

    阅读完需:约 8 分钟

走向中级程序员的路上,我们给你总结出了一条捷径

我们逐渐在工作当中找到了状态,部署生命周期不再是神秘的难题,代码审查的速度也终于超过了代码编写。最重要的是,我们开始发布真正能够运行的成果。


但是接下来,我们可以松懈吗?当然不行!对知识的探索,永远是我们时刻追求的目标。


在克服惰性方面,一种务实的方法是坚持学习那些能够帮助我们在面试中表现更好的知识。


如此一来,我们就会拥有一种明显的进步以及值得始终坚守的目标。


请关注以下五个方面——


  1. 低级/库设计

  2. 系统设计

  3. 并发

  4. 设计模式

  5. 一般编码惯例


我在本文中给出的资源主要与 Java 相关,但大家肯定也能找到针对其他语言的类似资料。无论如何,这里提到的大部分设计理念与语言无关。

低级/库设计

如果大家回顾一下 Uber、亚马逊等企业在第 2/3 轮软件开发工程师面试当中提出的问题,就会发现其中至少会有一轮主要涉及此类低级设计方向。我听说过的两大常见场景分别是:


  1. 设计一套记录器库

  2. 使用 Java 语言实现流框架


我特别喜欢这个关于记录器的问题;因为根据求职者的业务水平,大家可能会想到多种多样的答案。


这里大家可以先着手试试。在完成之后,请各位思考以下几个问题:


  • 您是否将实现分解为不同的接口?或者说使用了一个超类来涵盖一切?

  • 您是否考虑到类当中的线程安全问题?

  • 您的记录器是单体的吗?采用懒惰加载还是急切加载?为什么?

  • 它具备可插拔性吗?第三方可以利用其它实现来扩展您的库吗?

  • 垃圾收集机制是如何实现的?您是否创建了过多对象?


Log4j2 是一套设计上极为出色的记录工具,感兴趣的朋友可以点击此处参考它的实现思路。


我暂时没找到其它更好的低级设计资源。如果各位有什么好主意,请在评论中不吝赐教。

系统设计

开发人员们可能更熟悉“设计问题”这种表述。我听说过的具体案例包括:


  1. 设计一套 URL 缩短系统

  2. 设计 Twitter 的 NewsFeed 系统


这里我向大家推荐Donne Martin的《设计入门》。虽然篇幅很长,但这确实是一种优秀的广度优先方法,能够帮助大家快速熟悉系统设计原理。


至少,大家应该熟悉以下知识:


  1. 异步与同步写入;消息队列

  2. 一致性模式——特别是最终一致性

  3. 数据库类型(SQL 与 NoSQL)以及规模伸缩

  4. 不同级别的缓存

  5. 将问题陈述分解为不同的独立服务


这里我要向大家推荐《深入理解系统设计访谈》。其中详细探讨了系统设计的具体问题,包括我之前提到的两个例子。虽然属于付费资源,但绝对物有所值。


并发

并发性是初级工程师与高级工程师之间的一大核心区别。很多朋友可能想象不到,并发实际上非常难以实现。


这里推荐大家阅读《Java 并发实践(Java Concurrency in Practice)》一书。在读完之后,大家应该会对以下问题拥有更深刻的理解:


  1. Java 的内存模型

  2. 发生前关系

  3. 虚假唤醒调用

  4. 易失性与同步性

  5. 线程安全、等待与通知等


如果大家使用的是其他编程语言,也请参考对应的书籍。总之,如果没能彻底掌握相关概念,我们将很难对竞争条件进行调试。


Educative 的《Java 多线程与并发(Java Multithreading and Concurrency)》 也是很好的资源,推荐大家阅读其中的概念,而后结合常见的面试问题进行理解。

设计模式

虽然面试一般不会问到这些问题,但在研究不同的设计用例时,大家或多或少都会接触到。


而在了解了相关概念之后,我们就会意识到这些模式无处不在。举几个例子:


  1. Adapter — Arrays.asList()

  2. Decorator — Collections.synchronizedCollection(new ArrayList<>())

  3. Prototype — Immutables.copyOf()

  4. Command — Runnable interface

  5. 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 入手,等有了一定积累之后再阅读这份书单。


一般来说,直到接触现实场景中的实际系统之后,大家才会遇到设计概念层面的问题。


相关书籍


下面,我再立足各个基础方向推荐一本好书,尽可能把它们组织成一个学习体系。


  1. Effective Java — Java 最佳实践入门,阅读难度很低。

  2. Clean Code — 助您快速掌握编码中的经验法则。

  3. Java Concurrency In Practice — 用于掌握并发机制的基础书籍。

  4. Head First Design Patterns — 有趣、有效的面向对象设计思维学习方式。

  5. Designing Data Intensive Applications — 我见过的最高级别的技术类书籍,包含极为丰富的系统设计知识——但也非常难啃,建议大家一次读一点慢慢消化。


原文链接:


Growing pains — Becoming an Intermediate developer


2019-08-30 11:275203

评论 1 条评论

发布
用户头像
值得收藏
2019-09-03 16:02
回复
没有更多了
发现更多内容

太强了!阿里大神亲码“SpringCloud核心手册,2021Java常见笔试题

Java 程序员 后端

太牛了,Github上标星30K+的SpringBoot实战电商项目mall

Java 程序员 后端

架构实战营 - 毕业总结

雪中亮

架构实战营 #架构实战营

如何让阿三 Windows 10、11 的恢复分区(Recovery Partition

Java 程序员 后端

如果当时这15道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-7-20

Java 程序员 后端

如何在Spring Boot应用中优雅的使用Date和LocalDateTime

Java 程序员 后端

如何让自己像打王者荣耀一样发了疯、拼了命、石乐志的学习

Java 程序员 后端

天真,居然还有人认为java的参数传递方式是引用传递(1)

Java 程序员 后端

太狠了,Spring全家桶笔记,一站式通关全攻略,已入职某厂涨薪18K

Java 程序员 后端

太狠了!阿里技术官熬夜半年肝出来的Spring Boot巅峰之作,爱了

Java 程序员 后端

太难了,面试官不讲武德!来骗来偷袭,分层架构图案例

Java 程序员 后端

如何使用Spring Cloud Consul的其他配置和发现功能,不会来学

Java 程序员 后端

如何设计一个百万级用户的抽奖系统?,三面蚂蚁核心金融部

Java 程序员 后端

天真,居然还有人认为java的参数传递方式是引用传递,互联网java工程师面试突击训练网盘

Java 程序员 后端

太难了,救救孩子吧,到现在还搞不懂TCP的三次握手四次挥手

Java 程序员 后端

如何保证高可用?搞定三种集群模式,Redis还不是手到擒来

Java 程序员 后端

如何在分布式系统中正确的使用缓存?别给你的项目引入定时炸弹!

Java 程序员 后端

如何理解互斥锁、条件锁、读写锁以及自旋锁(1),mysql入门到精通电子书

Java 程序员 后端

如何在今年难找工作的大环境下成功入职阿里?Java架构师面试高频300题:集合

Java 程序员 后端

如何正确使用Spring Cloud Zookeeper,不懂来学,java教程下载网盘

Java 程序员 后端

字节跳动Java开放岗面经:14天快速面试,已拿offer,Java全套百度云

Java 程序员 后端

天才第一步!Java架构速成笔记必备精品成就年薪百万,掌门一对一java面试流程

Java 程序员 后端

太为难我了,阿里面试了7轮(5年经验,java百度图像识别接口

Java 程序员 后端

太全了吧!阿里面试官纯手打:金三银四跳槽必会Java核心知识点笔记整理

Java 程序员 后端

如何保证Redis与数据库的双写一致性?,十分钟带你看懂Netty如何实现C-S

Java 程序员 后端

太厉害了,终于有人把TCP-IP协议整合成864页学习笔记了

Java 程序员 后端

头条「2020最新」Spring最易学习教程,百度java面试经验

Java 程序员 后端

模块二作业

doublechun

「架构实战营」

如何快速成长为技术大牛?阿里资深技术专家的总结亮了!

Java 程序员 后端

如何阅读一本书-读书笔记,java二到三年经验面试题

Java 程序员 后端

如果当时这16道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-9-9

Java 程序员 后端

走向中级程序员的路上,我们给你总结出了一条捷径_语言 & 开发_Saurabh Maurya_InfoQ精选文章