软件工程师真的需要不再了解低级知识吗?[关闭]


23

随着诸如C#,Java等高级编程语言的发展,许多人声称它们将成为汇编语言和C / C ++之类的语言的替代品,这使您可以访问和控制计算机硬件,因为程序员应该专注于创建程序并解决问题,而不是浪费时间与计算机打交道,以使其正常运行。随着硬件的不断改进,C / C ++与Java之间的性能差异将不会很大,并且大型游戏可能可以使用Java之类的语言进行编程。

这是我在Internet上查看此主题后简要概述的一般想法。您认为在不久的将来它将成为现实吗?这是否意味着我们从低级知识中学到的一切对软件行业来说都不实用了?这是否意味着汇编语言和C / C ++仅与电气工程师相关,因为它们将是唯一需要为其电气组件编程的人?


多少学习就足够了?如果我们学习了太多的低级课程,那么我们最终将变得更加专注于电气工程,或者如果我们学习了太多的数学,那么我们可能正在学习成为数学家,而不是程序员。我只是想知道我学到的数学知识(我上了一门数学课程,涵盖了与本书相似的材料(它们使用不同的教科书):离散数学及其应用)是否真的像我们的编程技能一样有用。许多数学练习可能要花费我们大多数时间才能完成,并且如果您认真对待它,则可以减少学习编程的时间。在我们的gamedev论坛中,甚至数学和物理也只有一个部分,与编程相比。

现在,我刚刚开始阅读“计算机编程的艺术”。数学仅覆盖本书的四分之一左右,但是对于我们非数学家来说,练习很难。即使是这样的“基础”数学,我们在职业生涯中是否也经常使用它?有些人可能会告诉我阅读TACOP这本书是浪费时间,并且可能应该花时间在其他更实际的事情上,即使这本书是关于编程的(与本书相比,在学术上也有更多的解释类似的事情)。但是我认为作者投入了大量时间和精力来制作它。他甚至可以写五本书的全部,而我们(观众)只有看书的使命。为什么不?


1
“ C / C ++与Java之间的性能不会很重要”。如果这种情况很快发生,请给我发PM来修改我的Java技能。由于这些原因,几年前我已经停止使用Java。
sakisk 2011年

3
大多数C / C ++代码不访问硬件。它很容易,但是通常被设备驱动程序隐藏。我什至敢说95%以上的C或C ++代码从不直接与硬件交互。
Pemdas 2011年

1
我建议将标题更改为低级语言。即使不了解C ++或汇编语言,仍有很多低级的东西(线程如何工作..操作系统如何工作..等等)仍然有价值。
ShaneC 2011年

2
@faif,对于长时间运行的应用程序,Java应用程序可以与C / C ++应用程序保持同步。 之后 Java已经回暖。这是由于热点技术会随着时间的推移将Java代码重新编译为本机代码。但是,对于运行时间短的应用程序,Java的启动时间仍然令人恐惧。在某些时候,尤其是对于服务器应用程序,通信比实际处理更是您的瓶颈。
Berin Loritsch

1
@BerinLoritsch Java是相对较快的,是的,但是与只是在操作系统上运行的低级程序。并不是全部都以相同的数量级执行指令。

Answers:


18

有趣的问题。我是一位长期使用C ++的程序员,现在正在C#中工作(对于性能至关重要的工作有一些非托管C ++),并且从历史上讲,出于性能原因,不得不偶尔添加一些汇编代码。

准备对问题的回答时需要注意以下几点:

  • 为了便于比较,我建议您提到的C#和Java语言与其他语言(汇编语言C / C ++)之间的主要区别是,前者使用托管运行时提供垃圾收集。还有其他差异(例如,二进制可移植性,框架大小和可移植性),但是当您要比较性能差异时,这是一个主要贡献者。

  • 汇编,C和C ++远非同等的“低级”。我认为将汇编语言和C语言与硬件/固件/驱动程序开发人员联系在一起是正确的,但是C ++通常用于更高的层,并且仍在大量使用 -尽管根据TIOBE显然C#/ Java正在将其淘汰指数。

  • 在C ++层中,我将添加Objective-C,因为它比C#/ Java更类似于C ++。最后,我要指出,除了shared_ptr <>和其他自动资源管理功能之外,这些语言还支持接近垃圾回收的功能。

OK-关于您的主要问题: 软件工程师真的需要不再需要一些低级的知识吗?

我的答案: 是的

原因:

  • 即使使用C#/ Java,您也可能会遇到需要显式资源管理的框架实体,并且/或者遇到任何非平凡应用程序上的“固定”内存图问题。您需要了解这些系统如何工作才能有效避免和调试这些问题。
  • 移动平台的资源有限,尽管某些平台支持Java和.NET的受限版本,但iOS和Objective-C当前的主导地位表明该平台的使用寿命很长。
  • 性能:每次遇到性能障碍时,您都可能需要放入本机编译的代码块中以解决该问题。
  • 旧版支持:每当需要互操作以访问尚未在托管代码中公开(尚未)的功能时,都需要执行相同的操作。

很好的问题-但我认为短期内不会消失非托管语言。


感谢您的回复。我将继续在计算机基础上进行更多的研究(例如OS,网络,更多的Math ...也足以理解基本原理,而不会过多地专注于改进编程)。希望有一天会派上用场。
Amumu 2011年

1
另外,对较低级别的活动有更深入的了解将有助于您做出决定。
Dietbuddha

1
加上我的0.02,知道在需要时完成某件事通常是一件好事。可以帮助使您的需求更加合理和高效(适用于高级编程,也可能适用于老板;)。
ssube

43
  • 有人会合法地不了解不会理解较低级别的功能,而仍然是一个非常有生产力和有价值的开发人员,这已经是事实。
  • 没有人会需要学习或理解较低级别的功能,而这永远都是浪费时间,永远不会这样。

就像在任何工程学科中一样,最终产品有很多步骤,所有这些步骤都很重要,需要专业知识并且很有价值。特别是在软件工程方面,我们有很多抽象层。所有这些都是必需的,没有人可以成为所有这些方面的专家。

就是说,与Assemby / C开发人员相比,我们需要更多的C#/ Java / Ruby开发人员。对于我们的“高级”开发人员,更多地了解“幕后”的情况是有帮助的,它将使我们成为更好的开发人员。但是还有很多其他的东西。作为一名.NET开发人员,例如,我学到了很多东西,可以提高我的工作效率,因此学习我们的中间语言(少了C ++ / C / Assmebly)虽然很有帮助,但通常不得不退居二线。


7

您现在可以在不了解底层知识的情况下以程序员为生。我认为这只会使您成为更好的程序员。

但是,保持低水平人员的高水平能力变得越来越不重要。我的意思是,我已经20年没有做任何组装工作了,可能需要认真地复习一下,然后才能再次有所作为,但是关于事物在该级别如何工作的总体概念仍然是我的意识,我发现即使使用高级语言,它也会时不时地提供帮助。


3

我不这么认为,内核开发人员将始终需要低级的东西。理解一切工作原理也无济于事,如果您从根本上了解正在编写的代码在做什么,那么您将学习编写更好的代码。我认为删除低级的东西是一个可怕的想法,因为这种抽象思维有时很有用,但是如果您希望以最佳方式解决问题,实际上可能是一个障碍。例如,了解连接字符串时实际上要创建新的字符串很重要,但是如果您不了解字符串的实现方式,则可以连接起来并等待5分钟,以使程序运行。这是关于此类事情的出色文章:http : //www.joelonsoftware.com/articles/fog0000000319.html


3

这取决于软件工程师的实际工作。可能有一个生产性,幸福和赚钱的职业,而现在却从未接触过任何低水平的人,但这并不是所有编程工作。为了有操作系统和编译器,必须有从事操作系统和编译器的工程师,他们需要了解C,C ++及其机器的汇编语言。

性能也很重要。我目前的笔记本电脑的功能大约是我的第一台家用计算机的一百万倍,而运行软件仍然需要时间。我仍然会在电子游戏方面滞后。当然,视频游戏看起来更好,因为屏幕上超过一百万个像素中的每一个都可以被赋予百万种颜色中的一种(与一千个黑白字符位置相对,其中一些字符用于图形处理) )。我怀疑在不久的将来我们的计算机功能还会再增加一千倍,如果我们这样做,我希望它会被越来越复杂的软件所使用。

虽然大部分商业软件将继续以最快的速度生产出来,通常不是C,但是对于C和C ++专家来说,仍然有很大的空间。


2

“随着硬件的不断改进,C / C ++和Java之间的性能将不那么重要,大型游戏也许可以用Java这样的语言进行编程。”

我不认为该声明很快会正确。由于在后台进行检查,因此托管代码中总是存在问题。硬件也不会变得更好,因为硬件会变得更好,预期将在其上运行的应用程序也会变得更好。用本机代码编写的系统必须具有与托管代码的接口。在两者之间切换时会发生性能下降。

但是,只有一小部分应用程序确实需要此优化代码。大多数业务应用程序都可以与任何托管代码,.net,java等配合使用。这并不意味着需要它的应用程序很快就会进行切换。但是,由于优化的C / C ++编译器非常出色,因此现在很少使用手写汇编。但是,最近有一个完全用汇编语言编写的OS,因此仍有一些正在使用。在安全领域也很重要。

不过,我想说,要成为一名真正的优秀开发人员,应该了解低水平的发展。它有助于解决一些难题,尤其是在调用本机代码时。


@Adam Tuliper“完全用汇编语言编写的OS”有趣。你能给我操作系统的名字吗?您对故障排除提出了很好的建议。
Amumu 2011年

@Adam:仅有汇编的“ OS”可能没有很多花哨的地方(例如花哨的动画GUI和绘画程序),相反,它只能运行一个或两个用户模式进程...
Macke

@Macke:你在开玩笑吗?用汇编语言编写的多任务操作系统比用C语言编写的操作系统要多。从中克隆NT(Windows内核)的操作系统主要是用Macro-32汇编语言编写的。
比特币2011年

1
@ bit-twiddler:确定吗?我看到的大部分消息来源都在极乐世界……
TMN

@TMN:BLISS仅用于更高级别的OS。整个VMS内核是用Macro-32编写的。我保留了fork级处理代码的列表多年,因为我认为这是一个很酷的主意。叉级处理是一种机制,通过该机制,中断处理程序可以调度其代码的非时间关键部分以较低的中断优先级运行。在NT内核中,叉子级别的处理已重命名为“延迟过程调用”。
比特币2011年

2

我认为了解一些低级知识对于调试非常有帮助,例如,对于嵌入式编程而言,大多数工作都是使用C完成的,但是在进行调试时,了解该特定Micro控制器的汇编非常有用。


同意。我从事嵌入式编程已有30年了,虽然我发现自己不必再编写汇编代码了(一切都在C中),但我经常在逐条指令的基础上逐步完成程序。
tcrosley 2011年

哎呀,我经常在Windows上以CPU模式调试C和C ++代码。对处理器的体系结构和指令集以及所使用的编译器的运行时组织的了解是您掌握的一套强大技能。请看到我的详细GCC生成的代码如下programmers.stackexchange.com问题:programmers.stackexchange.com/questions/59880/...
位旋弄

2

最初发明计算机时,只有少数人知道如何使用它们。现在,在一个富裕国家中,大多数家庭都拥有一台或多台普通人可以使用的计算机。许多普通人每天都有工作在计算机上工作。一般人都有使用计算机的能力,但是我们仍然需要程序员。

同样,普通程序员不需要了解或定期使用汇编语言进行编程。这既是可销售技能的一个条件,也是对我们在技术世界中取得的成就的致敬。业务需要计算机来自动执行任务。因此,对可以使用.NET / Java进行编程的程序员的需求很大。

可以自动化的任务将被自动化。并非所有任务都可以自动化。并非所有的自动化都是完美的。那么,组装重要吗?当然。是否需要成为“程序员”。当然不是。


0

嗯,我实际上很喜欢学习低级的东西。

也许这不是最准确的比喻,但对我而言,这就像学习汽车内的阴谋诡计。我可能不知道所有零件之间是如何相互作用的,但是很有趣的是,这里有一个发动机,一个曲轴,汽缸,差速器,起重机,制动器,机油,燃烧,制冷,然后是摩擦,应力,热量,力,科学-热力学,物理学,流体力学...

也许不是很有用(我不知道这一切就无法修理汽车),当然不是专业上的实践,但是很好玩。艺术品:艺术品。


0

我认为一个有用的经验法则是-速度越快,所需的水平就越低。

因此,图形密集型第一人称射击游戏或算法外汇交易系统,它们仍然处于较低水平(C ++等),因为速度是关键。但是按时发布销售报告的Web应用程序呢?地狱,您可以用Sinclair BASIC编写它,并且仍然可以接受。


1
-1:我认为有用的经验法则是-速度越快,所需的水平就越低。 -很好奇,你几岁?更好的算法,更好的体系结构和更好的硬件将加速大多数现代软件应用程序。电脑游戏和嵌入式系统是该规则的例外。
Jim G.

太老了!:-)您提到了更好的算法,更好的机器体系结构,更好的硬件-但在我看来,这些对流程执行速度具有同等的影响。提高处理器速度,然后无论使用哪种语言开发,每个进程(应该)都应运行得更快。使用慢速排序算法,无论您用什么方式编写,您的应用程序的运行速度都比需要的慢。高级编程语言仍然对执行速度产生相对的影响。如果毫秒很重要,请降低。算法交易系统不是用Java编写的。
Adrian Parker

0

并非所有软件工程工作都相同。从事操作系统,编译器,框架,设备驱动程序,嵌入式系统和高性能科学计算的人们非常需要了解“低级知识”。那些为妈妈和流行商店编写Access CRUD表格或PHP购物车的人也许不多。您想做什么样的软件工程,并且一生都想做?

我的观点是,您需要至少学习通常使用的一种抽象层次。如果您使用C / C ++,则应该掌握一些计算机体系结构和汇编语言。如果您使用PHP,那么您应该了解HTTP和一些C / C ++或Perl。如果Access是您的基础,那么您最好了解一些RDB理论,也许对COM或.Net有所了解。在您的职业生涯中的某个时候,您最终会因较低的抽象级别的问题而陷入困境,并且您需要能够与该领域的专家至少进行一点沟通。如果没有这些东西,您可以“过去”吗?当然可以,但计划在竞争激烈的就业市场中“勉强生存”是危险的。


-1

我本人在C#.NET中进行了大量工作,并且始终避开C,C ++。最近开始寻找工作,并且惊讶地发现有多少工作可用并且需要C,C ++的经验。最初,尽管C,C ++变得过时,但查看可用的作业,情况似乎并非如此。


-1

您列出的所有托管语言都有使用C / C ++编写的解释器或虚拟机。如果没有这两种,大多数托管或解释语言将根本不存在。我会说你低估了他们的价值。


-1

我真的很讨厌“实用”知识的概念。您所学到的一切都同样实用。不必在接近硬件的抽象级别上操作也没关系,仅了解该领域的概念对于在另一个抽象级别构造新知识总是有好处的。您知道的相关概念越多越好。

对于我通常的工作,C#是一种非常底层的语言,我认为它与硬件非常接近。但是我仍然相信,即使是我对数字电子学,CPU设计等的基本知识,也对我所做的一切都很有用。


@Amumu说:你说的很对。人们通常将自己赚钱的知识与“实践知识”联系起来。但是,他们确实有一点。至少,如果我们从所学到的东西中,尤其是对我们的生活没有益处的东西中赚不到钱,我们期望并期望为社会做出贡献。例如,我们可能想学习哲学或方法来帮助我们的生活更有意义。但是,如果我们花时间学习数学,而电学只是一半,那么我们无能为力,就会浪费您的时间。
亚当李尔

@Anna Lear,问题在于,如果没有非常广泛的“非实践”知识,就无法掌握“实践”,直接适用的技能。仅仅是因为这个世界上的所有知识都是紧密相连的。知识距任何可能的实践有多远,任何知识都不会成为“浪费时间”。
SK-logic

1
-1:您所学的一切都是同样实用的。- 哇。也许我应该记住所有“ Trivial Pursuit”问题卡的答案!;)
Jim G.

@Jim G.,是的,您应该,只要您有足够的空闲时间,而且不会以不学习会比您更进步的东西为代价。记住“无用的”东西实际上是提高记忆力的一种非常有效的方法。
SK-logic

-1

没有大多数不需要。尽管实践低级技术可以使开发人员更好地了解可能会对整个周期产生影响的知识,但如今,开发人员可以利用这段时间来研究较新的技术,这反过来又需要开发低级知识,而不再依赖上。


-1

在我看来,当您使用“工程师”一词时,您的意思是男人/女人是从头开始设计和制造东西的人。软件工程师的真正问题是要解决问题,但是什么问题呢?这是一个大问题。

开发人员在很多方面与工程师不同。“开发人员”是通常在已经存在的平台上构建事物的人。他使用自己的父系统的组件来开发现有平台或构建从旧平台继承的新平台。

开发人员通常从业务角度考虑,他不是科学家。:)开发人员更接近系统用户,他们从用户角度思考问题,因此最终使用技术解决了用户问题。

工程师是一个聪明的人。他是一名科学家,他解决了一个非常真实的问题。大多数问题是哪台计算机本身具有它的功能。我们用户从来没有接近这个问题,它是封装的。工程师是在对现有系统进行了大量研究之后放弃研究的,他们提出了一些新的解决方案,如果解决方案需要,如果他们的系统需要新的语言,他们会发明新的语言,因为现有的系统无法胜任。解决了这个问题。工程师最终构建了一个系统,开发人员可以在该系统上构建他们的系统。

确实,软件工程师需要学习并精通一些低级的知识... :)

而开发人员,则完全取决于他的兴趣。:)


1
-1:嗯...工作头衔毫无意义,伙计。
Jim G.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.