阅读更多
过去的五年里我一直在从事 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
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 这一年,这些书:2021年读书笔记

    Note: 以下 markdown 格式文本由 json2md 自动转换生成,可参考JSON转Markdown:我把阅读数据从MongoDB中导出转换为.md了了解具体的转换过程。 红玫瑰与白玫瑰:张爱玲全集02 作者:张爱玲[中] ISBN:9787530218617...

  • 精进:如何成为一个很厉害的人--作者:采铜

    精进:如何成为一个很厉害的人 作者:采铜 文章目录精进:如何成为一个很厉害的人序 用更勇敢的方式去生活01 时间之尺 我们应该怎样对待时间活在“全部的现在” 从当下出发,联结过去与未来那么,一个人应该怎样对待...

  • 生活集思录-如何创造差异化

    阅读原文 不论是做产品还是做人,都要给自己尽量制造差异化的竞争力,差异化才是核心竞争力。本文恰是一篇自我总结,就写一写自己的经验,不求全,但...等等,这其实就是一个知识/技能壁垒,我会的别人不会,我知...

  • 第二章:产品入门

    看似一句话就能讲明白产品经理的工作职责,但是中间却包含了很多领域的知识,并且产品经理作为一个枢纽岗位,在工作中需要接触和沟通协调的同事也比其他职位要频繁。 对于如此多跨领域的综合型知识结构,产品经理的...

  • 基于Java+SSM+Vue+uniapp实现微信小程序的学生资助在线管系统小程序

    社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息不再受制于地理位置的限制,处理信息及时高效,备受人们的喜爱。所以各大互联网厂商都瞄准移动互联网这个...

  • 大疆文档(2)-指南

    飞行控制器是一种机载计算机,它将来自飞行员的控制信息与传感器信息结合起来,调整每个螺旋桨的推力,并根据需要驾驶飞机。 飞行控制包括电机控制、起飞和降落、手动飞行模式 飞机状态信息,如姿态、位置、速度 ...

  • otn系统中常用的电层_请教一下:OTN在实际工程应用中分别在骨干层、汇聚.. - 通信技术你问我答 - 纯技术讨论者的天地 - Powered by C114...

    然后通过耦合器将2路光合并输入到一个接收机中 , 2个输出端口的备用光纤连接模块是Tx_dis =1 的,当主路收到Los信号时候,就触发备路Tx_dis=0,主路tx_dis=1,这样的话完成快速保护。缺点是占用了一个通讯的端口。...

  • 基于jsp的农产品销售管理系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)

    这里大体部署出设计的各个阶段任务内容和完成时间,然后对各个阶段的任务内容进行分析后确定软件的各种功能模块的划分从而对系统进行论述概写,即,也就是分析判断确定本次毕业设计的模块组成结合和实现的。...

  • 中文版ArcGIS Resource Center:一部关于GIS 的“百科全书”

    加之最近国内外诸如Foursquare以及街旁、冒泡等基于地理位置的服务(LBS)网站如雨后春笋般涌现,更是将“地理位置”这个我们平素司空见惯,同时也可能已经视若罔闻的参考维度,再次拉入人们的视野,并引起大家对其...

  • 零基础转行大数据工程师艰辛历程记!看了让我感慨万千

    我们相信人人都可以成为一个大数据程序员,现在开始,找个师兄,带你入门,学习的路上不再迷茫。     不少想进入大数据行业的零基础学员经常会有这样一些疑问:零基础应该怎么学习?自己适合学习大数据吗? ...

  • 这一年,这些书:2020年读书笔记

    Note: 以下 markdown 格式文本由 json2md 自动转换生成,可参考JSON转Markdown:我把阅读数据从MongoDB中导出转换为.md了了解具体的转换过程。 面纱 作者:毛姆[英] ISBN:9787210082835 出版社:江西人民出版社 ...

  • 推荐一本写给IT项目经理的好书

    推荐一本写给IT项目经理的好书 原文:http://www.cnblogs.com/cbook/archive/2011/01/19/1939060.html 清理电脑,十数年来,无数资料,近来每天抽空好好整理整理, 做IT的特别是整ERP的,四个字形容:命苦可怜.发现本...

  • 某社区APP完整原型案例

    本文作者将结合自己之前做过的一个项目原型分享给大家,希望对0-2岁的产品经理、交互设计师有所帮助。 电话响起,屏幕上的名字是“催稿的老曹”,我没接;我妈问我电话为什么没接,我说没听见;接着又打来了,...

  • 阿里iOS三面

    你更倾向于哪一种? **3.**单例弊端? **4.**如何把异步线程转换成同步任务进行单元测试? **5.**介绍下App启动的完成过程? **6.**比如App启动过慢,你可能想到的因素有哪些? **7.**0x8badf00d表示是什么? **8.**...

  • 网站框构分析 一

    这是一个非常好的思路,将用户按一定规则(按id哈希)分组,并把该组用户的数据存储到一个数据库分片中,即一个sharding,这样随着用户数量的增加,只要简单地配置一台服务器即可,原理图如下: 如何来确定某个用户...

  • subunit-devel-1.4.0-14.el8.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统subunit-devel-1.4.0-14.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf subunit-devel-1.4.0-14.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

  • TIA-Portal-V19-HSP.zip

    TIA_Portal_V19_HSP.zip

  • 自己搭建的无人机跟踪实验,主要讲软件,硬件的需要等等,为初学者提供学习建议及需要学习的内容,讲解使用到的代码等.zip

    自己搭建的无人机跟踪实验,主要讲软件,硬件的需要等等,为初学者提供学习建议及需要学习的内容,讲解使用到的代码等.zip

  • stunnel-5.56-5.el8-3.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统stunnel-5.56-5.el8_3.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf stunnel-5.56-5.el8_3.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

Global site tag (gtag.js) - Google Analytics