您所在的位置:小祥子 » 编程 » 程序猿 » 正文

漫谈程序员系列:噢,我是一个鬼问题!

时间:2015-04-24 编辑:佚名 来源:本站整理

程序员(软件开发工程师)有很多别称,比如“程序猿”、“码农”、“代码工人”、“码字猴”等等,都是幽默的阿猿们自黑的结果。这些个别称,指出了一个不争的事实:程序员要写代码。然而,被遮盖的问题是:程序员写代码的目的。

程序员的职责是解决问题

软件的目的是解决生活和生产过程中的问题,为人们带来便利,提高生产力和生产率。

程序员生产软件,所以,程序员的终极目的是用软件来解决自己和他人生活中的问题。这是程序员的职责,而写代码,不过是解决问题这个复杂旅程中的一小步,非常非常小的一步。

开发软件苦难重重

程序员是为着解决问题而生的,可实际上,程序员的工作过程中,需要面对许许多多问题,问题让程序员痛苦,一个问题解决之后,新的问题马上又会出现,让程序员继续陷入无尽的痛苦。软件开发其实就是一个不断面对问题和解决问题的过程。所以,从这个角度来讲,开发软件苦难重重。

考虑软件开发的整个过程,大概有这么几类问题:

  • 产品定义问题

  • 架构设计问题

  • 实现偏离需求

  • 软件BUG

  • 维护问题

  • 沟通问题

具体的问题我们也无需展开来说,不是本文的重点。本文的重点是,如何面对问题。首先我们要看看几种现实。

鸵鸟症

鸵鸟在遇到危险时会把头埋进沙子。

OK ,这是逃避问题的一种方式。

很多程序员也采取类似的鸵鸟策略来逃避自己面临的问题和需要承受的痛苦,问题解决不了,就拖拖拖,往后拖,就当没看见,兴许到时神迹出现问题不见了呢。

这都是自欺欺人。虽然鸵鸟策略会让程序员暂时避免了痛苦,但却不得不去承受另外两种更深邃的痛苦:看不到希望的交付期和没有尽头的维护。

贴膏药

还有一种常见的处理问题的策略,就是贴膏药。这种在解决软件BUG时比较常见。

说实话软件的质量和程序员个体关系太大,有追求的会写简洁、有效、逻辑清晰的代码,出了问题比较好分析、解决;敷衍的呢,就随便搞搞能 Run 就行,出现 BUG 就很难肠,总是寻寻觅觅寻不到,最后呢,就只能是揣摩着在某条路上堵点东西,贴块膏药,久而久之,这代码就丑陋得不行,到处是狗皮膏药,你要是想揭开看看里面到底是啥,都无从下手。说什么飞越迷雾把代码看清楚,都是梦啊。

绑架产品经理

有一些问题来源于开发实现与产品需求定义之间的分歧。这个时候就看开发和产品沟通的结果了:要么产品妥协,把一个问题定义为使用习惯什么的以便延后解决;要么打回给开发重新实现。

我见过很多次妥协的情况,有的问题真的还蛮重要的。我认为这种情况,多数时候是程序员运用自己的技术优势为自己的理解偏离保驾护航,最终绑架了产品经理。这是程序员不愿意看到、看到了也不愿意承认的事实。

接受苦难,实现超越

令人欣慰的是,只要接受了软件开发苦难重重的事实,程序员就能从苦难中解脱出来,实现产品和自我的超越。程序员正是在承受痛苦和解决问题的过程中,技能、经验和心智得以成长和成熟。如果害怕面对问题,畏惧承受痛苦,一心想要逃避,那么我们虽然能够逃避一时的痛苦,却会承受随之而来的用户投诉、产品失败、公司破产等等更严重的后果。

你不解决问题,你就会成为问题。作为程序员,这是我们一定要牢记的。

面对问题的泥沼,不可能跃过,我们的选择,只能是穿越。

直面问题的好处

程序员都是成年人(有童工吗)了,应该有能力去面对问题和痛苦。但实际情况是,作为成年人的程序员,心理却不一定成熟,有时还是会像小孩子一样,不愿去面对和解决问题。这有能力问题,也有心理问题,但从旁观者看来,这归根结底是能力问题。

我们来给能力下个定义:解决问题的态度、技能、经验和自我学习的欲望,综合起来就是能力。

直面问题,会提升能力。这是最大的好处。

规避问题,会失去提升的机会,阻碍自我成长。但我们常常会这么做,一方面是我们倾向于认为正在做的事儿不是我们自己的,是公司的,老板的,我们还有退路;另一方面是因为,接受问题、解决问题会挑战我们的技能、经验、认知习惯,是沉重而痛苦的,人的天性中有一点是拈轻怕重避重就轻,说白了就是愿意当下舒服。

软件开发过程中的问题不会因为程序员的回避而消失,问题会一直存在,并且老问题会滋生新问题,导致问题越来越多,超出产品、团队、公司所能接受的范围,最终在某个时刻集中爆发出来。

我有过很多次这样的经历,鸵鸟症让我不自觉地延后问题,总觉得最终交付期限还早,总抱着不切实际的幻想,自己骗自己说随着时间的推移也许问题会自己消失或者出现一些情况让问题不再是问题。但实际情况是,项目不断延期,测试结论总是“达不到释放标准”,为了上线不断地加班,搞得大家伙又疲惫又无奈,期间的痛苦甚至让人绝望,我们都被问题淹没了,看不到出头之日。这个时候我是真心后悔没有及早暴露问题、解决问题,有时也告诫自己下一个版本下一个产品一定不能这样。可事实是,恶性循环一旦形成,惯性很大,很难 break 出来。这会让人厌烦、不堪忍受、不得安宁,努力多次后,当发现在当下的环境里无法改变这种恶性循环时,我会倾向于换个环境重新开始。这也是换工作的一种常见的原因。

为了避免这种情况,最好的办法就是克服就轻、逃避的欲望与习惯,接纳问题,拥抱痛苦,遇佛杀佛遇鬼杀鬼,第一时间解决各种问题。不要担心自己水平不够解决不了,人的能力都是在做超出自己能力的事情中提高的,这也是自我修炼的要诀:设定比自己能力高一级的目标。

解决问题的实践

我们把心态放开了放平了,那接下来就是如何解决问题了。每个程序员遇到的问题都不一样,解决问题的具体方法也天差地别,但还是有一些指导性的原则可供参考。

有效沟通

良好的沟通能力是优秀程序员最显著、最重要的特点。

如果你不能和别人有效地沟通,那你很难打磨出一个优秀的产品。

程序员需要和产品经理、市场、客户沟通需求、设计等等问题,这是逃也逃不掉的。虽然有些程序员选择软件开发就是为了避免和人打交道,但残酷的事实是,在如今兵团作战的环境下,“两耳不闻窗外事,抱着键盘敲敲敲”的埋头苦搞是搞不出来好东西来的。

程序员还要和开发同事、测试 MM 沟通,简直是各种沟通……

如果我们能准确地表达我们的想法,正确理解别人的意图,那就可以在产品初期规避很多问题。

尽早暴露问题

问题暴露得越早越好,解决的成本也越低。如果临近交付时蹦出来神问题,会击垮可怜的程序员,他们会更倾向于回避、掩盖问题,有时实在没辙了,会和测试、产品一起,大家伙一起把自己给说服,改变问题的属性、范畴、严重程度,然后相互安慰,这看起来不是什么问题了。

从软件开发过程来看,下面的做法会尽早暴露问题:

  • 需求评审

  • 设计评审

  • 同级代码审查

  • 持续集成

  • 迭代测试

正确认识问题

无论你怎样有效沟通,无论你采取多少措施来尽早暴露问题,还是会有预料不到的事情发生。这就是软件开发的不确定性,是我们必须接受的事实。而对于程序员来讲,一定要牢记,你在生产代码,也在生产 BUG 。我们要正确认识这个事情,出现问题时,不轻视,不回避,不隐瞒,不悲观,实事求是地来面对,实事求是地来解决。

如果我们不能正确地认识问题,那迟早有一天,我们自己会成为问题,那时,我们面临的,将是被冷落、被淘汰。

关键词:程序员