精华内容
下载资源
问答
  • 前言:今天在这里分享几个图谱,大家可以对照着几个图谱,看看自己会什么,能做什么,又有那些不足的地方,从而去提升自己,其次脑海里有一个全面的...一、QA质量体系搭建 二、质量架构全景 三、质量效率全景图 ...

    前言:今天在这里分享几个图谱,大家可以对照着几个图谱,看看自己会什么,能做什么,又有那些不足的地方,从而去提升自己,其次脑海里有一个全面的图谱,对于自己以后的职业规划也是有帮助的,至少你知道自己的工作职业原来是这么牛逼的,哈哈哈!

    一、QA质量体系搭建

    在这里插入图片描述

    二、质量架构全景在这里插入图片描述

    三、质量效率全景图

    在这里插入图片描述

    展开全文
  • 会产生“等自己技术牛逼了再去做架构或者搭建框架”这样的想法。在这里笔者可以很肯定地告诉大家,初学者是完全可以去做这些事情的。 初识架构和框架 架构和框架是非常接地气的,离我们其实并不遥远。 什么是架构? ...

    前言

    架构和框架这些概念听起来很遥远,让很多初学者不明觉厉。会产生“等自己技术牛逼了再去做架构或者搭建框架”这样的想法。在这里笔者可以很肯定地告诉大家,初学者是完全可以去做这些事情的。

    初识架构和框架

    架构和框架是非常接地气的,离我们其实并不遥远。

    什么是架构?

    架构是一个约定,一个规则,一个大家都懂得遵守的共识。那这是什么样的约定、什么样的规则、什么样的共识呢?

    我以包为例,我经常出差,双肩背包里装了不少东西。笔记本电脑、电源、2 个上网卡、鼠标、USB 线、一盒大的名片、一盒小的名片、口香糖、Mini-DisplayPort 转 VGA 接口、U 盘、几根笔、小螺丝刀、洗漱用品、干净衣服、袜子、香水、老婆给我带的抹脸膏(她嫌我最近累,脸有点黄)、钱包、Token 卡、耳机、纸巾、USB 线、U 盘等。这个包有很多格子,最外面的格子我放常用的,比如笔、纸、一盒小的名片等;中间的格子一般放的是衣服、袜子、洗漱用品、香水等;靠背的那个大格子放了笔记本电脑,和笔记本电脑相近的小格子放的是两个上网卡、Mini-DisplayPort 转 VGA 接口、大盒名片、记事本,和笔记本电脑相近的大格子放的是电源、鼠标、口香糖等。

    我闭着眼睛都可以将我的东西从包里掏出来,闭着眼睛都可以将东西塞到包里!但是,非常不幸的是,一旦我老婆整理过我的包,那我就很惨了,老是因为找不到东西而变得抓狂!更不幸的,要是我那个不到两岁的“小可爱”翻过,就更不得了了。

    这个包就是我放所有物品的“架构”,每一个东西放置的位置就是我的“约定、规则、共识”。倘若我老婆也知道我的“架构”、我的“约定、规则、共识”,那么不管她怎么动我的包,我都照样能够轻易的拿东西或者放东西。进一步,如果我的同事也知道我的“架构”,知道我的“约定、规则、共识”,那么他们什么时候动我的包,我也毫无所知!——道法自然 《10 年感触:架构是什么?——消灭架构!》

    什么是框架?

    框架(framework)是一个框子–指其约束性,也是一个架子–指其支撑性。——360 百科

    小结

    本小节对框架和架构概念做了简单的认识,得出了以下两个结论:

    • 架构是“约定、规则、共识”
    • 框架具有约束性和支撑性

    到这里,大家应该对这两个概念有点感觉了。但是还是会有很多疑问,比如“如何去做架构?”、“框架的约束性和支撑性分别指的什么?”等等,没关系,笔者坚信“带着问题去阅读”往往是最有效的阅读方式。接下来笔者将分享这两年来对框架和架构探索的经历,以及对这两个概念认识的演变,希望给大家带来一些启发,顺便大家心中的一些问题得到解答。


    QFramework

    两年前,笔者毕业半年,刚从 cocos2d 转 Unity 不到两个月,当时所在的公司有一套游戏开发框架。笔者用它做了两个月的项目,使用框架做项目的时候并没有去思考框架是什么,只是开始的时候觉得很新鲜,而且越用越顺手,尝到了它的甜头。

    后来笔者接到了一个跑酷游戏项目,于是就把工作辞掉了,决定出来全职做这个项目。辞职后,公司的框架由于保密协议就不可以用了。项目就只能从零开始开发,那么结果就是在跑酷项目的开发的过程中各种中水土不服。

    于是,笔者就开始了市面上开源框架的选型,折腾了几天,发现要么上手太难,要么学习成本很高文档不齐全,有的框架光是理解概念就要很久,对于像笔者一样刚毕业的初学者来说,市面上的开源框架真的很不友好。

    从那时候笔者就决定要 为自己,开发一套符合自己使用习惯的框架,也就是现在的 QFramework。

    为什么叫 QFramework ?

    笔者在做 cocos2dx 的时候,市面上有个叫 Quick-Cocos2d-x 的开源框架,用两个词形容就是简单、强大。

    笔者认为好的工具就应该简单。

    QFramework 的目标是要做到像 Quick-Cocos2d-x 一样 “简单、强大”。当时笔者纠结过很多名字,比如 QuickEngine,QuickUnity 等等。Q 代表 Quick,并且 Q 这个字母给人感觉灵活有弹性,所以最终确定为 QFramework。

    在决定要做框架之后,笔者就开始了边搭建框架边进行着跑酷项目开发的工作生活。

    启蒙资料 《Unity 架构设计与开发管理》

    很幸运地是,在跑酷项目开发之初,笔者接触到了一个非常好的关于 Unity 项目架构的学习资料,就是刘钢老师在 Unite 大会上的讲座视频《Unity 架构设计与开发管理》,视频中所提出的 Manager Of Managers 很好地为笔者开发 QFramework 指明了方向。虽然刘老师讲得通俗易懂,但是里边有很多话都很值得回味,笔者之后也花了很长时间去消化里边的内容,直到今天,笔者再看一遍视频还是会有很多收获的。在读此文时我们先不着急看里边的内容,视频链接会在文章的最末尾贴出。

    跑酷项目准备

    一个项目开始立项的时候,最常见的一个情况就是:几个人一个小团队,开始什么也不做,开始写代码,验证逻辑,然后 game 就开始写起来了。公司的一些的所谓的领导层一开始就把游戏定义为“我们要做的一个大作”,那么这个事情本身就是一个笑话。没有任何的规划和设计,我们就妄图就写出一个所谓的杰出的作品出来是不现实的。Unity 再好用,以这个心态去做游戏,一定会写不出来好的游戏来。——刘钢《Unity 项目架构和开发管理》

    看到视频中的这段话,吓得笔者赶紧为跑酷项目做了些准备。比如最常见的表现和逻辑的分离。

    表现逻辑分离

    我们大家都知道,做项目尽可能地要把表现和逻辑分离。同样的跑酷项目也是如此,而最常用最经典的方式就是使用 MVC。

    经典的 MVC 架构模式

    MVC 是在软件开发时最常用的架构模式,我想大家都应该接触过,所以 MVC 的概念在这里笔者不会浪费口舌去赘述,不了解的同学可以参阅阮一峰前辈的《谈谈MVC模式》

    跑酷项目中的 MVC

    跑酷项目代码的架构使用的是很简单的 MVC。笔者当时是按照如下的方式去进行划分的:

    • View 层是各个 UI 的 Transform 本身。
    • Ctrl 层则是挂在各个 View GameObject 上的 MonoBehaviour。
    • Model 层则是若干个提供数据增删改查的并且可以全局访问的单例。

    跑酷的 MVC 架构图如下所示:

    从今天的来看,这种 MVC 设计是一种很粗糙的设计,尤其是其 Model 层,颗粒度太大,其实再可以分出个 DataAccess 层。不过粗糙的好处就是初学者能够驾驭,是有存在的意义的。

    到这里,架构这个词终于出现了。MVC 是一种架构模式,对程序进行 MVC 的划分是在进行架构活动。除了 MVC 架构模式,还有几种其他的架构模式。

    而对程序进行 MVC 的划分,实际上是对代码进行结构的设计,所以对程序进行结构的设计是在进行架构活动。

    到这里,我们知道了架构是我们每天都在做的事情(划分 MVC 或者说将代码的表现与逻辑层分离)。而对代码进行结构的设是否和架构的“约定、规则、共识”有关系呢?答案是肯定的。我们接着往下进行探索。

    文件结构

    很多时候我们说的一个所谓的好的架构,直接就等于你要有一个好的标准,指定一些好的规则。——刘钢《Unity 架构设计与开发管理》

    Unity 好的规则 3:

    我们在起一些文件夹的名字的时候,尽量和我们的 GameObject 对应起来,如果我们的 GameObject 叫做 PoolManager,我下面所有的代码也都起一个同样的名字叫 PoolManager,那么这样在以后找对应的程序结构的时候,会比较好理解一些。——刘钢《Unity 架构设计与开发管理》

    而跑酷项目最初的部分代码文件结构如下:

    • Scripts
      • App
        • Objects
          • Stages // 关卡单元
            • XXStage.cs
          • Enemy // 敌人
            • EnemyCtrl.cs
            • EnemyModel.cs
          • Player // 角色
            • PlayerCtrl.cs
            • PlayerModel.cs
        • Managers
        • EnemyManager.cs * StageManager.cs

    对于 MVC 的文件结构的划分,笔者在进行跑酷项目之前的其他项目的时候也尝试了别的方案。当时觉得这种方式找起来最方便。

    在项目结束之后不久看到了一篇吴秦前辈的一篇好文《Unity3D手游开发实践》:

    一般客户端用得比较多的 MVC 框架,怎么划分目录?

    先按业务功能划分,再按照 MVC 来划分。“蛋糕心语”就是使用的这种方式。

    先按MVC划分,再按照业务功能划分。“D9”、“宝宝斗场”、“魔法花园”、“腾讯桌球”、“欢乐麻将”使用的这种方式。

    根据使用习惯,可以自行选择。个人推荐“先按业务功能划分,再按照 MVC 来划分”,使得模块更聚焦(高内聚),第二种方式用多了发现随着项目的运营模块增多,没有第一种那么好维护。——吴秦《Unity3D手游开发实践》

    而笔者所采用的方式就是“先按照业务功能划分,再按照 MVC 来划分”。在这里仅仅是个建议,并不是一定要使用的方式。

    QFramework 的第一个工具“单例模板”

    在跑酷项目的 MVC 中,笔者把 Model 层设计成了单例。为什么使用单例呢?

    抛开粗糙的设计不说,先让我们简单分析下跑酷项目的 Model 层的特点:

    • Model 层的数据在整个软件的生命周期里只有一份。
    • Model 层的数据要对任何 Ctrl 都提供增删改查。

    很自然地就想到了使用单例模式实现。而很多开源库里都会提供可复用的单例模板,一般叫 Singleton 和 MonoSingleton。所以单例的模板作为第一个工具被收录到框架中。

    “代码是资产”思维

    在写一个项目的时候,不要短视的说我就把这个项目做完了,就是交一个差上线了就完了,我们希望每写一个游戏的时候,我们都积累一些东西,把写的每一行代码,都当成是一个可以收藏的,甚至是可以传递下去的这样的一个资产。有了这样一个思想,可能我们在写代码的时候,整个的思维模式会完全不一样。——刘钢《Unity 项目架构和开发管理》

    听到上面这段话,在当时的笔者心中埋下了一颗种子。在这个基础上进行思考,会产生很多很有价值的想法。本小节先讲到这里。

    小结

    文章读到这里我们简单进行总结一下。

    • 架构是“约定、规则、共识”
    • 框架具有约束性和支撑性
    • 好的架构直接就等于一套好的规则,好的准则
    • Unity 好的规则
      • 3.起文件夹的名字时尽量和 GameObject 对应起来
      • MVC 文件结构:先按照业务功能划分,再按照 MVC 来划分
    • “代码是资产”思维
    • QFramework
      • 工具集
        • FSM
        • Singleton&MonoSingleton
        • MsgDispatcher
        • MathUtils

    结合跑酷项目准备阶段,以上的结论应用的结果如下图所示:

    图中的需求收集/业务分析是本小节没有讲的,由于这个跑酷项目是合作项目,有一些需求合作方本身也没太想清楚,在进行准备这个阶段之前,跑酷项目已经完成了一版 Demo 进行了需求上的确认。

    由于受到“代码是资产”思维的影响,QFramework 的开发模式最初是以收集工具为目的的,此时的 QFramework 并不是真正意义上的框架,而是一个库或一个工具集。

    跑酷项目开发

    在准备完毕之后,跑酷项目就开始了大量的业务/逻辑开发。

    语言学习

    在做跑酷项目时,笔者当时的水平怎么样呢?三个字,非常菜。有很多很基本的功能要学习 Unity API 才能完成,比如跑酷的关卡生成器等等。对 C# 语言的掌握也是靠着以前一点 Java 经验,才能勉强能应付逻辑开发,之前所说的单例的模板,也只是知道怎么去用,并不知道实现的原理。这时候笔者觉得必须要对 C# 进行基础学习。于是就开始每天看一点传智的 C# 基础视频。学习的过程中,一些语言特性不知道怎么用,而有的语言特性觉得很有用。所以此时只是为了完成项目而进行学习,自然而然地就没有太多的精力去深究语法细节。我们大家都知道,这不是一个很好的学习方式。

    QFramework 是知识积累工具

    随着对 C# 语言的了解程度加深,慢慢地可以看懂一些工具的源码了,也可以自己实现一些很简单的封装。而笔者在跑酷项目的开发期间先后收录了有限状态机、消息分发器和一些数学工具。以上收集的工具与单例的模板一样,都是同一性质的工具,所以这里没什么好说的。值得一提的是笔者当时做了一件事,笔者按照之前 cocos2dx 的使用习惯把一些 Unity 的 API 简单封装了一下,最初这么做只是为了提高自己的开发效率,扩大自己在 Unity 里的舒适区(笔者之二前一种用 cocos2d)。做了这件事之后给了笔者很大启发,笔者为什么不把一些新学习的 Unity 的 API 或者 C# 特性简单封装一下然后收录到 QFramework 中呢?这样以后使用这些 API 的时候就不用再查询搜索引擎了,直接使用封装的工具就好了。这样还能让 QFramework 帮助笔者“记住” Unity 的 API 和 C# 的特性。从那以后 QFramework 不止是一个工具集,也是笔者的一个知识积累工具。这样耗能解决上文中笔者对“学习的知识没有用武之地”的困扰。这样既能激发笔者的学习动力,又对 QFramework 本身也有好处,一石二鸟。

    业务支撑工具

    我们都知道,做一个游戏项目,都会用到 UI、音效、配置表和数据存储等模块。跑酷项目也是一样的,在刘钢老师的《Unity 架构设计与开发管理》视频里提出了一个叫做 Manager Of Managers 的架构方案,可以把以上模块全部做成一个单例,比如 UIManager,AudioManager 等。而笔者认为,这些工具模块都是为了支撑游戏业务的,比如游戏音频管理方案,界面层级管理方案等等。也就是说大多数项目都用得到。而不像单例的模板、有限状态这些工具,它们不是为了支撑业务而积累的。为什么这么说呢?单例的模板是设计工具,解决的问题不是业务问题是设计问题,而有限状态机则是一种数据结构,是简化一部分问题的思维模型。而 UIManager、AudioManager 等等。每个模块都是独立的解决方案,是为了解决某一业务问题而设计的。所以笔者在这里称它们为业务支撑工具。

    而刘钢老师的在视频中列出了以下模块:

    • MainManager
    • EventManager
    • AudioManager
    • GUIManager
    • PoolManager
    • LevelManager
    • GameManager
    • SaveManager
    • MenuManager

    这里除了 GameManager 以外,其他的全部可以在别的项目中复用。

    这时跑酷项目中已经实现了

    • SoundManager(AudioManager)
    • ConfigManager(LevelManager)

    这两个工具自然也收录到了 QFramework 中。这样 QFramework 的目标有了一些变化。而 QFramework 除了是工具集和知识积累工具之外,还是一个支撑业务工具的集合。而之后笔者要做的就是把就是 Manager Of Managers 提出的这些模块一一收录。

    项目结束

    很快,跑酷项目接近尾声。拿到结款后分析了一下当时工作生活状态的利弊。决定还是找一家公司继续沉淀。一是为了让 QFramework 多接触一些不一样的项目,二是笔者非常渴望与同行能交流的,三是开发跑酷项目的这两个半月对未知的恐惧太强烈了,比如对未掌握的技术,没把握实现的功能等等,四是合作方的第二个项目需要组个完整团队去做,当时身边没有太合适的人。总之跑酷这个项目到此完美结束了。

    小结

    在文章的最开始,笔者提出了框架具有约束性和支撑性。 QFramework 目前已经具备了其中的支撑性,也就是支撑业务。而业务是其中一种框架所能支撑的领域,除此之外还有其他的领域,比如团队协作,工作流等等,这里先不多说。而约束性到目前还没有提过。没关系,我们接着往下进行。

    文章读到这里我们再进行总结一下。

    • 架构是“约定、规则、共识”
    • 框架具有约束性和支撑性
    • 好的架构直接就等于你要有一套好的规则,好的准则
    • Unity 好的规则
      • 3.起文件夹的名字时尽量和 GameObject 对应起来
      • MVC 文件结构:先按照业务功能划分,再按照 MVC 来划分
    • 代码是资产
      • 做完每一个项目都积累一些东西
    • QFramework
      • 工具集
        • FSM
        • Singleton&MonoSingleton
        • MsgDispatcher
        • MathUtils
      • 笔者知识积累工具
      • 业务支撑工具集(支撑性)
        • SoundManager
        • ConfigManager

    新的公司

    2016 年 3 月下旬,跑酷项目做完之后来到了一家新的公司,来的时候公司已经具有一定的规模,其游戏技术团队也积累了一些 Unity 的插件和工具。而笔者所加入的团队是技术支持团队。技术支持的工作就是平时负责攻克技术难点,做一些预研,再做一些工具来给项目团队使用,有的时候项目人手不够了还要顶上去。而在这家公司的两年则是笔者成长最快的两年,一是遇到了好 Leader,二是做的事情非常喜欢。

    UIManager

    到了新公司,工作的同时,业余时间 QFramework 的开发还是要进行的。而公司的项目是没有一个很统一的框架,每个项目组都是各干各的。但是我们部门的好处就是都可以看到项目组的代码。每个项目的 UIManager 都是基于 Dictionary 来提供查询,然后简单地用 GameObject 的前后关系来管理 UI 的层级。笔者当时也看了一些市面上开源的 UI 框架,实现原理都差不多。所以索性就自己开发了一套很平庸的实现,没有什么太大的亮点。不过好在,算是完成了对 ManagerOfManagers 中 GUIManager 的收集。

    AssetBundleManager

    AssetBundleManager 是看一个公司项目时候看到的,本身是一个开源免费的 Asset Store 插件。笔者之前对于资源管理没有太大的概念。像之前做的跑酷项目,都是直接都把 GameObject 拖到场景里完成的。很少用到动态加载卸载内存。但是看了 AssetBundleManager 之后,很看好它的 Simulation Mode。所以就收录到 QFramework 里了。使用 AssetBundle 的好处有很多,支持热更啊,控制包体大小啊等等。缺点就是坑多,而且有一些学习成本,但是还是非常值得去研究的。

    加班

    在收集了 UIManager 和 AssetBundleManager 之后开始了时长较长的加班。加班的原因就不说了,从这时候开始 QFramework 就搁置了一段时间。

    小结

    本小节的 UIManager 和 AssetBundleManager 都是一种很普通的实现,没有太大的亮点。

    文章读到这里我们再进行总结一下。

    • 架构是“约定、规则、共识”
    • 框架具有约束性和支撑性
    • 好的架构直接就等于你要有一套好的规则,好的准则
    • Unity 好的规则
      • 3.起文件夹的名字时尽量和 GameObject 对应起来
      • MVC 文件结构:先按照业务功能划分,再按照 MVC 来划分
    • 代码是资产
      • 做完每一个项目都积累一些东西
    • QFramework
      • 工具集
        • FSM
        • Singleton&MonoSingleton
        • MsgDispatcher
        • MathUtils
      • 笔者知识积累工具
      • 业务支撑工具集(支撑性)
        • UIManager
        • AssetBundleManager
        • SoundManager
        • ConfigManager

    命名的力量

    Unity 好的规则 2:我们在命名的时候要起一个比较有含义的名字。——刘钢《Unity 架构设计与开发管理》

    在笔者刚毕业的时候,读了《代码大全》这一本书,其中第 11 章的《变量名的力量》反复读了三遍。这一章的内容对笔者之后养成良好的命名习惯产生很大的影响。书中重点讲了如何命名和编码规范的重要性。

    编码规范

    笔者很认同做项目要遵循命名规范这个准则的。但是现实是规范的执行过程中会遇到很多阻碍。比如笔者最开始去网上找了一个编码规范文档。一份文档 50 多页,看都觉得很痛苦,只好放弃。最终经过一段时间探索之后得出了一个结论:编码规范只要解决问题就好,其他的尽量确保容易遵守就好。

    编码规范解决的是什么问题呢?

    1. 减少项目交接时,由于代码风格水土不服所带来的风险。
    2. 当某个项目人力不足时,可以减少加人时所带来的人力浪费(可以让一个人花更少的时间去看懂某个项目的代码)。
    3. 防止项目过了一段时间一些实现自己都看不懂了。

    以上当然要靠一个编码规范是无法完全解决的,除了编码规范之外,还有资源命名规范,项目结构规范等等。
    经过多次因为以上原因的加班之后,深有感触。编码规范是非常有必要做的。

    为自己制定一个编码规范

    在公司,笔者还是最基础的员工,没有什么权利。所以对于定义规范这种事情,在公司想想就好了。不过这并不阻碍笔者为自己制定一个编码规范。于是笔者根据自己的编码习惯,定制了如下的编码规范。

    /****************************************************************************
     * Copyright (c) 2017 liangxieq
     * 
     * https://github.com/liangxiegame/QCSharpStyleGuide
     * 
     * Permission is hereby granted, free of charge, to any person obtaining a copy
     * of this software and associated documentation files (the "Software"), to deal
     * in the Software without restriction, including without limitation the rights
     * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     * copies of the Software, and to permit persons to whom the Software is
     * furnished to do so, subject to the following conditions:
     * 
     * The above copyright notice and this permission notice shall be included in
     * all copies or substantial portions of the Software.
     * 
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     * THE SOFTWARE.
     ****************************************************************************/
     
    
    namespace QFramework.Example 
    {	
    	using UnityEngine;
    	using UnityEngine.UI;
    	using System.Collections;
    	using System.Collections.Generic;
    	
    	/// <summary>
    	/// 展示编码风格
    	/// </summary>
    	public class ProgrammingStyle : MonoBehaviour 
    	{
    		#region Basic App
    		/// <summary>
    		/// 1.private/protected使用m开头+驼峰式
    		/// 2.前缀最好展示所属的Component类型比如Button->Btn
    		/// </summary>
    		[SerializeField] Button mBtnEnterMainPage;
    
    		/// <summary>
    		/// public类型使用首字母大写驼峰式
    		/// </summary>
    		public int LastIndex = 0;
    
    		/// <summary>
    		/// public 类型属性也算public类型变量
    		/// </summary>
    		public int CurSelectIndex 
    		{
    			get { return mCurSelectIndex; }
    		}
    
    		void Start () 
    		{
    			mBtnEnterMainPage = transform.Find ("BtnEnterMainPage").GetComponent<Button>();
    
    			// GameObject命名
    			// 临时变量命名采用首字母小写驼峰式
    			GameObject firstPosGo = transform.Find ("FirstPosGo").gameObject;
    		}
    
    		/// <summary>
    		/// 方法名一律首字母大写驼峰式
    		/// </summary>
    		public void Hide() 
    		{
    			gameObject.SetActive (false);
    		}
    		#endregion
    
    		#region Advanced
    		/*
    		 * GameObject->Go
    		 * Transform->Trans
    		 * Button->Btn
    		 * 
    		 * For->4
    		 * To->2
    		 * Dictionary->Dict
    		 * Number->Num
    		 * Current->Cur
    		 */
    
    		/// <summary>
    		/// 1.Bg肯定是图片
    		/// </summary>
    		[SerializeField] Image mBg;
    
    		/// <summary>
    		/// GameObject->Go
    		/// </summary>
    		[SerializeField] GameObject mDialogGo;
    
    		/// <summary>
    		/// Transfom->Trans
    		/// </summary>
    		[SerializeField] Transform mScrollViewTrans;
    
    		/// <summary>
    		/// Index、Num、Count等肯定是int
    		/// </summary>
    		[SerializeField] int mCurSelectIndex;
    
    		/// <summary>
    		/// RectTransform->RectTrans;
    		/// </summary>
    		[SerializeField] RectTransform mScrollContentRectTrans;
    
    		/// <summary>
    		/// 1.Pos肯定是Vector3、Vector2
    		/// 2.Size肯定是Vector2
    		/// </summary>
    		[SerializeField] Vector3 mCachedPos;
    		[SerializeField] Vector2 mCachedSize;
    
    		/// <summary>
    		/// 后缀s表示是个数组
    		/// </summary>
    		[SerializeField] Vector3[] mCachedPositions;
    
    		/// <summary>
    		/// 1.List后缀
    		/// 2.4->for 表示所属关系可以表示Dict
    		/// 3.Dict后置
    		/// </summary>
    		[SerializeField] List<Vector3> mCachedPosList;
    		[SerializeField] Dictionary<string,Vector3> mPos4ChildName;
    		[SerializeField] Dictionary<string,Vector3> mChildPosDict;
    		#endregion
    	}
    }
    

    规范直接使用代码展示,容易看懂自然而然也就会容易遵循。

    破窗效应

    一幢有少许破窗的建筑为例,如果那些窗不被修理好,可能将会有破坏者破坏更多的窗户。最终他们甚至会闯入建筑内,如果发现无人居住,也许就在那里定居或者纵火。一面墙,如果出现一些涂鸦没有被清洗掉,很快的,墙上就布满了乱七八糟、不堪入目的东西;一条人行道有些许纸屑,不久后就会有更多垃圾,最终人们会视若理所当然地将垃圾顺手丢弃在地上。这个现象,就是犯罪心理学中的破窗效应。

    我们做项目也是一样的。一定要好好写代码,不要让“破窗”在我们的项目中发生,不能让项目有任何变混乱的趋势,保持项目清爽,这可以给我们开发者到来很好的工作体验,也就是所谓的心流体验。

    如何命名?

    在一些命名格式上,可以遵循编码规范就好了。但是如何给一个类/方法/变量/枚举命名呢?

    在问这个问题前,我们来问另外一个问题,那就是程序语言,所谓的语言是给谁看的?一是给计算机或者编译器能看懂。二是给我们人类看的。让计算器或者编译器看懂很容易,只要遵循程序的语法去写就 OK 了。但是如何让人更容易看懂,当然答案也很简单,就是好好命名。关于如何命名,一些笔者至今受用的命名准则这里这里简单介绍下。

    • 使用业务相关的词汇命名而不是计算机相关的词汇

    比如,SaveMgr 中的 Save 是保存,是业务相关的词汇。而 SerializeHelper 中的 Serialize 则是计算机相关的词汇。这条准则在 业务/逻辑/UI 层会有很大的效果。而在 Framework 层或者说底层还是使用计算机相关的词汇比较好。

    • 方法/函数命名用谓语 + 宾语方式命名
      比如 PlayerData.Save,或者 SavePlayerData

    • 类名和方法参数使用名词

    • 表示一个动作状态时通过动词的不同时态进行命名。

    比如 Connecting,Connected,Connect 表示连接的三种状态。

    关于命名和规范就先讲到这里,命名是一门学问,其内容多得可以去写一本书去介绍了。如果想深入学习,建议首先看《代码大全》的第 11 章 《命名的力量》。

    小结

    还记得在前边说的架构的定义嘛?架构是“约定、规则、共识”,而确定各种规范也是准备阶段要做的事情,也是架构的一部分。

    再次起航

    在新的公司度过了一段加班生活,之后加班次数慢慢就减少了。这时候就又有时间去搞点东西了。

    一个视频教程的学习

    首先是当时,在某教育网站上学习了《万能游戏框架》视频教程,笔者从头到尾跟着手敲了一遍。教程里的一个基于模块的消息框架实现得很有意思。这里简单说一下。 QFramework 之前收录的 MsgDispatcher 就是一个全局的字典,字典的 key 是事件名字,而 value 则是 委托 List,所以不管怎么定义消息,它们都是全局的。当消息的规模变大之后,会有很大的性能压力。如图所示:

    全局消息与单例模式一样都是用起来很方便,但是风险很大的设计。

    而 《万能游戏框架》里的消息则是以模块为单位的。比如 UI 模块则只负责 UI 界面相关的消息收发和注册,Audio 模块同理也是。 而跨模块之间则用一个简单的 switch 进行转发。比较出彩的是其中的关于频段的设计。我们都知道 C# 里的 ushort 的最大值是 65536,视频中每个模块的频段长度设为 3000,这样最多可以有 21 个 模块,足够使用了。每个模块可以注册 3000 个消息。如何实现,这里看下代码就明白了。

    public enum MgrId
    {
    	UI = 0 * 3000,
    	Audio = 1 * 3000,
    	...
    }
    
    public enum UIXXEvent
    {
    	Start = (ushort)MgrId.UI,
    	XX,
    	YY,
    	End,
    }
    
    public enum UIYYEvent
    {
    	Start = (ushort)UIXXEvent.End,
    	ZZ,
    	End,
    }
    

    笔者当时看到这里才觉得自己对语言的了解真的是很浅,一个简单的 ushort + 枚举就可以很巧妙地设计出基于模块的消息框架,这种思想非常值得借鉴。笔者马上在 QFramework 中实现了一套类似的消息框架。很简单,一个 QMsgCenter 充当跨模块之间的消息转发。一个 QMgrBehaviour 作为模块的基类,负责收发和注册模块内的消息,一个 QMonoBehaviour 只要一个脚本继承它,就可以发送消息和注册处理消息。而事实上,有了这套消息框架,QFramework 才算是一个真正的 Manager Of Managers 框架。

    初涉工作流

    公司的以为前辈也有一套类似的框架,不过在以上这套消息框架的基础之上,做了 UI 的脚本生成。在此之前笔者都是用 transform.Find 方式来获取感兴趣的 UI 控件的。比如 Button、Image 等等。而前辈的 UI 脚本生成省去了这些工作量。实现方式也是比较容易理解。就是在一个 UI 的 Prefab 上,对于感兴趣的控件挂上一个脚本,比如 UIMark/UIBind。然后从 UI 的 Prefab 的 Root 开始进行深度优先搜索。搜索过程中记录每个标记脚本的路径,之后根据路径生成一行行的 transform.Find(路径)就好了。而这个工具则是节省了制作 UI Prefab 过程中的体力劳动。是对工作流上的优化。QFramework 又收录了一个工具。

    支撑团队协作

    团队协作的一个基础就是将业务模块化。而业务很多时候是在完成大量的 UI 界面。在这里简单分享下笔者的做法。笔者首先会为每个 UI 界面都建立一个测试场景,只要运行 Unity 就可以看到 UI 界面的效果。这样做的目的很简单,就是方便快速修改,并且界面之间互相独立,只要约定好谁来负责哪个模块,就不会造成版本控制冲突。 还有一个建议要做的就是,为每个 UI 界面都提供一个 Init 接口。一些 UI 界面要用的数据,笔者建议是从一开始通过初始化传进去,而不是在 UI 里面去访问某个 Manager。这一点要做到需要花些功夫,不过好处就是 UI 作为一个黑盒,没有上下文,可以传入一些测试数据而不是真实数据就可以看效果并做一些测试了,当项目规模变大时,改一个 UI 界面或者查找一个 bug 都会变得很容易。这样的做法解决了多个问题,一石 N 鸟。

    C# 进阶

    C# 真的是越用越觉得它的强大。QFramework 的进步是离不开 C# 语言的学习的。这里笔者遇到了一个决定 QFramework 未来的语法特性,就是静态 this 扩展。语法细节这里不多说,大家自行百度。学习了这个语法之后,一些本来要靠继承才能实现的 cocos2dx 风格的 API 全部可以用这个语法实现。简直不要太好用!都后来的链式结构编程全都是以这个为基础的。

    QFramework 成为公司的指定框架

    在笔者的坚持下,经过了团队的 Code Review 之后,大家终于统一了使用 QFramework 作为公司的框架。从这时候开始 QFramework 开始飞速发展。

    第一个项目

    第一个项目三个人完成的,架构阶段以笔者之前定的代码规范为基础与团队成员共同完成了项目的代码规范,随后完成了项目结构目录约定等等一系列约定,之后与项目的负责人根据项目需求确定了插件的选择,而框架自然就用 QFramework 了。除了以上这些还做了一件事,就是画了一张不知道是什么的图。

    上边又有排期,又有分工,又有一些技术实现细节,还有各个模块的划分。总之看着很乱,但是它的作用就是让我们三个人很清晰地对项目的各个结构,以及近期的排期等信息,项目的难点也一目了然。做好排期和分析后,就开始进行开发了,最终这个项目不管是时间还是品质上,都完成得很不错。这就是充分(相比之前)做架构的好处。

    竞争对手出现

    在做第一个项目的时候,来了一位大牛,带着一套 MMO 框架。框架好用的工具真的很多。

    其中的 EventSystem(消息系统)和 ResSystem(资源系统)是两大亮点。EventSystem 的 EventId 是用泛型进行注册的。把一个泛型转换为 int 。这个解决了之前笔者注册事件时需要把枚举强转成 ushort 的问题,这样的代码写起来很不愉快,于是笔者把原来 MgrBehaviour 和 QMonoBehaviour 里关于消息注册和转发的代码杀掉,直接换成了 EventSystem 就 OK 了,QMonoBehaviour 和 MgrBehaviour 里的代码变得非常精简。而 ResSystem 使用非常简单和强大。ResSystem 是在 AssetBundleManager 的功能基础之上有抽象出来了 ResLoader。这样做有什么好处呢?

    首先 AssetBundleManager 在哪里加载了什么资源和卸载了资源需要使用人脑进行记忆,项目体量很大时很容易由于忘记卸载资源而造成内存泄露。而 ResLoader 是一个对象,可以每个界面都申请一个 ResLoader 对象。所有在这个界面加载过的资源的信息都会记录到 ResLoader 里,而卸载很简单,只要在 OnDestroy 里直接进行 ResLoader 的卸载就好了,非常方便。但是这时候笔者已经用惯了 AssetBundleManager 的打包方式,所以只收录了 ResSystem 中除打包以外的代码。这里简单提一下,ResLoader 是用对象池实现对象的申请和回收的。而 ResSystem 里的资源积累则是使用引用计数器决定资源的释放的。在这里 QFramework 收录了 EventSystem、ResSystem、引用计数器、对象池,可以说收获颇丰。

    提拔带人

    做完第一个项目之后,被 Leader 提拔,开始带人带团队。在框架和架构进行探索的时间少了很多。QFramework 在这之后边也加了一些库,比如 UniRx,ActionKit 等等。最终就是现在的 ActionKit、UI Kit、Res Kit 为核心的 QFramework 了。ActionKit 专注异步逻辑和状态机,可以很好地完成 GamePlay 需求和异步需求。而 UI Kit 是 UI 的解决方案,里边还是包含着之前的基于模块的消息框架。 Res Kit 则是解决资源管理方案。这里不多说 Action Kit。在这里笔者的经历分享完了。

    总结

    • 架构是“约定、规则、共识”

    • 框架具有约束性和支撑性

    • 好的架构直接就等于你要有一套好的规则,好的准则

    • Unity 好的规则

      1. 使用 C# 而不用 JavaScript
      2. 命名的时候要起一个比较有含义的名字
      3. 起文件夹的名字时尽量和 GameObject 对应起来
    • MVC 文件结构:先按照业务功能划分,再按照 MVC 来划分

    • 代码是资产

    • 做完每一个项目都积累一些东西

    • QFramework
      * 工具集
      * FSM
      * Singleton&MonoSingleton
      * QEventSystem
      * MathUtils
      * 笔者知识积累工具
      * 业务支撑工具集(支撑性)
      * UI Kit
      * UIManager
      * 代码生成
      * MgrBehaviour、MonoBehaivour(约束性)
      * Res Kit
      * AudioManager
      * Action Kit
      * 建议
      1. 为每个 UI 界面都建立一个测试场景。
      2. 为每个 UI 界面都提供一个 Init 接口。
      3. UI 界面的 Init 接口传数据,而不是在 UI 里面去访问某个 Manager Or Instance。

    • 在项目准备的架构活动

      1. 需求/业务整理、收集、分析
      2. 编码规范、项目结构约定、资源命名规范、程序结构约定、模块/MVC 划分、成员分工
      3. 插件购买、造轮子、框架选型

    这里可以得出框架与架构关系的结论,框架可以解决一部分架构问题,使用框架 本身就是一种“约定、规则、共识”。

    直到文章的结尾,QFramework 还是没有收集到关于框架的约束性相关的内容。唯一能扯上点关系的就是基于模块的消息框架这块了。其实像 StrangeIOC、uFrame、PureMVC 等框架可以更容易去讲解约束性相关的内容。Any way 这次就讲到这里吧,我们以后见。

    推荐资料

    1. 《UNITE -Unity项目架构设计与开发管理》
    2. 《架构漫谈》
    3. 《Unity3D手游开发实践》
    4. 《10年感触:架构是什么?——消灭架构!》
    5. 《凉鞋的笔记》

    转载请注明地址:凉鞋的笔记:liangxiegame.com

    更多内容

    • QFramework 地址:https://github.com/liangxiegame/QFramework

    • QQ 交流群:623597263

    • Unity 进阶小班

      • 主要训练内容:
        • 框架搭建训练(第一年)
        • 跟着案例学 Shader(第一年)
        • 副业的孵化(第二年、第三年)
      • 权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro
    • 关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。

    展开全文
  • 小公司一般都把测试部门放在研发部门下面,便于开展工作和节约管理成本;大公司都把测试部门独立出来,建立更专业和更高效的测试团队,更有效的发现问题。 如果开发团队在两百人以上,强烈建议把测试团队和开发团队...

    2.组织架构--工作效率是决定因素。

    测试部门有两种架构,一在研发部内部,二和研发部分开。小公司一般都把测试部门放在研发部门下面,便于开展工作和节约管理成本;大公司都把测试部门独立出来,建立更专业和更高效的测试团队,更有效的发现问题。

    如果开发团队在两百人以上,强烈建议把测试团队和开发团队分开。优缺点如下:

    优点:

    1. 测试,研发,产品形成开发过程中三权分立闭环,能良好形成自驱效果。三者都是开发过程中不可或缺的部分。产品出设计方案和功能需求,开发按照需求进行实现,测试检验需求和实现成果的合理性和完善性。

    2. 相互扶持,相互制衡,相互监督能更快提升产品质量。

    3. 测试独立,能充分暴露问题。而不是在开发部门,还要顾及开发部门lead的喜好,有问题不能报,有问题先内部消化,这样会导致延误重大问题的决策时间。

    4. 能更快形成良好的开发流程,提升开发过程中的质量控制。如设置每个阶段的准入准出标准,不达标这个项目节点不能通过。避免研发内部粉饰问题。

    5. 责权清晰,分工明确。测试和研发在一个部门,测试通常是背锅的,有问题肯定是测试问题,研发毛问题没有;在开发任务紧张的时候,测试可以干开发的部分工作;开发挤占测试时间,测试时间不足是可以通过加班来补的,这是开发内部问题。但却是整个公司和项目大的风险问题。

    6. 对于软件开发公司来说,占公司人员最多的部门就是研发部,如果测试在研发内部,又缺少很好的研发管理和监督流程,必将造成研发部门效率低下,甚至客大欺主的现象。

    缺点:

    1. 测试和开发团队会存在日常工作中bug问题的扯皮推诿

    2. 测试和开发团队配合程度不如在一个团队中那样紧密

    总结:站在公司角度来讲,研发和测试分开还是合并,关键取决于公司规模和工作效率的高低。组织架构不是一成不变的,是随着公司规模或产品的成熟度而进行调整的,调整到工作效率最大化才是最好的组织架构。

    展开全文
  • 什么是力软.NET CORE敏捷开发框架  力软.NET CORE敏捷开发框架是一个高效率、高颜值、易上手的跨平台全开源快速开发平台。    高效率  框架内置企业信息化系统中常用的基础功能组件和高效的可视化开发工具,...

    什么是力软.NET CORE敏捷开发框架

    力软.NET CORE敏捷开发框架是一个高效率、高颜值、易上手的跨平台全开源快速开发平台。

    高效率

    框架内置企业信息化系统中常用的基础功能组件和高效的可视化开发工具,包括:向导式智能开发组件、即时通讯组件、APP开发组件、微信组件、工作流引擎、通用权限、专业表单、BI大屏等一系列组件,能实现绝大数功能的低代码开发。

    高颜值

    具有独立研发的UI界面,前端采用当前主流的VUE框架,内置多套风格UI模板,如:简约、炫酷、经典等,可根据需要进行选择,为您的产品提供颜值保障。

    全开源

    产品拥有稳定的架构、规范的编码,购买后提供全部源代码,一次授权终身使用。同时,基于框架所开发出的产品,无需再次授权即可直接销售。

    力软开发框架能做什么

    框架是一个拓展性很强的搭建平台,平台集合了多种常用功能模块,可快速实现复杂的业务场景。

    使用框架进行开发,其中80%敲代码的事情已经全部做好了,企业只需要专注于个性化业务逻辑,用力软所提供的组件像拼积木一样就能搭建起任何自己所需的功能。像是一个采购入库单,只需要做好表单,再利用工作流将各种表单集成统合、数据互通,就可以完成了。

    利用这种简单的开发方式,可以便捷的开发出ERP、OA、CRM、HRM、BI、MIS、SAAS、移动app、微信公众号、微信小程序、电商系统后台等各类企业信息系统。

    全新的开发模式,省心到家!

    力软开发框架有哪些优势

    *提高开发效率

    已集成大量业务模板和公共组件,开发人员只需根据开发向导进行设置就可快速完成开发工作,比起传统开发至少要节约80%工作量,能大大提升开发效率。

    如果需要二次开发,可以直接修改生成的源代码。

    *保证软件质量

    拥有规范的编码、专业的架构、稳定高效的底层。基于力软框架做开发,可以大幅度地提升软件质量,提升软件稳定性。

    *降低开发成本

    相较于定制开发和从基础自主搭建,采用力软开发方案仅需一套框架的成本,并且对框架使用人员的技术没有硬性要求,新手也可快速上手。

    *提升用户满意

    UI作为一款产品的“脸面”,势必影响产品的第一直观印象。框架已经为开发人员提供了多套美观简洁的UI,使开发人员有更多的精力在功能开发上。配合框架良好的编码规范,开发出的产品用户体验友好度必定大大提升,用户满意度也会大大提高。

    更多优势

    *采用 SOA 架构,系统核心功能均可以通过服务的方式提供给外部调用,方便系统与 ERP 系统及周边系统、硬件设备接口交互能力,解决企业信息化孤岛问题。

    *系统前后台通 Ajax 交互,这样使得前台不必依赖于后台的开发语言,日后要重构成php、JSP 后台的话,UI 层完全不用动。

    *开发框架完美支持 Oracle、SQL Server、MYSQL 数据库,并且还支持在框架中同时操作多数据库。

    *提供自定义报表功能,可通过编写SQL等作为数据来源进行构建不同类型的图形报表。

    *提供工作流引擎组件,开发者可以直接在开发框架中使用自定义表单来承载业务数据进行流程审批;也可以编写代码完成复杂表单然后调用流程引擎服务进行流程审批。

    *强大的权限管理组件,基于框架开发出功能后就可以直接给被授权角色授予该功能的权限。

    *提供 SSO(单点登陆)服务,方便多系统统一登陆管理。

    *框架支持 Websocket,消息实时达。

    *提供微信企业号开发组件功能。

    *提供 APP 开发功能。

    *框架支持 redis 缓存集群。

    *原班开发人员售后支持。

    适用人群

    中小型软件开发公司

    非软件公司的软件部门

    需信息化建设的企业

    ...

    框架不限制使用人数,适用性强,开放度高,可根据需要无限拓展。

    开发人员只需掌握一定的编程基础,思路清晰,经过短时间培训,就能够快速地上手,完全不会有使用上的困扰。

    力软.NET CORE敏捷开发框架主要功能运用

    *代码生成器

    框架内置的代码生成器,在原有代码生成器的基础上进行了升级,可根据需要分别生成前后端代码。

    使用代码生成器,只需点击下一步,代码便可以自动生成,能有效减轻代码编写工作量。同时,生成的代码更规范,可以减少bug,在新手较多的团队里,规范的代码编写及结构,能够引导新手遵守规范,现有的代码也能供新手仿照编写,减少错误。

    *工作流引擎

    工作流引擎是工作流管理系统的核心部分,主要提供了对工作流定义的解析以及流程流转的支持。

    力软.NET CORE工作流引擎同样在原产品流程的基础上进行了升级,功能更强,操作更便捷。全程可视化开发,节点设置、逻辑搭建一气呵成,不仅提供日常为公和关键业务流程智能化管理,而且还能根据公司的特殊实际要求轻松方便地随时定制各种流程。

    *BI数据大屏

    商业智能(Business Intelligence,简称:BI),是用现代数据仓库技术、线上分析处理技术、数据挖掘和数据展现技术进行数据分析以实现商业价值。

    力软BI大屏全程可视化设计,内置了大量的模板组件,可以较为快速的开发出符合企业自身的BI系统。

    *拖拽式表单

    框架的表单设计功能,只需拖拽就能轻松构建多种类型的实用表单。

    *自定义报表

    提供有基础报表和专业报表,如:柱形图、折线图、饼状图等,并且数据描述清晰易懂,专业报表内容丰富。

    *权限管理

    框架核心功能之一,独立的权限管理体系,多套系统可以统一管理权限,注重权限安全, 拒绝一切非法访问。

    *多数据库连接

    支持多个种类多个版本的数据库(Oracle、SQLserver、MySQL的多个版本),轻松切换、无缝衔接您的数据库。

    *移动端开发

    移动端同步可视化开发,操作简单,IOS和安卓均可使用。

    还能帮您更多...

    主流技术的更新迭代

    软件行业日新月异,新的技术层出不穷,让人难以跟上脚步,力软开发框架为您提供长久的更新服务,让您的产品、系统永不落后。

    人员流失问题

    用力软开发框架不需要担心核心技术人员的流失,高品质的技术服务,能够为您的开发保驾护航。

    信息化建设中的被动问题

    信息化建设中很多不同行业的不同特点让开发人员难以应对,而力软敏捷开发框架出色通用性和扩展性,能让您轻松掌握信息化建设中主动权。

    需求多变问题

    多变的需求,能够使得整体设计没有考虑周全的项目的开发效率大幅降低,使得项目延期,而力软开发框架全面架构设计能自如应对多变需求。

    注:JAVA产品功能与.NET CORE产品功能基本一致,如需了解更多详情,请至learun.cn进行体验。

    白码王子.

    展开全文
  • RDIFramework.NET,基于全新.NET Framework与.NET Core的快速信息化系统敏捷开发、整合框架,给用户和开发者最佳的.Net框架部署方案。...我们始终本着保持饥渴的专注,追求最佳的品质,为用户提供全源码、..
  • 游戏数据分析框架

    万次阅读 多人点赞 2017-10-09 14:43:57
    游戏数据分析框架 游戏数据分析框架 用户 用户分析的维度 用户的统计 平台 时间 渠道 新增用户 游戏硬技术 新增用户的分析 活跃用户 AARRR模型 新老用户和留存 活跃用户数量分析 游戏时长分析 用户流失 生命...
  •  Android自动化测试框架 Cafe Cafe 测试框架是一款来自百度QA部门的具有开创性意义的Android平台的自动化测试框架框架覆盖了Android自动化测试的各种需求。框架致力于实现跨进程测试、快速测试、深度测试,解决了...
  • 本文提出交通规划体系技术框架搭建需遵循以下几个原则:一是与国土空间规划体系相对应,分层次、分阶段的组织编制工作;二是突出事权职能分工,体现谁组织实施,谁编制规划的原则;三是要体现规划上下传导和横向...
  • 首先,做这套框架的意义,为了解决一系列问题: 1、开发时每人代码不统一,有各自喜好,用各种方式创建、描述对象。修改他人代码时比较吃力,需要提供一套调用api规范。 2、一些app都需要的功能反复拷贝,使用第三方...
  • 物联网技术可有效搜集各行各业的数据,提高社会生产部门的数字化程度,助推非结构化数据向结构化数据的升级,从而利用数据实现高效管 理、效率提升,是实现产业数字化的关键环节,是数字经济的重要支撑。...
  •  类似于制造业的工厂观点,开辟的软件产品能实时地放在主动化工厂中进行验证和测试,确保产品的品质。  7*24小时  包含两部分观点: 测试环境的7*24小时使用和主动化的7*24小时执行。  测试环境的7*24小时...
  • 百度开源的 71 个项目,太牛逼了!

    千次阅读 2020-05-31 11:30:00
    7、Android自动化测试框架 Cafe Cafe 测试框架是一款来自百度QA部门的具有开创性意义的Android平台的自动化测试框架框架覆盖了Android自动化测试的各种需求。 框架致力于实现跨进程测试、快速测试、深度测试,...
  • 因此,操作风险管理不仅仅是风险管理部门和内部审计部门的事情。 操作风险案例 线下门店经理偶然获得了后台管理权限,可以直接看到用户基本信息及借款订单明细数据,手动复制粘贴上千条记录,倒卖给数据公司,北京...
  • 知识工程2.0的蓝图与框架 一、企业知识的本质谈及知识工程,我们首先要回答的一个问题是:什么是知识?在很多人的意识中,知识是一个既普通又神秘的概念。我们每天都在说“知识”这两个字,“知识”一...
  • 第四类:二八法则不明显,但高毛利润,这类行业不是特别适合搭建会员体系,不讨论。 现实生活中,涉及衣食住行的消费行为,竞争相对激烈,毛利润相对低,付费会员在超市、电商、外卖、视频等领域基本成为了标配。而...
  • 作者:买晓森当前行业转型升级,房地产运营管理的重要性凸显。...有些企业计划管理很薄弱,尤其是一些小型房企和国有企业,甚至没有计划管理部门,计划管理由综合部门代为管理。这部分企业没有目标管理的概念,...
  • 大数据平台是从各种类型的、漫无边际的数据中,快速获得有价值信息的处理方法或框架。大数据中的“大”不是大数据的唯一指标,而是更强调数据的类型多样、处理的速度和获取价值的能力。分析人士表示,大数据对传统...
  • Jquery的介绍、Jquery的基本用法、Jquery选择器、选择集过滤、选择集转移、获取和设置元素内容、获取和设置元素属性、Jquery事件、事件代理、Json、ajax 主讲内容10Mini-Web 服务器 使用Mini-Web框架可以轻松搭建一...
  • 作者:小傅哥 ... 沉淀、分享、成长,让自己和他人都能有所收获!???? ...一直以来都有小伙伴问我什么时候出一些面试系列的文章...所以我想从全局培养人才的角度出发,也算是技术成长的经历中提取学习框架,帮助小伙伴们提升
  • 前言 ACM生涯在带着些许遗憾中结束了。春招的时候找了一份游戏开发的工作,现在学习cocos2dx中。 从ACM竞赛到实际项目开发的学习,第一感觉就是不适应,虽然感觉实际项目的确要比ACM... 1)Cocos2d-x环境搭建,主...
  • DevOps 在公司项目中的实践落地

    万次阅读 2017-10-17 17:47:46
    部门之间天然的形成了沟通障碍墙,相互之间主要以邮件和会议的形式沟通,效率低下、需求变更困难、很难快速响应市场变化和持续交付高品质的产品。 那么如何调整组织结构,建立一个Scrum团队呢?(什么是 ...
  • 小编说:  产品思维有什么用?“在生活中,如果拥有产品思维,你会发现,很多让你感到迷茫的事情,都会更加有思路。...很多产品经理都有从0-1做产品的经验,做一个从0开始的产品,需要先去搭建产品框架...
  • 因此有必要搭建一个有效压测系统,提供安全、高效、真实的线上全链路压测服务,为线上服务保驾护航。 关于全链路压测的建设,业界已经有了非常多文章,但是涉及到具体的技术实现方面,却很少介绍。本文想从全链路...
  • 百度开源的71款项目

    千次阅读 2017-08-18 13:52:06
    Cafe 测试框架是一款来自百度QA部门的具有开创性意义的Android平台的自动化测试框架框架覆盖了Android自动化测试的各种需求。框架致力于实现跨进程测试、快速测试、深度测试,解决了Android自动化测试中的诸多难题...
  • 大数据平台是从各种类型的、漫无边际的数据中,快速获得有价值信息的处理方法或框架。大数据中的“大”不是大数据的唯一指标,而是更强调数据的类型多样、处理的速度和获取价值的能力。分析人士表示,大数据对传统...
  • 软件测试基础知识

    千次阅读 多人点赞 2019-11-07 18:48:39
    :深入了解客户需求,根据用户需要、个人经验及需求编写规范制定出《需求文档》, 需求文档需要经过评审,充分获取软件开发的范围、边界等具体问题的确认,且经相关部门评审合格即付诸后续工作 系统设计 :需求...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,304
精华内容 521
关键字:

搭建品质部门框架