草庐IT

许北林:我为什么加入OpenHarmony生态?又为什么要做“启航KP”开发套件?

openharmony 2023-03-28 原文
许北林
软通动力
资深项目经理

 

在全球开源趋势下,中国正逐渐成为全球开源软件的主要使用者和核心贡献者。今天我们来认识一位接触 OpenHarmony 不到一年,便带领团队成功开发出一款“启航 KP“智能开发套件的开发者——软通动力资深项目经理许北林


作为软通动力硬件团队负责人,许北林负责团队整体技术规划、项目看护、成果交付以及部门、成员的协调沟通。在工作中,许北林积极推进 OpenHarmony 解决方案,同时推进 OpenHarmony 开发板的开源事宜,特别是推动硬件开源以及硬件设计指南,做到“软硬兼施”。


接下来,让我们和许北林一起聊一聊关于他加入 OpenHarmony 生态的初心、对 OpenHarmony 的看法、在开源项目中遇到的困难和收获,以及开源过程中的心得体会等话题。

 

 

Q=OpenHarmony A=许北林


Q1:首先非常开心许老师能接受我们的访谈,请您给我们简单地介绍下自己和所在的团队


大家好,我是许北林,是软通动力创新中心硬件开发团队的项目经理。团队主要负责打造业务硬件底座,由硬件对接、硬件技术支持、硬件设计、固件开发组成,对外支持客户顺利对接华为生态,对内建立软通硬件生态。我是 2021 年初正式接触 OpenHarmony 开源项目,希望能够为开源生态做出一些贡献。


 

Q2:那是什么原因促使您和您的团队加入OpenHarmony生态、参与开源共建呢?您认为,OpenHarmony项目最吸引人的点在哪里?


如今,开源在各行业的应用逐渐加深,开源软件也成为各行业信息系统的重要组成。我一直觉得,和这个世界交互、分享越多,就会有更多的可能性。

 

从开发者角度来讲,我们不只是现成开源项目的使用者和消费者,更可以是创作者和贡献者。OpenHarmony 是面向万物互联的下一代操作系统, 使用了先进的分布式架构,对开发者非常友好,开发效率也非常高。

 

加入 OpenHarmony 生态,从自身来讲,可以提升自身能力;从企业来讲,可以壮大公司实力;再往大讲,可以助力国家的发展。在开源的路上,只有通过共商、共建、共享,才能实现共赢,惠及每一个热爱并热心开源事业的组织与个人。

 

Q3:有了解到您和您的团队开发了一个OpenHarmony的“启航KP”开发套件项目,可以给大家简单介绍下吗?


做这个项目最开始,是打算自研一款软通自己的认证模组,让厂商的模组选择面更加宽广,打开软通的硬件局面。有了核心模组,我们就同步开发了 OpenHarmony 开发板。

 

这里所说的开发板就是“启航 KP”开发套件,这块开发板搭载了 OpenHarmony 开源操作系统。因为拥有灵活的模块化拓展能力和组网能力,可以适用丰富多样的应用场景,比如汽车、能源等工业和消费领域。

 

此外,“启航 KP”智能开发套件也已经上架华为开发者联盟生态市场。软通 WiFi Harmony Connect 模组作为软通“启航 KP”开发板核心,提供主控能力,已经成功助力“启航 KP”开发板参加被誉为“中国科技第一展”的高交会及第二届操作系统产业峰会,收获了广泛的关注。另外,产品和相关材料也将被软通教育 OpenHarmony 教师培训收录。作为项目的主导成员之一,我感到非常的自豪。

 

Q4:在整个开发进程中,您和团队遇到的最大的困难和最大的收获是什么呢?


最大的收获是和团队一起,克服重重困难,成功完成了“启航 KP”开发套件这个项目。这块开发板运用了自研 3861 模组作为核心驱动,并将开发板包含核心板在内的 12 个模块的代码与原理图全部开源,为 OpenHarmony 推广做贡献。

 

现在回想起整个开发的过程,心里感触颇丰。平均年龄二十来岁的我们都是第一次做开源项目,最开始,每一个人都很兴奋,很多人是第一次实打实地做开发套件,同时也能够为公司实现 0 的突破。但是,现实首先狠狠地给了我们一巴掌。

 

在研发过程中,我们逐渐发现自身经验的不足,有点无从下手。但是整个团队坚持主动思考,主动学习,甚至在我们吃饭的时候,团队的小伙伴都在思考讨论项目的事情,有时候灵机一现,就赶紧扒拉扒拉饭,冲上楼去敲键盘。虽然这个过程充满挑战和艰辛,但是我觉得这个过程非常宝贵,整个团队都学到了很多东西,并且这种成就感太棒啦!

 

说到困难,在射频技术方面,没有外部技术支撑,又没有相关技术积累,确实给我们的研发带来了一定的难度。但是面对这些困难,我们一边摸索一边前进,并总结了自己的一套方法论。

 

首先,我们要完成 3861WiFi 模组天线外的电路布局,再将实际数据导入 HFSS 软件进行 2.4G 射频仿真,这个包括:电路板尺寸、材质、叠层数据;之后根据仿真结果反复调整匹配电路参数和天线尺寸,为了调整到最合适参数,这个过程真的是反复了很多次。

 

让我最有感触的是,虽然组里一个个都是成天穿着打扮都不太讲究的小伙子,没想到工作起来都这么细心又这么有耐心,遇到困难就查资料、细心询问、认真聆听与提问,在大家的不懈努力下,终于得到在指定带宽内合格的 S11 参数。但是在按照仿真结果进行天线设计的时候,我们没有这个技术经验积累,反复联调近 2 个月的时间,尝试了很多次,也失败了很多次,团队成员就一起组会,一起啃技术文档,一起加班探讨更完善的方案,通过打样后用网络分析仪进行实际测试,再根据结果再次调整匹配电路和天线线长。

 

功夫不负有心人,我们成功攻克了射频技术的难关,这也提高了团队小伙伴们的信心。同时,授人以鱼不如授人以渔,为了帮助后续的小伙伴们研发更加顺利,硬件开发组把整个开发板的硬件 + 固件的技术文档也一并作为教程输出,希望对别人有所帮助。

 

 

Q5:能开发出这么一个优秀的产品,您和您的团队一定付出了很多。可以请许老师给我们分享一下,开发这个产品的整个过程,有什么记忆深刻的经历吗?


我们这个项目是一个 OpenHarmony 开源项目,对于我们来讲,是一个正式加入 OpenHarmony 大家庭的一个机会,同时也是一个挑战。在这个过程中,每一个成员都付出了很多心血。

 

记得有一次,刚好是周五,临近下班的时候遇到了一个技术难题,好像是有默契一样,谁也没说要走,我立刻发起提议:进会议室讨论个明白,大家二话不说都进了会议室。当大家争执得面红耳赤时,有个同事的电话响了,他外地的女朋友刚赶来找他过周末,我们说让他先回去,但他和女友短暂聊了几句后,放下电话毅然决然地和我们一起继续讨论问题。通过将近 2 个小时的争论,和后续的不断的调整代码和实验,我们终于在 12 点解决了问题。解决问题后,突然听到谁的肚子叫了下,原来大家忙到都忘记了吃晚饭。

 

现在讲起来,这种情形实在太多了,为了解决问题,我们可以加班,可以争执,可以各抒己见,但私底下又是一群非常要好的朋友。能够和这样一群可爱又敬业的伙伴们一起,是我的荣幸,也让我深刻体会到了团队的重要性,一个程序员的责任心不止是对自己的代码负责,更是与团队共进退,对自己团队的负责。

 

 

Q6:在开发项目的过程中,您对OpenHarmony的感触一定特别深。您最想吐槽OpenHarmony哪些方面?或者期待未来OpenHarmony哪些方面能够得到改善、提供更多支持呢?


OpenHarmony 系统很庞大,但是目前也比较基础,我们应该着眼于 OpenHarmony 的优势,如在分布式的交互方式,如物联网上的应用。

 

当然,也希望 OpenHarmony 能够组织更多的交流会,给开发者多提供一些平台,释放更多的教学内容,大家一起共建 OpenHarmony 生态。


Q7:OpenHarmony目前仍处在开发探索阶段,很多共建单位和生态伙伴还不清楚开源项目的玩法,或不知该如何着手进行开发。可以请许老师给大家分享一条,您认为最重要或最值得分享的心得吗?


最好的办法,就是跟着我们的开源资料,从搭建环境开始学习。我们的开源开发板,全套资料都进行了开发,并有声情并茂的视频讲解。当然,关键点,还是学习者应该亲自完成例程的代码编写,并举一反三,完成学习例程的同时进行自己项目的自研扩展。大家一起共建共享,也一起完善这份开源事业。


Q8:采访的最后,许老师还有什么话特别想分享的吗?


有些事不是看到了希望才去坚持,而是因为坚持了才会看到希望。仰望星空,不如躬身入局,欢迎大家加入 OpenHarmony 生态大家庭。

 

 

有关许北林:我为什么加入OpenHarmony生态?又为什么要做“启航KP”开发套件?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  6. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  7. ruby - 如何离开加入Arel? - 2

    Arel3.0.2提供了两个类来指定连接类型:Arel::Nodes::InnerJoin和Arel::Nodes::OuterJoin并使用InnerJoin默认。foo=Arel::Table.new('foo')bar=Arel::Table.new('bar')foo.join(bar,Arel::Nodes::InnerJoin)#innerfoo.join(bar,Arel::Nodes::OuterJoin)#outerfoo.join(bar,???)#left如果要生成左连接,如何连接两个表? 最佳答案 你可以使用

  8. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  9. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  10. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

随机推荐