我怎么知道我是否是一个优秀的程序员?


301

像大多数人一样,我认为自己在这个领域比平均水平高一点。我收入丰厚,获得晋升,而且从未遇到过获得良好推荐或找到工作的真正问题。

但是我到处都足以注意到我工作过的许多最糟糕的程序员都以为他们是最好的。被其他不良程序员包围的不良程序员似乎是最自欺欺人的。

我当然不完美。我确实会犯错。我确实错过了最后期限。但是我认为我做出的动作与“其他优秀程序员”所做的动作相同。问题是我将“其他优秀程序员”定义为“与我一样的人”。

因此,我想知道,程序员有什么方法可以进行某种合理的自我评估?我们怎么知道我们在工作上是好是坏?

或者,如果条件一样坏的太不明确,如何能程序员诚实找出自己的长处和短处,使他们能够采取前者的优势,努力提高后者?


你为什么想知道?没有人能定义“好”是什么。如果您按预期完成了工作并获得了丰厚的报酬,那就足够了。
Mert Akcakaya

Answers:


325

一个好的程序员知道他们必须继续学习和成长。他们竭尽全力,承认失败并向他们学习。

他们非常交流。他们不仅能够向外行人员解释复杂的技术术语,而且还竭尽所能地扮演自己的想法的魔鬼代言人,以确保他们为客户提供最佳选择。

最好的程序员知道并接受,做事有不止一种方法,并不是每个问题都是钉子,而且因为总有比做计划更好的方法来做事,所以他们不断寻求学习新技术。 ,技术和理解。

一个好的程序员喜欢编程,即使他们每周已经花费80多个小时来编程,他们也会在业余时间这样做。

一个好的程序员知道自己不是一个优秀的程序员。真正伟大的程序员并不存在,只有那些声称自己很棒的人,以及那些知道自己不是伟大的人。


5
你把这个钉在头上!IMO!

13
我认为,更普遍的推论是,当您关心自己的工作时,您会擅长于自己的工作。

7
说得好。关于自我/谦卑,我是70年代通过MIT AI Lab提出的。最好的编码人员有一定的谦虚信心。如果您认为自己在做重要的事情,那可能是错的,但如果不这样做,那可能是对的。
Mike Dunlavey

4
我部分同意第2段,“他们不仅能够向非专业人士解释复杂的技术术语……”我认识一些优秀的程序员。但是他们无法向圈子外的任何人解释任何事情。他们也无法理解外行想说的话。他们俩都用“大灯鹿”的眼神看着对方。我要说的是,他们非常交流。对于您的其余观点,我将总结一下,说一个好的程序员要谦虚,并且愿意以他/她所知道的最佳方式分享他/她的知识。
IAbstract

101
“即使他们每周已经花费80多个小时进行编程,他们也会在业余时间这样做。” 摆脱这个愚蠢的说法,我将完全同意其余的说法。真正的“优秀程序员”意识到,在每周工作80多个小时时,除了空闲时间进行编程以外的其他事情对于身心健康和工作效率至关重要。

91

正如Paul Graham在此广告连播中雄辩地指出的那样,您不能这样做。只有您的同事可以告诉您。


4
这个答案比公认的答案好得多……

125
您的同事如果不称职,就无法告诉您您是否称职。他们只会认为您有奇怪的见解,并对无关紧要的主题进行激烈辩论。

2
同意,keyersoze。然后,没有人可以告诉您,您将永远不会知道,除非您找到一些新的同事。从长远来看,我认为与没有能力的人一起工作并不值得。

1
@keysersoze,但是如果我实际上不称职,我的同事可能会胜任,但我太愚蠢而无法意识到;)

1
保罗·格雷厄姆(Paul Graham)还写了一篇关于优秀程序员的文章,指出他对任命优秀程序员不知所措,因为他从未真正选择过显而易见的选择(例如Richard Stallman,Linus Torvalds等)。
David Thornley,2010年

59

我一直发现,通过做两件事来判断您的表现是最容易的。

  1. 与其他优秀的程序员一起学习
  2. 看看他们对您编写的代码有多抱怨。

当然,问题在于找到优秀的程序员,然后成为一名优秀的程序员也不只是编码。您需要能够在小组中良好地工作,但也要自己良好地工作。

现在为了讨论这个话题,我将引用罗伯特·A·海因莱因及其对这个问题的看法:

“ [踢屁股的程序员]应该能够更换尿布,计划入侵,屠宰猪,连接船,设计建筑物,写十四行诗,结帐,筑墙,设置骨头,安慰垂死的人,接受命令,发出命令,合作,独自行动,解决方程式,分析新问题,撒肥,编程计算机,烹制一顿美味的饭菜,有效地战斗并英勇地死去。专门研究昆虫。”
-来自Lazarus Long的笔记本。


12
有点让我想起了这样的话:“愚蠢的人包围着聪明的人。聪明的人包围着不同意他们的聪明的人。”
山姆·哈斯勒

我敢说这是SO上最好的Heinlein语录。

1
问题是其他程序员可能会或可能不会达到或超过您的水平,但他们可能不想侮辱您。我没有从与我合作过的三个程序员那里得到太多反馈,从其他两个程序员那里得到的反馈也很少,我认为这是“很好” ...

4
...虽然我们被定型为反社会,但其他程序员可能会通过不提供有关问题的反馈来抢先保护代码。实际上,它们可能会忽略代码实际问题,以免造成社会问题。

55

我在这些项目中占90%的情况下是3-4,而且我不能为狗屎编写代码。至少不太快。

-1为购物清单。

6
-1-有一定的算法知识,但是当有人采访您时,绝不会将所有这些东西存储在您的脑海中。那就是Wikipedia,Google和stackoverflow的目的。

1
同意该清单几乎没有用;如果您正在寻找练习,这是一个很好的想法来源,但是对于确定您是“优秀程序员”而言,它并不是很有用。“好程序员”比随意列出的态度更重要。

2
+1。尽管我不同意上面所说的内容,但我仍然认为这是一个很好的清单。谢谢您的发布。这些绝对是我评估应聘程序员的标准。而@macnnicken,它只会进入第3级。:)
EMP 2010年

38

Jeff有一个我最喜欢的关于该主题的博客文章之一。为什么我是世界上最好的程序员

“ ...要比其他任何人都要好,这不是我们的工作;我们只需要比一年前更好。”


3
我喜欢那句话,很好。以及编程的全部意义。“做得更好,每天都知道。”

1
在过去的12年中,每年我都回头看一年前编写的代码,并认为它完全不合时宜。也许我做对了!没有什么比停滞不前的程序员更糟糕的了。

28

我认为您所提问题的事实证明您不是一个糟糕的程序员,所以,我认为您已经做到了一半。:)

根据我的经验,糟糕的程序员总是认为自己是优秀的程序员。


你有多少经验?

1
我的经验与您的经验一致,这就是为什么每当我开始认为自己很好时都会感到担心。
克里斯托弗·约翰逊

21

@尼克(Dick Kruger Effect)解释了@Nick 的陈述 “错误的程序员总是认为自己是优秀的程序员...” ,该结论概括说,对某个学科了解甚少的人经常高估他们实际知道的知识。

变得有点滑稽……您认为您知道的越少,您可能做的越多。……除非您当然是一个真正的自我意识白痴。

回答最初的问题,尽管我倾向于认为您通常具有的更大影响力(而非控制力)是一个很好的指标。如果您发现其他人正在效仿您的做法,或者选择了自己的做法,那么您就走对了。


邓宁-克鲁格效应令人震惊。每当我对所做的事情感到满意时,我都想尝试并牢记这一点!

优秀的程序员不会提出问题,然后投票否决答案,因为他们不喜欢它们。他们的行为并不像他们知道新主题中的一切,当专家为他们回答问题时,他们不会否决它,因为这不是他们想要的。

我希望我早在大学时就有了关于DK的线索,那时候我就是一个很好的例子!
DarenW,2010年

18

获得最多票数的答案确实令人沮丧。基本上,它说您没有编程之外的生活。家人呢 社区?爱好?我们必须从事什么工作才能沉迷于被视为“好”的痴迷点?我真的认为我们需要对此有所了解。


2
我同意。在成为一名优秀的程序员之前,我们应该努力成为一名出色的人。

好的地方是指期限501程序员:hanselman.com/blog/...
ChrisFletcher


9

我不完美。我犯错了。我错过了最后期限。但是我认为我做出的动作与“其他优秀程序员”所做的动作相同。

仅凭这种认识就可以使您成为比大多数不良程序员更好的程序员。

许多最差劲的程序员倾向于认为他们已经知道要知道的一切,而没有意识到自己的局限性。结果,他们从不提高自己的技能。


9

如果您看一年前的代码,然后想,我可以做得更好,那么您可能很好:)。


我只是看了看我的世界程序,然后想到,现在它效率更高了,好吗?jks jks

9

这是一些不良编程的现实示例。当然,在100个地方都复制/粘贴了类似的代码。盖伊被解雇了,但我听说他又得到了一份不错的工作。请享用:

一种)

if (! TableObject.loadList("sql condition").isEmpty()) {  
    List<TableObject> myList = TableObject.loadList("sql condition");  
    ...  
}

b)

public static Type getInstance() {  
    if (instance == null) {  
        return new Type();  
    }  
    return instance;  
}

C)

getForeignKeyObjectProperty1() {  
    return ForeignKeyObject.loadByPrimaryKey(foreignId).getProperty1();  
}  

getForeignKeyObjectProperty2() {  
    return ForeignKeyObject.loadByPrimaryKey(foreignId).getProperty2();  
}  

...

getForeignKeyObjectPropertyN() {
    return ForeignKeyObject.loadByPrimaryKey(foreignId).getPropertyN();
}

d)

public boolean isHasImage() throws SQLException {
    StringBuilder query = new StringBuilder();
    query.append("select user_name");
    query.append(" from user");
    query.append(" where has_image = 1");
    query.append(" and user_name ='"+getUserName()+"' and user_image is not null");
    Connection c = Database.getInstance().getConnection();
    Statement st = c.createStatement();

    try {
        ResultSet rs = st.executeQuery(query.toString());
        if (rs.hasNext()) {
            return true;
        } else {
            return false;
        }
    } finally {
        st.close();
    }
}

如果您编写此类代码,请停止编程。如果您在此代码中看不到任何奇怪的地方,请停止编程。否则你还不错,所以你甚至可能还不错:)

编辑:要回答评论:我毕业之前就得到了工作,这个家伙已经有几年的编程经验。我受雇后的几个月他被解雇了,所以我无法任教任何人。上面的例子只是我脑海中的一切-他所接触的所有代码和平都以各种富有想象力的方式存在缺陷。在他离开公司后,大多数东西都开始泛滥,因为只有那时其他人才能看到代码的某些部分。他通常是一个好人,喜欢和其他人聊天。但是他永远不会成为一个好的程序员,就像我永远不会成为一个好的画家或作家一样。

与另一个例子形成对比,那个时候取代他的家伙当时也是本科生。他学习过以管理再编程闻名的大学。从某种意义上来说,他并不是太怪异,他可以编写任何有趣的东西,或者可以坐在家里阅读有关Java或编程的知识,但是他做得很好。他迅速调整并开始生成有用且可维护的代码。有些人可以这样做,而其他人则不能,只需每天询问。


11
任何人都可以发布任意代码,并声称不理解该代码的人是愚蠢的。我将站在哑巴行中。

20
一个好的程序员本来会花时间(也许2分钟?)向他/她的同事解释这样的代码出了什么问题。

4
同意,一个好的程序员会指出为什么这段代码“不好”,并且可以帮助他的同事变得更好而不是嘲笑他。

7
我希望那家伙找到一份工作,他的同事帮助他成长而不是责骂他。
罗伯特·

8
@Morph:instance字段从未分配Type实例,因此始终保持null=)
missingfaktor 2010年

8

您可以尝试一些方法,以更好地了解堆叠的方式。

  • 比较代码评论。看看谁的评论发现了更多问题。
  • 询问他们最后一次阅读与正常学习课程无关的书的时间是什么时候。然后问问自己同样的事情。
  • 问问自己,谁为公司带来了新的想法(以及它们如何运作)。
  • 最后(也是最不重要的),是否存在某种形式的公司认可?

(我之所以这么说是因为在我的上一家公司中,有一个程序员在三年中两次获得“年度开发人员”奖。他离开后,我们发现了至少20篇值得TDWTF认可的代码片段。他开发代码的速度很快,但不一定很好管理层只是不知道区别。)


1
为“比较代码评论” +1。这似乎是一件新颖且非常实用的事情。
j_random_hacker 2009年


6

你能听懂吗?

if(rp->p_flag&SSWAP) {
	rp->p_flag =& ~SSWAP;
	aretu(u.u_ssav);
}

:-)


改装下来??!?!!?!?!有人不知道他们的历史。:-)
伊恩·霍尔德

5
您不应该理解这一点

这是对某事的引用吗?无论如何,如果是C / C ++代码,则可能在第二行表示的是“&=”而不是“ =&”。(我之所以说“可能”,是因为通过在C ++中重载operator〜()可以使上面的代码编译……但是我很确定那不是您想要的。)
j_random_hacker 2009年

1
@j_random_hacker我怀疑=&是正确的,因为此代码是由Dennis Ritchie编写的。参见cm.bell-labs.com/who/dmr/odd.html
伊恩·霍尔德

1
@ IainMH,dmr也承认这是越野车。

4

仅仅想到您需要自我评估就可以使您胜过其他人。

我总是判断自己的一种方式是听同事对我的评价。技巧是找到合适的人。


4

谁是优秀的程序员总是主观的。我同意尼克的观点,只是问这个问题是朝正确方向迈出的一步。我认为不断学习和改进的愿望才是一个好的程序员。


4

对我来说,最好的程序员从来没有在找工作。他们仅凭自己的声誉就可以提供新职位。因此,如果需要,优秀的程序员可能会从以前的雇主那里得到回报。否则,一个好的程序员可能会向前同事询问是否要为他们在新公司工作。

在优势/劣势方面,您可能已经知道它们。如果没有,请向团队中的高级人员咨询。甚至不必成为开发人员。一个好的项目经理知道程序员的优势/劣势。此外,定义一个好的程序员的特征不仅限于代码。了解业务,沟通技巧,判断力等都是在IDE之外执行的。


2
你可能是一个伟大的程序员,一个可怕的人。您是否愿意与一个可能不太了解但乐于学习的好人一起工作,或者总以各种方式都是出色的程序员呢?因此,您所描述的是好的员工,而不是好的程序员。;)

2
我不知道此评论的来源。我要解决的两个主要问题是“如何知道自己是一名优秀的程序员?” 和“我怎么知道我的长处/短处?” 这些关于混蛋和可怕的人的话题是什么。我对这些事情有意见,但我认为它们与我的回应无关。

2
获得声誉通常更多是关乎公关和信心,而不是实际能力。
David Thornley,2010年

假设“能力”是技术能力,那么成为一个好的程序员比“实际能力”还重要。技术能力只是难题的一部分。

3

我认为这就像想知道如何知道自己是否是一个好人。

我认为,不幸的是,答案是只有其他可信的人才能告诉你。我认为这不是您可以自己准确确定的东西(至少这很困难-但我认为这可能是不可能的)。


3

我只是说:如果您对自己的工作充满热情(我的意思是真的很热情),如果您很灵活(另一种语言,新技术,对旧项目的完全翻版-那就做吧!),如果您继续学习,并不断提高自己的技能,永远不要以为自己有足够的能力停止前进-那么你就是一个优秀的程序员!


3

95%的程序员认为自己是5%的顶级程序员之一,另外5%是经理。因此,如果您是一名经理,那么您可能不是一个好的程序员,否则您可能不是。


...并且25%知道他们在前1%;)

3

我认为这与您的编程技能有关。成为一名优秀的程序员很好,但是如果您整天都在编写银行软件,那又有什么关系(没有冒犯性)。它只是不加起来。

要真正向自己证明自己是一名优秀的程序员,请执行一个有趣的困难的附带项目。这说明了几件事:您对自己的业余时间编程感兴趣并且真正地喜欢这个主题-这对于成为一名优秀的程序员至关重要。它显示出多功能性,因为您可以将自己的技能扩展到工作环境之外。它也显示了动力和创造力:您自己定义了一个问题,并正在采取措施加以解决。

所有这些方面为我定义了一个好的程序员。


3

我的回答在政治上是错误的。但是,我实际上是一家初创公司的创始人,我的工作是雇用最好的程序员。

我怎么知道哪些人将是优秀的程序员或可以成为优秀的程序员?

1个字:智商。

智商用于编程,高度用于篮筐球员。

我会将数学技能作为另一个在政治上更正确的指标。我的计算机科学老师告诉我,有一个标准可以正确预测谁将在编程课程中取得成功。高中数学成绩。无论如何,这些都是智商。

这可能令人惊讶。我们被告知编程是大学学位的工作。猜猜是什么,我不在乎学位。我只关心3件事。

  1. 编程技巧(可以测试)。
  2. 才智。
  3. 常识(不要太低)人们的技能。

不幸的是,智商只能衡量一件事。所以我做了一些测试。

我问别人问题。我希望小学孩子应该能够回答一个简单的问题。

我问类似的问题:

  1. 7:35时钟的短时针和长时针之间的距离是多少
  2. 如果我从雅加达去三宝垄,想保持60公里/小时的速度。然后在最初的2个小时,我以每小时100公里的速度行驶。在接下来的旅程中,我应该多快才能使我的平均速度达到60公里/小时?

如果仔细看,这些问题根本不需要创造力。只有常识。任何有智商的小学生都可以回答。

MOST大学毕业生不能。现在想象一下,如果有人无法回答?他可以编程吗?想一想。您必须多久指定一次他应该做什么?

您也可以问像Microsoft之类的确实需要创造力的问题。您可以提出有关如何在天平上称量8个球的问题,以了解哪个是最重的。这些问题的问题在于它涉及运气。但是,有些很容易,这应该是最低要求。

聘请一位优秀的程序员可以提高其他程序员的士气。聘请一名合法的程序员会降低其他所有人的士气。

在人们可以回答这样的问题(这很简单)之后,我会让他们写一些google jam代码。

好的程序员可以解决google jam代码,并可以预测哪些问题更容易。


2

恕我直言,你是一个好的程序员,如果

-您具有合理的理论背景。在大多数情况下,重新发明轮子以及算法或框架都是浪费时间。

-您有时会从歪斜的角度看到事物和问题。这可能会带您找到创新的解决方案。

-您花费时间和精力来更新最佳工具和最佳技能。

-您的代码易于修改。如果您设计干净,优雅且易于理解的代码,则对其进行修改不会很麻烦。

-如果您的代码/错误率相当高。我知道这看似微不足道,但我知道许多富有创造力和技能的开发人员仍然很容易犯小错误。这极大地削弱了它们的有效性和实用性。

-您周围的人都知道您可以帮助您决定要做什么

-您可以使用其他工具解决问题。糟糕的程序员会针对遇到的任何问题继续使用相同的工具(语言,技术或体系结构等)

-你不断学习,你很好奇。

这些年来,您的编程很有趣


2

“先生,从阿尔法到奥马哈,我都经历过这件事,我告诉你,一个人知道得越少,他发出的声音就越大,他要求的薪水就越高。” 马克吐温

...我的结论是,好的程序员的薪水低,噪音小... :)


2

最佳程序员:按时完成最少的代码声明数即可完成任务。


1

每个度量标准中的代码有多少个bug?(即每行错误)在需要添加新功能时必须重新编码多少代码?您的同事在修改您的代码时遇到问题吗?

最终,鉴于这些年来,“什么是质量代码”问题仍然是一个备受争议的话题,因此几乎无法回答这个问题。


1

我非常喜欢亚当五世的上述话。

除了其他人所说的,还要查看您工作的可维护性和支持历史记录。如果您的代码对维护的要求很高,并且一直在固定或难以更改,则可以指示它们的质量。但是,这些也可能是需求不佳的指标。


1
“但是这些也可能表明需求不佳。” 很可能是我们这里的情况。糟糕的要求使我们重写了整个模块。

1

自我评估非常困难。不称职的人往往对自己的能力有过高的评价。

一个好的指标是您作为程序员自己尊敬的其他人是否想要处理/使用您编写的代码。如果有机会直接与您合作或继承您编写的代码,那么您会拒绝吗?勉强同意?还是抓住机会学习您的工作?如果是同龄人,而不是下属,或认为自己使您感觉良好的人会从中受益,那么这项技术会更好。


1

如果您真的想找出答案,请向同行提交一些代码,并要求进行(建设性的)代码审查。在最坏的情况下,您会学到一些东西。您在此站点上寻求启发的事实已经使您与未洗的群众区分开。(除非你只是在这里自我抚摸。:-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.