关于客观和主观客观的对比分析比如人与物的在分折

OTCOTC乙类中成中成药医甲医保甲类

功能主治:滋阴补肾用于肾阴亏损,头晕耳鸣腰膝酸软,骨蒸潮热盗汗遗精...

让天下人都拥有自己的私人医生

版权所有:珠海健康云科技有限公司 ┊ 经营许可证:粤B2- ┊ 互联网药品信息服务资格证: 粤

粤公网安备:05 版权登记号:

经过这么多年的历练COC的玩法体系已经非常成熟,平衡性高,而且很侧重玩家的跟人因素比方说玩家对兵种的释放选择,兵种的配合以及什么样的阵型用什么样的兵种Supercell吔经常做兵种的平衡,总之掠夺起来一分钱一分货一分时间(造兵时间)一分效率。

你可以11条龙碾压敌阵但是你得花很长等待造兵时间,你也可鉯巨人弓箭炸弹人配合,性价比高造一波20多分钟就好,但是不太能推全


Kotlin是一门相对比较新的JVM语言JetBrains自2011年鉯来一直在积极地开发。

多年来该语言在Android社区受到的关注度越来越高,并在Google IO 2017大会之后成为Android开发领域最热门的话题这次大会宣布,Android正式支持Kotlin

遗憾的是,虽然已经有许多关于Kotlin的文章但并没有多少客观信息,许多开发人员仍然在苦思冥想迁移到Kotlin是否是一条正确的道路。

茬本文的剩余部分我将尝试提供一个在将Kotlin作为Java的替代项进行评估时需要考虑的更完善的事项清单。

“Kotlin比Java好”“Kotlin可读性比Java强”,“Kotlin开发速度比Java快”类似这样的陈述缺少相关准确数据的支持,所以都归为主观客观看法一类

主观客观看法是个体开发人员在对与Kotlin或Java相关的主題作出一个或多个主观客观判断时形成。

开发人员的主观客观判断存在如下问题:

没有与主观客观判断相关联的量化指标
主观客观判断存在很大的偏见。
主观客观判断的偏见在开发人员之间存在很大的差异
由于没有与主观客观判断相关联的量化指标,建立在这些判断基礎上的观点只是反映出了开发人员之前就有的偏见不同的开发人员可能有着截然不同的偏见,因此有开发人员认为Kotlin是不错(或糟糕)嘚Java替代者并不意味着其他开发人员也这么认为。

而且由于没有客观指标,主观客观分歧就无法客观地消除这经常会导致“口水战”。

為了说明主观客观判断可能导致的误解让我们仔细审视一个非常常见的主观客观看法:

――Web上无数的文章

理论上讲,可以设法设计一个喥量Kotlin和Java之间可读性差异的实验但据我所知,没有任何人真正地开展这样一个实验因此,截至目前这个看法没有任何数据支撑。

Kotlin的语法是许多开发人员称赞其可读性的一个原因他们的逻辑如下:

Kotlin有更好的语法,因此它的可读性更强
――Web上无数的文章

在这句话中“更恏的语法”又是一个主观客观判断,本身就值得商榷但为了避免争论,我们假设Kotlin的语法确实更好但是,这就能说明Kotlin的可读性更强吗

為了观察语法对可读性的影响,请阅读下这段“文本”:

开始的时候这段“文本”很难理解,但慢慢地读起来会越来越容易。如果你洅读个两三遍那么你根本就不会再注意它是由非标准的字母组成的。准确地说字母的替换不是句法变化,但这确实可以说明对于熟練的读者而言,外观很少会成为可读性的障碍

我们也可以把这个例子扩展到自然语言。我了解三门截然不同的语言虽然它们之间差别佷大,但我发现当我不理解文本中使用的单词时,阅读任何一种语言的文本都非常困难一旦我认识构成文本的单词并熟悉上下文――無论它使用了哪一种语言,我读起来都不困难

因此,对我而言语言的选择并不会影响可读性,只要理解内容和上下文就可以了

当我們开始使用一门新语言,我们会有一段时间很难理解源代码需要认真领会每个句法结构。但是随着我们阅读和编写特定语言的代码越來越多,我们逐渐就熟悉了那门语言的语法到某个时候,我们就不会再注意句法结构了

根据我使用上述语言的经验,我可以告诉你:洳果一个人适应了Lisp的代码并且不会再注意到小括号,那么跟Java比起来Kotlin的语法完全不能对可读性产生不可忽视的影响,即使它“更好”

既然我们在讨论这个话题,我就分享下自己对于影响源代码可读性因素的主观客观判断

在读过其他开发人员使用许多语言编写的代码后(上面只罗列了我在某个阶段精通的语言;我用过的所有语言比这个多),我得出如下结论:如果开发人员使用某一门语言可以编写出可讀性和可理解性都很好的代码那么他们通常也可以使用其他语言编写出可读性和可理解性都很好的代码。

因此我根据自己的经验作出嘚主观客观判断是,源代码的可读性和选择的语言无关那取决于代码编写者的技能和读者的技能(编写者的技能更重要)。

如果你仍然認为主观客观看法具有代表性那么至少阅读并思考下Robert “Uncle Bob” Martin在这篇博文中的观点。

与主观客观比较相反客观比较使用量化指标来度量或評估Kotlin比Java有优势的地方。

用一套标准客观地证明一门编程语言是否强过另一门这种想法非常有吸引力,但是有个问题:据我所知没有与編程语言相关的通用客观指标。

考虑到我们无法进行精确的直接比较那我们能否客观地比较Kotlin和Java呢?能!我们仍然能评估从Java切换到Kotlin所带来嘚积极和消息影响的程度然后比较结果,并讨论它们的影响

为了评估Kotlin所能带来的最好结果,我们将做如下假设:

开发人员可以立即切換到Kotlin;

切换到Kotlin后开发人员不会损失任何技能(例如,有两年Java开发经验的开发人员可以神奇地获得两年的Kotlin开发经验);

事实上上述假设沒有一个是合理的,但在开始的时候有一个理想化的设定便于说明。然后我们会抛开这些假设,讨论真实世界的效应所带来的影响

遵循Steve McConnell在Code Complete一书中提出的模式,我们可以将软件构建活动分解成三个子活动:详细设计、编码与调试、开发测试

Kotlin对于详细设计子活动没什么影响(这项活动通常独立于选用的特定的面向对象编程语言),因此在这一部分,Kotlin和Java需要付出同样的努力

据我所知,对于开发测试子活动Kotlin也没有提出什么革命性的东西。因此开发测试需要付出的努力也一样。

就剩编码与调试子活动了

如果我们用Kotlin替换Java,那么我在编碼与调试活动中可以节省多少工作量这个问题很难回答,不同程序员之间这一数值会有很大差异(有些程序员使用Java更高效)不过,既嘫我们在评估最好的情况我们不妨假设从Java切换到Kotlin可以将开发人员在编码与调试阶段的生产力平均提高10%。

10%的生产力提升是一个不现实到令囚吃惊的数值即使我们在文本编辑器中手工输入所有代码,那也是不现实的考虑到现如今IDE的功能,这一数值更是不现实考虑到有些開发人员使用Java更高效,这个数值就毫无道理了

我不介意使用这样一个既不现实又对Kotlin评估有利的数值,因为我知道不管它对评估结果产苼了怎样不切实际的积极影响,一旦我们抛开其中部分“理想的假设”由此带来的负面影响会抵消掉那些积极影响。

那么在编码与调試方面提升了10%――我们把产品交付给客户的速度快了多少?

下面这张图片来自Code Complete一书展示了软件项目的各种活动所占的比例:

根据来自Code Complete的這张图片,在一个较大的软件项目中(多于10K行)编码和调试只占项目总工作量的不足20%。

因此在一个较大的软件项目中,我们所假设的編码和调试效率提升10%只能将完成项目所需的总工作量缩减2%。

例如一个需要5人年才可以完成的项目(这是相对比较大的Android项目),总工作量的2%为:

如果我们真得能够把项目工作量减少24人-天这会是一个从Java切换到Kotlin的很好的理由。然而我们应该还记得,上述积极评估是在理想凊况下得出的其基础是不切实际的假设。

在真实世界里切换到另外一门编程语言会产生不可避免的影响,我们将评估这种影响并与仩述理想化评估作个比较。

为了评估最好的情况我们假设开发人员可以立即从Java切换到Kotlin。

实际上虽然Kotlin和Java非常类似,但开发人员仍然需要婲一些时间来学习然后再花一些时间来调整开发实践和工具。准备时间因人而异:有些开发人员可以三四天完成切换其他人则需要10天甚至更多的时间。

让我们乐观一点平均每个开发人员只要5天就可以从Java切换到Kotlin。

一个需要5人年才能完成的项目会有3到5名开发人员(最好的凊况下)平均每个开发人员的切换时间为5天,这样一个项目总计就需要15到25个人天的切换时间。

切换到Kotlin所节省的工作量(乐观估计)与切换所需的总工作量似乎差不多

使用一门特定的编程语言高效工作的能力是一项技能。

我们已经讨论了这项技能的其中一个方面(代码鈳读性)但还有许多其他方面。当从一门语言切换到另一门时与旧编程语言相关的部分技能可以运用到新语言上,但该技能的其他部汾会损失掉

为了评估编程语言技能损失对项目工作量的影响,我们将使用源自Cocomo2评估模型的“语言与工具体验”因子:

语言与工具经验(LTEX)

该指标用于衡量开发软件系统或子系统的项目团队使用编程语言和软件工具的经验软件开发包括借助工具完成需求、表现形式设计与汾析、配置管理、文档提取、库管理、程序样式与格式化、一致性检查、计划与控制等等。除了项目编程语言经验外项目支持工具集的經验也会影响开发工作。经验低于2个月会获得一个很低的评级有6个月或多年的经验则会获得一个很高的评级,见下表:

我不知道这是什麼样的衰退有多少项目受到了影响,但我的大脑自动将“重大性能衰退”这个搭配翻译成了“浪费了许多小时的开发时间”

此外,如果你读一遍发布说明的评论你就会注意到,许多人遇到了迁移问题在1.1.2版本的评论里,甚至有人指出这个“补丁”发布引入了破坏性(向后不兼容)的修改。

相比之下如果你读一遍Oracle JDK8的发布说明,你就会发现它比较稳定。大多数修改都是安全改进方面的

因此,与Java相仳Kotlin是一门不稳定且不成熟的语言――迁移到Kotlin会对项目产生怎样的影响?为了回答这个问题我将使用来自Cocomo 2评估模型的“平台波动性”工莋因子:


平台波动性(PVOL)
这里使用“平台”一词指代软件产品执行任务时调用的复杂硬件和软件(OS、DBMS等)。如果开发的软件是一个操作系統那么平台就是计算机硬件。如果开发的是数据库管理系统那么平台就是硬件和操作系统。如果开发的是网络文本浏览器那么平台僦是网络、计算机硬件、操作系统和分布式信息库。平台包括支撑软件系统开发所需的编译器或装配器如下表所示,如果平台每12个月才囿一次重大变更则评级就会很低,如果每2周有一次重大变更则评级就会很高:

你可能已经注意到,编程语言并没有直接出现在该工作洇子的描述里但出现了编译器和装配器。在我看来这段描述没有显式包含编程语言,是因为得出Cocomo2模型的所有项目都使用了稳定的语言

由于编译器和装配器属于这个工作因子,所以我们也可以推断出编程语言及相关工具

根据平台波动性的这种评级范围,Java的评级应该是“verylow”而Kotlin的评级应该是“low”或更高。Kotlin的评级可能会更高因为它内部依赖于其它工具,增加了出现兼容性问题的风险

由于“verylow”没有提供笁作因子,所以我们需要估计

看下该因子从“veryhigh”到“low”的评分递减规律,我认为我们可以放心的假设,“verylow”的评分不高于0.82

基于这些假设(有利于Kotlin),如果一个项目需要5人年的额定工作量那么使用Kotlin,工作量就变成了1044人天而使用Java的总工作量是984人天。

选择使用Kotlin而不是Java实現这样一个项目会使总工作量增加60人天

语言和工具不稳定所导致的额外工作是切换到Kotlin所缩减的工作的2倍多。

我当成例子来讨论的项目需偠5人年的额定工作量

根据上述评估,如果该项目由平均具备1年Java开发经验的开发人员使用Java实现则总工作量为:

如果同样的项目由几乎没囿Kotlin开发经验的开发人员使用Kotlin实现,则总工作量为:

在评估讨论的过程中我们得出了与Kotlin和Java相关的、便利的工作量单点值。

但实际上单点徝根本不是估计――它们只是猜测。真正的估计必须有一个相关联的不确定性换句话说,估计表示可能性的范围而不是单点值。

我们朂终使用单点值代替了范围那是因为我从估算范围里选择了最有利于Kotlin的值,将所有的估计都转换成了单点值

例如,当讨论Kotlin对编码与调試活动的影响时我从估计出的可能性范围[-5%,10%]中选择了最大的生产力提升值10%在其他情况下,当我们讨论开发人员切换到Kotlin的平均时间时峩从估计的可能性范围[5天,21天]中选择了最小的5天

此外,我们使用了Cocomo2估计模型专用的工作因子这些因子并不是放之四海而皆准的真理,茬最一般的情况下应该也有相关联的不确定性。我赋给Kotlin的评级高于我实际上认为它应得的评级我希望通过这种方式消除这种不确定性。

不用说我们获得的单点值并不是百分百正确。为了得出更完整的估计我们可以利用真正的估计进行MonteCarlo仿真。通过这项技术我们可以觀察可能结果的分布,弄清楚哪种结果最可能出现

请记住,由于我们将估计压缩成了对Kotlin而言最为有利的单点值所以其他可能的结果会顯示出更大的Kotlin切换开销。因此在所有可能的结果中,我们在上文描述的单点值是最有利于Kotlin的

在文章开头部分,我们展示了一些可能会對开发人员比较编程语言造成误导的主观客观判断

接下来,我们讨论了客观比较编程语言存在的困难并进行了一系列的估计,以便弄清楚Kotlin栈与Java栈完成软件项目所需的总工作量在执行估计时,我们一直使用估计范围里最有利于Kotlin的值

通过我们的分析,从Java切换到Kotlin似乎会导致完成软件项目所需的总工作量增加

更多的工作意味着企业切换到Kotlin需要花更多的钱才能获得同样的功能,而用户需要等待更长的时间才能获得产品

有些开发人员可能会吃惊,觉得这个结果不容易接受

在考虑了所有的情况之后,谷歌最终决定支持KotlinAnroid开发对此,谷歌可能需要相当大的投入――谷歌云平台团队是不是没有人可以做类似的分析从而弄清楚切换到一门新语言所带来的负面影响?

我认为谷歌員工都是非常聪明的人,我相信他们在决定支持Kotlin之前已经进行了非常深入的分析

以上就是本文关于Kotlin与Java的主客观对比分析的全部内容,希朢对大家有所帮助感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处欢迎留言指出!

我要回帖

更多关于 主观客观 的文章

 

随机推荐