我们都是调包侠

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

应用层

在应用层的角度看,比如 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 学了也是白学,这就是说,对一些底层的了解,可以让我们看出什么该学、什么不该学、学它需要具备什么样的背景知识!

相关文章
|
数据采集 算法 数据可视化
数据分析入门系列教程-决策树实战
数据分析入门系列教程-决策树实战
283 0
QT QTreeWidget 实现模糊查询和多选的勾选状态
#QT QTreeWidget 实现模糊查询和勾选状态 本文的主要代码基本都是总结2篇博客实现了模糊查询模糊查询和勾选状态QTreeWidget实现勾选基本上所有的操作都是递归操作,个人测试了性能,如果1w项左右的数据时,没啥问题,如果有几w,那么勾选所有的,效率很慢,需要几秒钟,大家可以测试,不废话了,直接上代码:如果有啥不懂的,可以在留言,会很详细的给出解释的
554 0
|
JSON 算法 开发工具
拒绝臃肿,一个文件搞定 C# 调用阿里云短信服务发送短信
短信发送是软件开发中的一个常见功能,在国内常用于基于短信验证码的用户注册、找回密码和操作授权等场景。阿里云的短信服务在调用时需要实现一个不是那么容易的签名算法,但如果只是为了发送短信这一个功能就去引用其提供的 SDK 显得非常不经济。
1778 1
|
9月前
|
敏捷开发 人工智能 数据可视化
从方法到工具:一文教会你用GTD工作法高效管理时间
在知识经济时代,GTD(Getting Things Done)时间管理理念成为提升效率的核心方法。本文深度解析GTD五步法(收集、处理、组织、回顾、执行),并测评7款主流工具(OmniFocus、Notion、板栗看板等),针对个人、中小团队及企业级用户需求提供选型建议。通过方法论与工具结合,助力实现高效任务管理与目标达成。
|
12月前
|
机器学习/深度学习 运维 自然语言处理
深度学习+实时监控:运维不再靠“拍脑袋”!
深度学习+实时监控:运维不再靠“拍脑袋”!
488 3
|
设计模式 网络协议 Java
02.单一职责原则详解
单一职责原则(SRP)是面向对象设计的重要原则,强调一个类或模块应仅负责完成一个特定的职责或功能。通过将复杂的功能分解为多个粒度小、功能单一的类,可以提高系统的灵活性、可维护性和可扩展性。本文详细介绍了如何理解单一职责原则,包括方法、接口和类层面的应用,并通过具体例子解释了其优势和判断标准。此外,还探讨了在实际开发中如何平衡类的设计,避免过度拆分导致的复杂性增加。
512 5
|
存储 缓存 算法
python性能问题(Performance Issues)
【7月更文挑战第19天】
397 5
python性能问题(Performance Issues)
|
定位技术 数据库
EndNote导入文献引用后无法显示期刊名称的解决办法
EndNote导入文献引用后无法显示期刊名称的解决办法
1190 1
|
关系型数据库 MySQL 数据库
ClickHouse(07)ClickHouse数据库引擎解析
ClickHouse支持多种数据库引擎,包括Atomic(默认)、MySQL、MaterializeMySQL、Lazy、PostgreSQL、MaterializedPostgreSQL。Atomic提供非阻塞的表操作和原子的表交换,有UUID标识和延迟删除功能。MySQL引擎允许与远程MySQL服务器交互,支持INSERT和SELECT,不支持RENAME操作。PostgreSQL引擎类似,可与远程PostgreSQL服务进行读写操作。SQLite引擎用于连接SQLite数据库。实验性引擎如MaterializeMySQL和MaterializedPostgreSQL用于实现实时数据同步。
1217 5
|
Linux 网络安全
linux防火墙开放指定端口命令
linux防火墙开放指定端口命令
1241 0

热门文章

最新文章