• 代码大全》第2版pdf高清完整版

    编辑点评:代码构建也兼具艺术性和思想性!电子工业出版社出版的一本软件构建之实践指南的书籍,代码大全(第2版)是由[美]Steve,[美]McCoell编著,内容非常的全面,涵盖了软件构建过程中的所有细节,精品下载站免费提供下载。代码大全第2版.df图片预览目录大全前言鸣谢核对表目录表目录图目录部分打好基础章欢迎进入软件构建的世界ldquo1.1什么是软件构建1.2软件构建为何如此重要1.3如何阅读本书第2章用隐喻来更充分地理解软件开发2.1隐喻的重要性2.2如何使用软件隐喻2.3常见的软件隐喻第3章三思而后行:前期准备3.1前期准备的重要性3.2辨明你所从事的软件的类型3.3问题定义的先决条件3.4需求的先决条件3.5架构的先决条件3.6花费在前期准备上的时间长度第4章关键的ldquo构建rdquo决策4.1选择编程语言4.2编程约定4.3你在技术浪潮中的位置4.4选择主要的构建实践方法第5章软件构建中的设计5.1设计中的挑战5.2关键的设计概念5.3设计构造块:启发式方法5.4设计实践5.5对流行的设计方法的评论第6章可以工作的类6.1类的基础:抽象数据类型(ADT)6.2良好的类接口6.3有关设计和实现的问题6.4创建类的原因6.5与具体编程语言相关的问题6.6类:包第7章高质量的子程序7.1创建子程序的正当理由7.2在子程序层上设计7.3好的子程序名字7.4子程序可以写多长7.5如何使用子程序参数7.6使用函数时要特别考虑的问题7.7宏子程序和内联子程序第8章防御式编程8.1保护程序免遭非法输入数据的破坏8.2断言8.3错误处理技术8.4异常8.5隔离程序,使之包容由错误造成的损害8.6辅助调试的代码8.7确定在产品代码中该保留多少防御式代码8.8对防御式编程采取防御的姿态第9章伪代码编程过程9.1创建类和子程序的步骤概述9.2伪代码9.3通过伪代码编程过程创建子程序9.4伪代码编程过程的替代方案第3部分变量0章使用变量的一般事项10.1数据认知10.2轻松掌握变量定义10.3变量初始化原则10.4作用域10.5持续性10.6绑定时间10.7数据类型和控制结构之问的关系10.8为变量指定单一用途1章变量名的力量11.1选择好变量名的注意事项11.2为特定类型的数据命名11.3命名规则的力量11.4非正式命名规则11.5标准前缀11.6创建具备可读性的短名字11.7应该避免的名字2章基本数据类型12.1数值概论12.2整数12.3浮点数12.4字符和字符串12.5布尔变量12.6枚举类型12.7具名常量12.8数组12.9创建你自己的类型(类型别名)3章不常见的数据类型13.1结构体第4部分语句第5部分代码改善第6部分系统考虑第7部分软件工艺参考文献索引内容提要代码大全(第2版)是书作者、《IEEESoftware》杂志前主编、具有20年编程与项目管理经验的SteveMcCoeU十余年前的经典著作的全新演绎:第2版做了全面的更新,增加了很多与时俱进的内容,包括对新语言、新的开发过程与方的讨论,等等。这是一本百科全书式的软件构建手册,涵盖了软件构建活动的方方面面,尤其强调提高软件质量的种种实践方法。作者特别注重源代码的可读性,详细讨论了类和函数命名、变量命名、数据类型和控制结构、代码布局等编程的基本要素,也讨论了防御式编程、表驱动法、协同构建、开发者测试、性能优化等有效开发实践,这些都服务于软件的技术:管理复杂度。为了培养程序员编写高质量代码的习惯,书中展示了大量高质量代码示例(以及用作对比的低质量代码),提高软件质量是降低开发成本的重要途径。除此之外,本书归纳总结了来自专家的经验、业界研究以及学术成果,列举了大量软件开发领域的真实案例与统计数据,提高本书的说服力。本书中所论述的技术不仅填补了初级与高级编程实践之间的空白,而且也为程序员们提供了一个有关软件开发技术的信息来源。本书对经验丰富的程序员、技术带头人、自学的程序员及没有太多编程经验的学生都是大有裨益的。可以说,只要您具有的编程基础,想成为一名的程序员,阅读本书都不会让您失望。图书特色代码构建也兼具艺术性和思想性!《代码大全(第二版)》经典重塑,2011版,仍然是一本完整的软件构建手册,涵盖了软件构建过程中的所有细节!是IT书作者SteveMcCoell十一年前的经典著作的全新演绎,该作者是两届SoftwareDevelometMagzieJoltAward震撼大奖得主。两届震撼大奖得主,数十年软件开发智慧,十二年前的经典,十二年后再铸辉煌!前言阅读《代码大全》这本书的原名叫《CodeComlete),那么codecomlete在这里是何含义呢?首先,它不代表现代集成开发环境(IDE)中的代码自动补全功能,本书也不打算向您讲解Eclie或ViualStudio2005中的代码自动补全功能是如何实现的@。其次,codecomlete也不是真正的软件源代码ldquo大全rdquo的意思8,这本书既没有列出连接各种数据库的代码、也没有列出网页中常用的各种JavaScrit代码。书中的代码示例恐怕也不能直接coyamate代码到您自己的项目中。那么codecomlete到底是什么意思?中译本为什么又要取名为ldquo代码大全rdquo呢?虽然从网上讨论的情况看,各位网友对书名含义的理解有出入,但是译者有充分的理由相信,codecomlete是ldquo编码完成rdquo的意思,是一个软件项目开发过程中的重要里程碑(miletoe)软件项目进行到这里,表明已经完成了所有的编码工作,即将开始系统测试这本书讲的正是为了到达ldquo编码完成rdquo这一重要里程碑所必需的软件构建技术,确切地说,就是如何编写高质量的代码,作者认为,应该首先为人编写代码,其次才是为机器(第34.3节);代码主要是供人阅读的。遍布全书的提高代码质量的实实在在的技术和诀窍,是本书最有价值的部分。事实上,我们认为第6、7、10至19章这300多页的内容是本书的精华内容,在其他书里恐怕很难找到如此详尽的对变量、语句、子程序等编程基本要素的讨论。十多年前,本书第1版以《代码大全》为名翻译出版,在过去的10余年中,这本书影响了整整一代程序员,ldquo代码大全rdquo四个字已成为一个响当当的名字。鉴于此,本书第2版决定保留这个无伤大雅的ldquo错误rdquo,沿用ldquo代码大全rdquo作为书名,也借此向原书第1版各位译者、修订者们的辛勤劳动表示我们的敬意,无论如何,对codecomlete的理解不会影啊对整本书的理解。本书除了讲如何构建高质量的软件,还讲如何成为一名优秀的程序员(第33章ldquo个人性格rdquo、第4.3节ldquo你在技术浪潮中的位置rdquo、第34.4节ldquo深入一门语言去编程")...

    2022-12-04 伪代码子程序 伪代码程序是什么

  • Java编程方法论响应式RxJava与代码设计实战电子版

    编辑点评:包含大量案例,案例按照功能迭代的方式响应式是未来的编程趋势,本书是讲解响应式技术RxJava2的书籍,在进行源码导读的同时,也引导读者对代码设计进行思考。Java编程方法论响应式RxJava与代码设计实战df电子版免费下载,需要的自己来点击下载吧。Java编程方法论df图片预览图书特色适读人群:本书适合有Java编程基础的中高级Java开发工程师、想要学习代码设计思路与技巧的读者、对响应式编程感兴趣的读者阅读。1.本书是作者知秋实践经验的总结,业内专家小马哥、梁桂钊、尹相宇、朱勇铭、芋艿、泥瓦匠等倾情力荐。2.知秋是国内为数不多的响应式和NIO方向的专家,本书是讲解响应式技术的书籍,在进行源码导读的同时,也引导读者对代码设计进行思考。3.响应式是未来的编程趋势,本书深入解读响应式RxJava2的源码,从设计到实现细节,帮助读者达到RxJava2源码库组件级别的拓展。4.本书包含大量案例,案例按照功能迭代的方式进行讲解,另外作者还录制了相关视频,可以配合学习。目录大全第1章响应式编程总览(ReactiveProgrammig)11.1异步编程模式11.1.1并发21.1.2并行开发初探31.2流(Stream)31.3响应式流(ReactiveStream)41.3.1响应式流的特性41.3.2响应式开发的设计原则51.3.3响应式开发的好处61.4响应式开发工具库61.4.1RxJava简介61.4.2Reactor简介71.4.3MogoDB简介81.4.4响应式项目用例81.5Java9中的响应式编程101.5.1响应式编程接口101.5.2Java9响应式编程入门Demo121.5.3SumiioPuliher类的源码解读181.5.4响应式编程整合Srig实战案例231.6小结29第2章在RxJava中创建Oervale302.1响应式编程所涉及的设计模式302.1.1观察者模式302.1.2迭代器模式302.2解读reactivex.Oervale312.2.1从Flow.Puliher到Oervale332.2.2ucrie的二三事332.2.3create方法的设计思想362.2.4各式各样的Oervale402.2.5Oervale.cache432.2.6无限流492.2.7在Oervale内处理错误542.2.8定时控制Oervale发送数据562.2.9Dioale延伸592.2.10CoectaleOervale解读672.2.11Oervale中的ulih.refCout解读762.2.12RxJava中的Suject解读792.3小结89第3章RxJava2中的操作903.1核心操作903.1.1使用filter进行条件过滤903.1.2使用ma进行元素转换963.1.3使用flatMa进行扁平化转换983.1.4使用ca累加器1123.1.5使用grouBy进行分组1143.2多个Oervale的合并操作1223.2.1使用merge对Oervale进行合并1223.2.2使用zi方法进行合并1243.2.3comieLatet操作1353.2.4withLatetFrom操作1413.2.5am操作1423.3高级操作1433.3.1再谈累加器ca1433.3.2聚合操作reduce1443.3.3收集操作collect1463.3.4使用ditict去重1483.3.5使用ditictUtilChaged过滤重复数据1523.3.6其他操作1523.3.7自定义操作1533.4小结159第4章对RxJava2的设计探索1604.1源的创建设计思路1604.2中间操作的转承1624.3小结166第5章Oervale实战1675.1初版架子实现1675.1.1DAO层面的处理工作1675.1.2控制层的响应式实现1725.2基于架子实现一个汇率查询的服务1755.3rxjava-we-rig-oot-tarter的抽取设计1795.4OervaleSeEmitter的设计实现1885.5小结196第6章RxJava2中的多线程操作1976.1初探RxJava并发编程1976.2ucrieO操作2116.3oerveO操作2166.4uucrieO操作2206.5调度器Scheduler2266.5.1Scheduler.ewThread方式2276.5.2Scheduler.io方式2276.5.3Scheduler.comutatio方式2286.5.4Scheduler.from(Executorexecutor)自定义方式2286.6小结230第7章Flowale与背压2317.1回顾背压2317.2引入Flowale2337.3探索Flowale.create2347.3.1BackreureStrategy.BUFFER策略2397.3.2BackreureStrategy.LATEST策略2467.3.3BackreureStrategy.DROP策略2497.4将一个Oervale转化为一个Flowale2517.5通过oBackreureXXX操作来实现背压策略2527.5.1oBackPreureBuffer操作2557.5.2oBackreureLatet与oBackreureDro操作2567.6Flowale.geerate操作2577.7小结262第8章Flowale实战2638.1使用Flowale封装JDBC2638.1.1封装部分查询逻辑2638.1.2封装udate逻辑2658.2结合SrigWe应用使用Flowale2688.2.1接口数据的获取2698.2.2响应式服务的源设计2718.3单元测试2748.3.1使用MockServiceServer进行测试2748.3.2使用@Mock来进行一些服务测试2778.4cotroller层的实现逻辑改造2798.5小结282内容简介本书对RxJava2的源码进行了深入解读,让读者可以从设计到实现细节上全面了解它,从而达到不仅会用而且可以进行RxJava2源码库组件级别的拓展的程度。本书的目的不仅是介绍RxJava2,而且更希望通过一个成熟、优秀的代码库来向读者展示阅读源码的思路及编程方面的技巧,其中包含了并发编程的实战技巧、数据结构的设计方法、设计模式的使用方法、函数式编程的各种技巧等,希望读者可以深入思考并获得属于自己的一套编程方法论。这也是“Java编程方法论系列丛书”的初衷,授之以鱼不如授之以渔。关于作者知秋,本名李飞,长期致力于基础代码库的研发工作,通过博客与视频平台iliili,结合自己的经验做了大量源码解读的分享。对JDK、Srig、RxJava、SrigReactor、Netty、Reactor-Netty等有很深刻的研究和独到的见解,并以此打造“Java编程方法论系列丛书”。基于开源精神,与志同道合的伙伴们一起创建了imvio开源分享团队,为开源社区服务。前言阅读前言本书是“Java编程方法论系列丛书”的第一本书,“Java编程方法论系列丛书”将我多年的代码经验通过讲述优秀的RxJava2、Reactor3、Reactor-Netty与SrigWeFlux等框架库的源码细节展现出来,目的是让大家可以学习一种读源码的方式。也就是说,看源码不仅要看懂它干了什么,而且更应该看相关源码的设计思路以及技巧。这就好比研读一篇好文章一样,要揣摩作者的行文方式。与理解代码相比,我更愿意带给大家的是一种生活态度。Java的第一个身份是语言,语言是用于描述我们的思想和生活的,所以带着生活中的理念来读源码,你就会发现情况大为不同:各种编程技巧和实现思路通通摆在了你的眼前。本系列丛书就是从这个角度出发的,所以针对的读者是那些想要提高自己对于基础代码掌控能力的中高级程序员。下面具体介绍一下本书内容。本书主要讲解了到底什么是响应式,从代码设计层面将JDK9+中的FlowAPI、RxJava2中关于源的创建,以及调度与背压等相关核心操作娓娓道来,并通过实战案例帮助大家更好地理解和使用相关的API。本书涉及了大量并发编程方面的技巧,以及从基础代码角度介绍了各种接口、设计模式和与之相关的基础知识点,并将它们融会贯通。这就好比我们上学的时候,老师向我们传授基础知识,然后通过习题让我们掌握这些基础知识的运用技巧。本书也遵循了这个思路,同时这也符合我写书的初衷。限于篇幅,有些内容没能完全在书中呈现,为了降低图书的阅读理解难度,我专门录制了相关的分享视频,可以更直观地带领大家走进源码世界。视频可以说是图书的有益补充,欢迎大家观看、学习。另外,希望读者通过学习本书了解响应式编程如何带来程序性能的提升以及其正确的使用方式。在录制本系列丛书的另一本书《Java编程方法论:响应式Reactor3、Reactor-Netty和SrigWeFlux》(后续出版)的相关视频时,使我感到很荣幸的是,视频得到了Srig官方的肯定,并在Srig官方推特和博客上进行了宣传、推广,这增加了我对本系列丛书的信心。最后,感谢尹相宇同学,没有你听我#xfffd#xfffd#xfffd#xfffd唆唆地讲代码,我估计自己的这份激情难以维持,当然,这本书的顺利出版也离不开你的审阅。另外,需要感谢的还有付睿编辑,她帮助我修正了很多表达细节上的错误。最后,感谢我的家人对我的理解和默默付出。知秋(李飞)2019年2月15日推荐序一在ArchitectureadDeigIfoQTredReort-Jauary2019(2019年1月的IfoQ架构和设计趋势报告)中,响应式编程(ReactiveProgrammig)和函数式编程(FuctioalProgrammig)编列在第一季度(Q1)的EarlyAdoter(早期采纳者)中。尽管这仅是一家之言,但是不少开发人员逐渐意识到响应式之风已然吹起。也许你的生产系统尚未出现响应式的身影,不过你可能听说过SrigWeFlux或NetflixHytrix等开源框架。笔者曾请教过Pivotal(Srig母公司)的布道师JohLog:“Srig技术栈未来的重心是否要布局在响应式上?”对方的答复是:“没错,响应式是未来的趋势。”同时,越来越多的开源项目开始签署响应式宣言(TheReactiveMaifeto)并喊出了“WeAreReactive”的口号。或许开源界的种种举动无法说服你向响应式的“港湾”中停靠,不过Java9中FlowAPI的引入,又给业界注入了一剂“强心针”。不难看出,无论是JavaAPI,还是Java框架,均走向了响应式编程模型的道路,这并非一种巧合。通常,人们谈到的响应式可与响应式编程画等号,以“非阻塞(No-Blockig)”和“异步(Aychroou)”的特性并述,以数据结构与操作相辅相成。响应式编程涉及函数式和并发两种编程模型,前者关注语法特性,后者强调执行效率。简言之,响应式编程的意图在于“LeCode,MoreEfficiet”。除此之外,笔者认为响应式更大的价值在于统一Java并发编程模型,使得同步和异步的实现代码无异,同时做到Java编程风格与其他编程语言更好地融合,或许你已经发现Java与JavaScrit在响应式方面并不存在本质区别。纵观Java在响应式编程上的发展,其特性更新真可谓步步为营、如履薄冰。尽管Java线程APIThread与Ruale已具备异步以及非阻塞的能力,然而其同步和异步编程的模式并不统一,并且理解ThreadAPI的细节和管理线程生命周期的成本均由开发人员承受。虽然在Java5引入J.U.C框架(Java并发框架)之后,ExecutorService的实现减轻了以上负担,但是开发人员仍须关注ExecutorService的实现细节。比如,怎样合理地设置线程池空间及阻塞队列又成为新挑战。为此,Java7引入了ForkJoiPoolAPI,不过此时的J.U.C框架与响应式理念仍存在距离,即使是线程安全的数据结构也并不具备并行计算的能力(如集合并行排序),同时操作集合的手段也相当贫乏,缺少类似Ma/Reduce等的操作。不过这些困难只是暂时的,终究会被Java8“救赎”。StreamAPI的出现不仅具备数据操作在串行和并行间自由切换的能力(如equetial()及arallel()方法),而且淡化了并发的特性(如orted()方法既可以进行传统排序,也可以进行并行排序)。相同的设计哲学也体现在Java响应式实现框架中,如本书中提及的RxJavaAPIio.reactivex.Oervale。统一编程模型只是流的设计目标之一,它结合Lamda语法特性,虽然提供了数量可观的操作方法,如flatMa()方法等,但是无论对比RxJava,还是Reactor,流操作方法却又相形见绌。值得一提的是,这些操作方法在响应式的术语中被称为操作符(Oerator)。当然框架内建操作符的多与少,并非判断其是否为响应式实现的依据。其中的决定性因素在于数据必须来自发布端(生产者)的“推送(Puh)”,而非消费端的“拉取(Pull)”。显然,流属于消费端已就绪(Ready)的数据集合,并不存在其他数据推送源。不过JVM语言早期的响应式定义处于模糊地带,如RxJavaAPI属于观察者模式(OerverPatter)的扩展,而非迭代器模式(IteratorPatter)的实现。而Reactor的实现则拥抱响应式流规范,该规范中消费端对于数据的操作是被动地处理,而非主动地索取。换言之,数据的到达存在着不确定性。当推送的数据无法得到消费端的及时响应时,响应式框架必须提供背压(BackPreure)实现,确保消费端拥有“拒绝的权力(cacel)”。在此理论基础上,响应式流规范定义了一套抽象的API,作为Java9中java.util.cocurret.FlowAPI的顶层设计。不过关于操作符的部分,该规范似乎不太关心,这也是RxJava和Reactor均称自身为响应式扩展框架的原因,同时两者在API级别提供了多种调度器(Scheduler)实现,可适配不同并发场景。尽管响应式定义在不同的阵营之间存在差异,但援引本人在《ReactiveProgrammig:一种技术,各自表述》一文中的总结:ReactiveProgrammig作为观察者(Oerver)模式的延伸,不同于传统的命令编程(ImerativeProgrammig)同步拉取数据的方式,如迭代器模式(Iterator),而是采用数据发布者同步或异步地推送到数据流(DataStream)的方案。当该数据流(DataStream)的订阅者监听到变化传播时,立即做出响应动作。在实现层面上,响应式编程可结合函数式编程简化面向对象语言语法的臃肿性,屏蔽并发实现的复杂细节,提供数据流的有序操作,从而达到提升代码的可读性以及减少Bug出现的目的。同时,响应式编程结合背压(BackPreure)的技术解决了发布端生成数据的速度高于订阅端消费数据的速度的问题。不难看出,响应式是一门综合的编程艺术,在实现框架的“加持”下,相同的代码逻辑可实现同步与异步非阻塞功能,从而达到提升应用整体性能的目的。不过现实的情况或许没有那么理想,Srig官方文档在“WeoReactiveStack”章节中提到,“响应式和非阻塞通常并不会让应用运行得更快”:Reactiveado-lockiggeerallydootmakealicatiorufater.为此,JHiter给出了一份Srig5WeFlux性能测试报告,其中一条结论是“响应式应用并没有表现出速度的提升(甚至其速度变得更慢)”:Noimrovemetieedwaoervedwithourreactivea(theGatligreultareevelightlywore).数月后,看似相反的结论却在DZoe的一篇名为RawPerformaceNumer-SrigBoot2Wefluxv.SrigBoot1的文章中出现,测试结果是SrigBoot2WeFlux在高并发下的响应时间更平稳。实际上,这个测试结果有些“关公战秦琼”的味道,毕竟SrigBoot2下的WeFlux和SrigBoot1下的Servlet容器所使用的线程模型是不同的,并且Servlet3.0的异步以及非阻塞特性默认是关闭的。不过以上两篇文章的结论并不矛盾,前者关注响应速度,后者则强调吞吐量,两者都是性能的核心指标。遗憾的是,这两篇文章均未对各自的测试用例做出调优,因此以上结论都存在一定的局限性,这也是笔者对响应式技术能否提升性能提出质疑的地方。如果说笔者是国内提出响应式问题的第一人的话,那么知秋就是国内第一个解决响应式问题的人。作为国内为数不多的响应式以及NIO方面的专家,在技术研究上,他追求格物致知,不轻易忽略技术细节;在知识分享上,他可谓知无不言,言无不尽,不仅在社交群中答疑解惑,而且录制免费视频,发布在B站以及YouTue频道上,并得到了JohLog等“大牛”的推文(Twitter)。或许以上方式还不足以完整地讨论Java响应式技术,因此,知秋选择了漫长而又艰苦的著书之路。尽管他是笔者的朋友,然而“内举不避亲”,笔者郑重地向读者朋友推荐本书。这是中国大陆地区(不含港澳台地区)第一本全面解读Java响应式技术的书籍,作者的技术积累雄厚,书中的知识脉络循序渐进。同时,这也是一本引人深思的书,在进行源码导读的同时,也引导读者对代码设计进行思考。另外,这又是一本知识苦旅的书,因为它的涉及面较广,读者不仅需要具备一定的Java并发以及面向对象设计的基础,而且需要花费较多的时间去反复推敲书中的有关内容。正所谓“夫夷以近,则游者众;险以远,则至者少”,笔者希望读者在购买本书后,不轻言放弃,当你面临挑战时,那才是成长的开始。同时,笔者也期盼读者将响应式技术付诸实践,提早“触碰”未来。小马哥(mercylitz)2019年3月5日推荐序二有幸与李飞兄相识多年,他严谨的治学态度和认真的工作作风让我敬佩不已。值得一提的是,李飞兄是一个非常乐于分享知识和帮助他人解惑的人。我经常在微信群中看到他热情地帮助他人分析问题并提供解答思路。此外,他晚上还经常开视频来分享自己对Java编程方法论的思考与心得。当然,这些视频是免费、公开的,其中很多内容涉及本书的知识点,可以认为是本书很好的补充。事实上,我也是他的忠实听众之一,所以非常推荐大家在购买本书的同时结合视频一起学习,如此则效果更佳。因此,我对他充沛的精力和满满的分享精神甚是佩服。写书殊为不易,分享精神更是难能可贵,因此,当我得知李飞兄要将他对Java编程和响应式编程的技术经验编写成书的时候,甚是欣喜,因为我相信这本书不仅会给读者带来响应式编程等核心知识的深入理解和技术成长,同时也会让读者对Java编程方法论有自己的思考。响应式编程是未来架构的一次升级。事实上,我们业务的主流模式会使用RPC和SrigMVC的同步等待机制,以及通过并行调用缩短平均响应时间,这种做法对性能的提升非常显著。但是,随着业务的复杂演变,可能会出现回调地狱,而且冗余的业务代码和大量的并行代码也会导致程序越来越难以维护。此时,一个新的编程思想――响应式编程――应运而生,它通过避免等待以缩短平均响应时间来保证系统的利用率。在这里,响应式编程的关键元素之一是能够异步执行任务。这种全异步方式的优势在于,可以充分地利用线程的时间片。另外,响应式编程是一种面向数据流和变化传播的编程范式。事实上,它是一种新思路,我们可以认为任何东西都是一个数据流,即“万物皆为流”,因此我们需要面向数据流编程。它并不陌生,可以通过观察者模式来构建。我们可以创建事件流和数据流,然后让观察者/消费者订阅任何需要关心的数据流并执行相关的业务操作。例如,我们经常提到的事件总线,其本质上就是通过异步事件流对监听的事件变化做出响应。响应式编程还有一个很重要的概念――变化传播。例如,输入一个数据流,经过一系列的操作转化成另一个数据流。为了更好地理解这个特性,我们可以把数据流类比成一条河流:它可以被观测、被加工或者被合并成一条新河流。因此,随着响应式编程的发展成熟,如果能把全异步流式的能力引入业务开发中,不仅可以使项目的性能得以提升,而且也可以给项目带来更多的灵活性。本书详细介绍了RxJava的源码细节和后端的实战使用方法,不论是刚接触响应式编程的入门读者,还是已经有响应式编程实战经验的进阶读者,阅读本书都会收获颇多。梁桂钊阿里巴巴Java高级开发工程师推荐序三响应式编程日益流行,如今Java语言正经历着快速迭代,然而很多Java开发者仍沉浸在Java7/Java8的世界。在Java9发布前飞哥已经开始着手编写本系列丛书的准备工作,目标是让广大开发者能够学习全新的Java语言。如今的Java已经提供了函数式编程支持、模块化的JDK和模块化开发支持、对流式编程友好的G1垃圾回收器、低延迟的ZGC等特性,包含的内容非常丰富。由于计划写的内容很多,飞哥后来索性将响应式编程的部分拆分出来,成为现在我们所看到的这本书。时过境迁,Java语言早已不是被人诟病的臃肿语言,在其之上大量的精妙设计得以实现,事实证明Java拥有独特的魅力和经久不衰的生命力。学习响应式编程最重要的是理解它的设计思想,我们不能只将RxJava、Reactor以及SrigWeFlux作为一个工具框架看待,会使用它们并不意味着能够驾驭它们。学习这本书会让你了解响应式编程如何带来程序性能的提升,以及什么是响应式编程的正确使用方式。如果说代码是躯体,那么什么才是灵魂?躯体和灵魂相比,谁又是永生的?本书所讲的不只是具体的使用方法,还会讲解其中的设计思想:从它的源码设计中学习如何设计,通过源码还原其本质。机会总是留给有准备的人,抓住Java的响应式编程趋势,追寻自己所向往的生活。在阅读本书的过程中,切忌不可囫囵吞枣。如果读者的基础尚未稳固,建议在阅读时谨慎对待书中的内容。很多小段落不可只理解字面上的描述,在你多次回味并细细揣摩后,便可发现其中的深层次视角。书中内容大多前后关联,因此不推荐跳跃式阅读。在阅读本书选取的源码时,切不可一眼过之,因为这些源码多为关键所在。本书拨开“浮云”,在大量的源码中直击要害,帮助读者了解程序的执行方式和设计思路。在阅读本书时,准备好对应的源码是一个聪明的选择。书中的案例均经过精心的设计,从简单使用开始,不断地增添和修改,让读者在学习的过程中不脱离实战,逐步掌握响应式编程。响应式编程作为未来编程的趋势,具有异步、非阻塞的特点,它能够支持更大的吞吐量,相较于传统的服务实现方式其占用较少的资源。在学习本书的内容前,希望读者能够对Lamda表达式和Steam(流)有一些了解,不了解也没有关系,本系列丛书中关于JDK的书会在本书之后出版,让大家认识全新的Java。另外,配套视频教程已经准备好,在B站或YouTue上搜索“Java编程方法论”就可以找到它们。尹相宇格力Java高级工程师...

    2022-04-10 响应式编程rxjava 响应式编程 rxjs

  • 大话代码架构:项目实战版(txt+pdf+epub+mobi电子书下载)|百度网盘下载

  • 2022Python与seo实战课程(视频+课件+项目代码)2-4期,百度网盘,阿里云盘下载

    会员福利本课程出自布鲁斯rook的ytho与eo实战课程+Pytho+ELK打造eo数据分析监控系统官网售价3980元。通过对ytho与eo实战课程这门课对于eoer从业者或者是ytho爬虫开发方面的人群,通过ytho来开发、ytho爬虫开发以及eo工具等。课程都是从入门开始讲起的哪怕你零基础的小白也没有关系,从入门到进阶课程讲到非常清楚,摆脱你的手工发布项目的实战讲,dedecm发布、hcm和帝国cm发布教程、采集内容自动化、ytho实现AI伪原创功能等等......Pytho+ELK打造eo数据分析监控系统这套课程根据老师的五年多的eo经验和经理打造的eo日常工具,学完这门课程可以帮助你在短时间内分析网站流量下降数据分析各项监控对于网站为什么没有排名?抓取减少、收录差、只要做好监控系统分析数据提高eo工作人员提升技能效率。(完结)Pytho与eo实战课程3期(视频+课件+项目代码)一共615个视频41.9G(完结)Pytho与eo实战课程2期(视频+课件+项目代码)一共193个视频63.96G(完结)ytho与elk打造数据分析监控系统实战课程(视频+课件+项目代码)一共122个视频15G左右2022年2月5日更新了ythoe与eo四期cm开发,包括视频和课件资料、思维导图,课程目录和下载链接在文章底部。Pytho与eo实战课程视频随机截图Pytho与eo实战课程3.0目录截图Pytho与eo实战课程2.0目录截图Pytho+ELK打造eo数据分析监控系统目录截图课程目录:ytho与eo第四期cm├12月14日直播课(编程语言系统入门)├2022年1月17日Pytho直播├NavicatPremium、zi├代码day01、ziday02、ziday03、ziday04、ziday05、ziday06、ziday07、ziday08、ziday09、ziday10、ziday11、ziday12、ziday13、ziday14、ziday15、ziday16、ziday17、ziday18、ziday19、ziday20、ziday21、ziday22、ziday23、ziday24、zi解压密码、txt├视频day01-aic快速入门1-课程介绍2-aicwe框架介绍3-aic的安装和快速体验4-jija2模板引擎介绍5-aic集成jija2进行动态模板渲染6-aic静态文件的访问7-aic响应ico图标和jo信息day02-模板装饰器及aic请求内容获取10-使用装饰器封装模板渲染过程11-模板装饰器函数的高级用法12-请求不同类型内容的获取8-闭包和装饰器复习9-装饰器属性还原和传参问题day03-aic路由中间键和静态缓存(上)13-获取URL请求参数的方法14-安装和配置gix使用虚拟域名进行访问15-路由参数的配置和获取16-路由请求的补充17-aic事件监听器18-aichtt中间件和简单静态缓存的实现day04-aic静态缓存及基于类的视图和蓝图的实现19-aic简单静态缓存的完整实现20-静态缓存时间的控制21-静态缓存的完整实现代码22-aic基础杂项23-基于类的视图和代码优化24-蓝图的介绍和程序结构的变化25-cm蓝图的改造(上)26-cm蓝图改造(中)27-cm蓝图改造(下)28-ytho模块循环导入的问题及解决方法day05-aic蓝图、异常和装饰器29-蓝图的复习及简单架构30-aic应用异常介绍31-aic应用异常处理32-aic装饰器使用和密码校验33-aic日志杂谈day06-ymyql的CRUD及tortoie-orm简单入门34-MySQL介绍和数据库创建及表创建35-ymyql的安装和介绍36-ymyql的增删改查37-使用ymyql快速构建一个简单的aic应用38-ql注入问题和tortoieorm的介绍39-tortoie-orm的安装40-简单数据表模型的定义41-使用tortoie-orm自动生成数据表day07-tortoie生成数据表源码分析和新增自定义存储引擎功能42-tortoie生成数据表存储引擎是myiam的问题解决43-分析tortoie生成数据表的源码-上44-分析tortoie生成数据表源码-下45-修改tortoie源码实现自定义egie46-测试和验证自定义egieday08-orm模型和字段讲解和案例实操47-model限定生成的模型48-抽象模型的定义和使用49-元类和数据表关系50-orm相关数据字段的解析51-简单cm表模型的创建52-数据模型生成数据表day09-aic操作orm新增数据入门53-重构admiAPP的模型54-生成数据库表55-通过aic插入数据56-判断数据是否已经存在57-添加文章数据-上58-添加文章数据-中59-添加文章数据-下60-关于数据库事务和模型函数封装的介绍day10-orm模型封装自定义文章插入函数和MySQL事务61-在文章模型类中封装添加文章的逻辑函数62-类封装中的代码优化和ug修复63-tortoie的MySQL事务保证插入文章的完整性64-MySQL事务讲解和演示day11-orm简单查询和优化65-快速介绍orm查询相关的ai函数66-写个小爬虫批量插入内容-上67-写个小爬虫批量插入内容-中68-写个小爬虫批量插入内容-下69-orm查询相关过滤标识符和对应MySQL语法70-在视图中获取article相关的数据71-分析网页加载慢的原因和优化day12-获取指定分类和标签下的文章72-查询最新的整站文章和某个分类下的文章73-获取某个分类下文章的路由实现74-分类分页的实现75-ql语句实现获取某个tag下的所有文章76-orm实现获取某个tag下的所有文章和分页day13-orm删除文章及we程序架构解析和懒人cm程序架构77-orm删除文章78-we应用程序的组成和架构79-中间件和其它框架的对比80-后台模板选用和介绍81-layzercm程序主要目录结构82-数据库表和字段介绍83-数据表模型定义day14-用户模型的数据接口编写和测试84-用户模型的增删改85-用户模型的查询相关函数封装86-用户模型单元测试87-新增用户测试-188-新增用户测试-289-删除用户测试90-更新和查询用户测试day15-分类和标签模型的接口开发和测试91-分类模型的CRUD接口开发92-分类模型接口测试93-标签模型的CRUD接口开发94-标签模型接口测试day16-网站设置和蜘蛛、用户访问模型接口开发测试100-ider模型接口测试101-用户访问模型接口开发95-网站设置模型接口开发-196-网站设置模型接口开发-297-网站设置模型接口开发-398-网站设置模型接口测试99-ider模型接口开发day17-文章表插入数据和删除数据接口开发测试102-文章表插入文章接口开发103-文章表插入文章接口开发-2104-文章表插入文章接口开发-3105-文章表插入文章接口开发-4106-文章表删除文章接口开发107-文章表删除文章接口测试day18-文章表数据更新相关接口开发和测试108-文章表更新文章接口开发-1109-文章表更新文章接口开发-2110-文章表更新文章接口测试111-文章表文章浏览量更新接口开发112-文章表蜘蛛访问量及收录接口开发113-文章表访问数据相关接口测试day19-文章表查询相关接口开发114-获取整站最新文章接口开发115-获取某个分类下的最新文章接口开发116-获取某个标签下的最新文章接口开发117-获取具体某篇文章和相关文章118-获取某个爬虫访问量少于多少的文章119-获取某个爬虫访问量区间的文章接口开发120-获取热门文章和已抓取未收录的文章接口开发day20-新版本和用户登录121、环境迁移和新版tortoieorm的一些问题修复122、acce访问表测试123、前后台路由组集成124、后台登录简单实现125、通过orm交互实现用户登录校验126、使用cookie和eio进行登录校验day21-集成jija2模板day21127、退出登录代码实现128、集成jija2模板引擎129、后台登录模板制作和静态资源处理130、后台首页模板处理day22-后台分类模板相关逻辑实现-1day22131、新增文章模板和视图函数处理-1132、新增分类模板和路由处理133、改用redi进行eio管理134、新增分类业务逻辑实现-1135、分类列表视图和分类跳转136、分类列表读取数据到前端模板day23-分类相关功能实现补充day23137、分类列表中新增分类和编辑分类的制作138、编辑分类功能实现139、分类列表删除单个分类功能实现140、批量删除实现-1(后面j部分可以不看)141、批量删除分类功能实现-2142、批量删除功能实现-3143、分类批量删除功能ug修复day24-后台编辑文章模板和图片上传接口开发144、分类模板消息提示完善145、文章列表视图函数和添加文章模板中制作146、图片上传接口开发-1147、图片上传接口开发-2148、图片上传接口开发-3Pytho与eo实战训练营第三期【41.9G】1天:学习方法和ytho环境搭建2天:ytho语言规范和数字类型3天:字符串类型4天:列表类型5天:循环语句6天:元组类型7天:集合类型8天:字典类型9天:条件判断语句10天:基础数据类型总结11天:函数编程12天:高阶函数编程13天:文件读写14天:模块和包15天:正则表达式16天:批量修改文件名项目17天:面向对象编程入门18天:面向对象编程进阶19天:错误和异常处理20天:多进程编程入门21天:多进程编程进阶22天:多线程编程入门23天:多线程编程进阶24天:htt协议25天:requet模块讲解26天:某考网爬虫项目27天:某考网内容处理28天:xath语法29天:lxml模块讲解30天:某悦荟爬虫项目31天:mogod数据库入门32天:百度关键词过滤项目33天:ytho操作mogod34天:某柴网爬虫项目35天:dedecm内容发布36天:帝国cm内容发布37天:wordre内容发布38天:hcm内容发布39天:zlog内容发布40天:ycm内容发布41天:dicuz论坛内容发布42天:micm内容发布43天:关键词排名jo数据采集44天:链接收录查询和分析45天:某度下拉框挖词46天:某度搜索结果挖词47天:凤巢关键词挖掘-上48天:凤巢关键词挖掘-下49天:结巴中文分词50天:关键词去重51天:关键词去重处理252天:敏感词过滤55天:标题生成的第二种方式53天:关键词过滤和分类扯淡54天:字符串相似度算法及标题生成56天:elaticearch搜索引擎安装和使用57天:e内容搜索聚合初步实现58天:多线程内容聚合发布59天:如何处理采集内容中的垃圾信息60天:随机段落伪原创61天:随机句子伪原创及图片下载62天:根据关键词进行图片下载和处理63天:文章插入相关图片代码实现64天:有道翻译逆向65天:AI伪原创完整实现66天:ytho异步编程67天:异步网络编程68天:异步并发采集实战69天:motor模块的使用及爬虫中断重爬70天:redi数据库使用71天:ytho操作redi数据库72天:redi爬虫队列73天:JavaScrit基础入门74天:JavaScrit面向对象入门75天:JavaScrit面向对象继承和模块76天:JavaScrit浏览器环境77天:JavaScrit标准库78天:j逆向入门案例79天:ku我音乐歌曲播放参数逆向80天:某条异步请求签名参数逆向81天:NLP语言模型GPT-2的安装和使用(选学)82天:CPU和GPU训练模型的问题及结课第五次直播视频2020年12月26号直播ytho3_roject-mater.zi文件.zi课程目录:ytho与SEO实战课程[63.96G]┣━━课件[44.2M]┃┣━━1.Pytho3基础语法与数据结构.df[395.1K]┃┣━━2.Pytho3变量声明以及数字类型.df[364.8K]┃┣━━3.ytho3字符串讲解.df[208.6K]┃┣━━4.ytho3列表讲解.df[222.3K]┃┣━━5.ytho3元组讲解.df[148.7K]┃┣━━6.ytho3集合讲解.df[200.6K]┃┣━━7.ytho3字典讲解.df[212.6K]┃┣━━8.ytho3条件判断语句讲解.df[205K]┃┣━━9.ytho3循环语句讲解.df[226K]┃┣━━10.ytho3函数式编程.df[441.7K]┃┣━━11.ytho3文件操作讲解.df[348.2K]┃┣━━12.ytho3错误和异常处理.df[415.4K]┃┣━━13.ytho3模块和包讲解.df[372.8K]┃┣━━14.ytho3正则表达式讲解.df[362.3K]┃┣━━16.ytho3多进程编程.df[442.8K]┃┣━━17.ytho3多线程编程.df[178.5K]┃┣━━图解HTTP.df[31.4M]┃┣━━ceto7命令教程.html[208.7K]┃┣━━liux命令笔记.df[254.4K]┃┣━━myql笔记.txt[4.3K]┃┣━━MySQL必知必会.df[7.5M]┃┗━━vim编辑器及日志分析常用命令.df[153.4K]┣━━视频[83.4G]┃┣━━第八天:条件判断语句[391.8M]┃┃┣━━21.ytho字典课后作业.MP4[86.5M]┃┃┣━━22.ytho条件判断语句讲解-1.MP4[75.6M]┃┃┣━━23.ytho条件判断语句讲解-2.MP4[88.6M]┃┃┗━━24.ytho条件判断语句讲解-3.MP4[141.2M]┃┣━━第二十八天:dedecm发布教程[2.6G]┃┃┣━━108.开发环境搭建及dedecm安装.MP4[637.3M]┃┃┣━━109.dede发布抓包及用cookie发布文章.MP4[805.2M]┃┃┗━━110.通过dede接口从数据库读取和发布文章.MP4[1.2G]┃┣━━第二十二天:MySQL教程[4.2G]┃┃┣━━84.widow下myql的安装和配置.MP4[928.4M]┃┃┣━━85.myql客户端软件安装及增删改查体验.MP4[797.4M]┃┃┣━━86.myql数据库语法讲解-上.MP4[1.5G]┃┃┗━━87.myql数据库语法讲解-下.MP4[995M]┃┣━━第二十九天:hcm和帝国cm发布教程[3.1G]┃┃┣━━111.hcm安装及发布介绍.MP4[1.1G]┃┃┣━━112.利用hcmcookie发布文章.MP4[473.7M]┃┃┣━━113.利用hcm接口发布文章.MP4[661.1M]┃┃┣━━114.帝国cm安装及配置.MP4[348.2M]┃┃┗━━115.利用帝国cm接口发布文章.MP4[607.4M]┃┣━━第二十六天:神马关键词采集┃┣━━第二十七天:根据关键词批量采集文章[4G]┃┃┣━━103.关键词挖掘时加入词根过滤.MP4[273M]┃┃┣━━104.通用正文提取模块的安装和使用.MP4[918.6M]┃┃┣━━105.根据关键词批量获取文章-1.MP4[777.7M]┃┃┣━━106.根据关键词批量获取文章-2.MP4[1.3G]┃┃┗━━107.根据关键词批量获取文章-3.MP4[835.1M]┃┣━━第二十三天:Pytho操作myql[2.5G]┃┃┣━━88.ymyql的安装及测试.MP4[703M]┃┃┣━━89.ymyql对象方法讲解及建表.MP4[486.1M]┃┃┣━━90.ymyql的增删改查操作.MP4[671.4M]┃┃┗━━91.多线程爬虫采集内容存入数据库.MP4[685.7M]┃┣━━第二十四天:百度移动关键词挖掘[2.9G]┃┃┣━━92.百度移动关键词挖掘-1.MP4[798.6M]┃┃┣━━93.百度移动关键词挖掘-2.MP4[724.6M]┃┃┣━━94.百度移动关键词挖掘-3.MP4[828.6M]┃┃┗━━95.百度移动关键词挖掘-4.MP4[574.9M]┃┣━━第二十天:lxml之CSS选择器[5.3G]┃┃┣━━74.lxml的介绍及安装.MP4[467.8M]┃┃┣━━75.c选择器获取百度搜索热点关键词.MP4[760.9M]┃┃┣━━76.c选择器实现百度PC无限挖词.MP4[812.2M]┃┃┣━━77.c选择器批量采集文章-上.MP4[1.1G]┃┃┣━━78.c选择器批量采集文章-中.MP4[1004.8M]┃┃┗━━79.c选择器批量采集文章-下.MP4[1.2G]┃┣━━第二十五天:结巴分词[3.1G]┃┃┣━━96.过滤没有相关搜索的关键词.MP4[439.7M]┃┃┣━━97.结巴分词入门.MP4[943.9M]┃┃┣━━98.结巴分词进阶及关键词分类思路.MP4[886.4M]┃┃┗━━99.利用结巴分词对关键词快速分类.MP4[914M]┃┣━━第二十一天:lxml之xath┃┣━━第二天:基础语法与数据类型[397M]┃┃┣━━2.ytho基础语法和数据结构.MP4[211.2M]┃┃┗━━3.Pytho3中的变量声明以及数字类型.MP4[185.8M]┃┣━━第九天:循环语句[358.4M]┃┃┣━━25.条件判断语句复习及课后作业.MP4[74.7M]┃┃┣━━26.while循环语句的讲解.MP4[103M]┃┃┣━━27.for循环语句讲解.MP4[96.8M]┃┃┗━━28.for循环实现各种推导式.MP4[83.8M]┃┣━━第六天:集合讲解[316.5M]┃┃┣━━14.元组主要知识点复习.MP4[11.1M]┃┃┣━━15.集合的创建和成员判断以及集合的相关概念.MP4[142M]┃┃┗━━16.集合的内置方法及相关操作符的使用.MP4[163.4M]┃┣━━第七天:字典讲解[519.4M]┃┃┣━━17.集合数据类型课后作业讲解.MP4[137.4M]┃┃┣━━18.字典的相关概念以及创建和初始化.MP4[93.5M]┃┃┣━━19.字典的相关操作.MP4[123.8M]┃┃┗━━20.字典相关的函数和方法的使用以及字典相关特性的补充.MP4[164.6M]┃┣━━第三十八天:iev的使用和凤巢挖词[2G]┃┃┣━━144.iev的安装和简单实用介绍.MP4[723.3M]┃┃┣━━145.iev安装依赖包及ycharm环境配置和凤巢关键词采集.MP4[583.2M]┃┃┗━━146.凤巢关键词采集完善.MP4[754M]┃┣━━第三十二天:百度PC端排名查询[3.5G]┃┃┣━━126.百度PC端排名查询-1.MP4[1.8G]┃┃┗━━127.百度PC端排名查询-2.MP4[1.7G]┃┣━━第三十九天:百度PC端关键词覆盖率查询[6.1G]┃┃┣━━147.iev的补充介绍.MP4[1.2G]┃┃┣━━148.百度PC关键词覆盖率查询-1.MP4[1.5G]┃┃┣━━149.百度PC关键词覆盖率查询-2.MP4[744.9M]┃┃┣━━150.百度PC关键词覆盖率查询-3.MP4[1.3G]┃┃┣━━151.百度PC关键词覆盖率查询-4.MP4[501.1M]┃┃┗━━152.百度PC关键词覆盖率查询-5.MP4[888.5M]┃┣━━第三十六天:爬虫断点续爬[2.7G]┃┃┣━━139.ickle模块的使用.MP4[627.3M]┃┃┣━━140.ickle案例喜马拉雅链接抓取-1.MP4[1.1G]┃┃┗━━141.ickle案例喜马拉雅链接抓取-2.MP4[1014.6M]┃┣━━第三十七天:喜马拉雅断点续爬改进及链接提取[2G]┃┃┣━━142.喜马拉雅链接提取和保存.MP4[870.1M]┃┃┗━━143.喜马拉雅链接实现真正的断点续爬.MP4[1.1G]┃┣━━第三十三天:百度PC端收录查询[2.5G]┃┃┣━━128.百度PC端收录查询-1.MP4[685.7M]┃┃┣━━129.百度PC端收录查询-2.MP4[720.5M]┃┃┗━━130.百度PC端收录查询-3.MP4[1.1G]┃┣━━第三十四天:百度移动收录查询[2.9G]┃┃┣━━131.百度移动收录查询-1.MP4[816.3M]┃┃┣━━132.百度移动收录查询-2.MP4[1.4G]┃┃┗━━133.百度移动收录查询-3.MP4[765.4M]┃┣━━第三十天:WordPre发布教程[3G]┃┃┣━━116.WordPre的安装和简单配置.MP4[463.4M]┃┃┣━━117.wordre模块安装及发布测试.MP4[784.2M]┃┃┣━━118.wordre-xmlrc接口常用方法讲解-上.MP4[605.6M]┃┃┣━━119.wordre-xmlrc接口常用方法讲解-下.MP4[541.5M]┃┃┗━━120.ytho批量发布WordPre文章.MP4[658.4M]┃┣━━第三十五天:神马收录查询[3.5G]┃┃┣━━134.神马收录查询-1.MP4[685.1M]┃┃┣━━135.神马收录查询-2.MP4[567.4M]┃┃┣━━136.神马收录查询-3.MP4[820.5M]┃┃┣━━137.神马收录查询-4.MP4[1.2G]┃┃┗━━138.神马收录查询-5.MP4[258.7M]┃┣━━第三十一天:百度移动关键词排名查询[5.4G]┃┃┣━━121.百度移动关键词排名查询-1.MP4[1.3G]┃┃┣━━122.百度移动关键词排名查询-2.MP4[982.9M]┃┃┣━━123.百度移动关键词排名查询-3.MP4[1.3G]┃┃┣━━124.百度移动关键词排名查询-4.MP4[1004.4M]┃┃┗━━125.百度移动关键词排名查询-5.MP4[848M]┃┣━━第三天:字符串讲解[689.3M]┃┃┣━━4.Pytho3第二天复习和作业讲解.MP4[214.4M]┃┃┣━━5.字符串的创建以及注意事项.MP4[84.2M]┃┃┣━━6.获取字符串中的单个元素以及字符串切片.MP4[129.2M]┃┃┗━━7.字符串格式化以及内置函数的用法.MP4[261.5M]┃┣━━第十八天:多线程编程[5.1G]┃┃┣━━65.多线程的概念及创建.MP4[576.6M]┃┃┣━━66.多线程爬虫演示及守护线程.MP4[935.7M]┃┃┣━━67.继承方式实现多线程及线程同步问题.MP4[972M]┃┃┣━━68.线程死锁及生产者消费者模式.MP4[768.9M]┃┃┣━━69.消息队列实现生产者消费者模式.MP4[837.9M]┃┃┗━━70.多线程实现百度收录查询.MP4[1.1G]┃┣━━第十二天:错误和异常处理[344M]┃┃┣━━41.ytho3错误和异常处理-1.MP4[126.7M]┃┃┣━━42.ytho3错误和异常处理-2.MP4[123.9M]┃┃┗━━43.ytho异常处理课后作业-小爬虫.MP4[93.4M]┃┣━━第十九天:htt协议及requet模块使用[2.7G]┃┃┣━━71.htt协议相关知识点.MP4[1.2G]┃┃┣━━72.requet模块的使用-1.MP4[907.7M]┃┃┗━━73.requet模块的使用-2.MP4[631.4M]┃┣━━第十六天:面向对象入门[645.2M]┃┃┣━━54.面向对象入门-1.MP4[81.6M]┃┃┣━━55.类属性、实例属性和实例方法.MP4[129.9M]┃┃┣━━56.类方法、静态方法以及魔术方法.MP4[170.9M]┃┃┣━━57.类的继承.MP4[181.5M]┃┃┗━━58.类的私有化.MP4[81.2M]┃┣━━第十七天:多进程编程[1.1G]┃┃┣━━59.ytho3多进程的概念及入门.MP4[148.2M]┃┃┣━━60.多进程常用方法以及进程关系.MP4[120.7M]┃┃┣━━61.for循环创建多进程方法及其缺点(爬虫演示).MP4[215.3M]┃┃┣━━62.进程池的原理及使用.MP4[245.1M]┃┃┣━━63.使用消息队列实现进程间通信.MP4[187M]┃┃┗━━64.生产者消费者爬虫案例.MP4[189.1M]┃┣━━第十三天:模块和包[522.2M]┃┃┣━━44.ytho模块相关知识.MP4[144.7M]┃┃┣━━45.ytho包相关知识讲解.MP4[190.6M]┃┃┗━━46.将ytho2的日志分析脚本改造成ytho3的.MP4[186.9M]┃┣━━第十四天:正则表达式[536.2M]┃┃┣━━47.ytho正则表达式讲解-1.MP4[129.7M]┃┃┣━━48.ytho正则表达式讲解-2.MP4[127.3M]┃┃┗━━49.ytho正则表达式讲解-3.MP4[279.1M]┃┣━━第十天:函数式编程[755.7M]┃┃┣━━29.循环语句作业讲解.MP4[82.4M]┃┃┣━━30.ytho函数式编程-1.MP4[121.9M]┃┃┣━━31.ytho函数式编程-2.MP4[117.2M]┃┃┣━━32.ytho函数式编程-3.MP4[111.5M]┃┃┣━━33.ytho函数式编程-4.MP4[110.6M]┃┃┣━━34.ytho函数式编程-5.MP4[110.6M]┃┃┗━━35.ytho函数式编程-6.MP4[101.5M]┃┣━━第十五天:urlli库的使用[804.4M]┃┃┣━━50.urlli模块介绍.MP4[162.9M]┃┃┣━━51.urlli模块实战应用-1.MP4[179.6M]┃┃┣━━52.urlli模块实战应用-2.MP4[439.8M]┃┃┗━━53.urlli好段子爬虫复习.MP4[22.1M]┃┣━━第十一天:文件操作[522.8M]┃┃┣━━36.函数课后作业及爬虫演示.MP4[135.2M]┃┃┣━━37.ytho文件操作-1.MP4[106.9M]┃┃┣━━38.ytho文件操作-2.MP4[112.5M]┃┃┣━━39.ytho文件操作-3.MP4[145.8M]┃┃┗━━40.ytho3文件操作之上下文管理器.MP4[22.4M]┃┣━━第四十八天:有道翻译破解[269.4M]┃┃┣━━189.破解有道翻译提交参数介绍.MP4[41.5M]┃┃┣━━190.有道翻译j调试找出提交参数生成方式.MP4[67.2M]┃┃┣━━191.有道翻译代码实现.MP4[80.1M]┃┃┗━━192.整合有道翻译到AI伪原创中.MP4[80.7M]┃┣━━第四十二天:Liux操作系统的安装[152.4M]┃┃┣━━165.Widow上安装VMware虚拟机.MP4[37.3M]┃┃┣━━166.在VMware新建ceto操作系统.MP4[56.8M]┃┃┣━━167.在macOS上安装ceto操作系统.MP4[46.7M]┃┃┗━━168.fialhell连接服务器.MP4[11.7M]┃┣━━第四十六天:采集内容处理实战[443.6M]┃┃┣━━179.根据关键词采集内容脚本优化.MP4[65.8M]┃┃┣━━180.采集内容处理实战-1.MP4[47.4M]┃┃┣━━181.采集内容处理实战-2.MP4[80.3M]┃┃┣━━182.采集内容处理实战-3.MP4[126.9M]┃┃┗━━183.采集内容处理实战-4.MP4[123.1M]┃┣━━第四十七天:AI伪原创[263.6M]┃┃┣━━184.AI伪原创背后的原理.MP4[60.4M]┃┃┣━━185.AI伪原创函数接口编写.MP4[59.3M]┃┃┣━━186.AI伪原创接口封装及校验.MP4[48.1M]┃┃┣━━187.AI智能段落实现.MP4[79.3M]┃┃┗━━188.AI智能段落ug修复.MP4[16.6M]┃┣━━第四十三天:Liux常用命令讲解[181.2M]┃┃┣━━169.Liux常有命令讲解-1.MP4[40.2M]┃┃┣━━170.Liux常有命令讲解-2.MP4[28M]┃┃┣━━171.Liux常有命令讲解-3.MP4[48.4M]┃┃┣━━171.Liux常有命令讲解-4.MP4[40.8M]┃┃┗━━172.Liux常有命令讲解-5.MP4[23.8M]┃┣━━第四十四天:vim编辑器的使用[146.8M]┃┃┣━━173.vim编辑器的使用-1.MP4[51.9M]┃┃┣━━174.vim编辑器的使用-2.MP4[33.6M]┃┃┗━━175.vim编辑器的使用-3.MP4[61.3M]┃┣━━第四十天:cv和excel文件操作[2.4G]┃┃┣━━153.cv文件读写操作.MP4[655.4M]┃┃┣━━154.excel文件读写操作.MP4[655.2M]┃┃┣━━155.将关键词覆盖率结果写入到Excel(上).MP4[557.2M]┃┃┗━━156.将关键词覆盖率结果写入到Excel(下).MP4[584.3M]┃┣━━第四十五天:Liux日志分析讲解[1.1G]┃┃┣━━176.liux日志分析命令讲解-1.MP4[86.4M]┃┃┣━━177.liux日志分析命令讲解-2.MP4[50.6M]┃┃┣━━178.liux日志分析命令讲解-3.MP4[60.1M]┃┃┣━━m.xxx.com-acce.log[950.8M]┃┃┗━━vim编辑器及日志分析常用命令.df[170.3K]┃┣━━第四十一天:网站日志分析工具开发[773.9M]┃┃┣━━157.网站日志分析介绍.MP4[77.2M]┃┃┣━━158.kiaa日志分析演示及日志格式介绍.MP4[118.6M]┃┃┣━━159.Ngix日志补充及正则表达式高级用法.MP4[101.3M]┃┃┣━━160.正则表达式提取日志各部分信息.MP4[58.1M]┃┃┣━━161.正则表达式提取日志中的蜘蛛名称.MP4[99.3M]┃┃┣━━162.Pytho处理日志流程及日志存储说明.MP4[49.7M]┃┃┣━━163.Pytho处理日志代码实现-上.MP4[85.1M]┃┃┗━━164.Pytho处理日志代码实现-下.MP4[184.6M]┃┣━━第四天:列表讲解[408.9M]┃┃┣━━8.字符串复习及课后作业.MP4[92M]┃┃┣━━9.列表的创建和访问.MP4[104.5M]┃┃┗━━10.列表的相关操作及内置函数的用法.MP4[212.4M]┃┣━━第五天:元组讲解[169.6M]┃┃┣━━11.列表课后作业讲解.MP4[38.4M]┃┃┣━━12.元组的创建及相关操作.MP4[79M]┃┃┗━━13.元组的解包和打包操作.MP4[52.2M]┃┗━━第一天:环境搭建[315.7M]┃┗━━1.ytho3环境搭建.MP4[315.7M]┗━━项目代码[5.3G]┣━━day02[15.5K]┃┣━━.idea[13.4K]┃┃┣━━iectioProfile[443B]┃┃┃┗━━Project_Default.xml[443B]┃┃┣━━day01.iml[398B]┃┃┣━━ecodig.xml[260B]┃┃┣━━mic.xml[288B]┃┃┣━━module.xml[262B]┃┃┗━━workace.xml[11.8K]┃┣━━01_ae_ytax.y[1.5K]┃┣━━1.txt[16B]┃┣━━输出.txt[34B]┃┗━━hel_demo.y[669B]┣━━day03[7.2K]┃┣━━课堂笔记.txt[3K]┃┣━━trig_demo1.y[972B]┃┣━━trig_demo2.y[585B]┃┣━━trig_demo3.y[1.2K]┃┣━━trig_demo4.y[237B]┃┣━━trig_demo5.y[691B]┃┗━━trig_demo6.y[561B]┣━━day04[6.5K]┃┣━━课堂笔记.txt[1.8K]┃┣━━demo1.y[450B]┃┣━━demo5.y[368B]┃┣━━format_demo.y[369B]┃┣━━lit1.y[480B]┃┣━━lit2.y[636B]┃┣━━lit3.y[548B]┃┗━━lit4.y[1.9K]┣━━day05[2K]┃┣━━demo1.y[1K]┃┗━━demo2.y[1K]┣━━day06[4.2K]┃┣━━课堂笔记.txt[404B]┃┣━━demo1.y[805B]┃┣━━demo2.y[789B]┃┗━━demo3.y[2.2K]┣━━day07[7.9K]┃┣━━课堂笔记.txt[1K]┃┣━━demo1.y[347B]┃┣━━demo2.y[1.8K]┃┣━━demo3.y[1.1K]┃┣━━demo4.y[2K]┃┣━━demo5.y[1K]┃┣━━demo6.y[213B]┃┗━━demo7.y[428B]┣━━day08[6K]┃┣━━课堂笔记.txt[1.6K]┃┣━━demo1.y[285B]┃┣━━demo2.y[2.4K]┃┗━━demo3.y[1.7K]┣━━day09[4.6K]┃┣━━demo1.y[699B]┃┣━━demo2.y[1.4K]┃┣━━demo3.y[1.2K]┃┗━━demo4.y[1.3K]┣━━day10[11K]┃┣━━课堂笔记.txt[1.7K]┃┣━━demo1.y[1.6K]┃┣━━demo10.y[389B]┃┣━━demo11.y[474B]┃┣━━demo12.y[420B]┃┣━━demo13.y[395B]┃┣━━demo2.y[587B]┃┣━━demo3.y[733B]┃┣━━demo4.y[773B]┃┣━━demo5.y[442B]┃┣━━demo6.y[361B]┃┣━━demo7.y[663B]┃┣━━demo8.y[438B]┃┣━━demo9.y[675B]┃┣━━gue_umer_eta2.y[791B]┃┗━━gue_umer.y[757B]┣━━day11[109.1K]┃┣━━awe[12B]┃┃┗━━1.txt[12B]┃┣━━hige[421B]┃┃┗━━hige.txt[421B]┃┣━━课堂笔记.txt[742B]┃┣━━demo1.y[809B]┃┣━━demo1.y.ak[809B]┃┣━━demo2.y[352B]┃┣━━demo3.y[413B]┃┣━━demo4.y[440B]┃┣━━demo5.y[154B]┃┣━━demo6.y[725B]┃┣━━demo7.y[527B]┃┣━━demo8.y[229B]┃┣━━hao.y[408B]┃┣━━1.jg[51.3K]┃┣━━2.jg[51.3K]┃┣━━ider.y[401B]┃┣━━tet01.txt[146B]┃┗━━tet02.txt[15B]┣━━day12[3.1K]┃┣━━1.txt[13B]┃┣━━课堂笔记.txt[584B]┃┣━━cotext_demo.y[147B]┃┣━━demo1.y[369B]┃┣━━demo2.y[202B]┃┣━━demo3.y[331B]┃┣━━demo4.y[377B]┃┣━━demo5.y[400B]┃┣━━demo6.y[532B]┃┗━━demo7.y[183B]┣━━day13[5.3K]┃┣━━ycache[0B]┃┣━━eotool[3.1K]┃┃┣━━ycache[1.6K]┃┃┃┣━━iit.cytho-36.yc[242B]┃┃┃┣━━checkidex.cytho-36.yc[188B]┃┃┃┗━━titleider.cytho-36.yc[1.2K]┃┃┣━━iit.y[27B]┃┃┣━━checkidex.y[75B]┃┃┗━━titleider.y[1.4K]┃┣━━课堂笔记.txt[1008B]┃┣━━demo1.y[307B]┃┣━━demo2.y[295B]┃┣━━demo3.y[271B]┃┗━━demo4.y[366B]┣━━day14┣━━day15[4K]┃┣━━duazi[0B]┃┣━━课堂笔记.txt[1K]┃┗━━demo1.y[2.9K]┣━━day16[14.4K]┃┣━━ycache[576B]┃┃┗━━demo11.cytho-36.yc[576B]┃┣━━课堂笔记.txt[4.1K]┃┣━━demo1.y[999B]┃┣━━demo10.y[800B]┃┣━━demo11.y[295B]┃┣━━demo12.y[103B]┃┣━━demo2.y[728B]┃┣━━demo3.y[1.1K]┃┣━━demo4.y[1.7K]┃┣━━demo5.y[627B]┃┣━━demo6.y[372B]┃┣━━demo7.y[1.5K]┃┣━━demo8.y[1.1K]┃┗━━demo9.y[432B]┣━━day17[15.5K]┃┣━━课堂笔记.txt[643B]┃┣━━demo1.y[580B]┃┣━━demo10.y[1.3K]┃┣━━demo11.y[386B]┃┣━━demo12.y[789B]┃┣━━demo13.y[1.2K]┃┣━━demo14.y[2K]┃┣━━demo2.y[513B]┃┣━━demo3.y[481B]┃┣━━demo4.y[476B]┃┣━━demo5.y[473B]┃┣━━demo6.y[1.2K]┃┣━━demo7.y[1.3K]┃┣━━demo8.y[1.6K]┃┣━━demo9.y[1.2K]┃┗━━lik.txt[1.4K]┣━━day18[15.7K]┃┣━━课堂笔记.txt[1.3K]┃┣━━demo1.y[550B]┃┣━━demo10.y[1.1K]┃┣━━demo11.y[913B]┃┣━━demo12.y[751B]┃┣━━demo13.y[2.2K]┃┣━━demo14.y[140B]┃┣━━demo2.y[1.7K]┃┣━━demo3.y[568B]┃┣━━demo4.y[507B]┃┣━━demo5.y[2K]┃┣━━demo6.y[557B]┃┣━━demo7.y[438B]┃┣━━demo8.y[683B]┃┣━━demo9.y[1.1K]┃┗━━lik.txt[1.4K]┣━━day19[4.3K]┃┣━━课堂笔记.txt[348B]┃┣━━demo1.y[622B]┃┣━━demo2.y[232B]┃┣━━demo3.y[938B]┃┣━━demo4.y[338B]┃┣━━demo5.y[650B]┃┣━━demo6.y[539B]┃┣━━demo7.y[179B]┃┣━━demo8.y[157B]┃┗━━demo9.y[411B]┣━━day20[25.6K]┃┣━━课堂笔记.txt[2.1K]┃┣━━demo1.y[1.2K]┃┣━━demo2.y[2K]┃┣━━demo3.y[4.4K]┃┣━━demo4.y[4K]┃┣━━demo5.y[838B]┃┗━━ytho-loomfilter-mater.zi[11K]┣━━day21[190K]┃┣━━jiahu[0B]┃┣━━课堂笔记.txt[663B]┃┣━━demo1.y[1.2K]┃┣━━demo2.y[1.2K]┃┣━━demo3.y[3.4K]┃┣━━demo4.y[1.7K]┃┗━━reult.cv[181.9K]┣━━day23[10.5K]┃┣━━课堂笔记.txt[1.6K]┃┣━━demo1.y[661B]┃┣━━demo2.y[643B]┃┣━━demo3.y[744B]┃┣━━demo4.y[639B]┃┣━━demo5.y[798B]┃┣━━demo6.y[884B]┃┣━━demo7.y[3.8K]┃┗━━demo8.y[836B]┣━━day24[183.2K]┃┣━━课堂笔记.txt[148B]┃┣━━check.txt[19B]┃┣━━demo1.y[2.6K]┃┣━━demo2.y[3.8K]┃┣━━demo3.y[126B]┃┣━━demo4.y[2.6K]┃┗━━reult.txt[174K]┣━━day25[363.7K]┃┣━━demo1.y[4K]┃┣━━demo2.y[348B]┃┣━━demo3.y[263B]┃┣━━demo4.y[380B]┃┣━━demo5.y[292B]┃┣━━demo6.y[317B]┃┣━━demo7.y[643B]┃┣━━demo8.y[2K]┃┣━━keyword.txt[174K]┃┣━━mydict.txt[19B]┃┣━━reult.cv[178.8K]┃┗━━tet.txt[2.7K]┣━━day26[63.1K]┃┣━━demo1.y[2.3K]┃┣━━demo2.y[2.8K]┃┣━━demo3.y[3.9K]┃┣━━kw.txt[26B]┃┗━━reult.txt[54K]┣━━day27[54.3K]┃┣━━luextracter.zi[4.5K]┃┣━━demo1.y[4.1K]┃┣━━demo2.y[801B]┃┣━━demo3.y[547B]┃┣━━demo4.y[6.6K]┃┣━━kw.txt[549B]┃┗━━reult.txt[37.4K]┣━━day28[19.8K]┃┣━━织梦cm免登陆发布接口[14.7K]┃┃┣━━DedeCMS5.7免登陆文章发布接口使用说明.txt[3.8K]┃┃┗━━jiekou.h[10.9K]┃┣━━arturl.txt[506B]┃┣━━demo1.y[1.2K]┃┣━━demo2.y[771B]┃┣━━demo3.y[217B]┃┗━━demo4.y[2.5K]┣━━day29[14.7M]┃┣━━帝国cm免登陆发布接口[6.2M]┃┃┣━━EmireCMS_7.5_SC_UTF8.zi[6.2M]┃┃┣━━emirecm字段信息.txt[656B]┃┃┣━━jiekou_v7.2.h[2.3K]┃┃┣━━jiekou_v7.5.h[2.3K]┃┃┗━━jiekou.h[2.3K]┃┣━━hcm免登陆发布接口[8.4M]┃┃┣━━jiekou.h[3.2K]┃┃┣━━hcm_v9.6.3_UTF8.zi[8.4M]┃┃┣━━hcm接口说明.txt[329B]┃┃┗━━hcm字段信息.txt[967B]┃┣━━demo1.y[2.6K]┃┣━━demo2.y[1.7K]┃┗━━demo3.y[2.3K]┣━━day30[7.1K]┃┣━━课堂笔记.txt[1.1K]┃┣━━articleid.txt[30B]┃┣━━demo1.y[627B]┃┣━━demo2.y[436B]┃┣━━demo3.y[2.5K]┃┣━━demo4.y[2.2K]┃┣━━demo5.y[222B]┃┗━━itecofig.txt[29B]┣━━day31[10.3K]┃┣━━demo1.y[1.6K]┃┣━━demo2.y[3.8K]┃┣━━demo3.y[4.4K]┃┗━━kw.txt[416B]┣━━day32[9.6K]┃┣━━demo1.y[4K]┃┣━━demo2.y[5.2K]┃┗━━kw.txt[416B]┣━━day33[9.4K]┃┣━━check.cv[1.7K]┃┣━━demo1.y[3K]┃┣━━demo2.y[4.1K]┃┗━━lik.txt[586B]┣━━day34[8.8K]┃┣━━checkreult.cv[1.6K]┃┣━━demo1.y[1.9K]┃┣━━demo2.y[4.8K]┃┗━━lik.txt[586B]┣━━day35[11.1K]┃┣━━demo1.y[4.1K]┃┣━━demo2.y[6.4K]┃┗━━lik.txt[611B]┣━━day36[5.9K]┃┣━━a.kl[42B]┃┣━━demo1.y[333B]┃┣━━demo2.y[1.9K]┃┗━━demo3.y[3.6K]┣━━day37[5.1K]┃┗━━demo1.y[5.1K]┣━━day38[135.2K]┃┣━━cookie.txt[758B]┃┣━━demo1.y[2.9K]┃┣━━kw.txt[94B]┃┣━━reult.txt[121K]┃┗━━reult.txt[10.4K]┣━━day39[1.9M]┃┣━━demo1.y[4.3K]┃┣━━demo2.y[321B]┃┣━━demo3.y[632B]┃┣━━keyword.txt[28.5K]┃┣━━Pifile[174B]┃┣━━Pifile.lock[4.3K]┃┣━━requiremet.txt[157B]┃┗━━reult.jo[1.9M]┣━━day40[1.9M]┃┣━━demo.xlx[4.6K]┃┣━━demo1.cv[322B]┃┣━━demo1.y[985B]┃┣━━demo1.xlx[6.9K]┃┣━━demo2.cv[580B]┃┣━━demo2.y[294B]┃┣━━demo2.xlx[5.7K]┃┣━━demo3.y[345B]┃┣━━demo4.y[712B]┃┣━━demo5.y[1.4K]┃┣━━reult.jo[1.2M]┃┗━━reult.xlx[671.3K]┣━━day41[13.6M]┃┣━━20190504.log[12.7M]┃┣━━demo1.y[9.1K]┃┣━━c_20181003.log[741.2K]┃┗━━xxx.c.xlx[142.3K]┣━━day42[5.3G]┃┣━━CetOS-7-x86_64-DVD-1810.io[4.3G]┃┣━━fialhell_itall.exe[66.4M]┃┣━━fialhell_itall.kg[95.2M]┃┣━━VMwareFuioPro_11.1.1_WaitU.com.dmg[483.2M]┃┣━━VMware-worktatio-full-12.5.7-5813279.exe[404.9M]┃┗━━vmware序列号.txt[142B]┣━━day46[19.9K]┃┣━━adword.txt[184B]┃┣━━demo1.y[6.7K]┃┣━━demo2.y[3.5K]┃┣━━failed.txt[0B]┃┣━━kw.txt[513B]┃┗━━t.txt[9K]┣━━day47[7.3K]┃┣━━ai.txt[898B]┃┣━━demo.txt[3.6K]┃┗━━demo1.y[2.7K]┗━━day48[20K]┣━━ycache[6.8K]┃┗━━demo1.cytho-38.yc[6.8K]┣━━demo.txt[3.6K]┣━━demo1.y[6.7K]┗━━demo2.y[2.8K]课程目录:ytho与elk打造数据分析监控系统实战课程[15.1G]┣━━第二部分:elk基础入门[10.3G]┃┣━━第八课:QueryDSL全文搜索讲解-上[297.2M]┃┃┣━━脚本[15K]┃┃┃┣━━luextracter.zi[4.5K]┃┃┃┣━━crawler.y[8.3K]┃┃┃┗━━keyword.txt[2.1K]┃┃┣━━课件[57.1K]┃┃┃┗━━14.QueryDSL查询语句讲解-上.df[57.1K]┃┃┗━━视频[297.1M]┃┃┣━━38.全文搜索准备(根据关键词自动获取文章).m4[51.4M]┃┃┣━━39.布尔查询讲解-上.m4[63.8M]┃┃┣━━40.布尔查询讲解-下.m4[53.3M]┃┃┣━━41.提权查询用法讲解.m4[43.8M]┃┃┣━━42.匹配查询用法讲解.m4[20.7M]┃┃┣━━43.匹配布尔前缀查询讲解.m4[30M]┃┃┗━━44.短语和短语前缀匹配查询讲解.m4[34M]┃┣━━第二课:ELaticearch初探[172.3M]┃┃┣━━课件[865K]┃┃┃┗━━8.ELaticearch初探.df[865K]┃┃┗━━视频[171.4M]┃┃┣━━11.e集群和节点介绍及配置.m4[57.2M]┃┃┣━━12.索引类型文档_分片和副本介绍及索引相关操作.m4[33.9M]┃┃┣━━13.文档的简单增删改查操作.m4[21.4M]┃┃┣━━14.e配置文件介绍及局域网IP访问配置.m4[28.8M]┃┃┗━━15.kiaa配置文件介绍.m4[30.1M]┃┣━━第九课:QueryDSL全文搜索讲解-中[137.3M]┃┃┣━━课件[0B]┃┃┗━━视频[137.3M]┃┃┣━━45.多匹配查询用法讲解.m4[47.2M]┃┃┣━━46.查询字符串查询语法讲解.m4[65.5M]┃┃┗━━47.简单字符串查询语法了解.m4[24.7M]┃┣━━第六课:文档相关操作[138.4M]┃┃┣━━课件[59.8K]┃┃┃┗━━12.e文档相关操作.df[59.8K]┃┃┗━━视频[138.3M]┃┃┣━━29.自动创建索引相关设置.m4[45.9M]┃┃┣━━30.文档创建时的操作类型及自动生成id.m4[19.4M]┃┃┣━━31.获取文档的更多操作.m4[22.4M]┃┃┣━━32.删除和更新文档.m4[36.4M]┃┃┗━━33.重新索引reidex的使用.m4[14.2M]┃┣━━第七课:URI搜索接口讲解[154.5M]┃┃┣━━课件[41.3K]┃┃┃┗━━13.ESURI搜索接口讲解.df[41.3K]┃┃┗━━视频[154.4M]┃┃┣━━34.ES搜索之Pytho脚本批量添加关键词.m4[31.6M]┃┃┣━━35.URI搜索接口讲解-上.m4[38.3M]┃┃┣━━36.URI搜索接口讲解-下.m4[31.1M]┃┃┗━━37.请求体搜索接口讲解.m4[53.4M]┃┣━━第三课:e常用ai接口[85.9M]┃┃┣━━视频[85.9M]┃┃┃┣━━16.ai公共参数介绍.m4[26.1M]┃┃┃┣━━17.catai相关使用介绍.m4[32.7M]┃┃┃┗━━18.cluterai相关使用介绍.m4[27M]┃┃┗━━资料[84.3K]┃┃┗━━9.e常用常用API介绍.df[84.3K]┃┣━━第十二课:Liux常用命令讲解[181.6M]┃┃┣━━课件[463.2K]┃┃┃┣━━ceto7命令教程.html[208.7K]┃┃┃┗━━liux命令笔记.df[254.4K]┃┃┗━━视频[181.2M]┃┃┣━━57.Liux常有命令讲解-1.m4[40.2M]┃┃┣━━58.Liux常有命令讲解-2.m4[28M]┃┃┣━━59.Liux常有命令讲解-3.m4[48.4M]┃┃┣━━60.Liux常有命令讲解-4.m4[40.8M]┃┃┗━━61.Liux常有命令讲解-5.m4[23.8M]┃┣━━第十课:QueryDSL全文搜索讲解-下[160.5M]┃┃┣━━课件[42.4K]┃┃┃┗━━16.术语级别查询讲解.df[42.4K]┃┃┗━━视频[160.4M]┃┃┣━━48.exit查询讲解.m4[12.2M]┃┃┣━━49.rage查询讲解.m4[62.5M]┃┃┣━━50.正则表达式查询(了解).m4[29.5M]┃┃┣━━51.term和term查询讲解.m4[38.3M]┃┃┗━━52.通配符查询讲解.m4[18.1M]┃┣━━第十三课:vim编辑器的使用[146.9M]┃┃┣━━课件[153.4K]┃┃┃┗━━vim编辑器及日志分析常用命令.df[153.4K]┃┃┗━━视频[146.8M]┃┃┣━━62.vim编辑器的使用-1.m4[51.9M]┃┃┣━━63.vim编辑器的使用-2.m4[33.6M]┃┃┗━━64.vim编辑器的使用-3.m4[61.3M]┃┣━━第十四课:Liux日志分析[1.1G]┃┃┣━━65.liux日志分析命令讲解-1.m4[86.4M]┃┃┣━━66.liux日志分析命令讲解-2.m4[50.6M]┃┃┣━━67.liux日志分析命令讲解-3.m4[60.1M]┃┃┣━━m.xxx.com-acce.log[950.8M]┃┃┗━━vim编辑器及日志分析常用命令.df[170.3K]┃┣━━第十一课:Liux操作系统安装[5.4G]┃┃┣━━软件安装包[5.3G]┃┃┃┣━━CetOS-7-x86_64-DVD-1810.io[4.3G]┃┃┃┣━━fialhell_itall.exe[66.4M]┃┃┃┣━━fialhell_itall.kg[95.2M]┃┃┃┣━━VMwareFuioPro_11.1.1_WaitU.com.dmg[483.2M]┃┃┃┣━━VMware-worktatio-full-12.5.7-5813279.exe[404.9M]┃┃┃┗━━vmware序列号.txt[142B]┃┃┗━━视频[152.4M]┃┃┣━━53.Widow上安装VMware虚拟机.m4[37.3M]┃┃┣━━54.在VMware新建ceto操作系统.m4[56.8M]┃┃┣━━55.在macOS上安装ceto操作系统.m4[46.7M]┃┃┗━━56.fialhell连接服务器.m4[11.7M]┃┣━━第四课:e索引相关操作[142.4M]┃┃┣━━课件[4.4M]┃┃┃┣━━10.e索引相关操作.df[64.8K]┃┃┃┗━━elaticearch-aalyi-ik-7.2.0.zi[4.3M]┃┃┗━━视频[138.1M]┃┃┣━━19.e索引的创建及自定义设置.m4[23.5M]┃┃┣━━20.e索引的删除、获取、开关等操作.m4[21.5M]┃┃┣━━21.e更新索引的默认设置.m4[23.4M]┃┃┣━━22.e默认分析器及自定义分析器的使用.m4[19.8M]┃┃┗━━23.ik中文分析器的安装和使用.m4[49.9M]┃┣━━第五课:maig讲解[212.1M]┃┃┣━━课件[82.8K]┃┃┃┗━━11.ELaticearchmaig讲解.df[82.8K]┃┃┗━━视频[212M]┃┃┣━━24.maig的介绍及数组类型讲解.m4[42.1M]┃┃┣━━25.date类型讲解.m4[49.3M]┃┃┣━━26.keyword和text类型讲解.m4[64.2M]┃┃┣━━27.数字类型讲解.m4[29.3M]┃┃┗━━28.嵌套类型和对象类型讲解.m4[27.1M]┃┗━━第一课:elk介绍安装及启动[2G]┃┣━━课件[4.4M]┃┃┗━━7.ELK的介绍和安装.df[4.4M]┃┣━━软件安装包[1.6G]┃┃┣━━elaticearch-7.2.0-darwi-x86_64.tar.gz[310.7M]┃┃┣━━elaticearch-7.2.0-liux-x86_64.tar.gz[321.1M]┃┃┣━━elaticearch-7.2.0-widow-x86_64.zi[314.8M]┃┃┣━━kiaa-7.2.0-darwi-x86_64.tar.gz[203.2M]┃┃┣━━kiaa-7.2.0-liux-x86_64.tar.gz[203.3M]┃┃┗━━kiaa-7.2.0-widow-x86_64.zi[235.1M]┃┗━━视频[414.7M]┃┣━━7.elk的介绍和下载.m4[37.6M]┃┣━━8.在mac上安装e和kiaa.m4[62.5M]┃┣━━9.在widow上安装e和kiaa.m4[129M]┃┗━━10.在liux上安装e和kiaa.m4[185.5M]┣━━第六部分:百度专利[90.2M]┃┗━━第一天:百度去重算法讲解[90.2M]┃┣━━121.百度去重专利算法讲解-1.m4[59.8M]┃┣━━122.百度去重专利算法讲解-2.m4[28.7M]┃┣━━百度去重算法.g[1.4M]┃┗━━百度去重算法.xmid[260.3K]┣━━第三部分:Pytho操作ES[282.9M]┃┣━━代码[5K]┃┃┣━━e-demo1.y[167B]┃┃┣━━e-demo2.y[317B]┃┃┣━━e-demo3.y[1.7K]┃┃┣━━e-demo4.y[797B]┃┃┣━━e-demo5.y[701B]┃┃┣━━e-demo6.y[173B]┃┃┗━━e-demo7.y[1.3K]┃┗━━视频[282.9M]┃┣━━68.elaticearch模块的安装.m4[20.3M]┃┣━━69.elaticearch模块文档介绍和简单接口使用.m4[39.7M]┃┣━━70.elaticearch模块实例说明.m4[29.7M]┃┣━━71.Pytho对elaticearch索引进行增删改查.m4[67.6M]┃┣━━72.ytho对ELaticearch增加文档操作.m4[38.8M]┃┣━━73.ytho对ELaticearch进行更新和删除文档操作.m4[33.6M]┃┗━━74.ytho对ELaticearch进行文档搜索操作.m4[53.2M]┣━━第四部分:数据分析实战[851.1M]┃┣━━链接收录监控[150M]┃┃┣━━脚本[4.6M]┃┃┃┗━━aidu[4.6M]┃┃┃┣━━ycache[2.5K]┃┃┃┃┣━━maig.cytho-37.yc[680B]┃┃┃┃┗━━util.cytho-37.yc[1.8K]┃┃┃┣━━alum.txt[4.1M]┃┃┃┣━━cookie.txt[1.1K]┃┃┃┣━━detail.txt[21.8K]┃┃┃┣━━keywordcover.y[7.2K]┃┃┃┣━━keyword.txt[27.7K]┃┃┃┣━━maig.y[2.4K]┃┃┃┣━━ua.txt[795B]┃┃┃┣━━urlidex.y[6.4K]┃┃┃┣━━util.y[1.6K]┃┃┃┗━━zhuajiurl.txt[412.5K]┃┃┗━━视频[145.4M]┃┃┣━━86.域名链接收录监控-1.m4[91.2M]┃┃┗━━87.域名链接收录监控-2.m4[54.2M]┃┣━━排名监控[194.8M]┃┃┣━━脚本[42.3K]┃┃┃┗━━aidu[42.3K]┃┃┃┣━━ycache[2.4K]┃┃┃┃┣━━maig.cytho-37.yc[544B]┃┃┃┃┗━━util.cytho-37.yc[1.8K]┃┃┃┣━━cookie.txt[1.1K]┃┃┃┣━━keywordcover.y[7.3K]┃┃┃┣━━keyword.txt[27.7K]┃┃┃┣━━maig.y[1.5K]┃┃┃┣━━ua.txt[795B]┃┃┃┗━━util.y[1.6K]┃┃┗━━视频[194.7M]┃┃┣━━83.百度关键词排名监控-1.m4[84.6M]┃┃┣━━84.百度关键词排名监控-2.m4[49.3M]┃┃┗━━85.百度关键词排名监控-3.m4[60.9M]┃┣━━日志分析[287.1M]┃┃┣━━代码[15.8K]┃┃┃┣━━logaalyi.y[9.1K]┃┃┃┗━━logger_aalyi.y[6.7K]┃┃┗━━视频[287M]┃┃┣━━75.日志分析之数据导入.m4[65M]┃┃┣━━76.kiaadicover数据探索.m4[47.5M]┃┃┣━━77.kiaa数据图表的制作和展示-1.m4[38M]┃┃┣━━78.kiaa数据图表的制作和展示-2.m4[74M]┃┃┗━━79.kiaa数据图表的制作和展示-3.m4[62.6M]┃┗━━收录监控[219.3M]┃┣━━脚本[10.2K]┃┃┣━━domai_moitor.y[10.1K]┃┃┗━━domai.txt[137B]┃┗━━视频[219.3M]┃┣━━80.域名收录监控之数据查询和校验.m4[107.8M]┃┣━━81.数据的重新处理和图表制作-1.m4[73.8M]┃┗━━82.数据的重新处理和图表制作-2.m4[37.7M]┣━━第五部分:网站搭建[3.1G]┃┣━━第二天[406.9M]┃┃┣━━脚本[7.7K]┃┃┃┣━━dedecm_rewrite.txt[1K]┃┃┃┣━━demo4.y[2.6K]┃┃┃┗━━duawexue.y[4.1K]┃┃┣━━模板[111.5K]┃┃┃┗━━wj[111.5K]┃┃┃┣━━tatic[105.4K]┃┃┃┃┣━━category.jg[17.1K]┃┃┃┃┣━━icofot.woff[7.9K]┃┃┃┃┣━━idex_decorate_left.g[15.2K]┃┃┃┃┣━━idex_decorate_right.g[19.3K]┃┃┃┃┣━━jquery.commo.j[5.7K]┃┃┃┃┣━━jquery.lide.j[1.2K]┃┃┃┃┣━━logo.g[7.7K]┃┃┃┃┗━━tyle.c[31.4K]┃┃┃┗━━idex.htm[6.2K]┃┃┗━━视频[406.7M]┃┃┣━━92.ytho发布准备素材内容到后台栏目.m4[93.5M]┃┃┣━━93.dedecm首页模板制作-1.m4[103.6M]┃┃┣━━94.dedecm首页模板制作-2.m4[108.1M]┃┃┣━━95.dedecm首页模板制作-3.m4[62.9M]┃┃┗━━96.dedecm首页模板制作-4.m4[38.7M]┃┣━━第六天[934.9M]┃┃┣━━软件[684.7M]┃┃┃┣━━dedecm.zi[7.8M]┃┃┃┣━━lm1.6-full.tar.gz[676.7M]┃┃┃┗━━wj.zi[148.3K]┃┃┗━━视频[250.3M]┃┃┣━━113.ceto服务器上安装lm环境-1.m4[38.6M]┃┃┣━━114.ceto服务器上安装lm环境-2.m4[31.7M]┃┃┣━━115.lm添加网站.m4[22.4M]┃┃┣━━116.ceto上安装dedecm.m4[56.2M]┃┃┣━━117.模板配置和Ngix配置.m4[56.7M]┃┃┗━━118.移动站的配置.m4[44.7M]┃┣━━第七天[100.2M]┃┃┣━━视频[100.2M]┃┃┃┣━━119.dedecm安全配置.m4[44.1M]┃┃┃┗━━120.内容处理的一些建议和技巧提示.m4[56.1M]┃┃┗━━文档[295B]┃┃┗━━liux安全配置.txt[295B]┃┣━━第三天[478.8M]┃┃┣━━视频[453.6M]┃┃┃┣━━97.mac上配置PHP集成开发环境.m4[38.4M]┃┃┃┣━━98.dedecm数据还原和伪静态.m4[77.2M]┃┃┃┣━━99.公共部分模板分离调用.m4[39.1M]┃┃┃┣━━100.列表页模板制作.m4[82.3M]┃┃┃┣━━101.频道页模板制作.m4[47.8M]┃┃┃┣━━102.文章详情页模板制作-1.m4[110.4M]┃┃┃┗━━103.文章详情页模板制作-2.m4[58.5M]┃┃┗━━文档[25.3M]┃┃┣━━wj[120K]┃┃┃┣━━tatic[105.2K]┃┃┃┃┣━━category.jg[17.1K]┃┃┃┃┣━━icofot.woff[7.9K]┃┃┃┃┣━━idex_decorate_left.g[15.2K]┃┃┃┃┣━━idex_decorate_right.g[19.3K]┃┃┃┃┣━━jquery.commo.j[5.7K]┃┃┃┃┣━━jquery.lide.j[1.2K]┃┃┃┃┣━━logo.g[7.7K]┃┃┃┃┗━━tyle.c[31.3K]┃┃┃┣━━article_article.htm[4.7K]┃┃┃┣━━foot.htm[1K]┃┃┃┣━━head.htm[2.2K]┃┃┃┣━━idex_article.htm[1.2K]┃┃┃┣━━idex.htm[3.3K]┃┃┃┗━━lit_article.htm[2.4K]┃┃┣━━ackudata.zi[25.1M]┃┃┗━━dedecm模板标签语法.md[20K]┃┣━━第四天[585.1M]┃┃┣━━视频[584.9M]┃┃┃┣━━104.移动站首页模板制作-1.m4[117.1M]┃┃┃┣━━105.移动站首页模板制作-2.m4[161.7M]┃┃┃┣━━106.移动站列表页模板制作-1.m4[115.3M]┃┃┃┣━━107.移动站列表页模板制作-2.m4[57.7M]┃┃┃┣━━108.移动站详情页模板制作-1.m4[100.9M]┃┃┃┗━━109.移动站详情页模板制作-2.m4[32.3M]┃┃┗━━文档[184.2K]┃┃┣━━wj[164.2K]┃┃┃┣━━tatic[137.5K]┃┃┃┃┣━━category.jg[17.1K]┃┃┃┃┣━━ico-logo.g[3.7K]┃┃┃┃┣━━icofot.woff[7.9K]┃┃┃┃┣━━idex_decorate_left.g[15.2K]┃┃┃┃┣━━idex_decorate_right.g[19.3K]┃┃┃┃┣━━jquery.commo-m.j[1.3K]┃┃┃┃┣━━jquery.commo.j[3.2K]┃┃┃┃┣━━jquery.lide.j[1.2K]┃┃┃┃┣━━logo.g[7.7K]┃┃┃┃┣━━rite.g[1.1K]┃┃┃┃┣━━tyle-m.c[27.1K]┃┃┃┃┣━━tyle.c[31.3K]┃┃┃┃┗━━to-to.g[1.5K]┃┃┃┣━━article_article_m.htm[3.7K]┃┃┃┣━━article_article.htm[4.7K]┃┃┃┣━━foot_m.htm[1.1K]┃┃┃┣━━foot.htm[989B]┃┃┃┣━━head_m.htm[1.5K]┃┃┃┣━━head.htm[2.2K]┃┃┃┣━━idex_article_m.htm[1.4K]┃┃┃┣━━idex_article.htm[1.2K]┃┃┃┣━━idex_m.htm[2.6K]┃┃┃┣━━idex.htm[3.3K]┃┃┃┣━━lit_article_m.htm[1.6K]┃┃┃┗━━lit_article.htm[2.4K]┃┃┗━━dedecm模板标签语法.md[20K]┃┣━━第五天[188.4M]┃┃┣━━视频[188.2M]┃┃┃┣━━110.PC站标签页和标签列表页的模板制作.m4[93.8M]┃┃┃┣━━111.移动站标签页和标签列表页的模板制作.m4[67.6M]┃┃┃┗━━112.xml格式网站地图制作.m4[26.9M]┃┃┗━━资料[173.7K]┃┃┗━━wj[173.7K]┃┃┣━━tatic[137.8K]┃┃┃┣━━category.jg[17.1K]┃┃┃┣━━ico-logo.g[3.7K]┃┃┃┣━━icofot.woff[7.9K]┃┃┃┣━━idex_decorate_left.g[15.2K]┃┃┃┣━━idex_decorate_right.g[19.3K]┃┃┃┣━━jquery.commo-m.j[1.3K]┃┃┃┣━━jquery.commo.j[3.2K]┃┃┃┣━━jquery.lide.j[1.2K]┃┃┃┣━━logo.g[7.7K]┃┃┃┣━━rite.g[1.1K]┃┃┃┣━━tyle-m.c[27.3K]┃┃┃┣━━tyle.c[31.4K]┃┃┃┗━━to-to.g[1.5K]┃┃┣━━article_article_m.htm[3.8K]┃┃┣━━article_article.htm[4.9K]┃┃┣━━foot_m.htm[1.1K]┃┃┣━━foot.htm[989B]┃┃┣━━head_m.htm[1.5K]┃┃┣━━head.htm[2.2K]┃┃┣━━idex_article_m.htm[1.5K]┃┃┣━━idex_article.htm[1.2K]┃┃┣━━idex_m.htm[2.6K]┃┃┣━━idex.htm[3.3K]┃┃┣━━lit_article_m.htm[1.7K]┃┃┣━━lit_article.htm[2.4K]┃┃┣━━itema_m.htm[795B]┃┃┣━━itema.htm[802B]┃┃┣━━tag_m.htm[1.1K]┃┃┣━━tag.htm[2K]┃┃┣━━taglit_m.htm[1.6K]┃┃┗━━taglit.htm[2.5K]┃┗━━第一天[493.7M]┃┣━━脚本[2.4K]┃┃┗━━duawexue.y[2.4K]┃┣━━软件和课件[8.1M]┃┃┣━━dede布鲁.zi[7.9M]┃┃┣━━dedecm模板标签语法.md[18.9K]┃┃┗━━dedecm模板标签语法.df[174K]┃┗━━视频[485.7M]┃┣━━88.h环境搭建及dedecm安装.m4[54.4M]┃┣━━89.dedecm后台配置及火车头使用.m4[151.8M]┃┣━━90.用ytho抓取短文学文章内容-1.m4[83.8M]┃┗━━91.用ytho抓取短文学文章内容-2.m4[195.6M]┗━━第一部分:Pytho基础[470.5M]┣━━课件和代码[9.8M]┃┣━━1.ytho环境搭建.df[1.8M]┃┣━━2.Pytho常用IDE的安装和配置.df[4.4M]┃┣━━4.如何正确的运行Pytho.df[1.4M]┃┣━━5.ytho常见错误.df[581.7K]┃┣━━6.ytho安装第三方包的方法.df[1.6M]┃┣━━demo1.y[146B]┃┣━━demo2.y[103B]┃┣━━demo3.y[213B]┃┗━━requet-1.y[0B]┗━━视频[460.7M]┣━━1.Pytho环境搭建.m4[71.8M]┣━━2.ytho常用的IDE介绍和安装配置.m4[80.5M]┣━━3.ycharm初始配置讲解.m4[49.2M]┣━━4.正确运行Pytho的N种方法.m4[62M]┣━━5.Pytho运行常见的几个错误总结.m4[54.9M]┗━━6.Pytho第三方包常用安装方法.m4[142.3M]应版权方要求,相关课程删除下载地址,请大家支持正版。...

    2022-04-02 接口开发python 接口开发指的是什么

  • Java Springboot2.0开发头条项目实战教程(讲义+视频+资料+代码完整版),百度网盘,阿里云盘下载

    大家从今天开始讲一个叫黑马头条的新项目,类似于今天的头条,主要是把一些文章信息推给用户,分为11天!第一天:项目背景和架构...

    2022-04-03

  • Python代码重构指南,老师Bryan Beecham完结,百度网盘,阿里云盘下载

    本套课程由BryaBeecham,全球知名敏捷发展教练主讲:Pytho代码重构指南。重构是软件改进的核心,它使软件具有更好的结构和性能,使代码更容易理解、修改和扩展。虽然重建不是新事物,但软件开发人员仍然担心如何正确重建。随着敏捷运动的发展,DevO等概念不断追求高质量、精心设计的代码,实现更快的部署和反馈。然而,许多关于重建的教程都是基于Java语言,关于Pytho很少。在这门课程中,BryaBeecham将使用Pytho语言,向您展示如何识别代码中的问题,如何进行必要的更改,以创建可以快速开发的高质量软件,以及如何有效地重建,以改进和简化您的软件设计工作。Pytho代码重构指南视频随机截图学完这门课程您将获得:学习如何改进和简化软件设计;快速识别Pytho代码中常见的问题;掌握高效的代码重构技能;使用TDD优化现有的开发过程。课程目录:C-Pytho代码重构指南[634.9M]┣━━第二章:识别代码中的问题(15).m4[80.4M]┣━━第六章:与他人合作的好处(3).m4[18.5M]┣━━第七章:测试在重构中的作用(5).m4[23.6M]┣━━第三章:常见的重构技巧(8讲).m4[51.1M]┣━━第四章:重构实战(11讲)-1.m4[209.3M]┣━━第四章:重构实战(11讲)-2.m4[167.4M]┣━━第五章:内部重构(6).m4[29.6M]┣━━第一章:重构基础(11讲).m4[55M]相关下载点击下载...

    2022-04-03 代码重构五大原则 代码重构是什么意思

  • 大话代码架构:项目实战版(txt+pdf+epub+mobi电子书下载)|百度网盘下载

    作者:田伟,郎小娇出版社:机械工业出版社格式:AZW3,DOCX,EPUB,MOBI,PDF,TXT大话代码架构:项目实战版试读:前言架构(Architecture)是什么?可能每个人给出的答案都不同。业界流行一句笑话:Architectureiliketeeageex,everyodytalkaoutit,oodyreallykowwhatiti.当然,MOL也不可能给出一个关于架构的准确定义。MOL更愿意把架构归为哲学的范畴。架构本身其实和软件开发并无太大关系。一个国家有自己的管理体系;一个公司有自己的组织架构;一个家庭也有独特的男权或女权的特色,小到一个人;也是可以分为自我、本我和超我的。每个事物都是由一个个更小的事物组合而成的,而这些其实都与架构相关。在宏观世界里,所有的国家公民构成了一个国家主体,国家主体对每个公民进行管理和约束,这是架构。在微观世界里,电子绕着原子核高速转动,始终不会脱离原子核的管辖范围。而原子核和电子又组成一个原子。原子对电子、质子、中子的管理就是架构。本书的读者一定是软件行业的高手或菜鸟,那我们就回到软件编程的世界里。每个软件项目都是由代码和服务器构成的,如何统筹安排代码和服务器,就是架构的范畴了。一个项目可能要使用多台服务器,如We服务器、数据库服务器、文件服务器、CDN……如何针对不同的要求对服务器进行选型,这是架构;如何统一管理这些服务器,这是架构;如何让这些服务器平稳运行,这也是架构。开发项目使用什么语言,是Java还是Node.j?选用什么数据库,是Oracle还是MogoDB?这是架构。具体到开发过程中,某个模块应该如何安排,是交给DBA(数据库管理员)用存储过程来实现,还是让C#程序员访问数据库实现?这是架构。在写C#代码的时候,采用三层架构,还是MVC?这是架构。如何写日志,是使用I/O读写文件?还是采用log4et?或者是AOP切片写日志?这是架构。甚至具体到某种技术的时候,也有架构。比如MOL规定项目要使用MVC架构,那么使用微软的MVC,还是Srig的MVC?这都是架构。可见,架构涉及的范围非常之广。弱水三千,MOL只给一瓢。本书将从代码架构的角度来让大家一窥架构的真面目。C#是一门非常优雅的编程语言(当然MOL并无编程语言的偏见),所以本书中所有的代码都以C#语言来描述。本书特色1.风趣幽默MOL一直比较反对平铺直叙的讲解方式,所以本书的语言风格是比较幽默的。在本书的内容中将出现3个与MOL并肩作战的兄弟(公司老大邓总不在此列),以对话形式抛出问题并解决问题。2.案例分析本书中只有一个项目“晋商卡”,但MOL会带着大家见证“晋商卡”从无到有的过程,大家可以在这个过程中获得很多意想不到的收获。3.向循规蹈矩说NO正如MOL在结语中所说,2017年是一个强调“工匠精神”的一年。几乎所有的人都在精益求精地做自己的事情。但MOL要分享给大家的是一种懒人精神,我们不愿意日复一日地重复昨天的自己,我们要站在更高的层面,做更少的事情,却有更多的收获。本书内容及体系结构第1篇需求与三层架构(第1~3章)本篇详细介绍了项目开发的前置节点——需求,并对常见的三层架构给出了分析。在第1篇中提出了面向对象的重点概念,并让大家初步认识抽象的过程。相信很多人一定被书中大段的SQL代码搞得云里雾里,不用担心,在第3章中MOL将带领大家完成懒人的第一步——如何不写SQL代码。第2篇NoSQL和测试(第4、5章)NoSQL是现在比较流行的一个话题和技术。在第4章中将通过讲解MogoDB来介绍NoSQL如何使用,并且纠正大家的一个错误观念:NoSQL和ORM不能搭配使用。第5章分享了测试的工作,并讲解了单元测试、黑盒测试、白盒测试……让大家在收获的同时,也能理解测试工程师在工作中所要面临的一些痛苦。第3篇高精尖技术(第6~9章)任何一个网站项目,似乎都绕不开“缓存”这个神奇的空间。缓存用得好,可以加快系统的反应速度。如果缓存用得不好,不仅用户体验差,还可能造成服务器宕机。第6章就分享了如何使用缓存。每个程序员都有一个全栈的梦想,而前端又是全栈中必不可少的一部分,第7章讲解了如何使用EayUI来搭建前端。现在越来越多的电商网站都会做一些抢购或促销活动,当然这就使得网站不可避免地面临高并发。如何处理高并发呢?第8章将通过讲解消息队列,来说明如何应对高并发。微信已经成了人们生活中必不可少的一部分。在2017年3月27日这一天,微信小程序也对个人用户开放了。我们如何把“晋商卡”挂到微信公众平台上,又如何开发微信小程序呢?这些问题都将在第9章中解决。本书读者对象·对代码架构感兴趣的初学者;·对代码架构感兴趣的爱好者;·高校学生和相关培训学校的学员;·初入职场需要提高开发水平的开发人员。因为书中所有的代码都以C#语言来描述,所以本书读者如果有一定的C#语言基础更佳。本书配套资源及获取方式为了方便读者高效地学习,本书特意提供了以下配套资源:·本书源代码文件;·本书涉及的一些开发工具的安装包。这些配套资源需要读者自行下载。请读者登录机械工业出版社华章公司的网站www.hzook.com,然后搜索到本书页面,按照页面上的说明进行下载。本书作者本书主要由田伟(就是笔者MOL)和郎小娇主笔编写。其他参与编写的人员还有李小妹、周晨、桂凤林等。读者阅读本书时若有疑问,可以发邮件到hzook2017@163.com以获得帮助。引言我叫MOL,如果你是MOL的读者,那么一定知道“摩丝”了。MOL者,“摩尔”也。摩丝者,MOL的粉丝也。MOL在本书里将带领大家一起做一个属于自己的代码架构。代码架构和架构是一样的吗?且看MOL如何分解。一谈到架构(Architecture),大家一定会觉得它是一个非常“高大上”的东西,当然,大部分人都是这样宣传的。为了让大家有一个更好的感性认识(因为本书并不是讲架构的,所以只要有感性认识就可以了),MOL决定用一个简单的例子来告诉大家什么是架构。一个架构师的例子在2015年的时候,MOL主导了一个B2C(Buie-To-Cutomer,商家对客户)网站,MOL在这个项目里面充当了非常多的角色,如产品经理、项目经理、架构师、DBA(数据库管理员)、程序员、QA(质量管理员)、Teter(测试员)……现在来看一下MOL作为架构师时所做的事情。MOL作为架构师,是以大体需求为前提的,也就是说,我们在这里不去讲如何获取需求,因为这不是架构师份内的事。当MOL拿到需求以后,就可以进行架构了。架构大体上分为两部分:硬架构和软架构(这并不是标准的叫法,只是想让大家更好地理解架构)。1.硬架构顾名思义,硬架构就是关于硬件的架构。MOL根据目标用户量和业务要求,采购了3台服务器,分别作为文件服务器、数据库服务器和We服务器(同时兼任缓存服务器),同时,建议用户在客户量增加到一定数量级以后,增加CDN(CotetDeliveryNetwork,内容分发网络)服务器,以加快访问速度。OK,架构师的输出已经完成了。但大家以为架构师就买几台服务器就完事儿了吗?那就大错特错了。在买服务器的背后,MOL对需求进行了研究,分析了网站需要承担的平均访问量和网站的业务内容。这个网站的访问量并没有大到令人发指的地步,所以我们暂时不用考虑硬件负载均衡的问题,只需要提供一台We服务器就可以了。这台We服务器需要处理用户发来的请求并做出响应给用户。为了提高We服务器的性能,我们将会在这台We服务器上安装虚拟机,并用Ngix(一个HTTP服务器,类似于IIS)做软负载均衡。由于本系统中需要保存大量的用户文件,如果把这些文件都放在We服务器上,那会给软件负载均衡产生额外的负担,并且大量的文件很容易把一台服务器“撑爆”。所以,我们用一台服务器专门来保存文件信息,这台服务器就叫文件服务器。数据库是一个项目中必不可少的一部分,数据库的本质其实就是文件和内容的组合,所以数据库的空间增长也是不可小觑的。而且数据库的操作,将会耗费大量宝贵的CPU和内存资源。所以我们将数据库专门放在一台服务器上,这台服务器就叫数据库服务器。好,硬件资源采购完成了,我们要把它们组合到一起。We服务器向网络公开,让用户可以访问,而文件服务器和数据库服务器只在局域网中,并不对外公开,这样可以在一定程序上保证安全性,而且也为客户节省了费用。We服务器可以访问文件服务器和数据库服务器。其实硬架构是非常复杂的,但本书不是主要讲硬架构,所以这里讲得非常简单,有兴趣的读者可以自行找“某度”或“某狗”进行搜索。2.软架构本系统将采用.NET平台下的C#语言进行开发,采用SQLServer数据库,使用微软的Cache缓存配合Redi来做。前台将以3种终端展示,分别是PC、手机、平板。所以前端将会使用HTML5来做。Adroid手机APP使用Java语言来开发,iOS平台上的APP暂时不做。同样的,软架构也只是让大家看到了输出,并没有讲为什么这样做,因为这也不是本书的重点。上面粗略地讲了一下什么是架构。下面来具体看一下代码架构。废话不多说,直接来看图1和图2。图1正常的代码架构图2不普通、非文艺的代码架构图1是一个常见的代码架构,而图2可能是新手程序员最喜欢的“代码结构”。代码架构的目的是让不同的代码块去干不同的事,最后再把这些代码块整合在一起,组成一个项目。这是本书要讲的内容。可以看到,代码架构和软件架构基本上不属于同一个层次的元素。但不可否认的是,代码架构是一个程序员应该具备的技能,也是通往架构师的必经之路。PS:各位读者可能对用户和客户这两个概念理解有误,这里统一一下,用户(Uer)是指使用系统的人,客户(Cutomer)是指要求我们做这个系统并且支付开发费用的人。背景及人物介绍本书中,我们将延续MOL活泼幽默的风格。为了剧情的需要,书中将会出现5位主人公。MOL:姑且称之为老鸟吧,从事代码工作多年,在公司中主要负责项目管理和代码架构。邓总:公司老大,身材消瘦如马云,有一双深邃的眼睛。虽然是公司的老大,但在本书中出现的次数并不多。刘朋:新入职员工,因为名字中的“朋”字“占地”面积很大,所以大家一般都会把“朋”字分开来念,所以他有另一个名字“月月”,性格比较幽默。岳鹏辉:新入职员工,长得比较帅气(已有女朋友)。李冲冲:新入职员工,打得一手好乒乓球。这几位主人公将会在本书中出现,他们可能是说相声的,可能是打酱油的,也可能是回家跪搓衣板的。但是他们更重要的作用是构造一个个生动的故事,在这些故事里面,大家可以看到一个真正的项目是如何搭建的。故事来源于生活,却不高于生活,这里的人是真实的,故事是真实的,当然,最重要的是,项目是真实的,知识也是真实的。MOL尽量用最接地气的语言,最平实的故事,来讲述一个个“高大上”的知识和技术。我们的目标我们经常会听到这样的话:“加班不是目的,目的是不加班”。这样的话让人无比窝火,但又无比正确。我们还会听到这样的话:“我这样严厉地要求你,是为了让你成长得更快”。你有理由反驳吗?其实,换一种方式,我们可以快乐地成长。这也是MOL带团队的宗旨,也是本书的目的。MOL要让你快乐地看完这本书,最后发出的感慨一定是:“代码架构其实挺简单!”好了,我们要开始了!第1篇需求与三层架构·第1章故事从一个电商网站开始·第2章为什么是三层·第3章ORM实体关系映射第1章故事从一个电商网站开始按照惯例,一本书的开始一般会介绍一些基础知识,如Java语法、XML结构等。相信很多读者都立志做一名“高大上”的Coder,但是一看这种开篇讲语法的书就先泄气了。为了不让大家泄气,我们将使用一个电商网站项目来作为开篇。说到项目,大家一定会想到某培训机构的机票管理系统、通讯录……估计大家都要被这些标题党搞疯了。这些听起来很好听的系统,不一定有什么实用价值。但是我们要介绍的项目,是一个实打实的、已上线的、微信上可查找的一个项目。如果各位摩丝在任何时候觉得学习有点累了,或者迷茫了,可以上微信搜索“川商卡”,这就是我们要讲的系统。MOL在做这个系统的时候,用到的技术并不多,像缓存、消息队列等这些技术在项目中没有出现,但在本书中MOL也会讲到。MOL可以很负责任地说,当大家学完这本书后,可以毫不费力地给自己快速搭建一个“高大上”的代码框架。下面的内容,将是一些非常杂乱的、与代码看似无关的基础知识,请大家耐心看完。1.1需求?需求!相信大家对一些翻译软件的使用已达到炉火纯青的地步了,如果把“需求”这个词输入翻译软件,会出来一大堆对应的英文单词。这里只挑两个容易混淆的单词来说,即Requet和Demad。通常出现需求的地方,一般都会用Demad来描述,但是偶尔也会看到Requet。这两个单词都是需求的意思,有啥区别嘞?Demad是必须要完成的,没有商量的余地。比如你的BOSS告诉你:我们的项目要加入某宝支付的功能。这就是Demad。虽然过两天BOSS有可能把这个功能“砍掉”,但是令行禁止,你还是必须得把某宝支付的功能实现。Requet是锦上添花的功能。比如你的BOSS是一位单身宅男,他问你:在网站某个页面的右下角加入一个美女的图片,可以吗?这就是Requet,它表示请求。也就是说,你不加这个图片,项目照样运行。至于这个图片是否要加,那就看你的心情喽。下面,我们来描述一下本书中的项目需求。由于本书中的项目采用的是敏捷开发,所以开发过程中的文档特别少(关键文档是不可以省略的)。这里不可能列出所有的需求文档内容,因此将使用BraiStorm(头脑风暴)的方式来描述需求:·这是一个电商网站;·这是一个O2O电商网站;·这个网站有登录注册功能;·这个网站有商品展示功能;·这个网站有订单功能;·这个网站有支付功能;·这个网站有积分功能。OK,需求就是这么多。估计很多小伙伴都已经开始吐槽了吧:上面的描述也能算需求吗?MOL可以很负责地告诉你,是的,而且这是沟通4个小时后的成果,你相信吗?好了,先不吐槽需求发起人了。上面的7个功能,就是我们这本书里要实现的需求。好像这也没什么难点啊。但如果你这样想就错了。至于哪里错了,MOL不会做直接回答,在后面的每个章节中,都会对这个问题进行回答,请大家自行品悟。如果你想要了解详细的需求,那可能要失望了,因为MOL并不打算在这里描述一个完整的需求,而且这并不是实际开发中的情况。在敏捷开发的项目里,一般都是到开发的最后阶段,才能明白客户想要的是什么东西。这里引用一幅项目开发领域流传很广的漫画来说明,如图1-1所示。图1-1项目开发漫画1.2敏捷开发简介前面提到了敏捷开发,听起来是一个非常“高大上”的名词。下面让我们来看一下敏捷开发的真面目。敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。(引自百度百科)如果专业的解释看不太懂,没关系。我们用简单的语言来描述敏捷开发的过程。小明想买一部手机,他告诉手机厂家:我想要一部手机,这部手机要好看、好用。厂家收到需求以后,肯定是一头雾水,一定在想,我们做的每一部手机都非常好用呀,此时的心情是崩溃的。但是本着顾客是上帝的原则,厂家开始做这部好看且好用的手机。首先,他们把手机壳做了出来,打电话把小明叫到工厂:小明,手机壳做好了,你看是否符合你的需求?小明看完以后,无非就两种回答,符合或不符合。如果符合,那么厂家将继续研发手机屏幕。如果不符合,那么将根据小明的需求继续修改。又过了几天,厂家打电话:小明,屏幕做好了,你看是否符合你的需求?……终于,在一个阳光明媚的下午,小明交完钱,拿到了自己心仪的手机,留下孤寂的厂家负责人在风中凌乱:就一个诺基亚1020,至于让我们这么费劲吗。这就是一个敏捷开发的表现形式,它最明显的特点就是小迭代,每个小功能都去找客户确认,最后完成产品的同时,也就知道了客户的具体需求。这样描述敏捷开发肯定是不全面的,我们的目的是不给出一个敏捷开发的准确定义,只是想让大家对敏捷开发有一个感性认识。敏捷开发越来越多地被很多开发团体利用。它的好处就是开发周期短、与客户交流密切,一旦有问题出现,能很快做出响应。在敏捷开发的团队里,逐渐地出现了一种人——“全栈工程师”,这种人的优势在于:他们是无所不知的。你说前端,他能给你讲HTML5和CSS3;你说C#,他能和你探讨.NET框架;你说Java,他能和你研究JVM;你说大数据,他还对Hadoo的理解有独到之处,仿佛是无所不能。相信很多摩丝都有一个“全栈梦”,加油!1.3UI——用户界面UI(UerIterface,用户界面),这是一个可大可小的概念。往小了说,它就是一个图形界面,如网页、桌面窗口、手机窗口……只要是你看见的,都可以算是UI;往大了说,UI包括产品经理、用户体验工程师、美工(静态切图PS)、前端(HTML、CSS)、前端交互(JavaScrit、jQuery、EayUI)……1.3.1从UE说起UE是一个容易让人产生歧意的缩写。经常写代码的人,尤其是写脚本语言(如PHP、Pytho)的程序员一定会说,UE是一个文本编辑器“UltraEdit”;经常写需求的人一定会说,UE是用户体验“UerExeriece”。这里所讲的UE是用户体验。那么用户体验是什么?先来摘录百度百科对它的解释:用户体验(UerExeriece,简称UX或UE)是一种纯主观的在用户使用一个产品(服务)的过程中建立起来的心理感受。由于它是纯主观的,因此就带有一定的不确定因素。个体差异也决定了每个用户的真实体验是无法通过其他途径来完全模拟或再现的。但是对于一个界定明确的用户群体来讲,其用户体验的共性是能够经由良好设计的实验来认识到的。随着计算机技术和互联网的发展,使技术创新形态正在发生转变,以用户为中心和以人为本的理念越来越被重视,用户体验也因此被称做创新2.0模式的精髓。相信很多小伙伴都不愿意看这样长篇大论式的定义,那么我们用大白话来描述一下什么是UE。微信做得好,大家都愿意用它来社交;支付宝做得好,大家都愿意用它来支付;百度做得好,大家都愿意用它来搜索。当然,也有一些网站或项目做得就比较一般了,上线以后导致用户骂声连天。“做得好”和“做得一般”表明用户心里是有一杆秤的,这杆秤就用来衡量这些产品是否符合用户的需求和使用习惯。这杆“秤”就是用户体验。一千个人眼里就会有一千个哈姆雷特,也就是说,任何一款产品,都不可能百分之百地满足任何用户。就像对于一朵菊花来说,有人觉得它芳香四溢,也有人觉得它臭,就是这个道理。综述,一个产品,只要满足了大多数用户的需求,就是一个好的产品。1.3.2HTML5amCSS3不得不说,HTML5和CSS3的发展正如日中天。HTML5强大到可以完成手机APP的功能,如拍照、读取手机文件。CSS3较之前面的版本,有更方便、更强大的渲染功能。当然,MOL并不是一个合格的前端工程师,所以这里对这些前端技术的描述只能点到为止。对于这些技术的运用,也不是后台程序员擅长的,我们更愿意把这些繁杂的前端工作交给专业的前端人员来做,因为他们一定比MOL有着更为专业的前端功底。如果你的团队里正好没有前端人员,而你的BOSS又把前端的任务交给你了,怎么办?别着急,在后面的章节中,MOL会告诉你如何应对这些不合理的要求。1.3.3微信相信各位小伙伴的手机上一定会装微信APP,微信以其极大的用户群体为基础,打造了一个互联网的社交平台。在这个平台上,有人“晒”幸福、有人吐槽春晚、有人发“鸡汤”、有人抢红包、有人卖面膜……当然,这些用法都有点Low了。对于我们这些Coder来说,更愿意看到自己做的东西挂在微信上面!本书中讲到的“川商卡”这个项目就是搭载在微信公众平台上面的。当然,你还可以开发微信公众服务号来展示自己的成果,这些都是后话。之所以把微信公众号这个平台放在UI里面,是因为越来越多的电商网站愿意以手机为载体来实现用户流量的引入。如果商家自己去做推广的话,将是一笔不小的开支,所以商家更愿意使用已成型的平台来推广自己的产品,而微信公众号无疑是一个不错的选择。比如我们用的信用卡公众号,或者订阅了某个公众号,这些都属于微信推广的一种手段。微信作为一个平台,有一套自己的规范,也就限制了网站的展现形式,所以从这个角度来说,微信也算是UI的一份子。1.4数据库别问我数据库是什么。MOL说过,这本书里不讲基础知识。在这里讲的是如何去设计数据库。MOL相信很多大学老师一定是这样教学的:设计数据库一定要先设计数据字典,这个字典看起来像这样,如表1-1所示。表1-1登录信息的数据字典这个字典描述了一个用户登录信息表。设计好这个字典以后,再去数据库(SQLServer\Oracle\MySQL……)中去实现这个字典,实现的方法无非就是SQL语句createtale,或者用图形化工具去设计表。大家有没有觉得这个字典设计得有点鸡肋?如果要改需求,比如加入注册时间这个字段,试问,你会先修改字典,然后再去修改数据库吗?如果需求更改得比较频繁,那么你一定会厌烦“数据字典”这个东西的。其实不然,数据字典是一个神器,只是你的打开方式不对。1.4.1PowerDeiger设计工具面向对象是本书的一条主线,本书中对面向对象的表述甚至有些“极端”,但是一定可以把OO(面向对象)思想灌输给大家的。面向对象里说,一切皆对象。也就是说,数据库是对象,数据库中的表也是对象。因此,我们将以对象的形式来描述一个数据库表,这个描述将以用户登录信息来举例。在数据库里,对“对象”的体现莫过于“属性”,属性是什么?说白了,属性就是字段。怎么理解?一个登录对象,必然有用户名和密码,这是它的属性。那么反映到数据库中,就是用户名字段和密码字段,这样就理解了吧。为了让一个数据字典看起来更像是一个对象,我们将借助PowerDeiger(以下简称PD)工具来设计。如果不会用PD,请自行去“某度”或“某狗”去搜索一下。下面先来做一个概念模型CDM(CocetDataModel),如图1-2所示。这样看是不是有点对象的意思了?有对象名,有对象属性。那为什么建立的是CDM而不是物理模型PDM(PhyicalDataModel)?先不着急来回答这个问题,先把建立的CDM生成PDM,然后进行对比。生成的PDM如图1-3所示。图1-2登录信息的概念模型图1-3登录信息的物理模型看起来二者好像没什么区别,那么下面再建立一个用户订单的对象。我们知道,一个用户可以有0个或多个订单,那么用户am订单的CDM看起来像下面这样,如图1-4所示。它生成的PDM如图1-5所示。到这一步,就看出二者的区别了吧。PDM的描述更接近于数据库,因为可以从PDM中清晰地看到关于外键等数据库表的描述;而CDM更接近于需求,我们只需要关心一个用户有多个订单就可以了,至于外键之类,不是CDM要关心的问题。在设计数据库的时候,一定是从需求出发,所以设计CDM会更贴近需求,也会更容易一些。图1-4多表间关系的概念模型图1-5多表间关系物理模型OK,我们再回到数据字典的问题,为什么要用PD来画一个CDM,而不是用Excel之类的软件来做一个数据字典的表格?用PD做数据库设计的好处有很多,这里只列举两点:·便于管理。当有很多项目的数据库需要管理的时候,可以很轻松地从PD里面找到想要维护的表。·便于生成数据库。我们建立的CDM可以生成PDM,PDM又可以生成数据库脚本,这些脚本是可以直接在数据库中执行的。当然,如果为PD设置了ODBC(OeDataaeCoectivity)连接,则可以直接在PD里通过操作数据库来生成表。以上两点好处,足以让我们选择PD来设计和维护数据库了。1.4.2关于SQL语句相信很多新手程序员都喜欢用大量的SQL语句来实现一个又一个复杂的功能,而且非常有成就感。但本书不会教你怎样写SQL语句,而且会劝大家尽量少写SQL语句。为什么呢?很简单,我们要面向对象!一个复杂的SQL语句是很难体现对象特性的。那么如何保证尽量少地去写SQL语句呢?这是第3章的内容,这里先不做介绍。少写SQL语句,并不是不写SQL语句。那么哪些地方需要写SQL呢?答案是存储过程、事务、触发器。可以看出来,这里列举了存储过程、事务、触发器这3种SQL语句的出现形式,它们有一个共同点,就是业务规则是相对固定的。比如,新用户注册完成以后,数据库要悄悄地给这个用户添加一个购物车,这种业务场景最好使用触发器。关于触发器的优势,这里也不会细说,MOL只会轻轻地告诉你,触发器比你写代码提交快很多。既然项目中出现了SQL语句,那么就需要对这些SQL语句进行分析,看它们的执行效率是否符合要求。比如一个elect语句要执行10分钟,那么这个SQL语句就得“枪毙”重写了。通常,看一个SQL语句的执行效率,主要集中在全表扫描和索引上面,尽量不使用全表扫描,尽量使用索引,目的都是让SQL执行起来更快一些。关于数据库,要说的最后一点是主键的问题。主键的类型有多种多样,可以使用数字、字母、时间等,只要保证它是唯一的就可以了。那么我们到底应该取用什么类型呢?一些专家一定会说:看情况而定。MOL当然不会这么说。建议大家使用GUID类型。使用GUID类型的好处就是:它的长度是固定的,而且永远都不会重复。如果使用it类型,虽然可以很轻松地使用主键自增保证它是唯一的,但当它增长到一定数量的时候,it已经不足以描述了。MOL曾经经历过一件事,彩票奖池金额在2016年元月的时候已经到达2.4亿多,这个数字是无法用it来描述的,所以把程序中所有用it描述主键的地方都改成了log。其他的数据类型都有自己的缺陷,所以使用GUID来作为主键字段的数据类型。当然,GUID也有自己的缺陷,如不直观、没有数据含义等。但这些功能其实都可以解决和避免,所以为了简单和实用,我们使用GUID作为主键字段的数据类型。可以看到,MOL说建议GUID这件事情时说了3遍,正所谓重要的事情说3遍嘛。前端和数据库都描述完了,最重要的代码就要登场了,你以为代码就是一堆C#关键词的集合?我就只能“呵呵”了。那么我们应该如何去组织代码呢?面对频繁的数据库操作,要如何尽量少地写SQL语句呢(在本书的项目中,C#代码中是不掺杂任何SQL语句的)?大量的SQL查询是否会影响网站速度?……这些疑问,将在后面的章节中一一解答。第2章为什么是三层还记得在引言中提到的几位主人公吗?从这一章开始,他们就要粉墨登场了!“三层架构”这个词一定是新手程序员经常听到的,大家听起来一定觉得它有点“高大上”的感觉,然后纷纷把自己的项目进行分层,以求变成三层。那么,三层架构到底是什么?为什么要分三层?我们慢慢说来。2.1MOL带兄弟们去吃饭时维九月,岁属三秋,这是一个阳光明媚的金秋,MOL所在的公司又新招了三位同学,MOL总算不是孤军奋战了,于是MOL带大家去了楼下一家餐厅吃饭。吃饭不是目的,这是给大家上的第一堂课。到了餐厅以后,一个很水灵的妹子迎上前来,问道:“几位帅哥要饭吗?”MOL当时就不高兴了,回道:“你看我们长得像丐帮的吗?”妹子脸一红:“我的意思是,各位想吃点什么?”这时,月月搭腔了:“蒸羊羔、蒸熊掌、蒸鹿尾儿、烧花鸭、烧……”妹子赶紧打住:“哥哥,我得问一下厨房师傅,看看能不能做。”不大一会儿,妹子出来了:“实在对不住,您几位刚才点的那些,我们这里都做不了,因为这里是西餐厅。”月月:“那二尺长的龙虾有吗?”妹子:“二尺长的没有,有二尺七的,要吗?”MOL一看不对劲,这是要把我吃到破产的节奏啊,赶紧说:“二尺长的龙虾都没有,那就来小龙虾吧。”妹子:“小龙虾暂时没有,如果您可以等的话,等采购师傅回来了,就有了。”MOL:“可以等,不就几分钟嘛。”妹子愤愤地下去了,月月也一脸不满意,MOL赶紧打圆场:“不就是龙虾嘛,大小都是龙虾,小怎么啦?小就不能满足你了?”然后是等待吃饭……吃完饭回到公司,MOL招集大家开会。MOL:“今天这顿饭不能白吃,它将开始我给你们的第一课——三层架构。”月月:“吃饭都能扯上架构,神了嘿。”鹏辉:“今天的饭吃得确实有点意思,不过还能和程序扯上关系就有点意思了。”MOL:“我们刚才在餐厅吃饭的时候,总共有这么4个角色,分别是我们3个“饭桶”、服务员、大厨和采购师傅。”(下面都是MOL口述,将不再以引号来包含)在程序员的世界里,这几个角色分别对应的关系是:·我们3个“饭桶”对应用户,因为我们是花钱享受服务的。·服务员是UI(UerIterface用户接口)层,她是要展示给用户,并且和用户进行交互的,而且她还要和大厨进行交互。·大厨是BLL(BuieLogicLayer业务逻辑层),他的任务是把食材加工成美食,并交给服务员,所以他既要和采购师傅交互,又要和服务员交互。·采购师傅是DAL(DataAcceLayer数据访问层),它的任务是把食材采购回来并交给大厨。除此之外,还有一个隐形的角色是菜市场的大妈,她负责把菜卖给采购师傅。她对应我们软件系统中的数据库。当然,我们对大妈是不感兴趣的,所以这里先不说大妈的事。OK,根据上面的描述,我们可以把一个餐厅里的工作分成3个部分,分别是服务员、大厨和采购师傅,他们之间的相互关系如图2-1所示。图2-1餐厅分工大家有没有想过,如果我雇佣一个人,这个人既会炒菜又能采购,还会当服务员,那么这些角色不就不用分开了吗?非常好,我们假设有这样一个人存在,他既要当服务员与食客沟通,还要炒菜,还要去买菜,那么将会发生什么情况呢?这个人先要恭敬地问食客“您来点什么?”,然后再跑到厨房换上工作服开始炒菜,如果发现没菜了还得自己去买菜。我相信,即使有这样一个人存在,那么他也会累得够呛。而且他炒菜或者采购的时候,是不能与其他的食客沟通的。最后他累得实在不行了,辞职走人了,老板就哭了,因为他一走,餐厅就没人干活了,餐厅也得关门。所以,分开服务员、大厨、采购员这几个角色,有利于每个角色都专注于自己的职责任务,而且,即使有人搁挑子不干了,那也只需要找一个对应职责的工人来顶上就可以了,不至于让整个餐厅都变得很被动。好了,说完了餐厅的分工,再来说一下我们所关心的代码中的三层架构。通常意义上来说,三层架构是UI、BLL、DAL这3层。这3层可以对应到餐厅中的3个角色来对比理解。UI层负责与用户交互,并将用户的请求交给BLL层处理;BLL层负责从UI层获取请求并将处理后的数据交给UI层,同时它还向DAL层发送请求,并获取DAL层返回的数据;DAL层负责接收BLL层的请求,并进行数据处理然后返回给BLL层,在大多数情况下,DAL还需要从数据库中获取数据。它们之间的关系如图2-2所示。图2-2程序中的三层结构同样的,我们完全可以不使用三层结构就可以完成一个项目,这种代码结构最常见于新手程序员写的代码。这样的结构将会面临很大的风险,如果业务逻辑变动,那么将会出现“牵一发而动全身”的现象,由此不得不对整个项目进行修改。所以,分层可以让专业的层(Layer)去做专业的事情,如果逻辑有变动,那么只需要修改相应的层就可以了。PS:餐厅吃饭的例子非常经典,它将贯穿于本书中的章节,在后面的章节中经常会说到“如果餐厅中的大厨有个助手……”,希望大家能立刻回想起MOL在这一节给大家讲的餐厅吃饭的例子。2.2动手写一个三层结构说了这么多,都只是停留在概念的层次,接下来,我们要写一个简单的三层结构的框架。这个框架只需要实现一个功能:用户输入两个数,并选择运算方法,运算只包括+、-、*、/。程序通过计算,将计算结果输出到用户界面上。OK,需求已经非常明确了,就是要做一个简单的能进行加、减、乘、除运算的计算器。那么前端可以使用任何方式,比如控制台、WiForm、WeForm、MVC……为了直观和简单,这里将采用WeForm来做为前台界面。而BLL主要是将数据逻辑进行处理,并调用DAL层计算结果,将得到的结果返回给界面。DAL只需要提供数据就OK了。在本例中,不考虑边界异常(如太长的数字会溢出等情况)。首先需要把项目的框架搭建好。新建一个名为Mol.Calc的解决方案,并加入一个We项目(Mol.Calc.Portal)和两个类库项目(Mol.Calc.Bll和Mol.Calc.Dal),如图2-3所示。图2-3三层代码框架PS:项目的命名一定要规范,一般来说,项目命名都是“公司.项目.模块名”。MOL所使用的开发环境是Widow7+ViualStudio2015+SQLServer2012。关于环境的配置这里不会多说,否则显得本书很low,大家也会很不耐烦。2.2.1DAL层的实现有了项目框架以后,就可以写代码了。首先需要一个处理数据的功能,这个功能大家一定要记住,和数据打交道的功能,最好放在DAL里。在本例中,DAL层只需要处理加、减、乘、除4种运算就可以了。所以我们分别写4个函数来实现这4种运算,如图2-4所示。图2-4四则运算的实现在本例中,加、减、乘、除这4种运算确实是太简单了,用它来占用一层有点浪费,不过在大项目中,这样写是非常有必要的。2.2.2BLL层的实现接下来要实现BLL层。BLL层是三层里最难学的一层,因为大部分的BLL中的代码都是这样的://实例化一个DAL对象oeratedal=ewMol.Calc.Dal.oerate()//调用DAL计算加法1+2dal.Add(1,2)这样的代码看起来毫无生气,甚至没有存在的意义,因为DAL层就可以把计算做完了,为什么还要硬生生地加一个BLL层呢?大家一定要记住,我们不是为了分层而分层,而是为了实现高效可维护的代码结构。BLL层的作用是要处理业务逻辑,所谓的业务逻辑就是要判断UI层传入的数据应该如何排列组合提交给DAL层,如果有不合法的数据,就要及时中断,不向DAL层提交。本例中,需要判断用户选择的是哪种运算,并去调用DAL层中相应的运算;除此之外,还要判断:当用户要计算除法时,用户输入的除数是否为0。BLL层的代码如图2-5所示。图2-5BLL层代码注意:其实除数不能为0这样的验证应该放到前台UI层去验证,这里把它放到BLL层里,是为了强化大家对BLL层的理解。2.2.3UI层的实现前面的2.21节和2.22节,我们实现了数据的获取和处理。接下来就要写前台UI的代码了。UI代码比较简单,就是新建一个WeForm页面,名称为Calc.ax,并在这个WeForm页面中加入两个文本框、一个下拉列表框(设置下拉列表框选项为+、-、*、/)、一个按钮、和一个显示计算结果的Lael。UI后台,只需要实例化一个BLL层对象,并调用BLL层的方法既可。前台界面如图2-6所示。图2-6UI界面UI后台的代码如图2-7所示。图2-7UI后台代码这样,一个简单的三层代码结构的示例就完成了,运行结果如图2-8所示。图2-8程序运行结果2.3简说MVC提到三层架构,很多人就会想到MVC(ModelViewCotroller,模型-视图-控制器)模型。MVC的结构如图2-9所示。图2-9MVC模型示意图图2-9描述了一个MVC框架处理用户请求的流程。(1)用户发起请求,请求将被送给Cotroller。(2)Cotroller去Model中取数据。(3)Model返回数据给Cotroller。(4)Cotroller将数据返回给View。(5)View展示给用户。如果这个流程让你觉得难以理解,不要担心,因为我们还没有开始写MVC的代码,所以我们无法理解用户请求为什么是到控制器(Cotroller)而不是到视图界面(View),最后返回的时候不通过控制器返回,而通过视图来返回……大家只需要对MVC有一个感性认识即可,知道每一部分是干什么用的就OK了。2.3.1纠正一下老师的说法很多老师在讲到MVC的时候,都会和三层架构进行对比,并且会给出下面一幅图(如图2-10所示)。图2-10很多老师都会这样画老师画完这个图以后,告诉大家:MVC中的View和Cotroller相当于三层架构中的UI层。而MVC中的Model相当于三层架构中的BLL。每当听到这样的解释时,MOL特别想问问老师:你把DAL层吃了?当然,这样的做法有点激进。但是,老师这样的讲法肯定是不对的。三层架构是一种思维,MVC是另一种思维,如果非要把二者放在一起对比的话,难免牵强。接下来,我们来写一个MVC的程序,看看MVC到底是什么样子的。2.3.2MVC的第一个程序前面提到过,MVC只是一种设计思想和程序框架,那么,也就是说MVC并不是.NET特有的,其他语言也有自己的MVC实现,我们在真实项目中使用的,其实也不是真正的MVC。但是第一个MVC程序一定要简单,所以我们使用微软提供的MVC来做。微软在.NET3.5以后的版本都支持MVC,这里使用的是.NET4.5版本下面的MVC4。好了,下面来新建一个We项目,如图2-11所示。图2-11新建We项目如果读者以前用的是ViualStudio2010,那么这个界面可能不太习惯。从ViualStudio2012开始,WeForm、MVC、WeAPI等这样的We项目都变成了一个“ASP.NETWe应用程序”,选择这个应用程序以后,单击“确定”按钮,进入选择项目类型步骤,如图2-12所示。图2-12选择We类型在这一步中选择MVC项目,然后单击“确定”按钮,进入项目解决方案的管理界面,如图2-13所示。图2-13MVC代码界面可以看到,在图2-13中,用标注框所标出来的地方就是我们前面所提到的Model、View、Cotroller。打开HomeCotroller.c,修改Idex方法为下面的代码:ulicActioReultIdex(){trigmg=trig.Format(@"这世界,我来了!")ViewBag.Meage=mgreturView()}然后修改对应的Idex.chtml为下面的代码:@ViewBag.Meage直接运行代码后会发现,我们写的文字已经显示在页面上了。页面效果如图2-14所示。图2-14第一个MVC程序页面效果运行程序以后会发现,URL只是localhot:端口号,而没有实质的页面路径。我们把URL补全为localhot:端口号/home/idex,还能看到相同的效果。通过这个简单的程序可以看到,用户(这里是浏览器)是向控制器(Cotroller)中的Actio(这里是Idex)发起请求,Actio会进行数据处理(本例中是给ViewBag.Meage赋值),然后返回给View(视图),View接收到返回数据以后,将数据显示到页面上,最后就可以通过浏览器看到效果了。这段话里埋下了太多没有讲解的知识点。(1)为什么localhot:端口号==localhot:端口号/home/idex打开A_Start下面的路由配置文件RouteCofig.c,如图2-15所示。图2-15路由配置文件可以看到这个文件中配置了一个叫Route.MaRoute的对象。这个对象有一个默认属性defalt,表示当URL中没有控制器和Actio的时候,指向哪个控制器下的Actio。在本例中,它指向的是home/idex。当然,这个默认设置是可以修改的。(2)ViewBag是什么在Idex这个Actio中使用了ViewBag对象,它是一个数据传递的载体,只需要为这个对象的属性赋值,前台就可以取到了,ViewBag的属性是不需要提前定义的,例如,要给ViewBag.Mol赋值为“帅”,那么前台就可以通过ViewBag.Mol来获取到“帅”。是不是很神奇?除了ViewBag,还有一个叫ViewData的对象也可以完成类似的操作。它的用法是:ViewData["Mol"]="帅";关于ViewBag和ViewData的区别,这里不做详述,大家需要自行去学习。(3)Model跑哪里去了Model呢?前面用到了控制器和视图,单单把Model落下了。Model是一个实体集合,可以定义任何实体类。这个实体类可以是用户类,可以是订单类……可以把Model理解为这样一种东西:它是一种载体,通过这种载体,可以以面向对象的思维去处理数据。例如,定义一个Uer类,那么在控制器中就可以实例化一个Uer类,然后传给视图去展示。伪代码如下:Ueruer=ewUer()uer.ame="Mol"uer.geder="male"ViewBag.Pero=uer如果大家还不太了解MVC,那么就找一些资料学习一下。本书的重点不是MVC,所以这里只是略带一说。2.3.3为什么要用MVC之我见其实MVC与传统WeForm的区别还是很多的,但是很多不同点还不足以引起大家使用MVC的欲望。这里只说几点大家可能会关注的地方。·WeForm更容易上手,也就意味着程序员会忽略更多的细节。比如一个按钮是如何被解析成iut标签的。这样的编程方式其实不利于对程序的理解。·WeForm中设计了“生命周期”的模式,从页面出生到消亡,会经历很多个状态,比如常见的Page_Load就是其中的一个状态。这样多的生命周期,其实并不利于新手理解程序是如何处理请求的。·WeForm页面中会保存大量的ViewState,这样就可以记住“之前”(事件触发前)的状态。这些ViewState会对优化工作造成不小的困扰,而且经常在程序员不注意的时候,页面就会狂飙到好几兆的大小。如果你用过WeForm,也用过MVC,那么一定会觉得MVC是非常纯净的,因为它的流程透明,页面干净,不会生成意想不到的ViewState。·WeForm中的页面都是继承自Sytem.We.Page类。而Page类是不可以实例化的,那么这种现象就会对单元测试造成很大的困难,有些程序员甚至直接跳过了单元测试。而在MVC中,所有的请求将会被汇集到Cotroller类中,而对控制器和其中的Actio做单元测试是比较容易的。·WeForm中的前台是ax页面,也就是说这个前台页面并不是一个纯净的HTML页面。当程序员从美工手中接过静态页面的设计以后,需要把大量的iut标签转换成按钮、单元框、文本框……这个枯燥的工作一定会把人逼疯的。·这一点其实算是个彩蛋,因为并不能算是一个非常直接的原因。把项目提交到Git上以后,Git平台中的“代码分析”功能会检查整个项目的代码完整性、可读性、规范性等。其中,规范性要求代码需要按照一定的命名规则来书写,而如果项目使用了WeForm,那么Page_Load这样的函数名就一定会被检查出来,并且还没有办法把它改成其他的函数名,这是多么的“坑爹”。其他的区别还有很多,但以上所列几点已经有足够的理由让我们去使用MVC。在本章中,我们将使用微软提供的MVC来做示例。在前面的内容中提到过,MVC只是一种编程思想,而不是某个公司或机构的专有技术,在后面的章节中,我们会引入Srig.NET中的MVC。2.4向三层代码中加入面向对象面向对象其实是一个非常宽泛的概念,宽泛到不足以用一个章节甚至是一本书来说明面向对象,但MOL将尽量在书中的例子中浸透面向对象的思维。前面已经讲述了通常的三层代码结构,本节将在三层代码中加入面向对象的元素。这种面向对象的思想在本节中将体现在两个地方:·数据库表的面向对象;·将所有的SQL操作都放到一个类(SqlHeler)中。2.4.1实例化数据库表通常意义上,从数据库中获取数据,一般都需要按照ADO.NET的步骤来写,ADO.NET的代码如下://////获取所有的订单信息//////ulicDataSetGetOrder(){trigcoectioStrig=@"DataSource=.IitialCatalog=ReortServerUerID=aPaword=000"DataSetre=ewDataSet()uig(SqlCoectioco=ewSqlCoectio(coectioStrig)){trigql=@"electuerid,ueramefromuer"SqlDataAdaterada=ewSqlDataAdater(ql,co)ada.Fill(re)}returre}获取到数据源以后,需要在BLL层进行数据装配。BLL层代码比较简单,只是简单调用DAL层返回数据,BLL层代码如下:ulicclaOrderBll{//////调用DAL获取数据//////ulicDataSetGetOrder(){OrderDaldal=ewOrderDal()returdal.GetOrder()}}然后再以DataSet的形式返回到前台,前台在展示的时候,就需要按照DataSet的格式来展示。比如,展示uerid字段,那么就需要这样写:uerid:@ViewBag.ueriduerame:@ViewBag.uerame展示效果如图2-16所示。图2-16获取数据展示效果通过上面的代码可以发现,DataSet这个类将贯穿于DAL-BLL-UI这三层之间。而DataSet类是一个与数据库打交道的类,这样就导致我们不管在哪一层(Layer)都需要知道这个数据集(DataSet)里的结构,包括这个数据集中有几个表,每个表中包含哪些字段等。当操作的表达到几十个的时候,用DataSet操作数据已经变得非试读结束[说明:试读内容隐藏了图片]...

    2022-04-04 架构 代码 编程 基础架构即代码

  • [每天读本书]《软技能》代码之外的生存指南

    2014年12月5日,我62岁生日那天,是一个周五。这天晚间我收到本书作者JohSomez电子邮件。在电子邮件中,他邀请我在128日(周一)之前为这本书写一个序列。Joh电子邮件中附有几十个压缩文件包Word文档。我发现这种展示方式真的很不方便,很伤脑筋。时间如此紧迫,我没有时间为它们生成一个完整的PDF文件。事实上,我不太高兴收到这样的请求。我妻子刚刚做了膝关节置换手术,正在康复。周六早上,我有一门飞行学习课程。我计划在白天剩下的时间陪我的妻子。周六晚上,我将乘飞往伦敦的航班。我将在下周一到周五在那里讲课。因此,没有办法。我不能在周一之前完成这个顺序。我告诉Joh,他没有给我足够的时间。在开车去机场之前,我收到了Joh送我的圣诞礼物——奶酪和火腿,还有一张感谢卡——感谢我考虑为本书写序。同时,我还收到了Joh的另一封电子邮件说:他已经要求出版商宽限一天,所以他可以等我到星期二。他给我发了几封真诚的电子邮件,但我告诉他没有合适的机会,他肯定会从我身边失望。我开车去机场,登上了飞机。整个飞行过程中,我都在睡觉,然后乘出租车去了我最喜欢的伦敦酒店。漫长的旅程让我筋疲力尽。我在恍惚中玩Miecraft游戏,直到终于躺下。周一我讲了一整天的课,然后我要去SMC我在编译器上的整洁代码(CleaCode)视频系列(htt://cleacoder.com)第30集做一些工作。今天是12月9日,星期二,教学第二天,我让学生做了两个小时的练习,然后检查电子邮件,发现Joh又给我发了一封邮件,把整本书整理成简单的PDF文件。嗯,这让事情变得简单了。我可以打开文件,上下滚动浏览整本书。!请注意,这正是我想告诉你的。——Joh做了必要的事情。他想象了我可能需要什么,我想要什么。他遵循最初的要求,遵循良好的指导和及时的帮助。显然,他花了很多时间和精力让我的工作更容易,抓住这些微不足道的机会让我有机会写这个顺序。即使当我拒绝他并告诉他这几乎是不可能的时,他也继续试图诱导和帮助我。他没有放弃,也没有退缩。只要有机会,他就会继续寻找方法。这正是这本书的目的。这是一本关于如何成功的书,包括生活习惯和策略、程序和思维方式,以及各种你可以用来促进自己更接近成功的秘密技巧和技巧。在发出最初的请求后,Joh我的行为就是一个例子;他自己就是这本书写的内容的典范。所以,在学生练习的两个小时里,我打开这个PDF文件看起来像!看看这些标题!他谈到了健康、期权交易、房地产和精神平衡;他谈到了如何辞职,开始咨询业务;他谈到了参与创业、建设产品、攀登工作阶梯、营销自我……这样的例子数不胜数。我有自知之明,知道两个小时内看不完整本书,也不会这样写序,就边读边略读。但很快,我开始有了一种感觉,Joh传递了一个关键点,这是一个伟大的关键点!这是每个软件开发人员(其他人也是如此,只要他们面临同样的问题)都应该听到的全面信息。你知道如何写简历吗?你知道如何谈判薪水吗?作为一名独立的顾问,你知道如何设置咨询费吗?你知道如何权衡辞职成为兼职工作者的风险吗?你知道如何获得创业资金吗?你知道看电视要花多少钱吗?(是的,你没看错。这就是这本书的内容,这就是这本书可以教你的,这就是你需要的。我还没有读完整本书,很多内容只是略读,但我读到的内容深深吸引了我,这就足够了,毕竟,我的目的是写这个顺序。我的结论是,如果你是一个在软件开发这个复杂的行业中为自己寻找生存方式的年轻人,那么你应该拿起这本书,因为它会给你带来很多洞察力和好话。虽然开局不利,时间紧迫,困难重重,但Joh还是尽力让我为这本书写序言。他运用了他写的这本书的原则,再次取得了成功!注:以上摘自本书序二。——————-副标题:代码之外的生存指南作者:JohSomez译者:王小刚评分:8.1这是一本真正从“人”(而非技术也非管理)的角度关注软件开发人员自身发展的书。书中论述的内容既涉及生活习惯,又包括思维方式,凸显技术中“人”的因素,全面讲解软件行业从业人员所需知道的所有“软技能”。本书聚焦于软件开发人员生活的方方面面,从揭秘面试的流程到精耕细作出一份杀手级简历,从创建大受欢迎的博客到打造你,从提高自己工作效率到与如何与“拖延症”做斗争,甚至包括如何投资不动产,如何关注自己的健康。本书共分为职业篇、自我营销篇、学习篇、生产力篇、理财篇、健身篇、精神篇等七篇,概括了软件行业从业人员所需的“软技能”。通过阅读本书,软件工程人员、编程人员和其他技术人员能够积极思考自己的职业生涯,丰富自己的生活,让自己更接近成功。...

    2022-04-03

  • 图灵访谈:松本行弘与他的《代码的未来》

    松本行弘(YukihiroMatumoto),Ruy语言设计者。1965年4月14日出生于日本鸟取县。1984年,就读于筑波大学第三学科信息学系。2年后休学,成为末日圣徒耶稣基督教会的宣讲师。大学复学后,加入中田育男教授的研究室。1990年大学毕业。后在岛根大学攻读博士课程,修满学分后退学,未获学位。现任株式会社Network应用通信研究所研究员、乐天株式会社乐天技术研究所研究员,RuyAociatio理事长,Heroku首席构架师。问:松本先生的《代码的未来》和您的上一本书《松本行弘的程序世界》相比有哪些不同,又有哪些看点呢?Matz:《松本行弘的程序世界》一共涉及了14个话题,每个话题都是浅尝辄止,内容比较广泛但不是很深入,而这次的新书则是设定了一个大的主题——即对未来即将到来新技术的思考,因此内容比《程序世界》所涉及的范围要窄一些。此外,这本书还在时间尺度上进行了探讨,例如从计算机出现以来,到现在为止经历了怎样的变化,并由此来思考未来可能会发生的变化,也就是对过去和未来两方面都进行了思考。计算机的世界变化非常快,而这本书的目的在于探讨其未来变化的方向。问:关于编程语言进化的方向,保罗·格雷厄姆在一篇名叫“一百年后的编程语言”的文章,主张“拥有最简洁最小核心的编程语言”将是未来发展的趋势。对于这一观点,您在书中表示“不同意”,这是为什么呢?您对编程语言发展方向的看法又是怎样的呢?Matz:保罗是一个很喜欢Li的人,而Li所具备的特性正好符合他所说的“一百年后的编程语言”的样子,因此保罗认为一百年后的编程语言就应该变成Li这个样子。但实际上,Li这个语言的历史已经有50多年了,说实话,Li现在并没有成为一种有很多人在用的主流语言。我觉得这也许是因为Li对于大多数程序员来说不具备那么大的魅力,也就是说,作为一种“拥有最小核心”的语言,或者从某种意义上说是一种很“美丽”的语言,和程序员们所期望的语言之间,存在着一定的差距。如果一两年的时间里,Li的魅力没有被大家所接受,那还可以理解,但已经过了50年还没有被广泛接受的话,是不是它在本质上就不太符合大家的期望呢?“对人类来说好用的语言”和“拥有最小核心的语言”之间的这个差距可能是很大的,我觉得可能将来100年也没办法消除。至于未来的编程语言应该是怎样的,我觉得应该是兼具接近Li的运行模型,以及人类容易理解的语法这两方面特征,这么一看Ruy是不是更接近这样一种语言呢?问:松本先生被称为Ruy之父,我们知道在编程语言的设计过程中,可能要做出很多选择,例如动态还是静态、基于原型还是基于类等等。在Ruy的特性中,您认为当初最难做的选择是什么?Matz:在设计Ruy之前,我在上大学的时候还设计过另外一种语言,而那种语言是完全静态的,和Eiffel语言非常相似。而我原本也是特别喜欢静态语言的,不过上大学时设计的那种语言是以学术研究为目的的,多年之后,当我想设计一种编程语言作为自己的工具来用的时候,我就觉得还是动态语言实际用起来比较好用。抱着这样的想法,我设计了Ruy,现在看来这个设计还是正确的。那么当初对于Ruy应该是静态还是动态这个问题,也许算不上是最难的吧,但至少是我在设计中做出的“最大”的一个判断。而在此之后,因为是动态语言,那就借鉴一下Smalltalk和Li吧,Perl有一些功能也不错,于是如此这般吸收了这样一些语言的特性,也就显得比较自然而然了。Ruy的特点在于Mixi模块,而这个特点在Ruy诞生当时还算是非常罕见的,因为我不喜欢多继承,总觉得应该有一个更简单的方式,所以就设计了Mixi模块。问:那么现在回过头来看,Ruy当中有哪些地方会让您觉得“如果当初设计成这样就好了”呢?Matz:最开始的时候我的目标只是想实现Perl所具备的功能,因此从Perl借鉴了很多,比如说用美元符号($)来修饰变量名之类的,现在看来觉得学得有点过了,搞得和Perl太像了。当然,除此之外还有其他一些小地方,但最主要的我觉得就是这个了,也就是跟Perl太像了这一点。刚开始的时候,还没有形成Ruy的语法习惯和文化,因此很多东西都是从Perl“抄”过来的,现在看来好像一股脑拿过来的东西太多了,里面其实有一些是不需要的。而经过一段时间之后,Ruy自己的文化已经形成,Rail出现之后又形成了Rail的文化,而到了这个时候再看的话,可能就会觉得这些Perl的部分好像没啥必要呢。问:大家都认为“Ruy有现在的人气基本上都是由于RuyoRail的贡献”,您在书中也认同这个观点,那么您认为RuyoRail获得巨大成功的原因是什么呢?Matz:首先是得益于We的快速发展,几乎所有的软件开发平台都在瞄准We这个领域。以往在用CS(客户端-服务器)架构来开发的系统,现在都可以在We上实现了。在We上能够开发的应用变多了,这是一个主要的背景。另外,Ruy的优势在于进行软件开发非常容易,也就是开发效率比较高。这两点结合起来,我认为就是RuyoRail成功的主要原因。此外,Ruy还有一些比其他语言强大的特性,例如元编程(Metarogrammig),通过猴子补丁(Mokeyatch)所带来的可扩展性等等,通过这些特性,甚至可以对基础的类进行增强。DHH正是运用了Ruy的这些强大之处,开发出了Rail。而对于没有接触过Ruy的人,比如只用过Java这种比较“死板”的语言的人来说,会觉得“唉?居然还可以做到这样吗?”,我觉得这也是Rail成功的原因之一。问:据说DHH曾经是准备用PHP来开发这样一个框架的,但后来却转向了Ruy?Matz:对,因为PHP在元编程方面有很多限制吧。Rail推出之后,又出现了很多(在PHP上实现的)模仿Rail的开发框架,比如Symfoy、CakePHP等等,但是Ruy所拥有的强大特性PHP却并非完全具备,即便不考虑它们各自的背景,只是单纯去对比这些开发框架的话,我还是觉得Rail更强大一些,我觉得DHH选择Ruy也正是看重了这一点。顺便,我其实是见过DHH的,在丹麦,那时候他还没开始学习Ruy,说不定那次见面也是对他产生影响的一个原因吧。问:中国读者很关心的一个话题是,Ruy目前最广泛应用的领域就是We开发,那么在We开发这个领域之外,Ruy的发展方向又是什么呢?Matz:的确,Ruy在We开发领域被用得很多,例如Rail、Siatra等开发框架。但编程的世界并非只有We而已,我也一直希望Ruy能够从We中走出去。在不久的将来,我认为Ruy有望被应用的领域,主要有三个。科学计算(Scietificcomutig),也就是大学科研中所要用到的计算。在这个领域,Pytho、R、matla等语言用得非常多。我希望Ruy也能够进入这一领域,为此我们正在开发一个叫做SciRuy的项目,希望借此推动Ruy在大学科研计算领域的应用。高性能计算(Higherformacecomutig)。这个和科学计算有点接近,是运用超级计算机来进行计算的领域。和C++比起来Ruy确实要慢很多,所以大家都觉得Ruy不可能被用于高性能计算领域。东京大学一个研究生做了一个研究项目,将Ruy写的代码编译成C语言代码,然后再编译成二进制程序,这个过程中需要用到类型推导等技术,最好的情况下,速度能够达到C语言(指用C语言人工编写的同等程序)的90%。这个项目目前只发表了论文,还没有公开源代码,我希望明年这个项目的成果能够全部公开。嵌入式(Emedded)开发。所谓嵌入式就是指在微型设备,例如手机、医疗器械、机器人,在这些环境下,现在的Ruy其实并不是很适合,内存开销很大,API也不合适,因此才需要开发适合嵌入式开发的,内存开销比较小的,并且具备面向嵌入式开发API的Ruy引擎,这也就是mruy。以这三个领域为首,我希望Ruy能够在We开发以外的领域有更多的发展。问:Twitter主要是用Rail开发的,我看了一则消息,说美国大选的时候Twitter遇到了前所未有的大访问量,Twitter称为了应付访问量的上升,正在从Ruy转移到其他语言,您对这个问题怎么看呢?Matz:这里面原因很多吧。首先,Twitter刚开始开发的时候,没人知道Twitter会获得今天的成功,当时很多人觉得,这种只能写140个字的博客有什么意思呢?但Twitter却出人意料地获得了巨大的成功。在这个过程中,Twitter增加了很多新功能,在它快速发展的过程中,Ruy的贡献是相当大的。因为一个新功能从构思出来到付诸实现,可以用很短的时间就能够完成。Twitter刚开始开发的时候不可能考虑到会有现在这样大的访问量,也就是遇到了设计上的瓶颈了,因为一般的网站也不可能会有每秒上万的访问量,因此可以说现在的Twitter发展到当初在设计上的极限了。为了解决这个问题,Twitter需要开发一个全新的架构,以应付现在越来越大的访问量。不过,即便要重写架构,我觉得沿用Ruy也是可以做到的吧?(笑)话说,一个网站在遇到设计极限的时候,有很多解决方法,比如重写架构、换其他语言等等,其中重写架构我觉得是最重要的,而实际上Twitter也正是做了这方面的工作。但在这个过程中,他们的工程师想要挑战一些新的东西,那么从编程语言上来说,就提出要改用Scala,因为Scala是编译型语言,性能也不错,正好适合编写新的架构,我觉得这样也不错。在我看来,在网站所提供的服务还没有完全成型的时候,最重要的是能够对需求的变化做出快速的反应,这个时候就需要Ruy这样灵活性比较高的语言;而在网站获得成功之后,遇到了设计瓶颈,用一种新的语言,比如Scala,来编写一个新的架构,以节约一定的资源,我认为这也是很好的一个结果。Twitter转向Scala还只是在其核心部分,而在We前端和一些内部工具上还有很多地方在用Ruy。其实,上个月我还去拜访了一下Twitter,跟他们的工程师进行了一些交流,Ruy还是用得很多的哦(笑)。问:目前世界范围内广泛使用的语言大部分都是来自欧美的,作为例外大概只有来自巴西的Lua和来自日本的Ruy,您在书中也说这种情况让人感觉“很寂寞”,那么造成这种情况的原因是什么呢?要改变这种局面,我们应该做出怎样的努力呢?Matz:关于Lua呢,其实如果你要说它是欧美的也可以,巴西是属于“拉丁美洲”嘛(笑)。要说亚洲或者东亚这边的话,那就只有Ruy了,真的是蛮寂寞的一件事。从世界范围来看,(对于编程语言来说)欧洲和美国的影响力应该是最强的,而亚洲虽然有众多的人口,但却没有能够出现很多的编程语言,确实挺寂寞的。如果说对将来的期待,别的国家我不太清楚,至少在日本,其实是有很多人在开发各种各样的编程语言,但除了Ruy以外,其他的语言在日本以外几乎就没人知道了。如果对编程语言感兴趣的人越来越多,所创造出来的编程语言也越来越多的话,这其中应该就会有那么一两个能够取得成功吧。在日本还存在一个问题就是语言障碍,日本人除了母语以外,精通外语的人不多,有趣的是,居然有用日语来编写程序的编程语言呢。(图灵社区:说到这个,其实中国也有用汉语写程序的编程语言呢。)中国也有吗?果然。不过这些语言虽然有趣,却只能给日本人用,也就无法走向世界了。说句题外话,我曾经收到过一个美国人发给我的一封邮件,他说你是个日本人,但Ruy看上去却跟英语没什么区别,因为Ruy程序都是用英语写的嘛,难道没有用日语写程序的编程语言吗?为什么没有呢?我只好回答说:有啊,只不过你不知道而已,即便知道你也没办法用嘛。现在在日本对编程语言感兴趣的人不断增加,大概我总是在网上还有书里说编程语言多么有趣,多少也是受了我的这些言论的影响吧,现在有不少人在挑战设计新的编程语言。在这些新的编程语言中,如果能有千分之一的语言能够最终获得成功,我认为就是很好的结果了。我不知道中国、韩国,以及其他一些亚洲国家中,有多少人想要挑战这一领域,不过如果大家以我的这本书为契机,能够改变“编程语言是别人给我们的,我们只能被动接受”这种看法,继而抱有“自己创造一种编程语言也不错嘛”这样想法的人能够越来越多的话,这其中一定会有人获得成功。说到开源,无论是日本,还是中国、韩国,在世界范围内发表的项目还很少,这也算是一个可以去努力的切入点。这里面可能有很多原因,比如英语很难学,(图灵社区:比如GitHu也很难用?)哈哈,GitHu在中国能用吗?(图灵社区:能用能用……)唔,还好还好。不过,这个(哔——)的影响还是很大的,有很多资料不太容易获得吧。(图灵社区:是啊,比如Go语言的官网就上不去呢。)啊!Go的官网上不去吗!果然是因为它是Google的吧(笑)。总之,需要面对的难题还是很多的。另外,在日本也是如此,程序员把大多数时间都用在了工作(挣钱)上,要进行开源项目之类的活动就比较困难了。10年前,开源这个概念在日本也没人接受,而现在大家都逐渐明白了开源的主要性,开源项目也就逐渐增多了,我想未来几年中,在中国应该也会产生类似的变化吧,我很期待。而且,在刚开始做的时候,没人知道到底做什么会成功。我在设计Ruy的时候,也不可能想着Ruy很不错以后一定会在全世界广泛使用。因此,一种编程语言生逢其时可能更重要一些,但这种事情,你不去尝试一下是不会知道结果的。在中国,也一定会有一些编程语言或者软件因为生逢其时,从而走向世界并获得成功。问:在书里讲到Dart的时候,您说过对于编程语言来说,生态环境是很重要的。那么要建立这样的生态环境,需要一些怎样的努力呢?Matz:从用户的角度来看,用这种编程语言,对我有什么益处,这一点很重要。在Rail出现之前,使用Ruy的人,包括我自己在内,大多数都是觉得Ruy写程序很轻松,这可能是选择Ruy的主要目的。当然,Rail出现之后,因为“我要做个网站,Rail最快”这样的理由而使用Ruy的人变多了。因此,如果你设计一种新的语言,如果能够准确地传递给用户使用这个语言所能带来的好处,我想这样的语言成功的可能性会更大一些。问:非常感谢,在采访的最后,请您谈谈对中国程序员的寄语吧。Matz:在《程序世界》中我也提到了,我觉得编程的未来应该会以开源的形式发展下去,未来的创新性软件或者编程语言,可能都会以开源的形式出现。作为开源软件来说,别人做出来我可以免费使用,这一点大家都很开心。在经历了这个阶段之后,如果能够更进一步,将自己做的软件开源,使其对全世界产生影响,如果能做到这一步的话,你可能就会成为一名一流的软件工程师。中国的软件工程师,就我接触的这些人来看,大家都非常认真和努力地学习技术,我希望这些人之中,能够有更多的人迈出这一步,从而成为可以影响世界的一流程序员。————————-来源:图灵访谈...

    2022-04-05

学习考试资源网-58edu © All Rights Reserved.  湘ICP备12013312号-3 
站点地图| 免责说明| 合作请联系| 友情链接:学习乐园