分享

工程师的工作实践:SOA 开发基础 (下)

 小毛HYL 2021-05-13
上篇中从我的理解向大家介绍了“什么是SOA”,下篇还是继续原本的打算,梳理一下做SOA开发(本篇指的是智能座舱中SOA开发)需要具备的领域知识体系

今天要做的梳理,没有思维导图,没有PDF,没有表格,是结合了我的实际经历和体会,总结得出的一些基础知识点,这是现阶段的这个我所了解的所认为的,随着时间的流逝,我又会经历更多一些,现在梳理的可能也会跟着改变一些。这种极其个性化的梳理,对我,是梳理(其实,写这篇比想象中艰辛,要不是前面给自己埋下了坑,都想放弃了~),对你,看看便好,就当是听我絮叨絮叨,侃侃大山,轻松愉快,真心不能提供什么参考。以下梳理分为四个维度:编程,架构,网络,工具

  • 编程:多看,多写,多折腾

目前,智能座舱的生态圈主要包括Android、Linux、QNX等操作系统,因此,我认为做SOA开发,至少需要熟练掌握C++和Java两种编程语言。C++是必须要会的,Linux/QNX主要用C++开发,Android其实也涉及C++开发,尤其是对性能要求较高的模块,通常会下沉到Native或HAL实现。Java也是必须要会的:第一,Android的App和Framework是用Java开发的,需要设计和开发SOA接口,提供给位于这两层的应用和服务使用;第二,设计SOA架构,要对系统各层级之间的接口如何设计和调用有足够的了解,代码都看不明白,怎么设计易用的接口;第三,写Demo是架构设计过程中重要的步骤,总不能你设计的方案等着别人写Demo验证吧,更重要的是,通过写Demo可以发现很多想法上的不足,设计文档写得不严谨的地方。

对于C++编程,要掌握的一些基础知识:

  1. 语法基础:构造,继承,虚函数,内联,多态,类型转换,STL容器,…;

  2. C++11新特性:时至今日,应该学会使用至少C++11常用的特性,比如:类型推导(auto,decltype),右值引用,智能指针,泛型/模板,type_taits,函数式编程(lambda),C++11多线程,future,promise,…,用它们使代码更简洁,改进代码质量,提升程序性能,不是为了炫技,而是用到实处;

  3. 应用开发:Linux/QNX网络编程、多线程编程、进程间通信等编程手法,常用实现如无锁,消息队列、线程池等,常见开源库的使用,选择感兴趣的如Libevent、Muduo等,深入学习其设计和实现;

  4. 项目开发:代码结构,接口封装方式,常用几种设计模式的实现(如单例模式、观察者模式等);

对于Java编程,要掌握的一些基础知识:

  1. 语法基础:包,类,接口,反射,泛型,异常,集合,注解,常用类,…;

  2. 并发编程:原子操作,Exexutor,线程池,阻塞队列,synchronized,锁,volatile,CompletableFuture,…,常见模型如Thread-Per-Message,CopyOnWrite,生产者-消费者,…;

  3. 应用开发:Java中的网络编程(JDK API),Android应用开发基础(四大组件,不研究UI,只要能整出个正常点儿的DemoApp就行~),Android进程间通信机制,AIDL、JNI和HIDL接口的设计和开发;

  4. 项目开发:常用代码结构,常用几种设计模式的实现(如工厂模式、代理模式、门面模式、观察者模式、策略模式等),注意,这里和前面C++说的都是实现,期望达到的水平:做到真正的理解,谈到某种设计模式,脑子里能够想到其适用的应用场景是什么,落实到代码上,一个大致思路是怎样的,反之亦然;在阅读一些开源项目时,能够看出用了什么设计模式,这样用的好处什么,不用可能会产生什么问题。

  • 架构:保持好奇心,平常心

架构和编程的不同之处在于,编程是容易看见结果和成效的,你写的代码有没有Bug很快能被证明,你写的模块扩展性和稳定性怎么样,经过一些时日,也能看出个一二。架构不是,有多少人能在短时间内落地几种架构方案的,更不用说评价架构设计得好不好了,就拿通信框架来说,很少听应用说满意当前的通信框架的,为什么扩展个接口这么麻烦,为什么不支持同步调用,为什么没有消息缓存,…,能被吐槽的点太多了。即使如此,我们还是要致力于做出好的架构,也许无法得到所有人的满意,但设计和开发出好的SOA架构,可以让系统中每一个应用和模块在交互通信与数据共享的问题上获得不错收益,反之,糟糕的SOA架构可能就是所有人必须面对的一场灾难。

在架构设计这件事上,我也是刚开始有一点点经历,以下所想完全没有参考价值。

  1. 设备:跳出单个模块的视野范围,尝试去了解这个通信系统里的每一个设备(可以是车机,仪表,T-Box,网关等等),他们的软件系统,他们的硬件,硬件之间的连接,他们的功能业务,他们的开发模式,他们的数据需求,他们以往采用过的通信方案,…;

  2. 车载以太网:了解相关知识,如:CAN,LIN,诊断,标定,CP,AP,…,重点关注整车以太网与智能座舱的对接,或者说智能座舱未来如何接入中央计算单元。至于最近很火的AP,没有计划作深入研究,从编程角度来说,基础是相通的,CP用的C,AP用的C++,很多东西并不是本身难度有多大,而是学习的资源和工具难以获得,人为形成了所谓的技术壁垒,个人开发者想要学习研究,几乎不可能搭建环境。我觉得开源是时代的进步,一定会是大势所趋,1202了,我们都要拥抱开源呀~;

  3. 系统:Linux/QNX系统调用(如输入/输出,存储,文件,网络,线程,进程间),Android系统架构,座舱的整体架构,模块的架构,比如,车机中Android原生模块(如BT,WiFi,Audio,Location,…)的数据源有什么不同,车机中这些基础模块都是怎么适配的,车机中较复杂的APP如导航、语音等的架构是什么样的。不要觉得别人负责的模块我了解了干嘛,说白了,SOA就是模块与模块之间的交互,对每个模块了解一下一定是有益的;

  4. 中间件:基于几种通信模型(可参考DDS 介绍)的中间件框架,RPC技术的原理和实现,各种开源RPC框架:grpc,brpc,srpc,…,各种中间件架构方案:GENIVI,ROS2,…,如何技术选型,如何验证可行性,如何做性能评估;

  5. 设计原则:SOLID,KISS,迪米特,…,结合具体业务的前提下追求原则,知易行难,没有定式,如何做出正确的决策,需要在实践中不断思考和总结;

  6. 沟通表达:面向不同受众的架构视图,SOA是需要传播的,“咱们用TCP通信”和“咱们用SOMEIP通信”,对于不熟悉SOMEIP的小伙伴来说,是两码事。正确地传达架构的设计,高效地沟通和解决过程中的冲突,清晰地表述技术实现的细节,画的UML要能指导开发,尽可能说经过验证的结论,即便是预估的,也要有一些数据作为依据,不要说出诸如“应该没问题”这样的结论;

  7. 项目+产品:做架构设计,可以是一个人的事,但架构的落地,是需要一群人一起完成的,能否保质保量完成不是项目经理该去操心的事吗?我觉得并不是,能否落地也是架构设计中可以考虑的一个视角,适当了解一些项目管理和产品思维的知识,会使你能更好地理解这个世界,理解一个项目的运作,理解一个产品从无到有所要经历的过程,理解架构不止是一个技术问题,这些都会帮助你设计一个好的架构。

  • 网络:实践出真知,重视细节

如果说架构是宏观,那么网络通信的设计和开发,是件要扣细节的事儿。不要想当然,不要把网络状况想得过于理想,不要把服务端想得过于强大,不要对任何错误掉以轻心,试图找到每个错误背后的根源,解决的过程就是一次收获。
  1. 网络基础:OSI,TCP/IP,五层协议,各层作用和常见协议;

  2. 开发基础:TCP和UDP建立连接的流程,阻塞与非阻塞Socket API,同步与异步,IO多路复用,epoll的水平触发与边缘触发;

  3. 通信协议:SOME/IP,DDS,HTTP/RESTful,SSL/TLS,MQTT,对于SOME/IP和DDS,准备死磕:协议标准,开源项目的应用,源码剖析,二次开发,封装接口;多媒体传输:AVB,RTP/RTCP/RTSP/RTMP;

  4. 序列化:JSON,Protobuf,Franca IDL,MsgPack,…,各自优缺点、性能效率、适用场景、开源库选型;

  5. 细节:私有通信协议如何设计,如何解决粘包和分片;心跳机制如何设计;收发缓冲区如何设计;如何优雅地关闭连接;断线重连机制如何设计;流量控制如何设计;…;

  6. 实践:分析当前网络连接状态;定位通信链路中出错位置,分析其出错原因;抓包,分析数据包;如何设计Benchmark,测试和分析通信架构的各项指标如传输时延、CPU占用、内存消耗、负载压力等;

  • 工具:发现,尝试,积累

写工具,会让人觉得很Low吧,实际上,很多人低估了学会使用工具的重要性。为什么别人花一小时搭建实验环境,而你要一天?为什么别人花半小时定位问题改好代码,而你要一周?为什么别人花半天完成了某个第三方库的平台移植,而你要花几天,甚至搞不定?…?其实不是别人有多厉害,而是你不善于运用各种工具去解决问题,也没有注重积累,举个栗子:一次重装Ubuntu系统时遇到某个问题,查了好几篇CSDN文章,总算给搞定了,可什么都没记下,下次再重装时,又遇到同样的问题,这个问题我好像碰到过!然后,就没有然后了,如果那篇之前帮到你的文章还找不到了,…,总在这样又那样的事情上,浪费了太多的精力和时间,这些时间原本可以用来做更多有价值的事情啊~
  1. 开发:VSCode,IDEA,Android Studio;

  2. 构建:Shell,CMake,Gradle,Maven;

  3. 调试(测试):GDB,UT框架,静态代码检测,内存泄漏检测,tcpdump,Wireshark,MQTT X,JMeter,Docker;

  4. 文档:Markdown,PPT,Excel,笔记,Visio,EA,draw.io,录屏,…,;

  5. 自动化:一直觉得SOA开发工具是值得研究的,比如API文档自动生成工具、API代码自动生成工具、回环测试工具等(在互联网领域已经有一些类似的工具,看过几个开源的,比如ShowDoc,感觉都不太能用到汽车领域,有好用的欢迎推荐啊~);

终于,写完了,好多没有写进来,比如算法与数据结构、JVM、Linux内核、数据库等,当然不是说它们不重要。但对现阶段的我来说,上面列的这些已经很够我学的了,能把这些搞透彻,我已经非常非常满足了。术业有专攻,先把能做好的事做到最好,不是每个人都能成为技术大牛,也不是每个人的目标都是要成为技术大牛吧,人生的路长着呢,以后的事以后再想好了。有句话不是很扎心么,“以大部分人的努力程度,根本还轮不上拼天赋”,有时候只是态度就足够拉开差距了。

后面公众号的文章,基本会围绕今天梳理的这些,也算是明确了一下范围吧,感谢大家的关注,然而,收藏远比点赞多是什么情况图片,希望不是Mark不看系列哈~

图片

声明:本文内容及图片由BC-AUTO转载至网络,信息来源于公众号拖拉机日记。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多