优秀的(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]
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
《iOS 8案例开发大全》——导读
本节书摘来自异步社区《iOS 8案例开发大全》一书中的目录,作者 朱元波 , 陈小玉 , 胡汉平 , 张晨洁,更多章节内容可以访问云栖社区“异步社区”公众号查看 目 录 前言 第1章 搭建开发环境实战 实例001 下载并安装Xcode 实例002 改变Xcode工程的公司名称 实例003 通过搜索框缩小文件范围并格式化代码 实例004 代码缩进和提示处理 实例005 设置项目快照以及恢复到快照 实例006 实现复杂的查找和替代工作 实例007 使用书签 实例008 实现断点调试 实例009 启动模拟器 实例010 使用第三方工具iPhone Simulator 第2章 界面布局实战第3章 iOS控件应用实战第4章 文本和表格处理实战第5章 屏幕显示实战第6章 图形、图像和动画实战第7章 多媒体应用实战第8章 互联网应用实战第9章 地图定位应用实战第10章 传感器、触摸和交互第11章 和设备之间的操作实战第12章 游戏应用实战第13章 移动Web实战第14章 Swift实战
- 下一篇
关于 Android TV 的更多细节
Google 在产品设计上已经越来成熟了,一方面,它的产品开始获得统一的风格,这体现在其不同的网络服务和 Android 平台规范上,另一方面,它也学会了做减法,Chromecast 就以其单一功能获得了意外成功。这使得我们对于即将到来的 Android TV 增加了期待。 从目前透露的信息来看,Android TV 将是 Google 进军客厅的新起步。相比以前的 Google TV,Android TV 界面进行了全新设计,移动平台发展出来的“卡片”将会获得广泛应用 ,另外,Google 也对产品功能进行了重新定位,鼓励开发者“为极为简洁的机顶盒界面开发极为简洁的 TV 应用”。 不过,Android TV 与市场上其它的产品,比如 Apple TV、亚马逊的 Fire TV、Roku 的机顶盒区别何在呢?难道只是界面上的一些不同?根据 GigaOM 网站得到的消息,Android TV 会有非常大胆的创新,并且与 Google 的核心业务更加紧密地结合。 机顶盒上的不同应用,界面各不相同,因为各家公司都有不同的想法和目的。Android TV 试图去改变这种做法。内容提供商将会获...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7