原文链接:The Role of a Senior Developer
We work in a strange industry. There is a much higher need for developers than can be satisfied by new developers coming into the field. This is a problem that has existed for years, and it is getting worse as time goes on.
我们现在工作的行业很奇怪。明明每年都有新的从业人员涌入人才市场,但企业依旧诉苦自己迫切需要大量的开发。这种问题存在已久,而且已经越发严峻。
We have a serious shortage of talent to meet the demand, but our industry is really quite young . Most software projects fail. Nearly all of them come in over budget. The best guidance we have on this subject from thought leaders boils down to “These are some common ways we solve these problems, but our solutions frequently don’t work, so the only thing you can really do is try it out and see if it works for you”.
开发者这个行业非常年轻,也面临着很严重的人才短缺问题。大部分的软件开发项目无疾而终,原因是后期开支过于庞大。那些行业里的大佬是怎么建议我们的,他们说「世界上永远存在解决问题的办法,但我们还是会遇到各种难题。因为除非我们真正去尝试解决,否则永远不知道哪种方法奏效。」
The reality we live in is that “Senior Developer” means a person who has been slinging code for more than 3 years. These people are put into leadership positions, and typically things play out as you would expect — quite badly.
认识一个现实吧,当你从事开发工作三年以上,就可以称呼自己为「高级开发者」。但实际上,有些人只是在这个位置上混三年,而他们只是虚有其表,水平严重不符合职位。
This is my take on the terms we use in the industry. Really, putting people into 3 buckets is a huge over-simplification of the nuance, knowledge, and experience of progressing through this profession, but it is what it is. If we are going to classify people in this way, then we need to take time in the industry off the table. A person with 10 years experience is quite different than someone who has experienced the same year 10 times.
这确实是我对同行的评语。首先,根据知识和经验把人分为初级开发者、中级开发者,和高级开发者,这是非常一刀切地分类。有些人可能只是在一个位置上混了十年,然而他的成长甚至没有另一个人一年所学到和经验多。
The stages of software developer growth
开发者成长平台
As programmers, we live in a world of complex systems and variables. It is incredibly challenging to simply execute a well defined and focused task, especially if you are not terribly experienced with the tools at your disposal, or the codebase you are working on.
身为一个程序员,我们生活在一个 IT 系统越发复杂且多变化的时代。有时候执行一个简单的开源项目,都需要精准定义并耗费大量时间专注任务。尤其是当你身为一个新晋程序员,或者对手下的数据库还很陌生的时候。
This is the life of the junior developer. You are fresh out of school, and think you know everything. Suddenly, you are faced with the fact that what you learned about in school was actually quite poor preparation for the types of problems you are encountering. Things are more messy. Less theoretically pure. You are existing in a realm of compromises, and can never make assumptions about anything.
菜鸟程序员很难当。你可能刚从一个还不错的大学毕业,你觉得你已经掌握了基本的常识。但突然间,你在工作上面临的是另一套崭新的知识。在很长时间内,你都对自己所要做的工作没有任何头绪。而对于上司提出的要求,你似乎只能妥协,而且没办法作出有效质疑。
Dealing with this is really all you can focus on, and it is what you really should be trying your best to learn. Junior developers need a lot of direction, supervision, and mentoring because of this, or they can stay in this place for a very, very long time (I recently encountered a fellow who had been building software for almost a decade who I would say is still a junior). You can say that this period is really about acquisition of tactical, day to day techniques.
在这个阶段,你必须要做的是专注。而且尽可能地放开心胸,去努力学习。初级开发者在工作之初,需要大量的练习,指导、监管,以及需要一个能帮助他们的老师。缺乏以上的任何条件,初级开发者都很难很难迈过这个初学者门槛。我最近遇到一个家伙,他已经有十年的软件构造经验,但是我很遗憾地发现,他的真实水平依旧只是初级开发者。你可以说这个阶段,是战略上的积累状态,但就是要学习加积累,积累再学习,缺一不可。
A junior developer is code focused, not development focused, and doesn’t understand the distinction. When a programmer talks about how they “would love coding more, if it weren’t for all the users”, I assume I am talking to a junior developer.
初级开发者必须要专注代码本身,在这个阶段,不要分心想任何其他乱七八糟的事情。在开发一个项目时,如果身为程序员想的是「我想让自己的代码在别人眼里看起来漂漂亮亮的」,而不是「我做的东西应该以用户感受第一」,那么他本身就是一个初级开发。
A good junior developer can be given a known task, and be expected to execute it quickly, and well.
一个好的开发者可以出色地完成任务,而且不仅如此,他们能以较短时间出色完成任何,后期也会维护好。
An intermediate developer is one who begins to see patterns in failure (usually their own failure), and recognize that it takes a lot more than banging out focused tasks to actually build something that works, and won’t completely fall over the first time someone needs to change it. They have also gone through the unique experience of looking at something they were proud of writing a year ago, and realizing it was actually pure garbage.
当一个开发者脱离菜鸟阶段成长为中级开发者时,他们能够在项目失败时反省整个过程(通常,他们会看自己所做工作部分)。而且会意识到,比起匆匆忙忙埋头苦干完成任务,应该在项目最初就建立起一些规矩。甚至于如果最开始有人指正他们,整个项目就能在最初避免走向失败。而中级开发者还会体验另一个独特心理过程,那就是当他们回首一年前的工作。发现尽管当时认为「哎呦,自己做的还不错」,但现在会发现「这都什么玩意」啊。
An intermediate is someone who is looking for answers on how to build things The Right Way, and finding them through experimentation, literature, and discussion with other programmers. This level is really about learning the theory of building of software, rather than the theory of building code (which is learned in school).
一个中级开发者是有能力通过以往经验、文本资料、项目团队讨论等方式,摸索出「正确方法」做事的人。在这个阶段,学习构建软件的理论比学习构建代码更重要(后者应该在学校就掌握了)。
Systems built by unsupervised intermediate developers are going to fail for completely different reasons than systems built by juniors. A junior will build a big pile of algorithms that sort of work. A good intermediate will build pages out of “Design Patterns” and “Domain Driven Design”. While those are great books for learning how to build large OO systems, direct application of this sort of theory results in over engineered systems that are flexible in ways that don’t matter, and inflexible in ones that do matter.
另一方面,中级开发者假如自作主张起来,造成的危害比初级开发者更大。初级开发者只会堆砌算法,一个好的中级开发者努力方向是「模式设计」和「范畴驱动设计」。这些技能是他们搭造 OO 系统的必备过程,学习完这些理论知识如果灵活运用,可以让他们更好地构造项目。但如果僵硬使用,也会危害整个项目。
You can trust an intermediate to build systems that will work for far longer than a junior, but will lead to a different sort of disaster down the road. The sad fact is that the vast majority of not only senior developers, but team leaders are in fact, intermediate devs. Most do not realize this, and have the best intentions, but have simply never worked with anyone who is at a higher level.
有的时候,让一名中级开发者搭造系统,他耗费的时间可能比初级开发者更长,而且更糟的情况是他可能带整个团队走向迷途。很可悲的是,很多项目开发之所以走向失败,因为领队者自己只是一个中级开发者,他们缺乏和高级开发者工作的珍贵经验。团队领导自己,而且团队里其他人都没有意识到这点。
Intermediates are quite aware of their role in their organization, and the value they bring. A good intermediate understands how using code to solve a problem is the means to an end, not the end in and of itself. However, they are still in love with ivory tower design, and are still on a quest for “The Right Way” to build software.
中级开发者很清楚自己在团队中起到的角色,能认识到他们给团队工作带来的价值。一个好的中级开发者知道代码是用来解决问题的,而不是用来终结问题的。然而,中级开发者总容易陷入一种认知上的金字塔,那就是他们会遵循一些「正确的方式」去解决问题。
A good intermediate developer needs less supervision. They can be trusted to raise issues of code design, and play a valuable role in design discussions. They are also the “workhorses” of the dev team. However, further mentoring and higher level supervision is still vital.
一个好的中级开发者需要少而精的监管。他们在代码构造方向非常可靠,而且会在讨论设计的过程中发挥重要作用。中级开发者是团队中的「发动机」。但是,如果进一步的指导和更高级别的监管仍然是必不可少。
A senior developer is intimately familiar with their own failure. They have written code both under, and over designed, and have seen both fail. They are reflective about the things that they do, evaluating their successes and failures when approaching problems with intellectual honesty. A senior developer has fallen out of love of the complexity which dominates the intermediate, and is obsessed with simplicity.
一个高级开发者,不夸张地说,他能记住自己每次的错误。他们甚至能在设计或者编写代码的时候,就能预见到很多失败。他们会对错误进行非常敏锐地反馈,用一种诚实的方法去评估自己的成功和失败。身为高级开发者,他会更倾向于热爱复杂问题,但会痴迷于简洁地解决它。
A senior developer stops classifying developers based on their knowledge, and instead understands that there is a spectrum of strengths and weaknesses. They are more intimately aware of their own strengths and weaknesses than anyone else could ever be, and strive to play to their own strengths whenever possible.
高级开发者不会给其他开发者划分等级。与之相比,他更多的是懂得。因为懂得,所以理解每个人在每个阶段都有长处和短处。而他们也比别人更了解自己的长处和短处,力求把自己的优势最大化。
A senior developer thinks in terms of “context” when applying theory. They understand that there is no “Right Way” to build software, and that the only way to build good software is by adapting theory to fit the needs of the client, codebase, team, tools, and organization.
一个高级开发者会懂得,所有理论基础都有背景支持。他们不会执着于「对的方式」去搭造软件,而是把理论灵活运用于实际,理论可以变通用于为客户、团队和组织需要服务的工具。
A senior developer understands that everything in our field involves tradeoff, and will look for what that is for design patterns, libraries, frameworks, and processes.
一个高级开发者知道我们的所有领域中都存在着权衡,并且会关注设计模式,库,框架和过程的权衡。
A senior developer thinks of more than just themselves. They are aware of how their organization and their clients work, what their values are, and what is both important and not important for success. When a ball is dropped, a senior developer will do what they can to pick it up. The phrase “this is not my job” is never, ever said in those situations.
高级开发者会在项目过程中,设身处地了解客户想要什么样的工作结果,以及他们的喜好。毕竟这些东西,比开发者个人的偏好和成功更重要。他们永远不会说「那不是我的工作」,也永远不会推搡任务和责任。
A senior developer will understand that this job is to provide solutions to problems, not write code. Because of that, a senior developer will always think of what they are doing in terms of how much value it brings to their organization and their clients vs how much effort they are putting in.
资深开发者会懂得一件事,那就是他们的工作是为了客户提供解决方案,而不是埋头写代码。而一位资深开发者永远会把自己团队能给顾客带来多少价值,放在考核标准。而不是把自己的努力和客户需求放在对等的 PK 赛场里。
While an intermediate will plow through days of boring work, a senior developer will take a step back and question what is breaking down to cause all that boring work to begin with. They will evaluate the cost of fixing root problems, and either fix them directly, or put things in motion so they will be fixed eventually.
诚然,因为这是一份工作,所以中间的过程总会非常枯燥和无聊。但资深开发者会退一步,思考怎么能解决和打破这些无聊的问题。他们会评估本源问题,直接解决它。或者他们会把枯燥情绪放在旁边,修复日常必须要面对的问题。
A senior developer understands that you cannot do everything yourself, and that their primary role is to help their team get better, in many of the same ways they themselves strive for personal improvement.
资深开发者也会懂得团队工作的高效。没有人能自己做一切工作,他们会致力于提升自己团队的效率。他们把提高团队效率所做的行为,视为提高自己软实力的一部分。
A senior developer understands that leadership is not about power, it is about empowerment. It is not about direction, it is about serving.
资深开发者懂得,领导力不仅仅只是权力,也不仅仅只是控制力。权力不是交通棒,而是一种服务意识。
If you do not have at least one senior developer in a leadership role on your team, your project is doomed to fail. A team of great intermediates will get you very far, but the days of the software you are building are numbered, and the end result is either closing shop, or costly / risky rewrites. A senior developer is the only person fully qualified to choose technology and platforms, so not having one from day one will hurt you.
如果你的团队中缺乏高级开发者,那这个项目基本都无一例外走向失败。拥有中级开发者能让你做事情非常快,但是在工作中你会发现,项目不仅仅只是搭造和维护程序。最终你只能关闭网站,或者用比预期中更高昂的价格维护它。只有高级开发者能选择技术和网站,而不是任由他们来伤害你。
The reality is nobody fits into these buckets perfectly. I am just tired of the “years of experience” based classification. Years of experience tells you something, but is almost pointless information without a lot more context.
而现实情况是,我自己很厌倦以工作时限来分类开发者。是的,工作经验能告诉你很多事情,但通常提供的都是无意义的信息。甚至于这些信息,也必须要结合很多背景来判断。
More than that, our industry values wicked smart young guys fresh out of university. Those people are valuable, and necessary, but so are people who have 15-20 years experience in the field. We need to stop hiring according to stereotypes, and start really thinking of team and organizational talent composition. If everyone on your team thinks the same, you are doing your product and your organization a disservice.
更重要的是,我们行业里需要新鲜的血液,需要招收那些刚从大学毕业充满激情的年轻人。而即使给程序员划分种类,也不可仅仅只看工作经验。实际上我们招收程序员前,应该先思考团队都需要那些人才。毕竟,我们招收的人才是为团队服务。当你招聘到错误的人选,不过是给团队和项目帮倒忙。