作为软件开发人员的我们很幸运。我们喜欢我们干的工作,并且很多时候,当我们实际构建软件时,我们又非常开心。不幸的是,这样的情况并不普遍,因为许多软件开发项目要求开发人员除了编写代码之外,还要做很多其他的事情,例如开无聊的会议,建立文档或其他工件等等。在解决问题,学习知识和探索奥秘的同时,还要面对这些无聊的事情,可不是一件令人愉悦的事情。因此我们只能把注意力投入到编写软件中去。

专业的软件开发从根本上不同于大多数人的想法。它与使用软件或网络或其他任何东西无关。构建软件是一项非常有创意的活动。

我问过几乎所有我教过的学生一个问题,编写软件更偏向艺术还是科学。大多数开发人员表示,尽管两方面的因素都有,但软件开发更具艺术性。这意味着,作为一个好的软件开发人员,你需要更富有创意和具备抽象技能,而不是一个明确的过程就行。当然,即使是编写最简单的程序也需要大量的训练,这是一个通过投资时间精力而可以成长的领域。开发人员喜欢构建以前从未构建过的东西,喜欢解决问题,还乐意于提供改善人们生活的工具。

不要把我们想象成是那种孤僻阴沉的书呆子或沉溺于硅胶电路的极客形象。现代软件开发人员来自社会的各个阶层,他们有着各种各样的背景。

编写软件或许是最具吸引力和挑战性的行业。软件开发需要多种多样的技能,为了成功编写软件我们必须擅长所有这些技能。设计软件需要可视化创意——毕竟,我们是用我们的想象来了解问题并对解决方案进行建模的。编写软件需要坚韧不拔的品质——我们必须跟踪大量的细节,并使用各种各样的技术来管理程序的巨大复杂性,哪怕是一个相对简单的程序。调试代码则需要具备卓越的分析能力——完全不同于设计软件所需的技能,但开发人员必须两者都擅长。因此,我们倾向于在构建软件的过程中同时使用我们左右两边的大脑,这样有助于制作出令人高度满意的用户体验,同时这也是一个非常具有挑战性的经历。

我问了很多非软件开发人员关于他们眼中编写软件的过程,听到了很多不同的答案,但没有一个回答接近正确答案。我相信其他领域也是如此。专业的表演不仅仅是装扮。伟大的演员会代入他们的角色,就像变成了另一个人。这是一个伟大的技能,但是没多少人拥有,他们所做的事情并非他们的职业描述的那样。他们不是扮演他人,而是成为了他人。

我认识一些已经进入餐饮行业的人,他们喜欢与朋友分享食物的过程。但是,每天准备五百顿饭和与朋友坐下来享受美味晚餐是截然不同的。厨师是这么多职业中最难的工作之一。厨师的工作强度很大,这也是为什么很多人最终退出这个职业的原因。很多人认为他们必须对他们各自的领域做出妥协,因为生活就是如此——工作和兴趣不能两全。也许对许多人而言这是事实,但是软件开发人员可以在每天构建软件的工作中找到满足感。

当然,这需要付出巨大的努力,因为真正进入一个专业并不容易。我知道的大部分开发人员是在工作时或通过大量的自学才汲取到那些他们必须了解的知识。就其本身而论,这个行业的技能组合和知识量有很大的差异。现在还没有一套明确的标准,所以当每个人对于如何做事都有自己的想法时,团队工作开展起来会很困难。

编写软件是一个小组活动。大多数软件开发项目中的程序员彼此之间并不是孤立的。但是现在大多数为业务而构建的代码其团队合作并不紧密。当然,开发人员的并不以社交技能见长,但是随着我们意识到队友之间沟通的迫切需求,很多事情正在发生变化。

如何评估设计?

这是我经常在我的高级软件设计课中问开发人员的一个问题。我倾向于得到空白的反应,不是因为他们不知道如何评估一个设计,而是他们很少适用一个通用的衡量法则。这对团队来说可能是一个挑战,使得我们在构建软件时沟通和协作变得困难起来。所以我花了很多时间定义术语,以便能够评估软件设计中的良性。

开发人员喜欢我的课程,是因为他们意识到谈论和思考这些事情的价值。我有幸能有机会与许多高级软件开发人员合作,在合作过程中,我努力找出他们成功的原因是什么,然后与我合作的其他开发人员分享。好像我们每个人都有一块拼图,当我们把这些拼图放在一起的时候,我们就得到了一幅优美的画卷。大赞!