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

局长
 局长
发布于 2017年01月22日
收藏 73

过去的五年里我一直在从事 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

原文链接:https://hackernoon.com/what-makes-a-good-android-software-engineer-206562e1fdb6

来自:大公司技术博客 良心po主

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:优秀的(Android)软件工程师是如何练成的
加载中

精彩评论

bear256
bear256
The same to other engineers.

最新评论(1

bear256
bear256
The same to other engineers.
返回顶部
顶部