-->

朱赟的技术管理课_28_27_小议Java语言

您好,我是朱茵,今天我分享的主题是小译java语言。

今天我和你聊一聊jjava语言,这也是我使用最久最熟悉的编程语言之一。

读博士的时候,我做过两个领域,刚刚进入兰斯大学的时候,进的是程序语言设计组所里。

当时有两个教授分别做两个领域,一个是瓦利德塔哈,主要研究领域是类型系统和嵌入式系统的程序语言设计。

另一个是罗伯特卡特莱特,他喜欢大家叫他cookie,主要研究的是java的理论和实现。

Coookie教授研究项目中有一个个做做doctor java的项目。

Doctor ja a是一个轻量级的java开发环境,主要是给在校学生用的。

他提供了一个简单直观的交互界面,可以实现类似的交互式sheljava代码执行方式。

Doctor java在美国大学里有很多人使用,目前已经超过两百万的下载量。

Coke e是个典型的美国教授,与生俱来的花白卷发,清奇的脸庞上有一双眼睛,炯炯有神,高挺的鼻梁。

他常年都是和学生一样的打扮,t恤、牛仔裤加运动鞋,出入的时候,背上总是背一个蓝灰色的电脑包。

当他不谈学术的时候,你会觉得他有着与年龄不相称的单纯和童真。

他会和一群学生一起吃戏里免费的披萨和点心,也会和其他教授一起站在系里走廊上聊天和哈哈大笑。

然而,一旦你和他讨论起java,他就变得滔滔不绝,整个人散发出特别的魅力,他对java的理解十分深入。

我每次和他对话都颇有收益。

然然,我的导师是瓦利德,但同在一个语言组,平时的研讨班都在一起,我也就有了了多机会和cocy一起讨论各种程序员的特性和实现。

也就是在那个时候,我对java语言有了比较多深层次的了解。

首先我来聊聊我和java语言的开发者,我的硕士论文是独立实现的一个程序设计语言,包括它的解释、编译和用户界面。

这个语言主要用于机器人系统的嵌入式编程和仿真。

曾经在一家石油公司的井下控制系统开发中被使用。

不过因为我导师的离开和种种其他原因,我博士生涯的后三年转了另一个导师,做生物信息学的数据分析和建模。

因为有程序设计语言的研究经验,博士毕业找工作的时候也投了份简历。

在oracle的java语言开发组也因为有这样相应的背景,我很顺利的拿到了java核心内库开发小组的onside面试机会。

我去面试的时候,应该是二零一二年底。

当时面试的那个小组一共好像只有七八个人的样子。

Oracle的面试大部分是白板和聊天,和现在比较主流的面试,上机做题并无bug,运行的体验很不相同。

我介绍了自己的硕士毕业设计,然后就谈起java新的库或版本,可能会增加哪些支持。

二零一二年底的时候,scala和closure刚刚火起来不太久,java还没有对lambda的支持。

而当时整个java团队也正在考虑这件事,话题牵扯到了lambda的实现,正好是我非常熟悉的话题。

因为我的导师瓦利德主要的研究领域就是函数式语言,而对lambda的实现也是函数式编程语言的核心。

具体的讨论细节我已经不记得了。

不过有两点感触颇深,一是他们对于选择哪些函数进核心库非常谨慎。

Java早期是很轻量级的,后来的版本功能越来越强大,但是语言本身也越来越沉重,这也是很多人喜欢scala的原因。

二是实现函数库的语言。

开发者对每个函数的精度和运行时间的要求到了令人发指的程度。

其实他们有时候读无数的论文,看无数的实现,做大量的比较,就只是为了敲定到底应该在最终的函数中使用哪一种实现方式。

比如浮点数是有舍入误差的,那么一个数值计算中,先算哪一步后算哪一步,带来结果,都可能是不同的。

而实现中的考虑,往往为了小数点后面十几位以后的一个一阻力也要反复斟酌很久。

为什么到了java八才有lambda?很多人抱怨java制重语法升级缓慢,过度封装,尤其是对函数式编程支持的不友好等等,其实都和这种谨慎有关。

为什么lambda的概念到java八才有了实现之前的java版本,包括很多其他语言都没有真正的lambda实现呢?这其实和程序设计语言里的基本概念有关系。

在本篇文章的文字稿中,我举出了一个用伪代码来写lambda表达式实现错误的详细案例。

由此我们可以看出,仅仅的一个匿名函数或者函数指针是不足以正确的实现lambda的。

而正确实现lambda或者说允许把lambda表示的函数作为一个向其他类型的值一样,作为参数来传递语言。

必须要对lambda的函数表达,以及一个用来在各层中传递参数值的参数定义环境。

两者同时的实现,这也就是函数语言中的闭包的概念。

实现闭包大体有两种方式,一种叫做自底向上的闭包转变,也称为flat cloder.它从函数定义的最灵层,将每一层的局部函数变量值拷贝到次里层,每一层的变量可能重名,而这就需要变量名解析的技术,对变量暗层重命名,这样逐层拷贝,最后形成一个lambda对应的单层的变量复制环境。

另一种叫做自顶向下的闭包转变,也称为共享闭包。

它从函数定义的最外层,将每一层的局部函数变量赋值,用类似指针的方式传播共享到里层的lambda.这种实现的好处是避免重命名和拷贝,但是实现赋值环境的共享其实是很棘手的。

总而言之,lambda在语言中的实现是复杂,而且昂贵的,不仅容易出错,还会给语言的垃圾收集带来新的挑战。

它也让语言的类型系统的所有证明和推导变得复杂无比。

虽然现在主流的语言都提供了lambda的实现,但用起来还是有一定限制,也需要一些谨慎的。

比如c语言仍然不支持嵌套式的函数定义,c加加十一增加了对b包的支持。

但是因为语言本身没有垃圾收集的原因,使用起来需要异常谨慎,很容易引起悬挂引用。

比如ruby函数不能直接作为参数传递,而是通过method或者proc来使用,且函数的嵌套定义并没有很好的对作用域进行嵌套。

而java八虽然有了对lambda的支持,但是java类型系统并没有对函数类型有任何的支持。

换句话说,java八中其实并没有对函数类型的类型系统的实现,这就意味着一些lambda相关的类型错误,在编译时间可能无法被发现。

看完了这些,你就会知道一门编程语言的变革是多么的艰难和复杂。

好在java九已经发布了java语言,有了更高和更新的起点。

Java开发中的常见问题,很多新人入门会要求我推荐编程语言,java属于我推荐的语言之一。

因为java标准规范是面向对象编程的代表class、 public等关键词显示清晰,一旦使用就不会混淆。

在学习其他编程语言的时候,还可以参考互通。

另外,由于java的流行和开放性,围绕java语言形成了最为广泛的开发平台。

不仅有spring这样的开源生态社区,在java平台之上,还延伸出了很多轻量级的编程语言,比如groovy、 cotlin等语言,都可以运行在GVM之上,形成了非常有生命力的生态环境。

那么在用java开发的过程中,需要注意意些些问题呢?这里的问题并不是指那些常见的java编程最常犯的错误,比如,一、如何正确的将数组转化为列表?八、如何判断一个数组是否包含一个值?三、如何在一个循环中删除一个列表中的元素?四、什么时候用哈希表,什么时候用哈希映射?五、不要在集合中使用原始类型。

六、如何正确设定访问级别?八AN list st linked list的对比。

八可变与不可变。

九j unit中的add before和at after行为的顺序。

十SPI中参数如何设定?十一API不要返回空值。

这里想说的是从架构和规范的角度。

如果你选择了使用java进行开发后应该注意的那些问题。

一、不要重复造轮子,也不要搬太多不同型号的轮子来用。

Java语言有非常成熟的技术社区,在java的生态里有很多相关的库,插件和工具,大部分是成熟技术。

比如DW基于java生态中稳定的库,构建了一个轻量级的框架,可以支持系统中的配置、日志、序列化等操作,还能构建g restful的微服务架构。

如果一个公司内有不同背景的java工程师,有时他们会根据之前公司的工作经验,选取自己熟悉的库和工具,这时就有可能会引起系统中,比如序列化使用了两种轮子。

如何确保大家使用统一的库和工具呢?有很多途径,比如指定编程规划或是使用工具,完成某个服务的初始化,自动配置公司常用的库,或者通过统一的代码审核,让一些资深程序员把关等。

二、深入了解、依赖注入选择一个好框架。

稍具规模的java代码库都会有复杂的类和对象之间的相关性和依赖性,确保所有工程师理解并使用一个统一的依赖注入框架。

这会让很多代码的风格保持一致,避免类的初始化过于复杂。

三、所有项目使用统一的文件夹结构。

在构建项目的时候,工程师们争论最多的问题之一就是代码文件怎么组织库放哪里?工具类u tels文件夹放哪里?这些做成单独的service文件,哪些是client文件夹,分别又有哪些类?这个需要早期的工程师或者资深工程师统一协调,保证代码库的整体结构。

自顶而下都结构清晰,不同项目里的文件结构也尽可能遵循同样的组织方式。

四、规范所有项目的API,保持统一的风格和模式。

Api的接口定义是不是使用了IDL服务器之间的交互协议是不是一致的?比如,基于HPPTS内部功能模块和数据schema之间分层和转化是否有统一的标准。

如果在开发过程中,不同服务器或者模块采取了不同的接口模式,让集成变得异常复杂。

五规范开发环境提供合适的工具。

可能每个人都经历过这样的场景,用自己的编辑器打开代码库的代码之后做一下自动格式化,或者新增一些代码,结果缩进空行、括号等等,忽然都不一样了。

在协同开发的时候,经常会出现多人修改同一批代码的情况。

如果频繁遇到代码不规范会非常麻烦,并且会出现很多无效格式的提交。

要保证所有人的代码格式设置一致,才能避免这样的问题。

定义一些标准的格式文件,做成编辑器插件,要求每个开发者使用统一的格式定义,就能避免上述的问题。

总结一下,今天我和你谈了我上学时是如何接触和使用java语言的。

讲述了java语言开发者的故事,探讨了为什么java很晚才支持lambda这样的语言特性。

最后介绍了在实际开发过程中应该注意的一些问题,希望对你有所帮助。

如果你还不知道应该学习哪一门编程语言,那么就从java开始吧,感谢您的收听,我们下期再见。