软件工程:伟大的程序员不写代码?快看看未来“好的”编程语言应该长什么样

每篇一格言:
to err is human; to forgive, divine(博主译:人非圣贤,孰能无过;闻过则喜,点凡成圣)
——Alexander Pope

前言

2020年3月TIOBE编程语言排行榜:Java继续蝉联榜首,C、Python、C++、C#、Visual Basic .NET、JavaScript、PHP、SQL、Go分列前十。这不禁令人深思,像C和C++这种诞生于40年前的语言,为何仍然这么有生命力?

下面随我一起,思考“好的”编程语言应该是什么样子的。
在定义什么是”好“之前,首先需要考虑的是,为什么会有编程语言,或者说,编程语言是干什么用的?
在这里插入图片描述

1.编程语言,人与机器的沟通工具

计算机的天然语言是二进制组成的指令;
人类用的语言称为自然语言。,计算机无法理解;
于是问题来了:怎样让计算机理解人类的指令并执行任务呢?
直接的思路是把人类用的自然语言翻译成机器语言,但这是十分困难的,主要原因是自然语言不是一种形式语言,翻译自然语言有三个难点:
歧义性:
自然语言充满了歧义,需要通过上下文才能理解确切含义
冗余性:
自然语言存在大量冗余,这些冗余主要是为了消除歧义而存在,但带来的问题就是不够简洁。
言外之意:
自然语言中有很多字面以外的意思,如果不结合具体情境极易造成误解。
在这里插入图片描述
因此,我们需要一种形式语言,也就是编程语言,它是简洁、准确、有效的,人能看懂,同时也容易翻译成机器语言,来解决与机器的沟通问题。

2.编程语言,发挥人与机器的优势

既然编程语言是人与机器的沟通工具,那么它应该是侧重于适应人还是侧重于适应机器呢?换句话说,是让人用起来更方便,还是让机器更方便?在回答该问题之前,我们需要先讨论人与机器的比较优势。

机器相对于人的优势:

运算速度极高,远胜于人;
严谨度极高:
对于人类来说,打错一个字,算错一个数是很常见的;对于机器来说,这是不被允许的。
处理问题的复杂度规模远胜于人:
一次处理一千万行代码,对于人是个巨大的挑战;对于机器来说只是个普通工程。

人相对于机器的优势:

我认为人类的最大优势是思维方式的不同,主要有下面几点:
辩证思维:
机器最擅长的是逻辑思维,true or false,这是机器的底层硬件中的设计如此;
人类还具备辩证思维,也就是“亦真亦假”,“对立统一”,目前机器不具备这种理解能力。
模糊思维:
“直觉告诉我,这是对的”,“大概是往这个方向走”,人类擅长做出模糊判断,但是对于机器来说,这是不可思议的。
创新思维:
创新思维是指以新颖独创的方法解决问题的思维过程,通过这种思维能突破常规思维的界限,以超常规甚至反常规的方法、视角去思考问题。目前在这一点上,机器只能拙劣的模仿,无法超越。
在这里插入图片描述
通过对比,我们可以得出这样的推论:

推论1:编程语言的设计原则是充分发挥人和机器的比较优势。

一个具体的例子是内存管理。由于内存管理很复杂,它应该由编程语言负责,因为机器最擅长处理复杂的结构和逻辑关系。有谁会认为开发者花费大量精力处理内存泄漏是值得的呢?开发者没有必要越俎代庖去管理内存,反过来说,如果管理内存是必须的,那开发者是不是也要直接操作ALU呢?当然不是。应该想想我们编程的目的是什么。
而之所以目前开发者需要掌握内存管理知识,是因为编程语言没有做好。但相比较而言,java比C++做的更好。
在这里插入图片描述

3.编程语言,以人为本还是以机器为本?

软件开发行业存在一条鄙视链,通常是用汇编语言的看不起用C语言的,用C和C++的看不起用java的。这是为什么呢?博主推测可能是因为低级语言要求更多的硬件知识,而这些知识在高级语言中已经不那么重要了。所以鄙视链的核心是知识结构。
但是,从另一个角度看,只有高级语言才更符合编程语言的设计原则。
为什么呢?

3.1谁是主角?

在编程这件事上,人是主体,机器是客体,起决定作用的是人。人是否有足够的时间和条件发挥创造力、有效的工作直接决定着编程的成败。
在这里插入图片描述
据此我们可以得出另一个推论:

推论2:编程语言的另一设计原则是充分便利开发者。

如果一个指令让开发者用一条语句就能实现的话,又有何必让他操作指针,寄存器,甚至机器码呢?对于人来说,指针,寄存器这些是很不友好的。让容易疏忽犯错的人类去操作指针,然后再花费大量的精力去debug野指针和内存踩坏的问题,这样的思路正确吗?

4. 编程语言,畅想未来

在我看来,当前的软件开发行业仍然处于手工业时代。代码基本靠人敲,bug基本靠人改,原始而低效。
不久的将来可能会朝着机械化生产演变,到那时,
优秀的软件开发者会变成“思想的巨人,行动的矮子”
这句话该如何理解呢,那就是开发者注重研究设计思想并提供给机器,而代码组织、编译、debug这些工作交给编程机器来处理了。
在这里插入图片描述

我们以这段假想的对话作结尾:

面试官:知道指针怎么用吗?
开发者:不知道。
面试官:知道hashmap的原理吗?
开发者:不清楚。
面试官(不耐烦):说说你清楚啥?
开发者:我知道该做出什么样的软件产品,并且知道如何让机器理解并制作出这样的软件出来。我的目标是软件设计,就像服装设计,不需要关注怎样纺布织毛衣,而是把精力花在设计出受欢迎的时装上。至于纺布和织毛衣,交给机器就好。

面试官:(沉思)。。。你是未来型人才。你的思想已经超前了10年。我们决定给你offer,10年以后你来上班吧。

发表时间:2020-3-12

本文为博主原创。看完请点赞,我们2030年再见。

原创文章 31 获赞 24 访问量 2万+

猜你喜欢

转载自blog.csdn.net/GentelmanTsao/article/details/104790805