发表于: 2017-12-06 23:31:51
1 644
今天完成的事
上午买凳子忙了一上午
又过了一遍任务1的深度思考 ,之前很多搁置的都补上了
任务一
1.maven是什么,和Ant有什么区别?
Maven是一种项目管理和理解工具。Maven向开发者提供了一个完整的构建生命周期框架。开发团队几乎不用花时间就可以使用自动化构建项目的基础框架,因为 Maven 使用了一套标准的目录结构和默认的构建生命周期。
在存在多个开发团队的场景中,Maven可以在很短的时间内按标准建立起工作方式。因为大多数的项目配置简单并且可重用,Maven简化了开发者在创建报告,检查,构建和测试自动化配置中的工作。
Maven提供给开发者管理如下过程的方法:
• 项目构建(Builds)
• 文档(Documentation)
• 报告(Reporting)
• 项目依赖(Dependencies)
• 软件配置管理(SCMs)
• 发布(Releases)
• 分发(Distribution)
• 邮件列表(mailing list)
总的来说,Maven简化和统一了项目构建的过程。它无缝地处理项目编译,分发,文档,团队合作和其他任务,增加了任务处理的重用性,并可以处理大多数构建相关的任务。
Ant的作用:是一种基于Java的build工具
1. 可以用ant编译java类,生成class文件
2. ant可以自定义标签、配置文件,用于构建。
3. ant可以把相关层构建成jar包 。
4. ant把整个项目生成web包,并发布到Tomcat
Maven的作用: 除了以程序构建能力为特色之外,还提供高级项目管理工具。
Maven除了具备Ant的功能外,还增加了以下主要的功能:
1. 使用Project Object Model来对软件项目管理;
2. 内置了更多的隐式规则,使得构建文件更加简单;
3. 内置依赖管理和Repository来实现依赖的管理和统一存储;
4. 内置了软件构建的生命周期;
http://blog.csdn.net/hy6688_/article/details/46701061
________________________________________
2.clean,install,package,deploy分别代表什么含义?
Mavan最主要的命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。执行test之前,先执行compile、执行package之前先执行test、执行install之前先执行package,这就涉及到一个概念:Maven生命周期。这个生命周期可以从两方面来理解,第一,顾名思义,运行Maven的每个步骤都由它来定义的,这种预定义的默认行为使得我们使用Maven变得简单,相比而言,Ant的每个步骤都要你手工去定义。第二,这个模型是一种标准,在不同的项目中,使用Maven的接口是一样的,这样就不用去仔细理解每个项目的构建了,一般情况下,mvn clean install 这样的命令是通用的。我想,一定是吸收了许多项目的经验,Maven才能定义出如此完善的模型。
在Maven中有三套独立的生命周期:
• Clean Lifecycle:在进行真正的构建之前进行一些清理工作
• Default Lifecycle:构建的核心部分,编译、测试、打包、部署
• Site Lifecycle:生成项目报告、生成站点、发布站点
3.怎么样能让Maven跳过JUnit?
maven 在开发阶段可以不跳过单元测试,但是到了线上部署和测试运行单元测试的话会污染数据库,所以还是需要跳过测试的
1.mvn install -Dmaven.test.skip=true
2.使用插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
4.为什么要用Log4j来替代System.out.println?
Log4j除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。方便fixBUG
程序员经常会遇到脱离java ide环境调试程序的情况,这时大多数人会选择使用System.out.println语句输出某个变量值的方法进行调试。这样会带来一个非常麻烦的问题:一旦哪天程序员决定不要显示这些System.out.println的东西了就只能一行行的把这些垃圾语句注释掉。若哪天又需调试变量值,则只能再一行行去掉这些注释恢复System.out.println语句。
使用log4j可以很好的处理类似情况。
5.为什么DB的设计中要使用Long来替换掉Date类型?
date类型不方便计算和使用,以及不利于网络传输
6.自增ID有什么坏处?什么样的场景下不使用自增ID?
自增ID销毁后不能重复使用,即10个id ,删除掉第十个下一次新增的id会为11,在需要保证ID连续性的情况下比能使用自增ID
7.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
想感受索引的的性能最低也要10W数量级的数据量才会感受到差别,应该针对经常要查询的且数据变化频率低的列建立索引
8.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。
1、普通索引
普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。
2、唯一索引
普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次。
如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
9.如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?
不需要 唯一索引插入重复数据会报错
10.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?
CreateAt应该在插入新数据的时候赋值,UpdateAt在数据该条数据发生变化或者更改就需要重新赋值,不应该开放给外部接口,直接在JAVA中给这两个赋当前操作时间戳
11.修真类型应该是直接存储Varchar,还是应该存储int?
对于分类比较明显的字段,可以使用int类型储存以提高查询性能,可以在JAVA中转换成想要的字符
12.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?
MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用可变长的varchar来存放,这样就能有效的减少数据库文 件的大小。
text和varchar基本相同。text会忽略指定的大小这和varchar有所不同,text不能有默认值。尾部有空格不会被截断。text使用额外的2个字节来存储数据的大小,varchar根据存储数据的大小选择用几个字节来存储。text的65535字节全部用来存储数据,varchar则会占用1-3个字节去存储数据大小和非空标记。存储范围为65535字节。
13.怎么进行分页数据的查询,如何判断是否有下一页?
MySQL数据库实现分页比较简单,提供了LIMIT函数。一般只需要直接写到sql语句后面就行了。
LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数
select * from persons limit A, B;
A,查询起点
B,你需要的行数
14.为什么不可以用Select * from table?
Select * from table会查询表内所有数据,然而需要使用的数据往往没有这么全面,所以大大降低了效率。正确的使用方法一般是只查询我们所需要的字段就OK了
15.什么是贫血模型,什么是充血模型?为什么我们会强制要求使用贫血模型?
贫血模型:是指领域对象里只有get和set方法,或者包含少量的CRUD方法,所有的业务逻辑都不包含在内而是放在Business Logic层。
优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Business Logic->Data Access(ADO.NET)。当然Business Logic是依赖Domain Object的。
该模型的缺点是不够面向对象,领域对象只是作为保存状态或者传递状态使用,所以就说只有数据没有行为的对象不是真正的对象。在Business Logic里面处理所有的业务逻辑,在POEAA(企业应用架构模式)一书中被称为Transaction Script模式。
充血模型:层次结构和上面的差不多,不过大多业务逻辑和持久化放在Domain Object里面,Business Logic只是简单封装部分业务逻辑以及控制事务、权限等,这样层次结构就变成Client->(Business Facade)->Business Logic->Domain Object->Data Access。
优点是面向对象,Business Logic符合单一职责,不像在贫血模型里面那样包含所有的业务逻辑太过沉重。
缺点是如何划分业务逻辑,什么样的逻辑应该放在Domain Object中,什么样的业务逻辑应该放在Business Logic中,这是很含糊的。即使划分好了业务逻辑,由于分散在Business Logic和Domain Object层中,不能更好的分模块开发。熟悉业务逻辑的开发人员需要渗透到Domain Logic中去,而在Domian Logic又包含了持久化,对于开发者来说这十分混乱。其次,因为Business Logic要控制事务并且为上层提供一个统一的服务调用入口点,它就必须把在Domain Logic里实现的业务逻辑全部重新包装一遍,完全属于重复劳动。
16.Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
在传统的程序设计过程中,调用者直接使用new关键字创建被调用者的实例,调用者和被调用者之间的耦合度很高,要由调用者亲自创建被调用者的实例对象,不利于软件的移植与维护。
17.为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?
通俗的讲,就是为了降低耦合度。
接口分离原则的核心思想是:不应该强迫客户程序依赖它们不需要使用的方法。英文缩写ISP,即Interface Segregation Principle。其实接口分离原则的意思就是:一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该 把所有的操作都封装到一个接口中。
这里的“接口”指的不仅仅是通过interface关键字定义的接口,接口分为如下两种。
对象接口。java中声明的一个类,通过new关键字产生的一个实例,它是对一个类型的事物的描述,这也是一种接口。
类接口。这中接口就是通过关键字interface 定义的接口。
也就是说,接口分离原则要求的是在一个模块中应该只依赖它需要的接口,以保证接口的小纯洁。而且需要保证接口应该尽量小,即设计接口的时候应该让接口尽量细化,不要定义太臃肿的接口(比如接口中有很多不相干的逻辑方法声明)。
接口分离原则与单一职责有些相似,不过不同在于:单一职责原则要求的是类和接口职责单一,注重的是职责,是业务逻辑上的划分。而接口分离原则要求的是接口的方法尽量少,针对一个模块尽量有用。
18.为什么要处理异常,Try/Catch应该在什么样的场景下使用,在真实的系统中,会出现网络中断,DB连接不上的错误吗?多久会发 生一次?
使用try/catch捕获异常的情景主要有:
1. 程序块中语句可能的异常不能引起其他逻辑中断;
例如:缓存逻辑不能影响正常的逻辑运行,故缓存逻辑应该放在try/catch块中。
2. 必须对异常进行处理,否则会降低用户使用体验。
例如:异常到了Controller层,若不处理则会返回404或500错误页面,因此,必须使用try/catch处理各种异常。
真实项目可能会出现使用远程数据库或云数据库的情况,这样的话一旦网络出现问题,那么就会出现DB链接不上的错误,
19.日志应该怎么打,在什么位置,需要打印出来什么样的关键参数?
很多开发人员习惯于使用 System.out.println、System.err.println 以及异常对象的 printStrackTrace 方法来输出相关信息。这些使用方式虽然简便,但是所产生的信息在出现问题时并不能提供有效的帮助。这些使用方式都应该改为使用日志 API。
在记录日志消息时应该尽可能多的包含当前上下文中的各种信息,以方便在遇到问题时可以快速的获取到所需的信息。比如 入参 出参 以及其他关键参数
20.为什么需要单步调试?Debug的时候IDE是怎么找到源码的?
单步调试可以更精准的定位错误,比起打日志效率精确度更高
IDE通过追溯代码的执行流程来找到源码
21.可否远程连接到线上直接调试?真实的项目中,遇到问题的排查方案是什么?
可以,IDEA中有利用本地代码为远程代码DEBUG的功能
服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须和远程服务器运行的代码一致)中设置断点,每当有请求到远程服务器时时能够在本地知道远程服务端的此时的内部状态。
https://www.cnblogs.com/wy2325/p/5600232.html
听师兄讲了下项目开发流程
看了下程远总结的敏捷开发
把PPT又写了一点
遇到的问题:
上午有事耽误了
明天的安排:
准备小课堂
准备复盘评审PPT
收获:项目开发流程
任务进度:复盘项目 复盘准备
开始时间:2017.12.1
预计评审时间:12.11
禅道:http://task.ptteng.com/zentao/project-task-276.html
评论