编写软件是一种艺术
英文原文:Writing Software is an Art
本文是我的《技术招聘和团队建设》系列中的其中一篇,你可以在这里找到下一篇。
「计算机科学并不只是关于计算机,就像天文学并不只是关于望远镜一样。」 ——Edsger Dijkstra https://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6 '" href="http://www.labazhou.net/2015/10/writing-software-is-an-art/#easy-footnote-bottom-1" kesrc="http://www.labazhou.net/2015/10/writing-software-is-an-art/#easy-footnote-bottom-1">注1
如果你靠编写软件谋生(或为了好玩),就问自己一个问题:你最后一次为了手头编写的软件而计算大O符号注2(对 于外行而言,「大O符号」用来测量一种算法效率最差的情况)是在什么时候?现在不考虑你做过它的所有事实,而一些求职者能够向你炫耀一个事实,他知道他的 团队成员的复杂度是 O (n log n)。为了兴趣和职业,我编写软件有 20 年了,我能够对你说,对我而言,这个数字用一只手的五个手指头就能数出来。
人们经常将计算机科学和编写软件等同视之,二者是相关的,但又相差甚远。编写软件不只是计算机科学的实际用途,正如谱写交响乐不只是声学的实际用途一样。
声学讲述声音的物理规律,计算机科学讲述算法的数学,它解释了冒泡排序怎样、以及为什么没有堆排序注3效率高。这不代表软件工程师就不需要理解计算机科学基础,他们肯定需要理解才行。设想一下,一名作曲家不了解他的乐器会发出什么声音,又会怎样。他们能够创作出音乐吗?可能吧。他们能够成为优秀的音乐家吗?可能成不了。
把软件比作交响乐
一名作曲家有一套固定的乐器,只能发出固定范围的声音。他们选择哪种乐器进来,哪种乐器退出,哪种乐器成为焦点,哪种乐器渐入背景。只有这样做,他们才能把噪音变成优雅的音乐,在情感上引起共鸣。
对于软件的编写,如果操作得当,也有同样的特点。我们的乐器就是算法。我们把它们放在磁盘上、放在网络和屏幕上。它们经过工程师的手,重新组 合、排列,使得能够专注在原始速度、大小或时间约束、或创造出视觉上让人愉悦的结果。即使你不是工程师,最终结果同样是优雅的,从而在感情上引起共鸣。
检查清单不会使你优秀
背景是黑色,确认。天空中有星星,确认。天空下有城市,确认。很多艺术都会检查这些条条框框。但是,很多都不是《星夜》https://zh.wikipedia.org/wiki/%E6%98%9F%E5%A4%9C '" href="http://www.labazhou.net/2015/10/writing-software-is-an-art/#easy-footnote-bottom-4" kesrc="http://www.labazhou.net/2015/10/writing-software-is-an-art/#easy-footnote-bottom-4">注4。 检查这些条目,或许可以保证你的代码不会做可怕的事情,但是它从来不会让你的代码做出伟大的事情。因为,那需要经验和才能。你具有的才能越多(假定你保持 一定程度的谦虚,并乐于向别人学习),获取的经验就越多,这会让你更优秀。仅仅具有才能,还不够。才能像是一颗橡子,它具有长成一颗高大橡树的潜力。经验 是沃土、水、阳光和时间。
计算机科学是一门科学,软件是一种艺术
如果你还没有明白这个结论,那么这里有个黑白分明的结论。我的目的是什么呢?有两点。首先,提醒我们这些编写软件的人,因为我们对开发优秀作品 充满激情,但是或许只是为了支付账单,仍然需要创造更多的艺术。其次,为我接下来的一些博文做准备工作,我打算写到我的《技术招聘和团队建设》系列中。编 写软件需要很多经验和才能,意识到这一点是很重要的,就像橡子之于橡树,你投入的越多,你得到的回报就越多。
有激情的工作(厚脸皮做广告喽)
我的公司「June」,正在招募激情爆棚的 IT 专家。我们让招聘人员付费和 IT 专家沟通,在此过程中,你或许可以找到一份新工作。如果你有兴趣,可以在 joinjune.com 申请。你还能在这篇博文找到更多详情(比如,为什么招聘人员要抓住机会,和你有偿沟通)。
关于我
我是 Amir Yasin,June 的 CTO 和联合创始人。和最好的 IT 招聘人员,有偿沟通。
做为开发者,我掌握了数门语言,关注高性能、可扩展性、软件架构、以及通常的处理疑难杂症。你可以在 Medium 上关注我,我在这里写关于软件工程方面的博客;我偶尔在 推ter 上说一些有趣的东西,你也可关注我;或者,浏览我在 GitHub 上对 FOSS 社区的贡献。
如果你喜欢本文,请点击推荐,我万分感激。
注释
- 著名计算机科学家 Edsger Dijkstra 曾经指出:“计算机科学并不只是关于计算机,就像天文学并不只是关于望远镜一样。”(”Computer science is no more about computers than astronomy is about telescopes.”)设计、部署计算机和计算机系统通常被认为是非计算机科学学科的领域。例如,研究计算机硬件被看作是计算机工程的一部分,而对于 商业计算机系统的研究和部署被称为信息技术或者信息系统。然而,现如今也越来越多地融合了各类计算机相关学科的思想。计算机科学研究也经常与其它学科交 叉,比如心理学,认知科学,语言学,数学,物理学,统计学和经济学。https://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6
- 大O符号(英语:Big O notation)是用于描述函数渐近行为的数学符号。更确切地说,它是用另一个(通常更简单的)函数来描述一个函数数量级的渐近上界。在数学中,它一般 用来刻画被截断的无穷级数尤其是渐近级数的剩余项;在计算机科学中,它在分析算法复杂性的方面非常有用。 https://zh.wikipedia.org/wiki/%E5%A4%A7O%E7%AC%A6%E5%8F%B7
- 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键 值或索引总是小于(或者大于)它的父节点。https://zh.wikipedia.org/wiki/%E5%A0%86%E6%8E%92%E5 %BA%8F
- 《星夜》(荷兰语:De sterrennacht)是荷兰后印象派画家文森特·梵高于 1889 年在法国圣雷米的一家精神病院里创作的一幅著名油画,是画家的代表作之一,现藏纽约现代艺术博物馆。https://zh.wikipedia.org/wiki/%E6%98%9F%E5%A4%9C