代码之家  ›  专栏  ›  技术社区  ›  nickf

语言之间的编程技能有多可转换?

  •  10
  • nickf  · 技术社区  · 15 年前

    如果你在为一个(比如说)PHP开发人员做广告,并且有人申请了一份优秀的简历,但他们是(比如)ASP.NET的专家,而且他们简历中的PHP组件很轻,你还会考虑他们担任这个职位吗?你认为一般的编程技能胜过特定的语言技能吗?

    17 回复  |  直到 12 年前
        1
  •  14
  •   thomasrutter    15 年前

    一个好的程序员可以很容易地在语言之间进行转换。

    然而,关键是,一个好的程序员,从定义上讲,是一个已经有能力使用各种语言的人。如果你雇用的人只具有单一语言和编程环境(编译器、框架等)的经验,那么他们可能没有必要的经验,特别是考虑到php“stack”与.net有些不同。

    但是,如果你雇佣了一个知道Java、PHP和Python经验的人,那么这表明他们已经有了很好的编程经验,而且他们的技能很容易转移到ASP.NET。

    这是我的意见。

        2
  •  7
  •   CookieOfFortune    15 年前

    非常可转让。对于一个好的程序员来说,语法是微不足道的,只要他们知道应该在哪里和什么时候使用某些设计模式和问题解决技术(以及当它们可以用于某种语言时),那么就没有理由不考虑它们。

        3
  •  7
  •   Arnold Spence    15 年前

    当然。一般编程技能是任何开发人员的核心价值。事实上,沟通技巧甚至可能超过一切。一个好的程序员是一个好的沟通者。

    编程应该是关于通信的,因为代码将花费比第一次编写代码更多的时间来查看和修改,因此它更好地通信它应该做的事情。

    在编程基础上有坚实基础的程序员应该能够在几乎任何语言中迅速地达到速度。

        4
  •  4
  •   sharptooth    15 年前

    不熟悉某些技术/语言就是不熟悉。如果一个人有一份很好的简历,并且表现出对他所使用的技术的深度投入,并且有很好的编程和解决问题的能力,那么他肯定会被考虑。唯一的例外是,当你现在需要一个合格的专家,因为你没有时间或者因为某些原因可以让他学习。

        5
  •  4
  •   Johan    15 年前

    这些高级语言的棘手部分是“类库”,需要一些时间来使用您可以使用的“内置”功能。(你不想重新发明轮子)。

    但是如果你只看它自己的语言,因为大多数语言在某种程度上是相互联系的,一个懂5种以上语言的人比一个只懂一种语言的人有优势。

    如果你把这归结为一次招聘,那就是一个关于你打算让程序员呆多久的问题?他是被雇来做一个快速的工作,比如说2-3个月,还是你雇了一个新的程序员,而你想保留3年以上?

    从长远来看,多国语言的人可能会更好,但如果他不懂这种特定的语言,就需要一段时间让他加快速度……

    Johan

        6
  •  4
  •   Svante    15 年前

    老实说,这似乎不是这样,但我相信这个问题太含糊,无法准确回答。我认为这很大程度上取决于你雇佣的具体工作。

    如果你希望有人能在高水平上立即提高工作效率,那么你真的希望有人对你将要使用的语言有很强的经验。最好是至少有一个人领导这个项目,他真正理解语言,以及如何使用语言,而不会在他的设计选择中“违背本质”。同样地,如果候选人有强烈的语言偏好,并且是那种会一直在哀叹你选择语言的类型(谈论他的爱人会如何使一切变得更好),那么他就不会是你选择这个角色的最佳人选。

    另一方面,如果这不一定是项目的主要开发人员,那么可能还有其他的选择。一个有能力的PHP开发人员完全可以进入并协助Java项目,反之亦然。一个拥有良好通用技能的强大开发人员在许多方面都会比一个普通的PHP开发人员强。与以往一样,这里的挑战在于评估他们的技能,以及他们是否能够快速适应新平台。

        7
  •  3
  •   KevinDTimm    15 年前

    同意,一个好的程序员可以在语言之间转换。

    但是,不管你有多优秀,一种新的语言/范式/心态需要一些适应。如果我雇佣了一个Java开发人员,并且拥有一个“聪明的事情完成了”的C++开发人员,我就必须有一个非常有说服力的理由来雇佣他/她,让他/她拥有Java经验,考虑到“熟悉的”和“富有成效的”是两个不同的东西。

    简言之,如果我需要一个高年级学生,有相关经验的人会比熟悉语法的人更容易获胜。朱尼尔,也许还有余地。

        8
  •  2
  •   Bjorn    15 年前

    我想在这里的其他答案中添加一个警告,即尽管编程技能是有价值的和可转移的,但是人力资源部门可能会因为你的简历上没有“正确”的东西而把你的简历弄脏。如果你在简历上用一种语言来解决这个问题,你还没有准备好回答面试问题,那么你可能不会给面试你的人留下深刻印象。这是第22条军规,在一些公司招聘是一个相当大的问题,这些公司、那些想在那里工作的人以及那些已经在那里工作的人都很差劲。

        9
  •  2
  •   Eran    15 年前

    我想说的是,一般来说,成为一名优秀的PHP程序员意味着如果你花时间学习它,你有很好的机会成为一名优秀的ASP.NET程序员。能够编程是一种天赋,学习一门语言主要是训练。尽管如此,我相信除了熟悉该语言的语法之外,还有更多的事情要做。一个好的程序员应该对可用的框架、库、特定语言的实践等有很好的理解。一个ASP程序员可以在读了一本好的PHP书之后编写PHP代码。但是为了成为一名优秀的PHP程序员,需要更深入的理解,而这种理解主要来自于经验。

    所以,归根结底,一个好的程序员可能会学习大多数语言。问题是,你会为让他成为一个有经验的程序员而付出代价吗?

        10
  •  2
  •   Bill Fraser    15 年前

    这些技能是很容易转移的,但是让一个人擅长某种语言而不是仅仅擅长某种语言的原因是他们对这种语言怪癖的深入了解。

    每一种语言都有其奇怪的习语,人们只有在使用这种语言一段时间后才能习得。熟练使用另一种类似的语言对这一点毫无帮助。

    即使对于像手背一样熟悉ASP.NET的人来说,他们第一次切换到PHP时,仍然会有一个非常重要的“wtf”阶段,在这个阶段中他们会产生一些非常讨厌的代码。它可能是在工作的代码,但它不容易维护,而且可能无法很好地与项目的其余部分集成。

        11
  •  2
  •   MiddleAgedMutantNinjaProgrammer    12 年前

    在一个层次上,编程技能是独立于语言的。编程基本上就是解决问题。您需要知道如何识别问题、分析问题并将其分解为其基本组件,以及设计解决方案(通过算法、数据结构,或者通常两者都是)。每种语言都只是您用来构建解决方案的工具箱。有些,比如Java和C语言,使用起来比较简单,但是有一些工具,所以你很少能按照你想要的方式微调你的解决方案。C语言是最灵活和最强大的语言(汇编程序之外)。它给了你权力和自由去做你想做的事情——包括大量滥用(当然是故意的)违反它的(非强制的)规则。但是它的工具箱里装满了很多非常锋利的工具,它需要更多的编程技术来安全地使用(这就是它成为一个很好的桥梁,比如说Java和最终由CPU运行的机器代码)。

    有一件事让我担心这一对话,那就是纯粹的编程语言,比如Java、C语言和任何脚本化的网络语言(Python马上就要出现)。在我37年的编程生涯中,我已经用了很好的两种语言(如果不是更多的话)。

    的确,每种新语言都有一条学习曲线,可以了解语法、语义、库和特性。但是,还有一个问题我看不到在这里解决。

    如今,大多数程序员都是专门接受高级、高度抽象语言培训的,他们根本不知道自己的代码到底要做什么。你正在与一个完全陌生的“大脑”进行交流,这一点很愚蠢,而且,通过将数百万甚至数十亿个简单的操作集合起来并以几乎无法想象的高速运行,你可以模拟虚拟的光辉。

    与我一起工作的程序员从来没有在汇编语言、C语言、甚至C++中扎根过,但是他们只想到Java、C语言等的编程。最后,他们完全不知道他们编写的漂亮代码是什么,他们做出的选择的优势和(通常是可怕的)后果是什么。他们如何使用语言。

    在保护模式操作系统将程序员从编码到裸机以及处理端口、内存地址、中断地址表、寄存器和基本操作代码和操作程序之前,您需要一些语言方面的经验,这些语言可以将您带到较低的级别,特别是在命令行DOS或不带GUI层的UNIX上。机器实际执行的数据。

    我给你举个例子说明我在说什么。有多少Java程序员曾经初始化过StrugBuudor或者StringBuffer?

    StringBuffer strBuf = new StringBuffer();
    

    然后对它执行了十几个.append()操作?尤其是在执行数千次甚至数百万次的循环中。普通Java程序员不知道的是默认构造函数创建一个16字节的内部缓冲区。当每个strbuf.append(str);增加StringBuffer内容的长度时,将强制分配一个新的、更大的内存块,将现有内容复制到内存中,附加新字符串,然后将旧缓冲区标记为gc。这最终会导致大量不必要的分配、拷贝,以及必须由GC进行的范围外内存碎片化。

    如果在循环外定义StringBuffer,并使用为其提供足够大的初始缓冲区大小以处理任何预期的最终长度的构造函数,则可以分配单个内存块,而不必执行所有这些数千或数百万不必要的重新分配、复制和gc。

    StringBuffer fixedStrBuf = new StringBuffer(1024);
    

    然后,循环中的每个.append()只将新字符串复制到同一缓冲区中的现有字符串上。当您完成并使用fixedStrBuf.toString()检索到内容后,只需调用fixedStrBuf.setLength(0);这会使缓冲区本身保持完整,但会重新初始化它以再次使用。您还可以在每个循环的顶部执行setLength(0)调用。只要确保StringBuffer对象在退出持续重用它的处理循环后会超出作用域,或者至少在完成处理后为其赋值为空,这样当不再需要它时,它就可以被gc调用。

    顺便说一句,StringBuilder比StringBuffer更快,如果您不需要使代码线程安全,最好使用它。此外,您还可以使用ApacheCommons方法获得更高的速度和灵活性(以及对意外空值的更多保护):

    org.apache.commons.lang.text.strbuilder;

    和StringBuilder一样,它是不同步的,所以要小心使用它,但它至少有十几种其他有用的方法,包括.clear(),它与.setLength(0)的方法相同,但会使代码更具可读性。

    几年前,我被一家主要的运输公司叫来了,他们的明星Java程序员(宾夕法尼亚州的班上10%名,AcdieBealTealTest)编写了一个ETL(DATAMIN)程序,该程序需要在一夜之间完成数据,并对其进行一些重大的转换,并从中创建一个临时的DATAMART。工程师可以调用他们一天工作所需的图表、网格和报告。不幸的是,他的程序运行需要300到360分钟(5到6小时),而工程师们却落后了半天,因为他们要到午餐时间才能获得决策支持数据。我花了两周的时间分析和重构程序,并且在没有任何重大重写的情况下,将运行时间缩短到15到20分钟。在该程序中,除了语言的许多误用(在语法和语义方面都是正确的),程序员实际上使用了上面的StringBuffer(),在一个循环中,每一次传递大约有十几个附加符,运行了100多万次,创建了多达1500万个不必要的分配、复制和删除。这只是一行代码。我可以写一本书,上面写着程序员不知道他美丽但却非常低效的Java代码的低级后果。

    因此,我的建议是,不要试图在你的剧目中添加Ruby或python,或是任何新的热门抽象语言,而是花几个月的空闲时间,学习C(C99或更老的版本-不要担心要赶上几乎还没有人使用的全新的C11标准),并得到一本书,名为“破解内部代码”视图“由盖尔·拉克曼,其中包括其他珍珠,有150个小型编码练习类型,你可能会被要求在白板上编码在技术采访。它们都可以在C、C++和Java中解决(他在Java的最后给出答案,因为它被更广泛地理解,即使C将提供更简单和更优雅的解决方案)。在你学习的时候,在C中完成这些任务,你会学到很多关于什么是好的Java编程和坏的Java编程的知识。P.S.找两个好的C引物-尝试从最初的K&R(Kernighan和Ritchie)手册中学习C就像忍受两天的根管一样。如果你读过K&R,至少可以找到第二版。H&S(Harbison&Steel)是一本更清晰的教学手册。

    顺便说一下,运行Java P-代码的JVM是用C或C++编写的。

        12
  •  1
  •   Filip Frącz    15 年前

    那要视情况而定。如果一个人有很强的技术背景、天赋和热情,那么他应该很容易学会一门新的语言或领域。我的意思是,这就是计算机科学的关键所在——事情每天都在变化,每个优秀的程序员都应该能够适应。

        13
  •  1
  •   krosenvold    15 年前

    只要在相同范例的编程语言之间进行转换,我认为它很容易被转换。将C程序员转换成Java程序员是非常困难的,很多我认识的老师更喜欢没有背景的学生学习Java时的“C”型背景。

        14
  •  1
  •   James Black    15 年前

    php和asp.net可能是相似的,但是php和c是非常不同的,如果您使用c 3,那么会有一个非常清晰的学习曲线。如果程序员只做前端工作,那就没什么大不了的了。

    现在,语言之间知识的可转移性是不同的,因为它取决于语言是否是同一种编程类型(结构化的、功能性的、面向对象的)。例如,一个伟大的C程序员可能不会将他的知识转移到OOP或FP,因为处理设计的方法是如此不同。

        15
  •  1
  •   MatthewMartin muthu    15 年前

    我想是个错误的问题。这就是框架之间编程技能的可转移性。ASP Classic开发人员和JSP开发人员可能可以读写彼此的代码。同样适用于Java服务器和ASP.NET。正如我在当前项目中所知道的,一个C WinForms开发人员可能很难将他的才能转移到C ASP.NET项目中。语法是主流编程语言中的一小部分(我有一些古怪的东西,比如prolog和f,它们的代码方法与curly brace langauges家族完全不同)

        16
  •  1
  •   dantefs    15 年前

    影响我对任何技术(平台/产品/语言)态度的因素之一是学习体验的具体程度。我的同事非常熟悉MS Access,多年来他们已经建立了各种各样的定制业务系统(质量可变)。但尽管如此,他们对SQL几乎一无所知。如果他们花了三个月时间维护一个小的php/mysql站点,那么他们至少会处于一个更好的位置(技能方面),至少可以开始查看informix/sybase/sql-server/etc系统。

    在某一点之后,学习新技术的成本可能会逐渐降低。在php/vbscript之间切换时,我发现在学习这两种语言时都非常恼人,因为简单的惯例更改(例如使用“;”)增加了学习过程中不需要的额外烦恼。最近,我不得不在C、Perl和vbscript之间切换了相当长一段时间,但这并不是一个问题——你遵循每种语法的规则而不去想它。

        17
  •  0
  •   justinhj    15 年前

    如果你在编程方面受过良好的教育,是的。我的意思是,你已经做了很多编程,了解了CPU在低水平上的工作,理解了算法和运行时的复杂性,并且擅长解决问题。

    我认为有些语言仍然有很长的学习曲线。你可以进入一个C++程序员团队,在没有任何经验的情况下帮助他们,但是你一定会经常碰到它阴暗丑陋的角落。

    像SQL或python这样的高级语言看起来很容易理解,但是有多年经验的人能够理解那些在面值上不明显的技巧、未记录的特性和陷阱。