编程和音乐真的很像吗?

在过去的几十年时间里,对音乐作品和编程同时感兴趣的计算机科学家成功地将两者结合在一起。现在的人工智能谱写的音乐,几乎与由专业音乐人创建的没有区别。

很多专业的开发人员对音乐有着真正的激情,以及许多音乐家涉足过编程,这些已经不是什么秘密。例如,Elvis Costello,一位多产的英国音乐家,被誉为“他那一代最优秀的词曲作家”,在他的音乐生涯腾飞之前,在上世纪70年代操作IBM 360。

你可以发现为什么人们会沉溺于这两个领域:因为创作旋律和编写算法之间有很多共同之处。从表面上看这两者似乎颇不相同,但是开发有创造性的一面,而谱曲亦有机械化的一面。那么,编程和谱曲有什么相似之处呢?

你的心中已经有音乐的脉动

让我们先来看一看谱曲和编程之间的相似之处。

1.它们都遵循关于以下逻辑规则

谱曲,和编程一样,需要古希腊人所谓的三艺。即:

  1. 语法:扎实理解基本原理——乐谱和编程语言规则的理论或知识。
  2. 逻辑:你需要能够创建“逻辑推理”。当音乐创作或编码时,你需要遵循逻辑规则使得“活动件”一起正常工作。
  3. 修辞:和语法和逻辑一样,你需要说服听众和新方法的使用者接受标准做法。

如果不遵循作曲和开发的基本原理,一切都无法正常运转。一个胡乱编写的程序将充满bug,在相同意义上,病态的和弦结构会造成乐曲的不和谐。

2.它们从一件件小事开始构建了美的东西

要成为一个伟大的钢琴家,你必须先练习和完善基础知识:简单、重复的音阶和琶音。要成为一个伟大的开发者,你需要花费大量时间来确保即使是最简单的表达式,也能够优雅和被正确编码。从一件件小事开始,你渐渐打造出了一个个伟大的东西,因此:

3.你需要能够见微知著

正如作曲家必须考虑到乐团的不同乐器组以及这些乐器组是如何组合在一起的,而开发者则需要在他们的头脑中保持一个抽象的“大局观”,当他们开始构建程序架构的时候。这两个学科都需要构建一些更大,更好的东西。

4.自我表达是关键

音乐和软件开发都需要创造力和自我表达能力:两者都需要培养自己的风格,创造一些新的和令人振奋的东西。

5.你需要涉猎技术

音乐家和开发人员需要花费很长的时间来思考他们的创作如何与其他产品交互,以及如何呈现在“最终用户”的手中。作曲家可能会增加重音符号以指示乐团

成员要演奏的风格。吉他手可能会考虑使用外部硬件(amps,效果器等),或他们希望在录音室里制作他们的歌曲。同样的,开发人员需要牢记别人将在哪种设
备和什么上下文中如何使用他们的最终产品。

6.两者都包括协作和个人主义

莫扎特单独花了很多时间来想他的下一个曲谱,尽管如此,他依然需要与他人合作——也就是他指挥的乐师。同样,最成功的开发人员绝对不是一个纯内向的人:他们需要与最终用户、经理和用户体验设计师等人员合作。

我不是音乐开发人员!

虽然两者有很多的共同点,但一些反对意见也值得我们听一听。不是每一个开发人员都能成为下一个贝多芬!

1.这个比喻是不是只是一种我们作为开发人员吹牛和显摆的方式?

正如Coding
Horror博客的作者认为的那样,开发人员将自己的技艺与绘画,音乐或其他艺术形式之间作比较不仅仅是一种比喻,更多的是一种自我夸耀。当然,我们都希
望我们正在构建的app能够像Gershwin的音乐一样棒一样好,或者我们刚刚设计好的网站能够像Miles Davis的《Kind of
Blue》一样影响深远。但说实话,这的确大不相同,不是吗?

2.编程是为了解决问题

当你被要求去设计一个app的时候,通常是为了解决问题,例如,特定的业务或消费者问题。开发人员善于解决此类问题,但这是否真的可以比作音乐?从最纯粹的角度看,谱曲是纯真感情和情绪的迸发和表达。

3.编程有一个非常不同于音乐的目的

当你开发任意一种工具时,最终目标是让终端用户能够做一些具体的事情。假设你正在构建一个业务app——你的创作应该意味着为最终用户的日常工作提供便利。相比之下,音乐,则并没有一个特定的“目的”,只是一种超越纯粹的享受。

它们有多重要

我们依然无法做出决定:虽然显然,谱曲和开发绝对有着一些共同的因素,但它们也有很多区域是存在分歧的。我们所知道的是,开发人员和音乐家都可以丰富我们的生活,并给我们一些以前不知道我们需要,但是现在生活不能没有的东西。

作者:小峰

来源:51CTO

时间: 2024-10-03 20:53:32

编程和音乐真的很像吗?的相关文章

说了你都不信 编程和音乐有很多共同点

我的日常工作是编写iOS应用.我的主要爱好是创作,录制和制作电子摇滚音乐.但是我发现,有时候这两者会比我们以为的更为相似,具体我将在这篇文章中一一说明. 首先介绍一些背景信息--编程事业是我由来已久的追求,并且过去几年间我一直专注于做iOS开发.而我成为音乐迷和吉他手也已经有很长一段时间了. 我也为我现在的乐队做一些音乐制作.录制和安排工作.目前已经发布了两个小专辑. 关于编程和音乐相类似的这个想法源自于我和我的一个同事的谈论.他时不时地向我打听我的音乐项目的进展情况.然后,他告诉我, "在我看

HTTP真的很简单(转)

原文:HTTP Made Really Easy因为我本身网络基础就很差,所以看到这篇文章一方面是学习网络知识,另一方面为了锻炼我蹩脚的英语水平,文中如有错误,欢迎浏览指正! 前言 在看这篇文章的时候,推荐使用chrome浏览器查看http请求过程中的相关参数.chrome浏览器,可以通过'alt+cmd+i'进入开发者模式.进入'Network'一栏,在'Name'栏内找到请求的网址.查看Headers一栏,就可以看到'Response Headers'和'Request Headers'.并

跪求餐饮管理系统,真的很急!!!

问题描述 我还有9天就要毕业答辩了,到现在还是不知道改拿餐饮管理系统怎么办,真的很急!!!大哥大姐们帮帮我啊,麻烦你们了啊,越简单越好,现在真的快崩溃了,这几天老师要检查了... 解决方案 解决方案二:去google搜搜吧我觉得答辩重要的是PPT要做好,没有老师会看你系统的,顶多就是问问你做了啥,随便应付几句就行了解决方案三:网上搜把解决方案四:请人做呗...解决方案五:本帖最后由 caozhy 于 2011-06-12 00:25:34 编辑解决方案六:引用4楼caozhy的回复: 快花钱找人

C++系统中指针错误,添加不了对象,真的很急!!!!

问题描述 C++系统中指针错误,添加不了对象,真的很急!!!! 为什么不能实现添加啊!!!!!真的很急 #include <iostream>#include <iomanip>#include <conio.h>#include <string>#include <fstream>#include <cstdlib>using namespace std;int i=0;const int Maxp=100;//最大商品类的数量cl

Mybaits关于if判断 真的很邪门

问题描述 Mybaits关于if判断 真的很邪门 <if test="level != null and level.toString()=='1'"> and t.talent_manager=#{id} </if> 当level!='1' 判断是正确的 当level='1'时,应走判断但是没有走,为什么 解决方案 &(*^&(^&%&$&&*(&*((&%&%& 解决方案二: 今

你的品牌词SEO排名真的很好吗?

常听到一些客户说:我们网站的知名度很高,品牌词总是排在第一名,带来的流量非常大,所以我们品牌词不需要做SEO,更有的客户会说,我们的网站是不需要做SEO.然而,实际上呢? 对于有这样问题的客户,我一般不会直接否定他们的观点,说他们想法错了,即使你说再多的理由也不一定能改变他们,因为他们觉得现在这样很好了.我的做法是:我会让他们搜索其品牌词给我看看,然后我会让他们看看第二名.第三名的网站,以及搜索结果首屏的所有网站,接着让他们心里算一下在这些网站中,有几个是与自己网站/产品相关,对自己网站/产品是

link中能不能不通过实例化对象访问一个成员函数?真的很焦急,谢谢

问题描述 link中能不能不通过实例化对象访问一个成员函数?真的很焦急,谢谢 link中能不能不通过实例化对象访问一个成员函数?真的很焦急,谢谢 解决方案 不可以.因为方法被允许访问成员变量,你都没有实例化怎么访问? 解决方案二: 当然可以访问实例的public方法

苹果 :云计算 真的很可怕

据国外媒体报道,苹果联合创始人史蒂夫-沃兹尼亚克(Steve Wozniak)预测,在未来几年中,云计算服务将会出现"可怕的问题". 在表演者迈克-戴西(Mike Daisey)的独白剧<乔布斯的大悲大喜>(The Agony and the Ecstasy of Steve Jobs)中,61岁的沃兹尼亚克是一个主要角色.在该剧播出后,沃兹尼亚克与戴西和几个观众聊天时,谈到了他在学校担任教师的经历以及在电视剧<与星共舞>(Dancing with the St

对象-这条android java语句真的很复杂,求解析

问题描述 这条android java语句真的很复杂,求解析 tripListView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1,int position, long id) {Toast.makeText(ListViewExample2.this,"您选择的是" + list.get(position)