自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序•袁

CLEAN CODER

  • 博客(47)
  • 资源 (81)
  • 收藏
  • 关注

原创 ThoughtWorks给你不一样的入职之旅

本文同时发表于 ThoughtWorks洞见。不一样的旅程ThoughtWorks是一家极具创造力的公司,在这里,人才是最重要的资产。如果你以应届生的身份加入TW,你将获得5周的出国留学机会(ThoughtWorks University,简称TWU),如果你通过社招加入TW,你会获得为期三天的TWI。除了TWU、TWI,TW还提供诸如NHO、Session、Workshop、Buddy/...

2018-12-03 09:59:19 1804 1

原创 我在ThoughtWorks中的敏捷实践

为了更好的阅读体验,欢迎访问 博客原文 此文章已发表于InfoQ,阅读InfoQ文章项目回顾项目背景E项目是一个在线的物资跟踪监控系统。由ThoughtWorks团队为客户提供的一套完善的软件交付服务。该系统为资助物资的跟踪与监控提供了完整的网络解决方案。整个流程涵盖了客户对物资来源的管控、库存管理、物资下发与跟踪、客户与IP(Implementing Partne

2016-05-03 10:24:29 15011 4

原创 Scrum需要一个双刃团队

Scrum是一场创业1993年,Jeff和Ken开创了Scrum,至今已经有25年之久。如今敏捷开发也不是什么流行词儿,不少IT组织已经走在敏捷转型的路上,还有一部分组织则刚痛下决心抛弃瀑布式计划型开发模型,试图采纳敏捷开发框架(比如Scrum)。但大部分组织即便拼得遍体鳞伤,仍然无法按期交付卓越的软件,最后要么放弃,要么就医 – 引入专业敏捷咨询师,ThoughtWorks已帮助业界诸多大型组...

2019-01-04 09:58:52 275 1

原创 简单设计落地三板斧

如果你认同 简单设计的价值观,我相信 解析简单设计原则 对你来说很容易理解并接受,它不像面向对象设计原则(比如:SOLID)那么晦涩难懂,它给你指明了一条明朗可通行的道路。即便如此,前进的道路依然不是一帆风顺,尤其对于新手来说,怎么将这些已经很接地气的原则更高效地落地,从而创造更大的价值,本文我将分享帮助我们落地简单设计的三板斧:TDD、重构和整洁代码。价值体系假如让你去建造一幅巨大的广告牌...

2018-12-24 09:33:05 524

原创 解析简单设计原则

在 我的简单设计价值观 一文中,我分享了我在实践中形成对简单设计的理解。而提到价值观,平时跟同事讨论某个技术实践的时候,一旦触碰到价值观,我就会很谨慎,因为在两个人价值观不同的前提下,去讨论一项实践的好坏,很可能在面红耳赤之后不欢而散。如果你压根都不认同简单设计价值观,我不建议你阅读此文。如果你跟我刚开始类似,并不是不认同简单设计的价值观,只是觉得它很抽象,没法落地,本文我会基于Kent Bec...

2018-12-23 20:12:12 995

原创 我的简单设计价值观

保持简单简单是一个成年人司空见惯的词,我们大部分人却觉得纯真的孩子才是简单的很多时候,我们习惯把简单跟容易理解为是一个意思,比如:这个问题好简单(复杂),另一层含义是:解决这个问题很容易(困难)?这个时候简单跟容易是一个意思。再比如说:我真羡慕她能过如此简单的生活。另一层含义是什么呢?我们先来看一张图:简单和复杂多用于形容事物或人的属性或状态,容易和困难一般形容达到某种目标的过程。所以...

2018-12-11 18:24:26 341

原创 Workshop中的价值交付投射模型

循序渐进的偶然有些事情单独看起来有点偶然,仔细回想起来却是循序渐进的过程。去年在北京一次偶然的应届生培训,让我向培训师又靠近了一步,紧接着顺水推舟,借着微服务的一阵学习分享的东风,我偶然地负责了一起面向北京Office的微服务技术实践的Workshop,而就在此前不久,我偶然被选为公司微服务培训的目标学员,恰好我所在的项目又采用了微服务的那些技术实践…作为组织者以及培训师,我难免会遇到一系列问...

2018-12-10 09:15:44 232

原创 一枚程序员眼中的单元测试

为了更好地阅读体验,欢迎访问 博客原文论测试的重要性如今程序员群体赶上了中国最庞大的农民群体,大街上随便抓一把,十有八九是程序员,还一个刚从某国企离职报名参加软件培训班。我想码农的称号或许就是这么来的吧。在外行人看来,程序员是一个成天对着电脑倒腾着代码、看着Terminal上行云流水般的打印、过着不修边幅的日子外加超负荷的码农。在内行人看来,程序员是一个成天面对QA的”质疑”

2018-11-28 14:03:15 397 1

原创 改善程序员生活质量的 3+10 习惯

为了更好地阅读体验,欢迎访问 博客原文。本文同时发表于 ThoughtWorks中国简书一封离职邮件2017年的一天,代码伴随着手指极具节奏感地输出在IDE上,突然某Chrome插件弹出一封邮件提示:“今天是我在ThoughtWorks的最后一天”。遇到这种离职邮件,我都会点进去,一来看看是否是自己曾经共事的小伙伴,二来了解一下小伙伴离职的原因。离职原因无出其右:跳出去接受更有挑战的

2018-11-28 13:59:14 247

原创 从另一个角度告诉你单元测试的意义

为了更好地阅读体验,欢迎访问 博客原文【文末有程序员福利】当下微服务如火如荼,各个团队在争先恐后推出微服务,不论在概念上还是在实践上,如果自己没有跟微服务挂上钩,便会被贴上落伍的标签。我们在推微服务的时候,我们说微服务架构具备如下优势:架构灵活,能够应对复杂的业务需求。独立部署,大大提高CI/CD的效率。服务自治,支持技术栈多元化。……这些特征恰恰是单点应用无法具备的,

2018-11-28 13:55:02 333

原创 写给新人的一封信

为了更好地阅读体验,欢迎访问 博客原文。本文同时发表于 ThoughtWorks洞见情从何起最近工作和生活中发生了一些事情,促使我想写点东西,给新人写点东西,何谓新人,后文会有介绍。先来缕一缕最近所发生的事情:去年一个来我们组实习的大一小妹妹(现在大二了),突然微信找到我,想从测试转到开发方向,向我寻求建议。某在校生通过 我的博客 加了我的微信,向我打听从事软件开发行业的一些

2018-01-30 13:23:22 865 3

原创 Buddy/Sponsor培训•信任的构建

为了更好地阅读体验,欢迎访问博客原文Buddy/Sponsor是什么?Buddy,正如这个词的意思,小伙伴,好朋友。记得加入ThoughtWorks的时候,大家在公司内部的Session和微信群里喊的最多的是小伙伴。慢慢地我发觉一个现象:几乎每个人都把同事当成自己的小伙伴,大家相处很友好,互帮互助,整个氛围像个大家庭。试想一下,一个刚加入TW的新人,对TW的组织文化和做事方式充满好奇

2016-06-22 22:14:26 3485

原创 Ruby on Rails 路由解析

Rails中URL的约定严格基于`RESTful`风格的。客户端的请求其实是在操作一些资源,同一资源的不同的请求动作(`GET`, `POST`, `PUT`, `PATCH`, `DELETE`)分别对资源进行不同的操作(CRUD)。默认的情况下,我们只需要在routes.rb文件中配置好资源,Rails会为该资源生成7种不同的路由,根据路由就可以将客户端的请求转交给服务端对应的控制器进行处理,然后做出正确的响应。

2016-04-14 19:56:25 9864 1

原创 Ruby on Rails 初次冲浪体验

Rails是一个用Ruby编写的Web应用开发框架。它的设计目标是通过预先提供开发人员最开始需要的基础设施,从而让Web应用开发更加容易。它可以让你写更少的代码来完成其他语言和框架所不能完成的工作。有过Rail开发经验的人都说它能让web应用开发变得更有趣。

2016-04-13 22:09:21 6151

原创 Ruby Get Started

我虽说有近3年的软件开发经验,但对与[Ruby](https://www.ruby-lang.org/en/),我也是一个新手,近期项目中用到了[Ruby on Rails](http://guides.rubyonrails.org/index.html)。本文是我在学习ruby是经历的一些过程,主要是开发前的一些环境的准备,分享出来,供初学者参考。

2016-04-12 20:27:52 673

翻译 初次做技术领导的3个陷阱

Don’t miss the author’s earlier post on the 5 Tips for Being an Effective Tech Lead. 不要错过作者之前发表的文章高效技术领导的5个锦囊妙计The first time a developer steps into the role of a Tech Lead can be difficult. The ski

2016-03-31 08:49:24 994

翻译 高效技术领导的5个锦囊妙计

Becoming a Tech Lead is a tough transition for any developer, because only part of the skills and experience you had as a developer prepares you for the expectations of a new role. Instead of simply de

2016-03-31 08:44:20 839

翻译 Django 数据库事务

管理数据库事务Django框架提供了好几种方式来控制和管理数据库事务。(以下Django框架会简化为Django,读者可自行脑补框架两字)Django框架默认的事务行为自动提交作为Django默认的事务行为,它表现形式为:每次数据库操作会立即被提交到数据库中,除非这个事务仍然处于激活状态。 那么,更多详细内容见下文。Django使用事务或者保存点来保证多个ORM操作的完整性,尤其是针对delete(

2016-03-30 16:07:46 14045 2

翻译 Django REST 异常处理

异常异常处理…允许错误处理在程序结构的中心或者高层级的地方被清晰有条理的组织起来。 Exceptions… allow error handling to be organized cleanly in a central or high-level place within the program structure. — Doug Hellmann, Python Exception

2016-03-30 15:52:17 8460 1

原创 大话设计模式

大话设计模式这是一个中国人写的书,准确的说是博客。经常听到有人说国人写不出好书,而说的人自己有梦想写出一些书,那言外之意…有些书,是好书,我们可以好好精细研读。有些书,写的不是那么精彩,我们可以借鉴学习。而能出版的书(一些不常见的出版社除外),总有值得我们去学习的东西。其实熟的好与坏很多时候不在于书的本身,而是我们赋予它的位置。大话设计模式就是一门OOD入门的书,你可以把它当小说来读,

2016-01-06 08:57:30 1289

原创 程序员的职业素养

程序员的职业素养我想说,很多时候,并不是我们不愿意变得优秀,而是我们不知道如何变得优秀。 穷爸爸和富爸爸相差的就是一个观念,码农和程序员相差的也只是一个观念。 如何形成这个观念?最好的方式在我们刚起步的时候给自己种下一颗观念的种子,然后让它就会在脑子里生根发芽,并不断地被浇灌孕育…

2016-01-04 21:58:06 690

原创 ThoughtWorks,我的2015

ThoughtWorks,我的20152015年3月26日,我正式加入ThoughtWorks,这一天,我内心充满了喜悦,也多了几分压力,我的ThoughtWorks之旅在就我憧憬了一年后真的开始了。那么2015年3月26日之前,我在哪里呢?一笔可以带过:和朋友创业失败,过了本命年的春节后,我再次来到ThoughtWorks西安办公室,招待我的还是美丽及气质不凡的HR唐丽娟...

2016-01-03 21:39:44 3280 2

原创 设计模式(002) 模式语录

单例(Singleton):保证一个类有且仅有一个实例,并提供一个访问它的全局访问点。(我更倾向于这样的描述:保证一个类最多有一个实例...)工厂方法(Factory Method):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。将一个类的实例化延迟到子类。(这里的接口不是特指interface)抽象工厂(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它具体的类。(貌似有些抽象)建造者(Builder):将一个复杂对象的构建与它的表示分离,使得同样

2015-02-20 11:17:40 1842

原创 设计模式(001) 开启设计之旅

“身体和灵魂,总有一个在路上”,有的人旅行,有的人看书,还有些人在旅行中写出启迪人心的好书来,身体在路上赋予了灵魂的力量。我的设计模式之旅,与你、与我,能带来什么呢?抛开遥远深邃的美丽传说,是为了感谢OOD给了我新的生命力,是为了将自己的所学贡献给社区,是为了给后生多点上一盏灯,是为了让自己的灵魂保持活力,最后,也是最重要的,为了中国的软件行业不要多出我这个码农。转行本来是要冒风险,要转身,为什么不华丽转身呢?既然转身,为什么不昂首挺胸走下去呢?既然走下去,为什么独自一人呢?So,我自掏腰包,买了车票,跟随

2015-02-11 09:32:03 1921 2

原创 Java泛型解析(04):约束和局限性

前两节,认识和学习了泛型的限定以及通配符,初学者可能需要一些时间去体会到泛型程序设计的好处和力量,特别是想成为库程序员的同学就需要下去体会通配符的运用了,应用程序员则需要掌握怎么使用泛型,这里针对泛型的使用中的约束和局限性做一个介绍性的讲解。

2014-10-15 09:42:40 3763 3

原创 Java泛型解析(03):虚拟机执行泛型代码

Java虚拟机是不存在泛型类型对象的,所有的对象都属于普通类,甚至在泛型实现的早起版本中,可以将使用泛型的程序编译为在1.0虚拟机上能够运行的class文件,这个向后兼容性后期被抛弃了,所以后来如果用Sun公司的编译器编译的泛型代码,是不能运行在Java5.0之前的虚拟机的,这样就导致了一些实际生产的问题,如一些遗留代码如何跟新的系统进行衔接,要弄明白这个问题,需要先了解一下虚拟机是怎么执行泛型代码的。总结: 1.记住一点,虚拟机中没有泛型,只有普通的类。 2.所有泛型的类型参数都用它

2014-10-14 09:46:25 2619 1

原创 Java泛型解析(02):通配符限定

1.泛型参数的限定,使用extends关键字,限定多个类型时用"&"隔开。如:<T extends Runnable& Serializable> 2.泛型参数限定中,如果限定的类型是class而不是interface,则class必须放在限定类表中的第一个,且最多只能存在一个class。如:<T extends ArrayList & Runnable& Serializable> 3.通配符只能用在泛型类的泛型参数中,不能单独使用。如Couple<?>、Couple<? exte

2014-10-13 09:42:07 3655 7

原创 Java泛型解析(01):认识泛型

Java从1.0版本到现在的8,中间Java5中发生了一个很重要的变化,那就是泛型机制的引入。Java5引入了泛型,主要还是为了满足在1999年指定的最早Java规范之一。经过了5年左右的时间,专家组定义了一套泛型规范,实现后通过测试投入到使用。所以说泛型是Java5以后才有的,欲知详情,继续往下看。 这一节里,对泛型有了一个整体的认识,知道它是什么?为什么要用它?谁会用它?以及如何使用它?通过了泛型类和泛型方法的实践,感受了如何实现自己的泛型,后面一节,将对泛型中通配符进行讲解,以及虚拟机对泛型类

2014-10-12 16:32:39 2628

原创 Android实践--apk反编译

Andriod的apk在编译打包的时候将资源文件进行了二进制编译,.class文件编译成了.dex文件,经过了这几步之后,我们是无法查看资源文件和java文件,如果我们想看看市面上一些优秀app的设计和实现,我们就需要做一些工作了,具体有一下三个方面市面上有些app的布局设计的还是不错的,这时候你要借鉴参考一下,需要做一些工作了:1.反编译资源文件: 需要apktool工具。apktool下载 Google code官方下载2.反编译dex文件: 需要dex2jar工具。 dex2ja

2014-05-10 12:14:46 3232

原创 Android实践--监测网络状态

我们在使用Android手机时候,一些APP需要网络环境才能运行,所以手机需要可用的网络,不管是2G、3G或者WIFI,甚至有一些比较耗流量的APP只能在WIFI的环境下运行,或者提供用户自行选择是否只能在WIFI环境下运行,作为用户貌似后者体验更好,那么作为开发者,我们仅仅需要几步就能给用户这种体验。

2014-05-10 10:09:15 2085 2

原创 Android实践--模拟器的加度的快感

Android---如何提高模拟器的速度        做Android开发的程序猿们,很多人心中有一纠结:“Android模拟器怎么这么慢啊,用自己的爱机测试有点小小不舍”,谷歌推出的adt-bundle-windows-x86在省去了Android程序猿辛苦安装adt插件的时候还是没有直接解决Android模拟器的速度上的劣势,就在这一点上有点输给了Mac上的ios,今天袁老师悄悄地来揭晓

2014-03-28 23:24:10 4986 6

原创 阿里巴巴面试题--Java对象初始化

这是一道阿里巴巴的关于Java对象初始化的面试题,堪称经典,代码很简单(编写格式做了些修改),但是需要面试者对Java中对象初始化有一个透彻的认识,那么通过这道面试题,对我有点启发,所以希望在这里分享给大家,希望能给迷惘的初学者一起指引,下面我们直入主题,先看看代码:public class InitializeDemo { private static int k = 1; private static InitializeDemo t1 = new InitializeDemo("t1"); p

2014-02-21 10:12:22 6095 41

原创 Java直接插入排序

直接插入排序算法详解:http://blog.csdn.net/ysjian_pingcx/article/details/8674454直接插入算法源码免积分下载:http://download.csdn.net/detail/ysjian_pingcx/6802851序:一个爱上Java最初的想法一直没有磨灭:”分享我的学习成果,不管后期技术有多深,打好基础很重要“。声明:所有源码经由本人原创,上道者皆似曾相识,另未经过权威机构或人士审核和批准,勿做商业用途,仅供学习分享,若要转载,请注明出处。

2014-01-03 11:06:19 1196

原创 Java选择排序算法

选择排序算法详解:http://blog.csdn.net/ysjian_pingcx/article/details/8656048选择排序算法源码免积分下载:http://download.csdn.net/detail/ysjian_pingcx/6794271序:一个爱上Java最初的想法一直没有磨灭:”分享我的学习成果,不管后期技术有多深,打好基础很重要“。声明:所有源码经由本人原创,上道者皆似曾相识,另未经过权威机构或人士审核和批准,勿做商业用途,仅供学习分享,若要转载,请注明出处。

2013-12-31 22:05:19 1211

原创 Java冒泡排序算法

冒泡排序算法详解:http://blog.csdn.net/ysjian_pingcx/article/details/8653732冒泡排序算法源码免积分下载:http://download.csdn.net/detail/ysjian_pingcx/6755209序:一个爱上Java最初的想法一直没有磨灭:”分享我的学习成果,不管后期技术有多深,打好基础很重要“。声明:所有源码经由本人原创,上道者皆似曾相识,另未经过权威机构或人士审核和批准,勿做商业用途,仅供学习分享,若要转载,请注明出处。

2013-12-22 23:02:40 1869

原创 Java 比较排序算法

简单比较排序算法详解: http://blog.csdn.net/ysjian_pingcx/article/details/8652091简单比较排序算法源码下载: http://download.csdn.net/detail/ysjian_pingcx/6750815序:一个爱上Java最初的想法一直没有磨灭:”分享我的学习成果,不管后期技术有多深,打好基础很重要“。 之前即将毕业那会儿,写过关于排序算法的几篇文章,有一些大学里面学到的常见的算法,

2013-12-21 20:09:36 1521

原创 java生成.exe文件

java生成.exe 思路是先打成jar再把jar打成exe。1.将项目打成jar:这里推荐利用Eclipse的一个第三方插件fat jar生成jar文件,这是一种很简单方便的方法,先从网上下载些插件,下载地址:http://download.csdn.net/detail/ysjian_pingcx/5657233,将它copy到Eclipse plugins文件夹下,此插件就安

2013-06-27 11:58:31 5231 1

原创 Bean Lifecycle in Spring

Bean Lifecycle in SpringSpringIoC作为Spring的特色之一,集Bean以及Bean的管理于一身,负责各种Bean的生命周期,所以作为一个学习开发者,稍微理清一下Bean的生命周期还是有一点点必要的,犹如一个原始的Web开发者对Servlet的生命周期的熟知。在Spring中,Bean的生命周期从两个层面定义的,一个是Bean的作用域,另一个是Bean的初始

2013-05-24 16:33:59 3288

原创 BeanFactory and ApplicationContext in Spring

BeanFactory and ApplicationContext in Spring          BeanFactory和ApplicationContext 是使用过Spring的同学耳熟能详的两个接口,其中BeanFactory是Spring框架最核心的接口,之前学习Spring开发的时候接触多的是ApplicationContext 这个面向应用的功能,当然要搭建Spring环

2013-05-23 11:15:21 2433

原创 ClassLoader in Java

ClassLoader in Java简单写写Java反射和ClassLoader,之前玩过反射,觉得很有趣,这里就很简单的总结点,为学习Spring3.x做准备。1.Java反射在Jdbc中我们通常首先会根据一个字符串加载特定数据库驱动类的字节码,如下:Class.forName("com.mysql.jdbc.Driver");Class.forName("o

2013-05-22 17:35:40 1624

Head First 设计模式.pdf

引子 谁适合读这本书? 我们知道你的大脑在想什么 元认知 让你的大脑就范 技术审校 致谢 1 欢迎来到设计模式世界:设计模式入门 模拟鸭子应用 Joe想到继承 利用接口如何? 软件开发的不变真理 分开变化和不变部分 设计鸭子的行为 测试鸭子的代码 动态地设置行为 封装行为的大局观 “有一个”比“是一个”更好 策略模式 共享模式词汇的威力 我如何使用设计模式? 设计箱内的工具 习题解答 2 让你的对象知悉现况 气象观测站 认识观察者模式 出版者+订阅者=观罕者模式 五分钟短剧:观察主题 定义观察者模式 松耦合的威力 设计气象站 实现气象站 使用Java内建的观察者模式 java.util.Observable的黑暗面 设计箱内的工具 习题解答 …… 3 装饰者模式:装饰对象 4 工厂模式:烘烤OO的精华 5 单件模式:独一无二的对象 6 命令模式:封装调用 7 适配器模式与外观模式:随遇而安 8 模板方法模式:封装算法 9 送代器与组合模式:管理良好的集合 10 状态模式:事物的状态 11 代理模式:控制对象访问 12 复合模式:模式中的模式 13 与设计模式相处:真实世界中的模式 A 附录A:剩下的模式

2015-10-22

设计模式 可复用面向对象软件的基础.pdf

序言 前言 读者指南 第1章 引言 1.1 什么是设计模式 1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.6.1 寻找合适的对象 1.6.2 决定对象的粒度 1.6.3 指定对象接口 1.6.4 描述对象的实现 1.6.5 运用复用机制 1.6.6 关联运行时刻和编译时刻的结构 1.6.7 设计应支持变化 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第2章 实例研究:设计一个文档编辑器 2.1 设计问题 2.2 文档结构 2.2.1 递归组合 2.2.2 图元 2.2.3 组合模式 2.3 格式化 2.3.1 封装格式化算法 2.3.2 Compositor和Composition 2.3.3 策略模式 2.4 修饰用户界面 2.4.1 透明围栏 2.4.2 MonoGlyph 2.4.3 Decorator模式 2.5支持多种视感标准 2.5.1 对象创建的抽象 2.5.2 工厂类和产品类 2.5.3 Abstract Factory模式 2.6 支持多种窗口系统 2.6.1 我们是否可以使用Abstract Factory模式 2.6.2 封装实现依赖关系 2.6.3 Window和Windowlmp 2.6.4 Bridge模式 2.7 用户操作 2.7.1 封装一个请求 2.7.2 Command类及其子类 2.7.3 撤消和重做 2.7.4 命令历史记录 2.7.5 Command模式 2.8 拼写检查和断字处理 2.8.1 访问分散的信息 2.8.2 封装访问和遍历 2.8.3 Iterator类及其子类 2.8.4 Iterator模式 2.8.5 遍历和遍历过程中的动作 2.8.6 封装分析 2.8.7 Visitor类及其子类 2.8.8 Visitor模式 2.9小结 第3章 创建型模式 …… 第4章 结构型模式 …… 第5章 行为模式 …… 第6章 结论

2015-10-22

硝烟中的Scrum和XP:我们如何实施Scrum

第1章 简介 免责声明 撰写本书的原因 scrum到底是什么 第2章 我们怎样编写产品backlog 额外的故事字段 我们如何让产品backlog停留在业务层次上 第3章 我们怎样准备sprint计划 第4章 我们怎样制定sprint计划 为什么产品负责人必须参加 为什么不能在质量上让步 无休止的sprint计划会议 sprint 计划会议日程 确定sprint长度 确定sprint目标 决定sprint要包含的故事 产品负责人如何对sprint放哪些故事产生影响 团队怎样决定把哪些故事放到sprint里面 用本能反应来估算 用生产率计算来估算 我们用的是哪种估算技术 我们为何使用索引卡 定义“完成” 使用计划扑克做时间估算 明确故事内容 把故事拆分成更小的故事 把故事拆分成任务 定下每日例会的时间地点 最后界限在哪里 技术故事 bug跟踪系统vs 产品backlog sprint计划会议终于结束了 第5章 我们怎样让别人了解我们的sprint 第6章 我们怎样编写sprint backlog 第7章 我们怎样布置团队房间 第8章 我们怎样进行每日例会 第9章 我们怎样进行sprint演示 第10章 我们怎样做sprint回顾 第11章 sprint之间的休整时刻 第12章 怎样制定发布计划 处理固定价格的合同 第13章 我们怎样结合使用scrum和xp 第14章 我们怎样做测试 第15章 我们怎样管理多个scrum团队 第16章 我们怎样管理分布式团队 第17章 scrummaster检查列表 第18章 结语 有关henrik kniberg">第1章 简介 免责声明 撰写本书的原因 scrum到底是什么 第2章 我们怎样编写产品backlog 额外的故事字段 我们如何让产品backlog停留在业务层次上 第3章 我们怎样准备sprint计划 第4章 我们怎样制定sprint计划 为什么产品负责人必须参 [更多]

2015-03-24

Scrum敏捷软件开发

《Scrum敏捷软件开发》是敏捷联盟及Scrum联盟创始人之一、敏捷估算及计划的鼻祖Mike Cohn三大经典著作中影响最为深厚的扛鼎之作,也是全球敏捷社区中获得广泛肯定的企业敏捷转型权威参考。作者花四年时间,把自己近十五年的敏捷实践经验,特别是近四年中针对各种敏捷转型企业的咨询和指导工作,并结合旁征博引的方式,从更高的思想层次对敏捷与Scrum多年来的经验和教训进行深入而前面的梳理和总结,最终集大成者便是这本令人醍醐灌顶的佳作。 《Scrum敏捷软件开发》是软件企业及其管理团队成功进行敏捷转型战略及实施的必备参考书,适合经理、开发人员、教练、ScrumMaster、产品负责人、分析师、团队领导或项目领导,是帮助他们成功完成项目,甚至造就敏捷企业的重要参考。 第Ⅰ部分 启航 第1章 为什么敏捷转型难(但值得) 第2章 ADAPT模型 第3章 Scrum实施模式 第4章 渐进敏捷 第5章 试点项目 第Ⅱ部分 个体 第6章 克服抵触 第7章 新角色 第8章 角色转换 第9章 技术实践 第Ⅲ部分 团队 第10章 团队结构 第11章 团队协作 第12章 领导自组织团队 第13章 产品Backlog 第14章 Sprint 第15章 做计划 第16章 质量 第Ⅳ部分 组织 第17章 扩展Scrum 第18章 分布式团队 第19章 与其他方法论共存 第20章 人力资源、后勤和PMO 第Ⅴ部分 下一站 第21章 看看进展如何 第22章 没有终点

2015-03-07

敏捷开发知识体系

《敏捷开发知识体系》面向敏捷实践者学习敏捷知识和敏捷软件开发企业进行敏捷转型的需要,旨在帮助个人更快地掌握敏捷开发知识,帮助企业更好地实施敏捷转型。主要内容包括:敏捷开发的哲学理念、价值观、敏捷开发方法框架和敏捷实践,企业敏捷转型参考框架,帮助企业回答为什么要进行敏捷转型,敏捷转型包含哪些内容和如何开展敏捷转型等问题。 第1章 敏捷开发知识体系总体框架 1.1 敏捷开发知识体系的核心 1.2 敏捷开发方法框架 1.3 敏捷开发管理实践 1.4 敏捷开发工程实践 第2章 敏捷开发核心价值观和原则 2.1 敏捷软件开发宣言 2.2 敏捷开发的核心价值观 2.3 敏捷开发的原则 2.3.1 敏捷开发的目标 2.3.2 敏捷开发原则的应用 第3章 敏捷开发方法框架 3.1 敏捷开发方法框架之Scrum 3.1.1 定义和特性说明 3.1.2 主要角色 3.1.3 主要活动和实践 3.1.4 主要工件 3.1.5 工作流程 3.2 敏捷开发方法框架之极限编程(XP) 3.2.1 定义和特性说明 3.2.2 主要角色 3.2.3 主要活动和实践 3.2.4 主要工件 3.2.5 工作流程 3.2.6 谁适合使用极限编程 3.3 敏捷开发方法框架之OpenUP 3.3.1 定义和特性说明 3.3.2 主要角色 3.3.3 主要活动和实践 3.3.4 主要工件 3.3.5 工作流程 3.3.6 谁适合使用OpenUP 3.4 敏捷开发方法框架之精益开发 3.4.1 定义和特性说明 3.4.2 主要角色 3.4.3 主要活动和实践 3.4.4 工作流程 3.4.5 谁更适合使用敏捷与精益相结合的方法 3.5 敏捷开发方法框架之特征驱动开发 3.5.1 定义和特性说明 3.5.2 主要角色 3.5.3 主要活动和实践 3.5.4 主要工件 3.5.5 工作流程 3.5.6 谁适合使用特征驱动开发 3.6 敏捷开发方法框架之水晶方法 3.6.1 主要角色 3.6.2 主要活动和实践 3.6.3 主要工件 3.6.4 主要流程 3.6.5 谁适合使用透明水晶方法 第4章 敏捷开发之管理实践 4.1 迭代式开发 4.1.1 定义和特性说明 4.1.2 应用说明 4.1.3 案例说明 4.2 多级项目规划 …… 第5章 敏捷开发之工程实践 第6章 企业敏捷转型参考框架 附录A 国外敏捷转型实践参考 附录B 敏捷开发术语表 附录C SPIChina服务介绍 附录D 中国敏捷软件开发联盟 参考文献

2015-03-07

架构之美.pdf

《架构之美》围绕5个主题领域来组织《架构之美》的内容:概述、企业应用、系统、最终用户应用和编程语言。《架构之美》让最优秀的设计师和架构师来描述他们选择的软件架构,剥开架构的各层,展示他们如何让软件做到实现功能、可靠、易用、高效率、可维护、可移植和优雅。 序 前言 第一部分 论架构 第1章 什么是架构 1.1 简介 1.2 创建软件架构 1.3 架构结构 1.4 好的架构 1.5 美丽的架构 1.6 致谢 1.7 参考文献 第2章 两个系统的故事:现代软件神话 2.1 混乱大都市 2.2 设计之城 2.3 说明什么问题 2.4 轮到您了 2.5 参考文献 第二部分 企业级应用架构 第3章 伸缩性架构设计 3.1 简介 3.2 背景 3.3 架构 3.4 关于架构的思考 第4章 记忆留存 4.1 功能和约束 4.2 工作流 4.3 架构关注点 4.4 用户反应 4.5 结论 第5章 面向资源的架构:在Web中 5.1 简介 5.2 传统的Web服务 5.3 Web 5.4 面向资源的架构 5.5 数据驱动的应用 5.6 应用面向资源的架构 5.7 结论 第6章 数据增长:Facebook平台的架构 6.1 简介 6.2 创建一个社会关系Web服务 6.3 创建社会关系数据查询服务 6.4 创建一个社会关系Web门户:FBML 6.5 系统的支持功能 6.6 总结 第三部分 系统架构 第7章 Xen和虚拟化之美 7.1 简介 7.2 Xenoservers 7.3 虚拟化的挑战 7.4 半虚拟化 7.5 Xen的变换形式 7.6 改变的硬件,改变的Xen 7.7 经验教训 7.8 延伸阅读 第8章 Guardian:一个容错操作系统环境 8.1 Tandem/16,将来所有的计算机都会像这样构建 8.2 硬件 8.3 机械布局 8.4 处理器架构 8.5 处理器间总线 8.6 输入/输出 8.7 进程结构 8.8 消息系统 8.9 文件系统 8.10 民间传说 8.11 弊端 8.12 后继者 8.13 延伸阅读 第9章 JPC:一个纯Java的x86PC模拟程序 9.1 简介 9.2 概念验证 9.3 PC架构 9.4 Java性能技巧 9.5 把4GB放入4GB:这不起作用 9.6 保护模式的危险 9.7 从事一项毫无成功希望的斗争 9.8 劫持JVM 9.9 最终灵活性 9.10 最佳安全性 9.11 第二次做会更好 第10章 元循环虚拟机的力量:JikesRVM 10.1 背景 10.2 与运行时环境相关的传言 10.3 JikesRVM简史 10.4 一个自足执行的运行时自举 10.5 运行时组件 10.6 经验教训 参考文献 第四部分 最终用户应用架构 第11章 GNUEmacs:滋长的特性是其优势 11.1 使用中的Emacs 11.2 Emacs的架构 11.3 滋长的特性 11.4 另外两个架构 第12章 当集市开始构建教堂 12.1 简介 12.2 KDE项目的历史和组织结构 12.3 Akonadi 12.4 ThreadWeaver 第五部分 语言与架构 第13章 软件架构:面向对象与面向功能 13.1 概述 13.2 示例 13.3 面向功能解决方案的模块性评价 13.4 面向对象视图 13.5 面向对象模块性的评价和改进 13.6 代理:将操作封装到对象中 致谢 参考文献 第14章 重读经典 14.1 所有东西都是对象 14.2 类型是隐式定义的 14.3 问题 14.4 砖块和灰浆建筑架构 参考文献 跋

2014-07-30

重构-改善既有代码的设计 中文版

第1章 重构,第一个案例 1.1 起点 1.2 重构的第一步 1.3 分解并重组Statemen 1.4 运用多态取代与价格相关的条件逻辑 1.5 结语 第2章 重构原则 2.1 何谓重构 2.2 为何重构 2.3 何时重构 2.4 怎么对经理说 2.5 重构的难题 2.6 重构与设计 2.7 重构与性能 2.8 重构起源何处 第3章 代码的坏味道 3.1 Duplicated Code(重复的代码) 3.2 Long Method(过长函数) 3.3 Large Class(过大类) 3.4 Long Parameter List(过长参数列) 3.5 Divergent Change(发散式变化) 3.6 Shortgun Surgery(霰弹式修改) 3.7 Feature Envy(依恋情结) 3.8 Data Clumps(数据泥团) 3.9 Primitive Obsession(基本型别偏执) 3.10 Switch Statements(switch惊悚现身) 3.11 Parallel Inheritance Hierarchies(平行继承体系) 3.12 Lazy Class(冗赘类) 3.13 Speculative Generality(夸夸其谈未来性) 3.14 Temporary Field(令人迷惑的暂时值域) 3.15 Message Chai (过度耦合的消息链) 3.16 Middle Man(中间转手人) 3.17 Inappropriate Intimacy(狎昵关系) 3.18 Alternative Classes with Different Interfaces(异曲同工的类) 3.19 Incomplete Library Class(不完善的程序库类) 3.20 Data Class(纯稚的数据类) 3.21 Refused Bequest(被拒绝的遗赠) 3.22 Comments(过多的注释) 第4章 建立测试体系 4.1 自我测试码的价值 4.2 JUnit测试框架 4.3 添加更多测试 第5章 重构名录 5.1 重构的记录格式 5.2 寻找引用点 5.3 这些重构准则有多成熟 第6章 重新组织你的函数 6.1 Extract Method(提炼函数) 6.2 Inline Method(将函数内联化) 6.3 Inline Temp(将临时变量内联化) 6.4 Replace Temp With Query(以查询取代临时变量) 6.5 Introduce Explaining Variable(引入解释性变量) 6.6 Split Temporary Variable(剖解临时变量) 6.7 Remove Assignments to Paramete (移除对参数的赋值动作) 6.8 Replace Method with Method Object(以函数对象取代函数) 6.9 Substitute Algorithm(替换你的算法) 第7章 在对象之间移动特性 7.1 Move Method(搬移函数) 7.2 Move Field(搬移值域) 7.3 Extract Class(提炼类) 7.4 Inline Class(将类内联化) 7.5 Hide Delegate(隐藏「委托关系」) 7.6 Remove Middle Man(移除中间人) 7.7 Introduce Foreign Method(引入外加函数) 7.8 Introduce Local Exte ion(引入本地扩展) 第8章 重新组织你的数据 8.1 Self Encapsulate Field(自封装值域) 8.2 Replace Data Value with Object(以对象取代数据值) 8.3 Change Value to Reference(将实值对象改为引用对象) 8.4 Change Reference to Value(将引用对象改为实值对象) 8.5 Replace Array with Object(以对象取代数组) 8.6 Duplicate Observed Data(复制「被监视数据」) 8.7 Change Unidirectional Association to Bidirectional(将单向关联改为双向) 8.8 Change Bidirectional Association to Unidirectional(将双向关联改为单向) 8.9 Replace Magic Number with Symbolic Co tant (以符号常量/字面常量 取代魔法数) 8.10 Encapsulate Field(封装值域) 8.11 Encapsulate Collection(封装群集) 8.12 Replace Record with Data Class(以数据类取代记录) 8.13 Replace Type Code with Class(以类取代型别码) 8.14 Replace Type Code with Subclasses (以子类取代型别码) 8.15 Replace Type Code with State/Strategy (以State/Strategy取代型别码) 8.16 Replace Subclass with Fields(以值域取代子类) 第9章 简化条件表达式 9.1 Decompose Conditional(分解条件式) 9.2 Co olidate Conditional Expression(合并条件式) 9.3 Co olidate Duplicate Conditional Fragments (合并重复的条件片段) 9.4 Remove Control Flag(移除控制标记) 9.5 Replace Nested Conditional with Guard Clauses (以卫语句取代嵌套条件式) 9.6 Replace Conditional with Polymorphism(以多态取代条件式) 9.7 Introduce Null Object(引入Null对象) 9.8 Introduce Assertion(引入断言) 第10章 简化函数呼叫 10.1 Rename Method(重新命名函数) 10.2 Add Parameter(添加参数) 10.3 Remove Parameter(移除参数) 10.4 Separate Query from Modifier(将查询函数和修改函数分离) 10.5 Parameterize Method(令函数携带参数) 10.6 Replace Parameter with Explicit Methods(以明确函数取代参数) 10.7 Preserve Whole Object(保持对象完整) 10.8 Replace Parameter with Method(以函数取代参数) 10.9 Introduce Parameter Object(引入参数对象) 10.10 Remove Setting Method(移除设值函数) 10.11 Hide Method(隐藏你的函数) 10.12 Replace Co tructor with Factory Method(以工厂方法取代构造函数) 10.13 Encapsulate Downcast(封装「向下转型」动作) 10.14 Replace Error Code with Exception(以异常取代错误码) 10.15 Replace Exception with Test(以测试取代异常) 第11章 处理概括关系 11.1 Pull Up Field(值域上移) 11.2 Pull Up Method(函数上移) 11.3 Pull Up Co tructor Body(构造函数本体上移) 11.4 Push Down Method(函数下移) 11.5 Push Down Field(值域下移) 11.6 Extract Subclass(提炼子类) 11.7 Extract Superclass(提炼超类) 11.8 Extract Interface(提炼接口) 11.9 Collapse Hierarchy(折叠继承体系) 11.10 Form Template Method(塑造模板函数) 11.11 Replace Inheritance with Delegation(以委托取代继承) 11.12 Replace Delegation with Inheritance(以继承取代委托) 第12章 大型重构 12.1 Tease Apart Inheritance(疏理并分解继承体系) 12.2 Convert Procedural Design to Objects(将过程化设计转化为对象设计) 12.3 Separate Domain from Presentation(将领域和表述/显示分离) 12.4 Extract Hierarchy(提炼继承体系) 第13章 重构,复用,与现实 13.1 现实的检验 13.2 为什么开发者不愿意重构他们的程序 13.3 再论现实的检验 13.4 重构的资源和参考数据 13.5 从重构联想到软件复用和技术传播 13.6 结语 13.7 参考文献 第14章 重构工具 14.1 使用工具进行重构 14.2 重构工具的技术标准 14.3 重构工具的实用标准 14.4 小结 第15章 总结 参考书目 要点列表 索引

2014-07-20

敏捷软件开发:原则、模式与实践

第Ⅰ部分 敏捷开发 第一章 敏捷实践 1.1 敏捷联盟 1.2 原则 1.3 结论 参考文献 第二章 极限编程概述 2.1 极限编程实践 2.2 结论 参考文献 第三章 计划 3.1 初始探索 3.2 发布计划 3.3 迭代计划 3.4 任务计划 3.5 迭代 3.6 结论 参考文献 第四章 测试 4.1 测试驱动的开发方法 4.2 验收测试 4.3 结论 参考文献 第五章 重构 5.1 素数产生程序一个简单的重构示例 5.2 结论 参考文献 第六章 一次编程实践 6.1 保龄球比赛 6.2 结论 第Ⅱ部分 敏捷设计 第七章 什么是敏捷设计 7.1 软件出了什么错 7.2 设计的臭味——腐化软件的气味 7.3 “Copy”程序 7.4 保持尽可能好的设计 7.5 结论 参考文献 第八章 单一责任原则(SRP) 8.1 单一职责原则(SRP) 8.2 结论 参考文献 第九章 开放—封闭原则(OCP) 9.1 开放—封闭原则(OCP) 9.2 描述 9.3 关键是抽象 9.4 结论 参考文献 第十章 Liskov替换原则(LSP) 10.1 Liskov替换原则(LSP) 10.2 一个违反LSP的简单例子 10.3 正方形和矩形,更微妙的违规 10.4 一个实际的例子 10.5 用提取公共部分的方法代替继承 10.6 启发式规则和习惯用法 10.7 结论 参考文献 第十一章 依赖倒置原则(DIP) 11.1 依赖倒置原则(DIP) 11.2 层次化 11.3 一个简单的例子 11.4 熔炉示例 11.5 结论 参考文献 第十二章 接口隔离原则(ISP) 12.1 接口污染 12.2 分离客户就是分离接口 12.3 接口隔离原则(ISP) 12.4 类接口与对象接口 12.5 ATM用户界面的例子 12.6 结论 参考文献 第Ⅲ部分 薪水支付案例研究 第十三章 COMMAND模式和ACTIVE OBJECT模式 第十四章 TEMPLATE METHOD模式和STRATEGY模式:继承与委托 第十五章 FACADE模式和MEDIATOR模式 第十六章 SINGLETON模式和MONOSTATE模式 第十七章 NULL OBJECT模式 第十八章 薪水支付案例研究:第一次迭代开始 第十九章 薪水支付案例研究:实现 第Ⅳ部分 打包薪水支付系统 第二十章 包的设计原则 第二十一章 FACTORY模式 第二十二章 薪水支付案例研究(第2部分) 第Ⅴ部分 气象站案例研究 第二十三章 COMPOSITE模式 第二十四章 OBSERVER模式——回归为模式 第二十五章 ABSTRACT SERVER模式、ADAPTER模式和BRIDGE模式 第二十六章 PROXY模式和STAIRWAY TO HEAVEN模式:管理第三方API 第二十七章 案例研究:气象站 第Ⅵ部分 ETS案例研究 第二十八章 VISITOR模式 第二十九章 STATE模式 第三十章 ETS框架 附录 附录A UML表示法Ⅰ:CGI示例 附录B UML表示法Ⅱ:统计多路复用器 附录C 两个公司的讽刺小品 附录D 源代码就是设计 索引

2014-07-20

设计模式:可复用面向对象软件的基础

序言 前言 读者指南 第1章 引言 1.1 什么是设计模式 1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.6.1 寻找合适的对象 1.6.2 决定对象的粒度 1.6.3 指定对象接口 1.6.4 描述对象的实现 1.6.5 运用复用机制 1.6.6 关联运行时刻和编译时刻的结构 1.6.7 设计应支持变化 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第2章 实例研究:设计一个文档编辑器 2.1 设计问题 2.2 文档结构 2.2.1 递归组合 2.2.2 图元 2.2.3 组合模式 2.3 格式化 2.3.1 封装格式化算法 2.3.2 Compositor和Composition 2.3.3 策略模式 2.4 修饰用户界面 2.4.1 透明围栏 2.4.2 MonoGlyph 2.4.3 Decorator模式 2.5支持多种视感标准 2.5.1 对象创建的抽象 2.5.2 工厂类和产品类 2.5.3 Abstract Factory模式 2.6 支持多种窗口系统 2.6.1 我们是否可以使用Abstract Factory模式 2.6.2 封装实现依赖关系 2.6.3 Window和Windowlmp 2.6.4 Bridge模式 2.7 用户操作 2.7.1 封装一个请求 2.7.2 Command类及其子类 2.7.3 撤消和重做 2.7.4 命令历史记录 2.7.5 Command模式 2.8 拼写检查和断字处理 2.8.1 访问分散的信息 2.8.2 封装访问和遍历 2.8.3 Iterator类及其子类 2.8.4 Iterator模式 2.8.5 遍历和遍历过程中的动作 2.8.6 封装分析 2.8.7 Visitor类及其子类 2.8.8 Visitor模式 2.9小结 第3章 创建型模式 …… 第4章 结构型模式 …… 第5章 行为模式 …… 第6章 结论

2014-07-14

人月神话.pdf.rar

第1章 焦油坑 编程系统产品 职业的乐趣 职业的苦恼 第2章 人月神话 乐观主义 人月 系统测试 空泛的估算 重复产生的进度灾难 第3章 外科手术队伍 问题 Mills的建议 如何运作 团队的扩建 第4章 贵族专制、民主政治和系统设计 概念的完整性 获得概念的完整性 贵族专制统治和民主政治 在等待时,实现人员应该做什么 第5章 画蛇添足 结构师的交互准则和机制 自律——开发第二个系统所带来的后果 第6章 贯彻执行 文档化的规格说明——手册 形式化定义 直接整合 会议和大会 多重实现 电话日志 产品测试 第7章 为什么巴比伦塔会失败 巴比伦塔的管理教训 大型编程项目中的交流 项目工作手册 大型编程项目的组织架构 第8章 胸有成竹 第9章 削足适履 第10章 提纲挈领 第11章 未雨绸缪 第12章 干将莫邪 第13章 整体部分 第14章 祸起萧墙 第15章 另外一面 第16章 没有银弹 第17章 再论“没有银弹” 第18章 《人月神话》的观点:是与非? 第19章 20年后的《人月神话》 结束语:令人向往、激动人心和充满乐趣的50年 注解与参考文献

2014-07-14

测试驱动开发的艺术

第一部分 TDD入门 第1章 综述 1.1 挑战:用正确的方法解决正确的问题 1.1.1 糟糕的代码质量 1.1.2 不能满足客户需求 1.2 解决方案:测试驱动 1.2.1 高质量的TDD 1.2.2 用ATDD满足客户需求 1.2.3 这对我有什么好处 1.3 正确地做事:TDD 1.3.1 测试-编码-重构 1.3.2 增量式开发 1.3.3 重构以保持代码的健康 1.3.4 保证软件正常运行 1.4 做正确的事:ATDD 1.4.1 名字的含义 1.4.2 紧密协作 1.4.3 把测试作为沟通的共同语言 1.5 TDD工具 1.5.1 使用xUnit做单元测试 1.5.2 支持ATDD的测试框架 1.5.3 持续集成及构建 1.5.4 代码覆盖率 1.6 小结 第2章 TDD入门 第3章 小步重构 第4章 TDD的概念与模式 第二部分 针对特定技术应用TDD 第5章 测试驱动Web组件 第6章 测试驱动数据访问 第7章 测试驱动不可预测功能 第8章 测试驱动Swing代码 第三部分 基于ATDD构建产品 第9章 解析验收测试驱动开发 第10章 用Fit创建验收测试 第11章 执行验收测试的策略 第12章 TDD应用 附录A JUnit 4简明教程 附录B JUnit 3.8简明教程 附录C EasyMock简明教程 附录D 通过Ant运行测试 相关资源

2014-07-14

解析极限编程:拥抱变化(原书第2版)

《解析极限编程:拥抱变化(原书第2版)》介绍了极限编程背后的思想——它的根源、哲学、情节等。它将帮助读者选择是否在项目中使用极限编程时做出明智的决策。本书的另一个目的是帮助那些已经在使用极限编程的读者更好地理解它。 目录: 第1章 极限编程定义 第一部分 探索极限编程 第2章 学习开车 第3章 价值观、原则和实践 第4章 价值观 第5章 原则 第6章 实践 第7章 基本实践 第8章 启程 第9章 扩展实践 第10章 完整XP团队 第11章 约束理论 第12章 计划:管理范围 第13章 尽早测试、经常测试、自动测试 第14章 设计:时间的价值 第15章 增大XP规模 第16章 访谈 第二部分 XP哲学 第17章 XP诞生的故事 第18章 泰勒主义和软件 第19章 丰田生产制度 第20章 应用XP 第21章 纯度 第22章 离岸开发 第23章 永恒的编程之道 第24章 XP和社区 第25章 结语

2014-07-14

高可用性的HDFS:Hadoop分布式文件系统深度实践

第1章 HDFS HA及解决方案 1.1 HDFS系统架构 1.2 HA定义 1.3 HDFS HA原因分析及应对措施 1.3.1 可靠性 1.3.2 可维护性 1.4 现有HDFS HA解决方案 1.4.1 Hadoop的元数据备份方案 1.4.2 Hadoop的SecondaryNameNode方案 1.4.3 Hadoop的Checkpoint ode方案 1.4.4 Hadoop的BackupNode方案 1.4.5 DRDB方案 1.4.6 FaceBook的AvatarNode方案 1.5 方案优缺点比较 第2章 HDFS元数据解析 2.1 概述 2.2 内存元数据结构 2.2.1 INode 2.2.2 Block 2.2.3 BlockInfo和DatanodeDescriptor 2.2.4 小结 2.2.5 代码分析——元数据结构 2.3 磁盘元数据文件 2.4 Format情景分析 2.5 元数据应用场景分析 第3章 Hadoop的元数据备份方案 3.1 运行机制分析 4 3.1.1 NameNode启动加载元数据情景分析 3.1.2 元数据更新及日志写入情景分析 3.1.3 Checkpoint过程情景分析 3.1.4 元数据可靠性机制 3.1.5 元数据一致性机制 3.2 使用说明 第4章 Hadoop的Backup Node方案 4.1 Backup Node概述 4.1.1 系统架构 4.1.2 使用原则 4.1.3 优缺点 4.2 运行机制分析 4.2.1 启动流程 4.2.2 元数据操作情景分析 4.2.3 日志池(journal spool)机制 4.2.4 故障切换机制 4.3 实验方案说明 4.4 构建实验环境 4.4.1 网络拓扑 4.4.2 系统安装及配置 4.4.3 安装JDK 4.4.4 虚拟机集群架设 4.4.5 NameNode安装及配置 4.4.6 Backup Node安装及配置 4.4.7 Data Node安装及配置 4.4.8 Clients安装及配置 4.5 异常解决方案 4.5.1 异常情况分析 4.5.2 NameNode配置 4.5.3 Backup Node配置 4.5.4 Data Node配置 4.5.5 NameNode宕机切换实验 4.5.6 NameNode宕机读写测试 第5章 AvatarNode运行机制 5.1 方案说明 5.1.1 系统架构 5.1.2 思路分析 5.1.3 性能数据 5.2 元数据分析 5.2.1 类FSNamesystem 5.2.2 类FSDirectory 5.2.3 AvatarNode的磁盘元数据文件 5.3 AvatarNode Primary启动过程 5.4 AvatarNode Standby启动过程 5.4.1 AvatarNode的构造方法 5.4.2 Standby线程的run()方法 5.4.3 Ingest线程的run()方法 5.4.4 Ingest线程的ingestFSEdits ()方法 5.4.5 Standby线程的doCheckpoint()方法 5.5 用户操作情景分析 5.5.1 创建目录情景分析 5.5.2 创建文件情景分析 5.6 AvatarNode Standby故障切换过程 5.7 元数据一致性保证机制 5.7.1 元数据目录树信息 5.7.2 Data Node与Block数据块映射信息 5.8 Block更新同步问题 5.8.1 问题描述 5.8.2 结论 5.8.3 源码分析 第6章 AvatarNode使用 6.1 方案说明 6.1.1 网络拓扑 6.1.2 操作系统安装及配置 6.2 使用Avatar打补丁版本 6.2.1 Hadoop源码联机Build 6.2.2 Hadoop源码本地Build 6.2.3 NFS服务器构建 6.2.4 Avatar分发与部署 6.2.5 Primary(namenode0)节点配置 6.2.7 Data Node节点配置 6.2.8 Client节点配置 6.2.9 创建目录 6.2.10 挂载NFS 6.2.11 启动Ucarp 6.2.12 格式化 6.2.13 系统启动 6.2.14 检查 6.2.15 NameNode失效切换写文件实验 6.2.16 NameNode失效切换读文件实验 6.3 Avatar FaceBook版本的使用 6.3.1 Hadoop FaceBook版本安装 6.3.2 节点配置 6.3.3 启动HDFS 6.3.4 NameNode失效切换 第7章 AvatarNode异常解决方案 7.1 测试环境 7.2 Primary失效 7.2.1 解决方案 7.2.2 写操作实验步骤 7.2.3 改进写操作机制 7.2.4 读操作实验步骤 7.2.5 小结 7.3 Standby失效 7.4 NFS失效(数据未损坏) 7.4.1 解决方案 7.4.2 写操作实验步骤 7.4.3 读操作实验步骤 7.4.4 小结 322 7.5 NFS失效(数据已损坏) 7.5.1 解决方案 7.5.2 写操作实验步骤 7.5.3 读操作实验步骤 7.5.4 小结 7.6 Primary先失效,NFS后失效(数据未损坏) 7.6.1 解决方案 7.6.2 写操作实验步骤 7.6.3 读操作实验步骤 7.6.4 小结 7.7 Primary先失效(数据未损坏),NFS后失效(数据损坏) 7.7.1 解决方案 7.7.2 写操作实验步骤 7.7.3 读操作实验步骤 7.7.4 小结 7.8 NFS先失效(数据未损坏),Primary后失效 7.8.1 解决方案 7.8.2 写操作实验步骤 7.8.3 读操作实验步骤 7.8.4 小结 7.9 NFS先失效(数据损坏),Primary后失效(数据损坏) 7.9.1 解决方案 7.9.2 写操作实验步骤 7.9.3 读操作实验步骤 7.9.4 小结 7.10 实验结论 第8章 Cloudera HA NameNode使用 8.1 HA NameNode说明 8.2 CDH4B1版本HDFS集群配置 8.2.1 虚拟机安装 8.2.2 nn1配置 8.2.3 dn1~dn3配置 8.2.4 HDFS集群构建 8.3 HA NameNode配置 8.3.1 nn1配置 8.3.2 其他节点配置 8.4 HA NameNode使用 8.4.1 启动HA HDFS集群 8.4.2 第1次failover 8.4.3 模拟写操作 8.4.4 模拟Active Name Node失效,第2次failover 8.3.5 模拟新的Standby NameNode加入 8.5 小结

2014-05-15

MapReduce Design Pattern

Until now, design patterns for the MapReduce framework have been scattered among various research papers, blogs, and books. This handy guide brings together a unique collection of valuable MapReduce patterns that will save you time and effort regardless of the domain, language, or development framework you're using. Each pattern is explained in context, with pitfalls and caveats clearly identified to help you avoid common design mistakes when modeling your big data architecture. This book also provides a complete overview of MapReduce that explains its origins and implementations, and why design patterns are so important. All code examples are written for Hadoop.Summarization patterns: get a top-level view by summarizing and grouping data Filtering patterns: view data subsets such as records generated from one user Data organization patterns: reorganize data to work with other systems, or to make MapReduce analysis easier Join patterns: analyze different datasets together to discover interesting relationships Metapatterns: piece together several patterns to solve multi-stage problems, or to perform several analytics in the same job Input and output patterns: customize the way you use Hadoop to load or store data

2014-05-15

Android反编译工具jd-jui

Android反编译工具jd-jui,用于将.dex反编译成的.class文件进一步反编译成.java文件。

2014-05-10

Android反编译工具dex2jar

Android反编译工具dex2jar,用于加.dex反编译成.class文件

2014-05-10

Android反编译工具apktool

对Android apk的资源文件进行反编译,欢迎下载使用~

2014-05-10

Android apk 反编译

这个是Android反编译工具,一步到位:从资源文件的反编译,dex到class的反编译以及class到java文件的反编译,欢迎下载使用。

2014-05-10

《深入理解Android》卷Ⅱ

第1章 搭建Android源码工作环境 1.1 Android系统架构 1.2 搭建开发环境 1.2.1 下载源码 1.2.2 编译源码 1.2.3 利用Eclipse调试system_process 1.3 本章小结 第2章 深入理解Java Binder和MessageQueue 2.1 概述 2.2 Java层中的Binder架构分析 2.2.1 Binder架构总览 2.2.2 初始化Java层Binder框架 2.2.3 addService实例分析 2.2.4 Java层Binder架构总结 2.3 心系两界的MessageQueue 2.3.1 MessageQueue的创建 2.3.2 提取消息 2.3.3 nativePollOnce函数分析 2.3.4 MessageQueue总结 2.4 本章小结 第3章 深入理解SystemServer 3.1 概述 3.2 SystemServer分析 3.2.1 main函数分析 3.2.2 Service群英会 3.3 EntropyService分析 3.4 DropBoxManagerService分析 3.4.1 DBMS构造函数分析 3.4.2 dropbox日志文件的添加 3.4.3 DBMS和settings数据库 3.5 DiskStatsService和DeviceStorageMonitorService分析 3.5.1 DiskStatsService分析 3.5.2 DeviceStorageManagerService分析 3.6 SamplingProfilerService分析 3.6.1 SamplingProfilerService构造函数分析 3.6.2 SamplingProfilerIntegration分析 3.7 ClipboardService分析 3.7.1 复制数据到剪贴板 3.7.2 从剪切板粘贴数据 3.7.3 CBS中的权限管理 3.8 本章小结 第4章 深入理解PackageManagerService 4.1 概述 4.2 初识PackageManagerService 4.3 PKMS的main函数分析 4.3.1 构造函数分析之前期准备工作 4.3.2 构造函数分析之扫描Package 4.3.3 构造函数分析之扫尾工作 4.3.4 PKMS构造函数总结 4.4 APK Installation分析 4.4.1 adb install分析 4.4.2 pm分析 4.4.3 installPackageWithVerification函数分析 4.4.4 APK 安装流程总结 4.4.5 Verification介绍 4.5 queryIntentActivities分析 4.5.1 Intent及IntentFilter介绍 4.5.2 Activity信息的管理 4.5.3 Intent 匹配查询分析 4.5.4 queryIntentActivities总结 4.6 installd及UserManager介绍 4.6.1 installd介绍 4.6.2 UserManager介绍 4.7 本章学习指导 4.8 本章小结 第5章 深入理解PowerManagerService 5.1 概述 5.2 初识PowerManagerService 5.2.1 PMS构造函数分析 5.2.2 init分析 5.2.3 systemReady分析 5.2.4 BootComplete处理 5.2.5 初识PowerManagerService总结 5.3 PMS WakeLock分析 5.3.1 WakeLock客户端分析 5.3.2 PMS acquireWakeLock分析 5.3.3 Power类及LightService类介绍 5.3.4 WakeLock总结 5.4 userActivity及Power按键处理分析 5.4.1 userActivity分析 5.4.2 Power按键处理分析 5.5 BatteryService及BatteryStatsService分析 5.5.1 BatteryService分析 5.5.2 BatteryStatsService分析 5.5.3 BatteryService及BatteryStatsService总结 5.6 本章学习指导 5.7 本章小结 第6章 深入理解ActivityManagerService 6.1 概述 6.2 初识ActivityManagerService 6.2.1 ActivityManagerService的main函数分析 6.2.2 AMS的 setSystemProcess分析 6.2.3 AMS的 installSystemProviders函数分析 6.2.4 AMS的 systemReady分析 6.2.5 初识ActivityManagerService总结 6.3 startActivity分析 6.3.1 从am说起 6.3.2 AMS的startActivityAndWait函数分析 6.3.3 startActivityLocked分析 6.4 Broadcast和BroadcastReceiver分析 6.4.1 registerReceiver流程分析 6.4.2 sendBroadcast流程分析 6.4.3 BROADCAST_INTENT_MSG消息处理函数 6.4.4 应用进程处理广播分析 6.4.5 广播处理总结 6.5 startService之按图索骥 6.5.1 Service知识介绍 6.5.2 startService流程图 6.6 AMS中的进程管理 6.6.1 Linux进程管理介绍 6.6.2 关于Android中的进程管理的介绍 6.6.3 AMS进程管理函数分析 6.6.4 AMS进程管理总结 6.7 App的 Crash处理 6.7.1 应用进程的Crash处理 6.7.2 AMS的handleApplicationCrash分析 6.7.3 AppDeathRecipient binderDied分析 6.7.4 App的Crash处理总结 6.8 本章学习指导 6.9 本章小结 第7章 深入理解ContentProvider 7.1 概述 7.2 MediaProvider的启动及创建 7.2.1 Context的getContentResolver函数分析 7.2.2 MediaStore.Image.Media的query函数分析 7.2.3 MediaProvider的启动及创建总结 7.3 SQLite创建数据库分析 7.3.1 SQLite及SQLiteDatabase家族 7.3.2 MediaProvider创建数据库分析 7.3.3 SQLiteDatabase创建数据库的分析总结 7.4 Cursor 的query函数的实现分析 7.4.1 提取query关键点 7.4.2 MediaProvider 的query分析 7.4.3 query关键点分析 7.4.4 Cursor query实现分析总结 7.5 Cursor close函数实现分析 7.5.1 客户端close的分析 7.5.2 服务端close的分析 7.5.3 finalize函数分析 7.5.4 Cursor close函数总结 7.6 ContentResolver openAssetFileDescriptor函数分析 7.6.1 openAssetFileDescriptor之客户端调用分析 7.6.2 ContentProvider的 openTypedAssetFile函数分析 7.6.3 跨进程传递文件描述符的探讨 7.6.4 openAssetFileDescriptor函数分析总结 7.7 本章学习指导 7.8 本章小结 第8章 深入理解ContentService和AccountManagerService 8.1 概述 8.2 数据更新通知机制分析 8.2.1 初识ContentService 8.2.2 ContentResovler 的registerContentObserver分析 8.2.3 ContentResolver的 notifyChange分析 8.2.4 数据更新通知机制总结和深入探讨 8.3 AccountManagerService分析 8.3.1 初识AccountManagerService 8.3.2 AccountManager addAccount分析 8.3.3 AccountManagerService的分析总结 8.4 数据同步管理SyncManager分析 8.4.1 初识SyncManager 8.4.2 ContentResolver 的requestSync分析 8.4.3 数据同步管理SyncManager分析总结 8.5 本章学习指导 8.6 本章小结

2014-04-30

《深入理解Android》卷Ⅰ

第1章 阅读前的准备工作 1.1 系统架构 1.1.1 Android系统架构 1.1.2 本书的架构 1.2 搭建开发环境 1.2.1 下载源码 1.2.2 编译源码 1.3 工具介绍 1.3.1 Source Insight介绍 1.3.3 Busybox的使用 1.4 本章小结 第2章 深入理解JNI 2.1 JNI概述 2.2 学习JNI的实例:MediaScanner 2.3 Java层的MediaScanner分析 2.3.1 加载JNI库 2.3.2 Java的native函数和总结 2.4 JNI层MediaScanner的分析 2.4.1 注册JNI函数 2.4.2 数据类型转换 2.4.3 JNIEnv介绍 2.4.4 通过JNIEnv操作jobject 2.4.5 jstring介绍 2.4.6 JNI类型签名介绍 2.4.7 垃圾回收 2.4.8 JNI中的异常处理 2.5 本章小结 第3章 深入理解init 3.1 概述 3.2 init分析 3.2.1 解析配置文件 3.2.2 解析service 3.2.3 init控制service 3.2.4 属性服务 3.3 本章小结 第4章 深入理解zygote 4.1 概述 4.2 zygote分析 4.2.1 AppRuntime分析 4.2.2 Welcome to Java World 4.2.3 关于zygote的总结 4.3 SystemServer分析 4.3.1 SystemServer的诞生 4.3.2 SystemServer的重要使命 4.3.3 关于 SystemServer的总结 4.4 zygote的分裂 4.4.1 ActivityManagerService发送请求 4.4.2 有求必应之响应请求 4.4.3 关于zygote分裂的总结 4.5 拓展思考 4.5.1 虚拟机heapsize的限制 4.5.2 开机速度优化 4.5.3 Watchdog分析 4.6 本章小结 第5章 深入理解常见类 5.1 概述 5.2 以“三板斧”揭秘RefBase、sp和wp 5.2.1 第一板斧--初识影子对象 5.2.2 第二板斧--由弱生强 5.2.3 第三板斧--破解生死魔咒 5.2.4 轻量级的引用计数控制类LightRefBase 5.2.5 题外话-三板斧的来历 5.3 Thread类及常用同步类分析 5.3.1 一个变量引发的思考 5.3.2 常用同步类 5.4 Looper和Handler类分析 5.4.1 Looper类分析 5.4.2 Handler分析 5.4.3 Looper和Handler的同步关系 5.4.4 HandlerThread介绍 5.5 本章小结 第6章 深入理解Binder 6.1 概述 6.2 庖丁解MediaServer 6.2.1 MediaServer的入口函数 6.2.2 独一无二的ProcessState 6.2.3 时空穿越魔术-defaultServiceManager 6.2.4 注册MediaPlayerService 6.2.5 秋风扫落叶-StartThread Pool和join Thread Pool分析 6.2.6 你彻底明白了吗 6.3 服务总管ServiceManager 6.3.1 ServiceManager的原理 6.3.2 服务的注册 6.3.3 ServiceManager存在的意义 6.4 MediaPlayerService和它的Client 6.4.1 查询ServiceManager 6.4.2 子承父业 6.5 拓展思考 6.5.1 Binder和线程的关系 6.5.2 有人情味的讣告 6.5.3 匿名Service 6.6 学以致用 6.6.1 纯Native的Service 6.6.2 扶得起的“阿斗”(aidl) 6.7 本章小结 第7章 深入理解Audio系统 7.1 概述 7.2 AudioTrack的破解 7.2.1 用例介绍 7.2.2 AudioTrack(Java空间)分析 7.2.3 AudioTrack(Native空间)分析 7.2.4 关于AudioTrack的总结 7.3 AudioFlinger的破解 7.3.1 AudioFlinger的诞生 7.3.2 通过流程分析AudioFlinger 7.3.3 audio_track_cblk_t分析 7.3.4 关于AudioFlinger的总结 7.4 AudioPolicyService的破解 7.4.1 AudioPolicyService的创建 7.4.2 重回AudioTrack 7.4.3 声音路由切换实例分析 7.4.4 关于AudioPol

2014-04-30

Github上最火的Android开源项之Android-Smart-Image-View

Android Smart ImageView github 开源项目,能够让开发者在开发过程中很方便快捷的加载网络图片资源,只需要几行代码 smartImageView.setImageUrl( etUrl.getText().toString(),R.drawable.ic_launcher, R.drawable.ic_launcher);

2014-04-14

Github上最火的Android开源项之Android-Async-Http

Github上最火的Android开源项之Android-Async-Http。 Android-Async-Http是Android上的一个异步、基于回调的HTTP客户端开发包,建立在Apache的HttpClient库上。 在Android中使用这个异步HttpClient框架非常的方便。

2014-04-14

Navicat_Premium_11.0.10

navicat premium是一款很不错的数据库管理工具,可以连接并管理mysql/postgresql/oracle/sqlite/sql server数据库。 可以打开、设置以及新建表、视图、函数及事件。可以查询数据库,支持打开查询、设计查询及新建/删除查询。可以让你同时连接到多种数据库,让你管理数据更便捷,支持多种数据库之间数据的传输。 本版本为特别版,不需要注册就能使用。

2014-03-28

Android4.4 API 源码

Android4.4的API源码,欢迎下载学习~

2014-03-28

Android4.3_API源码

Android4.3的API源码,欢迎下载学习~

2014-03-28

Android4.1_API源码

Android4.1的API源码,欢迎下载学习~

2014-03-28

IntelHaxm Android模拟器加速

用于加速Android模拟器的Intel组件,欢迎下载使用~

2014-03-24

Android_4.0_API源码

这个是Android的API源码,欢迎下载学习研究~

2014-03-10

《Maven实战》

前言 致谢 第1章 Maven简介 1.1 何为Maven 1.1.1 何为构建 1.1.2 Maven是优秀的构建工具 1.1.3 Maven不仅仅是构建工具乃 1.2 为什么需要Maven 1.2.1 组装PC和品牌PC 1.2.2 IDE不是万能的 1.2.3 Make 1.2.4 Ant 1.2.5 不重复发明轮子 1.3 Maven与极限编程 1.4 被误解的Maven 1.5 小结 第2章 Maven的安装和配置 2.1 在Windows上安装Maven 2.1.1 检查JDK安装 2.1.2 下载Maven 2.1.3 本地安装 2.1.4 升级Maven 2.2 在基于UNIX的系统上安装Maven 2.2.1 下载和安装 2.2.2 井级Maven 2.3 安装目录分析 2.3.1 M2-HOME 2.4 设置HTTP代理 2.5 安装m2eclipse 2.6 安装NetBeansMaven插件 2.7 Maven安装最佳实践 2.7.1 设置MAVEN-OPTS环境变量 2.7.2 配置用户范围settings.xmL 2.7.3 不要使用IDE內嵌的Maven 2.8 小结 第3章 Maven使用入门 3.1 编写POM 3.2 编写主代码 3.3 编写测试代码 3.4 打包和运行 3.5 使用Archetype生成项目骨架 3.6 m2eclipse简单使用 3.6.1 导入Maven项目 3.6.2 创建Maven项目 3.6.3 运行mvn命令 3.7 NetBeansMaven插件简单使用 3.7.1 打开Maven项目 3.7.2 创建Maven项目 3.7.3 运行mvn命令 3.8 小结 第4章 背景案例 4.1 简单的账户注册服务 4.2 需求阐述 4.2.1 需求用例 4.2.2 界面原型 4.3 简要设计 4.3.1 接口 4.3.2 模块结构 4.4 小结 第5章 坐标和依赖 5.1 何为Maven坐标 5.2 坐标详解 5.3 account-email 5.3.1 account-email的POM 5.3.2 account-email的主代码 5.3.3 account-email的测试代码 5.3.4 构建account-emaiL 5.4 依赖的配置 5.5 依赖范围 5.6 传递性依赖 5.6.1 何为传递性依赖 5.6.2 传递性依赖和依赖范围 5.7 依赖调解 5.8 可选依赖 5.9 最佳实践 5.9.1 排除依赖 5.9.2 归类依赖 5.9.3 优化依赖 5.10 小结 第6章 仓库 6.1 何为Maven仓库 6.2 仓库的布局 6.3 仓库的分类 6.3.1 本地仓库 6.3.2 远程仓库 6.3.3 中央仓库 6.3.4 私服 6.4 远程仓库的配置 6.4.1 远程仓库的认证 6.4.2 部署至远程仓库 6.5 快照版本 6.6 从仓库解析依赖的机制 6.7 镜像 6.8 仓库搜索服务 6.8.1 SonatypeNexus 6.8.2 Jarvana 6.8.3 MVNbrowser 6.8.4 MVNrepository 6.8.5 选择合适的仓库搜索服务 6.9 小结 第7章 生命周期和插件 第8章 聚合与继承 第9章 Nexus创建私服 第10章 使用 Maven进行测试 第11章 使用Hudson进行持续集成 第12章 使用Maven构建Web应用 第13章 版本管理 第14章 灵活的构建 第15章 生成项目站点 第16章 m2eclipse 第17章 编写Maven插件 第18章 Archetype 附录

2014-03-04

《疯狂Android讲义》第二版源码13-19章

疯狂Android讲义第二版的源码,由于文件太大,所以分章节压缩上传了,这是13到19章的源码,欢迎下载学习~

2014-02-28

《疯狂Android讲义》第二版源码10-12章

疯狂Android讲义第二版的源码,由于文件太大,所以分章节压缩上传了,这是10到12章的源码,欢迎下载学习~

2014-02-28

《疯狂Android讲义》第二版源码4-9章

疯狂Android讲义第二版的源码,由于文件太大,所以分章节压缩上传了,这是4到9章的源码,欢迎下载学习~

2014-02-28

《疯狂Android讲义》第二版源码1-3章

疯狂Android讲义第二版的源码,由于文件太大,所以分章节压缩上传了,这是1到3章的源码,欢迎下载学习~

2014-02-28

Java编码规范

在软件的生命周期中,维护的花费通常占很大的比例,且几乎所有的软件,在其整个生命周期中,开发人员和维护人员都不尽相同。编码规范可以改善软件的可读性,使程序员尽快而彻底地理解代码;同时,编码规范还可以提高程序代码的安全性和可维护性,提高软件开发的生产效率,所以,编码规范对于程序员而言至关重要。 为使开发项目中所有的JAVA程序代码的风格保持一致,增加代码的可读性,便于维护及内部交流,使JAVA程序开发人员养成良好的编码习惯,有必要对JAVA程序的代码编码风格做统一的规范约束。本文档定义了我公司软件开发过程中使用的开发语言的编码规范,指导软件开发人员在进行项目开发过程中提高代码质量、统一编码要求。

2014-02-20

贪吃蛇源代码

经典游戏《贪吃蛇的源代码》,蕴含着面向对象的分析,监听器的设计,多线程的使用,欢迎Java爱好者下载学习交流噢~

2014-02-20

黑客与画家(中文版).pdf

1 为什么书呆子不受欢迎 他们的心思在别的地方。 2 黑客与画家 黑客也是创造者,与画家、建筑师、作家一样。 3 不能说的话 如果你的想法是社会无法容忍的,你怎么办? 4 良好的坏习惯 与其他美国人一样,黑客的成功秘诀就是打破常规。 5 另一条路 互联网软件是微机诞生后的最大机会。 6 如何创造财富 致富的最好方法就是为社会创造财富。创造财富的最好方法就是创业。 7 关注贫富分化 “收入分配不平等”的危害,会不会没有我们想的那样严重? 8 防止垃圾邮件的一种方法 不久前,许多专家还认为无法有效地过滤垃圾邮件。本文改变了他们的想法。 9 设计者的品味 如何做出优秀的东西? 10 编程语言解析 什么是编程语言?为什么它们现在很热门? 11 一百年后的编程语言 一百年后,人类怎样编程?为什么不从现在开始就这样编程呢? 12 拒绝平庸 别忘了你的对手与你一样,能用任何想用的语言编写互联网软件。 13 书呆子的复仇 在高科技行业,只有失败者采用“业界最佳实践”。 14 梦寐以求的编程语言 一种好的编程语言,是让黑客可以随心所欲使用的语言。 15 设计与研究 研究必须是“新”的,而设计必须是“好”的。 志谢 术语解释 图片授权说明

2015-10-23

程序员的职业素养.pdf

第1章  专业主义 1.1  清楚你要什么 1.2  担当责任 1.3  首先,不行损害之事 1.3.1  不要破坏软件功能 1.3.2  不要破坏结构 1.4  职业道德 1.4.1  了解你的领域 1.4.2  坚持学习 1.4.3  练习 1.4.4  合作 1.4.5  辅导 1.4.6  了解业务领域 1.4.7  与雇主/客户保持一致 1.4.8  谦逊 1.5  参考文献 第2章  说“不” 2.1  对抗角色 2.2  高风险时刻 2.3  要有团队精神 2.3.1  试试看 2.3.2  消极对抗 2.4  说“是”的成本 2.5  如何写出好代码 第3章  说“是” 3.1  承诺用语 3.1.1  识别“缺乏承诺”的征兆 3.1.2  真正的承诺听起来是怎样的 3.1.3  总结 3.2  学习如何说“是” 3.2.1  “试试”的另一面 3.2.2  坚守原则 3.3  结论 第4章  编码 4.1  做好准备 4.1.1  凌晨3点写出的代码 4.1.2  焦虑时写下的代码 4.2  流态区 4.2.1  音乐 4.2.2  中断 4.3  阻塞 4.4  调试 4.5  保持节奏 4.5.1  知道何时应该离开一会 4.5.2  开车回家路上 4.5.3  洗澡 4.6  进度延迟 4.6.1  期望 4.6.2  盲目冲刺 4.6.3  加班加点 4.6.4  交付失误 4.6.5  定义“完成” 4.7  帮助 4.7.1  帮助他人 4.7.2  接受他人的帮助 4.7.3  辅导 4.8  参考文献 第5章  测试驱动开发 5.1  此事已有定论 5.2  TDD的三项法则 5.3  TDD的优势 5.3.1  确定性 5.3.2  缺陷注入率 5.3.3  勇气 5.3.4  文档 5.3.5  设计 5.3.6  专业人士的选择 5.4  TDD的局限 5.5  参考文献 第6章  练习 6.1  引子 6.1.1  10的22次方 6.1.2  转变 6.2  编程柔道场 6.2.1  卡塔 6.2.2  瓦萨 6.2.3  自由练习 6.3  自身经验的拓展 6.3.1  开源 6.3.2  关于练习的职业道德 6.4  结论 6.5  参考文献 第7章  验收测试 7.1  需求的沟通 7.1.1  过早精细化 7.1.2  迟来的模糊性 7.2  验收测试 7.2.1  “完成”的定义 7.2.2  沟通 7.2.3  自动化 7.2.4  额外工作 7.2.5  验收测试什么时候写,由谁来写 7.2.6  开发人员的角色 7.2.7  测试的协商与被动推进 7.2.8  验收测试和单元测试 7.2.9  图形界面及其他复杂因素 7.2.10  持续集成 7.3  结论 第8章  测试策略 8.1  QA应该找不到任何错误 8.1.1  QA也是团队的一部分 8.1.2  需求规约定义者 8.1.3  特性描述者 8.2  自动化测试金字塔 8.2.1  单元测试 8.2.2  组件测试 8.2.3  集成测试 8.2.4  系统测试 8.2.5  人工探索式测试 8.3  结论 8.4  参考文献 第9章  时间管理 9.1  会议 9.1.1  拒绝 9.1.2  离席 9.1.3  确定议程与目标 9.1.4  立会 9.1.5  迭代计划会议 9.1.6  迭代回顾和DEMO展示 9.1.7  争论/反对 9.2  注意力点数 9.2.1  睡眠 9.2.2  咖啡因 9.2.3  恢复 9.2.4  肌肉注意力 9.2.5  输入与输出 9.3  时间拆分和番茄工作法 9.4  要避免的行为 9.5  死胡同 9.6  泥潭 9.7  结论 第10章  预估 10.1  什么是预估 10.1.1  承诺 10.1.2  预估 10.1.3  暗示性承诺 10.2  PERT 10.3  预估任务 10.4  大数定律 10.5  结论 10.6  参考文献 第11章  压力 11.1  避免压力 11.1.1  承诺 11.1.2  保持整洁 11.1.3  危机中的纪律 11.2  应对压力 11.2.1  不要惊慌失措 11.2.2  沟通 11.2.3  依靠你的纪律原则 11.2.4  寻求帮助 11.3  结论 第12章  协作 12.1  程序员与人 12.1.1  程序员与雇主 12.1.2  程序员与程序员 12.2  小脑 12.3  结论 第13章  团队与项目 13.1  只是简单混合吗 13.1.1  有凝聚力的团队 13.1.2  如何管理有凝聚力的团队 13.1.3  项目承包人的困境 13.2  结论 13.3  参考文献 第14章  辅导、学徒期与技艺 14.1  失败的学位教育 14.2  辅导 14.2.1  DIGI-COMP I, 我的第一台计算机 14.2.2  高中时代的ECP-18 14.2.3  非常规辅导 14.2.4  艰难的锤炼 14.3  学徒期 14.3.1  软件学徒期 14.3.2  现实情况 14.4  技艺 14.5  结论 附录  工具

2015-10-23

编写可读代码的艺术.pdf

前言 第1章 代码应当易于理解 是什么让代码变得“更好” 可读性基本定理 总是越小越好吗 理解代码所需的时间是否与其他目标有冲突 最难的部分 第一部分 表面层次的改进 第2章 把信息装到名字里 选择专业的词 避免像tmp和retval这样泛泛的名字 用具体的名字代替抽象的名字 为名字附带更多信息 名字应该有多长 利用名字的格式来传递含义 总结 第3章 不会误解的名字 例子:Filter() 例子:Clip(text, length) 推荐用first和last来表示包含的范围 推荐用begin和end来表示包含/排除范围 给布尔值命名 与使用者的期望相匹配 例子:如何权衡多个备选名字 总结 第4章 审美 为什么审美这么重要 重新安排换行来保持一致和紧凑 用方法来整理不规则的东西 在需要时使用列对齐 选一个有意义的顺序,始终一致地使用它 把声明按块组织起来 把代码分成“段落” 个人风格与一致性 总结 第5章 该写什么样的注释 什么不需要注释 记录你的思想 站在读者的角度 最后的思考--克服“作者心理阻滞” 总结 第6章 写出言简意赅的注释 让注释保持紧凑 避免使用不明确的代词 润色粗糙的句子 精确地描述函数的行为 用输入/输出例子来说明特别的情况 声明代码的意图 “具名函数参数”的注释 采用信息含量高的词 总结 第二部分 简化循环和逻辑 第7章 把控制流变得易读 条件语句中参数的顺序 if/else语句块的顺序 条件表达式(又名“三目运算符”) 避免do/while循环 从函数中提前返回 臭名昭著的goto 最小化嵌套 你能理解执行的流程吗 总结 第8章 拆分超长的表达式 用做解释的变量 总结变量 使用德摩根定理 滥用短路逻辑 例子:与复杂的逻辑战斗 拆分巨大的语句 另一个简化表达式的创意方法 总结 第9章 变量与可读性 减少变量 缩小变量的作用域 只写一次的变量更好 最后的例子 总结 第三部分 重新组织代码 第10章 抽取不相关的子问题 介绍性的例子:findClosestLocation() 纯工具代码 其他多用途代码 创建大量通用代码 项目专有的功能 简化已有接口 按需重塑接口 过犹不及 总结 第11章 一次只做一件事 任务可以很小 从对象中抽取值 更大型的例子 总结 第12章 把想法变成代码 清楚地描述逻辑 了解函数库是有帮助的 把这个方法应用于更大的问题 总结 第13章 少写代码 别费神实现那个功能--你不会需要它 质疑和拆分你的需求 保持小代码库 熟悉你周边的库 例子:使用Unix工具而非编写代码 总结 第四部分 精选话题 第14章 测试与可读性 使测试易于阅读和维护 这段测试什么地方不对 使这个测试更可读 让错误消息具有可读性 选择好的测试输入 为测试函数命名 那个测试有什么地方不对 对测试较好的开发方式 走得太远 总结 第15章 设计并改进“分钟/小时计数器” 问题 定义类接口 尝试1:一个幼稚的方案 尝试2:传送带设计方案 尝试3:时间桶设计方案 比较三种方案 总结 附录 深入阅读

2015-10-23

敏捷软件开发:原则、模式与实践.pdf

第Ⅰ部分 敏捷开发 第一章 敏捷实践 1.1 敏捷联盟 1.2 原则 1.3 结论 参考文献 第二章 极限编程概述 2.1 极限编程实践 2.2 结论 参考文献 第三章 计划 3.1 初始探索 3.2 发布计划 3.3 迭代计划 3.4 任务计划 3.5 迭代 3.6 结论 参考文献 第四章 测试 4.1 测试驱动的开发方法 4.2 验收测试 4.3 结论 参考文献 第五章 重构 5.1 素数产生程序一个简单的重构示例 5.2 结论 参考文献 第六章 一次编程实践 6.1 保龄球比赛 6.2 结论 第Ⅱ部分 敏捷设计 第七章 什么是敏捷设计 7.1 软件出了什么错 7.2 设计的臭味——腐化软件的气味 7.3 “Copy”程序 7.4 保持尽可能好的设计 7.5 结论 参考文献 第八章 单一责任原则(SRP) 8.1 单一职责原则(SRP) 8.2 结论 参考文献 第九章 开放—封闭原则(OCP) 9.1 开放—封闭原则(OCP) 9.2 描述 9.3 关键是抽象 9.4 结论 参考文献 第十章 Liskov替换原则(LSP) 10.1 Liskov替换原则(LSP) 10.2 一个违反LSP的简单例子 10.3 正方形和矩形,更微妙的违规 10.4 一个实际的例子 10.5 用提取公共部分的方法代替继承 10.6 启发式规则和习惯用法 10.7 结论 参考文献 第十一章 依赖倒置原则(DIP) 11.1 依赖倒置原则(DIP) 11.2 层次化 11.3 一个简单的例子 11.4 熔炉示例 11.5 结论 参考文献 第十二章 接口隔离原则(ISP) 12.1 接口污染 12.2 分离客户就是分离接口 12.3 接口隔离原则(ISP) 12.4 类接口与对象接口 12.5 ATM用户界面的例子 12.6 结论 参考文献 第Ⅲ部分 薪水支付案例研究 第十三章 COMMAND模式和ACTIVE OBJECT模式 第十四章 TEMPLATE METHOD模式和STRATEGY模式:继承与委托 第十五章 FACADE模式和MEDIATOR模式 第十六章 SINGLETON模式和MONOSTATE模式 第十七章 NULL OBJECT模式 第十八章 薪水支付案例研究:第一次迭代开始 第十九章 薪水支付案例研究:实现 第Ⅳ部分 打包薪水支付系统 第二十章 包的设计原则 第二十一章 FACTORY模式 第二十二章 薪水支付案例研究(第2部分) 第Ⅴ部分 气象站案例研究 第二十三章 COMPOSITE模式 第二十四章 OBSERVER模式——回归为模式 第二十五章 ABSTRACT SERVER模式、ADAPTER模式和BRIDGE模式 第二十六章 PROXY模式和STAIRWAY TO HEAVEN模式:管理第三方API 第二十七章 案例研究:气象站 第Ⅵ部分 ETS案例研究 第二十八章 VISITOR模式 第二十九章 STATE模式 第三十章 ETS框架 附录 附录A UML表示法Ⅰ:CGI示例 附录B UML表示法Ⅱ:统计多路复用器 附录C 两个公司的讽刺小品 附录D 源代码就是设计 索引

2015-10-22

重构-改善既有代码的设计 中文版.pdf

第1章 重构,第一个案例 1.1 起点 1.2 重构的第一步 1.3 分解并重组Statemen 1.4 运用多态取代与价格相关的条件逻辑 1.5 结语 第2章 重构原则 2.1 何谓重构 2.2 为何重构 2.3 何时重构 2.4 怎么对经理说 2.5 重构的难题 2.6 重构与设计 2.7 重构与性能 2.8 重构起源何处 第3章 代码的坏味道 3.1 Duplicated Code(重复的代码) 3.2 Long Method(过长函数) 3.3 Large Class(过大类) 3.4 Long Parameter List(过长参数列) 3.5 Divergent Change(发散式变化) 3.6 Shortgun Surgery(霰弹式修改) 3.7 Feature Envy(依恋情结) 3.8 Data Clumps(数据泥团) 3.9 Primitive Obsession(基本型别偏执) 3.10 Switch Statements(switch惊悚现身) 3.11 Parallel Inheritance Hierarchies(平行继承体系) 3.12 Lazy Class(冗赘类) 3.13 Speculative Generality(夸夸其谈未来性) 3.14 Temporary Field(令人迷惑的暂时值域) 3.15 Message Chai (过度耦合的消息链) 3.16 Middle Man(中间转手人) 3.17 Inappropriate Intimacy(狎昵关系) 3.18 Alternative Classes with Different Interfaces(异曲同工的类) 3.19 Incomplete Library Class(不完善的程序库类) 3.20 Data Class(纯稚的数据类) 3.21 Refused Bequest(被拒绝的遗赠) 3.22 Comments(过多的注释) 第4章 建立测试体系 4.1 自我测试码的价值 4.2 JUnit测试框架 4.3 添加更多测试 第5章 重构名录 5.1 重构的记录格式 5.2 寻找引用点 5.3 这些重构准则有多成熟 第6章 重新组织你的函数 6.1 Extract Method(提炼函数) 6.2 Inline Method(将函数内联化) 6.3 Inline Temp(将临时变量内联化) 6.4 Replace Temp With Query(以查询取代临时变量) 6.5 Introduce Explaining Variable(引入解释性变量) 6.6 Split Temporary Variable(剖解临时变量) 6.7 Remove Assignments to Paramete (移除对参数的赋值动作) 6.8 Replace Method with Method Object(以函数对象取代函数) 6.9 Substitute Algorithm(替换你的算法) 第7章 在对象之间移动特性 7.1 Move Method(搬移函数) 7.2 Move Field(搬移值域) 7.3 Extract Class(提炼类) 7.4 Inline Class(将类内联化) 7.5 Hide Delegate(隐藏「委托关系」) 7.6 Remove Middle Man(移除中间人) 7.7 Introduce Foreign Method(引入外加函数) 7.8 Introduce Local Exte ion(引入本地扩展) 第8章 重新组织你的数据 8.1 Self Encapsulate Field(自封装值域) 8.2 Replace Data Value with Object(以对象取代数据值) 8.3 Change Value to Reference(将实值对象改为引用对象) 8.4 Change Reference to Value(将引用对象改为实值对象) 8.5 Replace Array with Object(以对象取代数组) 8.6 Duplicate Observed Data(复制「被监视数据」) 8.7 Change Unidirectional Association to Bidirectional(将单向关联改为双向) 8.8 Change Bidirectional Association to Unidirectional(将双向关联改为单向) 8.9 Replace Magic Number with Symbolic Co tant (以符号常量/字面常量 取代魔法数) 8.10 Encapsulate Field(封装值域) 8.11 Encapsulate Collection(封装群集) 8.12 Replace Record with Data Class(以数据类取代记录) 8.13 Replace Type Code with Class(以类取代型别码) 8.14 Replace Type Code with Subclasses (以子类取代型别码) 8.15 Replace Type Code with State/Strategy (以State/Strategy取代型别码) 8.16 Replace Subclass with Fields(以值域取代子类) 第9章 简化条件表达式 9.1 Decompose Conditional(分解条件式) 9.2 Co olidate Conditional Expression(合并条件式) 9.3 Co olidate Duplicate Conditional Fragments (合并重复的条件片段) 9.4 Remove Control Flag(移除控制标记) 9.5 Replace Nested Conditional with Guard Clauses (以卫语句取代嵌套条件式) 9.6 Replace Conditional with Polymorphism(以多态取代条件式) 9.7 Introduce Null Object(引入Null对象) 9.8 Introduce Assertion(引入断言) 第10章 简化函数呼叫 10.1 Rename Method(重新命名函数) 10.2 Add Parameter(添加参数) 10.3 Remove Parameter(移除参数) 10.4 Separate Query from Modifier(将查询函数和修改函数分离) 10.5 Parameterize Method(令函数携带参数) 10.6 Replace Parameter with Explicit Methods(以明确函数取代参数) 10.7 Preserve Whole Object(保持对象完整) 10.8 Replace Parameter with Method(以函数取代参数) 10.9 Introduce Parameter Object(引入参数对象) 10.10 Remove Setting Method(移除设值函数) 10.11 Hide Method(隐藏你的函数) 10.12 Replace Co tructor with Factory Method(以工厂方法取代构造函数) 10.13 Encapsulate Downcast(封装「向下转型」动作) 10.14 Replace Error Code with Exception(以异常取代错误码) 10.15 Replace Exception with Test(以测试取代异常) 第11章 处理概括关系 11.1 Pull Up Field(值域上移) 11.2 Pull Up Method(函数上移) 11.3 Pull Up Co tructor Body(构造函数本体上移) 11.4 Push Down Method(函数下移) 11.5 Push Down Field(值域下移) 11.6 Extract Subclass(提炼子类) 11.7 Extract Superclass(提炼超类) 11.8 Extract Interface(提炼接口) 11.9 Collapse Hierarchy(折叠继承体系) 11.10 Form Template Method(塑造模板函数) 11.11 Replace Inheritance with Delegation(以委托取代继承) 11.12 Replace Delegation with Inheritance(以继承取代委托) 第12章 大型重构 12.1 Tease Apart Inheritance(疏理并分解继承体系) 12.2 Convert Procedural Design to Objects(将过程化设计转化为对象设计) 12.3 Separate Domain from Presentation(将领域和表述/显示分离) 12.4 Extract Hierarchy(提炼继承体系) 第13章 重构,复用,与现实 13.1 现实的检验 13.2 为什么开发者不愿意重构他们的程序 13.3 再论现实的检验 13.4 重构的资源和参考数据 13.5 从重构联想到软件复用和技术传播 13.6 结语 13.7 参考文献 第14章 重构工具 14.1 使用工具进行重构 14.2 重构工具的技术标准 14.3 重构工具的实用标准 14.4 小结 第15章 总结 参考书目 要点列表 索引

2015-10-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除