我看到很多招聘启示上的一些要求:熟练掌握 Python,熟练掌握 Java,熟练掌握 C。但你是否可曾想过,到底要怎样才算『精通』或者『掌握』?
很多招聘启事都将编程语言直接放在职位标题中,或将编程语言作为重要的一项要求,还将它放入职位描述的某个地方。我认为,这种做法是对程序员与其开发能力之间关系的误解而导致而成。
从某种意义上说,语言彼此之间的分离程度还不够高,因此需要不同的工作以及每个人的职业。
如果想在不同的编程工作之间划定一个『技术鸿沟』,要分为劳动密集型工作,还是更高水平的工作,但无论程序员在工作中使用何种编程语言,都不应该有“Java 开发人员”或“React 开发人员”这样的说法,应该只有一种类型『软件开发人员』。程序员对编程语言的了解程度是不能通过标签说明的,甚至我觉得根本不可能真正『掌握』一门编程语言。
『掌握』一门编程语言,是不可能的
从某种意义上说,编程语言之间并没有严格的区分,不足以给每种编程语言都设置一个职位。如果非要根据不同的编程工作区分技术,那么也应该从更高维度和层面来考量,或者应该根据程序员与硬件的关系来定义,例如底层系统开发、Web开发以及Shell数据处理等等。
即使在更广泛的类别上,需要丰富经验的想法也往往是在其它地方出现,因此很难说能胜任某个角色的人无法胜任其它角色,比如算法复杂度问题(只要不是直接调用库),比如并发进程,以及大量人员同时开发系统所带来的问题(如版本控制)。这种编程工作的特点就是,无论如何定义职位,即使是完全无关的职位之间,也不会存在太大的差别,而这个特点在编程语言的底层划分上尤其明显。
对于这个看法,最常见的回应是,无论使用不同语言解决问题是否存在概念上的相似性,探索一种编程语言、甚至是一种语言的框架(例如 React)本身就很复杂也很耗时,招聘程序员的公司需要承担这笔费用。所以他们宁愿雇佣一个曾在某个项目中使用过 Kotlin 的程序员,也不愿雇用一个更有能力但从未接触过这门语言的程序员。
这种想法对程序员是不公平的,对公司来说也不公平。虽然遇到不熟悉的语言,这些程序员会要花一些时间阅读代码和熟悉语言,但如果他们有更好的解决问题的能力,这部分时间完全能找补回来。因此从长远来看,他们对公司的价值更高,而且这段时间也并不长,我保守估计最多一年。
在软件研发领域,所有问题都是创造性的而非描述性的
其实,这种观点之所以如此流行,原因不难理解。
人类解决软件问题的能力不像在物理世界中解决问题那样具有专业性,其专业程度就像是每家每户的家用电器与电力系统中每个部件之间的差别一样。
例如,医生需要花费数年时间专注研究人体内的一个特定器官,但这些角色解决的问题都是描述性的,而不是创造性的。医生最有价值的能力是他们对人体的掌握程序,就像汽车修理工对汽车工作原理的了解一样。他们面临的问题可以直接用这些知识来处理,他们解决问题的能力与他们拥有该领域的知识量直接成正比——然而,软件行业并不存在这此正比例的关系。
软件开发能力不会与使用某种语言的熟悉程度直接挂钩,因为编程语言只是一种工具,而不是他们正在努力解决的问题。程序员需要解决更大的问题,即在有限时间内只能获得有限的信息,以及怎样利用这些信息实现特定的结果。
这此不是遇到问题时仅凭记忆就能解决的。
当然,并非所有与物理世界打交道的职业都有相同的特征,即一个人所拥有的物理对象知识直接关系到解决问题的能力。比如,建筑师和艺术家了解建筑材料、环境和画布的一切,但不一定就能表现出更高的水准。这是因为他们面临的问题也是创造性的,而不是描述性的。
也就是说,为了实现想要完成的目标,他们不能参考已有的成果,而是需要参考宇宙设置的自然限制。他们解决问题不是通过理解出现问题的对象,而是理解可以采取行动的领域。在软件开发领域,所有问题都是创造性的而非描述性的,且这个领域是无限的。
问题本身就是自然而然的,特别是在软件开发中,而自然就是数学而非物理。
我了解 编程语言,但我一个也没有『掌握』
经常有人问我『掌握』了哪门编程语言,我只能说所有编程语言我都了解 ,但我一个也没有掌握,是让这些人失望了,他们甚至希望我说『精通』。
可能我只需要一些文档和一点时间,就可以像其他人一样『流利』地使用手头的编程语言。但编程语言并不是自然语言,不能通过流利度来衡量。如果非要用流利度来衡量编程语言,那么应该指的是一个人达到可以熟练使用语言的复杂细节(例如语法,特殊用例)所需的时间。
而这些完全不同于自然语言:在自然口语中,流利度指的是对底层结构的理解,其变化范围远大于编程语言。从我们向计算机传达思想的方式来考虑,计算机的同质化远远要高于人类。
通过对某种语言的掌握程度来衡量程序员的人,通常对软件开发技术不太了解,但恰好他们就是许多组织中负责招聘技术人员的人。
让每个人都更加了解、受益于软件工程与其他类型工作的根本区别,这样才能做到利他又利己。
作者:Rodney Lafuente Mercado 原文链接:https://rodneylafuente.com/jekyll/update/2023/03/29/you-can%27t-know-a-programming-language.html
本文为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。