关于编程(编程的本质)

原创
2019/06/25 16:36
阅读数 652

离散数学

离散数学是传统的逻辑学,集合论(包括函数),数论基础,算法设计,组合分析,离散概率,关系理论,图论与树,抽象代数(包括代数系统,群、环、域等),布尔代数,计算模型(语言与自动机)等汇集起来的一门综合学科。离散数学的应用遍及现代科学技术的诸多领域。,

以上是百度的定义,说下个人的理解 离散数学的逻辑推理基础,首先抽象了逻辑推理的概念,在从一个基本定理出发,推理出一个命题是否为真/假 然后从抽象公有理论,即从公理推出定理的一般法则,接着讲解了自然数公理体系,介绍了同构的概念,以及哥德尔不完备定理,哥德尔编码。 接着介绍了集合,以及有限无限的概念。 介绍了关系的抽象,代数定义,划分,图的抽象,等各种抽象。

介绍以上抽象的目的就是为了能够用科学的方式描述,以及推理事物的本质。

然后通过以上的抽象知识,再根据(形式语言的定义),我们建立了语言的定义。 以及对应的计算模型,(有限自动状态机,图灵机)。这就是计算机的基础,同时从理论层面证明和定义计算模型。

数学,理论研究是通过符号来抽象现实来研究,来突破寻找我们未知的事情。抽象的好处就是不会被现实世界所迷惑,去推导找寻问题的本质,突破瓶颈。 所以整个离散数学的目的是教会我们怎么样使用抽象的方法来解决问题。

通过哥德尔不完备定理/停机问题,我们知道没有万能的定理和方法能解决所有的问题,但是我们能从既有的方向(现有的理论基础)去开辟新的研究方向,而不是去找出万能的定理。

启发: 康威生命游戏,从最简单的规则出发,会产生复杂的系统。

计算的本质

什么是计算?这个词对于不同人来说意思不同,但是每个人都会赞同这样一种理解:在一 台计算机读取程序、运行程序、读入一些输入,并且最后产生一些输出的时候,肯定发生 了某种计算。因此我们可以这样认为:计算就是指计算机所做的事情。 为了创造一个环境让这种熟悉的计算发生,需要三个基本要素: • 一台机器,能够执行计算; • 一种语言,用来编写这台机器能够理解的指令; • 一个程序,用这种语言编写,描述机器应该具体执行哪些计算。

这部分内容就是关于机器、语言和程序的:它们是什么,行为如何,我们如何对其建模并 展开研究,以及如何利用它们完成实际工作。通过研究这三要素,我们将对计算的含义以 及它是如何发生的有更好的理解。 当然离散数学就是通过数学的方式来表达这些东西,除此之外我们也可以通过程序来建模参考「3」

图灵机

图灵机完整的描述了什么是计算,以及计算机的极限(停机问题)。是计算机的理论基础。

计算机科学

布尔代数,逻辑门设计。

计算机能解决的问题

[p/np问题] 关于np问题,现在也还有计算机没有办法解决的问题。 反过来也正因为没有一个算法能解决所有的问题(就像问神灯,要一个能实现所有愿望的神灯一样),所以才会解决具体问题的算法,所有对于具体问题都会有一些特殊的解决算法需要程序员去实现,同时具体的问题也会附加一些限制条件,使得算法有意义,同时我们又可以将相似的问题归类,所以也会有一些通用的算法和解决方案,比如排序等。

为何有些人觉得算法是投机取巧,或者说像智力问题? 那是因为没有了解算法的本质,是能够解决一类问题,或者对于具体问题有特殊的解决办法,这也是为什么要分析算法的复杂度的原因,这样可以知道这个算法是否可行,以及使用范围。

http://www.yinwang.org/blog-cn/2019/07/21/pnp2

可计算问题: 可计算问题同时对应的就是图灵机的停机问题,也是我们算法中的np问题 https://zhuanlan.zhihu.com/pillgrim https://cloud.tencent.com/developer/article/1343675

编程以及编程语言

怎么定义程序,其实编程语言只需要 if else,循环,赋值这几个功能即可完成,但是为了能够复用,所以有了下面的发展: 方法(方法的复用) -> 面向对象 -> 函数式编程

编程语言的发展就是为了能够更好的复用,即我们所说的通用性。

当然编程语言也是图灵完备的,所以可以编写所有的计算。

架构设计

架构设计最终目的:在一定时间内(通常足够长才能看到架构设计的效果)用更少的人天来产出更多的价值。
这个定义是我自己的理解:

  1. 在一定时间内(通常足够长才能看到架构设计的效果):敏捷开发中我们通常选MVP的需求来做,然后增量开发,但是设计的时候我们如果考虑足够的扩展性,那么我们都够支持到下一次重构或者升级的时间会更久。

  2. 更少的人天来产出更多的价值:在好的架构下,我们能够根据扩展性,可维护性,等快速支持业务需求就是我们的价值。

技术在短期内容易被低估,在长期内容易被高估

  1. 这句话其实可以通过上面的定义得到解答,周期太短是看不到架构的效果的,设计的问题通常会在一定积累后爆发,同时带来工作量也是成倍的。

  2. 长期内被高估,架构也会随着业务的变化而变化,所以当业务变化到一定程度稳定之后,技术带来的效果就不会像之前那么明显。

人工智能

推荐看《人工智能简史》,看过之后发现,人工智能是计算的另一个分支,向自然学习(黑盒子)但是有效果,一个分支就是我们离散数学所学的符号公理推理。

总结

理解计算的本质,编程的本质,才能走得更远。 反观哲学发展,当我们想要了解一些事情的时候,我们觉得哲学的思考方式可以帮助我们,但是科学推理其实也是可以的。哲学更多的是最初的启蒙方式。

参考:

  1. 离散数学coursera
  2. Lance Fortnow.《可能与不可能的边界:P/NP问题趣史》. 人民邮电出版社.
  3. Tom Stuart. 《计算的本质:深入剖析程序和计算机》. 人民邮电出版社.
  4. 《人工智能简史》
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部