[魔力符号] No.1(1-3)

Trustno1 2007-03-24
http://sevenofnine.group.iteye.com/topics/download/f052a427-0e9e-41d5-ac77-b69b7efd55a4
simohayha 2007-03-24
什么都看不清的说.
Trustno1 2007-03-24
    这几天身体不太好,所以先整理一些初步的定义和简单的Sample.今天最后的Sample,是我临时看到海天版上关于数学和软件的讨论而临时换的.这只是一个最为简单的例子,很多复杂的情况以目前的数学工具并不足以描述.比如说,如果现在在Collection中加入一个另外一个集合A={年龄},并且规定年龄与性别也可以决定积点规则,那么实际上就需要引入一个很重要的概念:积态射f:A×G->D,又比如我们能不能把按性别计算积点的代码和按性别+年龄计算积点的代码抽象成一个统一的代码?程序设计中这种问题实则上就是在讨论态射f与态射d是否同构?同构,又是Category theory中极为重要的概念,这个概念可以使得我们以全新的视角来从新诠释许多我们熟悉的基础数学概念,比如什么是属于?什么是包含?什么是集合元素?
     话题有些扯远了,关于数学和软件的关系,个人的看法是,第一,程序员们日常遇到的软件结构问题实则上也是数学问题.DRY是什么?软件复用是什么?这些在我们看其来是软件工程师而不是计算机程序才能具有的技巧,实则上也是数学问题.这些问题之所以看起来不那么数学,仅仅是因为我们对这一部分的数学还不熟悉.有一句话说"19世纪的数学是研究变化的数学,20世纪的数学是研究不变的数学"。所谓的变化的数学,是指数学分析,实变,复变这样着重研究变化的性质,而不变的数学则是研究各种数学之间的结构性质.举个简单的例子,冒泡排序,选择排序,快速排序,三种算法,一般我们都研究他们的时间空间复杂度.这里面使用到的数学就是在研究他们随着时间和空间增加而产生变化的性质.但是我们同样也可以研究这三种排序的内在结构,比如说他们都有相同的比较操作,他们都有相同的交换操作,如果我们能够通过分析这些结构来找到他们之间的同构映射,那么我们就可以将一个算法的问题转化为另外一个算法.这就是所谓的不变的数学.

  第二,"软件开发,更重要的,是逻辑能力,而非数学能力",这句话是没有错.一个老木匠做把椅子当然不需要学习力学材料学,他们可能使用各种各样的技巧诀窍甚至会编成口诀.但是这并不意味着这些技巧口诀,不受力学,材料学的限制.一个木匠再怎么研究木匠技巧,他充其量也就是一天做一把椅子.但是宜家的工程师们利用力学和材料学的知识建造的流水线,一天可以生产成千上万把椅子.事实上软件领域中,每天都发生着机器打败老师傅的故事,最好的一个例子就是编译优化.70-80年代用汇编来优化代码的工作是经验丰富的程序员的专利,从哪个时代的角度去看他们的工作和我们一样也根本不需要数学,需要的只是对汇编语言硬件特性的透彻了解,聪明的脑袋瓜,和超级变态的耐心.但是现在是改动两条独立指令的执行顺序都可以对程序性能造成明显影响的时代了。现代计算机体系对优化的要求也超越了人的进化速度。乱序执行,分支预测,管道优化,缓存优化,自动并行化,基于数据流的全局优化。。。这些技术都需要复杂的分析。更不用说基于Strongtalk和JIT的动态优化技术了.经验再丰富的牛人能敌过几十年来几代科学家和工程师千锤百炼的算法么?


  
lix23 2007-03-24
google了一下罗素的悖论。贴在这里:
集合论悖论--“R是所有不包含自身的集合的集合”。
  有人会问:“R包含不包含R自身?”如果R不包含R自身,由R的定义,R应属于R。如果R包含R自身,R又不属于R。
simohayha 2007-03-24
呵呵,最近刚买了罗素的 西方哲学史正准备看呢.
coolspeed 2008-11-27
Trustno1 写道
    这几天身体不太好,所以先整理一些初步的定义和简单的Sample.今天最后的Sample,是我临时看到海天版上关于数学和软件的讨论而临时换的.这只是一个最为简单的例子,很多复杂的情况以目前的数学工具并不足以描述.比如说,如果现在在Collection中加入一个另外一个集合A={年龄},并且规定年龄与性别也可以决定积点规则,那么实际上就需要引入一个很重要的概念:积态射f:A×G->D,又比如我们能不能把按性别计算积点的代码和按性别+年龄计算积点的代码抽象成一个统一的代码?程序设计中这种问题实则上就是在讨论态射f与态射d是否同构?同构,又是Category theory中极为重要的概念,这个概念可以使得我们以全新的视角来从新诠释许多我们熟悉的基础数学概念,比如什么是属于?什么是包含?什么是集合元素?
     话题有些扯远了,关于数学和软件的关系,个人的看法是,第一,程序员们日常遇到的软件结构问题实则上也是数学问题.DRY是什么?软件复用是什么?这些在我们看其来是软件工程师而不是计算机程序才能具有的技巧,实则上也是数学问题.这些问题之所以看起来不那么数学,仅仅是因为我们对这一部分的数学还不熟悉.有一句话说"19世纪的数学是研究变化的数学,20世纪的数学是研究不变的数学"。所谓的变化的数学,是指数学分析,实变,复变这样着重研究变化的性质,而不变的数学则是研究各种数学之间的结构性质.举个简单的例子,冒泡排序,选择排序,快速排序,三种算法,一般我们都研究他们的时间空间复杂度.这里面使用到的数学就是在研究他们随着时间和空间增加而产生变化的性质.但是我们同样也可以研究这三种排序的内在结构,比如说他们都有相同的比较操作,他们都有相同的交换操作,如果我们能够通过分析这些结构来找到他们之间的同构映射,那么我们就可以将一个算法的问题转化为另外一个算法.这就是所谓的不变的数学.

  第二,"软件开发,更重要的,是逻辑能力,而非数学能力",这句话是没有错.一个老木匠做把椅子当然不需要学习力学材料学,他们可能使用各种各样的技巧诀窍甚至会编成口诀.但是这并不意味着这些技巧口诀,不受力学,材料学的限制.一个木匠再怎么研究木匠技巧,他充其量也就是一天做一把椅子.但是宜家的工程师们利用力学和材料学的知识建造的流水线,一天可以生产成千上万把椅子.事实上软件领域中,每天都发生着机器打败老师傅的故事,最好的一个例子就是编译优化.70-80年代用汇编来优化代码的工作是经验丰富的程序员的专利,从哪个时代的角度去看他们的工作和我们一样也根本不需要数学,需要的只是对汇编语言硬件特性的透彻了解,聪明的脑袋瓜,和超级变态的耐心.但是现在是改动两条独立指令的执行顺序都可以对程序性能造成明显影响的时代了。现代计算机体系对优化的要求也超越了人的进化速度。乱序执行,分支预测,管道优化,缓存优化,自动并行化,基于数据流的全局优化。。。这些技术都需要复杂的分析。更不用说基于Strongtalk和JIT的动态优化技术了.经验再丰富的牛人能敌过几十年来几代科学家和工程师千锤百炼的算法么?


  



望注意身体。
职业程序员,尤其中国的程序员,大多为匠。能称“家”的只有T1了。
Global site tag (gtag.js) - Google Analytics