朱赟的技术管理课_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开始吧,感谢您的收听,我们下期再见。