- 博客(480)
- 资源 (70)
- 收藏
- 关注
原创 《人月神话》胸有成竹
实践是最好的老师,但是如果不能从中学习,再多的实践也没有用。 胸有成竹的意识就是我们能够很好的预见事物的发展,对于项目来讲就是我们能够通过项目计划来预见项目的发展,项目的执行过程是按照我们的计划和预测进行的。如何能够达到这个目标,就需要实践和数据两个重要内容,通过实践积累数据,通过对数据进行分析和学习进行总结,最后得到基于数据的项目预测模型。整个过程就是一个科学和结构化的过程,这些内容的形成和经验将固化到项目中,而不是完全依靠项目经理和一两个核心成员的个人经验。 实践是我们个人持...
2021-06-29 16:03:24
438
1
原创 《人月神话》画蛇添足
画蛇添足的成语大家应该都听过,不过这里讲的故事有点不同,这是一部项目经理的辛酸史。项目经理接到一个需求的时候,通常是下面的这种场景。1、架构师从技术架构设计上给出解决方案;2、财务需要考虑开发成本支出,想尽量的节流;3、客户经理又想尽可能多的增加系统的功能;三方的矛盾最终要在“时间”这个通常的限定条件下达成妥协。做出的牺牲主要有:1、削...
2019-05-11 23:33:37
631
原创 《人月神话》贵族专制、民主政治和系统设计
引子:先来看一组法国城市兰斯教堂的图片,整体的风格,给你的第一感觉应该是一致的,尖尖的顶,弧形的窗。再看一组哥特式教堂,分割线-------------------------上图中的哥特式教堂,每一代人都增加了自己的创意,整体风格给你的第一感觉很不一致,有些杂乱。为什么兰斯教堂经过几个世纪的迭代,还能保持一致的风格?因为设计师们在几代人的传承中,保持了设计...
2019-04-09 10:22:02
655
原创 计算机系统漫游
不了解土壤的组成成分,就很难种出可口的蔬菜;不了解操作系统,也不太可能写出高效优雅的程序。我们先编写一段程序:#include<stdio.h>int main(){printf("hello world");}保存为hello.c,然后我们编译、链接生成可执行的目标程序。当我们执行这个目标程序时,控制台会输出“hello world”。想不想知道程序运行时...
2019-04-05 11:32:14
295
原创 《SQL反模式》第三章 单纯的树
树就是树,你还需要考虑什么吗? 罗纳德.里根 我们看个贴吧的例子,吧友们可以一起讨论一个主题,又可以互相评论,怎么存储这些评论信息呢? 第一版:create table comment(comment_id serial primary key,parent_id bigint unsigned,bug_id bigint unsigned not nul...
2019-02-21 12:45:12
404
原创 《SQL反模式》第二章 乱穿马路
所谓的专家,就是在很小的领域里把所有错误都犯了过的人 - 尼尔斯.波尔一、什么是反模式?反模式是一种试图解决问题的方法,但通常会同时引发别的问题。 二、何为乱穿马路?概念:使用逗号分隔列表来避免在多对多关系中创建交叉表,这种反模式就成为乱穿马路。为什么叫乱穿马路,因为乱穿马路是避免按规定穿越十字路口(交叉表)的一种方式。使用个通俗的概念解释下,之前一个产品对应一个客户经...
2019-02-18 18:05:54
292
原创 《人月神话》:外科手术队伍
问题:如何在有限的时间内创建大型的系统?我们假设创建的大型系统需要5000人年。 观点一:一拥而上的开发,相信人多力量大,增加人数,满足时间要求。评:1、这里错误地将软件开发和体力劳动等价了;一个任务如果分配到单个人,而这个单个的人不需要和其他人沟通即可完成的任务,是可以通过增加人数来缩短劳动时间的。比如割麦子,每个人割自己分配的麦子,中间不需要和其他人沟通,...
2018-08-26 18:31:54
1041
原创 《人月神话》:人月神话
在众多软件项目中,缺乏合理的时间进度是造成项目滞后的主要原因,它比其他所有因素加起来还大。 我们不禁要问导致这种普遍性灾难的原因是什么呢? FrederickP.Brooks.Jr给出了以下几个原因:1)估算技术缺乏有效的研究,隐含地假设一切都运行良好2)将进度和工作量相互混淆,隐含地假设人和月可以互换3)对估算缺乏信息,导致不会有耐心地持续地进行估算这项工作...
2018-07-30 18:32:47
12516
1
原创 《人月神话》:焦油坑
史前史中,没有别的场景比巨兽们在焦油坑里垂死挣扎的场面更令人震撼。上帝见证着恐龙、猛犸象、剑齿虎在焦油坑里挣扎。它们挣扎得越猛烈,焦油纠缠得就越紧,没有哪种猛兽足够强壮或具有足够的技巧,能够挣脱束缚,它们最后都沉到了坑底。 开发一个大型产品无异于在焦油坑中挣扎的巨兽,每个单独的问题都能够被解决,但是当它们累积在一起相互纠缠的时候,就会使团队行动滞缓。鲜有项目能够满足:目标、时间进度...
2018-07-30 13:08:49
1933
原创 Java内部类
目录[阅读本文大概需要3分钟]:什么是内部类?为什么需要内部类?内部类的种类3.1 静态内部类3.2 成员内部类3.3 局部内部类3.4 匿名内部类1、什么是内部类?在一个类的内部定义的类,就是内部类。像下面这样。2、为什么需要内部类?@《Java编程思想》内部类可以实现多重继承(类或抽象类),可以参考下面这篇博文 https://blog.csd...
2018-07-15 19:33:44
270
原创 数据库事务:ACID + 读取/更新问题
目录[阅读本文需要?分钟]:数据库事务是什么?1.1. 原子性1.2. 一致性1.3. 隔离性1.4. 持久性并发事务的读取问题2.1. 脏读2.2. 不可重复读2.3. 幻读2.4. 不可重复读和幻读的区别并发事务的更新问题3.1. 第一类丢失更新3.2. 第二类丢失更新1、数据库事务是什么?数据库事务是个泾渭分明的概念。要么是黑,要么是白,中间没有灰色地带。一系列操作要么全部执行成功,要么全不...
2018-06-30 19:10:48
856
1
原创 2018期中总结
不能只顾着低头走路,忘了抬头看路日月如梭,光阴似箭,2018年在不知不觉中已经过了一半。记得刚工作的时候,部长在新员工座谈会上提到了粟裕大将:“每战必总结。四年过去了,这句话一直扎根在我的脑海,深深地影响着我。问题出现了,我们不应该放过它,应该去分析去解决它;事情过去了,我们更不应该放过它,应该去总结它。而这应该是一个习惯。半年自评结果如果满分是150分的话,上半年的自评是35,不及格。年初计划完...
2018-06-29 22:24:18
648
原创 Spring源码阅读3:Resource
一、引子:我们先来看看下面这行代码的具体实现BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml")); 通过时序图,我们看到BeanFactoryTest中首先调用ClassPathResource的构造函数来构造Resource。这里就有个问题,因为资源有多种表现形式,文件、UR...
2018-06-27 08:07:39
558
原创 Spring源码阅读2:AliasRegistry&SimpleAliasRegistry
一、spring-beans1、目录结构我们先来看看bean包,目录结构如下:2、核心类DefaultListableBeanFactorybean包中有个核心类DefaultListableBeanFactory,是bean加载的核心部分,层次结构如下:今天先来看下AliasRegistry&SimpleAliasRegistry。二、AliasRegistry&SimpleAl...
2018-06-13 07:49:28
1352
原创 Spring源码阅读1:环境搭建
前言:Spring是一款优秀的开源框架,使用非常广泛,研读Spring源码就像是开采一个大金矿,深度开采会有取之不尽的知识财富。Spring是什么?The term "Spring" means different things in different contexts. It can be used to refer to the Spring Framework project itself...
2018-06-11 07:52:25
724
原创 《深入浅出Hibernate》:Java持久化的演进1
以前看过一些持久化的封装代码,但并没有完全理解其设计思想和要义,今天看了《深入浅出Hibernate》的章节,有种拨云见日,豁然开朗的感觉。今天就写篇博文梳理下演进过程,希望能帮助各位更清晰地理解持久化的解耦思想吧。这里我们有一个需求,查询客户A的银行账户余额,代码如下:上面的代码是标准的JDBC查询操作。想一想:查询完成后,需要释放哪些资源?为什么?这里不展开讲了,有兴趣的可以参考这边文章连接池...
2018-04-25 07:44:05
308
转载 如何选择开源许可证?
作者: 阮一峰日期: 2011年5月 2日如何为代码选择开源许可证,这是一个问题。世界上的开源许可证,大概有上百种。很少有人搞得清楚它们的区别。即使在最流行的六种----GPL、BSD、MIT、Mozilla、Apache和LGPL----之中做选择,也很复杂。乌克兰程序员Paul Bagwell,画了一张分析图,说明应该怎么选择。这是我见过的最简单的讲解,只用两分钟,你就能搞清楚这六种许可证之间...
2018-04-24 07:29:25
429
转载 聊聊并发-Java中的Copy-On-Write容器
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。...
2018-04-20 07:33:03
286
原创 并发编程(3)-线程安全性
线程和锁在并发编程中的作用,类似于铆钉和工字梁在土木工程中的作用-《并发编程实战》 我们知道对象是由属性(成员变量)和方法组成的,当我们实例化一个对象的时候,也就意味着给对象的属性赋初始值。对象的属性值,也就是对象的状态会随着程序的运行变化。这里就引出了对象状态的可变性。当然,有些加了final关键字的变量,在对象的整个生命周期内是不可变的。我们创建的对象,有可能只在一个单线程的程序中运行,也有...
2018-04-03 08:09:59
332
原创 JVM系列(7)-JVM类加载机制(2)
今天继续类加载的学习,先复习下类的生命周期。上一篇讲到了阶段2-验证JVM系列(7)-JVM类加载机制(1),今天从阶段3开始。阶段3:准备准备阶段都做什么呢?主要做两件事情:1)为类变量分配内存什么是类变量?也就是用static修饰的变量;在哪个区域上分配?在方法区上分配,记住是方法区而不是堆。2)设置类变量初始值比如public static int value = 111;设置变量初始值,是...
2018-03-13 22:52:49
294
转载 设计模式总结之模式分类
转自:http://blog.youkuaiyun.com/cooldragon/article/details/52164380话说这个世界还是混沌之时,盘古抡起一把大斧,开辟了天与地,从此,这个世界有天有地,万事万物在这个世界才慢慢发展起来。话说软件江湖还是混沌之时,无门无派,无招无式,GoF(Gang of Four,四个大师),穷理之熟,融会贯通,合著了《Design Patterns: Elemen...
2018-03-13 10:44:18
282
原创 JVM系列(7)-JVM类加载机制(1)
我们编写的*.java文件,编译后会生成*.class文件。*.class最终都是要加载到虚拟机中之后才能运行和使用,那虚拟机是怎么加载这些文件的呢?今天我们就来聊聊这个。先来看下类的生命周期,主要包括以下几个阶段:加载、验证、准备、解析、初始化、使用、卸载。除了解析阶段位置不固定,其余的阶段开始顺序都是固定的。在某些情况下,解析阶段可在初始化之后。下面逐一讲解各个阶段。阶段1:加载类加载的过程包...
2018-03-12 22:56:04
333
原创 并发编程(2)-CAS
1.What-CAS是什么?CAS是英文翻译是Compare And Swap的缩写,也就是比较并交换的意思。它是一个机制,是个负责同步的机制,再加一条,它还是一个非阻塞同步的机制。既然说到了,非阻塞同步,那什么是阻塞同步呢?我们知道在Java中,如果想确保一段代码或者一个方法,在多线程并发的场景下,在某个时间段,只由一个线程运行,我们通常采用的方法是加上synchronized关键字
2018-02-06 22:16:18
386
原创 并发编程(1)-wait/notify/notifyAll
习惯是养成的,那为什么不养成好习惯呢?最近工作中遇到了一些并发编程的知识,想着抽时间将这一块整理下,想到就做,今天就开始^_^。如题,今天来看下Object的wait/notify/notifyAll方法。我们知道Java是个单继承的语言,所有的类都默认继承Object,那这3个方法也就是所有的类都有的方法。0.Obj
2018-01-30 22:32:25
815
转载 理解Load-Average做好压力测试
SIP的第四期结束了,因为控制策略的丰富,早先的的压力测试结果已经无法反映在高并发和高压力下SIP的运行状况,因此需要重新作压力测试。跟在测试人员后面做了快一周的压力测试,压力测试的报告也正式出炉,本来也就算是告一段落,但第二天测试人员说要修改报告,由于这次作压力测试的同学是第一次作,有一个指标没有注意,因此需要修改几个测试结果。那个没有注意的指标就是load average,他和我一样开始只是注
2018-01-30 15:30:50
395
原创 JVM系列(6)-内存分配与回收策略
今天聊聊Java的内存分配和内存回收,内存的回收也就是前几节讲的垃圾回收,有兴趣的可以看下前面的文章,今天主要看下内存的分配。先来回忆下Java运行时的数据区,如下图所示。Java对象所占的内存是在下面哪个区上分配的?堆,恭喜你答对了^_^。回忆点1:堆的内存布局我们在讲垃圾收集算法的时候,有提到过分代收集算法(JVM系列(4)-垃圾收集算法)。也就是按对象的生存时间将其划分为新生代和老年代,不同
2018-01-17 23:06:44
353
原创 JVM系列(5)-HotSpot 2 垃圾收集器
今天继续HotSpot的学习,聊聊垃圾收集器。之前讲过垃圾收集算法,可以参考这里JVM系列(4)-垃圾收集算法,垃圾收集算法讲的是思想或者理论,垃圾收集器呢,就是其实现。知识点1:HotSpot有哪些垃圾收集器呢?参阅《深入理解Java虚拟机 JVM高级特性与最佳实践》,以JDK 1.7 Upgrade 14之后的HotSpot虚拟机为例
2018-01-09 16:45:31
358
原创 JVM系列(5)-HotSpot 1
问题1:HotSpot是什么东东?JVM制定了一个规范,不同的公司或者个人可以根据规范实现自己的Java虚拟机。为了便于理解可以将规范理解为接口,接口可以简化理解为一个方法,定义应该具有哪些功能。例如swap(a,b) 意思就是交换a和b的值。至于方法的实现不关心,最终能把a,b值交换过来就成,这就是规范。不管黑猫还是白猫,能逮着老鼠就行。Hot
2018-01-05 23:21:45
403
原创 JVM系列(4)-垃圾收集算法
上一节讲了判断"垃圾"的方法,有引用计数和可达性分析两种方法。这一节看下,回收这些“垃圾”的方法。方法1:标记-清除算法见名知意,先标记,再清除;标记出所有的可回收对象后,统一回收。缺点:容易产生大量的内存碎片,如果分配的对象占用内存较大,同时又找不到足够大的连续空间,则只能再次触发一次垃圾回收。回收前:回收后:
2018-01-03 22:34:52
291
原创 JVM系列(3)-哪些内存需要回收?
今天看看垃圾收集和内存分配策略。垃圾收集无非就是清除垃圾,释放内存,而JVM就像一个大管家,不需要你这位当家的介入,他把垃圾清理这个活给揽下了,你只需要创建对象,生产垃圾,JVM这位大管家来打扫。前面讲了JVM的运行时数据区,这些区域啊,也就相当于你这位当家的四合院。有院子,有单间。院子是公共区域(堆+方法区),单间是私有区域,每个单间都有(虚拟机栈+本地方法栈+程序计数器)这些标配。差点
2017-12-28 22:48:15
1495
1
原创 JVM系列(2)-对象和OOM异常
上一讲中,我们了解了JVM的内部结构,更准确的讲应该是JVM运行时数据区,知道了对象的实例是在堆中分配的。那到底是怎么创建的,都有哪些信息需要创建,我们今天就先讲下这个,以Hotspot实现为例。问题1:对象是怎么创建的?我们创建对象的时候,会使用new关键字,像这样:Object obj = new Object();虚拟机在遇到new这个关键字的
2017-12-27 21:40:44
315
原创 JVM系列(1)-Java内存区域
前段时间比较忙,公众号断更了一段时间,当下得空,准备写个JVM系列,JVM也就是Java Virtual Machine(Java虚拟机的缩写)。考虑或者定位的问题的时候,经常会思考下数据的流向,那JVM是在哪个位置,哪个闸口呢?问题1: JVM的位置JVM在Java App和操作系统之间。Java语言不需要我们手工的释放或回收内存,这个工作由J
2017-12-26 21:53:46
295
原创 读书笔记-《Java NIO》:第三章 通道(5)
这几周事情有些多,没更新博文,今天得空,咱们继续。学过了FileChannel,今天来看看SocketChannel。issue 1:先来看下SocketChannel在类图中的位置,看能发现些什么?发现1:从图中可以看到Socket通道类(DatagramChannel、SocketChannel、ServerSocketChannel)都继承
2017-10-18 22:34:05
313
原创 读书笔记-《Java NIO》:第三章 通道(4)
1. 内存映射文件FileChannel中有一个map()方法,这个方法是做什么用的呢?记不记得第一章讲过的虚拟内存和直接存储的概念?不记得没关系,看下面这张图。常规情况下,用户空间的进程想要读取一块磁盘数据,需要发起系统调用read(),read()是系统内核,read()读取数据后,放入内核空间的缓冲区,再由内核缓冲区重新组装到用户空间的缓冲区,同一份数
2017-09-25 23:00:43
396
原创 读书笔记-《Java NIO》:第三章 通道(3)
言归正传,今天来看看通道中的文件通道~~~焦点1: File Channel在整个I/O体系中的位置先复习下I/O的简单分类,I/O广义上分为File I/O和Stream I/O, FileChannel文件通道,顾名思义就是服务于File I/O的。FileChannel在Channel类图的位置,从图中可以看出F
2017-09-24 22:48:04
411
原创 读书笔记-《Java NIO》:第三章 通道(2)
封面女神系列,第二期-高圆圆O(∩_∩)O~继续第三章的学习。。。问题1: 什么是Scatter/Gather(发散/汇聚)?操作系统中有一个概念Scatter/Gather,是什么意思呢?有的操作系统设计的比较高效,允许进程只使用一个系统调用,就能够把一连串缓冲区地址传递给系统内核,之后内核就可以顺序填充或清除缓冲区
2017-09-21 22:47:43
378
原创 读书笔记-《Java NIO》:第三章 通道(1)
封面准备出一个女神系列,第一期-孙燕姿O(∩_∩)O~,情歌一首《开始懂了》今天学习第三章通道~~~1. 通道是个什么东东?最近南京地铁安检,大包小包都要过安检。有没有印象,有的安检机会佩带一个小筐,这个小筐就类似于缓冲区,安检机就是一个通道,数据放到筐里,由一端传送到另一端,就类似于数据放到缓冲区里,经通道由一端传送到另一端;在另一端从
2017-09-19 23:06:26
363
原创 读书笔记-《Java NIO》:第二章 缓冲区(2)
今天接着看Java NIO第二章O(∩_∩)O~1. 复制缓冲区复制缓冲区,我们可以使用以下3个函数,以CharBuffer为例Note:复制并非deep copy,可以理解为浅copy,复制的缓冲区和原来的缓冲区共用缓冲区的数据,原始缓冲区的改变会直接映射到copy的缓冲区,反之亦然;但各自有独立的position、limit、ma
2017-09-18 22:25:01
412
原创 读书笔记-《Java NIO》:第二章 缓冲区(1)
上周生病停更了一周,这周我们继续^_^。今天我们来看下第二章---缓冲区,了解下不同的缓冲区类型,并学会使用。焦点1:Java NIO的Buffer有哪些类型?Note: Buffer及其继承类CharBuffer、IntBuffer、DoubleBuffer、ShortBuffer、LongBuffer、FloatBuffer、
2017-09-17 21:32:49
537
原创 读书笔记-《Java NIO》 : 第一章 简介
最近准备花点时间将Java NIO梳理一下,在网上download了一本Java NIO。计划跟着书的目录,每天读一点,顺便也写写博文,坚持每天记一点。今天我们来看看第一章讲的什么,充满期待哦^_^I/O有点类似于下水道,没有它不行,和它打交道有很不爽,搞不好还把自己弄得臭烘烘的。随后的章节讲的不是疏通管道,而是如何让管道的流通更顺畅一些。
2017-09-05 23:09:07
400
Silverlight4 安装包
2013-01-14
jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008
2014-06-13
Eclipse最新SVN插件
2014-06-08
Node.js开发指南
2013-11-29
ffmpeg.dll ffmpeg.exe
2013-03-12
Win7摄像头驱动 英文版AMCap9.11
2013-03-08
AMCap9.11文版
2013-03-08
Win7 AMCap9.11摄像头
2013-03-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人