4

前几天让我震惊的是,我对我希望我的软件运行的硬件几乎一无所知。我已经做了大约 5 年的开发人员,但自从我离开大学后,我就没有研究过硬件理论/设计。我什至不再制造我自己的机器了,因为说实话,我宁愿多花几块钱,让 Comp Sci 退出来为我制造它。

虽然很好地理解底层发生的事情的基础知识显然很重要,但它离我们如此遥远,作为开发人员,我们真的不需要关心复杂的Programmed I/Oor Memory-Mapped I/Oetc,..

还是我们?

请注意,我在这里谈论的是您的日常 LOB 开发人员,而不是专门的裸机人员。

所以,定义“平均”你将如何,但总体而言,一个称职的程序员应该能够潜入多深?

4

5 回答 5

9

这取决于你的开发水平有多高。

  1. 如果您为嵌入式系统开发,这意味着大量的硬件知识(接近 EE 级别)。
    • 如果您在某些专业领域,例如游戏的低级 3D 图形编程,您应该了解特定显卡的来龙去脉。
    • 如果您正在做 Web 或桌面应用程序,可能不会那么多。

但在所有开发中,您可能应该了解基础知识。例如,

  1. 冯诺依曼架构的瓶颈在哪里。
    • CPU 缓存如何工作(在多线程中很重要)。
    • 单处理器多处理器 CPU 上的操作系统调度将如何不同(同样,在多线程中很重要)。
    • IO 的工作方式以及写入文件的原因并不一定意味着您的数据会立即持久化。
    • IO 有多慢以及为什么大多数数据库应用程序都是 IO 绑定的。
    • 为什么网络比 IO 更慢、更不可靠(无线网络更是如此)。

另一方面,我不认为了解内存映射 IO 是什么等细节,或者了解 NAND 和 NOR 闪存之间的区别对于普通*(桌面/Web)开发人员来说真的很重要。甚至现代 CPU 架构的知识本身也可能成为一门科学,看看它们在过去几年里变得多么复杂,更不用说现代编译器发出的代码变得越来越难以预测(文章链接表明现在在低级优化上比编译器更难)。就像几十年前做汽车修理工一样容易,今天没有多少人会尝试自己修理汽车。

**“平均”的定义可能有所不同。*

于 2009-12-07T10:19:55.087 回答
3

在对底层硬件一无所知的情况下,当然可以过关。然而,即使稍微了解一下缓存是如何工作的,以及在您的特定目标机器上哪些操作是快/慢的,都将有助于您在设计软件时做出更好的设计决策。

就我个人而言,我认为知道我每天工作至少 10 个小时的机器是如何让我感到非常满意的;)

然后又为什么要满足于平均水平?

于 2009-12-07T10:23:40.960 回答
3

我发现能够理解编译器发出的汇编语言(在我的例子中是 C++)非常有用。这在考虑优化等问题和解决困难的调试问题时非常有用。

于 2009-12-07T10:28:11.107 回答
2

在许多情况下,您不知道您的程序将在哪个硬件上运行,因此过多关注一台机器的某些特定细节是没有意义的。用户可能会在某些 64 位 RISC 硬件上的虚拟机中运行您的 Win32 可执行文件,谁知道呢。除非您明确了解目标硬件,否则最好使用操作系统和标准库为您提供的抽象,并按预期使用它们。相信构建操作系统、编译器和库的人能够正确地完成他们的工作。

于 2009-12-07T10:37:38.250 回答
1

操作系统开发人员在抽象底层物理世界方面做得很好。它们的目的是为普通开发人员提供许多硬件的通用接口,以便他可以专注于其应用程序并开发可移植、更易于维护并能够在操作系统更新上获得优化的代码。

所以对于一个做普通应用的普通开发者来说,我认为最好不要问太多关于硬件的问题。

于 2009-12-07T10:38:59.370 回答