Beautiful of programming
作者:Linus Torvalds
我不知道该如何清楚地描述我对编程的痴迷。对编程的人来说,这是世界上最有趣的事情。这是一个比国际象棋更复杂的游戏,在这个游戏中,你可以制定自己的规则,并基于这些规则得到最终的结果。
然而,从表面上看,它似乎是地球上最无聊的东西。
编程最初令人感到兴奋的地方在于,当你告诉计算机要做什么,它就会按照你的意思去做,分毫不差,马不停蹄,毫无怨言。
这本身就很有趣。
但是,尽管最初令人着迷,单靠盲目顺从显然并不能让编程成为讨人喜欢的伴侣。让编程变得如此吸引人的是:你可以让计算机按照你的意思执行任务,但你必须先弄清楚如何执行。
我个人认为,计算机科学与物理学有很多共同之处。两者都是关于世界是如何在一个基本层面上运作。当然,它们的不同之处在于,在物理学里,你要弄清楚世界是如何构成的,而在计算机科学里,你要创造世界。在计算机世界里,你是创造者,你最终将控制发生的一切。如果足够优秀,你可以成为某个领域的上帝。
我这么说可能冒犯了地球上大约一半的人。
但真的是这样。你要创造自己的世界,唯一能限制你的是机器的能力和你自己的能力。
想象一下你要建造一个实用的树屋,它有一个活板门,而且很稳固。但是,每个人都知道简单稳固的树屋和漂亮树屋之间的区别是什么。它是艺术和工程的结合。这就是为什么编程可以如此迷人的一个原因。与有趣、漂亮和令人惊艳相比,功能就变得次要了。
这是一种创造性的活动。
最初吸引我接触编程的是我想要弄清楚计算机的工作原理,其中最大的一个乐趣是知道了计算机就像数学一样:你可以用自己的规则来构建自己的世界。在物理学里,你会受到已有规则的约束。但在数学和编程领域,不管是什么,只要它是自洽(self-consistent)的就行。数学不必受任何外部逻辑的约束,只要它本身具有逻辑性。数学家们都知道,你可以定义一组数学方程式,让 3 加 3 等于 2。你可以做任何你想做的事,只是在不断增加复杂性的同时,要小心不要创造出与你所创造的世界不协调的东西。一个美丽的世界,不能包含任何瑕疵,而编程就是这样的。
人们之所以如此迷恋计算机,其中一个原因是计算机能让你体验你所创造的世界,并了解一切可能的东西。在数学里,你需要通过大脑进行想象。例如,当大多数人想到几何时,他们想到的是欧几里得几何。但是,计算机可以帮助人们可视化不同的几何图形,甚至是那些非欧几里得图形。有了计算机,你就可以看到这些虚构的世界是什么样子的。还记得曼德尔布罗特集合的分形几何图形吗?这些都是纯粹数学世界的视觉表现,在计算机出现之前是无法被可视化的。曼德尔布罗特只是制定了这些关于一个不存在的世界的规则,这些规则与现实毫无关联,但事实证明,它们创造了迷人的图案。有了计算机和编程,你就可以创造新世界。有时候,这些图案真的很漂亮。
大多数时候你并不是在创造世界,你只是通过写程序来完成某个特定的任务。这个时候,你不是在创造新世界,而是在解决计算机世界里的某个问题。你通过思考来解决问题。只有某一种类型的人能坐在那里盯着电脑屏幕思考问题,比如像我这样的书呆子。
操作系统是计算机的基础,而开发操作系统是一个终极挑战。开发操作系统就是在创造一个世界,所有的程序都在这个世界里运行,规则由你来制定,比如什么是可接受的、什么可以做、什么不能做。每个程序都遵循这些规则,而操作系统是基础。操作系统就像是你所创造的世界的宪法,其他程序则是普通法律。
有时候,法律本身没有意义,意义本身才是你要追求的东西。你希望用正确的方法得到正确的答案。
还记得学校里总能得到正确答案的那个人吗?那个人之所以比其他人更快得到答案,是因为他(她)并没有尝试去得到答案。那个人不知道该如何解决这个问题,但他(她)会用正确的方式思考问题。
计算机也是如此。你可以用蛮力或愚蠢的方式尝试寻找答案,或者你找到了正确的方法,问题就迎刃而解了。如果从另一个角度看问题,你就会顿悟:问题之所以是问题,是因为你看问题的方式不对。
也许,这方面最好的例子不是来自计算机界,而是来自数学界。有这样一个故事:伟大的德国数学家卡尔·弗里德里希·高在学校的时候,他的老师讲课索然无味,为了让学生们全神贯注,他要学生们把 1 到 100 之间所有的数字加起来。老师希望这些年轻人花一整天时间来算出这些数字的和。但是五分钟之后,这位崭露头角的数学家就给出了正确答案:5050。他的解决办法不是把所有数字加起来,因为那样做太愚蠢了。他发现 1 加 100 等于 101,2 加 99 等于 101,3 加 98 等于 101,最后是 50 和 51 等于 101。很快,他得出总共是 50 个 101,所以答案是 5050。
也许这个故事是虚构的,但其寓意很明显:一个伟大的数学家不会用漫长而无聊的方法来解决问题,因为他会看到隐藏在问题背后的模式,然后应用这些模式找到答案。在计算机科学领域也是如此。当然,你也可以编写一个程序来计算数字的和。要在现在的计算机上完成这个任务是件非常容易的事。但是,一个伟大的程序员,只要他想一想就知道答案是什么。他也知道如何写出一个漂亮的程序,用一种新的并且是正确的方法来解决问题。
当你不知道该如何以更好、更漂亮的方式解决问题,冥思苦想了三天三夜。我们很难解释为什么这个过程会让人着迷,但一旦你找到了正确的方法,那种感觉将是无与伦比的
原文链接
https://www.brynmawr.edu/cs/resources/beauty-of-programming?fileGuid=kxiSzjaRxbcskaHI
Beautiful of programming的更多相关文章
- K老在拿图灵奖时的发言:Computer Programming as an Art
很多话说得很透彻,把一些觉比较精彩的摘抄一下. ... It seems to me that if the authors I studied were writing today, they wo ...
- neural network and deep learning笔记(1)
neural network and deep learning 这本书看了陆陆续续看了好几遍了,但每次都会有不一样的收获. DL领域的paper日新月异.每天都会有非常多新的idea出来,我想.深入 ...
- About Unixstickers - Unixstickers - stickers on unix, programming, software, development and open source
About Unixstickers - Unixstickers - stickers on unix, programming, software, development and open so ...
- 本人SW知识体系导航 - Programming menu
将感悟心得记于此,重启程序员模式. js, py, c++, java, php 融汇之全栈系列 [Full-stack] 快速上手开发 - React [Full-stack] 状态管理技巧 - R ...
- 课程四(Convolutional Neural Networks),第四 周(Special applications: Face recognition & Neural style transfer) —— 2.Programming assignments:Art generation with Neural Style Transfer
Deep Learning & Art: Neural Style Transfer Welcome to the second assignment of this week. In thi ...
- 北邮校赛 I. Beautiful Array(DP)
I. Beautiful Array 2017- BUPT Collegiate Programming Contest - sync 时间限制 1000 ms 内存限制 65536 KB 题目描述 ...
- Book Review of "The Practice of Programming" (Ⅰ)
The Practice of Programming In the preface, the author illustrates four basic principles of programm ...
- German Collegiate Programming Contest 2018 C. Coolest Ski Route
John loves winter. Every skiing season he goes heli-skiing with his friends. To do so, they rent a h ...
- 2014 SummerTrain Beautiful Garden
There are n trees planted in lxhgww's garden. You can assume that these trees are planted along the ...
- ComPiler200003:Story-Oriented Programming
Story-Oriented Programming MAY 25TH, 2018 http://www.brandonkeown.com/2018/05/story-oriented-program ...
随机推荐
- HTML & CSS – 实战 RWD Image 响应式图片
前言 之前写过 HTML & CSS – Responsive Image 响应式图片 (完整版), 里面解释了原理和一些具体做法, 但是并不是以真实场景作为例子带入. 由于 RWD Imag ...
- Glob 语法
Glob 通常用来匹配 file, gitignore, Tailwind CSS purge 都有用到 参考: Online Test Tool 语法解释 常用到的 ./PdfTemplate/** ...
- MyBatis——案例——删除(单个删除与批量删除)
删除一个 1.编写接口方法:Mapper接口 参数:id 结果:void /** * 删除 */ int deleteById(int id); 2.编写sql语句:SQL映射 ...
- mysql alter table修改表命令整理
这篇文章主要介绍了mysql alter table修改表命令整理的相关资料,需要的朋友可以参考下 MYSQL ALTER TABLE命令用于修改表结构,例如添加/修改/删除字段.索引.主键等等, ...
- Hive 2.3.2安装
一.安装mysql 安装MySQL服务器端和MySQL客户端: •安装: – yum install mysql – yum install mysql-server •启动: – /etc/init ...
- 《Vue.js 设计与实现》读书笔记 - 第8章、挂载与更新
第8章.挂载与更新 8.1 挂载子节点和元素的属性 扩展子元素的类型可以为数组,并判断如果是数组的话,就先依次挂载所有的子元素. 同时新增节点属性.属性可以通过 el.setAttribute 添加到 ...
- LeetCode 1349. 参加考试的最大学生数 (状压DP 或 二分图最大独立子集)
给你一个 m * n 的矩阵 seats 表示教室中的座位分布.如果座位是坏的(不可用),就用 '#' 表示:否则,用 '.' 表示. 学生可以看到左侧.右侧.左上.右上这四个方向上紧邻他的学生的答卷 ...
- C++ 第四节课 C和C++指针的区别 C的宏函数和C++内联函数的优缺点
#include <iostream> // 定义一个宏函数 #define ADD(x,y) x+y; // 宏函数具有速度快等特点 但是写代码有些业务比较繁琐,所以C++中使用了内联函 ...
- KubeSphere 社区双周报 | KubeSphere 3.4.1 发布 | 2023.10.27-11.09
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- KubeSphere 对 Apache Log4j 2 远程代码执行最新漏洞的修复方案
Apache Log4j 2 是一款开源的日志记录工具,被广泛应用于各类框架中.近期,Apache Log4j 2 被爆出存在漏洞,漏洞现已公开,本文为 KubeSphere 用户提供建议的修复方案. ...