安卓自身开发知识第一层含义,你知道几个?(上)
安卓自身开发知识第一层含义,你知道几个?(上)
1 安卓自身开发知识
第一层含义,安卓自身开发知识,只要肯花时间,理解力稍微好一些的人都能学会。
安卓开发首先最好有Java基础,没学过可以先简单的去学习一下。推荐两本书《Head First Java》和《Java编程思想》(英文名《 in Java》)。Head First系列的书,特点是简单好懂,适合入门(最好有其他语言编程的基础),但讲解不是很深入,对于理解力够强的人,看起来比较费时间。而后者是Java语言公认的权威经典书籍,如果想全面的学习Java,可以看后面这本书,但是难度偏大,尤其是对于没有学习过面向对象编程语言的人来说。
安卓开发本身的技术知识,无非就是各种封装好的API接口函数(API= 应用程序编程接口),你只要按照它的规则去调用就行了。安卓的接口有官方给出的完整说明文档,安装了安卓开发包后,也有自带docs文件夹,里面就是说明文档。对于英文水平欠缺的人可能稍微有点难度,另外,由于谷歌访问不了,网页版的说明文档有些可能会打不开。如果你不想自己看官方英文文档,你可以直接买本安卓开发的书,或者在网上找安卓学习资料。这些资料也是别人根据官方文档和自己学习经验总结出来的。有时候如果需要用到一些别人很少用到的东西,或者网上说的比较含糊,这时官方文档是最权威、准确的参考资料。
2 安卓项目实战
第一层意思很容易掌握,也就是安卓开发的基础知识,相当于学习怎么识字和写字。而第二层含义,安卓项目的实际开发,难度就要大一些了。
有些人一辈子就那么过去了,从来很少思考复杂的问题,也没有什么思想。而写作是需要灵感和思想的,只是会写字,写不出来好的文章。同样的道理,有些人学安卓,只是掌握了基本的API,却怎么也写不出好的程序来。然后他们不知道应该怎么做,但是又不甘落后,索性把iOS开发、开发,各种程序API都学一遍,而始终只能做出来一些很简单的东西。
现在问题来了,编程到底需要学习哪些思想呢?应该怎么学呢?这里的编程思想,并不是专门针对安卓而言,而是针对所有软件开发而言。找工作的时候,你会发现,有些公司的软件研发岗位命名招聘的是iOS,但是并不一定要求掌握iOS,有安卓、或其他上层软件开发经验也可以。这就是因为,只要从一种编程语言、一种开发环境学到了软件编程思想,再去学其他环境和语言下的编程就容易得多。
3 理论和工程
软件分为两部分,理论和工程。理论方面,国内的发展不是很好。比如人脸识别的程序,需要用到一些数学理论模型,并以此做出算法来解决问题。在一些有实力的公司,会有这样的理论研究部门。最典型的像苹果、谷歌、微软这种巨头,研究自然语言处理、图像处理、大数据分析、人工智能等等诸多问题,苹果的Siri,谷歌的安卓内置的语音识别引擎,微软小冰等等。而在国内,百度的搜索引擎对自然语言的处理、科大讯飞的中英文语音处理方案等,也都是需要大量的理论知识。
因为理论研究很大的一个特点是不确定性,很可能研究了很久也没有成果,而实力不足的公司很难有这样的资源进行理论研究,所以在国内主要是有实力的大公司,以及国家提供经费的研究所、一些大学的实验室,才能有条件进行这方面的深入研究了(顺便提一句,也正是因为这种不确定性,国内学术腐败比较严重,各种抄袭,另外即使研究不出来成果也有经费)。
通常如果一个公司软件的研发需要用到深厚的理论,会专门给这个设置一些岗位,比如算法工程师、图像算法工程师等。而安卓研发、iOS开发这类,则更偏向于工程应用。当然有时候,也会涉及到一些简单的算法问题,那些更像是小学奥数题,关键看解决问题的思路是否灵活,往往不需要很强的理论知识。例如我在网上看到一道历年的百度笔试题:百度地图当中,每个地点的左侧或右侧需要放置地名,地名的文字是矩形区域;设计一个算法,使得尽可能多的显示地名,同时要考虑地图的缩放。这个问题没有什么标准答案,出题者或许也想知道最好的答案;而实际实现时,就要看有没有足够聪明的程序员,能给出一个尽可能好的方法了。
工程的特点就是把理论应用到实际上来,并且要考虑到开发成本、时间、安全性等实际问题。专门研究这些工程的东西组成了《软件工程》的学科,但是只有软件相关学院才会去上这种课程,而且这种课程太抽象了,理论性太强,往往忽视了实践的环节。
4 软件工程的重要思想:模块化和代码复用
软件工程思想有很多,模块化、代码复用是其中很基本、很重要的编程思想。所谓模块化,就是把一个完整的东西拆分成很多个小的模块,每个模块完成一定的功能,分工协作,然后按照合适的规则则合成一个完整的系统。拿整个人类社会来说,每个人都需要衣食住行,但是实际上,有的人专门从事服装制造,有的人专门做食品,有的人负责建筑……最后整个人类社会分工协作,效率大大提高,构成一个整体。拿计算机来说,我们的电脑由主板、内存、硬盘、屏幕、各种外设组成,每个模块被独立设计制造出来,并且只要接口吻合,可以随意进行组合。买电脑的时候我不一定需要内置蓝牙模块,但是在需要用的时候,我可以很轻松的买一个USB蓝牙模块装在电脑上。嫌内存太小,我也可以自己给电脑换内存,而不需要更换整个电脑。
程序也是这样的,我可以写一个模块专门用于网络连接的相关控制。以后不管做什么应用,只要用到网络,直接把这个模块放进去调用。积累的模块多了,后面就能像搭积木一样搭建不少的代码,大大减轻了程序开发的负担,提高了效率,节省了成本。而模块化开发也有利于分工合作,一个庞大的程序一个人不一定能做完,比如我们用的操作系统,代码量可能达到几千万行甚至更多,这时候就需要很多人共同完成。每个人或一个小团队完成一个小的模块,并且不同的模块之间规定好接口,然后同时进行开发。模块化编程实现了代码复用、提高了开发效率、有利于分工协作,等等优点,是软件开发的核心思想之一。
为了实现模块化,不同的模块之间要尽可能减小耦合度。也就是说,一个模块对于外部相当于一个黑盒子,我们只能看到对外的接口android移动应用开发案例教程中的梅花易数,而模块内部的具体实现,与其他模块之间的关联应该尽可能小。这样在修改一个模块的时候,只要保持接口不变,对于整个软件来说就没有影响。
5 软件研发相关的学科知识
软件开发需要的一些公共的知识,也是面试经常会问的学科知识有《数据结构和基本算法》《数据库》《操作系统》《计算机网络》《设计模式》等。
首先《数据结构和基本算法》几乎是所有软件相关技术岗位必会的。数据结构可以简单理解成数据是如何进行组织并保存在电脑的内存中的,而基本算法则是研究如何高效的对这些数据进行读取和处理,比如查找、排序,比较考验智商。数据结构和算法原本是两种知识,但是由于他们之间的关系非常密切,所以这两者常会作为一个学科,一起学习。通常如果你从事软件研发,要求掌握基本算法就可以了,也就是数据结构课程中介绍的算法。如果你的算法更强,可以考虑专门从事算法研究,那也很不错(如果算法学的很好,可以去谷歌总部,顺便就出国了)。数据结构推荐书籍《大话数据结构》。
《操作系统》看上去似乎和应用软件没有密切联系,但是有很多时候,软件设计需要用到多线程等知识,这个时候,对操作系统的原理有所了解,会做的更好。毕竟应用软件是运行在操作系统之上的。《计算机网络》在应用软件中使用很广泛安卓自身开发知识第一层含义,你知道几个?(上),我们用的大多数应用都需要用到网络,所以这门课必然是很重要的。推荐书籍《现代操作系统》、《计算机网络》。
所谓《数据库》,就是最常用的一种数据的保存手段。我们用QQ给被人发送消息,一条一条的消息并不是简单的用文本文件保存在手机里的,而是通过数据库进行保存的。对于应用软件开发来说,我们所要学习的是数据库的使用,一般不需要深入了解数据库的实现原理,所以学起来不会太难。数据库最常用的是SQL和,两者语法很接近。SQL语言号称是第四代编程语言,而C语言这种是第三代,越是上层的语言越接近自然语言,所以SQL语法也很好理解,有些时候用到一些不太好理解的语句,主要是因为语句包含的逻辑比较难理解,倒不是SQL自身的问题。
举个例子,在一个表格里保存了全班学生的信息,有和name两列分别表示学号和名字。这时我想知道小明同学的学号,我只需要用下面的语句选择他的学号就可以了,几乎和英语一样:
FROM WHERE name='小明';
编程有很多优化思想,除了提高开发效率、分工协作,还会考虑到安全问题等。这些编程思想的大量研究,人们积累了很多技巧,《设计模式》这一课程就是对一些使用频繁、经过了很多人考验、并且很有借鉴价值的程序设计思想进行的总结。而设计模式的精髓并不只是照搬那些模式,更多的是以前人的经验积累作为灵感和素材,根据实际需求,创造出更多好的编程技巧和思想。推荐书籍:《设计模式》(机械工业出版社),《Head First 》(中文名《深入浅出设计模式》),《大话设计模式》。
6 移动开发独有的特点
除了上面这些以外,移动应用开发与传统桌面应用开发相比,还有一些特别的东西。移动开发,也就是针对移动平台进行的应用开发,手机、平板等产品。受限于有限的屏幕、CPU速度、内存、电源供应、可以随便移动、网络费用可能比较高等特点,移动开发就有一些比较值得注意的东西了。移动应用的界面应该简洁、方便,按钮文字等设置的大一些,方便操作,充分利用手势进行操作安卓自身开发知识第一层含义,你知道几个?(上),还有针对安卓和iOS等不同平台进行优化,符合用户使用习惯(例如安卓有返回键,但是iOS没有)。然后在程序的数据处理方面,要充分考虑移动设备自身性能,进行各种调整。这类的问题有很多,如果需要深入了解,可以看一些相关的书籍。
7 安卓开发可能用到的知识,或研究方向
在等一些公司,流行一种概念,叫做全栈工程师。所谓全栈工程师,说的直白一点,就是一个人独立完成整个项目,包括客户端开发、前台网页设计、后台服务器搭建等。这对于工程师的要求非常高,不仅要知识面广,而且各个方面的学习都得有一定的深度。
这里我不打算讨论什么全栈工程师,我自己对服务器那些也没什么概念。我只是根据自己的经验和了解,总结下我所认为的、安卓开发还有可能要涉及的知识。
首先是平面设计、交互设计、用户体验。移动应用作为大众型产品,用户体验相当重要。如果有过个同类产品,功能接近,用户肯定更喜欢用户体验更好的产品。用户界面需要用到设计方面的知识。当然在大部分公司,一般会有专门的交互设计相关职位,所以对于应用开发者来说,设计方面不需要掌握的太深入,做一点简单了解当然是没错的。
然后上面已经说了很多软件工程方面的问题,数据结构、设计模式、操作系统、计算机网络等等,不再重复。
安卓NDK环境和JNI开发。安卓基于Linux操作系统android移动应用开发案例教程中的梅花易数,主要由Java编程,但是有些时候需要用到C++,例如核心代码需要保密,而Java保密性有所欠缺;有些程序只有C++环境才能实现;要用到一些高性能的算法等的支持,而Java执行效率偏低。这是我们可以使用Java的JNI,调用C++开发的程序库完成功能。C++的开发基本上就和在Linux上编程差不多,区别在于安卓系统中有一定的权限限制。而安卓NDK就是官方给出的、用于快速开发安卓JNI程序的开发环境。
安卓系统的实现、系统级开发。安卓系统有个很大的特点是开源免费,因此我们很容易就能获取安卓系统的源码进行学习,了解安卓系统的设计。了解安卓系统设计,后来我们就可以从事偏底层的安卓开发,系统订制,乃至安卓驱动开发、操作系统开发方面的工作。安卓是个优秀的操作系统(例如小米手机系统就进行了深度订制)。
游戏开发。移动游戏目前是很火的行业,很多公司从游戏产品中获得了大量的收入,游戏开发自然是一个不错的选择。大型3D游戏往往会使用各种游戏引擎来进行开发。由于我目前几乎没有做过安卓游戏,所以也没有太多的了解,不做过多讨论了。
另外还有服务器方面的研发。我们手机上必备的软件有QQ、微信、支付宝等,这些软件很重要的特点,不是在于软件自身,而是因为强大的后台网络服务支持。于是服务器方面的研发也不错,不过这已经不直接属于安卓应用开发的范畴了。另外还有推广运营、管理等,和安卓开发有直接关联,我并不太了解,也不做过多讨论。
最好总结为: 1、数据结构与算法 2、NDK、C++音视频家吗编程 3、高级UI 4、设计模式 5、移动架构师 ,基本上也就这 5方面,后期可以围绕opgl和去学习。
总体来说,学会安卓门槛很低;但是学好安卓绝非易事。
最后我想给你说的是:
1、我们程序员对于开发软件来说,无论你选择的是那种语言,Java也好,也好,ISO也罢。只能说高薪在高手,企业里去少的都是高手
2、我身边的薪资也有三万多的,Java也有高,不能说那种语言更具有发展前景。即时那种语言即将被取代了,那么对于那个高手而言学习被替代的语言应该不在话下
3、就目前而言,和ISO行情比不上前几年,但是如果你学的好,技术比较好,公司招聘高手的还是一如既往的
4、无论学习那种语言,都需要进行不断地进行自我提升和进阶。这样才能保证不被淘汰。
另外我之前写了一篇博客:随着新日益增多的技术,如何正确的提升自己? - CSDN博客
做已经四年多了,在创业公司做项目负责人。目前业余时间在专攻。
5、目前行情比较好,可以说今年最受欢迎的行业,如果刚刚步入IT的门槛android移动应用开发案例教程中的梅花易数,建议学习
比如对于的童鞋们来说:
可以从您感兴趣的一个小方向入口,比如 学习,一段时间,只看 ,知其然知其所以然,只要肯花时间专注研究,肯定是有收获的,什么区块链、比特币,再火又与我何干,等研究完这个后,再进行下一个的研究。17 年我也是迷茫的,业余时间自学了 、,但我知道,这些只是了解,得坚持 为主,其他为辅这条线,今年想的东西依旧很多,向着 高级继续进阶,时间很宝贵,别浪费了,每天进步一点,过得有意义。这里引用吴小龙童鞋的一句话。