关于程序员如何以不熟悉的语言理解代码的研究?[关闭]


15

对于认真使用多种语言(例如X和Y)的人来说,是否有认真的研究对掌握X语言的经验丰富的程序员如何理解由合格的程序员使用Y语言编写的代码有多好的了解?

当然,现实世界并不是那么简单,因为程序员只知道一种语言。我们想知道的是:如果我们使用C#进行项目,并且某天某些仅认识Fortran和Algol的老物理学家对此进行研究,这对他们有多大意义?如果他们忽略了某些随机标点符号,那么其中的数学部分可能对他们来说没问题。还是,Python专家能够找到我聪明的Ruby脚本中的缺陷?

从表面语法级别到大概念级别(例如对象,模板元编程,功能等),都可能存在问题。我不希望一个程序员能够完全理解“外语”中代码的每个语法细节,也不会遵循某些宏伟概念的宗教信仰,而是想知道他们将在多大程度上获得控制的主要作用,找到解决方法?如果屏幕上画了什么东西,并且决定了它的颜色或大小,请验证编程为驾驶汽车的机器人在完成后会关闭引擎,诸如此类。

高质量的研究应包括已发表的学术研究,一些行业组织或大型软件公司的官方报告,尽管我将接受经验丰富的研讨会和课程的领导者或其他来源的系统公正的观察。对简短的博客,单例示例或轶事不感兴趣。(好吧,也许有一些轶事可以使他们读得很好。)


1
我不知道是否有任何研究,但是从我的亲身经历来看,我说是的,我在不了解语言的情况下设法理解了程序。
superM 2012年

2
这将取决于一对语言:选择C#与Java –您将近乎熟悉。选择Algol vs. C-单页备忘单,您就会熟悉起来。选C对Prolog或Whitespace对Ada祝你好运-这将令人沮丧。顺便说一句,语言并不是理解程序的唯一因素:一位专门从事嵌入式设计的C专家试图理解用C编写的MFC代码是一种遗憾(这是第一手的经验)。
dasblinkenlight 2012年

对于那些了解代数的人来说,选择三角函数与对微积分的理解起来有多么容易?这取决于语言和范式。很难发现和隔离各种语言之间的差异,特别是因为这些语言在不断发展。我严重怀疑有人会以任何合理的准确性来评估理解。
Evan Plaice

Answers:


9

显然,这取决于语言之间的关联程度。例如,如果您具有C或C ++的背景并且已经完成了一些C#或Java编程,那么您应该很容易阅读和理解这两种语言中的另一种(Java或C#)。如果您非常了解Lisp,Scheme应该不会有太大问题。我曾经对C,C ++和Perl有所了解,但是对PHP的程序却一无所知。我很确定,什么时候用Haskell或Smalltalk编写该程序,对我来说几乎很难做到。

实际上,我认为关于这一主题的学术研究没有任何意义(至少不是认真的)。没有像“了解X语言的经验丰富的标准程序员”这样的东西,因此任何研究都将丢失有保证的基础数据。人们有不同的知识,即使他们在同一所学校就读,他们的才能和动力也不同。

但想知道他们将在多大程度上获得控制的主要作用,找到在屏幕上绘制东西的位置

即使您非常熟悉该语言,也可能很难做到这一点,这可能是因为代码质量太低,或者所使用的框架太复杂,或者代码库很大。


6

不确定是否有学术研究参考资料,但是使用C#/ C ++ / Java / Python等语言对方法,类和函数进行了很好的自解释命名。语言应该易于理解代码库以及业务流程。

项目内以及通常在软件开发中的命名约定是一个非常重要的方面。但是,its importance与构建高质量软件的相关性常常一起被忽略或忽略。

.NET Framework中使用的命名准则和.NET中使用的常规命名约定也是很好的参考。


良好的API设计和命名约定会有所帮助,但是即使基于语言的命名约定也常常以仅适用于该语言的方式被“反对”。除了C#/ Java(几乎相同)之外,大多数语言都以不同的原理进行操作,这些原理具有针对该语言的独特工作流和实现。例如,在不遵循巨型整体核心框架模型的语言中,您通常会发现一个庞大的软件包生态系统,它们使用一个通用的软件包管理器将它们捆绑在一起。
Evan Plaice

3

这在很大程度上取决于各个程序员以及他们如何内部化语言。我有十多种语言,这绝对没有问题,而我有一个只懂C ++的朋友。他在编程方面并不比我差,他只是学会了另一种方法。

就个人而言,我发现一个更有趣的相关问题:当​​代码中存在错误时(即程序员X认为他写了,someFunction(x, y)但他确实写了其他东西),第二位开发人员识别该错误有多困难。一个好的程序员X会使他想让计算机做的事情变得非常明显,而且很容易阅读。但是,如果他犯了一个错误,那可能是一件大事。类似以下C ++错误的事情:

int x = getCorrectValueForX();
if (x = 2)
   doSomethingWhenXIsTwo();

除非您知道该语言,否则很难检测到。


1

它不仅取决于其他人所说的程序员,而且还取决于语言之间在语法,哲学和实现上的相似性。

许多不同的语言都使用C派生语法,因此如果您熟悉该类型的语法,遵循控制流程将更加容易。强类型和松类型的语言,具有更高阶函数支持的语言,抽象级别和程序化哲学也是如此。它不仅取决于您是否能够阅读语法,还取决于您对语言概念和哲学的了解。

例如,如果您学习过C,我认为可以期望您能够从C#,Java或C ++等派生控制流是很合理的。由于语法上的差异,解密VB会有些困难。由于存在闭包,弱类型和高阶函数(我知道您可以在C中完成此操作,但有点奇怪),因此使用JavaScript。但是,我不希望您能够调试Lisp,F#,R或汇编程序,因为它们使用了完全不同的编程范例。

TL; DR不仅要识别语法,而且在大多数时候可以解密声明或方法调用很重要,但能够理解为什么以某种方式编写程序的原因是理解和读取代码的关键。

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.