剥开层次成为伟大的开发者
大多数刚接触编码的人(也许是大多数开发人员)对当今复杂应用程序下的基础工作了解甚少。
在这篇文章中,我想证明理解基础知识是构建新事物的关键。
不要误会我的意思。我并不是告诉您应该编写汇编、构建编译器或从头开始设计您自己的操作系统。
但我要说的是,理解计算机的核心概念及其工作原理会让你走得更远,而不仅仅是理解一种语言、Web 框架或库。
在云计算、解释语言、Web 框架、无服务器和大数据的时代,了解基础知识比以往任何时候都更不常见,但更有价值。
为什么你应该关心
你可能会说“底层的工作已经完成了,我为什么还要关心呢?其他人已经做了所有困难的事情。”
从某种意义上说,你是对的。您可以编写适用于 JavaScript 或 Python 的程序,而无需了解基础构建的实现和协议。
事实上,在整个软件开发人员的职业生涯中,可以从来不关心基础实现细节。
这是真的,因为在你之前的人非常擅长他们的工作,并且把他们的工作做得很好。
但更重要的是:了解基础知识是快速学习和长期的软件工程师职业生涯的关键。
语言、框架、库和应用程序来来去去。基本原理是首要原则——将保留下来。
神奇的问题:如果我再深入一层会怎样?
采用现代的解释型编程语言,如 Python。问 10 位 Python 开发人员,Python 实际上是如何执行您的代码的,您可能会得到 10 种不同的回答。其中大部分是错误的或不完整的。
我不会在这里回答有关 CPython 的解释器如何工作的问题。其一,我远不是这方面的专家。但大多数情况下,我不会回答这个问题来说明一点:抽象对于我们作为软件开发人员所做的一切都至关重要。
如果您是一名软件开发人员并且您不是在穿孔卡上编写字节代码,那么您要感谢抽象(以及其他数十年程序员的工作)。
这种趋势不会很快结束,抽象继续。当前最前沿的抽象是无服务器计算、“无代码”软件、单页面应用程序,甚至是机器学习。
将来,谁知道会抽象出什么?但是,如果您想为此做好准备,最好的起点是研究您当前正在构建的事物之下的抽象层。
问你自己:
我是否了解更深层次的情况?
计算机科学抽象的简要和精选示例
汇编字节
为计算机编写二进制或基于字节的指令非常困难,但最初就是这样完成的。最早的计算机程序(在硬连接的程序之后)实际上是在上面打了孔的纸片。
早期的计算机科学家意识到这是非常低效和令人沮丧的。他们开发了汇编语言来与他们的机器对话,而不是穿孔卡片:
****************************************************************************
;
; AddNumbers
; add number 2 at ds:si to number 1 at es:di of width cx
;
;
; INPUT: es:di ==> number1, ds:si ==> number2, cx= max width
; OUTPUT: CF set on overflow
; DESTROYED: ax, si, di
;
;****************************************************************************
AddNumbers:
std ; go from LSB to MSB
clc ;
pushf ; save carry flag
.top
mov ax,0f0fh ; convert from ASCII BCD to BCD
and al,[si] ; get next digit of number2 in al
and ah,[di] ; get next digit of number1 in ah
popf ; recall carry flag
adc al,ah ; add these digits
aaa ; convert to BCD
pushf ;
add al,'0' ; convert back to ASCII BCD digit
stosb ; save it and increment both counters
dec si ;
loop .top ; keep going until we've got them all
popf ; recall carry flag
ret ;
组装到编译
这比打孔卡好多了!但是抽象能进一步帮助我们吗?
如果我们构建一种语法更好的语言,然后将其置于汇编之上,会怎样?这样我们就不必使用程序集的复杂语法,我们可以添加防护栏和类型检查以帮助开发。
如果我们为我们的新语法构建一个编译器,我们可以获得更多的灵活性,同时仍然获得较低级别代码的性能。编译一次,无限次运行!
#include <stdio.h>
int main() {
int t1 = 0, t2 = 1, nextTerm = 0, n;
printf("Enter a positive number: ");
scanf("%d", &n);
// displays the first two terms which is always 0 and 1
printf("Fibonacci Series: %d, %d, ", t1, t2);
nextTerm = t1 + t2;
while (nextTerm <= n) {
printf("%d, ", nextTerm);
t1 = t2;
t2 = nextTerm;
nextTerm = t1 + t2;
}
return 0;
}
编译解释
许多应用程序今天仍在使用编译语言,但最近解释语言(及其更深层次的抽象)正在兴起。
解释型语言不需要编译,因为它们有一个底层程序可以动态评估代码。这个底层程序通常是用编译语言编写的,而编译语言又是用汇编/字节码编写的。
这个新层为我们提供了更大的灵活性来快速编写程序:
def fibonacci(n):
if n < 2:
return 1
return fibonacci(n-1) + fibonacci(n-2)
服务器本地
人们很快就意识到,如果多台计算机可以共享对同一文件的访问权限,那将非常方便
如果有标准的方法可以在计算机之间传输文件,那就太好了。
因此,我们添加了一个抽象层。文件可以存在于共享驱动器中,但仍可供您的计算机使用。
NFS 和 FTP 等各种技术使这成为可能。都是由像你我这样的普通人建造的。
个人服务器到互联网
互联网只是现有思想的另一种抽象。如果您可以创建一个本地网络,那么理论上您应该能够创建一个全球网络。
互联网只是链接和共享文件的协议。要共享这些文件,您只需要一个连接和一个服务器来处理传入的请求。
TCP/IP、SMTP/POP 等技术帮助文件在互连的互联网上移动。
浏览器开始帮助动态显示超文本标记文档 (HTML) 和其他媒体文件。我们所知道的互联网是对世界各地的处理器、RAM 和硬盘驱动器上的比特和字节的一个大抽象!
私有云
过去,如果你想要一个网站或文件存储,你必须购买自己的物理设备。您必须自己设置硬盘驱动器和服务器,并随着需求的增长扩展您的设备。
然而,如今大多数公司根本没有多少物理 IT 基础设施(除了员工笔记本电脑和 wifi 网络)。这要归功于另一层抽象:云。
与构建和使用您自己的基础设施相比,AWS、GCP、Azure、Aliyun 和其他公司已经使存储文件、托管应用程序以及在其服务器上执行几乎所有操作变得更加容易。
按需基础设施使 Uber、Airbnb 和 Netflix 等初创公司能够在早期以低廉的成本运营,然后随着需求的增长迅速扩大规模。
抽象是计算机科学的过去和未来
如您所见,我们所知道的软件的整个历史都是关于抽象以及它使计算机变得多么强大。
- 构建汇编语言的工作量之大令人难以置信。
- 它用于同样令人难以置信的 C 编译器。
- 它用于运行复杂的动态 Python 语言及其所有库。
- 它用于创建功能齐全的 Web 服务器 Flask。
- 它为 Airbnb、Uber 和 Netflix 等公司的主要应用程序提供支持。
- 谁将他们的基础设施托管在连接到全球互联网的复杂架构的云服务器上。
太疯狂太酷了!对于软件的当前状态,要感谢这么多层和这么多人!
总结
最后,这是我要表达的观点:
如果您对抽象层不感兴趣,那么您就不是在进行真正的软件工程——您只是在编写一些语法。
编写代码并不能使您成为软件工程师。理解并考虑您的代码所属的整个上下文和系统是关键。更好的是,构建使未来问题更容易的东西——这是最好的抽象。
这对你意味着什么?两件事情:
- 如果你想成为一名优秀的开发人员,了解你之前的工作,这样你就会知道高价值抽象是什么样子的。
- 要想与时俱进并作为一名开发人员获得高薪,请跟随抽象的趋势,无论它接下来走向何方。
如果你喜欢我的文章,点赞,关注,转发!
网友评论