如何让优秀的程序员更进一步
概述:本文摘选自国外著名的程序员博客网站blogoverflow.com上的文章.文章指出了到达到比"优秀"更好的程序员应该具备的一些特质.
作为工作了好些年的程序员,是否你的思想已经出现升华?目标不再是停留在“优秀”层面,而是打算向更高级别的“伟大”而迈进?现在的你想要让写出的所有程序都遵循自己的理念;现在的你想要成为编程方面的大师——而不是那种碌碌无为,守着.Net接口苟活度日的书呆子;现在的你认为编程学是一门艺术而不再是科学,而你想要成为程序员中的毕加索,受人尊敬。
言归正传,现在最重要的是如何去实现这个变得“伟大”的目标。
作为资深的程序员,你应当认识到“伟大”区别于“优秀”的地方并不只限于技术方面。其中一个很重要的区别是“伟大”的程序员能够从客户的角度去分析需求,使设计更加人性化。而“优秀”的程序员只会完成既定的功能。当然,如果知道客户的需求,而无法提供有用的技术支持也无法被称为“伟大”。那么我们来看看迈向“伟大”应具备的一些特性吧。
定期清理重复代码
复制和粘贴的程序员不是真正的程序员。如果你发现自己编写的代码行不止一次的出现相同的(或类似的)情形,那么你就该考虑将这些代码片断进行清理整顿了。这种使代码变得更小,更加容易进行维护,出现程序错误概率更低的工作我们称之为代码重构,这是必做的日常工作的一部分。
保持代码简短实用的风格
在你掌握了清理和重构代码的技巧之后,下一步,你要学习保持代码简短实用的风格。想像一下,一篇长的离谱的主程序代码对于维护它的人来说会有多么的恐怖。那么在主程序前加入头文件,将繁琐的主程序进行分块打包,会让程序维护起来简单一目了然,且编译的时间完全相同,我们何乐而不为呢?
了解YAGNI原则和编程的艺术
YAGNI全称为You Ain’t Gonna Need It,即为“你不会需要它”之意。作为程序员,我们常希望自己设计的东西能够涵盖所有基本需求。可事实往往是这样的,最开始客户希望应用程序完成其中的a功能,在你完成后,他们又认为应该加上b和c功能。然后,我们又花上几天时间去完成b和c 功能,毕竟这是客户的需求。这样的需求变更一次又一次,最后会得到一个比计划大很多的代码库和应用程序,而你曾经编写的一半代码都没用。为了减小更改需求带来的影响,让你的解决方案保持灵活性、可定制性和可预见性是工作中的一个非常重要的部分。在这里,编程真的就成为了一门艺术了——没有硬性规定,完全自由的裁量度,灵活性全部由程序员自己决定——这和绘画一样,多一笔少一笔,是轻还是重全由艺术家来权衡。
学会尊重他人
代码审查是将代码提交给有经验的程序员来帮助检查源代码与编码标准的符合性以及代码质量的活动,很多人会以为这就是给代码挑刺的活动,事实上代码审查最重要的并不是去关注技术细节,而是去留意设计理念,设计方法和实现过程,并提出参考性的建议。如果你觉得应该把别人的每个BUG的细节都一一罗列出来,展示别人的代码有多么的糟糕,那就错了。这在无意之间传递了一条错误讯息:我是来找碴的,是来让你难堪的。别人会因此刻意回避与你讨论,而你也将失去一个学习的机会。在这里,你应当学会尊重他人,就算他比你差很多,你也应该抱着这样的心态:“我们是来互相学习的。”
灵活运用设计模式
阅读设计模式的经典书籍常会为你带来灵光突现的时刻——“哈,这就是我解决这个混乱编码问题的方法。”设计模式可以在软件工程的开发中给人们带来便利,但是,往往其结果却是使程序变得更加混乱。这是因为人们在掌握了设计模式这个“锤子”后,往往会把所有的问题都想像成是“钉子”,而不根据实际情况进行具体分析,这样常使结果适得其反。灵活理性的使用设计模式很重要。
对最新的框架和库了然于心
对于最新的框架和库,你可能不会使用它们,但是你得清楚它们能够干什么。这里我举一个自己的例子——在SignalR出现以前,我一直坚信到目前为止还没有方法能够轻易实现网络应用实时通告的功能,我用了许多的代码来完成这项功能,费时又费力。但事实上,pubnub这样的库已经能够轻松实现这样的功能了,只是我不知道而已。因此,如果你无法对所有的框架和库都了然于心的话,在编写程序的时候,难免会干出许多低效率且无意义的事。滴水穿石,聚沙成塔,你要记住,伟大源自不断的积累和坚持。
不要忘记为代码添加注释
这无疑是一个利己利人的好习惯,不要因为它的麻烦而拒绝它忽略它。试想一下,你要对半年以前自己写的程序进行维护,如果没有注释的话,单凭半年以前的零星记忆,要在成千上万条代码行里去寻找你想找的东西无疑是大海捞针。 另外,使用注释也是对设计理念,算法流程的最好保存,当别人问及你算法中“X功能是如何实现的”,你难道 要跑去翻半年前的算法设计图纸或者挨着把程序从头到尾看一遍?添加注释虽然费时但却能为以后的工作省时省力,磨刀不误砍柴工,说的就是这个道理。
重视单元测试
编写测试用例能够确保你的代码能够持续正常工作。通过对用例的单元检测,你可以及时的搞清楚程序的哪一块运行正常,而哪一块与设计的预期不符,并及时更正,而不是等到几天后应用程序出来,只发现有数据异常,却无法及时找出这些异常的所在。另外,你还应当学习TDD(驱动开发测试)。
了解控制反转(IOC)与依赖注入(DI)
控制反转是目前备受争议的一种技术,它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。而依赖注入是其中最流行的IOC类型,其中包含接口注入,设值注入和构造器注入三种方式。如果你仍不了解IOC是怎么一回事,你可以这么想像:把代码比做曾经的对象掌权者,它现在被剥夺了控制权,被排挤出了核心领导层。
学习多种编程语言的精髓
论坛上经常有程序员在争论编程语言的孰优孰差,这其实是没有意义的。在你了解了多种编程语言后, 你会惊奇的发现每种语言都有其可取之处。例如,python的简单易用和ruby on rails在 web应用程序开发的闪光点是硬币的一面。硬币的另外一面是严谨整洁,功能强大的javascript和C++。同样的,硬币两边的c#开发者和Java开发者眼里看对方都会不同。盲人摸象,只有尽可能广泛的去触摸编程语言这头大象,它的形象才会更加完整。
懂得与其它程序员友好相处
程序员是一个奇怪的物种,这里面不乏有疯子,狂人,呆瓜和奇葩,当然你也可能是其中之一。如何和这些人相处是一门挑战,在这里,我推荐卡内基的《如何赢得友谊及影响他人》,这本书很经典。
本文整合编译自What programming concepts I should master to have a deep understanding of my craft?