优秀的(Android)软件工程师是如何练成的

优秀的(Android)软件工程师是如何练成的
过去的五年里我一直在从事 Android 开发工作。这段时间里我和各种背景不同、经验级别不同的工程师一起工作过,有些人来自大企业,拥有多年的一线开发经验;有些人刚刚从高校毕业,简单具备一些学校里业余开发 App 的经验;也有一些人并非 CS 专业,而是通过自学的方式进入这一行.

如果你正在为你的公司招聘所谓的:Android Software Engineer。我建议你来读一下这篇文章,为什么?

很多人总觉得移动端开发非常简单,他们认为移动应用只不过是把从 server 获取回来的数据展示在不同的前端页面而已。真的吗?我认为远远不是。实际上,如果你去看一圈 PlayStore 上的各种 App 的质量,你会发现这些 App 的质量呈现高斯分布:小部分很烂的 App,小部分非常优秀的 App,和超级多平庸的 App。

我来解释下这里平庸的意思:

基本而言,平庸的 App 是指那些不怎么考虑操作系统及运行平台的 App。第一,它并不去遵守操作系统的视觉语言,这其实在很多细节上让用户感到困惑。第二,它忽视了自己是运行在一个资源有限的环境上(内存,CPU,网络带宽,电量),这直接损害了整个设备上的用户体验。第三,它在某些特定环境下无法工作(比如糟糕的网络环境等),这一点也是全世界大部分 App 都存在的问题。

上面三点是一款优秀的 App 无法避免的挑战。

因此,如果我需要去招聘一个 Software Engineer 来应对上面这些挑战,我会着重考察下面几点:

作为软件工程师的基础能力,包括:SOLID 原则,clean code,应用程序架构,测试。数据结构和算法同样很重要,但是我不会因为候选人不会平衡 BST 就拒掉他。我更看重的是候选人是否理解了基础数据结构(Lists, Queues, Trees, Hash Maps…),理解 Big-O 说明并能够讲解时间复杂度和空间复杂度的权衡。看到没?就是这些基础知识。

熟练 Java。当然,如果他非常出色,熟悉其他语言,当然更好。

理解并发。为了让 App 能够快速响应用户的操作,所以一定不能在主线程执行耗时任务。也就是说,很多任务需要去独立的线程去执行。如果候选人不懂并发,那迟早会在未来的工作中,甚至生产环境下掉坑。

分析问题与解决问题的能力。考察候选人是否能够深入思考一个问题,搞清楚所有未知的设定,发现所有可用的解决方案,比较这些方案的优劣,最终形成一个有效的解决办法。

能够描述出他们所在公司的技术栈。这一点很重要,雇佣的人必须对技术背后的原理有好奇心,而且要能对答题架构有一个清晰的认知。

好的沟通和写作能力。在科技行业,沟通能力是关键。候选人必须要能够清晰的阐述他们的想法,并准确的以文档形式记录他们的工作。而且,好的写作能力往往也能反映不差的 coding 能力。

最终,我并不关注候选人对于 SDK 本身的了解,只要候选人具备了上面大部分能力,那他一定能成为一个 fast learner。不过,如果你想考察一个候选人在 Android 方面的理解程度,你可以考察以下几个方面:

能够在白纸上画出 Android 的大体架构图;

能够大体描述清点击 Android Studio 的 build 按钮后发生了什么;

能够大体说清一个应用程序安装到手机上时发生了什么;

对 Dalvik、ART 虚拟机有基本的了解;

Android 上的 Inter-Process-Communication 跨进程通信时如何工作的;

App 是如何沙箱化,为什么要这么做;

权限管理系统(底层的权限是如何进行 grant 的);

进程和 Application 的生命周期;

还有一个好的方法就是深入地探究候选人擅长的一个领域,比如他擅长 UI,那就多问一些 UI 方面的问题

所以说重点就是通过看候选人如何快速应对你所提问题,来了解他们对核心基础的熟悉程度。而且要特别提出的一点:不要雇用只会使用 library 的人,而应该要招聘那些既能在需要的时候利用开源库(当然可以的话最好不要自造*),又要能够进一步,分析当前环境,预见可能会发生的问题并能提出针对性的解决方案的人。

再强调一遍,不要因为某些候选人只会使用某几个开源库就招聘。

正如 Montaigne 所说:“I prefer a sharp mind over a full one”。

当然,上面我说描述的候选人是指 senior。当然,你也能够,而且应该去招聘 junior 工程师,不过要注意在 team 内部维持一个好的 junior 和 senior 的比例。如果你的 team 有太多的 junior 工程师,那你的 team 将会非常热闹了,因为他们将在工作中学习到很多东西,修复一个又一个的 live bug,不断的进行迭代直到形成一个较为稳定且可测试的 code base。

如果你是一个构建 Android App 的软件工程师并想要提高上文中提到的一些能力,这里有一些阅读的书籍或文章推荐:

Software Engineering and Craftmanship:

《Clean Code》 by Uncle Bob Martin

《程序员修炼之道 The Pragmatic Programmer》 by Andy Hunt and Dave Thomas

《重构 Refactoring》  by Martin Fowler

《Head First Design Patterns》 by Elisabeth Freeman, Eric Freeman, Bert Bates and Kathy Sierra

Java:

《Effective Java 第二版》 — by Joshua Bloch

并发:

《Java 并发实战 Java Concurrency In Practice》by Brian Goetz

数据结构和算法:

《Introduction to Algorithms (a.k.a The Cormen book)》 by Charles E. Leiserson, Clifford Stein, Ronald Rivest and Thomas H. Cormen.

《The Algorithm Design Manual》 by Steven Skienna

Problem solving skills:

《How To Solve It》 by G. Polya and John H. Conway

Writing skills:

《On Writing Well》by William Zinsser

文章转载自 开源中国社区 [http://www.oschina.net]

上一篇:Swagger


下一篇:Linux 内核里的数据结构——双向链表