知道C实际上会伤害你在高级语言中编写的代码吗?
这个问题似乎已经解决,甚至被打死了。 聪明的人在这个问题上说了很多聪明的事情 。 要成为一个非常好的程序员, 你需要知道C.
或者你呢?
这周我开了两次。 第一个让我意识到,我的假设并不比我背后的知识更进一步,考虑到我的机器上运行的软件的复杂性,这几乎是不存在的。 但真正把它带回家的是这个Slashdot的评论 :
最终的结果是,我注意到传统的C“裸机”程序员认为实现高级语言的许多天真的方式。 他们在他们影响的项目中做出了不好的“优化”决定,因为他们不知道编译器是如何工作的,或者他们所了解的天真的macros汇编器模型与良好的运行时系统有多大的不同。
然后它打击我:C只是一个抽象 ,像所有其他人一样。 即使CPU本身只是一个抽象! 我从来没有看到过这个问题,因为我没有工具去衡量它。
我很困惑。 Dijkstra对BASIC的评论是否让我的思想残缺不堪? 我是否处于不成熟的优化状态? 有没有希望我,现在我意识到我什么都不知道? 有什么可以知道的,甚至? 那么为什么这么迷人,我过去五年写的所有内容都可能是根本错误的?
总结一下:在知道API文档告诉我的时候有什么价值吗?
编辑:CW。 当然这也意味着现在你必须发布解释器/运行时优化的例子比我们更好:)
既不了解C也不知道实施的底层细节会对自己造成伤害。 如果你一直在低层次的细节上思考和工作,即使是不适当的,也会伤害到你。
古语是“真正的程序员可以用任何语言写FORTRAN”。 如果你用C来做同样的事情,这不是一个改进。 如果你正在写Lisp,写Lisp。 如果您正在编写Python,请编写Python。 C的适当和合理不适用于其中任何一个(或任何其他)。
一个伟大的程序员需要能够在许多不同的抽象层次上进行思考,并且(更重要的是)要识别和应用适合于当前任务的抽象层次。
C的抽象层次的知识不会受到伤害。 无知的替代品可以(也将)。
知识不伤害。 永远。 那些用高级语言编写不好的代码是因为他们没有正确掌握高级语言,坏的开发人员。
对一个糟糕的开发者来说,任何types的知识都是危险的。
对一个好的开发者来说,任何types的知识都是一种资产。
使用语言 – 自然(口语)或人造(编程) – 需要思维以某种方式适应。 每种语言都有它自己的语法,它是自己的词汇表(APIs)等等。如果你大多是一个Java程序员并转换到Ruby,那么至less要遵循Java程序员的思维模式,如果不是写基本的Java代码ruby。 在新的环境(Ruby语法,Ruby APIs)中开始感觉舒适并开始编写Ruby代码需要一点努力和练习。
所以,这个过程是完全正常的,以前的模式的任何不利影响是非常短暂的。 更重要的是,你所学的每门语言都能拓宽你的视野,并使下一个学习更容易。 旅行愉快。 :]
编程不是关于编程语言。 这是关于解决问题。 用来解决问题的工具恰好是编程语言。 你不写代码来编写代码,你编写代码来执行它并解决问题。
你越了解你的工具,你就能越快越好地解决问题。 但是当你用锤子从身体上把螺丝钉塞入木头时,你会遇到严重的麻烦,软件有一个很好的属性:对于任何给定的问题,都有一个荒谬的解决scheme。
因此,完全可以写一个锤子,以这样的angular度敲击螺钉,螺钉会告诉木头自己钻出一个孔,以便拧入螺钉。然后,您可以将其隐藏在button后面,甚至不需要知道锤子究竟是什么。
虽然这不是最有效的解决scheme,但它仍然是一个有效的工作解决scheme。 当你使用的工具变得更好的时候,最后你会发现当API没有提供的时候你怎么可以写一个螺丝刀。
你知道的工具越多,你知道如何解决任何问题的方法越多,你拥有的select就越多,就使用什么解决scheme做出的决定也会更好。 为工作select正确的工具。 但是,当你不知道工具和可能的解决scheme时,你怎么可能?
为了扩大他人的意见……虽然我不确定我是否相信http://en.wikipedia.org/wiki/Whorfian_hypothesis">沃尔夫假说,当涉及到自然语言时,它显然是真的你知道的语言会影响你如何解决问题,例如:;
1)我从很多年前就有一位教授,他试图弄清楚他的string是否有重复。 这在70年代,所以他在FORTRAN写这个。 他的蛮力n ^ 2实施太长了。 所以他跟一个朋友说话。 他的朋友知道PL1(我认为可能是APL),它有一个sorting算子。 所以,用这种语言,你学会了分类的东西,以及它的用处,因为它很容易。 朋友首先想到了明显的sorting,然后看看相邻元素algorithm。 速度要快得多,我的FORTRAN写作教授也不会想到,尽pipe它在FORTRAN中是完全可以实现的。
2)当我在读研究生的时候,我有一个物理专业的同学, 他去了麻省理工学院,只参加了一个编程课程,当然这个课程在计划中。 有一天,我在他的办公室停了下来,他说:“嘿,布莱恩,你能看看这个代码,告诉我它是否应该工作吗?” 这是一个sorting程序。 我瞥了一眼,说它不可能工作,因为它显然是起泡的,但它只有一个循环(不,不是那种你可以用生气写的泡泡的时髦循环,扭曲)。 所以,我说过。 他回答:“哦,但是它有一个recursion的电话号码!” 我从来没有想过写一个recursion的bubblesort。 但更重要的是,HIM从来不会写出非recursion函数。
关键在于你所知道的语言在很大程度上决定了你将要写的代码的种类。 你知道的语言越多,拥有的工具越多,工具也越多,只要你知道什么时候使用它们…
要成为一个非常好的程序员,你需要知道C.
我同意这一点。
但是我也同意要成为一名优秀的程序员,你必须 真正懂得用另一种语言编写代码( 而不是用另一种语言编写C代码)。
了解C不会损害你的代码的质量,但肯定知道“只有C”
没有。
如果你失去了知道和改善的欲望,虽然你已经受损了。
软件工程是关于理解抽象以及如何使用抽象来有效地解决问题(无论是有效地意味着更低的成本,更快的性能还是最短的时间表来交付function)。理解C只是对每一层抽象并且“放大”到这个详细程度所需要的技能是很有价值的,只要你在必要的时候开发“缩小”技能。 无论是devise一个对象模型,build立清洁的function组合,甚至只是为了清晰和可维护性而构build一个单独的方法,这个技能都能很好地服务于这个学科的各个方面。
了解不同的语言是一种资产。 了解编译器和解释器是如何构build的也是一项资产。 最后,每个程序员都应该花些时间用汇编语言来欣赏高级语言。 🙂
在我的大学,我们参加了一门课,“编程语言”,我们学习了LISP,SNOBOL和ADA。 这些语言在解决编程问题时打开了不同的概念思维。 总结是select最适合问题的语言。
了解编程语言只是基础。 如果我不知道其他相关主题:数据结构,algorithm,线性代数,布尔代数,微处理器devise和通信(人与人之间),我不会在职业生涯中走的太远。 任何人都可以拿起一本书,学习一门语言,并称自己是程序员。 这是另一个区分熟练的开发人员和脱离街道的技能的技能。
学习一门编程语言。 好好学习,这样你就可以把更多的智力集中在手头的其他工作上。 你不应该经常参考编程手册。 我的大部分注意力集中在任务和algorithm以及数据结构的要求上,以便在最短的时间内正确实施。
简短而甜美:
要成为一名优秀的程序员,你需要能够有组织地思考。 C或LUA或Java,无论如何。
只有在真正不需要的情况下将这些知识应用到更高级的语言时,它才会受到伤害。 当然,在编写我自己的集合类时,有一些低级C的经验,我也可以用Java来完成。 但是对于现有的Collections库(这两个Java API作为Commons Collections extras)来说,它会是一个更好的select吗? 也许。
在实践中,你必须计算所投入的时间是否值得。
事实上,你应该在黑客入侵你的代码之前进行研究。 看看你正在尝试做什么可以使用内置或第三方工具来完成。 如果可以的话,看看内置或第三方工具是否可以做你想做的事,以及它们是否performance良好。 如果他们不知道,为什么不呢。 如果他们/真的/不要,重写。
正如其他人所说,所有的知识都是值得的。 我的意思是/所有/ – 低级优化的C代码,作为高级调用良好开发的库。 如果你们两个都知道的话,你们就会知道在什么时候使用哪一个,为什么。
不,知道编程语言的多个实现只能帮助你更好地理解这些抽象。
问题是你接受一个是最好的抽象,会导致你不能成功地使用你认为的更小的其他人。
每个抽象都是针对特定的不同目标而devise的,select最适合您需求的抽象。 知道Linux会让Windows或Mac OS更难吗? 它接受他们是不同的 。
这里真正的问题是假设。 那些其他开发者假设他们知道它是如何工作的 无论是来自有经验的开发者,或是认为他们已经搞清楚的新手,都假设是魔鬼。
至less,这是我在这里假设的
学习C是一件好事。 试图用更高级的语言编写C代码是一件坏事。
C程序员学习C语言(或任何语言)可能会对程序员造成伤害,这似乎取决于你在学习C之后不能学习任何东西 。这里的教训应该是不要停止学习。 另外,不要认为任何其他的语言或技术必须像C(或者你最喜欢的C编译器)那样工作。
也就是说,我认为学习C可以成为学习硬件如何工作以及机器中实际发生的事情的好方法。 我看不出有什么可能会以任何方式伤害你。 我不认为无知有什么好处(除非是偶然的)。 我承认学习C并不是了解机器的唯一方法,但这只是一种方法。
理解多种语言/框架和编程范例绝不应该受到伤害 – 这应该是有益的。
重要的是要理解你正在工作的语言/框架/环境,以便知道实现select的含义。 在这里,使用其他语言获得的知识可能会让你的眼睛看到更广泛的可能性 – 但是你必须根据当前的环境评估这些可能性。
那些让自己陷入真正麻烦的人是那些学过某种语言的人,例如C,然后学习另一种语言的C语言,而不是因为自己的优点,长处和短处而学习它(有点像用锤子的勤杂工作为他唯一的工具 – 所有的问题看起来像指甲)。
了解C,然后用我最喜欢的非常高级的语言(Python)工作,就是为什么我认为有助于了解C的一个例子。
了解C,当我使用Python有几个方面的帮助:
(a)我感谢Python的列表,字典和内buildtypes,因为它可以轻松地在一行代码中重复地执行某些操作,这将需要我select一些代码库,学习并链接到它(散列表,数据结构等),并避免用脚砸自己。
(b)Python是用C语言编写的。作为一名C程序员也意味着,如果Python让我有99%的方式,但是在python中可能有一些额外的抽象,那么我可以用Python来编写这个抽象。 我可以查看CPython解释器的源代码,了解内部发生的事情。 实际上,我是一名Python程序员,仍然使用C语言构build的东西。 因此,知道这种语言仍然是有价值的。
我上面所说的一切,对于使用Perl,Ruby和PHP的人也是如此。