程序猿,你如何能写好程序?


刚领证的著名程序员狗叔(@Googollee),前几周提出了很好玩的问题:“把程序写好的知识,是从哪里学来的呢?”。

我和狗叔回忆,我们好像都没有正经上过什么“把程序写好”的培训班,也没有《九阴真经》之类的宝典。但是我们又都看到,很多程序员写的程序是不合格的,大量基础规范都没有遵循(更可怕的是这样的程序很可能还在服务我们每天的生活)。那么,优秀的程序员,是从哪里学到把程序写好的知识的呢?

这个问题我想了很久,有几点结论可以分享给大家。

首先,必须要正视“写代码”这回事

有很多人虽然做着程序员的工作,其实内心是看不起写程序的。对他们来说,写代码只是不得不经历的初级阶段,等到职业生涯发展了,就可以脱离这种单调无聊的工作了。但是,这种想法是错的,有这种想法只能说明对计算机和程序的认知还相当肤浅。写代码绝不是简单无聊的劳动,程序员首先必须了解计算机的运行原理,然后需要把现实问题建模,并在计算机的世界里精确地还原出问题的解决方案。既然代码要交给功能强大的计算机去严格执行,程序员要担负的责任就相当大,因为代码的任何一点差异,都有可能影响程序最终的运行结果——因为程序的细小缺陷导致航天任务失败的例子已经有好几次了。

反过来说,程序员能掌握的权力相当大,成为“合格程序员”的门槛也相当高,虽然这种门槛并不为许多人所知。前段时间有很多人叫嚷“我万事俱备,只差一个写代码的”,恰恰是因为他们把写程序看成简单机械的劳动,但以自己的聪明才智又学不会这种“简单机械”的劳动。这种矛盾,恰恰说明写程序是有门槛、有要求的。所以,要想成为称职的程序员,必须正视写代码。

其次,必须读过一些基本的书籍

学校里通常会安排编程语言的课程,但不会教“怎样把程序写好”的课程。许多人对计算机的理解还停留在“科学与理论”的角度,只要程序能“对”,能输出正确结果就可以;却不知道如今与计算机相关的大量工作,其重心已经转移到实践和工程意识的方面了。这种错误的理解,导致很多程序员在工作之后相当长的时间里,学习的内容还局限于钻研理论和算法,一直忽略了“把程序写好”的补习。

其实市面上已经有一些教人“把程序写好”的书籍,认真读完这些书,认真落实其中的规范,至少能保证把程序写“合格”,不会有明显的缺陷,为将来把程序写好奠定坚实的基础。从我和身边朋友的经验出发,我觉得《代码大全》、《重构》、《编程珠玑》、《程序员修炼之道》这几本书都是很不错的,如果能耐心读完并认真思考,写程序的水平会有相当的保证。

要保持好奇心,多借鉴其它项目的内部实现

我们时常开玩笑说,现在很多程序员的工作,就是从网上下载一些开源项目,然后改改参数。其实这并非玩笑,而是很多程序员工作的真实写照。充其量,他们还要做一些穿针引线的工作,把这些项目粘合组装起来。

这看起来确实是简单机械的劳动,也不会给人多少提升。但事实并非如此。很多好的程序员就在这个过程中学会了把代码越写越好。因为他们保持了好奇心,去探究这些开源项目的内部实现,把应用的过程当成了学习的途径。在使用一个现成方案之前,先想想如果自己去解决要怎么办,再看看其他人的现成代码,确保自己懂得了这些代码蕴含的思维。甚至比较相类似的几个开源项目的源代码,分析其优劣,在自己的工作中注重借鉴其长处,避免其短处。久而久之,写程序的水平自然会有大的提升。

在写程序时,要懂得在工程与理论之间求得平衡

在谈到写程序时,经常有人引用奥卡姆剃刀原则,说“如无必要,勿增实体”;也有人引用爱因斯坦的话,“要足够简单,但不应该过于简单”。由此证明,好的程序应当是足够简单而且非常优雅的。

在大方向上,我认同这种说法。但在具体的问题上,它未必正确。因为编程是与工程密切相关的工作,与工程密切相关就意味着大量的权衡、取舍。无论奥卡姆剃刀原则还是爱因斯坦的话,原本的主题都是针对理论的,所以两者并不能严格划等号。

在实践中我见到过很多过份迷恋简单、美感的程序员,我称之为“玩套路”——他们太在意程序的形式美感,为了刻意追求那种严谨整齐的感觉而忽略了现实,也不懂得针对现实做出取舍,最终把自己套了进去。结果,用户明明需要的一亩菜地,他们交付的却是一份盆景,还振振有辞地指责用户不懂技术。这样的人,往往既当不好程序员,也成不了软件开发工程师。

坦然接受其他人对自己代码的批评

Code Review是提高代码质量的有效手段,这一点大家公认。但是在很多场合,Code Review很难推行起来,原因之一就是程序员内心难以接受其他人对自己代码的批评。

这种现象倒也情有可原,因为写程序这回事,大家多少认为是有绝对标准,可以分出高下的。对大多数人来说,潜意识里也确实很难区分“对我的工作的批评”和“对我的批评”。所以面对其他人对自己代码的批评,除非是来自上级,否则多少有些面子上挂不住,天然有争辩的冲动。我自己就遇到过好几次这样的情况,本来讨论理论和方案一切正常,只要涉及到“看某人的代码”,气氛就随之大变。

我们需要明白,不经历挑战和批评,人是很难提高的。其他人的批评,只要不是恶意的,总是能提供不一样的视角,帮助我们更深入或者更全面的认识问题,这是很好的成长机会。相比起来,“丢面子”更多只是一闪而过的,甚至根本只是自己觉得很丢脸,其他人完全不在意的。为了怕“丢面子”而排斥其他人的批评,实在是得不偿失。

另一方面,团队领导也应当营造平等合理的协作气氛,倡导“对事不对人”的价值观。这样,才能让更多的成员坦然接受对自己代码的批评。

程序员需要有对荣誉感的追求

归根到底,“荣誉感”是驱动个人不断追求更高境界的源动力。对没有荣誉感的程序员来说,“把程序写好”充其量是不得已背上的负担;而对于具有荣誉感的程序员来说,“把程序写好”是需要不断追求的目标。

在我看来,程序员的荣誉感主要体现在两个重要的方面。第一是对质量的追求,好的程序员一定会对自己交付的程序的质量负责,力求做到没有缺陷,所以不会依赖Code Review来发现代码的缺陷,也不会依赖测试来发现功能的缺陷…… 甚至要向上游扩展了解问题的起因和目的,向下游扩展了解程序运行的状态和行为——这已经是“全栈工程师”的雏形了。

第二是对“用技术更好解决问题”的不断思索和追求。程序与现实不完全相同,所以很多时候并不受现实的严格限制,程序能不能突破这些限制,如何突破这些限制,靠的就是程序员的荣誉感。现实中很多时候确实“鱼与熊掌不可兼得”,但是在程序的世界里,在某些情况下,鱼与熊掌是可能兼得的。现实中“菜刀用来杀人”似乎是无解的,但在程序的世界里,有些菜刀就可以做到不能用来杀人。普通人或许囿于现实生活经验无法想想“鱼与熊掌兼得”、“菜刀不能杀人”,但想把程序写好的程序员,一定不能就此止步。

最后我想说的是,程序员应当属于德鲁克说的“知识工作者”。对于知识工作者,我们就不能像对待机器和工人那样去严格约束工作的过程,只能要求结果,或者说“找到合适的人,提供合适的环境,期待美好的事情发生”,这也是很多程序员享受的方式。但是,如果程序员不在乎自我驱动和追求,把写程序当作不需要任何想象力和创造力简单重复劳动,那么“血汗工厂”的工作方式可能更能保证生产效率。

文章转载自 开源中国社区[http://www.oschina.net]

时间: 2024-10-27 19:02:18

程序猿,你如何能写好程序?的相关文章

程序猿正能量之祖母的坚持 - 程序猿,你有什么理由放弃!

一.引言 昨天,回家的地铁上照例带了一份北京日报,其中的一篇报道吸引了我.<64岁祖母级选手53小时横渡海峡创纪录>原文摘录如下: 新华社电 美国东部时间2日下午2时左右(格林尼治时间2日19时),黛安娜·尼亚德的身影终于出现在佛罗里达州的基韦斯特海滩.她看起来有些恍惚,嘴唇肿胀,脸上尽是被晒伤的印痕. 这也难怪,这位64岁的祖母级游泳选手此时已经连续游泳近53小时,成为没有防鲨笼保护下横渡美古之间佛罗里达海峡的第一人. 上岸后,尼亚德用仅存的力气对围观者说:"我只想说三句话,第一,

&lt;传&gt; 《程序猿装B指南》,程序员童鞋们请认真学习

一.准备工作"工欲善其事必先利其器." 1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好.一个用来查资料,一个用来写代码.总之要显得信息量很大,效率很高. 2.椅子不一定要舒服,但是一定要可以半躺着. 3.大量的便签,各种的颜色的,用来记录每天要完成的事务,多多益善.沿着电脑屏幕的边框,尽量贴满,显出有很多事情的样子. 4.工具书,orelly的,机械工业,电子工业什么的都可以,能英文就英文,不行影印版的也可以,反正越厚越好,而且千万不要放在书架上,一定要堆在

程序猿的表白情书写的都是什么哇?

简评:即便是拥有同样逻辑的代码,细微之处总有一些不同.那些在平日里可以忽略的差别,在某些时候,也能够彰显着主人的特质.代码这样充满严谨的事物,偶尔也可以感性.不如就把这些感性的细枝末节放大吧,用代码写下情书.谁说程序员的我们不懂得罗曼蒂克,只不过我们的浪漫你可能不懂得,其实"我一生都在等待,直到你闯进我的世界,我只想对你说:余生请多指教". "我的生活,因为有你" "感激能够遇见你" "我不再无枝可依" "你若不离,

怎么把别人程序打包,然后自己写的程序可以直接调用

问题描述 别人写的一个视频程序函数,因为我有多个视频窗口都要调用这个函数,所以想把这个函数打包然后我的视频窗口函数的部分就可以直接调用这个函数,而不用重复的写,该怎么完成??????????? 解决方案 解决方案二:不太明白,如果人家是dll的,那你就导入就行了如果人家有你可以用的代码,直接放到你的工程中不就行了,打包是啥意思解决方案三:把函数打包为dll,然后在自己的程序中引用就行!打包dll方法应该知道吧解决方案四:你的意思是生成dll是吧,新建一个类库,生成,在bin目录下就有dll啦解决

AKM项目奇人之写诗的程序猿

AKM项目奇人之写诗的程序猿 今天,项目组里的程序员同事ERIC,突然在微信朋友圈里,发布了一个MESSAGE,曰'拙作',然后下面是他共享的一个链接.打开链接,是他写的一首长诗,发布在LOFTER上面.让我大吃一惊,是故写下此篇文章. 初识ERIC,还是在2015年二月份.项目进入到实现GAP的阶段,为了实现这些本地化需求,项目组引入了几个ABAP程序员,ERIC是其中一个.ERIC是上海人,个子高而瘦,帅帅的,看起来很精神的样子.他家距离办公室不远,他每天骑自行车上下班,很环保的生活方式.

如何捕获一只野生程序猿做男朋友?

简评:都说程序猿找到妹子比较困难, 这篇文章却给了广大程序猿信息,还是有很多妹子喜欢程序猿GG的,哈哈,那么对于广大妹子,你们想知道如何才能捕获一只每天坐在电脑面前写Bug的野生程序猿么?其实吧,我觉得无论是程序猿追妹子还是妹子追程序猿,只要你用心,那么没有什么是不可能滴! 如何勾引程序员?好吧,虽然小编没啥经验,但小编在知乎上找到了该方面的话题分享,其中小绿分享了不少「勾搭」程序员干货. 小绿的回答: 那是12年夏天,我突然想找个程序员男朋友.经过一些机缘,我认识了一个程序员,但是很遗憾,我们

作为程序猿/媛的你在5.20这一天都干了什么???

今天是2017.5.20,也许你忙的都忘记了今天是网络情人节,因为5.20谐音我爱你,被称为网络情人节,也许身为菜鸟程序猿的你会写个小程序或者copy一个网页发给自己的女票或者媳妇或者.......我相信大多数工作的程序猿都不会再搞这种看似很幼稚的东西,因为很low,就算给女票看了,如果不是那种网页版的,女票也许看不懂,还不如给女票或者媳妇发个大红包或者去海吃一顿或者去大商城狂购一番更让女票高兴和k开心吧,之前我也给自己女票发过网页版的心啊,动态图片啥的,当然修改一下文字和背景音乐或者照片就行了

惊!十二星座程序猿竟然这样写代码

水瓶座 大概只有水瓶座的程序猿可以做到代码神秘到无人能解. 水瓶座,属于风系星座.常被称为"天才星座"或"未来星座".他们较着重于精神层次的提升,是很好的启发对象.对于编程,也是如此.水瓶座程序猿的代码中充满了各种天马行空的奇思妙想,同样也含纳着一般人没法理解的抽象. 双鱼座 如果说水瓶座程序猿写的代码是来自外太空的探险童话,那双鱼座程序员的代码就是浪漫的诗歌,字里行间都是普希金和海子的诗句.众所周知,双鱼座是极其细腻感性化的一个星座,哪怕是编程这种极富逻辑的东西,

写给程序猿们的交互设计

编者按:看到此文时恍惚回到自己学习网页的时候,那时候只知有编程,不知有设计.各个论坛大部分时候讨论的也是如何用 Frame 实现页面的分区,如何做出圆角,以及写一大段 javascript 代码或者做个 flash 只为让页面看起来更眩一点.后来 css1.0, 2.0 陆续出现,html 4.0 4.1 以及如今的 html 5 也逐渐淘汰掉了表现样式的标签.视觉传达思想开始陆续进入程序猿与产品经理的视线,从网页到现在的 APP,经历过野蛮生长阶段后,只有那些功能与视觉传达同样优秀的产品才能笑

如何激怒一个程序猿(2):又在写bug啊

在山的这边海的那边有一群程序员,他们老实又胹腆,他们聪明又有钱.他们一天到晚坐在那里熬夜写软件,饿了就咬一口方便面--哦苦命的程序员,哦苦命的程序员,只要一改需求他们就要重新搞一遍,但是期限只剩下最后两天~~  工作那么忙,压力那么大,有时候自黑也是一种乐趣!所以,你能在网上看到各种用"绳命"在自黑的程序猿们. 猿A:我妈看了网上关于程序猿的说法,天天担心我找不到女朋友,其实我也是有过女朋友的,话说小学的时候--:猿B:我也不是每天都穿格子衫的,我也有好多公司发的T恤,还有参加技术大会