电影《喜剧之王》里,周星驰饰演的尹天仇,是一个渴望成为真正的演员,却不断沦为落魄跑龙套的小人物。

即便如此,他对演戏的态度始终认真而可敬。他每天不但锲而不舍寻找演戏机会,还在街坊福利社开了个戏剧训练班,更是在逼仄房屋的床头,一遍遍看着《演员的自我修养》。


少有人专门去看这本书到底讲了什么,却也能从星爷身上感知,对待职业的态度和修养被刻画得如此淋漓尽致,大概也是这本书所传递的精神吧。

在职场上,在编程界,也流传着程序员的自我修养。

开发人员的技能范围很广,往往不会根据工作年限来评价一个人的才能。所谓五年、十年的“工作经验”也不一定是有能力、高效开发人员的佐证。

培养良好编程习惯,形成专业的风格和极致的治学态度,是一名优秀的开发人员会考虑的问题。在追求卓越的过程中,这些习惯都会积累下来,形成人生道路上优秀的修养和品质。

那么,编程中,尤其是对于初学者而言,有哪些好的习惯从一开始就值得坚持呢?

通过查阅收集国内外一些优秀程序员,公开分享的方法和经验,我们总结出以下7条良好的编程习惯:


0x0001 代码规范

一切皆对象。程序员初学者在规划代码结构的时候,也需要有面向对象的思维方式,培养良好的代码规范。

对于个人而言,良好的代码规范能提升代码质量,减少低级的代码错误。

对于团队而言,每个人写代码的思维方式、技术水不同,保持一致的规范,能保证项目结构不混乱调用,有效降低协作沟通成本,更好地保障线上的稳定性。


很多小白初学Python,会发现在 Python 里涉及到很多名字,模块名、变量名、函数名、类名。给它们命名的时候,往往为了节省时间而喜欢缩写命名。

例如,使用‘r’来代替圆的半径而不是用‘radius’;更夸张的,喜欢使用拼音缩写,比如xswl、kcsl、zgxm……

这是非常错误的示范,因为当你投入大量的编程工作,你会发现一开始节省时间的缩写,之后会浪费更多的时间,去猜测缩写变量名代表什么。

无论如何,使用有意义的变量和函数名称。除命名外,布局规范、注释规范、代码使用规范等,都需要学习和遵守。

最直接的办法,遵循公司已有的代码规范,从简单的变量命名到模块划分,一些现有规则可以导入到编码工具中。

还可以用检测工具来规范。每一门编程语言,都有属于自己的编程规范,通常也有属于自己专属的检测工具,如Python有PEP8、Java有CheckStyle等,一开始你可以用一个工具来,帮助自己检测程序是否符合规范,结构是否良好。

正如风变编程Python小课第一节,吴枫老师引用的《Python之禅》,在Python届,用来阐释代码规范是最合适不过了:

优美胜于丑陋(Python以编写优美的代码为目标)
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
简洁胜于复杂(优美的代码应当是简洁的,无复杂的内部实现)
复杂胜于凌乱(若复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)

代码的可读性很重要,优美的代码是可读的。


0x0002 阅读源码可以提高编程能力

学习都是从模仿开始,路遥在创作《平凡的世界》之前读了大量的“名著”,他把所有尊敬的作家都安放在历史为他们准备的“先圣祠”中,让他们各自光芒四射,照耀大地,才创作出百万巨著《平凡的世界》。

程序员亦是如此。

编程有时就像写作文,提出问题,分析问题,解决问题。要想提高写作文的水平,就要增加阅读量,读高水平的作文,从中学会模仿作文的套路,从而写出高水平的作文。


在编程学习中,阅读源码我们可以学到很多东西:别人高效的代码书写、别人对设计模式的熟练使用、别人对整个架构的布局等,不仅能帮助我们在早期形成良好的代码风,更提高我们debug的能力。

因为不管是入门时阅读教程里的示例代码,还是进阶时阅读优秀项目源码,会使用固然重要,但知道为什么这么使用同样重要。

多阅读、记录一些源码作品吧,这将帮助你写出既可执行,也能别人读得懂的代码,对代码的维护和扩展大有好处。


0x0003 掌握多种语言

刚入行的程序员都有一个梦想,希望利用自己掌握的编程语言,实现心中所想象的应用场景。

但真正开始工作后,发现仅用自己掌握的编程语言去圆梦,几乎是不可能的事情。因为很多项目几乎不是一个人做的事情,需要一个团队,甚至几个团队协作。


每门程序语言都有其最适合的领域,当你需要解决的问题时,你要找到一个最适合的语言来解决这些问题。

如果你需要性能,可能C/C++是首选,如果你需要跨平台,可能Java是首选,如果你要写一个Web上的开发程序,或是处理文本和别的应用交互,可能 Python会是最好的。

所以,花一些时间去探索一下其它你并熟悉的程序语言,能让你的眼界变宽,知识面越广阔,思考问题也就更为全面。


0x0004 培养代码模块化思维

生活没有什么是独一无二,我一直相信,我们所要的生活,所面临的问题,肯定前人都有经历过,更多时候我们只是重走前人的足迹而已。

如同一个个模块,因为前人有去经历、感悟、总结,最终将所有优秀的、稳定的、持久的因素结合在一起,形成我们所看到的,一般人能接受的模块。

模块化的思维方法是一种站在巨人肩膀上的思维方法。

它对工作效率的优化帮助很大:

帮助我们把复杂的工作分解,分而做之,降低难度;
帮助我们更好把握工作中的重点和主次,合理分配时间和精力。

一个优秀的程序员,遇到大的难题,能够将问题划分到功能相对独立,输入输出关系相对明确的模块实现和组合的问题。

并且,他们的思想往往不会局限于当前的工作任务里,更会去看自己写的模块,是否可以脱离当前系统存在,通过简单的封装在其他系统中或其他模块中直接使用。

这样编写代码,还能够作风险隔离。


赫伯特·西蒙就讲过一个关于制表匠的故事。假设每只手表都有1000个零件,第一个制表匠一个零件一个零件地安装,如果他出了一个小错,或是工作被打断,就得从头再来;

第二个制表匠则把手表分为10个模块,每个模块中又有10个小模块,每个小模块中有10个零部件,那么,即使他装错了,或是工作被打断,损失的只是工作的一小部分。

时常训练自己的模块化思考,能够在你编程时具备这种风险隔离意识,规避出错带来的不必要劳动。


0x0005 理性面对不同的编程语言或操作系统

开发者的世界里总是充斥着各种各样的争论,从编程语言、框架甚至到编辑器、Windows/Mac 系统,都可以成为争得面红耳赤的“宗教战争”。

就拿编程语言来说,人们往往偏向于喜欢自己用得熟练,用得多的那个语言。语言好坏之争,就和争谁的女朋友漂亮一样,我当然觉得自己的女朋友(虽然是null)最漂亮,但是别人并不这么觉得。


但任何语言都是为解决问题服务的。

从来没有什么最优秀语言,能够让一个人变得聪明又厉害。任何运用得当的开发语言或者技术,都会让精神愉悦。

Java也好,C#也罢,都是开发者们用来解决问题的工具。不要过于陷入浮躁的争论,而是暗示自己要理性去分析和面对,才能客观地做出正确的选择。


0x0006 学会独立思考解决问题

作为一枚程序员,我们天生就是来解决问题的。因此最忌讳的就是,遇到困难时,没有经过自己的思考和检索,就截图抛向别人。


如果你入门学编程,一定要养成这样的习惯:在问别人问题之前,先自己搜索一下吧。

当你有什么需求的时候,往往别人也有这个需求,而且往往也有了相应的工具去解决你这个需求。用好搜索功能,Google +Stack Overflow + GitHub 能解决你的大部分编程问题。


0x0007 时刻保持求知欲

除了写代码,程序员的日常还包含编写需求文档、设计数据库结构等,这些技术性工作可能已经排满了工作的八小时。

因此,很多人常常疲于去训练非技术的软技能。

很多程序员被挂上“直男”和“不善沟通”标签,是因为他们并没有刻意去训练沟通能力和管理能力。但往往这些能力,能带来意想不到的价值。


比如一个善于沟通的开发,可以更好地阐述用户故事,无需借助行业术语(那些让别人把他们当作外星人的话)就能把技术细节讲给外行人听。

能够问出更好的问题,进而更深入地理解客户需求,最后才能实现最漂亮的东西。

就像学员喜欢听吴枫(Python小课的老师)上课,觉得吴枫充满魅力,讲的课堂充满意思、通俗易懂。其实是因为吴枫涉猎广泛,除了专业知识外,刻意训练许多学科的技能,比如学沟通,学团队合作,学写作,好读文史、读心理、读科学等。

一定要时刻保持求知欲。

互联网时代的技术来得快,去得更快。如果没有足够强的求知精神,就无法跟上变化。

10多年前,做前端页面,写js脚本都是直接html里写<script>,<script>里直接写一堆function。

jquery来了,不用自己写一堆操作DOM的原生js API了,也能较好的解决浏览器兼容性问题。

到后来,js模块化的概念来了,典型的如requirejs,解决了js文件按需分块加载的难题。

到现在,react、angular、vue的崛起,jquery基本上已经到了退出历史舞台的地步了。

你苦心钻研多年引以为傲的技术,往往可能一夜之间就没有用武之地了。

因此,保持求知精神,既敢于在技术栈在保持不断地更新,也不排斥接纳非技术实力的学习,才是一个卓越者的胸怀的见识。


0x0008 尾声

我们每个人,都不愿成为一个被生活牵着鼻子走的人,于是会把一个个小习惯融入到自己的生活,尽力去成为我想要成为的那个人。

有的好习惯做着做着就习惯了,谈不上坚持,最终成了喜欢的自己,明白了自律真的给人自由。

编程同理。希望每个初学者,都能尽早领悟且找到属于自己学习的那份好习惯,并自然而然地保持,最后成为超级厉害的人。