框架还是语言? 从我的草坪上离开!

我个人编程史的附录

框架还是语言? 从我的草坪上离开!

今天的程序员...

……真的不知道语言在哪里停止,框架在哪里开始。

我是什么意思

直到1988年左右,一个人(像您一样)将使用的大多数程序都是由少数使用3GL(第三代语言)的程序员(通常只有一个)进行的。 关键词是: 从头开始

正如我在本系列的第一篇文章中所解释的那样,3GL 汇编语言或机器语言抽象保留字 。¹编程语言是保留字的集合,以及一些有关语法的规则,这些规则限制了人们如何以不会混淆了编译器(它将单词扩展为一系列机器语言指令)。 一起,这被称为语言的语法。

如您所见,大多数语言都很少有保留词要记住。 SmallTalk只有6个!

因此,回到1988年前的软件,如果您查看在此之前编写的程序的代码,除了少数保留字之外,您将看到的唯一字就是程序员创建的变量和函数的名称。 这就是大多数人认为的编程方式。

下面的图像比较代码(用C编写)使用两个保留字: fordouble 两个带下划线的文字( 晶圆厂 ,和printf的 )是函数从包括 stdio.hmath.h )。 当这样包含一个库时,它称为依赖项。 该程序中的所有其他单词都是程序员编写的变量或注释。

通过简单的单词计数,该代码的90%是由程序员编写的。 不到10%的代码是其他人的代码,其中4%来自语言,另外6%来自两个库。

 for( x= 0 ; x < im1->width; x++ ) 
{
for( y= 0 ; y < im1->width; y++ )
{
totalDiff += fabs ( GET_PIXEL ( im1, x, y )[ RED_C ] - GET_PIXEL ( im2, x, y )[ RED_C ] ) / 255.0;
totalDiff += fabs ( GET_PIXEL ( im1, x, y )[ GREEN_C ] - GET_PIXEL ( im2, x, y )[ GREEN_C ] ) / 255.0;
totalDiff += fabs ( GET_PIXEL ( im1, x, y )[ BLUE_C ] - GET_PIXEL ( im2, x, y )[ BLUE_C ] ) / 255.0;
}
}
printf ( "%lf\n", 100.0 * totalDiff / (double)( im1->width * im1->height * 3) ) ;

现在让我们看一下相同功能的Java版本:

 public enum ImgDiffPercent { 
;

public static void main ( String [] args ) throws IOException {
// https://rosettacode.org/mw/images/3/3c/Lenna50.jpg
// https://rosettacode.org/mw/images/b/b6/Lenna100.jpg
BufferedImage img1 = ImageIO. read(new File ( "Lenna50.jpg" )) ;
BufferedImage img2 = ImageIO. read(new File ( "Lenna100.jpg" )) ;

double p = getDifferencePercent ( img1, img2 ) ;
System . out . println( "diff percent: " + p ) ;
}

private static double getDifferencePercent ( BufferedImage img1, BufferedImage img2 ) {
int width = img1. getWidth() ;
int height = img1. getHeight() ;
int width2 = img2. getWidth() ;
int height2 = img2. getHeight() ;
if ( width != width2 || height != height2 ) {
throw new IllegalArgumentException ( String . format( "Images must have the same dimensions: (%d,%d) vs. (%d,%d)", width, height, width2, height2 )) ;
}

long diff = 0 ;
for (int y = 0 ; y < height; y++ ) {
for (int x = 0 ; x < width; x++ ) {
diff += pixelDiff ( img1. getRGB( x, y ) , img2. getRGB( x, y )) ;
}
}
long maxDiff = 3L * 255 * width * height;

return 100.0 * diff / maxDiff;
}

private static int pixelDiff (int rgb1, int rgb2 ) {
int r1 = ( rgb1 >> 16) & 0xff;
int g1 = ( rgb1 >> 8) & 0xff;
int b1 = rgb1 & 0xff;
int r2 = ( rgb2 >> 16) & 0xff;
int g2 = ( rgb2 >> 8) & 0xff;
int b2 = rgb2 & 0xff;
return Math . abs( r1 - r2 ) + Math . abs( g1 - g2 ) + Math . abs( b1 - b2 ) ;
}
}

粗体字都是关键词,带下划线的东西都是导入库中的函数。 此清单中约有65%是由程序员编写的代码,而20%来自语言语法的代码和15%依赖外部库的代码。

我并不是说这是一件坏事。 我只是在陈述事实。 碰巧的是,包含库中的代码是一个重要的生产力增强器。 一般程序员没有正当理由重新发明语言的*;这是没有道理的。 保留字,库类和函数。 因此,在大多数现代代码中,这种趋势趋向于减少由程序员编写的代码,并越来越依赖于以库的形式由其他人编写的代码。 尽管天生不是一件坏事,但许多人都认为事情已经太过分了。

框架还是语言? 从我的草坪上离开!

魔术发生了……

在2016年初,感觉一半的互联网崩溃了,因为程序员从名为npm的公共存储库中删除了一个名为left-pad的11行程序。 事实证明,世界上一些最大,最常用的JavaScript框架包括对左键的依赖,而不是键入以下十行代码:

function leftpad (str, len, ch) {
str = String(str);
var i = -1;
if (!ch && ch !== 0) ch = ' ';
len = len - str.length;
while (++i < len) {
str = ch + str;
}
return str;
}

另一个名为isArray的 npm软件包在2016年2月下载了1800万次,并且依赖于其他72个NPM软件包 每天有1800万程序员和72位软件包作者使用了include而不是键入以下1行代码:

return toString.call(arr) == '[object Array]';

现在我只是一个乡下男孩,但是对我来说,这很清楚地表明,创建这72个npm软件包的程序员或者具有我见过的最扭曲的幽默感,或者真的不知道isArray中的内容以及如何JavaScript实际上有效。 我将其作为最极端的货运崇拜编程示例。

为了进一步阐明大多数现代程序员盲目使用类库而不了解它们的含义的观点,我想请您参考Jordan Scales的清醒(令人沮丧)的叙述 ,以了解他对左手惨败的个人反应。

从我的草坪上离开

框架还是语言? 从我的草坪上离开!

所以我要把所有这些去哪儿?

我的观点是,正如一般人所想象的那样,“编程”在今天几乎不存在。 仅有的以新算法形式“编写代码”的程序员正在大型互联网公司工作,或者正在为初创公司编写专门的图像,视频或声音处理软件。

在企业和*IT盐矿中工作的“今天的孩子”大军正在完全做其他事情。 他们所做的编码是等同于模因创作和社交媒体帖子的软件,并带有后现代流行文化参考。 他们只是在复制和粘贴代码,并且不加选择地使用诸如left-padisArray之类的库,而不是回收Clint Eastwood,Good Guy Greg或Scumbag Steve的图片 他们真的不知道语言在哪里结束以及框架在哪里开始。 这对他们来说只是一大汤。

尽管我不是一个“孩子”,但我自己几乎没有比自己更好的了。 我形容自己是一个*的程序员(勉强但诚实)。 你们中有些人可能熟悉史诗般的《梅尔》 下周我会告诉你...

我的故事

[1]在ALGOL,FORTRAN和PL / 1中,没有保留字,只有关键字 在本文中,区别实际上并不那么重要。 在本文中,我将使用保留词来引用这两者。

本文是我即将出版的《混沌工厂》一书的节选,该书解释了为什么大多数公司和*无法编写“有效”的软件,以及如何对其进行修复。

From: https://hackernoon.com/framework-or-language-get-off-my-lawn-9935e1c72019