(译)第一次Android开发单飞
两年半之前,在一个由四个人组成的 Android 团队的帮助下,我开始从后端开发转向移动开发。一年之后,我加入了一个已经完成了B轮融资的初创公司,在那里主要做 Android 开发的工作。在一个小团队里工作,既能很好地保持独立,还不耽误向同事学习。
但随后,五个月前,我从原本的小团队跳槽到了一个“根本没有团队”的地方,我去的这家是刚刚成立的创业公司,只有六个人,而我是其中 唯一的 Android 工程师。在这个新的岗位,我从零开始完成了 Winnie,这个 APP 最近已经发布 了!
结果证明这是一个大飞跃。单飞一直是一个挑战,但它也带来了很多回报。一路走来,我发现独自工作是有利有弊的。不过最重要的是,你可以做一些事情来帮助自己走向成功。这里有一些目前为止已经帮到我的策略。
跟社区保持接触 业余不忘充电
对单飞的担心之一是,我已经习惯了以前的角色,担心没有人能一起讨论新的想法并且给我出主意。
好消息是有很多在线资源可以拓展你的知识和视野。 从 DroidCon 、 360|AnDev 这样的开发者大会上的在线分享,到 Fragmented Podcast 、 Android Dialogs 和 Android Weekly 这样的时效性很高的网站,你有很多方法来拓展自己的想法。
我个人最喜欢的是 Caster.io —— 代码示例加上简短的解说视频让我随时脉动回来! 线下聚会或者 AndroidDev subreddit 、 Google+ communities , Slack groups 和 Twitter 这样的社区对于继续讨论和解疑释惑,都是很好的去处。
审查之前提交的代码 保持高标准
我特别建议打开提交记录来审查自己的代码。在自己的提交下评论可能看上去很傻,但是我认为如果你一个人工作的话,这是个很好的习惯。这一点在 一个跟 Android 相关的对话节目系列 中也有讨论。
我用 GitHub 自带的预览功能完成第一步,之后把它放一边然后过一段时间再来查看。我尽全力来审查自己的提交,就像我审查同事的代码一样,来确保我用同样严格的标准要求自己。回过头看自己的代码还有助于发现 bug 和错误的边界情况处理,以及让你的代码保持统一和整洁。
一个“不好的”模式通常比没有模式要好
你不得不做出很多决定 —— 应该使用 MVVM 、 MVP 、Flux,还是其它的架构模式?使用 Fragment 还是 ViewGroup?哪些应该是抽象的而哪些不应该是?
项目开始的时候,一开始的时候使用一种模式,之后意识到另一种模式更好,并由此带来一些模式的重构和去除并不是一件新鲜事。
虽然在某些情况下打破你的模式是有意义的,但是当你发现更好的东西时,最好留心去重构并且改变之前的代码来使整体保持一致。这可能听起来很明显但是仅仅把新的模式用到新的代码中更为简单,所以当你一个人工作的时候可能会倾向这么干。但是这样会在你察觉到之前迅速让你的代码变得蜜汁混乱!即使这个模式并不是很棒,保持代码的一致性会让之后的修补变得更容易。
墙裂建议使用Kotlin
除非你是从头开始,不然的话,考虑一下在下一个你将要写的类里试试吧。
我最终没有在 Winnie 中使用 Kotlin ,因为我当时没有经验所以对这个想法不够自信,加之不想打击团队中的 Java 后端工程师向代码库中贡献代码的热情。
然而,在看过 Christina的关于 Kotlin 的演讲 并且做了一些研究之后,如果能重来,我至少会试试这门语言。 Kotlin 有很多优点 —— 即使只是防止 null pointer 引起的异常和不与 Java 笨拙的模式化代码同流合污(Kotlin 的语法比 Java 要精炼得多 —— 译注)就让我佩服得五体投地。 Jake Wharton 的 这个讲座 是个很好的学习 Kotlin 的起点。
掌握自己的代码 不要过分依赖第三方库
我记得在 MVP 中,曾经花费过很多时间选择一个库来用,因为这些库实在是太多了。被丰富的选择惯坏是个很大的问题,最终我自己造了个简单的轮子,用得很开心。
当选择用哪个第三方库的时候,我建议考虑好你是否真的需要它以及它会对你未来的开发造成哪些限制 —— 它会为单元测试增加难度吗?它会限制使用 Android 自带的特性吗,比如多屏之间的过渡动画之类的?它的开发是不是仍然很热火朝天并且有很多 APP 使用它?这些考虑让我好好权衡并做出决定。
我建议在尽可能保留掌控的情况下去优化,而无须重新造轮子 虽然有个库已经几乎包含所有的东西了,但是自己去实现一些东西会更好。(使用第三方库的基础组件,自己根据需要进行组合。—— 译注)
规划好测试(Testing)和辅助功能(Accessibility)
如果你接手的项目是从头开始,那么你现在就可以去做了!不然的话,你可以在接下来你写的代码中这样做。
面对张牙舞爪的 deadline,测试和辅助功能往往是下等公民。而你把一旦它们的优先级放得很低,由于没有其他人跟你分担,你就更难找到时间去实现它们了。
我承认,我自己只是才开始做这方面的工作。但通过使用依赖注入,MVP 模式,只暴露 Model 对象的接口到 UI 等等方法来在脑海中写测试代码,来达到更容易测试的目标。从项目开始的时候,每次提交之后,我都会同时在 CircleCI (一个持续集成和发布的平台 —— 译注)上进行编译,以便进行简单的检查和运行测试。
对于辅助功能(Accessibility),我在任何可以的时候都添加上内容描述,并且在发布前使用 Accessibility Scanner 来找出我接下来还需要做哪些这方面的工作。毫无疑问还有更多的工作要做,但这是个不错的开始。Kelly Schuster 的 这个演讲 给出了一些可行的建议使得开发者可以让自己的 APP 变得对有缺陷的人群更友好。
如果时间不允许来编写测试,那就人工测试就很方便了。比如,在一个文档中为每一个特性写下不同的测试案例(正面的、反面的),确保在每次发布前进行这些测试。为自己定下编写测试和进行 Accessibility 改进的 deadline,不然你可能永远也完成不了它们。
告诉你的 iOS 设计师他们是错的 自己寻求到 Android 设计的转换 :-).
不要因为支持你的平台上的正确的事情而担心!当你一个人干的时候,你有责任带着别人跟上最新的 Android UI 模式和代码库的发展速度。
我工作中通常得到的是 iOS 系统上的截图,但是使用 Material 设计规范 和一些优秀 Android APP 作为资源来把那些设计转换到 Android 里面。还有,没有什么比引用官方的 Material Design 文档更适合来说服别人了!
至于代码库,在我的 CEO 来帮忙的几个月内,我向她普及了我们的架构和 MVP、Dagger2、RxJava2 之类的概念。我建议保持向周围的人进行 Android 概念的传教,因为向别人解释你的决定或者教给他们一个新的概念帮助你真正得掌握这个概念,有时还会让你意识到自己的错误。
尽早发布 beta 版
如果你的 APP 还没有上线或者在现有的基础上进行了重大的变化,这条会很适用。Google play 有一个 alpha 和 beta 频道,在 beta 频道,你可以自由开关你的 beta 版本。
如果你在继续开发一个已经存在的 APP,你仍然可以平行地发布 beta 版,只要版本比当前的正式版高就好了。如果是开放的 beta 版,用户将可以通过在 play store 安装或者点击一些链接下载安装来使用。如果你要对变化进行小规模的测试, staged-rollouts 将会是个很合适的选择。
如果你在开发一个崭新的 APP,我建议在上架前尽快开发出内测版,然后在这个内测版准备好了的时候把它转为开放的公测版。 我们的第一个内测版只有很少的几个功能,但是它帮助我们及早发现了 bug,步入了周期性发布的正轨,并且获得了很有价值的反馈。这也让我们毫无压力并且可以平稳上线。
第一次单飞是个很好的学习经历,因为你挑战自我了,这是之前从未有过的。 你变得更加依赖自己、锻炼了对代码库的整体控制(或好或坏)、学习了更多自己喜欢的东西并且处理怪不得别人的错误(耶)。我曾经担心单飞,但是在上面的建议的帮助下,结果是一个很好玩的经历。我希望这些建议同样会对你有所帮助。
打算单飞或者和分享你的单飞经历?很高兴听到你们的声音。欢迎加入Android开发技术交流QQ群;701740775
本群提供Android高级开发资料、高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)等相关资料和解答
不懂得问题都可以在本群提出来 还会有职业生涯规划以及面试指导
进群修改群备注:开发年限-地区-经验
方便架构师解答问题
---------------------
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
安卓中高级开发面试知识点之——缓存
前言 几乎所有的项目都做了缓存,但是缓存做的怎么样,其实只有我们自己知道。缓存做的好,没有网络也能流畅的使用;再多的数据请求都不会出现卡顿延迟等待很久的情况。 程序中除了图片缓存(三级缓存),还有信息缓存。当用户无法联网时,app会默认显示缓存的数据。 前言缓存方式 SQLite 下载完数据文件后,把文件的相关信息如url,路经,下载时间,过期时间等存放到数据库,把url作为唯一的标识。下次下载的时候根据url先从数据库中查询,如果查询到当前时间并未过期,就根据路径读取本地文件,从而实现缓存的效果。 文件缓存使用File.lastModified()方法得到文件的最后修改时间,与当前时间判断是否过期,从而实现缓存效果。数据格式为JSON。 缓存方式两点说明 1、不同类型的文件的缓存时间不一样。笼统的说,不变文件的缓存时间是永久,变化文件的缓存时间是最大忍受不变时间。说白点,图片文件内容是不变的,一般存在SD卡上直到被清理,我们是可以永远读取缓存的。配置文件内容是可能更新的,需要设置一个可接受的缓存时间。 2、不同环境下的缓存时间标准不一样。无网络环境下,我们只能读取缓存文件,为了应用有...
- 下一篇
【ABP框架系列学习】N层架构(3)
原文: 【ABP框架系列学习】N层架构(3) 目录 0.引言 1.DDD分层 2.ABP应用构架模型 客户端应用程序(Client Applications) 表现层(Presentation Layer) 分布式服务层(Distributed Service Layer) 应用层(Application Layer) 领域层 基础设施层 3.使用ABP项目模版快速生成应用程序 0.引言 应用程序的分层是一种广泛接受的技术,可以降低复杂度和提高代码的可重用性。为了实现分层架构,ABP遵循领域驱动设计(DDD)原则。 1.DDD分层 领域驱动设计有四个基本的层: 表现层(Presentaiton Layer):为用户提供接口。使用应用层实现与用户交互。 应用层(Application Layer):表现层和领域层的中间者。协调业务对象以执行特定的应用程序任务。 领域层(Domain Layer):包含业务对象和规则,是整个应用程序的核心。 基础设施层:提供支持上层通用的技术能力,大部分是借助于第三方库 2.ABP应用构架模型 除了DDD,现代的应用程序架构还包括逻辑和物理层等。如下图是A...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Hadoop3单机部署,实现最简伪集群
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题