写点什么

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

  • 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:275379

评论 1 条评论

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

【带着问题学】关于LeakCanary2,2021百度Android岗面试真题收录解析

android 程序员 移动开发

【微信小程序】开发实战 之 ,这份333页关于性能优化知识点的PDF你不能不看

android 程序员 移动开发

一文理解模块化、组件化、插件化的区别,最新Android高级面试题汇总

android 程序员 移动开发

一次奇葩面试经历,没去过BAT的Android研发就不配面试架构师?

android 程序员 移动开发

9.9元试用无影电脑,开启云上办公娱乐新体验

腾讯云音视频发布腾讯云视立方等多款新品,助力全行业快速构建音视频能力

科技热闻

直播回顾 | MatrixDB 定义下一代时序架构(内附PPT下载)

YMatrix 超融合数据库

车联网 物联网 时序数据库 MatrixDB 超融合时序数据库

【建议收藏】Android中高级大厂面试源码秘籍,面试题+笔记+项目实战

android 程序员 移动开发

【译】Flutter vs React Native vs Native,android开发社区

android 程序员 移动开发

【转载】3-5年的Android工程师最容易遇到4个瓶颈是什么

android 程序员 移动开发

【面试专题】2021年字节,面试安卓工程师会问到那些问题

android 程序员 移动开发

一个五年Android开发者小米、阿里、字节跳动,最新阿里+头条+腾讯大厂Android笔试真题

android 程序员 移动开发

一文读懂 AOP _ 你想要的最全面 AOP 方法探讨,kotlin数据库框架

android 程序员 移动开发

【建议收藏】Android中高级大厂面试源码秘籍(1),android开发实战湖南师范大学出版社

android 程序员 移动开发

【最强】Android 项目集成 Flutter 实战分享,精通android游戏开发

android 程序员 移动开发

【绝对干货】超全Android中高级面试复习大纲,安卓面试题目2019

android 程序员 移动开发

【自学Flutter】4,安卓移动开发基础案例教程

android 程序员 移动开发

【面试官爸爸】来给我讲讲View绘制,腾讯T2亲自教你

android 程序员 移动开发

一个Android开发真实的996生活,我们到底在追求什么?,kotlin中文教程

android 程序员 移动开发

浪潮云说丨千呼万唤,浪潮云智能视觉来了!

云计算

一文了解Dart语法,kotlin密封接口

android 程序员 移动开发

【需求解决系列之四】Android App 在线 自动更新,android观察者模式

android 程序员 移动开发

【原理+实战,android音视频开发何俊林

android 程序员 移动开发

一位Android程序员入坑Flutter后整理出一份超详细的学习笔记

android 程序员 移动开发

一年Android工作经验,一举拿下百度、网易,38岁的中年失业者怎么活下去

android 程序员 移动开发

一个HashMap,阿里面试官竟然跟我扯了半个小时!,掌握这6大技能体系

android 程序员 移动开发

一个优秀程序员不可避免的问题:内存泄漏,ffmpeg音视频开发实战6下载

android 程序员 移动开发

【孔乙已】生产者消费者有四样写法,android插件化和组件化

android 程序员 移动开发

【译】Flutter 2,Android程序员必会

android 程序员 移动开发

一个34岁出来面试还被拒绝的Android程序员有多惨?,android开发软件安装JAVA路径

android 程序员 移动开发

下一个三年,联想要寻找取天火的人

脑极体

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