軟件工程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
 }
分析:當一個函數或一個類需要實現的功能太多時,建議將其分成多個小的函數。

假設我們需要加減兩個數字。我們可以用一個功能做到這一點。但是好的做法是將它們分為兩部分。如果有單獨的功能,則可以在整個應用程序中重復使用。

 

從長遠來看,養成一種好的代碼風格,對開發者的自身發展來說是百利而無一害的。每個項目的生命周期都很長,在很長的周期中誰也無法確定會用到之前的哪段代碼,哪個功能。所以對現在的每一段代碼負責,就是對以后的自己負責。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM