• 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 架构 代码 编程 基础架构即代码

  • EpubPress:把打开的多个网页转成一本电子书

    如何将网页转换为合适的Kidle阅读的moi格式电子书,书伴推荐了几种工具,比如亚马逊官方微信微信官方账号提供的SedtoKidle(好像现在只能推微信官方账号文章了),已经停止服务的Readaility。这次推荐一个有用的小工具——EuPre,它最大的特点是将打开的多个标签页面合并成电子书文件。一、EuPre是什么EuPre是开源Javacit项目,由HaroldTree开发,在托管GitHu上。EuPre可以去除影响阅读的元素,如网页上的广告,并将网页内容转换为EPUB或MOBI电子书,即提高页面内容的可读性,也便于离线或稍后阅读。EPUB和MOBI格式可以适应大多数可读设备,如Kidle、Nook、iPhoe,iPad、PC等等。当然,最值得一提的特点之一是,它还可以将多个页面集成到电子书文件中。Kidle推送避免了网页和电子书造成的分散。EuPre提供浏览器插件等多种用法(chrome...

    2022-04-03 电子书epub下载网站 电子书epub是什么格式

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

    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

  • 制作 Kindle 屏保图片三步走:打开、调整和保存

    许多小伙伴越狱Kidle就是用ScreeSaverHack这个插件取代了默认的屏保图片。但是最近总是遇到朋友反馈Kidle屏幕保护插件故障的具体问题是,在将图片放入插件的指定目录后,重复打开和关闭几次屏幕保护将变得透明。特别是对这个问题的后续简要理解,发现这个问题的原因是在图片上。由于图片来源不同,朋友们处理图片的方式也不同,加上Kidle屏保比较挑图,一旦不符合规格就会出现上述问题。因此,本文介绍了两种制作Kidle屏保图片的方法。此外,为了缓解懒癌小伙伴的痛苦,Kidle伙伴还专门准备了Kidle屏保图册这里会不时更新一些精心挑选和切割的屏保图片,每一张都提供了适用于不同屏幕分辨率的图片文件。如果您对提供的图片不满意,也可以按照以下方法下载原始图片。一、准备工作在制作屏保图片之前,首先确保你的Kidle已经越狱并已成功安装ScreeSaverHack插件,否则无法定制屏保。然后你需要知道你手里的Kidle设备屏幕尺寸:Kidle设备型号屏幕尺寸(长*宽像素)KidleOai2(KO2)1680*1264KidleOai(KO)1448*1072KidlePaerwhite4(KPW4)KidlePaerwhite3(KPW3,黑/白,含32G版)KidleVoyage(KV)KidlePaerwhite2(KPW2)1024*758KidlePaerwhite1(KPW1)Kidle8(K8,558入门版Kidle,黑/白)800*600Kidle7(K7,499入门版Kidle,黑/白)其它型号Kidle二、图片素材搜索图片素材的方法有很多,比如使用Google等搜索引擎的图片搜索、壁纸下载站、图片材料站等。但无论获取来源在哪里,除了个人偏好的主题外,如果你想获得更好的屏幕保护效果,你需要注意材料图片的规格。Kidle屏幕有两种:水平和垂直。为保证屏幕质量,可参考以下建议筛选材料图片。制作要求素材条件水平构图材料-...

    2022-04-04

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

    松本行弘(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 
站点地图| 免责说明| 合作请联系| 友情链接:学习乐园