首页 程序人生 成为伟大程序员的 10 个要点

成为伟大程序员的 10 个要点

最近我在接受采访时被问到我关于成为一名伟大程序员的见解。这是一个有趣的问题,我认为我们都可以是伟大的程序员,无论我们的天赋如何,如果我们遵循一些规则的话——我相信——这应该是常识。实际上,这些规则并不只适用于编程领域,也适合任何专业。

当然,这10个要点中的所有内容并不都是完全正儿八经的,有些事情只是我的看法,你的情况可能会有所不同,所以如果出现矛盾的话,不要耿耿于怀。

这些要点是:

1.学习如何提问

提问题的程序员基本上有这些类型:

  • 完美主义者:特别是在询问关于某些开源工具的问题时,他们可能已经通过代码进行了调试,发现了问题的真正原因。但是即使没有发现真正原因,完美主义者也会讲明白这个问题,重现步骤,建议可能行得通的解决方法,或者甚至是,建议可能行得通的修复途径。事实上,完美主义者没有问题。只有答案。
  • 话匣子:这个人实际上没有问问题。他们表明他们的想法,有时会到处放置浮夸的问号。对于问题,他们给出的是他们的思路流程,如果你揣着答案等的话,他们要么自己找到了答案,要么在多封电子邮件之后才问出真正的问题。“哦,对了,我发现这个需求是完全错误的,我用一些其他的技术解决了这个问题。实际上,我完全改变了库。”呵呵。只希望他们别再问问题了。
  • 笨蛋:代码在这。我不知道哪里出错了?请帮帮我。
  • 经理:对于这种类型的人,时间就是金钱。问题一定很短,答案越快越好。令人令人啼笑皆非的是,因为保持问题简短(意即:不完整,不简洁),大多数情况下,会丢失很多重要的细节,然后为了解答问题,程序员只能请求更多细节。所以,经理(自然会失望,因为他得到的并非是一个答案而是一个新的问题)会再次发送一个短的讯息,并且更紧急地要求答案。循环往复。最后可能需要1-2周的时间才能解答。
  • 抱怨者:这类人不问问题。他们一直一直抱怨,直到问题消失。如果情况没有变好,那就有了更多的理由抱怨。

现在应该清楚的是,一个精心准备的问题(简明扼要,简单,简短,但有足够的细节)将会产生更佳的答案。如果你确切知道对于该问题你需要学习什么,那么更有可能得偿所愿。

2.学习如何不提出问题

实际上,最好尽量避免提问。或许你可以自己弄清楚呢?当然情况并不总是如此。许多事情你根本无法知道,通过询问领域专家,有助于找到抵达成功最快和最有效的途径。但是,经常自己去尝试解决问题有很多好处:

  • 通过这种艰辛的方法学到的东西能够更好地保存到记忆中——我们将牢牢记住所学到东西。
  • 自己去寻找答案更有价值。
  • 你不会制造“噪音”。还记得前面所说的“话匣子”吗?除非你询问的人有责任回答问题(从而推迟他们的工作),否则他们可能会在不了解你的思维过程的情况下,来尝试回答每一个不完整的“问题”。这对任何人都没有帮助。
  • 通过推迟问问题(至少一段时间),你可以收集更多的相关信息,然后提供给可能能够回答问题的人。想想“完美主义者”,他们首先花更多时间寻找细节,然后自己解答问题。
  • 通过训练你可以更擅于提问。这需要时间。

3.不要遗留破碎的窗户

最近有一篇非常有趣的文章,是关于不要留下破窗户的。文章的本质是永远不要妥协于质量。永远不要成为逃兵。永远不要遗留…破碎的窗户。以下引用自这篇文章:

“当我们采取一些捷径在最短的时间内提供一些东西时,反映了我们的粗心大意的代码会让我们之后的开发人员(来自同一个团队,未来的团队,甚至我们自己!)得出一个重要的结论:对我们所生产的代码付出足够的关注并不重要。应用程序渐渐开始恶化将是一个不可阻挡的过程。”

其实,这并非意味着要成为一个完美主义者。有时,修复破碎的窗户是可以推迟的。但是,通常情况下,对于允许窗户被打破和保持打破状态,没有人会觉得开心。我们程序员不开心,我们的客户不开心,我们的用户不开心,我们的项目经理也不开心。这是一种态度,是作为专业人士的核心内容。Benjamin Franklin怎么看呢?

“低价格的甜蜜被遗忘之后,低质量的苦涩将回味悠长。”

一切都是如此。“低价”是我们用一种草率的方式来实现某些东西而获得的快速胜利。

4.软件应该是确定性的。这就是要瞄准的目标!

在理想化的世界中,软件中的一切都应该是“确定性的”。我们都应该是函数式程序员,编写没有副作用的纯粹的函数。如String.contains()。无论执行以下操作多少次:

assertTrue("abcde".contains("bc"));

…结果总是相同的,都是预期的结果。哪怕宇宙爆炸对这一计算也没有影响。这是确定性的。

我们也可以在我们自己的程序中,而不仅仅是在标准库中做到这一目标。我们可以尝试尽可能多地编写无副作用的确定性模块。这真的与我们选择什么技术无关。确定性编程可以用任何语言完成——即使函数语言有更多工具也可以通过更复杂的类型系统来防止意外的副作用。但是我所示的例子是一个Java示例。对象方向允许确定性。对的,像PL / SQL这样的程序语言允许确定性。如果要在索引中使用函数,那么需要请求确定性的函数:

CREATE INDEX upper_first_name ON customer (upper (first_name));
-- Deterministic function here: -----------^^^^^^^^^^^^^^^^^^

这又是一个规则问题。有副作用的过程/方法/“函数”是为“破窗户”。有副作用也许会更容易维护,当然希望最终可以消灭副作用。但这通常是自己骗自己。当将来的某一天意外突现的时候,就是你付出昂贵代价的时候。别不相信,说曹操曹操就到。

5.接受意料之外的事情

程序员始终应该遵守墨菲定律。一切都可能被打破。并且它即将被打破。作为软件工程师,我们应该谨记它是会破掉的。因为我们的世界是不确定的,所以我们正在实现的业务需求也是不确定的。我们只有在终于能够确定的时候,才能实现技巧#4(确定论)。否则,我们将不可避免地进入不确定论的世界(也就是“现实世界”),即一个将会出错的世界。所以,要以此为基础。接受意料之外的事情。训练你内心的洪荒之力,从积极的角度预见各种麻烦。

当然,如何以简洁的方式写代码来预见各种麻烦就是另一个故事了。如何从那些可能会失败的东西(因此不需要处理)中辨别那些将会失败的东西(因此需要处理),还是需要通过一些实践滴。

6.不要货物崇拜。不要教条主义。始终具体情况具体对待。

所有教给你的内容都存在潜在的错误。即使是那些流行语。引用一句很不错的话:

“我的职业生涯至少有50%是为了帮助或解脱由教条主义引发的一个个灾难。

我们的职业充满了虚假。我们喜欢把自己当作数学家,坚持最纯粹的思想,认为它们一定是正确的。

那是一条歧路。我们的职业构建在数学的基础之上,但除非你进入范畴论或关系代数的时髦世界(即便你真的进入,我也怀疑一切是否是“正确的”),否则你就得面对现实世界务实的业务需求。好吧,坦率地说,这离完美还有十万八千里。让我们来看看一些最流行的编程语言:

  • C
  • Java
  • SQL

你真的觉得这些语言一点都不像数学吗?行,不如我们先来讨论段错误,Java泛型和SQL三值逻辑。这些语言是由实用主义者建立的平台。所有这些都有一些非常酷的理论背景,但最终,还是有了这些工具。

对于建立在语言之上的所有东西也是如此:库,框架,设计模式,甚至架构。没有什么是对的或是错的。一切都是为某些上下文设计的工具。想想在其上下文中的工具。永远不要把这个工具当成一个独立的理由。我们不是“为艺术而艺术”。

所以对这些质疑说不:

  • XML
  • JSON
  • 功能编程
  • 面向对象编程
  • 设计模式
  • 微服务
  • 三层架构
  • DDD
  • TDD
  • 实际上:*DD
  • 不胜枚举

所有这些都是某些给定上下文的好工具,但并不总是如此,要学会具体情况具体对待。保持好奇心,开发创造力,知道何时才需要使用这些工具,将有助于你成为一个更优秀的程序员。

7.就是干

这是真理。话说,总有一些牛人出类拔萃,能够傲视群雄,让人鞭长莫及。

但大多数程序员只达到“好”的级别,或是有潜力达到“好”的程度。那么怎么才能成为一名好的程序员呢?正如罗马不是一天建成的,伟大的软件也不是一天可以写成的,受欢迎的人并非我们这个时代唯一的英雄。我遇到过许多默默无闻但伟大的程序员,他们孜孜不倦地攻克软件难题,解决了许多小公司隐蔽的问题。

伟大的程序员都有一个共同点:遇到问题就是干。练习,实践。每天都致力于工作与学习,然后变得越来越优秀。

想要更擅长SQL?那就干吧!每天都尝试用一些新功能编写一个SQL语句。使用window functions。分组。递归。分区的外连接。MODEL和/或MATCH_RECOGNIZE子句。不需要每次都交付生产,就是为了实践。这些都是有价值的。

8.专注一个主题(从长远的角度)

可能只有很少一部分“优秀的”全栈开发人员独领风骚。事实上,大多数全栈开发人员都将位于中间水平。当然,一个小团队可能只需要几个全栈开发人员,就可以涵盖很多业务逻辑,快速推出一个新的软件。但是,软件将非常笨拙,“马马虎虎能工作”。也许这对于只要可行即可的产品阶段来说就已足够,但从长远来看,会导致全栈开发人员将没有时间来正确分析(或预见!)更复杂的问题。

主要专注一个主题,并真正擅长这个方面。真金不怕火来炼,只要你有本事,那么走到哪里都需要。所以,致力于你的职业生涯,做一些真正好的东西,而不是“差不多就行”。

9.涉猎广泛

虽然你应该主要关注一个主题,但不应该完全遗忘其他方面。你永远不能马上真正擅长SQL、扩大、扩展、低级性能、CSS、面向对象、需求工程、架构等等的所有内容(见技巧#8)。这是不可能的。

但你至少应该明白它们每一个的本质。你需要明白何时SQL是正确选择(以及何时不是)。何时低级别性能的调整很重要(何时不是)。CSS原则上如何工作。面向对象、FP优点。等等。

你应该花一些时间涉猎这些(以及更多)概念和技术,以便更好地了解它们的重要性。知道何时应用它们,然后再找专业人士来实际执行工作。

涉猎新的范式和技术,有助于你用全然不同的思维方式思考,可能你会在以后的日常工作中不自觉地以某种方式用到它们。

10.保持简单,傻瓜式

爱因斯坦曾说:

“Everything should be made as simple as possible, but no simpler.”
(“任何事情都应该尽可能简化,直到没法再简化为止。”)

没有人能够处理巨大的复杂性。在软件中不能,在生活的任何其他方面也不能。复杂性是好软件的杀手,因此简单性是使能者。易于明白。难于实现。你需要大量时间和实践才能识别和生产出简单。当然,你可以遵循许多规则来实现简单化。

最简单的规则之一就是使用只有几个参数的方法/函数。让我们来看看吧。前面提到的String.contains()方法就是如此。我们可以写”abcde”.contains(“bcd”),不阅读任何文档,每个人都能立即了解这做什么以及为什么。该方法做了一件事情,并且只做这一件。没有复杂的上下文/设置/其他传递给该方法的参数。没有“特殊情况”,也没有任何警告。

此外,在库中简化比在业务逻辑中要简单得多。那么我们能实现吗?也许吧。通过实践。通过重构。但像伟大的软件一样,简单性也不是一天可以搞定的。


站心网

最近我在接受采访时被问到我关于成为一名伟大程序员的见解。这是一个有趣的问题,我认为我们都可以是伟大的..

为您推荐

程序员职业发展与技能要求

程序员是从事计算机程序开发、维护和优化的专业人员。他们通过编写代码,设计软件系统,解决技术问题,推动技术创新。以下是程序员的一些关键信息:核心技能编程语言:掌握如Python、Java、C++、JavaScript等语言。..

程序员离职时删除代码注释算违法吗?

程序员离职前删除代码注释是否违法,取决于多个因素,包括雇佣合同、公司规定、法律条款以及删除行为的动机。以下是几个关键分析点:1. 合同与公司规定劳动合同或保密协议:如果合同或公司规定明确要求代码的完整性..

创造型职业程序员的无奈

编程是为数不多的一种既能满足个人爱好,又能赚钱的职业之一。烹饪是另一个这样的例子。在一般情况下,大多数职业要么不可能让你待在家里(例如医生和电工),要么你没有兴趣在家里做(例如清洁)。同样的,大多数好..

程序员副业探索之电商

目录一、小程序化妆品1.1 小程序准备(营业执照&微信支付&小程序appId)1.2 小程序开发二、拼多多电商三、跨境电商四、总结在腾讯广告工作期间,我主要负责小程序电商与广告业务,见证了互联网电商行业的剧变,特别..

谈程序员如何做好业务

前言技术能做两种事情,通过技术实现业务和通过技术支持技术。我们大部分时候做的是前者,养活我们的大部分也是业务。 近两个月,作为项目负责人角色从0到1经历了新项目的几个版本迭代,跨入了部分新领域,也有一定..

程序员增加收入的几种方法

在这个互联网飞速发展的社会,学会如何make money很重要。咱们是个俗人,赚钱才是社会生存的头等大事。这不是高山流水的世界,而是能力创造财富,对于程序员来说,更是如此。作为程序员,我们有更多挣钱的姿势,注意..

程序员跳槽到对手公司,被前老板设计陷害

这件事发生在2007年,我就职的第一家公司。今天把它整理写出来,希望它对程序员有一个警醒的作用。永远要记住,程序员的世界除了有代码,还有被套路。资深工程师的苦恼第一天到公司,是浩子带着我办理了入职手续。浩..

程序员如何提一个好问题

提出好的问题是在编写软件时的一个非常重要的技能。这么多年来我对此也算略有小成。这里有一些我用着觉得很棒的指导方针!开始我实际上是那种总是会问出愚蠢问题或“不好”问题的大信徒。我一直在问人们一些愚蠢并且..

我是李玉宝,我是个程序员!

听说今天我的名字很火,那我也来凑个热闹。在2015年的时候,我做过一次人生总结,当时写了:为了理想,我放弃了一切! 转眼到了2019年,说说最近一年多的一些事情吧!做的好的!坚持把权限管理框架OpenAuth.Net做了..

程序员失业日记1:工作五年,交接半天

最近发现越来越多的小伙伴被公司裁员,有的是因为公司业绩不景气被裁员,有的是因为压力太大离职。很多公司都在裁人、减员。找工作也比之前难。刚好去年我也被上家裁员了,正好做一个系列的日志,希望能帮到在找工作..

改善程序员生活质量的 3+10 习惯

一封离职邮件2017年的一天,代码伴随着手指极具节奏感地输出在IDE上,突然某Chrome插件弹出一封邮件提示:“今天是我在ThoughtWorks的最后一天”。遇到这种离职邮件,我都会点进去,一来看看是否是自己曾经共事的小..

倾听程序员的心声真的很重要

说到开发产品,没有人比程序员更了解产品。程序员知道产品的优点、缺陷、用途和潜在用途。说起这些,程序员了如指掌,如数家珍。在这个似乎无所不在的数字时代,倾听程序员必须要说的内容非常重要,而且也许比以往任..

助力程序员成功的几个好习惯

老实说,如果你google搜索“程序员的好习惯”这方面的内容,那么就会有很多大同小异的文章映入你的眼帘。但是今天我想从一个略有不同的角度来探讨这个主题。不是关于如何更擅长编程,而是如何使程序员更有市场竞争力..

倔强的程序员

对于程序员来说,大多数人公司都有技术和管理两条发展路线,通常在同一家公司,管理路线的发展可能性,要相对广阔一些;但是技术路线也有技术路线的好处,比如相对而言更依赖于硬实力,因而工作机会丰富。我相信有不..

程序员如何在当今就业市场中让自己脱颖而出

俗话说,钱不是万能的,但没有钱是万万不能的。可见钱对于生活的重要性。不管你从事什么职业,实现财务自由才能让你无所畏惧地应对挑战。但是还有一点是值得开发人员所关注的:如何脱颖而出与众不同。毫无疑问,软件..

领域驱动设计,让程序员心中有码(七)

-设计原则和设计模式,互联网开发者们共同的追求 前言多年来,笔者一直从事传统软件企业的软件开发和项目管理工作。笔者发现在众多的传统软件企业中,评判优秀开发者的标准往往是技能的熟练程度,基本上都是以梭代码..

如何成为一名成功的程序员

编程是一个仅靠兴趣仍不足以抵达成功彼岸的领域。你必须充满激情,并且持之以恒地不断汲取更多有关编程的知识。只是对编程感兴趣还不足以功成名就——众所周知,我们工作起来像疯子。编程是一个没有极限的职业,所以..

写作路上的这些小成绩,铸就了一个不平庸的程序员

01 好的写作平台可以加速我们的成长“路漫漫其修远兮,吾将上下而求索”,在写作这条漫漫长路上,我已经求索了将近5年的时间;在这5年时间里,有过兴奋,有过迷茫,但幸好,我未曾放弃。2014年的4月初,我在ITeye(..

程序员如何讲清楚技术方案

最近在评审技术方案,和代码review的时候,遇到刚入行的同学们,很多都讲不清楚技术方案。具体表现是:上来不说需求,直接说算法实现。台下一头雾水,根本不知道设计方案是否合理。描述完需求后,又直接看代码,看表..

排除万难,我终于入了程序员的坑

“恭喜你,成功的避过了所有的正确答案,选择了错误答案”。没错,我是一个数学专业的普通大学生,排除万难,我终于还是入了程序员的坑。1. 生活爆锤了我一顿我是一个平凡的人,人生也一直都是平淡且稀里糊涂的!像..

发表回复

返回顶部