寻找卓越的(Android)软件工程师
在过去五年中,我一直做Android相关的工作。在这期间,我与不同背景,不同水平的工程师进行过合作。有些工程师有非常丰富的经验,有些是刚走出校园的应届生,它们拥有的只是学校学习到的知识并利用业余时间进行App的开发。还有些工程师甚至不是CS专业,仅仅是自学的。在合作过程中,我目睹了不同类型工程师的工作交付内容和方式。
所以,如果你是一个Android软件工程师,可以尝试读一下这篇文章。首先,很多人误认为移动开发非常简单,移动应用就是把根据后端的设计把一些界面组合在一起。真的是这样吗,其实这与实际情况差的很远。实际上,如果你看一下PlayStore上的应用,你就会发现app的质量分布其实是一个高斯分布,低质量的app很少,同时高质量的app也很少。
这里我定义一下平庸的App是什么
在一个非常基本的层面上, 一个平庸的app 与操作系统不能很好地兼容。首先,不遵循平台要求的 设计语言,这会使得用户感到困惑。第二,不考虑运行环境(内存、cpu、带宽、电量)实际上是有限制的。第三,在某些条件下不能工作(比如在弱网环境下)。现在的大部分软件都存在最后一个问题。
简而言之,以上三点就是构建一个好的移动应用的挑战。此外,App需要与公司的基础需求合理地整合,适应不断变化的业务需求。
所以如果我要寻找可以处理以上三个挑战的软件工程师,以下几点是我关注的:
-
较好的软件工程和技术水平 这包括:SOLID(面向对象设计)原则,clean code,应用架构和测试。数据结构和算法也很重要。但是我不在意面试者是否可以平衡二叉排序树。我关注面试者是否理解基本的数据结构(Lists, queues, trees, hash maps),是否理解 O 是什么,可以讨论时间和空间的交换,就是最基本的技能。
-
熟悉java语言(如果面试者非常熟悉其他的语言,我也不会拒绝)。
-
理解并发 因为App是响应式的,所以不可以在主线程中执行耗时任务。很多事情需要在其他线程执行,如果面试者不能处理并发编程,他们需要在工作和项目中学习。
-
理解分布式系统 随着移动应用变得越来越灵敏,需要设计为可以离线使用。这意味着如果网络有故障,相同的用户可能会面对不同的状态。因此,面试者需要了解CAP(Consistency,Availability,Partition Tolerance theorem)理论和分布式系统的共识模型。
-
分析解决问题的能力 面试者需要对事物的工作原理保持好奇,并且有大局观。
-
较好的口头和书面表达能力 在技术上,沟通交流非常重要。面试者清晰地表达自己的想法,同时合理的文档说明是非常重要的。其实,是否擅长写文档一定程度上也代表了代码能力。
-
理解当前的技术环境和对设计与工程的影响
我并不担心面试者是否对SDK本身理解多少。如果面试者理解以上的几点,即使他只是一个Android的用户,也可以快速地学习。也就是说,面试者同时拥有好的CS背景,了解android生态环境,还要知道以下的一些基本概念:
-
可以画出Android的基本架构
-
可以描述在点击Android studio的一个按钮之后具体发生了什么逻辑
-
理解基本的Dalvik和ART 虚拟机
-
Android进程间通信原理
-
app的沙箱机制以及为什么要用沙箱
-
权限系统(权限在底层是如果实现的)
-
进程和应用生命周期
-
还有一点是可以和面试者聊他擅长的话题,如果他擅长ui,就可以和他聊UI。
可以发现重要的是判断面试者是否知道核心的基础和概念,从而较好地处理分给他们的任务。一定不要雇佣只会使用一两个library的员工。工程师不仅在必要时会使用library,而且可以在提供解决问题的方法之前可以分析使用情景,预见可能的问题。
再次强调,一定不要雇佣只会使用一两个library的工程师。
当然,我这里描述的条件适用于senior 工程师。同样也需要雇佣一些junior工程师。但是一定要控制好两种工程师的比例。如果团队中有太多初级工程师,那么开发过程非常艰难,需要修改一个接一个的线上问题,直到可以代码达到维护性和测试性良好的程度。
如果你是一个Android工程师,你可以看一下以下的文章以提高自己的技术水平:
软件工程技术
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
Patterns of Enterprise Application Architecture — by Martin Fowler (his blog is also worth following)
java
Effective Java, Second Edition — by Joshua Bloch
并发
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.or The Algorithm Design Manual — by Steven Skienna
计算机文化
Subscribe to ACM Queue
Love the Papers
Listen to Software Engineering Radio and/or Software Engineering Daily
问题解决技巧
How To Solve It — by G. Polya and John H. Conway
写作技巧
On Writing Well — by William Zinsser
值得follow的一些blog
Chet Haas’s blog. Specifically These series of articles he (Chet) wrote about Android development
Dan Lew’s blog
Jake Wharton’s blog
Jesse Wilson’ blog
Cyril Mottier’s blog
Chris Bane’s and Roman Nurik’s blogs for UI related subjects.
Listen to Android Backstage and The Fragmented Podcast.
And finally do subscribe to Android Weekly, to read about the latest stuff in the Android development world.
此文为译文,原文地址https://hackernoon.com/what-makes-a-good-android-software-engineer-206562e1fdb6#.g108jtz8i