您对加入您的团队的初级开发人员有哪些共同的见解,或者您必须与谁一起工作?显然,他们是没有经验的,所以您不能期望他们了解所有知识,但是通常会莫名其妙地缺少哪些技能-尤其是我们如何帮助他们建立这些缺失的技能?
我的意思不是像“听建议”这样的人际交往能力,而是(如适用)技术性问题:
“您从未做过SQL吗?”
“您从未写过单元测试吗?”
“您不知道如何使用Unix命令行?”
您确实期待的事情-我想听听您的观察和技巧,这些知识和技巧可以教给新的程序员克服这些特定的缺点。
您对加入您的团队的初级开发人员有哪些共同的见解,或者您必须与谁一起工作?显然,他们是没有经验的,所以您不能期望他们了解所有知识,但是通常会莫名其妙地缺少哪些技能-尤其是我们如何帮助他们建立这些缺失的技能?
我的意思不是像“听建议”这样的人际交往能力,而是(如适用)技术性问题:
“您从未做过SQL吗?”
“您从未写过单元测试吗?”
“您不知道如何使用Unix命令行?”
您确实期待的事情-我想听听您的观察和技巧,这些知识和技巧可以教给新的程序员克服这些特定的缺点。
Answers:
不知道什么是版本控制或如何正确使用它。
最近在我公司工作了几个月的初级开发人员之一,必须学习有关Subversion的非常基本的知识。这真的让我感到畏缩……她一直在检查代码以进行项目开发……不知道自己在做什么……?
没有问足够多的问题
我知道他们是大三学生,我希望他们会犯错,只是不了解。通过问一个问题而不是假设一些事情,就可以避免这么多皇室狂欢。老实说,我受够了。
我有TONNES的问题时,我开始了-要求他们救了我的屁股上多次。地狱,我仍然有很多问题……我只是想认为他们现在是更好的问题。
复制粘贴和反复试验,而不是寻求了解基本原理
许多初级开发人员会复制看起来很接近的代码,然后几乎用蛮力随机尝试修改的不同排列,直到找到可行的代码为止。如果您不知道它为什么起作用,很可能您是在边界情况下引入了一些错误,有些不了解该错误的人将不得不稍后对其进行清理。
保持代码的“初稿”
当有经验的开发人员编写具有一定复杂度的新功能时,他们从只进行编译的存根开始,然后重写以为整个算法添加高级伪代码注释,然后一次重写一个注释。实际代码,根据测试需要添加和删除伪代码,然后重写以删除实现期间出现的冗余,等等,以进行一系列连续和增量的改进。
初级开发人员倾向于将其编写为一大块,然后进行大规模的蛮力调试。他们不希望在将代码输入编辑器后删除一行代码,并且很高兴他们最终使代码能够正常工作,以至于不愿意为非功能性的改进而重写,但是他们是需要这样做的人最。
相信您是第一个遇到这种情况的人。
您所遇到的每个编程问题都已经以某种一般形式被其他人所面对。向经验丰富的程序员学习的东西太多了。我年纪大了,还记得在Google之前进行编程的经历,这很烂。当我们拥有搜索引擎时,情况甚至更糟,但是网络上还没有那么多好的信息。现在编程可以提高生产力,因为您可以在几秒钟内访问全球知识。不使用它的人无视它的危险。
编辑:
需要明确的是,我不主张复制/粘贴编程。但是,我可以确定,您需要先回顾现有知识,然后才能自己做出正确的决定。
当大三学生不了解基本知识,没有教授行业技能(例如大学的SCC)时,我很少会感到恼火。教他们是高级开发人员的工作。我只会因性格冲突而烦恼。但是我对那些不了解基础知识的高级开发人员感到最恼火。
不想提高自己的知识-而是选择阻力最小的道路。
前几天,一名实习生与图形设计师(其编程技能出奇的熟练)一起寻求帮助,因为他们在jQuery中实现某些功能时遇到麻烦-如果您看不到它,关闭可能会很痛苦。
我和实习生一起坐下来,确切地解释了出了什么问题以及原因。我们修复了该错误,然后指出了可以进行的其他一些改进(“因为我在这里”),最终我们用10行而不是20行重写有罪函数,并且没有错误。回答任何问题后,我对世界上一切都还好感到满意,然后我离开了。
第二天,实习生来了一个问题,表明他“嗯,我想做一些更改并以我的方式重写功能,因为我发现很难理解”(大部分情况下是无法撤消我的改进)。
相反,他可以更努力地尝试(询问其他问题,阅读我提到的概念)-如此简短的代码永远不会那么难理解—或采取简单的方法。每当我看到有人做后者时,这会让我感到很难过。
不了解OOP。可悲的是,这比我们大多数人可能意识到的更为普遍。
知道如何创建类,抽象类,接口,甚至知道多态是一回事。了解如何正确使用它们以造福您的程序是另外一回事。
如果您想避免这一问题,我发现这些问题以及对他们的回答很有启发性:
writing code other ways than OOP
并writing bad OOP
是两个完全不同的事情。首先,我没有问题。
令我惊讶的是,有多少刚从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)更糟糕”。实际上比这更糟糕...
Like every sequence defined by linear recurrence, the Fibonacci numbers have a closed-form solution.
en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression
向后缩进代码!
当然,这不是很“典型”。我简直不敢相信这是有可能的,但是普通开发人员会这样写
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;
}
}
是令人沮丧的吗?