*前言:原作者George Fekete是一个拥有10年客户端和服务端的web开发者,擅长PHP、JavaScript,致力于各种中大型的web应用,Primal Skill的创始人,CTO。
本文根据How to be a Good Developer翻译而来。*
作为一个苦逼的程序员,你需要在这个随时变化的行业中不断的提升身自己,学习并且实践,成为一个成功的开发者,才能在这巨大压力的竞争中找到自己的立足之地。
那么问题来了,什么是我们所说的成功的开发者,他们是了解各种语言和工具的博学者?还是把编码实践当作艺术的艺术家?
从这篇文章,你将会了解怎样运用“编程礼仪”而成为更好的开发者,甚至可以将这些知识传道授业于他人。
如何成为职业人才?
不管你做什么样的工作,你都要从职业化开始做起。而作为职业化人才最重要的是要有自己鲜明的个性和特征。
无论在什么领域里,一个职业的开发者往往都会受到大家的尊敬。让我们来见证你如何成为其中的一员。
- 不要成为自私鬼
我曾在一个大团队里工作过,当我在这个团队中实践我的“编程礼仪”时,最早学习到的就是团队必须要和协作紧密相连。
在一个团队中,你的大部分时间应该用在相互为师相互学习上,一个团队必须要在压力和利益共享并存的环境中生存。
如果你不愿意共享你的工作和知识,你会发现你的傲慢和自私将会使你在这样的工作环境中举步维艰。
- 要有责任心
没有专业人才不需要对他们的工作负有责任心。
责任是留给上级的,只需要完成指定的工作,当吹响5点的号角你就可以忘掉一切的工作烦恼。
对于一个职业的开发者来说这是万万不可的。有一天当你的bug给公司带来巨大的损失,你还笑得出来么?
这个问题同样也是要靠公司的管理方法来解决。每个公司应该激励程序员更多的去为他们的行为负责而不是仅仅只是写几行代码就完事。
如果你的bug很不幸的影响到产品的服务,那么毫无疑问尽你所能去弥补它,甚至会花你整晚的时间。这也正是把你和吊油瓶区分开来的点,也是能够给你带来更加丰厚的薪水的前提。
- 良药苦口
世上没有完美无缺的东西,软件也是一样。在我们工作的时候总是不可避免的会犯一些愚蠢的错误。
而我们处理别人批评的态度充分反应了我们如何看待开发者工作。
从所有的批评中我们都可以吸取教训并学到东西,那是提升你自己的最好途径,特别是来自于比你经验和能力都强的人的批评。
对工作抱有热情
作为职业人员是一个没有停止键的工作,学习不能仅仅只在朝九晚五之间。
持续的学习、实践和提升自己是一项投资,同时也是你自的责任,而不是你老板的。
不仅仅是工作,在生活中也是如此¬——话说你总不能要挟你的老板挤时间来看最新版segmentfault的说明吧(放轻松,伙计!)
也许你会说我哪有这么多的时间?当然你没有!但你需要思考。如果你想要认真做好你的工作,首先你得重视你的工作。
仅仅在工作前后抽出半个小时时间,那意味着一周会有5个小时额外时间,那就是你会多出超过一半的一个工作日时间,时间永远都是挤出来的。
怎样写一手好代码?
- 阅读源代码
你不去训练阅读能力,你就不可能做到一目十行。同理,程序员的工作就是能够写出一手好代码,但如你果不知道什么才是好的代码不去训练那也全是白搭。
大多数的程序员只是盲目的使用第三方的库而不会去碰源代码。对于一般工作这是可行的,但是如果要去弄懂那个库是如何运作,是需要去深挖和理解它的源代码的,如果可以,跑一跑tests(如果它有的话)。
阅读代码同时也可以帮助你快速的找到其他开发者的错误,这可以对你的review或repair有很大程度的帮助。
- 学习新技术
对待新的技术,永远保持开放学习的心态,然后想想这个新技术如何帮你成为一个更好的程序员。
保持对新事物的好奇,不要因为你觉得它们没有潜力反而错过真正趋势。每件事都是有周期的,而不变的是你保持开放心态后所获得的知识财富。
一个好的开发者即使有15~20年的实践经验,他们也不会停止学习。
- 慢工出细活
慢下来是意味着花多一些的时间去评估你所需要解决的问题。速度在这个时候并不是你要去争取的。
我曾经遇到过一些新手领到任务后就想着以最快的速度去完成,然后交付代码,结果就是代码里出现很多的 bug,他们不得不花更多的时间去解决这些问题,其实当初他们只需要停下来,好好思考一下这个问题的痛点,就能花费更少的时间和精力。
高级开发者都是又懒又慢的,这似乎成了每个人的爱好,因为一个好的程序员不会想重复的做一个工作的。
对于高级的开发者来说,他们只花三分之一的时间来写代码去完成任务,剩下的时间他们会思考怎么用最好的方法去完成它。
- 测试你的代码
这不是一个TDD或者TDD辩论,但是要记住,任何性质的测试对于提交高质量的代码是非常重要的。
不测试怎么知道是否会有问题出现?你知道你几个月前在特定的代码库做了什么?
通过测试,你能清楚的了解到代码实际是怎么运作的。这就像是书的目录一样,指导开发者如何去做。你可以知道从哪入手和做什么。
写测试的时候一开始你会觉得很困难,但事实证明在如果你长期这样做会有很好的益处。
- 了解你用的工具包
知道你可以用什么样的工具来帮助你解决问题。大多数的工具选择,到最后其实都归结为偏好,但记住,一个好的工具是可以帮到你很多的。
想想你在编译器上花了多久的时间,它是一个完整的IDE或者仅仅只是一个语法高亮的文本编辑器。
同时,你需要决定是否使用特定的库,是否值得用PHP框架?有哪些优缺点?在项目中使用一个笨重的CMS是否可行?
这些都是你需要在动键盘之前需要仔细考虑的问题。
如何不走歪路?
- 对抗倦怠
一遍又一遍的敲打代码,这种循环往复的生活其实是一件很枯燥的事,大多的开发者在他们的职业生涯中会碰到对职业感到怠倦的时刻。
这种情况会伴随着长时间的工作而产生叫做imposter syndrome(冒充者综合征),这是由于开发者由于想让自己变得更优秀而不停的增加工作的强度和时间。但过多的工作却不一定更好。
治疗这种病症最好的良药就是走出这个循环,去做一些其他的事,来一场说走就走的旅行,去做你最喜欢的事。给自己放几天假,哪怕只是几天。
另一种方法,也是一种越来越受欢迎的对抗怠倦的方法,就是去找个组员和你一起合作写代码。社交是一种很高效的解决方式。
- 代码维护
保持稳定的状态也意味着要保证一个清爽的代码库。不仅仅为他人,也是为你自己。没有测试和文档的代码就像是个俄罗斯轮盘。
试想一下,如果你将来几个月后需要重新审视一下一些特性怎么办?你将会花费更多的时间去弄清楚你究竟在做什么而不是任务本身。
我见过客户接近开发者无数次的重构他们的项目,就是因为之前的团队放弃了这个项目,而几乎所有的新团队都认为这个项目需要重头开始写。
发生这种情况是因为之前的团队没能维护一个干净、稳定的代码库。实践需要很多的时间,可以阅读下这篇文章18 Critical Oversights in Web Development ,这篇文章主要讲了如何维护代码的纯净,以及其他实用的实践。
- 关于估计
估计对于许多程序员和管理者是一个很敏感的话题,这也是必须的。我能确定每个人都听过类似的例子,经理常常会问开发者完成任务所需要时间,而且他们需要清楚的答案。但一般被评估的任务都会花掉两倍初步估计的时间。
而大多数人并没有意识到,所谓的估计仅仅也只是猜测而不是承诺。作为一个更优秀的开发者你永远需要知道估计从来就不是承诺,一旦你承诺某件事,这就意味着你需要为此负责。
估计不曾是也不会成为承诺,这是估计的内在本质。人们往往都会害怕估计完成给定任务时间,如果你的上司要求你这么做,你就必须要告诉他这并不是承诺,你也不能保证100%按时完成这件事。
无论如何你可以做出猜测,但别做出承诺。
如何成为一代宗师?
- 沟通
沟通是一件必不可少的事,有一些项目或者公司夭折就是因为团队成员缺乏沟通。
沟通需简单直接,去掉中间者。要知道在你沟通线上每多个“节点”都会造成几乎指数级增长的困难和曲解。
企业往往会因为这个遭受很大的困难,这也是为什么它前进如此缓慢,每一个决定都需要进过十几人,这也是敏捷型团队能脱颖而出的地方。
保证沟通的简洁意味着你可以比其他人更快的行动起来,你能更清晰的明白你要做什么,这将成为你的个人优势。所以朋友放下你的架子,不要害怕去直接提要求或问问题。
- 合作
除了成为一个优秀的沟通者你也需要成为一个好的合作者,承认吧,程序员对社交方面并不是太在行。
你要合作的不仅仅是其他的开发者,还需要你的上司,也许还需要和你的客户。
合作可以让你知道目前的危机是什么以便更好的去完成你的工作,并扮演一个好的团队成员。
如果你发现很难与他人高效率的合作,去试试结对编程的方法吧。结对编程的本质就是合作。
这篇文章可以教你如何很好的利用他人的代码
- 知识诅咒
维基百科给我们这样定义:知识诅咒是一种认知偏见,导致知情方要从无知方的角度考虑问题就会变得非常的困难。
一般来说,高级开发者要向初级开发者以简单的方式来阐述问题非常的困难。这是因为他们已经非常熟悉手上的问题和解决的方法,但是当他们试着去给其他人解释的时候,他们往往会无功而返,因为这个解释仅仅只是他们脑中知识的总结。
简单的说,但你知道某件事的时候,你很难不去了解它。要解决这个问题,你得用简单易懂甚至有趣的方式来阐述一个问题,因为你的思想状态和被受着的思想状态是不对等的。
- 了解你的领域
如果你自认为是编程领域里的专家,那么你就要擅长它。你需要全面的了解你所从事的领域,不要害怕说“不”,直到你真正理解它。
很简单,成为一个专家的过程就是对其他人说“不”过程,因为你要捍卫你的真理,并在你的同行面前建立你的威信,因为大部分时候你都是对的。
并不是你有了CS的学位证书就意味着你了解你的领域,这仅仅只说明你拥有相关的知识和实践经验。除了一般编程和计算机工程你还需要去提高其他的技能。
作为一个专家,你是要找到一个问题最佳解决方案,编写代码只是完成的手段而已。
- 理解你从事的业务
如果不了解你业务上的问题和你的代码需要解决的是什么,你永远都不可能创造一个优秀的软件。
对你的业务充满兴趣是必要的,因为这些都会反映你的工作状态上。如果没有明确的目标和具体的问题,你的代码也只是一推垃圾,这就是编写代码应该首先做的事情。
你需要知道用什么功能去实现需求,特别是如何去实现,你必须清晰的认识需求的商业价值。
如果你觉得你的专业知识和业务的目标不是一致的,那么帮你自己一个忙,拒绝这份工作。珍惜你的时间,因为它是无价的。
- 编码实践
要持续的提高自己,首先你必须知道你目前是在什么水平。
通过代码实践,和不断寻找更好问题解决方法是一种提升技能的非常好的方式。
你可以通过这几个例子来尝试代码实践 Project Euler, CodeKata or Topcoder.
TopCoder甚至为寻找最佳的编程解决方案设立了专门的奖项。
总结
编程相比于其他的技能更是一种社交技能,要成为一个好的程序员,如果你你发现自己很内向,首先要改变自己的性格,然后再去掌握编程原理。
要在游戏中领先一步,你需要不断的提高自己,不断的去学习。要实现专业化,你需要去了解你的业务和真正需要解决的问题。
代码只是整个解决方案的副产品,他只是宏图中的一小笔。解决问题的思路,合作的技能以及去解决问题所掌握的工具都是你成为一个受尊敬的专业人才的关键。
个人补充
- 好的团队文化
我不是一个典型的程序员,但我在一个典型的技术型公司云巴工作。
云巴是一个小团队的公司,却能在短短几年的时间内能够做到物联网通信的领先水平,离不开团队的精英式的文化和管理方式。
没有固定工作时间,在有效的时间内做最有效的事,以输出的结果为导向。
以问题解决方法和思路为大,出现一个问题,团队都会开交流会,每个组员都要交换思路和提出建设性方法。
如有成员学习到新的技术或者有个很好的思路,团队也会组织学习交流会。
每个程序员都想成为一个受人瞩目的大牛,而我认为这光靠个人的一腔热血是不够的,这需要整个团队一起进步。熟话说一方水土养一方人,我想把这个道理放在团队和个人的关系中同样适用。