写点什么

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

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

评论 1 条评论

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

使用IDE并不是懒癌表现

Geek_99967b

小程序 小程序容器

App中快速复用微信登录授权的一种方法

Speedoooo

APP开发 微信授权 微信登录

Java设计模式学习总结

梁歪歪 ♚

设计模式

scp 高效操作之避免 zsh 路径展开

Nick

Linux zsh 6月月更 高效操作 scp

leetcode 51. N-Queens N 皇后(困难)

okokabcd

LeetCode 搜索 算法与数据结构

开放银行引入第三方生态,系统风控助力事前-中风险监控

Speedoooo

数字化 开放银行 异业合作

面试官:执行一条 SQL 语句,期间会发生什么?

Java全栈架构师

Java MySQL 数据库 程序员 面试

LabVIEW控制Arduino采集热电偶温度数值(进阶篇—2)

不脱发的程序猿

单片机 LabVIEW Arduino VISA 采集热电偶温度数值

跨平台方案的比较

Geek_99967b

小程序 小程序容器

【前端每日一学】vue框架的深入学习

恒山其若陋兮

6月月更

开源生态|超实用开源License基础知识扫盲帖(上)

Orillusion

开源 WebGL 元宇宙 Metaverse webgpu

PC端实现运营小程序,是否能再创PC时代又一春!

Geek_99967b

小程序 小程序转app

阿里6月终于有HC了!耗时两月足足面试13轮成功入职阿里!拿到32*15Offer

Java全栈架构师

Java spring 程序员 面试 程序人生

2022年SaaS行业十大趋势:SaaS的新机遇有哪些?

小炮

Flutter 利用 Redux 中间件完成购物清单离线存储

岛上码农

flutter ios 前端 安卓开发 6月月更

「技术人生」第8篇:如何画业务大图

阿里巴巴中间件

阿里云 云原生 技术文章

InterpreterPattern-解释器模式

梁歪歪 ♚

设计模式

三大特性,多个场景,Serverless 应用引擎 SAE 全面升级

Serverless Devs

阿里云 Serverless 微服务

孙勇男:实时视频 SDK 黑盒测试架构丨Dev for Dev 专栏

声网

自动化测试 Dev for Dev

5分钟了解SDN控制平面

穿过生命散发芬芳

SDN网络 6月月更

Flutter的整体架构

Geek_99967b

小程序 小程序容器

每日一题 | LeetCode 1 两数之和

武师叔

Python 算法 JAV A Leet Code 6月月更

企业网站如何快速被搜索引擎收录

源字节1号

过去一周区块链热点回顾|BAYC项目具有被无限铸币的风险

区块链前沿News

Hoo

社区活动 | Apache Doris 社区长期征文活动&演讲议题征集 正式开始啦!

SelectDB

开源社区 apache doris 征文投稿 议题征集 社区活动

同心助力,战役有AI

开源社

人工智能 疫情防控

FinClip2022重要功能汇总

Speedoooo

微信小程序 APP开发 小程序容器 微信登录

让开发效率飞速提升的跨端开发神器

Geek_99967b

小程序 小程序容器

深入浅出-如何安全的传输密码

梁歪歪 ♚

加密

Hexo + Github从零搭建个人博客

梁歪歪 ♚

Hexo 博客搭建

Disruptor 高性能堆内队列 系列一

Nick

Java Disruptor 队列 高性能 6月月更

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