软件工程2021:第2次作业—— 谈谈鸿蒙操作系统

一、关于鸿蒙操作系统

(一)背景

自技术战爆发之后,华为在芯片与操作系统受限的背景下推出了主打物联网时代的“鸿蒙系统”。在手机芯片受到限制之后,华为手机业务受到了巨大的冲击。手机每年能为华为提供不少的现金流,华为势必需要寻找新的突破点。

(二)需求和对于国内外的意义

打破国外对手机系统的封锁,国内的手机厂商长期以来都没有自己的系统,而华为的鸿蒙系统就是真正自主研发的。

鸿蒙系统让国内的手机市场流动起来,让国内手机市场真正重视研发,现在的国产厂商在手机的组件方面经验十足了,因而价格也逐渐下压,但手机最核心芯片与系统仍需依赖国外。

从全球操作系统来说,美国的安卓和苹果的iOS已经掌控了这一领域,华为鸿蒙系统有望成为全球第三大操作系统。从美国科技当前禁令的角度看,芯片与系统是所有国产企业最薄弱的一节,外海用户离不开GMS套件,被谷歌禁用后,鸿蒙系统2.0版本仍继续完善外国APP适配,目前有超出6万应用软件加入鸿蒙移动操作系统。

(三)应用场景

这方面已经有大量的公开信息了,鸿蒙采用微内核、分布式架构,成为跨终端的全场景OS,可以说是为loT而生,让采用鸿蒙OS的车机、智慧屏、手机、家电、耳机、手表、空调、洗衣机、电饭煲、空气净化器等,可以无缝多屏操作、同步等,让开发者一次开发,实现多个硬件终端部署。
对于广大手机用户而言,据说使用鸿蒙OS可以享受比安卓更加流畅的、不卡顿的体验,占用更少的内存资源,消耗更低的电量。按照华为的介绍,鸿蒙PC用户对摄像头不满意,就可以用手机当成摄像头拍摄,画面直接在PC上显示;在厨房做饭的妈妈,可以在烟机,在冰箱上,看到卧室摄像头拍摄的孩子画面;让烤箱等无屏变有屏,可直接通过手机功能界面实现设备状态的实时监控,包括运行状态、耗材提醒等...

(四)发展趋势

从现实来说,鸿蒙操作系统的出现,由于时机特殊,也被许多人赋予了完全不同的色彩,给予了极高的期待,在华为的官方推介宣传中,鸿蒙操作系统也被定为是真正面向IOT时代的操作系统,是比iOS系统快60%,比安卓系统更为优秀的存在。可以说,官方推介的种种特性加上特殊的时间节点原因,使得鸿蒙操作系统有种出道即巅峰的感觉,被我们赋予了"科技自强"等太多的期待。
但一款操作系统优秀与否,终究是由普通用户的实际体验来决定的,而不是宣传或是其他因素,所以当鸿蒙操作系统正式推送给数亿用户时,用户们的实际体验将验证华为宣传中的种种特性,究竟能达到几分,同时也将决定这款系统是继续保持巅峰状态还是从云端跌落凡尘。在我看来,在鸿蒙系统正式推送后,华为官方宣传的特性至少要有所体现,要真的能够给用户带来不同于iOS和安卓的体验,才能算得上这款系统初步成功。

二、关于鸿蒙是否套壳的争议

(一)鸿蒙的创新

关于什么是创新,引用一下任总2012年的讲话:

“关于自主创新的问题,自主创新就陷入嫡死里面,这是一个封闭系统。我们为什么要排外?我们能什么都做得比别人好吗?为什么一定要自主,自主就是封建的闭关自守,我们反对自主。第二,我们在创新的过程中强调只做我们有优势的部分,别的部分我们应该更多的加强开放与合作,只有这样我们才可能构建真正的战略力量。我们非常支持异军突起的,但要在公司的主航道上才好。我们一定要避免建立封闭系统。我们一定要建立一个开放的体系,特别是硬件体系更要开放。我们不开放就是死亡,如果我们不向美国人民学习他们的伟大,我们就永远战胜不了美国。”

对于鸿蒙和安卓其实两者有多方面的区别,比如:

1、安卓与鸿蒙手机操作系统基本都是基于Linux开发的,但两者的构架是不同的:

安卓系统是基于linux的宏内核设计:宏内核包含了操作系统绝大多数的功能和模块,而且这些功能和模块都具有最高的权限,只要一个模块出错,整个系统就会崩溃,这也是安卓系统容易崩溃的原因。好处就是系统开发难度低。(而现在,华为新研发的方舟编译器就是为了解决这个问题的,任何由编译器编译的android软件都可以直接与系统底层进行通信,鸿蒙系统加编译器将取代虚拟机。)Android是用Java语言编写的,很容易学习。但它有一个缺点:不能与系统底层直接进行通信活动,必须通过虚拟机来运行。说直接点就是虚拟机相当于传递者:首先Android应用程序安装在虚拟机上,然后从虚拟机传输到机器的底部,如果虚拟机出了问题话的那系统就是卡住。而且鸿蒙系统中的方舟编译器就是为了解决这个问题的,任何由编译器编译的android软件都可以直接与系统底层进行通信,鸿蒙系统加编译器将取代虚拟机。

 鸿蒙操作系统是微内核设计:微内核仅包括了操作系统必要的功能模块(任务管理、内存分配等)处在核心地位具有最高权限,其他模块不具有最高权限,也就是说其他模块出现问题,对于整个系统的运行是没有阻碍的。微内核的开发难度很大,但是系统的稳定性很高。根据目前华为公布的一些资料信息,我们可以推断出鸿蒙系统是用C、C++语言编写即直接使用机器语言编写app,取消安卓系统的ART虚拟机,直接编译为二进制机器码,这样做的好处就是不需要中转,执行速度快;但这样的操作也有一些缺点就是必须要有大量的静态方案且内存空间要求更高。

2、鸿蒙系统与安卓系统的使用范围不同:

安卓系统适用于手机,而鸿蒙系统对设备兼容性更强,同时支持智能手机、智能穿戴设备、电脑、电视等智能家居设备,形成一个无缝的、统一的操作系统,并且兼容所有的安卓应用,适应当下的5G和物联网时代。

3、安卓系统经过多年发展,软件生态非常完善,鸿蒙系统目前来说还谈不上生态。华为推出鸿蒙操作系统并不困难,相对于推出操作系统而言,更难的是如何聚拢开发者为这款操作系统持续开发各类优质应用,让这款操作系统得以具备真正价值,继而发展壮大,在系统开发商、硬件厂商、开发者与用户之间形成良性正循环。要让开发者为鸿蒙操作系统开发应用,需要的是实实在在的政策激励,利益引导,依靠情怀等是无法解决也是不可持续的,这就是华为推出鸿蒙系统之后需要解决的一大难题!

(二)下面再来谈谈代码复用与创新的关系

什么是代码复用?
在日常的编码过程中为了提高编码效率,和重复编码代码的低效,我们通常会选择将重复的代码提炼成可复用的代码。代码复用的形式可以是一个方法,可以是一套模板也可以是一个框架。我们联系一下华为的鸿蒙操作系统。

虽然目前华为鸿蒙OS系统开始开发者Bate版本,但依旧无法避免和谷歌的Android系统进行对比,从目前华为鸿蒙OS系统UI界面设计、操作使用方式、系统功能等方面,都和华为EMUl11(基于Android系统)没有什么区别,尤其是在应用生态方面,更是可以兼容安卓APK应用,几乎和和之前的安卓EMUI11系统没有任何区别,唯一区别或许就是在手机设置界面中,将EMUI换成了HamonyOS。

通俗点讲,就是华为鸿蒙OS系统之所以会和EMUlI11系统界面一模一样,也是因为华为EMUl11系统作为系统上层框架,原本就属于华为研发,而如今华为也只是将这个上层框架迁移到鸿蒙OS系统之中,等于就是将原来安卓底层+EMUI11系统上层框架的系统组合,变更为鸿蒙HarmonyOS+EMUl11系统上层框架的系统组合。

当然华为鸿蒙OS系统最大的亮点,就是它是一款全场景分布式操作系统,可以实现万物互联,让电视、手机、电脑、平板、电磁炉、冰箱、洗衣机等等,都可以轻松搭载鸿蒙OS系统,实现人机互联、万物互联,所以华为高管也明确表示,华为鸿蒙OS系统推出意义,并不是为了简单替代安卓,而是为了超越安卓系统,因为华为鸿蒙OS系统是一款全场景分布式操作系统,目前谷歌、苹果都还无法实现。

我们就非常公正客观地说两句:什么叫做新系统?作为一个全新的系统,你起码要让用户能感受到与别的系统之间的区别吧?就像10S和安卓,windows与mac0S以及Linux,大家只要一用,就能感受到它们之间的区别,甚至己经没人用的塞班和wP,都是有自己不同的操作逻辑和应用,这才叫不同的系统!你要是说搞了个全新的系统,操作逻辑跟现有的系统一模一样,应用还能装一样的,还美其名曰说为了让用户无缝兼容,你这样怎么能让人心服口服?本来就想体验你新系统的新鲜感,和与众不同的地方,结果一上手发现跟老安卓一模一样,说实话怎能让人不失望?

三、代码风格分析 

《代码整洁之道》一书的作者罗伯特曾经说过

“干净的代码既简单又直接。干净的代码读起来像写得很好的散文。简洁的代码永远不会掩盖设计者的意图,而是充满清晰的抽象和直接的控制线。” -罗伯特·马丁(Robert C. Martin)

1.

//错误的示范:
 for(let i = 0; i < 50; i++){
  //do something
 }
//正确的示范:
 let NUMBER_OF_STUDENTS= 50
 for(let i = 0; i < NUMBER_OF_STUDENTS; i++){
  //do something
 }

分析:很多程序员在实现功能的时候会分配一个没有明确意义的数字,用于特定的目的,写完这个数字后没有即使去做注释,然后过两天当程序出现问题时,翻看代码碰到这个数字,连自己都忘了它的意义。当程序需要固定的数值参与时,给予特定的名称。

2.

// 错误示范
 const array = [ [ ['Shoaib Mehedi'] ] ]
 array.forEach((firstArr) =>{
  firstArr.forEach((secondArr) => {
  secondArr.forEach((element) => {
  console.log(element);
  })
  })
 })

// 正确示范
 const array = [ [ ['Shoaib Mehedi'] ] ]
 const getValuesOfNestedArray = (element) => {
  if(Array.isArray(element)){
  return getValuesOfNestedArray(element[0])
  }
  return element
 }
 getValuesOfNestedArray(array)

分析:有些程序需要使用到无数次的嵌套循环,看着看着就晕了,这时可以将所有循环提取到单独的函数中。

假设有一个包含两层嵌套的数组,想要拿到最后一个数组的值?一般情况下开发者都会使用嵌套循环,但不是最佳的办法。可以尝试使用函数的反复调用来完成操作执行相同操作的,这样一来代码重复性更小,更易于阅读、重用性高。

3.

// 错误示范
 const addSub = (a,b) => {
  // add
  const addition = a+b
  // sub
  const sub = a-b
  // returning as a string
  return `${addition}${sub}`
 }
//正确示范
// add
 const add = (a,b) => {
  return a+b
 }
 // sub
 const sub = (a,b) => {
  return a-b
 }
分析:当一个函数或一个类需要实现的功能太多时,建议将其分成多个小的函数。

假设我们需要加减两个数字。我们可以用一个功能做到这一点。但是好的做法是将它们分为两部分。如果有单独的功能,则可以在整个应用程序中重复使用。

 

从长远来看,养成一种好的代码风格,对开发者的自身发展来说是百利而无一害的。每个项目的生命周期都很长,在很长的周期中谁也无法确定会用到之前的哪段代码,哪个功能。所以对现在的每一段代码负责,就是对以后的自己负责。

posted @ 2021-09-16 19:02  缄默不语ぃ  阅读(879)  评论(1编辑  收藏  举报