我最近在接受采访时被问如何成为优秀程序员。这是一个有趣的问题,我认为如果我们应该遵循一些准则 - 我相信 - 无论我们的天赋如何,我们都可以成为伟大的程序员。事实上,这些准则不但适用于程序员,而且适用于所有专业人士。
这些类型的程序员提出问题时的情况:
到目前为止,应该清楚的是,一个准备充分的问题(简洁,但有足够的细节)将产生更好的答案。
事实上,大多数情况下,最好避免提问。我们可以自己搞清楚。当然,并非总是如此。许多事情,根本无法得知,通过询问领域专家,你会找到最快捷,最有效的成功之路。但通常,尝试自己学习有一些好处:
Reddit最近发表了一篇非常有趣的文章,是关于破窗效应的。文章的意思是永远不要在质量上妥协。永远不要变成懒人。这是文章的引用:
“当我们采取某些捷径来在最短的时间内交付一些东西时,我们的代码会反映出我们的粗心大意,我们的开发人员(来自同一个团队或者未来的团队)会想:我们生产的代码质量差一点马虎一点没关系。一点一点地,我们的应用程序将开始不可阻挡地恶化。“
事实上,这不是为了完美。有时,破窗效应可能会被推迟。但通常情况下,允许窗户被打破并保持断裂,我们会产生一种没有人重视的感觉。不是我们的程序员,不是我们的客户,不是我们的用户,不是我们的项目经理。这是一种态度,因此是专业的核心。本杰明富兰克林怎么说呢:
“在低价的甜蜜被遗忘之后,质量低劣的苦味仍然存在。”
这对所有事情都是如此。
在理想的世界中,软件中的一切都是“确定性的”。我们都是功能性程序员,编写无副作用的纯函数。像String.contains()。无论你执行以下操作多少次:
assertTrue(“ABCDE” .contains(“BC” ));
预期的结果总是相同的。所有状态将对此计算完全没有影响。这是确定性的。
我们也可以在自己的程序中这样做,而不仅仅是在标准库中。我们可以尝试尽可能多地编写无副作用的确定性模块。这并不是我们选择何种技术的问题。确定性编程可以用任何语言完成 - 即使功能语言有更多工具可以通过更复杂的类型系统防止意外的副作用。但我展示的例子是一个Java示例。面向对象允许确定性。像PL / SQL这样的过程语言允许确定性。如果要在索引中使用函数,则要求函数是确定性的:
CREATE INDEX upper_first_name ON customer(upper(first_name));
-- Deterministic function here: -----------^^^^^^^^^^^^^^^^^^
所以,这是一个规范问题。
墨菲定律是我们程序员应该始终关注的东西。作为软件工程师,我们知道它程序会出现意外或者会出错。因为我们的世界本来就不是确定的,所以我们正在做的业务要求也不是。我们会不可避免地进入非决定论的世界(“现实世界”),那里的东西会出问题。所以,不要畏惧。训练你内心的悲观主义来预见各种各样的事情就行。
很多程序员喜欢将自己视为数学家,只有最纯粹的思想才能存在,而且他们必然是正确的。
但那是错的。我们的专业是建立在数学上的,但除非你进入类别理论或关系代数的世界,不然我们就处于现实世界商业要求的实用世界。坦率地说,这非常不完美。让我们看看一些最流行的编程语言:
你是否真的认为这些语言真的只是偏向数学?如果是这样,让我们讨论分段错误,Java泛型或SQL三值逻辑。这些语言是实用主义者构建的平台。所有这些都有一些非常酷的理论背景,但最终,他们必须完成这项工作。
建立在语言之上的所有东西都是如此:库,框架, 设计模式,甚至架构。没有什么是对的或错的。一切都是为某些环境设计的工具。在其上下文中考虑该工具。永远不要将该工具视为一个独立的存在理由。我们不是为了艺术而艺术。
所以,不要怀疑:
鉴于某种情况,所有这些都是很好的工具,但它们并不总是成立。通过保持好奇心,你将成为一个更好的程序员,并知道何时使用这些工具中的哪一个。
你怎么能成为一名优秀的程序员?通过实践。伟大的软件不是一天写成的,受欢迎的人不是我们这个时代唯一的英雄。我遇到了许多没有人知道的优秀程序员,因为他们过着私人生活,解决小公司的问题。
但优秀的程序员都有一个共同点:他们会去实践。他们会练习。他们每天工作以变得越来越好。
想要在SQL上变得更好?做吧!尝试每天编写一个带有一些新功能的SQL语句。使用窗口功能。分组集。递归。分区外连接。MODEL和/或MATCH_RECOGNIZE子句。它不必每次都使用,但这种做法是值得的。
可能有极少数“优秀”的完整堆栈开发人员。但相比之下,大多数完整的堆栈开发人员都是比较平庸的。当然,一个小团队可能只需要其中的一小部分,他们可以涵盖很多业务逻辑,以快速启动一个新软件。但是一切都会非常草率。也许这对于最小的可行产品阶段来说已经足够好了,但从长远来看,会有更复杂的问题,全栈开发人员没有时间进行正确分析(或预见!)。
你应该关注一个方向,并且做好它。
虽然你应该主要关注一个方向,但你不应该完全忘记其他方向。你不可能深刻理解全部的SQL,扩展,低级性能,CSS,面向对象,需求工程,架构等等(见提示#8)。这是不可能的。但你至少应该理解每一个的本质。你应该了解SQL何时是正确的选择(何时不是)。低级别性能调整很重要(如果不重要)。CSS原则上如何工作。面向对象,FP等的优势。
你应该花一些时间玩一下这些(以及更多)概念和技术,以更好地理解它们为什么重要。知道何时应用它们,然后找一个专家来实际执行工作。
通过使用新的范例和技术,你会开始思考完全不同的思维方式,并且很有可能,你将能够以这种或那种方式在日常工作中使用它。
爱因斯坦说:
“一切都应尽可能简单,即使他们并不简单。”
没有人能够处理巨大的复杂度。不单单是软件方面,还包括生活的任何其他方面。复杂度是好程序的杀手,因此简单性对好程序帮助很大。这很容易明白。但难以实施。简单是需要花费大量时间和实践才能识别和生成的东西。
最简单的规则之一是使用只有少量参数的方法/函数。我们来看看。String.contains()方法是合格的。我们可以编写"abcde".contains("bcd")
并且无需阅读任何文档,每个人都会立即了解这是什么以及为什么。该方法只做一件事。没有复杂的上下文/设置/其他参数可以传递给方法。没有“特殊情况”,也没有任何警告。
同样,在库中生成简单性比在业务逻辑中实现简单要容易得多。我们能实现吗?也许可以。通过练习。通过重构。但就像优秀的软件一样,简单性不是一天就建成的。
原文标题《10 Tips on How to Be a Great Programmer》,
作者: Lukas Eder
译者:我就静静地看
不代表云加社区观点,更多详情请查看原文链接
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。