乔山办公网我们一直在努力
您的位置:乔山办公网 > office365 > office源码分析_office源码多少行

office源码分析_office源码多少行

作者:乔山办公网日期:

返回目录:office365

如何看待华为1100亿行规模的代码库?


好吧,需要算算了。按美国平均水平,每个程序员每天10行代码,中国比较勤奋,就算30行吧!一人一年1万行吧。算下来大约是1100万人年。软件有生命期,好的情况下自己败坏周期在5-20年,质量一般的话,也就10年(如此大量代码,只能是行业平均水平)。也就是说,大约需要110万程序员。嗯,什么概念呢?大约至少得10个微软吧!

再说恐怖的,cmm3级(这不是平均水平,而是较高水平了),一千行大约3个问题出厂,1100亿大约是,3亿个bug(也就是3亿个问题)。解决这些问题足够让一个微软公司破产了。但华为活得好好的,其危机却与这个没关系。所以,可以明白的是目前华为的产品代码,绝对达不到这么大。如果此事真实,其中大多数代码应该被抛弃了,因为即便是cmm5也得有3千万bug,这不可能是真实的。

好了,如果代码库真的有这么多,到底是什么情况呢?估计多数是开源代码库的中依赖的部分复制和开发者保存的备份。这是防止断网影响项目进展的防范手段。所以别太嗨了。呵呵。

算完了,但果是不被质疑的。程序员的感受是,一天10行代码?搞笑呢?

那我先拿一个职业生涯中的例子看看个人生产情况:

我刚开始产品级编程是一个通信系统(与华为同行,可比较)。整个系统中开发2年,大约在1991-1993年。我负责系统中的一个核心模块编程项目。敲代码,我最快18小时,3000行汇编,这个小项目的全部代码,强实时,时钟级设计,无操作系统。但全过程过程实际算下来大约有将近6个月。包括原理设计,代码执行机制规划,算法设计,原理机验证测试,逻辑分析仪调试。那18个小时不过是敲代码,基本没有稍微深入一点的思考(主要思考内容:寄存器分配调配;内存效率;3级任务协调;周期计算;累加器溢出控制;可靠性监测周期等细节,以保持遵循详细设计定下的原则)。没有单元测试、没有功能测试、没有代码评审、没有团建和各种活动。(那台逻辑分析仪够我当时10年工资。)一天不到20行代码吧?

项目期间我为自己还开发了4000多行c语言的工具,有算法仿真工具的、有分解烧录文件的、有原型实验的。还有几百行快速编译的dos批处理文件。但这都与产品无关,算不上产品代码。当然还有过程中,放弃了20000行汇编(毕竟当时还是经验不足),主要是架构问题达不到要求,最终代码中没这个,也不能算。就呵呵了,难道连失败的东西都要算到工资奖金里吗?

项目结果:前两年和华为交流,他们说那套91年的代码实现的指标到现在也是先进的。那套代码到最后收到保险柜也没有再改过一行。这中间三年试运行,审查、鉴定、定型、销售,再没改过,所有性能、可靠性监测的保护机制从未启动过,最长运行时间是2万小时。

这是通信领域个人手工业作战的基本情况。

当这种工作被分解给多个人之后就是团队计算了。这是软件工业难点之一:工时估算。

在产品市场问题解决后,开发成本估算就是软件开发难点。最现实的估算是,专家用背靠背评估最终实现代码行数。这些代码行数除以组织软件开发成熟度估算效率(也就是10行每人天的意义),再乘以开发团队的平均人天成本就可大致得到成本量级。所以,10行每人天的估算是开发团队组织效率的,不是程序员个人生产力。

另外:

1、代码库是一种软件工程中的保护机制,不反应软件生产的实际情况。

2、代码不是越多越好,任何以代码行数计算开发人员生产力的想法,都是很外行的。

如何评价永中office?


首先,永中office作为除了wps之外,是第二个完全自研的office软件,office软件作为庞大的桌面基础软件,上千万行的源代码工程量,从这一点来说,必须给永中office点个赞,从宏观上来说,永中office确实基本做到了与微软office的兼容,如打开文件,操作体验等基本一致,在我看来永中office未能与wps同台竞争,有以下几个硬伤。

1.技术选型失策,安装永中office时我们都知道,它会安装一个java运行时环境,它的宏编辑器也是java语法,由此可见,永中office由java语言写成,java语言来开发这样一个大型软件,当然有它的好处,比如开发效率高、跨平台。但劣势更大,首先是没法进行细粒度的效率优化。作为一个大型软件,我想内存池、对象池的自我管理应该是必不可少的,相关计算资源在一个自我受控的环境下管理是进行效率优化的最基本保障,但因为java语言的特性,这些都做不了了。

2.二次开发接口兼容问题,永中office有自己的二次开发接口,很遗憾,这些接口与微软office是完全不一致的,这会给初级以上的用户带来很大的问题,首先,对于带有vba数据的文件,永中office打开这样的文件是一定没法完全兼容的,其次,在企业业务系统中,office往往会以二次开发接口调用的形式参与到业务系统的某一个环节中,而这些业务系统基本是以微软的office接口来作为标准的,所以永中office是没办法接入的。因此,对于初级以上的用户,永中office毫无竞争力。

3.各种产品细节的沉淀不够,office作为一个大型基础软件,几百个各种功能操作入口,每个功能在细节上的处理与微软office是存在较多差异的,在这一点上wps做的要好的多,而这些,是需要研发人员的大量精力来打磨的。

源码是什么?


源代码是程序员创建的计算机程序的基本组件。 它可以被人类阅读和理解。 例如,当程序员在Windows记事本中键入一系列C语言语句并将序列保存为文本文件时,该文本文件被称为包含源代码。

源代码和目标代码有时被称为编译的计算机程序的“之前”和“之后”版本。 对于脚本 (非编译或解释)程序语言(如JavaScript) ,术语源代码和目标代码不适用,因为只有一种形式的代码。

程序员可以使用文本编辑器 ,可视化编程工具或集成开发环境来创建源代码。 在大型程序开发环境中,通常有管理系统帮助程序员分离和跟踪源代码文件的不同状态和级别。

许可源代码

源代码可以是专有的或开放的 ,许可协议通常反映了这种区别。

例如,当用户安装像Microsoft Office这样的软件套件时,源代码是专有的,并且Microsoft仅允许客户访问软件的已编译可执行文件以及各种可执行文件调用程序功能所需的相关库文件。

相比之下,当用户安装Apache OpenOffice时 ,可以下载和修改其开源软件代码。

通常,Microsoft等专有软件供应商不会与客户共享源代码,原因有两个:保护知识产权并防止客户以可能破坏程序或使其更容易受到攻击的方式更改源代码。 专有软件许可证通常禁止任何发现或修改源代码的尝试。

另一方面,开源软件的设计理念是应该提供源代码,因为许多致力于增强软件的开发人员的协作努力可能有助于使其更加健壮和安全。 用户可以在公共许可证下自由获取开源代码,例如GNU通用公共许可证 。

源代码的目的

除了为软件创建提供基础之外,源代码还有其他重要用途。 例如,如果需要,能够访问源代码的熟练用户可以更容易地定制软件安装。

同时,其他开发人员可以使用源代码为其他操作平台创建类似的程序 - 这项任务在没有编码指令的情况下会更加棘手。

访问源代码还允许程序员通过共享代码用于学习目的或通过将其部分回收用于其他应用程序来为其社区做出贡献。

组织源代码

即使是没有编程背景的人也可以阅读上面的C编程源代码,并了解该程序的目标是打印“Hello World”字样。 但是,为了执行这些指令 ,必须首先将此源代码翻译成计算机处理器可以理解的机器语言 ; 这是一个称为编译器的特殊解释程序的工作 - 在本例中是一个C编译器。程序员编译源代码后,包含结果输出的文件称为目标代码。

目标代码主要由数字1和零组成,不能被人类轻易阅读或理解。 然后可以“链接”目标代码以创建运行以执行特定程序功能的可执行文件 。

源代码管理系统可以帮助程序员更好地协作开发源代码; 例如,防止一个编码人员无意中覆盖另一个人的工作。

源代码的历史

确定源代码的历史起点是一种主观的 - 难以捉摸的 - 练习。 第一个软件是在20世纪40年代用二进制代码编写的,因此根据一个人的观点,这些程序可能是源代码的初始样本。我们今天认识到的最早的源代码示例之一是由计算机科学的早期先驱Tom Kilburn编写的。Kilburn在1948年创建了第一个在计算机内存中以电子方式存储的成功数字程序(该软件解决了数学方程式)。

在20世纪50年代和60年代,源代码通常由创建程序的公司免费提供。 随着不断发展的计算机公司扩展软件的使用,源代码变得更加丰富和受到追捧。 在互联网时代之前计算杂志通常会在其页面中打印源代码,读者需要为自己的用途重新键入字符的代码字符。 后来, 软盘降低了电子共享源代码的价格,然后互联网进一步删除了这些障碍。

为什么spring的源码一看就犯困?有没有什么学习的技巧?


因为spring的意思是春天,春困秋乏懂不

如何高效阅读源代码?


下面是之前写的一篇文章:《如何快速阅读源码》


本文探讨在需要了解一个开源项目时,如何快速的理清开源项目的代码逻辑!

以下是个人认为行之有效的方法:

  • 先「跑起来」
  • 自顶向下拆解
  • 深入细节
  • 延伸改进

本文以Mybatis为例来进行演示!

先“跑起来”

程序界有个老传统,学习新技术时都是从「Hello World」开始的!无论是学习新语言时,打印「Hello World」;还是学习新框架时编写个demo!那为什么这里的「跑起来」要打个引号呢?

实际上,当你想要阅读一个开源项目的源码时,绝大部分情况下,你已经能够使用这个开源项目了!所以这里的“跑起来”就不是写个「Hello World」,也不是能跑起来的程序了!而是能__在你的脑子里「跑起来」__!什么意思?

Mybatis你会用了吧?那么请问Mybatis是如何执行的呢?仔细想想,你能否用完整的语句把它描述出来?

这里是Mybatis的官方入门文章!你是如何看这篇文章的?读一遍就行了吗?还是跟着文章跑一遍就够了吗?从这篇文章里你能获得多少信息?

我们来理一下:

  • 安装
    • 如何在项目中引入Mybatis?
    • Mybatis的groupId是什么?artifactId又是什么?目前最新版本是多少?
  • 从 XML 中构建 SqlSessionFactory
    • SqlSessionFactoryBuilder可以通过xml或者Configuration来构建SqlSessionFactory,那是如何构建的呢?
    • xml配置了哪些信息?既然使用了xml,那肯定有xml解析,用什么方式解析的?
    • xml里的标签都是什么意思:configuration,environments,transactionManager,dataSource,mappers。以及这些标签的属性分别是什么意思?
    • SqlSessionFactory的作用是什么?
  • 不使用 XML 构建 SqlSessionFactory
    • BlogDataSourceFactory,DataSource,TransactionFactory,Environment,Configuration这些类的作用是什么?
    • *Mapper的作用是什么?
    • 为什么提供基于XML和Java的两种配置方式?这两种配置方式的优缺点是什么?
  • 从 SqlSessionFactory 中获取 SqlSession
    • SqlSession的作用是什么?
    • selectOne和getMapper的执行方式有什么区别?
  • 探究已映射的 SQL 语句
    • *Mapper.xml的配置是什么?
    • 命名空间,id的作用是什么?
    • *Mapper.xml是如何和*Mapper.java进行匹配的?
    • 匹配规则是什么?
    • 基于注解的映射配置如何使用?
    • 为什么提供基于XML和基于注解的两种映射配置?有什么优劣?
  • 作用域(Scope)和生命周期
    • SqlSessionFactoryBuilder应该在哪个作用域使用?为什么?
    • SqlSessionFactory应该在哪个作用域使用?为什么?
    • SqlSession应该在哪个作用域使用?为什么?
    • Mapper实例应该在哪个作用域使用?为什么?

回答出了上面这些问题!你也就基本能在脑子里把Mybatis「跑起来」了!之后,你才能正真的开始阅读源码!

当你能把一个开源项目「跑起来」后,实际上你就有了对开源项目最初步的了解了!就像「书的索引」一样!基于这个索引,我们一步步的进行拆解,来细化出下一层的结构和流程,期间可能需要深入技术细节,考量实现,考虑是否有更好的实现方案!也就是说后面的三步并不是线性的,而是__不断交替执行__的一个过程!最终就形成一个完整的源码执行流程!

自顶向下拆解

继续通过Mybatis来演示(限于篇幅,我只演示一个大概流程)!我们现在已经有了一个大概的流程了:

  • SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory
  • 可以从SqlSessionFactory中获取SqlSession
  • SqlSession则是真正执行sql的类

虽说每个点都可以往下细化,但是也分个轻重缓急!

  • 我们是先了解怎么构建SqlSessionFactory呢?
  • 还是了解如何获取SqlSession呢?
  • 还是了解SqlSession如何执行sql的呢?

很明显,SqlSession去执行 sql才是Mybatis的核心!我们先从这个点入手!

首先,你当然得先下载Mybatis的源码了(请自行下载)!

我们直接去看SqlSession!它是个接口,里面有一堆执行sql的方法!

这里只列出了一部分方法:

SqlSession就是通过这些方法来执行sql的!我们直接看我们常用的,也是Mybatis推荐的用法,就是基于Mapper的执行!也就是说「SqlSession通过Mapper来执行具体的sql」!上面的流程也就细化成了:

  • SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory
  • 可以从SqlSessionFactory中获取SqlSession
  • SqlSession则是真正执行sql的类
    • SqlSession获取对应的Mapper实例
    • Mapper实例来执行相应的sql

那SqlSession是如何获取Mapper的呢?Mapper又是如何执行sql的呢?

深入细节

我们来看SqlSession的实现!SqlSession有两个实现类SqlSessionManager和DefaultSqlSession!通过IDE的引用功能可以查看两个类的使用情况。你会发现SqlSessionManager实际并没有使用!而DefaultSqlSession是通过DefaultSqlSessionFactory构建的!所以我们来看DefaultSqlSession是如何构建Mapper的!

它直接委托给了Configuration的getMapper方法!

Configuration又委托给了MapperRegistry类的getMapper方法!

在MapperRegistry类的getMapper中:

  • 通过type从knownMappers中获取对应的MapperProxyFactory实例
  • 如果不存在则抛出异常
  • 如果存在则调用mapperProxyFactory.newInstance(sqlSession)创建对应的Mapper

在这里knowMappers是什么?MapperProxyFactory又是什么?mapperProxyFactory.newInstance(sqlSession)具体做了什么?

其实很简单,knowMappers是个Map,里面包含了class与对应的MapperProxyFactory的对应关系!MapperProxyFactory通过newInstance来构建对应的Mapper(实际上是Mapper的代理)!

快接近真相了,看mapperProxyFactory.newInstance(sqlSession)里的代码:

这里干了什么?

  • 通过sqlSession,mapperInterface和methodCache构建了一个MapperProxy对象
  • 然后通过Java的动态代理,来生成了Mapper的代理类
  • 将Mapper方法的执行都委托给了MapperProxy去执行

  • 如果是Object里的方法则直接执行
  • 否则执行MapperMethod的execute方法

最终实际还是委托给了sqlSession去执行具体的sql!后面具体怎么实现的就自行查看吧!

延伸改进

现在我们的流程大概是这样的一个过程:

  • SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory
  • 可以从SqlSessionFactory中获取SqlSession
  • SqlSession则是真正执行sql的类
    • SqlSession获取对应的Mapper实例
      • DefaultSqlSession.getMapper
      • Configuration.getMapper
      • MapperRegistry.getMapper
      • mapperProxyFactory.newInstance(sqlSession)
      • 通过sqlSession,mapperInterface和methodCache构建了一个MapperProxy对象
      • 然后通过Java的动态代理,来生成了Mapper的代理类
    • Mapper实例来执行相应的sql
      • 将Mapper方法的执行都委托给了MapperProxy去执行
      • 如果是Object里的方法则直接执行
      • 否则执行MapperMethod的execute方法
      • 最终还是委托给sqlSession去执行sql

现在我们大概知道了:

  • 为什么Mapper是个接口了
  • Mybatis基于这个接口做了什么

那么,

  • 什么是动态代理(基础哦)?
  • 为什么使用动态代理来处理?
  • 基于动态代理有什么优点?又有什么缺点?
  • 除了动态代理,还有其它什么实现方式吗?比如说cglib?
  • 如果是其它语言的话,有没有什么好的实现方式呢?
  • ......

这个问题列表可以很长,可以按个人需要去思考并尝试回答!可能最终这些问题已经和开源项目本身没有什么关系了!但是你思考后的收获要比看源码本身要多得多!

再循环

一轮结束后,可以再次进行:

  • 自顶向下拆解
  • 深入细节
  • 延伸改进

不断的拆解->深入->改进,最终你能__通过一个开源项目,学习到远比开源项目本身多得多的知识__!

最重要的是,你的流程是完整的。无论是最初的大致流程:

  • SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory
  • 可以从SqlSessionFactory中获取SqlSession
  • SqlSession则是真正执行sql的类

还是到最终深入的细枝末节,都是个完整的流程!

这样的好处是,你的时间能自由控制:

  • 你是要花个半天时间,了解大致流程
  • 还是花个几天理解细节流程
  • 还是花个几周,几个月来深入思考,不断延伸你都可以从之前的流程中快速进行下去!

而不像debug那样的方式,需要一下子花费很长的时间去一步步的理流程,费时费力、收效很小,而且如果中断了就很难继续了!

总结

本文通过梳理Mybatis源码的一个简单流程,来讲述一个个人认为比较好的阅读源码的方式,并阐述此方法与传统debug方式相比的优势。

本文标签:

相关阅读

  • office源码分析_office源码多少行

  • 乔山办公网office365
  • 如何看待华为1100亿行规模的代码库? 好吧,需要算算了。按美国平均水平,每个程序员每天10行代码,中国比较勤奋,就算30行吧!一人一年1万行吧。算下来大约是1100万人年。软件有
关键词不能为空
极力推荐
  • 小新14正版Office_小新14青春版

  • 华为mate book14和联想小新13pro,该选择哪款? 看了你的需求,联想小新Pro 13版本显然已经绰绰有余了,而且根本就不用买Intel版本的,买标压锐龙版就可以了,配置如下: 处理器:AMD 锐龙

ppt怎么做_excel表格制作_office365_word文档_365办公网