如果您正在为(比如说)PHP开发人员编写一个编程职位,并且应用了一个很好的简历,但他们是(比如说)ASP.NET的专家,他们的CV的PHP组件非常轻,你还会考虑他们的职位吗?你是否认为编程技巧通常胜过特定的语言技能?
答案 0 :(得分:14)
优秀的程序员可以轻松地在不同语言之间进行转换。
然而,根据定义,一个优秀的程序员是那些已经具备使用各种语言技能的人。如果你雇用的人只有单一语言和编程环境(编译器,框架等)的经验,那么他们可能没有必要的经验,特别是考虑到PHP'堆栈'与.NET有些不同。
但是,如果你雇用了解Java,PHP并且具有Python经验的人,那么这表明他们已经拥有了很好的编程经验,而且他们的技能很可能很容易转移到ASP.NET。
这是我的意见。
答案 1 :(得分:7)
非常易于转移。对于一个优秀的程序员来说,语法是微不足道的,只要他们知道应该使用某些设计模式和问题解决技术的时间和地点(当它们可用于语言时),那么就没有理由不应该考虑它们
答案 2 :(得分:7)
绝对。一般编程技能是任何开发人员的核心价值。事实上,沟通技巧甚至可能超过其他一切。一个优秀的程序员是一个很好的沟通者。
编程应该是关于沟通的,因为代码将花费更多的时间进行查看和修改,而不是第一次编写它所需的时间,因此它可以更好地传达它应该做的事情。
在编程基础知识方面有扎实基础的程序员应该能够以几乎任何语言快速合理地加速。
答案 3 :(得分:4)
老实说,它似乎不是这样,但我相信这个问题几乎太模糊,无法准确回答。我认为这很大程度上取决于你雇用的具体工作。
如果您希望有人进来并立即高效率,那么您真的希望有一个对您将使用的语言有丰富经验的人。最好至少有一个人领导项目,他真正理解语言,以及如何使用它而不会在他的设计选择中“违背细节”。同样地,如果候选人具有强烈的语言偏好,并且总是会哀叹你选择的语言(谈论他的最爱会如何使一切变得更好),那么他将不是你担任这个角色的最佳选择。 / p>
另一方面,如果这不一定是项目的主要开发人员,可能还有其他选择。一个称职的PHP开发人员完全可以进入并协助Java项目,反之亦然。在许多方面,具有良好通用技能的强大开发人员将优于普通的PHP开发人员。与往常一样,挑战在于评估他们的技能以及他们是否能够快速适应新平台。
答案 4 :(得分:4)
不熟悉某些技术/语言只是 - 不熟悉。如果一个人有一个很好的简历,并且深入沉浸在他一直合作的技术中,并且具有良好的编程和解决问题的能力,那么他一定要考虑。唯一的例外是你现在需要合格的专家的情况,因为你没有时间或者可以让他因某些原因让他学习。
答案 5 :(得分:4)
关于那些高级语言的棘手部分是“类库”,需要一些时间来使用你可以使用的“内置”函数。 (你不想重新发明轮子。)
但如果你只看自己的语言,因为大多数语言都以某种方式相互关联,一个懂5种语言的人比只知道一种语言的人有优势。
如果你把这归结为招聘,这是一个关于你打算多久保留程序员的问题?他是否被聘请做一个快速的工作,比如2-3个月,或者你雇用一个你想要保留3年以上的新程序员?
从长远来看,多语言的家伙可能会更好,但如果他不懂这种特定的语言,他需要一段时间才能加快速度......
/约翰
答案 6 :(得分:3)
同意,优秀的程序员可以在语言之间进行转换。
但是,无论你有多好,一种新的语言/范式/思维方式都需要一些人习惯。如果我正在招聘一个java dev。有一个c ++开发人员'聪明并且完成了事情',我必须有一个非常令人信服的理由雇用他/她而不是有java经验的人,考虑到'熟悉'和'生产'是两个不同的东西。 / p>
简而言之,如果我需要一名大四学生,那么具有相关经验的人会胜过熟悉语法的人。少年,也许那里有一些余地。
答案 7 :(得分:2)
在一个层面上,编程技能与语言无关。编程基本上是解决问题。您需要知道如何识别问题,分析并将其分解为基本组件,并设计解决方案(无论是算法,数据结构,还是最常见的两种)。每种语言都只是您用来构建解决方案的工具箱。有些像Java和C#一样,使用起来比较简单,但有更明智的工具,所以很少能按照你想要的方式微调你的解决方案。 C是最灵活和最强大的语言(汇编程序之外)。它为您提供了完成您想要做的事情的权力和自由 - 包括批量滥用(故意,当然)违反其(非强制)规则。但是它的工具箱中充满了许多非常尖锐的工具,它需要更多的编程专业知识才能安全使用(这使得它成为Java和最终由CPU运行的机器代码之间的良好桥梁。 。
有一件事让我担心这次谈话,那就是那些只使用Java,C#和任何脚本网络语言(Python立刻想到)等高度抽象语言编程的人数。在我37年的编码中,我编写了一个很好的两种语言(如果不是更多)。
确实,每种新语言都有学习曲线,包括语法,语义,库和特性。但是,我还没有看到另一个问题。
今天,大多数程序员都接受过高级,高度抽象语言的培训,并且对于他们的代码实际上将要做的事情一无所知。你正在与一个完全陌生的大脑沟通,#34;这是非常愚蠢的,并且,通过将数百万甚至数十亿的简单操作组合在一起并以几乎难以想象的高速运行它们的能力,可以模拟虚拟的亮度。
我工作过的程序员从来没有使用汇编语言,C语言,甚至是C ++,但只考虑Java,C#等级的编程,最终完全不了解漂亮的代码他们写作实际上是要做的,他们在如何运用语言时所做的选择有哪些优点和(通常是DIRE)后果。
你需要一些使用某种语言的经验,这种语言会把你带到低级别 - 特别是在没有GUI层的情况下使用命令行DOS或Unix - 比如说,在保护模式操作系统将编程器从编码分解为裸机并处理端口,存储器地址,中断地址表,寄存器,以及机器实际执行的基本操作码和操作数。
我将举例说明我所谈论的内容。有多少Java程序员曾经这样初始化过StringBuilder或StringBuffer?
StringBuffer strBuf = new StringBuffer();
然后继续对它做十几个.append()操作?特别是在一个执行数千甚至数百万次的循环中。普通Java程序员不知道的是默认构造函数创建了一个16字节的内部缓冲区。每个strBuf.append(str);增加StringBuffer内容的长度,强制分配一个新的,更大的内存块,将现有内容复制到内存中,附加新字符串,然后将旧缓冲区标记为gc。最终会出现大量不必要的分配,副本和碎片超出范围的内存,这些内存必须是gc' d。
如果你在循环之外定义StringBuffer并使用构造函数给它一个足够大的初始缓冲区大小来处理任何预期的最终长度,你可以分配一个单独的内存块而不必全部那些数千或数百万不必要的重新分配,副本和gc。
StringBuffer fixedStrBuf = new StringBuffer(1024);
然后,循环中的每个.append()只会将新字符串复制到同一缓冲区中的现有字符串上。完成并使用fixedStrBuf.toString()检索内容后,只需调用fixedStrBuf.setLength(0);它使缓冲区本身保持完整,但重新初始化它以便再次使用。您还可以在每个循环的顶部执行setLength(0)调用。只要确保StringBuffer对象在退出连续重用它的处理循环后就会超出范围,或者至少在完成它时为其赋值为NULL,因此它可以是gc' d当不再需要它时。
BTW,StringBuilder比StringBuffer更快,如果你不需要让你的代码线程安全,那么它是首选。此外,通过使用Apache Commons方法,您可以获得更高的速度和灵活性(以及更多针对意外空值的保护):org.apache.commons.lang.text.StrBuilder;
与StringBuilder一样,它不是同步的,所以要小心使用它,但它至少有十几个其他有用的方法,包括.clear(),它与.setLength(0)做同样的事情,但是制作代码更具可读性。
几年前,我被一家大型运输公司打电话给他们的明星Java程序员(他在宾夕法尼亚大学班级中排名前10%,并且通过Brainbench测试)编写了一个ETL(数据挖掘)计划。获取隔夜提供的数据,对其进行一些重大转换,并创建一个临时数据集市,高级工程师可以从中调用他们当天工作所需的图表,网格和报告。不幸的是,他的计划需要300到360分钟(5到6个小时)才能运行,工程师们已经落后了半天,因为他们无法在午餐时间之前得到他们的决策支持数据。我花了两周时间分析和重构程序,没有任何重大改写,将运行时间缩短到15到20分钟。在该程序中,在语言的许多其他误用中(就语法和语义而言都是正确的),程序员实际上使用了上面的StringBuffer(),其中每个传递大约有十几个附加在一个运行超过一百万的循环中时代,创造多达一千五百万次不必要的分配,复制和删除。而且,这只是一行代码。我可以写一本关于程序员不知道他的美丽但是效率低下的Java代码的低级后果的所有方法的书。
所以,我的建议是,不是试图添加Ruby或Python或者新的热门抽象语言,而是花几个月的空闲时间,学习C(C99甚至更老 - 不要#39担心试图赶上全新的C11标准,几乎没有人正在使用它,并得到一本名为“#34; Cracking the Coding Interview" Gayle Laakmann,在其他珍珠中,有150个小编码练习,你可能会被要求在技术面试中在白板上编码。它们都可以用C,C ++和Java来解决(他在本书的最后给出了答案,因为它更广泛地被理解,即使C会提供更简单和更优雅的解决方案)。在学习C语言的过程中学习它们,您将学习有关Good Java编程和Bad Java编程的大量知识。附:找到几个好的C引物 - 试图从原来的K& K中学习C语言。 R(Kernighan和Ritchie)手册就像忍受一个为期两天的根管。如果你读过K& R,至少找到第二版。 H& S(Harbison& Steel)是一本更清晰的教学手册。
BTW,运行Java p代码的JVM是用C或C ++编写的。答案 8 :(得分:2)
我想在其他答案中加入警告,虽然编程技巧很有价值且可以转移,但人力资源部门可能会把你的简历丢弃,因为你的简历中没有“正确”的东西。如果你通过在简历上加上一种语言来解决这个问题,你就不准备回答面试问题了,你可能不会给面试你的人留下深刻的印象。在一些公司的招聘中,这是一个很大的问题,这对公司和那些想在那里工作的人以及已经在那里工作的人来说都很糟糕。
答案 9 :(得分:2)
我会说,一般来说,成为一名优秀的PHP程序员意味着如果你花时间学习它,你很有可能成为一名优秀的ASP.NET程序员。能够编程是一种才能,学习语言主要是培训。话虽如此,我相信除了熟悉语言的语法之外,还有很多其他内容。一个好的程序员应该很好地理解可用的框架,库,特定于语言的实践等。一个ASP程序员可以在阅读一本好的PHP书之后编写PHP代码。但是为了成为一名优秀的PHP程序员,需要更深入的理解,而这种理解主要来自经验。
所以,这一切都归结于此 - 一个优秀的程序员可以学习大多数语言。问题是,你愿意让他成为一名经验丰富的程序员吗?
答案 10 :(得分:2)
技能很容易转移,但是什么使得一个人在特定语言中表现出色而不仅仅是对它的好处是他们对该语言的怪癖的深入了解。
每种语言都有其奇怪的习语,人们只能在使用该语言一段时间后才能学习。熟练使用其他类似语言确实无济于事。
即使对于那些了解ASP.NET的人来说,他们第一次切换到PHP时,仍然会有一个重要的“WTF”阶段,他们必须克服,在此期间他们会产生一些非常讨厌的代码。它可能是工作代码,但它不易维护,可能不会很好地与项目的其余部分集成。
答案 11 :(得分:1)
只要转移是在相同范例的编程语言之间,我认为它很容易转移。将C程序员转换为Java程序员是相当困难的,我认识的许多老师更喜欢没有任何背景的学生,而不是那些在学习java时具有“C”类型背景的学生。
答案 12 :(得分:1)
塑造我对任何技术(/平台/产品/语言)的态度的一个因素是学习体验的具体程度。我的同事们对MS Access非常了解,并且多年来(可变质量)建立了各种各样的定制业务系统。但尽管如此,他们对sql几乎一无所知。如果他们花了三个月的时间维护一个小的PHP / MySQL站点,那么他们将处于更好的位置(技能明智),至少开始查看Informix / Sybase / SQL Server / etc系统。
虽然学习新技术的成本可能会消退,但超出某一点。在PHP / VBscript之间切换我在学习两者时都觉得非常恼火,因为常规的简单变化(例如使用“;”)增加了学习过程中不需要的额外烦恼。最近我不得不在C#,Perl和VBScript之间进行相当多的切换,这不是问题 - 你可以遵循每种语法的规则而不考虑它。
答案 13 :(得分:1)
错误的问题,我想。这是框架之间的编程技巧的可转移性。 asp经典开发人员和jsp开发人员可以读写彼此的代码。 Java Server Faces和ASP.NET也是如此。正如我在目前的项目中所知,C#winforms开发人员可能很难将他的才能转移到C#ASP.NET项目中。语法是主流编程语言的一小部分(我正在抛弃像Prolog和F#这样的古怪的游戏,它们的代码方法与卷曲语言家族有着根本不同的方法)
答案 14 :(得分:1)
PHP和ASP.NET可能类似,但PHP和C#非常不同,如果您使用的是C#3,那么学习曲线非常清晰。如果程序员可以做前端工作那么这将不是什么大问题。
现在,语言之间的知识是如何可转移的,因为它取决于语言是否是相同类型的编程(结构,功能,面向对象)。例如,一个优秀的C程序员可能不会将他的知识转移到OOP或FP,因为接近设计的方式是如此不同。
答案 15 :(得分:1)
这取决于。如果某人具有强大的技术背景,才能和热情,那么选择新的语言或领域应该相当容易。我的意思是计算机科学的重点 - 事情每天都在变化,每个优秀的程序员都应该能够适应。
答案 16 :(得分:0)
如果你在编程方面给自己一个良好的教育。我的意思是你已经完成了很多编程,了解了cpu在低级别所做的事情,理解算法和运行时复杂性,并善于解决问题。
我认为有些语言的学习曲线仍然很长。你可能会进入一个C ++程序员团队并在没有任何经验的情况下帮助他们,但你肯定会经常与它的黑暗丑陋角落对抗。
像sql或python这样的高级语言可能看起来很容易进入,但是具有多年经验的人会理解那些在面值上不明显的技巧,无证件特征和陷阱。
答案 17 :(得分:-1)
这些技能很容易转移,但是使一个人精通某种特定语言而不是行之有效的原因是他们对该语言的怪癖有深入的了解。每种语言都有其奇怪的习惯用法,只有在使用该语言一段时间后才能使用。