我们都是调包侠

简介: 这篇内容讨论了从应用层到硬件层的编程工作,指出每个层次的程序员都是“调包侠”,即通过调用不同层次的接口来完成任务。应用层开发者使用高级语言控制设备,无需深入硬件细节。低级编程语言用于高性能需求,仍依赖操作系统。系统编程涉及硬件接口,需要了解硬件特性。硬件层面则涉及逻辑门电路设计与制造,需要考虑多种因素如性能、功耗和兼容性。文章强调各层次间的相互依赖,并提倡明确软件的局限性,选择细分方向,避免盲目跟风学习。

应用层

在应用层的角度看,比如 JavaScript(Typescript、Node.js) 开发、Java 开发、Android 应用开发等等,利用高级编程语言来控制计算机(嵌入式)设备,根本无需关注操作系统、硬件部分,除非是性能优化可能需要关注操作系统的一些细节,但硬件是完完全全不需要考虑的。大多数时候我们是利用高级编程语言以及这些高级编程语言提供的运行时API或机器指令,以及操作系统的接口,来完成对计算机(嵌入式)的控制,站在这个角度看,程序员就是调包侠。

低级编程语言层

在低级编程语言的角度看,例如高性能程序,比如数据库系统、编译系统、视频解码程序等等,他们对性能的要求很高,但依然是基于操作系统之上,调用操作系统的接口,无非是性能要求的高,那它也是调包侠,调用操作系统的接口。

系统编程层

在系统级编程的角度看,比如操作系统开发,它需要知道一些硬件的细节了,但不是电气特性,而且接口特性,比如CPU控制一个外部设备,写入知道这个设备I/O接口的数据端口(数据寄存器)、状态寄存器(状态端口)、控制端口(控制寄存器)这些寄存器对应在内存地址空间的地址(这属于硬件信息,一般是固定的,在电路板设计时由硬件工程师设计),在这个角度之上,操作系统的开发那也是调包侠,它调用硬件的接口,完成对硬件的驱动,驱使电位改变,从而引起外部设备的工作。

硬件层

在硬件层面的角度看,它是由很多很多个逻辑门电路、或者CMOS管连接而成的,它也是调包侠,这些逻辑门,CMOS管不都是别人封装好的吗?

然而在硬件层面,实现硬件设备需要考虑的因素和面临的挑战有很多,以下是一些主要的:

设计和优化:硬件设计需要考虑很多因素,包括但不限于性能、功耗、成本、可靠性和安全性。这些因素之间往往存在着相互竞争的关系,比如提高性能可能会增加功耗和成本,提高安全性可能会降低性能。因此,硬件工程师需要在这些因素之间找到一个平衡点。

制造过程:硬件设备的制造过程非常复杂,需要精确的控制和高度的技术。任何微小的错误都可能导致设备无法正常工作。此外,随着技术的发展,硬件设备的尺寸越来越小,这对制造过程提出了更高的要求。

测试和验证:硬件设备需要经过严格的测试和验证,以确保它们在各种条件下都能正常工作。这包括在极端的温度、湿度、电压等条件下进行测试。这个过程既耗时又耗费资源。

兼容性:硬件设备需要与各种其他设备和软件兼容。这需要硬件工程师对各种标准和协议有深入的理解。 可持续性和环保:随着环保意识的提高,硬件设备的设计和制造也需要考虑其对环境的影响。这包括使用环保的材料,减少能源消耗,以及设备的回收和处理。

总结

所以啊,无论在那个层面,它都是“调包侠”,都是分工模式,相互依赖的。

所以啊,不要再反感“调包侠”;

所以啊,不要在认为低级编程语言,比如:C/C++、Rust,就比 JavaScript、Java 高出一等;

所以啊,不要认为系统开发人员,比如开发操作系统的工程师,或者开发驱动程序的工程师,就比应用层的工程师高级、高人一等。

目的

这篇文章目的是希望软件程序员能够清晰地认识到软件的局限性、确定自己的细分方向、不再陷入漫无目的地学习(内卷)

1)局限性:

经过上述内容的铺垫,在应用层比如WEB前端,你可能会觉得写业务都是调包侠?而写组件库、框架的才是高人一等?这种观点我觉得是“以五十步,笑百步”,如果是这样我觉得是错误的,因为都是调包侠,针对WEB端而言,业务侧和组件库或者是框架侧,他们不同的是需要一些背景知识的铺垫。例如 React.js 这个UI库,它是负责接管UI渲染的,是运行在浏览器中的,那么比如要掌握浏览器的渲染原理(不是让你阅读Chromne开源项目的源代码),这样才能清楚 React.js 怎么写才能让 UI 渲染不卡顿。

放眼到软件领域中,都是如此,比如嵌入式软件等等,都是对门槛的要求不同罢了,当然也不要小看这些门槛了,有些门槛需要的时间长,有些门槛需要的时间短。就比如嵌入式领域,他们会需要硬件方面的背景知识,如果是纯软件领域的要进入嵌入式,则是有困难的,这是事实的一部分。

2)细分方向

基于现代社会的分工化,我们不可能把所有的东西都弄懂!那我们怎么办? 我觉得是以下这些:

  • 掌握共性:程序员都属于软件领域,软件领域重点就是数据+算法,故此要掌握最基本的《数据结构与算法》;另外软件是工作在硬件之上,可能要手动利用软件来驱动硬件工作,因此就免不了要理解计算机(机器)的逻辑结构(注意,这里说的是硬件的逻辑结构,而非物理结构)那么《计算机组成原理》或者是《计算机体系结构》这些就是基础中的基础了,这是理论,如果想实践,最好是利用原理知识,实现一个CPU与一个I/O总线,这样才算是对软件控制硬件信手拈来。
  • 持续学习:基础的共性知识(数据结构与算法、计算机组成原理等)是在打地基,可以让我们更顺利,快速地进入到其他软件领域中。例如:1)数据库系统开发:数据库本质就是负责管理数据,那么肯定要快啊,对吧?那是不是要对计算机的硬件(硬盘、内存、CPU)的逻辑结构有所了解?最基本的就是他们的速度差异; 另外就是数据结构以及对应算法的折中选择。 有了这些基础的,进入到具体的行业中,还需要进行领域内的学习,但我相信,不会难,毕竟本质都是一样的。

3)不再跟风、漫无目的地学习

前段时间看到一个WEB前端群,在无脑追风 Rust 编程语言,我觉得有点可笑。Rust 编程语言是为系统级编程语言而诞生的,这就不可避免地要具备一些底层相关的背景知识了,如果没有这部分背景知识,学 Rust 那仅仅是学了个语法,我觉得毫无用处。Rust在WEB前端领域还是有不少魅力的,最主流的用途是,打造“高性能Node.js”,为前端的脚手架、工具链提供性能方面的优化。如果对《数据结构与算法》、《操作系统》、《计算机组成原理》有一点了解的话,我绝对 Rust 学了也是白学,这就是说,对一些底层的了解,可以让我们看出什么该学、什么不该学、学它需要具备什么样的背景知识!

相关文章
|
10月前
守望者的逃离
守望者的逃离
53 0
小猴打架
题目描述 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友。每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友。经过N-1次打架之后,整个森林的小猴都会成为好朋友。 现在的问题是,总共有多少种不同的打架过程。
132 0
小猴打架
|
算法 机器人 大数据
特技替身拜拜,迪士尼机器超人要上天了!
不管是电影中的特技、还是迪士尼乐园中的高难度杂技表演,迪士尼对高空特技表演一直有大量需求。最近,迪士尼AI研究中心正尝试让机器人完成这一高危工作。
1287 0
|
新零售
问马云:6个最犀利的问题
这几天,马老师很忙。他从乌镇去了上海,又马不停蹄地去了广州,出席了“广州2017财富全球论坛”。 这个论坛,主持人和观众连番发问,比如“阿里巴巴最大的竞争对手是谁?”、“如何保证阿里巴巴不消失?” 我们选择了六个最犀利的问题。请看看,面对这些问题,马老师是怎么回答的。
3447 0
|
SQL 数据库 索引
|
Java C++
做决定,怎能让“自己”缺席
【来信】   贺老师,您好,我在一次有目的的搜索中发现了您给大二软件工程学生解答的问题。仔细阅读后,决定写信给您。
1385 0