在1980年代,开始一场无聊的战争最简单的方法就是称赞你最喜欢的编程语言是最好的。C、Pascal、Lisp、Fortran?程序员会花几个小时详细解释为什么编写if-then-else语句的特定方法比您的方法更好。那是过去的事了。今天,涉及语法和结构的战争基本上已经结束,因为世界已经制定了一些简单的标准。在C、Java和JavaScript中,分号、大括号等之间并没有太大区别。关于类型和闭包的有趣争论仍然存在,但随着自动化缩小差距,大部分都没有实际意义。如果您不想定义数据类型,计算机就有可能准确推断出您的意思。如果你的老板想使用JavaScript而你喜欢Java,那么交叉编译器[注1]会将所有静态类型的Java代码转换为可以在浏览器中运行的最小JavaScript。当技术落后时为什么会发生战争?今天,一场有趣的战斗发生在框架之上。当我在约翰霍普金斯大学与其他教职员工计划一门新课程时,框架成为讨论的焦点。Angular比Ember更好?Node.js就是一切吗?我们设计了一个调查课程,将探索最重要软件包的体系结构,它们是Internet的基础。这是行动的核心,本调查课程的价值在于探索当今Internet上最重要的软件包周围的体系结构。从这个意义上说,框架是新的编程语言。它们是构建当代代码的最新思想、哲学和实践。有些是短暂的,但大多数成为了新的、基本的编程构建块。以下是推动这种框架趋势的七个方面,使框架成为滋生乏味战争的新宠。大部分代码都是和API串在一起写软件的,也就是说要用你所有的编程语言技能最大限度地压榨代码。掌握指针、函数和范围很有意义——代码质量取决于做正确的事。今天,自动化处理了其中的大部分。如果您在代码中留下了无用的语句,请不要担心,编译器会删除无用的代码。如果让指针悬空,垃圾收集器可能会找到它。此外,如今的编码实践也有所不同。大多数代码现在是一长串API调用。有时API调用之间会进行一些数据重组,但即使是这些通常也是由其他API完成的。一些幸运的人正在为我们机器的核心编写更聪明的、位碰撞、指针杂耍等代码,但我们大多数人都在更高的层次上工作。我们只是在API之间运行管道。鉴于此,了解API的行为方式以及它可以做什么就显得尤为重要。它接受什么样的数据结构?当数据集变大时,算法如何执行?与语法或语言相关的问题相比,此类问题对于当今的编程而言更为重要。事实上,有许多工具可以简化从一种语言调用另一种语言的程序。例如,将C库链接到Java代码相对容易。了解API才是最重要的。站在巨人的肩膀上,值得假设您已经成为Erlang或其他新语言的信徒。在您看来,它为编写有文档记录的、无错误的应用程序提供了最佳平台。这是一个很好的观点,但是将可用的Java或PHP重写为您选择的最新语言可能需要数年时间。您的代码最终可能会变得更好,但值得花额外的时间吗?框架使我们能够改变我们的辛勤工作。我们可能不喜欢他们选择的架构,我们可能会争论实现细节,但停止抱怨并找到一种方法来接受差异会更有效。从框架代码库继承所有好的和坏的是很容易的。用你最喜欢的新语言自己编写所有内容,而不是采用一些更流行的框架,不会让你像简单地跟随框架作者及其API乐趣那样快速地享受新的选择。了解架构的作用,而不是语法因为大部分编码都是将API调用串在一起,所以学习语言的特性并没有多大优势。当然,您可以成为Java如何初始化对象内部静态字段的专家,但如果您能弄清楚如何释放Lucence、JavaDB或一堆其他代码的力量,那就更好了。您可能需要几个月的时间才能深入了解Objective-C编译器的优化器,但了解最新Apple核心库的来龙去脉,您将真正让您的代码变得出色。您将深入研究框架的挑剔细节,而不是框架所基于的语言的语法。我们的大部分代码都在存储库的内部循环中花费了大量时间。了解正确的语言细节会有所帮助,但了解存储库内部发生的事情会带来显着的回报。以算法为主导的语言学习可以帮助您处理隐藏在变量中的数据,但它只会带您走这么远。真正要克服的是确保算法正确,它们通常由框架定义和实现。许多程序员明白重新实现标准算法和数据结构是危险的,也是浪费时间。你可以让它更合适,但你冒着犯细微错误的风险。多年来,该框架已经过广泛测试。它们代表了对软件基础设施的集体投资。当你弄清楚“走出去的格子”[注3]是什么意思时,抛开别人的辛劳,亲手搭建一个算法小屋——事实上,这样的例子并不多。正确的做法是学习框架并学习如何充分利用它们。如果你选择了错误的数据结构,那么你就把一个线性作业变成了一个耗时的输入大小的二次函数。一旦你这样做,这将是一个大混乱。语法纠正编译器和智能IDE我应该在代码块中的最后一条语句后放一个分号吗?分号是“分隔符”还是“终止符”?语言设计者花费大量时间来制作执行这些规则的分析器-你猜怎么着-我不在乎。大约10年前我很关心,但现在IDE为我完成了这部分工作。他们一直在看着我,并在我搞砸时告诉我。我让他们替我思考,我花时间思考关于代码的大问题。IDE就是苦力,是处理这些琐碎细节的编程助手。自动化使我们摆脱了单调乏味的编程语法。当然,他们不能为我们做所有的工作。我们仍然需要有模糊的头脑来部署那个标点符号。但大多数时候,语言的这些细节是无关紧要的。IDE不仅对框架有帮助,对小细节也有帮助。它们提醒我们函数调用的参数,甚至检查数据的类型是否正确。然后,我们应该知道使用哪些功能以及如何组合它们。当语法不太重要时,这就是我们需要集中精力的地方——更高级的方法和功能将有助于更轻松地找到解决方案。语法和视觉语言一起消失已被预测多年,但它仍在某些代码中缓慢发生——尽管不是全部。有些编程仍然是非常文字化的,但有些编程变得更加直观[注4],这意味着底层计算机语言并不太重要。GUI生成器是最容易看到这种现象的地方。您可以整天整夜拖放UI小部件,而不必担心它是C、Java还是其他语言。细节在可视化框中编码。AndroidBuilder使拖放更多布局成为可能,它会忠实地编写XML以及使代码工作所需的小型Java代码。很难讨论视觉语言的未来,尤其是在他们多次未能实现预言之后,但随着它们的发展,工具将增加更多的视觉效果。这意味着语言没有那么强大或重要。Codeislaw(代码即法律)计算机语言是不可知论者。它们被设计成开放的、易于接受的并且几乎可以无限扩展。他们注定要为所欲为。当然,有时由于语法原因你需要使用一些额外的字符,但这些都是很少的击键。在那之后,它主要是if-then-else,偶尔有巧妙的约束。所有这些语言都会帮助您以您想要的方式获得您想要的结果。如果有的话,它们的设计应该使您的代码尽可能没有错误,而不限制您可以做什么。这就是框架的力量,即设计者可以决定什么是允许的,什么是本质上禁止的。如果设计者不希望发生某些事情,神奇的函数调用就会从API中消失。如果设计者喜欢这个想法,通常会有多个函数调用和许多支持工具。这就是为什么哈佛法学院教授拉里莱西格[注5]喜欢说“代码就是法律”。框架为它们所处的互联网角落制定了规则,一旦你选择了它们,你就必须遵守规则。一些博客平台鼓励通过Ajax调用链接到其他博客。这就是为什么您必须仔细调查并明智地选择的原因。这就是框架如何最终主宰我们生活的方方面面,甚至是我们不编程的那些短暂时刻。注1:交叉编译器(英文:Crosscompiler)是指在某个系统平台下,可以为另一个系统平台生成可执行文件的编译器。当目标系统平台(开发的应用程序运行的平台)难以或不易编译时,交叉编译器非常有用。http://zh.wikipedia.org/wiki/%E4%BA%A4%E5%8F%89%E7%B7%A8%E8%AD%AF%E5%99%A8注2:比特分裂(BitBanging):一种使用微控制器的通用端口模拟串行接口标准(I2C、SPI等)的技术。注意事项3:离网:不要使用水、电、信用卡或社交网络,以免留下记录;愿意使用你所做的而不是现成的。http://www.urbandictionary.com/define.php?term=off+the+grid注4:可视化编程语言(Visualprogramminglanguage,以下简称VPL),又称'图形化编程语言'、'视觉编程语言”。表示用户使用图形元素进行编程;它不同于基于文本的编程。VPL是以视觉表达为基础,利用“语法”或某种“辅助标记”来安排图文。许多VPL都是基于“块和箭头”的概念,以屏幕上的块或对象作为本体,用箭头连接,相互之间的关系用直线段和弧段来表示。http://zh.wikipedia.org/wiki/%E8%A6%96%E8%A6%BA%E5%8C%96%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88%E8%AA%9E%E8%A8%80注5:http://en.wikipedia.org/wiki/Lawrence_Lessig#.22Code_is_law.22
