精华内容
下载资源
问答
  • 遭遇 bug 的时候,理性的程序员会说:这个 bug 能复现吗? 自负型:这不可能,在我这是好好的。...无论你是哪种类型的程序员,遭遇 bug,内心都是崩溃的,尤其是产品经理或测试人员在使用或测试

    遭遇 bug 的时候,理性的程序员会说:这个 bug 能复现吗?

    自负型:这不可能,在我这是好好的。
    经验型:不应该,以前怎么没问题?
    幻想型:可能是数据有问题。
    无辜型:我好几个星期都没碰这块代码了!
    乐观型:只需要改一行代码,不会影响其它程序的。
    实践型:你重启一下服务试试。

    无论你是哪种类型的程序员,遭遇 bug,内心都是崩溃的,尤其是产品经理或测试人员在使用或测试产品的过程中抓到你的一个 bug 之后那种如获至宝的表情和欢呼声,会让我们的心情久久不能平静。于情于理,防患于未然,减少编程中的 bug,对产品和程序员,都是最好的结果。

    能不能一次编写出没有 bug 的程序呢?一般来说,并不能,除非你写一辈子 Hello World。我见过一些天才的程序员,他们差不多能做到这一点。接到任务之后,思考,冥想,在笔记本上画出数据结构或某个算法片段,腹稿打的差不多了就开 始编程,用 Vim、Emacs 或 IDE 工具,大部分时候能够一气呵成,然后构建代码,构造测试数据,运行程序,在反复调试中修复几个编程过程中没有考虑到的问题,就可以提交到代码库了。他们的 代码交给测试和其他开发者,少有人能挑出 bug,因为他们对代码有敏锐的感觉,能够在别人忽略的地方发现代码的坏味道,并给出巧妙而优雅的解决方案。他们是天生的代码创造者,这样的人往往效率高 而且少有错误,以至于会被一些平庸的团队忽略,因为技术领导总是会下意识的去关注那些最容易出事的环节,但这些人才是团队真正的脊梁,不是那些四处救火 者。如果你拥有这样的程序员,就算捡到宝贝了,要好好珍惜。

    我不是天才的程序员,但在年轻时大量产出代码的时候,差不多也能做到类似的效果。没什么好的办法,只能下笨功夫,我会在编码之前尽可能把所有的可能 性都想清楚,然后认真做好设计。我常常在工作时间完成代码的编写,下班后带着笔记本回家逐行 Review 自己的代码,对着设计图检查是否处理了各种异常和边界条件,并先于测试人员对自己的代码进行白盒测试和黑盒测试。另外,在编程方面我奉行不要在同一个地方 摔倒两次的原则,每次自己程序出现的 bug 案例,我都会记录到 bug 库里,检查代码的时候逐一对照,确保不会犯重复的错误。

    可能年轻的时候自尊心比较强,我难以忍受自己的程序被别人找出 bug,于是偷偷花费了两倍的时间来保证代码的质量,以至于团队的人认为我一次就能编写出高质量的代码。现在看来,我当时是个错觉制造者。

    所以,减少 bug 的第一步,是提升自己的程序员素养,努力不给自己和别人找麻烦。

    另外,团队协作也很重要,前期的技术方案和设计评审、代码审查,对减少一些重大的错误和弱智的 bug 都非常有好处。

    与几个有经验的程序员一起评审一个技术方案,常常会发现一些重大的问题,比如为什么用缓存,为什么做持久化,高并发下怎么应对,这部分设计支持线程 重入吗,这个循环为什么设置成10分钟,这个超时设置为什么是60秒,传输协议加密了吗,等等。很多方案可能会仅限于解决当前的问题,但有经验的程序员却 能透过时间的重重迷雾,发现这个方案在未来某个时间点可能爆发的问题。这就是评审的力量。

    技术方案和设计评审一般是先于代码的,开始编写代码了,Code Review(代码审查)就可以提上议事日程了。国内很多团队的技术人员内心是抵触代码审查的,他们常常想,在这个国家我们已经被审查的够多了,就不要再自己审查自己了,然后很多 bug 就产生了。

    我和 Google、Facebook、Twitter、Airbnb 的中国工程师讨论过 Code Review,他们觉得没有代码审查是不可思议的。在这些公司的研发流程里,Code Review 是必不可少的一个环节,只有别人帮你做了 Code Review 并在代码上「打了戳」,你的代码才能进入 Code Base。在 Facebook,如果你 Review 了别人的代码,如果那个人休假了,你就要接手他的代码,出了任何问题都要唯你是问。

    事实上,Code Review 才是真正的白盒测试,没有经过代码审查,仅凭测试很难保证代码质量。测试通过了但没有经过代码审查的代码仍然会出各种问题,这样的案例比比皆是。只有当另 外一个人读了你的代码,并且表明能看懂时,这些代码才有真正有了鲜活的意义。代码审查的意义就是,在你的代码库合进代码库之前,至少有一个人读过你的代 码。

    很多人在做代码审查之前会调研大量的代码审查工具,就像一个人在跑步之前,要先准备好跑鞋、袜子、压缩裤、压缩上衣、鼻贴、眼镜、口罩、导汗带、魔术头巾、各种手表、冷却喷雾、肌内效贴布……然后一个月过去了,你问他跑了几次,他会很扭捏的告诉你,髌骨带还没有到!

    没有工具一样可以做代码审查,你只需要偏转身体,在另一个程序员不忙的时候拍拍他的肩膀说,「来,看看我的代码,你能看懂吗?我准备把它们提交到代码库里」。然后阐述你的思路,倾听他的建议,并根据这次讨论的结果决定,是修改一下,还是继续提交到代码库。

    不要小看这短短的20分钟,它可能会帮你避免的一些隐藏的和弱智的 bug。

    很多团队都是因为代码审查过程或工具过于复杂放弃了Code Review,典型的因噎废食,其实使用 less、diff 和 git 等工具,基本上就可以做一次完整的代码审查了。如果你过于依赖工具和过程,那说明你并没有抓住问题的核心。

    写了这么多,如何减少编程中的 bug 呢?不难,也不容易。对内,努力提高自己的程序员素养,不去浪费自己和别人的时间。对外,重视团队协作,进行方案评审和代码审查。做到这两点,你会发现,代码中的 bug 会越来越少的。

    没有 bug 的代码,才是好代码!


    展开全文
  • 培训一周心得体会之如何提高代码质量 (这封邮件的目的是...一切源于我们怎么才能做好一个产品。1.做出来,功能完善;2.良好的用户体验,超越用户预期;3.在需求不段变更的前提下可以长期稳定使用;第一二点或...
     培训一周心得体会之如何提高代码质量

    (写这封邮件的目的是希望大家有时间去听教练的课。大家有时间就去听听。不去听感觉真是亏大了。

    教练们确实带给我们很多切实可行的东西。

    提高代码质量不是凭感觉,凭对自己代码盲目到自信。应该是有切实可行到手段的。

    一切源于我们怎么才能做好一个产品。
    1.做出来,功能完善;
    2.良好的用户体验,超越用户预期;
    3.在需求不段变更的前提下可以长期稳定使用;
    第一二点或许我们做到了,但是第三点?
    为了提高代码质量,我们要求UT覆盖率,做codereview,但却并未实际解决多少问题。可能我们写的系统用了不到两年又成老系统了。还需要重新写一个。

    大师与码农之前的区别可能就是在这一点上了。不管你的需求怎么变化大师写的东西可能能用十年甚至更久,而且基本不会出现BUG.

    提高代码质量之TDD
    (如何做TDD 教练有个课是带我们做game of life的编码 我认为这是程序员必修课。下面的UT和重构都是跟TDD走的不是拿出来单做,单做意义不大)
    TDD就是来解决第三个问题的。
    我对TDD的理解
    TDD关注的是代码和方法的正确性而不是最终测试结果的正确性。在不停的重构中写出最简单易懂高内聚低耦合的代码,并且保证这些方法都没有问题。但是这些方法组合起来成为一个系统功能还是需要集成测试,功能测试等各种测试。因为业务系统有太多的数据了。
    所以TDD是用来保证代码质量,可以让系统长期稳定使用。

    TDD具体是怎么做到的呢?
    TDD利器之UT
    带给我们的好处,为什么可以提高我们到代码质量。
    1.方法的功能我们都应该用单元测试来保证它的正确性。
    貌似这些我们做到了。但我感觉离这一步还很远。 我们的UT可能覆盖来所有代码,但test case不一定都覆盖到了。那别人在修改你代码或者添加新功能的时候很可能就会改掉你方法原本到功能而你到UT照样正常运行。覆盖率应该首先考虑testcase的覆盖testcase覆盖到了代码肯定也被覆盖掉了。
    2、UT是代码最好到文档说明
    没有比UT更好到文档说明了。UT的代码就是设计说明文档。
    3、代码可测试,小方法。各自testcase 让我们从不同到角度保证方法的完整性。

    UT 必然是与重构结合在一起的。没有重构的UT价值不大。
    TDD利器之重构
    重构的目的:
    1.功能的完整性。
    这个没必要说什么吧。
    2.应对变化
    为什么我们到老系统不能用了?是因为我们无法更好到面对现在的变化。TDD的时候就应该做好重构,重构的时候就应该尽可能考虑如何应对变化。我们有各种设计原则各种设计模式帮助我们去做好这件事情。
    但我们曾经一直对这些原则设计模式没那么感冒的原因可能是:
    a、框架限制的太死,我们只是在框架下机械的“板砖”;
    b、理解不够深刻;
    c、编码习惯有问题。
         如果我们真的按照这些已经比较成熟的思想去重构,去写代码你可能会发现我们的代码就是设计
    程序设计应该是一门艺术,不是“搬砖”。
    3.容易阅读
      代码即文档。如果一个功能不能很好的被其他人阅读也应该是被重构的。代码就是应该是文档,当别人读到你的代码到时候就应该知道他是干嘛到而不需要查资料或者问别人。即使只是重构一个名字也是非常有价值的。教练提倡用可以说明功能的可能比较长的名字。比如InitRandomAllNeededParamsForAllTests();
      要写小方法(3到10行)。小方法最容易阅读。其实真正重构好到代码肯定是小方法,在此说略显多余。
      如何做到容易阅读的方法还有很多很多。

    提高代码质量之Pair
    开发与QA结对
    开发与开发之间的pair就不说了,优劣很明显。
    pair是互相沟通,彼此启发,完善功能的过程,不是一个人看另一个人编程这么简单。
     
    我们可以尝试下开发与QA的pair我们可以尝试下。
    为什么开发要与QA  pair???
    我们遇到的问题:
    曾经喻老师多次要求我们自己测试好了之后再提交给QA测试,避免反复修改测试到情况。QA是团队的成员,但总感觉QA一直自己在测试。QA们你们感觉空虚寂寞冷吗?哈哈
    曾经的开发方式
    1.开发领开发task;QA领测试task;
    2.开发编码实现task;QA编写testcase;
    3.开发完成编码提交;QA验证;
    4.开发领下一个开发task;
    QA验证有问题 交给开发 开发返回2重新开始。QA验证没有问题。

    问题就出在第四步。
    在第四步 QA发现程序有BUG 再提交给开发 开发重新执行第二步 第三步 。QA 验证,如果再有BUG… … QA就这样陷入了不停的给开发找BUG上。逐渐QA对开发失去信任… ….
    好吧 问题我们已经找到了。那怎么解决这个问题呢?曾经我们的要求是开发必须保证自己编写的代码质量,自己测试没问题了再提交。但实际情况总是事与愿违。可能因为任务太多可能是太依赖QA。反复测试的情况并没有解决。
    我们可以考虑一开始开发就和QA领写testcase的任务。
    那这个过程就是这样子了:
    1.     开发QA 领写testcase的任务,进行pair;
    2.     开发 QA pair 写testcase;
    3.     开发根据testcase 考虑其他需要的testcase 开始TDD
    4.     开发结束开发 交给QA??QA可以问 我们写的testcase都通过了吗?
    这个过程我们发现 QA从给开发找BUG的苦难中解放出来了。QA可以专注做自己该做的事情了。比如自动化测试。
     
    提高代码质量之自动化测试
    待写......

     

    转载于:https://www.cnblogs.com/zhangxinyu/archive/2013/05/05/3061291.html

    展开全文
  • 使用飞冰+dva快速构建一个后台系统

    千次阅读 2018-11-17 12:39:36
    最近我们接到这样一个需求,要一个后台管理系统,时间很急,产品也只是给出了原型稿,把功能陈列了一下,给出的要求就是先注重功能,用起来再去考虑美化。但是作为前端,我们怎么能就这样满足呢,也是前一阵刚刚...

    使用飞冰+dva快速构建一个后台系统

    写在前面

    最近我们接到这样一个需求,要写一个后台管理系统,时间很急,产品也只是给出了原型稿,把功能陈列了一下,给出的要求就是先注重功能,用起来再去考虑美化。但是作为前端,我们怎么能就这样满足呢,也是前一阵刚刚了解到了飞冰,于是大家一起商量了一下决定采用飞冰来搭建这套系统。这篇也就是当作记录这段时间使用飞冰的一些心得和遇到的一些坑。

    介绍一下

    先介绍一下飞冰,先从先上官网文档上提出几个关键词,阿里开源快速搭建提高开发效率丰富的物料体系,其目的就是快速搭建起一个面向中后台的管理系统,其中丰富的模板及区块可以省去开发者大量的时间,将精力主要集中于逻辑层。然后是dva,基于redux和redux-saga的数据流方案,本片文章不会对dva进行过多的介绍,不过我还是很推荐大家去学习一下dva的,接下来,跟我一步一步的快速搭建起来一个管理系统。

    iceworks

    iceworks是ice推出的辅助开发者快速开发中后台前端应用的GUI软件,下载地址。 你可以通过这个GUI软件建立你的项目,修改、增加页面,打包项目。

    新建项目

    新建项目,首先第一步是选择模板,我们可以看到飞冰现在为我们提供了近50个模板,其中包括飞冰(React),小程序,Vue,Angular项目模板,现在先选择一个模板,这里我选择的是ICE Application Management这套模板。好的,模板选择好了之后,点击使用该模板,然后就可以看到我们的项目在快速的安装当中了。

    安装完成之后,点击启动调试服务,启动成功后,在本地4444端口,就可以访问到我们的这个项目了。

    引入dva

    接下来,先不去讨论目录结构,我们开始引入dva。

    • 安装dva 直接在iceworks中点击添加依赖即可。
    • 启动dva 将src文件夹中的index.js修改成这样。
    import Dva from 'dva';
    // 载入默认全局样式 normalize 、.clearfix 和一些 mixin 方法等
    import '@icedesign/base/reset.scss';
    import router from './router';
    
    // 创建dva实例
    const app = new Dva();
    
    // 引入路由
    app.router(router);
    
    // 启动项目
    app.start('#ice-container');
    
    复制代码

    然后router.js文件也需要做一点点修改

    // 引入位置修改
    import { HashRouter as Router, Switch, Route } from 'dva/router';
    
    // 将默认导出修改
    export default ({ history }) => <Router history={history}>{routeChildren}</Router>;
    复制代码

    这样我们已经将dva成功引入了,这是第一步,然后就是引入model和Container Component。 新建models文件夹,然后在里面写入dva的model文件,具体model怎么定义可以看这里。 然后在我们需要的组件中对应的index.js中通过dva的connect连接model。

    新增页面

    新增页面的时候我们需要做的事情就很简单了

    • 点击新建页面,选择需要的区块。比如一个简单的可过滤的列表页。
    • 选择好区块后,我们可以先预览一下效果。确定后就可以点击生成页面了。
    • 然后在models中写入对应dva的model。

    mock数据

    开发中我们免不了要mock数据,飞冰已经为我们提供了完整的mock方案。

    • 项目根目录下面创建mock/index.js文件。
    • 怎么写mock数据
    // mock/index.js
    const foo = require('./foo.json');
    const bar = require('./bar');
    
    module.exports = {
      // 同时支持 GET 和 POST
      '/api/users/1': foo,
      '/api/foo/bar': bar(),
    
      // 支持标准 HTTP
      'GET /api/users': { users: [1, 2] },
      'DELETE /api/users': { users: [1, 2] },
    
      // 支持自定义函数,API 参考 express4
      'POST /api/users/create': (req, res) => {
        res.end('OK');
      },
    
      // 支持参数
      'POST /api/users/:id': (req, res) => {
        const { id } = req.params;
        res.send({ id: id });
      },
    };
    复制代码

    配置导航及主题颜色

    • 配置导航可以在menuConfig.js文件中进行修改
    • 主题颜色在package.json中的themeConfig中进行修改

    目录结构

    所以我们整体的目录结构是这样的。

    | -- components         头部及导航栏组件
    | -- layout             布局组件及公用样式写入这里
    | -- pages             
        | -- Home 
            | -- components 负责展示的区块组件文件
            | -- Home.jsx
            | -- index.js   我们可以选择在这里来写入connect
    | -- models             
        | -- common.js      公用的model,例如各种枚举数据,通用数据
        | -- userInfo.js    各自的model
    | -- services           api接口
    | -- utils              工具方法
    | -- index.js           入口文件
    | -- menuConfig.js      顶部及侧部导航栏配置
    | -- router.jsx         导出路由组件
    | -- routerConfig.js    路由配置
    复制代码

    表单

    表单类组件推荐使用@icedesign/base中的Form及Field,这里跟官网推荐的完全相反,原因是我发现用官方推荐的formBinder的话,获取数据真的难,而form和field的组合更加简单、易用。

    最后

    这篇文章对于飞冰的介绍没有太多深入,只是简单介绍了一下怎么使用,算是一篇推荐软文???? 飞冰的 我觉得如果大家如果遇到这样的项目,不妨试用一下飞冰,你可以产品和UI来选择页面、区块,甚至可以让他自己把页面搭起来,然后我们来完成功能就好了,这样岂不美哉?好了,就这样。?

    展开全文
  • 对于一个入门DBA 来说,有两样东西对进阶比较关键:一是理解设计者是怎么想的,二是理解使用者环境的复杂性。两者都需要经验的积累,需要勤奋。    集体创作:小团体的自组织带来多维度的启发  在技术学习上,...
  • 第三,实践类的操作系统书籍还是太少了,以至于你要想看看别人是怎么做的,除了读以《操作系统:设计与实现》为代表的极少数书籍之外,就是一头扎进源代码中,而结果有时相当令人气馁。我自己也气馁过,所以我在第二...
  • 第三,实践类的操作系统书籍还是太少了,以至于你要想看看别人是怎么做的,除了读以《操作系统:设计与实现》为代表的极少数书籍之外,就是一头扎进源代码中,而结果有时相当令人气馁。我自己也气馁过,所以我在第二...
  • 还记得您是怎么学习使用,有没有记录下您的心得体会?也许您过大段的学习笔记,也许您调试某个功能成功欣喜不已,也许您成功开发了自己的原型产品,也许您为了弄清其中奥秘而将它大卸八块......现在爱板网举行经验...
    作为一名电子工程师您一定接触过各种各样的开发板,您也一定买过不少新奇的电子产品?还记得您是怎么学习使用,有没有记录下您的心得体会?也许您写过大段的学习笔记,也许您调试某个功能成功欣喜不已,也许您成功开发了自己的原型产品,也许您为了弄清其中奥秘而将它大卸八块......现在爱板网举行经验分享征文活动,各位工程师和电子发烧友,赶快秀出您的宝贝,分享您的心得,还有机会赢得酷炫奖品!此外,您所投稿的文章将会在爱板网主站展示,心动不如行动,打开邮箱,赶快给我们投稿吧!

    活动时间2014623~2014925

    征文要求
    • 必须为投稿者原创,文章尽量图文并茂;
    • 题材:关于开发板或电子产品的评测和拆解文章,
      • 开发板评测、使用心得、学习笔记、项目开发过程、连载教程等;
      • 电子产品的评测、拆解文章等;
    • 内容:字数以1000字左右,不超过2000字为宜,文章中配图至少3张;若是拆解文章,文字和图片可适当放宽范围;
    • 作者,希望你能附上简单的自我介绍及照片,真名、网名、笔名,皆可;我们会在每篇文章最后,附上文章作者,让网友更好的认识您。若您有隐私方面的顾虑不便公开,也请告之。
    • 投稿方式:将word版原创文章和原始图片打包发送至投稿邮箱yuying@eefocus.com,邮件主题:【征文投稿】+文章名。


    评选规则
    综合奖----最佳文章5名,按文章的浏览数、评论数与点赞数综合加权评选排名;
    单项奖----最多浏览、最多评论、最多点赞文章各5名,按文章的浏览数、评论数与点赞数分别为标准评选排名;

    奖品设置



    展开全文
  • 文章目录明确产品需求总流程关于爬虫框架关于编码方式的坑如何实现搜索功能如何解析小说关于解析小说的第二种方式如何实现章节并发解析,失败无限重试关于并发小说内容怎么保存关于小说保存格式Android开发心得庞大...
  • 笔杆网试用---感官体验篇一

    千次阅读 2016-08-05 11:25:48
    上个月发现学校图书馆内的一款新的试用产品,看着名字挺动听,叫一站式在线写作平台,在学校窝着太闲,就决定试用一段时间,用了一个月,图书馆老师让我干脆使用指南,发到图书馆主页分享我的心得体会。...
  • 一篇软文好看不好看,首先我们看的就是标题,标题有没有吸引力,能不能抓住读者的眼球至关重要,特别是在互联网上,没有吸引力的标题就没有点击率,软文标题怎么写是非常重要的一个环节。下面是作者总结自身在撰写...
  • asp.net知识库

    2015-06-18 08:45:45
    .Net 中IE使用WinForm控件的使用心得。 动态加载用户控件的组件!(终结MasterPages技术) 在ASP.NET 1.1下实现模板化站点的新思路 在ASP.Net中两种利用CSS实现多界面的方法 用于弹出ModalDialog进行数据选择的控件 ...
  • 二十三种设计模式【PDF版】

    热门讨论 2011-05-30 14:13:49
    为能和大家能共同探讨"设计模式",我将自己在学习中的心得写下来,只是想帮助更多人更容易理解 GoF 的《设计模式》。由 于原著都是以C++为例, 以Java为例的设计模式基本又都以图形应用为例,而我们更关心Java在中间件等...
  • 但是DBA要求的是稳定压倒一切,DBA必须去适应自己所使用产品,而不能期待产品去适应自己,更没有机会去改变产品,因此了解这个产品的工作原理是非常必要的。  现在网络发达,遇到问题时,有论坛、BBS各种渠道...
  • 软件测试经典面试题 (超实用)

    热门讨论 2012-02-16 13:48:08
    109、怎么才能够全面的测试到每一个点 测试的全面性主要需要在设计测试计划的时候考虑,从测试策略,产品需求等等多个角度考虑从而定义全部的测试点。 27 110、谈谈软件测试技术,以及如何提高 27 111、谈谈软件测试...
  •  笔者在这本书的时候,翻看了很多当前国内数据库方面的书籍,发现性能优化的书并不多,特别是从工作经验和思路上来讨论性能方面的书,更是少之又少,这些因素让笔者思考要这样一本书,这也算是这本书的一个...
  • 给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...
  • 对于我这个根本连java都没学过的人,一开始就学android还是相当恼火的,感觉它怎么比我学的C++面向对象难多了,C++面向对象是我在以我的思维牵着代码走,这完全就是代码牵动着我的思维在走。第一个功能经过看视频,...
  •  本书作者是oracle资深dba,本书不仅融入了作者十年的实战心得和工作经验,还提供了来自于工作现场的大量实例,具有很强的可操作性。..  本书可以作为数据库开发人员、数据库管理员、数据库初学者及其他数据库从业...
  • 以及我们使用这些技术的心得和体会……>>更多 Mochi中国总经理黄骁虎做主题演讲 黄骁虎:今年4月份,然后我就开始搞业务,就是接手Mochi中国这个业务。Mochi中国的运营和商务方面的事情,我是从技术转向业务。所以...
  • 注意:营销者越是宣扬某个产品对自己有利的优点并催促着将其买下,就越是要留意分析该产品存在哪些对自己不利的因素甚至是致命弊端 卷钱陷阱 越来越多的租客发现,寻找租房容易碰到一个现象,不论是在网络上看到...
  • Java面试宝典2010版

    2013-12-19 19:32:29
    17、请说出作用域public,private,protected,以及不时的区别..................... 13 18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 14 19、构造器Constructor是否可被override?...
  • 但由于803和408的考试大纲相近,所以一般还是推荐使用408的参考书目。 《数据结构》严蔚敏 《计算机网络》谢希仁 《计算机组成原理》唐朔飞(或者白中英) 《操作系统》汤子瀛 3. 807软件工程专业综合 2018年807...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

产品使用心得怎么写