帮助初级程序员克服缺点?[关闭]


15

您对加入您的团队的初级开发人员有哪些共同的见解,或者您必须与谁一起工作?显然,他们是没有经验的,所以您不能期望他们了解所有知识,但是通常会莫名其妙地缺少哪些技能-尤其是我们如何帮助他们建立这些缺失的技能?

我的意思不是像“听建议”这样的人际交往能力,而是(如适用)技术性问题:

  • “您从未做过SQL吗?”

  • “您从未写过单元测试吗?”

  • “您不知道如何使用Unix命令行?”

确实期待的事情-我想听听您的观察和技巧,这些知识和技巧可以教给新的程序员克服这些特定的缺点。


13
最令人烦恼的一件事情:不断询问什么令人讨厌。:-)
杰里·科芬

12
我不认为当人们不知道您希望他们知道的事情时,您应该不会生气。重要的是他们愿意学习=)
koenmetsu 2011年

是的,如果您愿意学习聆听,我同意@KoMet,我认为这很重要:)
MalsR 2011年

8
我不喜欢这个问题,它对开发人员的心态是错误的。我们只有那个新手,而且每天我们都是新手。我永远不会对一个不了解某事的人感到恼火。这种感觉,有太多的傲慢参与....
Darknight

3
哦,关闭,BRAVO。我阅读了六个指导性的主观建设性问题,这些问题已全部解决。坦率地说,非建设性的部分是忙碌的人关闭了一个已经由13个人回答的话题,只是因为他们误解了这个问题。一个简单的事实是,高级开发人员有时会对初级开发人员的能力感到失望,这个问题只是想在这种失望中找到任何模式,以便我们更好地避免遇到困难。忽视合法的抱怨和批评不会使任何人受益,这与傲慢无关。
Andrew M

Answers:


25

不知道什么是版本控制或如何正确使用它

最近在我公司工作了几个月的初级开发人员之一,必须学习有关Subversion的非常基本的知识。这真的让我感到畏缩……她一直在检查代码以进行项目开发……不知道自己在做什么……?


4
ring?她很幸运,她仍然有工作。
Rein Henrichs

2
似乎更多的是“不知道自己不知道的事情”或“不承认自己不知道的事情”。她从一开始就寻求帮助,这会是一件大事吗?
Michael McGowan

1
哎呀,听起来像我哈哈,直到最近我们才实现版本控制,而我以应届毕业生的身份加入了公司,我确实在大学里学到了一些版本控制和颠覆性的东西,但是以前从未实现过。
Sufendy 2011年

1
“那是备份工具吗?您每天晚上都用它来保存代码吗?”
大卫,

2
他们几乎从来没有在学校教过你是一件大事
Elijah Saounkine

23

没有问足够多的问题

我知道他们是大三学生,我希望他们会犯错,只是不了解。通过问一个问题而不是假设一些事情,就可以避免这么多皇室狂欢。老实说,我受够了。

我有TONNES的问题时,我开始了-要求他们救了我的屁股上多次。地狱,我仍然有很多问题……我只是想认为他们现在是更好的问题。


哎呀...几乎与我发布的答案相同,您大约在5秒钟前就去了。
quick_now 2011年

2
“你很烦!我在这里很忙,你不能一个人想吗?” 如果你倒霉!哈哈
Sufendy 2011年

4
+1-这种情况的一个子案例在进行解释后不会再询问。当我向一个大三学生解释一些任务时,确实让我感到恼火,他点了点头,我以为他知道了并准备上班了,然后两周后他又回来了,再次问同样的问题,再次点头,然后再问两个。几周后...公平地说,这不是一件微不足道的任务,但是出于上帝的缘故,不要假装如果您不懂的话,请理解。如果您认为自己有所了解,请做笔记,以便两周后记住。
彼得Török

1
另一方面,有些人问太多问题(关于堆栈溢出)。
BoltClock

1
@SnOrfus:我指的是那些不合格的人:P
BoltClock

14

复制粘贴和反复试验,而不是寻求了解基本原理

许多初级开发人员会复制看起来很接近的代码,然后几乎用蛮力随机尝试修改的不同排列,直到找到可行的代码为止。如果您不知道它为什么起作用,很可能您是在边界情况下引入了一些错误,有些不了解该错误的人将不得不稍后对其进行清理。

保持代码的“初稿”

当有经验的开发人员编写具有一定复杂度的新功能时,他们从只进行编译的存根开始,然后重写以为整个算法添加高级伪代码注释,然后一次重写一个注释。实际代码,根据测试需要添加和删除伪代码,然后重写以删除实现期间出现的冗余,等等,以进行一系列连续和增量的改进。

初级开发人员倾向于将其编写为一大块,然后进行大规模的蛮力调试。他们不希望在将代码输入编辑器后删除一行代码,并且很高兴他们最终使代码能够正常工作,以至于不愿意为非功能性的改进而重写,但是他们是需要这样做的人最。


1
+1代表“复制粘贴而不是寻求理解”,尽管这当然不是新程序员独有的问题,而是坏程序员所独有的。新的程序员至少有成长的机会-与我一起工作数十年的程序员一直没有这样做。
汤姆·安德森

部分原因也可能是管理风格的结果。任务的讨论时间已经超出预期,经理希望您明天进行讨论。您急于使其开始工作并迅速进行下一个任务。一切都分解成微型任务卡,因此没有时间重构或退后一步,而是将整个大问题视为一个整体
Jamie McGuigan

14

相信您是第一个遇到这种情况的人。

您所遇到的每个编程问题都已经以某种一般形式被其他人所面对。向经验丰富的程序员学习的东西太多了。我年纪大了,还记得在Google之前进行编程的经历,这很烂。当我们拥有搜索引擎时,情况甚至更糟,但是网络上还没有那么多好的信息。现在编程可以提高生产力,因为您可以在几秒钟内访问全球知识。不使用它的人无视它的危险。

编辑

需要明确的是,我主张复制/粘贴编程。但是,我可以确定,您需要先回顾现有知识,然后才能自己做出正确的决定。


1
好吧,您也不希望开发人员从Web的某些可疑资源中复制粘贴所有代码。搜索是获得一些想法的好方法,也许可以解决一些基本的理解问题,但是从没有获得现成的解决方案。这也使开发人员变得笨拙。也许这使他成为了一个很好的收藏家,但不是一个发明家。
伊利亚·索恩金

我在某些时候同意以利亚(Elijah)的观点,粘贴粘贴的代码没有花时间去学习它的功能,但不会提高您的编程技能。最糟糕的是,它将接管并成为一种不良习惯。
setzamora 2011年

1
可以,但是@Scott并未对复制和粘贴代码进行任何说明,他只是说不要假设您是第一个遇到这种情况的人,即意识到可能会有一些信息和经验可以从中受益。示例:我想知道两个字符串是否相似。是否已经有解决该问题的已知算法?想象一下,如果开发人员只是决定开始滚动自己的浏览器,甚至不知道答案已经存在。
大卫·康拉德

@David Conrad是的,正确的是,我们在同一页面上。
伊利亚·索恩金

10

以为他们什么都知道。

我有一个小。尝试用javascript解决所有问题的实习生。试图解释几个概念,但他始终认为自己可以做得更好。现在,他退出并即时修改了他为使用HTML而不是像PDF这样的可打印技术而为打印输出构建的主要程序。更不用说一堆其他主要问题了。

教训是在项目早期就要求老年人提供主要的总体指导,不要在没有帮助的情况下进行架构设计。您可以单独编写代码和详细信息,但请确保至少使用正确的技术。


5

当大三学生不了解基本知识,没有教授行业技能(例如大学的SCC)时,我很少会感到恼火。教他们是高级开发人员的工作。我只会因性格冲突而烦恼。但是我对那些不了解基础知识的高级开发人员感到最恼火。


1
@Graig是对的,许多使我们经验丰富的开发人员感到不满的事情是初级,这不是我们必须在大学学习的,而是在商业环境中学习的。
Nickz 2011年

5

不想提高自己的知识-而是选择阻力最小的道路。

前几天,一名实习生与图形设计师(其编程技能出奇的熟练)一起寻求帮助,因为他们在jQuery中实现某些功能时遇到麻烦-如果您看不到它,关闭可能会很痛苦。

我和实习生一起坐下来,确切地解释了出了什么问题以及原因。我们修复了该错误,然后指出了可以进行的其他一些改进(“因为我在这里”),最终我们用10行而不是20行重写有罪函数,并且没有错误。回答任何问题后,我对世界上一切都还好感到满意,然后我离开了。

第二天,实习生来了一个问题,表明他“嗯,我想做一些更改并以我的方式重写功能,因为我发现很难理解”(大部分情况下是无法撤消我的改进)。

相反,他可以更努力地尝试(询问其他问题,阅读我提到的概念)-如此简短的代码永远不会那么难理解—或采取简单的方法。每当我看到有人做后者时,这会让我感到很难过。


有趣的是,我确实想知道您是否确实使它的分配更难阅读。我记得我的第一个项目经理做过几次(而且我也为此感到内)虽然回想起来他的方法更好,但当时我还不够先进,无法理解为什么以及如何工作。
Maxim Gershkovich 2012年

3

不了解OOP。可悲的是,这比我们大多数人可能意识到的更为普遍。

知道如何创建类,抽象类,接口,甚至知道多态是一回事。了解如何正确使用它们以造福您的程序是另外一回事


如果您想避免这一问题,我发现这些问题以及对他们的回答很有启发性:


就像从基本的角度来看,他们不知道通过创建对象,类和内在意味着什么?或更高级的东西,例如使用设计模式(您必须承认,GoF的书相当深奥,尽管当然还有其他书籍/指南)
Andrew M

@Andrew我扩大了答案。
妮可

1
我看到相反的情况:由于只接受了OOP的知识,所以不知道如何用C编写普通的旧程序代码。再说一遍,不要让我去谈论那些不再被教写解析器的人,因为他们被告知所有这些问题都可以使用lex和yacc来解决。
quick_now 2011年

1
@quickly_now这是一个好点,但writing code other ways than OOPwriting bad OOP是两个完全不同的事情。首先,我没有问题。
妮可

大多数大学不教授面向对象的设计。同样,即使是初级开发人员,许多工作场所也像筒仓一样工作……或者拥有不了解面向对象编程的“高级”开发人员。有“高级”开发人员从x年的工作中获得了头衔,还有一些高级开发人员知道他们的东西
。...– Cervo

3

不知道自己不知道的东西,无知地认为自己什么都知道。

(和它的近亲,不想问。)

在某种程度上,这是一种组织性的事情-适当的传入归纳将有助于防止其中的某些事情成为问题。但是,很少有公司有时间或人员来进行入职介绍-这需要几天到几周的时间,而这会使开发人员无法工作。因此,我们必须扑灭大火。


2

令我惊讶的是,有多少刚从CS程序中脱颖而出的初级程序员对算法却一无所知。糟糕的算法选择可能不会真正在业务应用程序中脱颖而出,但是当每天处理数十亿个Web服务请求时,它确实很重要。

这是我使用的一个采访问题,几乎所有初级程序员都错过了,这凸显了这个问题:

编写计算第N个斐波纳契数的代码。

他们几乎总是去写最多的,但是效率低下的东西。

int Fib(int n)
{
    if (n == 0) return 0;
    if (n == 1) return 1;
    return Fib(n-2) + Fib(n-1);
}

当被要求评论算法的复杂性时,我通常会得到“比O(N)...呃... O(N logN)更糟糕”。实际上比这更糟糕...


1
要回答有关复杂性的问题,您应该知道该公式可以不递归地计算斐波那契数,他首先会使用该公式代替递归。
P Shved

1
@Pavel:有一个O(n)和O(1)解决方案...实际上是Like every sequence defined by linear recurrence, the Fibonacci numbers have a closed-form solution. en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression
Eric

1
我并不是说您发布的解决方案是完美的。我只是在质疑您的后续问题与此类解决方案(即复杂性问题)的相关性。通过询问,您想实现什么目标?最重要的是,为什么您希望在回答了上一个问题之后就能实现目标呢?(难道我让我的地步呢?)
P Shved

为了使我的观点更加清楚,我建议您询问有关如何改进代码的问题,而不是要求估算复杂性。我确信某些CS毕业生会提出备忘录,或者说他们知道公式,但又不想立即显示出来,因为您会认为它们很聪明。
P Shved

实际上,可以使用事件探查器发现此类功能,并通过添加备注缓存来对其进行优化。对于低的N值,效率低下实际上只是一个问题。向初级人员教授此类代码的最佳方法是使用调试器强制其逐步执行整个代码。对于N真正大的值,原来有一个数学公式maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/...
杰米圭根

1

向后缩进代码!

当然,这不是很“典型”。我简直不敢相信这是有可能的,但是普通开发人员会这样写

try {
    switch(action){
        case case1:
            ...
            break;
        case case2:
            ...
            break;
        default:
            break;
    }
}
catch(Exception e) {
    e.printStackTrace();
}

她会这样写(上帝,对我来说似乎还是不可能!)

            try {
        switch(action){
    case case1:
...
break;
    case case2:
...
break;
    default:
break;
        }
            }

是令人沮丧的吗?


以什么名义...
Mike Speed

1
太神奇了!!!
javanna 2011年

几乎就像是您从右至左阅读的阿拉伯语,希伯来语或中文的地方,而不是西方从左至右的习惯。缩进代码是一种非常有效的方法,但是它确实意味着您需要根据最深层的嵌套重新缩进整个文件,这会使您的代码与共享相反约定的每个人都不兼容。
Jamie McGuigan
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.