本节首先对本章所涉及的几个概念进行说明。这些概念包括:代码、艺术和软件工程师。
1、代码也能成为艺术作品
本章标题叫做 “代码的艺术”,很多人不禁会问:代码和艺术有什么关系?代码也能成为艺术作品吗?
具体将哪些代码成为 “艺术作品” 和 “非艺术作品”,说起来有些困难,我们先通过建筑物找找感觉。我们知道,即使都是 “房子”,也可以有很大差异。如图 1.1 所示,类似这样质量较差的房子在很多地方都能看到。这样的房子可以住,但是可以称之为艺术品吗?
图 1.1
图 1.2 中是一个标准的居民楼,在全国各地都非常常见,这样的居民楼可以成为艺术作品吗?
图 1.2
图 1.3 展示的是故宫的角楼,这是中国建筑的一个典范之作。这可以被成为艺术作品吗?
图 1.3
通过展示这些建筑物图片,大家可以回想自己写过或见过的代码。这些代码或许都可以运行,但是有些代码可能像图 1.1 中的房子一样 “简陋”,有些代码可能像图 1.2 中的楼房一样规整,而有些代码可能会想图 1.3 中的建筑物一样成为精品。那么你希望自己写出什么样的代码?
代码不仅仅是一些字符,更是人类智慧的结晶。代码的价值不在于它的长短和字数,而在于其中凝结了多少智慧。
代码也可以反映出一个人或一支团队的精神面貌。我们常说 “文如其人”,如果想了解一名软件工程师或一支研发团队的素质,就去看看他们编写的代码。
2、软件工程师和 “码农”
很多读者会认为,软件工程师只要会编写代码就可以了。那么,事实到底是不是这样呢?
最近几年,国内兴起了一个非常热门的创业方向—少儿学编程。很多小朋友从小学就开始学习代码编写,如果只需要会编写代码就可以当软件工程师,那么现在这些二十多岁、三十多岁的从业者就要有失业的危险了,因为这些小朋友可以直接和他们竞争。
很多从业者在本科毕业后就开始从事软件工程方面的工作。一些刚走出校园不久的从业者告诉我,他的规划是先学习 3~5 年技术,然后转行做管理工作或去创业;还有一些工作了 3~5 年的从业者认为,不知道自己还应该学什么,更不知道如何提升自己。
对于这个问题,答案当然是不止会编写代码。软件工程师要具备非常高的综合素质,具体包括以下几个方面。
(1)专业知识。软件工程师需要掌握的专业知识包括数据结构、算法、编码方法等,还包括系统结构、操作系统、计算机网络、分布式系统等,这些都是大学计算机专业所涉及的课程。
(2)产品。软件工程师还需要具有产品方面的思维,要对业务有深刻的理解。为了提供良好的用户体验,软件工程师需要学习交互设计,这是一个非常专业的学科方向;还需要学习产品数据统计,会基于数据来优化产品;更需要学习产品/业务运营,这队很多运营型的产品(如社区)来说,非常重要。
(3)项目管理。做软件项目不是一个人的工作,要做好软件项目需要懂得管理。有很大比例的工程师不懂项目管理,忽视项目管理堆软件项目成功的巨大作用。
(4)研究和创新。有一些项目具有很强的研究和创新属性,这要求软件工程师要具备 “研究” 的能力。很多公司将软件工程师称为 RD,RD 的意思是 Research(研究)和 Development(开发)。对于不具备研究能力的软件工程师,他们只能被成为 Developer(开发者)。
很多人对研究的认识是 “写论文”,认为这是学术圈才做的事情。其实,研究是 “定义问题,分析问题,解决问题” 的过程,研究能力对一名优秀的软件工程师来说非常重要。
总之,软件工程师不等于 “码农”。软件工程师需要具备综合素质,要成为一名优秀的软件工程师至少需要 8~10 年的历练和成长。
3、来自艺术的启发
下面我们回到 “艺术”,看看在艺术作品的创作方面能找到哪些启发。图 1.4 是达·芬奇的名作《锤娜丽莎》,大家都非常熟悉。
图 1.4
如果我们把《蒙娜丽莎》看作一个优秀的软件,仅仅停留在 “知道这张画是好画” 的层面是远远不够的。作为一名软件工程师,我们希望探求的是优秀软件背后的成因,从而我们也可以开发出优秀的软件。
优秀的艺术作品是由一睡觉啊创作的,于是我们找到《蒙娜丽莎》的作者—达·芬奇。但是,仅仅停留在这里仍然是不够的。很多人会说:“达·芬奇是大师,大师是天生的,是远不可及的。” 仰望大师,并不能让我们创造出伟大的作品。
于是,我们继续探求,找到下面这幅画(图 1.5)。这幅画叫《维特鲁威人》,是达·芬奇绘制的一个关于人体比例分析手稿。根据一些资料记载,像《蒙娜丽莎》这样的作品并不是达·芬奇随手一画就画出来的,其中使用了很多绘画方法,比如构图、用光、前景和背景,这些都是很有讲究的,都是一些方法论作为支撑的。通过学习这些方法,我们虽然无法成为大师,但是也可以获得很大提升。
图 1.5
在艺术方面,我了解得不多 。只是希望通过艺术中的这些故事,给大家在代码编写方面的一些启发。通过学习千倍大师的方法,不断修炼和提升自己,从而开发出优秀的软件,而他们在创作过程中所使用的方法,就是我们要学习和采用的。
4、写代码并非易事
写代码不是容易的事,具体原因如下。
(1)写代码是从 “无序” 变为 “有序” 的过程。计算机中所运行的程序是按照严格的逻辑来执行的,儿现实世界纷繁复杂,其中的秩序并不是一眼就可以辨识的,需要我们把它整理为有序的结构。
(2)写代码将 “显示世界中的问题” 转化为 “数字世界中的模型”。程序是数字世界对现实世界的一种映照,其中涉及对现实世界的抽象和建模。
(3)写代码是一个 “认识” 的过程。在写代码的过程中,原来所 “未知” 的问题,在代码完成后变为 “已知”。对一项新业务,在开始时我们可能并不了解,但通过逐步分析,逐渐有了更深入的理解,在这个认识的基础上才可能开发出对应的软件。
因此,在写代码的过程中,软件工程师需要具备以下几个关键能力。
(1)把握问题的能力。软件工程师每天都面对大量的问题,需要在工作中不断辨识问题,并确认其中的重要问题。
(2)建立模型的能力。对于一个软件来说,具体的实现机制是 “底层”,所需要实现的 “模型” 才是 “上层”。软件工程师需要不断把显示问题转化为数字世界的模型。
(3)沟通协作的能力。软件开发不是一个人的工作,需要和研发团队的同伴进行沟通协作,也需要和软件的相关方(客户、用户)进行沟通,还可能需要和其他相关团队进行配合。沟通协作的效率和质量,极大地影响着软件研发的效率和质量。
(4)编码执行的能力。软件工程师最终需要通过编码获得可执行的软件,因此在编码方面必须具备一定的基本功。