到底什么是编程?——工作三年后对编程本质的思考
当我们怀着热情或对高薪的渴望进入软件开发领域,成为程序员时,我们的核心职责是使用计算机编写程序,也就是通常所说的“编码”。
只要有台能连接到互联网的电脑,我们就可以工作。但在写了这么多代码后,我们是否曾经思考过编程的本质是什么?
在《教父》这本书中提到,能在半分钟内看透事物本质的人,与一生都未看透本质的人,是截然不同的。
所以让我们试着去思考编程的本质,也许这能让我们走得更远。
编程的本质
关于编程,编写程序意味着事物的结果是一个程序。那么,什么是程序?
广义上来说,程序指的是在相同条件下以相同方式执行的一系列操作,结果总是相同的。
如果你想开一个银行账户,你需要准备好身份证等文件,去银行填写表格,验证身份,签字,最终拿到银行卡。如果另一个人也想做同样的事情,他们也需要经历相同的过程:准备文件、填写表格、验证身份、签字,最后在银行拿到银行卡。
你会发现,这个定义中有三次重复。这个过程的最大特点就是重复性。
上面这个例子中的重复性只发生在银行。每天都有不同的客户和柜员进行相同的程序。
然而,办卡只能在银行进行,这就相当有局限性。我必须花费时间和精力去银行,还得选择银行营业的时间。有没有办法让我不用去银行就能拿到银行卡呢?
计算机和互联网的出现解决了这个问题。
所需的文件、程序和卡片保持不变,唯一改变的是操作环境,从线下的银行变成了基于 PC 的网站或移动应用这样的线上平台。
线上意味着互联网,它允许信息在空间上进行传输。无论是网站还是应用,它们都由计算机程序支持。
过去,你需要花一个小时乘坐公共交通工具去银行;现在你只需使用手机,在家就能处理交易。
编程与现实的关系
那么,这些计算机上的程序从哪里来呢?它们是由程序员编写的。
程序员的工作就是将现实世界中的任务从线下环境转移到线上环境中的计算机程序中。这种转换不仅仅是技术性的,也充满了创造性。程序员不仅需要忠实地再现现实,还需要考虑用户体验、系统性能和可维护性等多方面的因素。这种创造性让编程不仅仅是技术工作,更是艺术和工程的结合。
编程不仅仅是一次性完成的工作,通常是一个迭代的过程。程序员会不断地对程序进行测试、调试和优化,以确保程序能够高效、正确地运行。这种迭代性在解决现实问题时尤为重要。
编程与抽象
编程有一个明确的目的:使用计算机解决现实世界中的问题。无论是在现实中还是在计算机中,我们在执行任何任务时都需要三个核心元素:输入(Input)、处理(Process)和输出(Output),简称为 IPO。
编程就是将现实世界中的问题映射到计算机的 IPO(输入-处理-输出)过程中。
那么,我们如何将现实世界的问题映射到计算机的 IPO 中呢?我的理解是,这可以通过建模来实现。
什么是模型?模型指的是用相对简单的事物来代表另一件事物。如果我们想要简化某件事物,我们需要分析,然后对其进行抽象。抽象不仅仅是对现实世界的简化,也包括对复杂系统的分解。
抽象的维度决定了软件的最终形式。如果我们对计算机本身进行抽象,软件将以机器代码或汇编语言的形式呈现。如果我们对计算逻辑进行抽象,软件将以非结构化的高级语言如 Basic 的形式呈现。如果我们对问题领域中的过程进行抽象,软件将以结构化的高级语言如 C 的形式呈现。如果我们对问题领域中的元素进行抽象,软件将以面向对象的编程语言如 Java 的形式呈现。
换句话说,编程语言是从现实世界到计算机世界的一种抽象机制。编程就是使用某种语言在特定维度上对现实进行抽象和简化建模,然后设计并实现可运行的计算机软件,这就是一个完整的 IPO(输入-处理-输出)。
编程的社会影响
随着技术的发展(如人工智能、云计算等),编程的方式和工具也在不断变化。这些变化不仅影响了编程的本质,也使得编程变得更加高层次化,降低了编程的门槛。
编程对社会的影响是深远的。程序不仅仅是个人或企业的工具,还能对社会产生深远影响。程序员有责任确保他们的程序是安全、可靠和符合道德的。
程序员的美德
再三考虑是否应该书写这一小节的内容,起因是最近的“互联网网号”制度即将推行。作为工科生的程序员除了对自己编写的程序应该尽到的责任(即程序的实用性和可阅读性)之外,是否还有对程序投入实践之后的社会责任?程序可能会对社会造成巨大的伤害。大多数程序员缺乏社会学科知识,不能意识到自己除了对自己工作有技术责任之外,还有道德上的。