gzdd
未读导读:本文是从《Good Programmers Make Bad Designers》这篇文章翻译而来,译文来自外刊IT评论《好的程序员做不出好的软件设计》。
文章内容如下:
你不能看到一个程序员还不错,就把他推到系统分析师、软件设计师或软件架构师的位置上。
如果你在团队或公司里寻找一个能胜任软件架构师或设计师这样重要位置的人时,首先出现在脑子里的想法通常是在程序员中选一个最好的。别这么干。这样的位置不是随意的找个不错的程序员就能胜任的。把你最资深的程序员晋升到这个位置也未必就合适。
乍一听你可能感觉荒诞。为什么我不能让一个程序员去做系统设计呢?毕竟,他们是设计程序的,不是吗?的确是的,没错。但你要明白的事情是,设计软件相对于编写程序,它需要的是一套完全不同的技能。
让我们来看看为什么一个好的程序员就未必可以做一个好的软件设计师。但首先,让我们来问问自己一个问题,是什么让一个程序员变的优秀,甚至杰出?要想成为一个好的程序员,你需要有能力实现真实世界里重要的软件。只能够写出一个简单的文本编辑器是远远不够的。
为了能做到可以解决重大的、复杂的编程问题,一个程序员需要在某个特点的编程语言上 ...
最近要做一个Python的基于Eclipse的界面设计器,因此我对各种GUI设计工具做了一下分析,发现GUI设计工具也有一个门派。
在那个懵懂的年代,一切界面代码都是要开发人员手工书写,这无疑增加了开发难度,Delphi、VB等工具的出现扭转了这个局面,使用这些工具开发人员只要在控件面板上拖拖拽拽就可以完成界面的设计,做到了“所见即所得”的开发方式。仔细分析,GUI设计工具有如下几个门派:基于界面文件的纯代码生成、代码生成与界面文件结合、无界面文件方式。
基于界面文件的纯代码生成:NetBeans是这类工具的典型代表(如果我没记错的话JBuilder也是这样实现的),NetBeans中与界面设计有关的有两个文件:.java文件和.form文件。.form文件中是以XML格式描述界面布局和控件的属性等信息;.java文件则是通过解析.form文件生成的代码,生成的界面代码主要位于initComponents方法中,这个方法在NetBeans IDE中是无法手工编辑的。在用户拖拉控件的时候,NetBeans就将拖拉的控件描述增加到.form文件中,并且即时将新的代码生 ...
1.概述Gradle是基于Groovy的构建管理系统,专门用于构建基于Java的项目。
可以在此处找到安装说明。
2. Building Blocks – Projects and Tasks(构件-项目和任务)在Gradle中,构建由一个或多个项目组成,每个项目由一个或多个任务组成。
Gradle中的项目可以组装jar,war甚至是zip文件。
一项任务是一项工作。这可以包括编译类,或创建和发布 Java/web archives.
一个简单的任务可以定义为:
12345task hello { doLast { println 'Baeldung' }}
如果我们在build.gradle所在的位置使用gradle -q hello命令执行上述任务,则应该在控制台中看到输出。
2.1. TasksGradle的构建脚本不过是Groovy而已:
1234567task toLower { doLast { String someString = ...
gzdd
未读随着对项目管理理解的深入,自己对项目管理的两点有了深刻理解:需求开发与管理、项目组织结构。
一、需求开发与管理
宽泛地讲,需求来源于用户的一些“需要”,这些“需要”被分析、确认后形成完整的文档,该文档详细地说明了产品“必须或应当”做什么。所以如果只有一些零碎的对话、资料或邮件,你就以为自己已经掌握了需求,那是自欺欺人。需求是产品的根源,需求工作的优劣对产品影响最大。就像一条河流,如果源头被污染了,那么整条河流也就被污染了。 我们经常看到的是:人们并不清楚究竟该做什么,但却一直忙碌不停地开发。
需求开发与管理面临最普遍的问题是:用户说不清楚需求。
有些用户真的不知道需求是什么,或者对需求只有朦胧的感觉,他当然说不清楚需求。例如,早期的政府信息化项目用户通常只有一个朦胧的信息化感觉而已,需求分析中会这样写:”总之,要实现那种能够想到就能做到功能。”。如果开发方的营销人员水平比较高,他能够在用户不清楚自己要什么的情况下引导用户“消费”。
有些用户虽然心里明白想要什么,但却说不清楚需求。 比如说买 ...
如果能在构建代码前发现代码中潜在的问题会怎么样呢?很有趣的是,Eclipse 插件中就有这样的工具,比如 JDepend 和 CheckStyle,它们能帮您在软件问题暴露前发现这些问题。在 让开发自动化 的本期文章中,自动化专家 Paul Duvall 将带来一些关于 Eclipse 插件的例子,您可以安装、配置和使用这些静态分析插件,以便在开发生命周期的早期预防问题。关于本系列作为一名开发人员,我们的工作就是为终端用户将过程自动化;然而,我们当中有很多人却忽视了将我们自己的开发过程自动化的机会。为此,我编写了让开发自动化 这个系列的文章,专门探索软件开发过程自动化的实际应用,并教您何时 以及如何 成功地应用自动化。
开发软件时,我的主要目标之一是:要么防止将缺陷引入代码库,要么限制缺陷的生存期;换言之,要尽早找到缺陷。很显然,越是了解如何编写更好的代码以及如何有效测试软件,就越能及早地捕捉到缺陷。我也很想要一张能发现潜在缺陷的安全之网。
在 本系列 八月份 的那期文章中,我得出了这样的结论:将检验工具集成到构建过程(例如,使用 Ant 或 Maven)中,能够建立起一种 ...
概述Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果。
Spring 的缓存技术还具备相当的灵活性,不仅能够使用 SpEL(Spring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存临时存储方案,也支持和主流的专业缓存例如 EHCache 集成。
其特点总结如下:
通过少量的配置 annotation 注释即可使得既有代码支持缓存
支持开箱即用 Out-Of-The-Box,即不用安装和部署额外第三方组件即可使用缓存
支持 Spring Express Language,能使用对象的任何属性或者方法来定义缓存的 key 和 condition
支持 AspectJ,并通过其实现任何方法的缓存支持
支持自定义 key 和自定义缓存管理者,具有相当的灵活性和扩展性
本文将针对 ...
java源码分析
未读通过 HashMap、HashSet 的源代码分析其 Hash 存储机制集合和引用就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java 对象放入数组中,只是把对象的引用放入数组中,每个数组元素都是一个引用变量。
实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集合元素的存储位置,这样可以保证能快速存、取集合元素;对于 HashMap 而言,系统 key-value 当成一个整体进行处理,系统总是根据 Hash 算法来计算 key-value 的存储位置,这样可以保证能快速存、取 Map 的 key-value 对。
在介绍集合存储之前需要指出一点:虽然集合号称存储的是 Java 对象,但实际上并不会真正将 Java 对象放入 Set 集合中,只是在 Set 集合中保留这些对象的引用而言。也就是说:Java 集合实际上是多个引用变量所组成的集合,这些引用变量指向实际的 Java 对象。
HashMap 的存储实现当程序试图将多个 key-value 放入 HashMap 中时,以如下 ...
目录
[TOC]
原文地址:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#whatismmJeremy Manson and Brian Goetz, February 2004
到底什么是内存模型?在一个多处理器系统中,处理器通常拥有多层缓存。这些多层缓存能够高速获取数据(因为缓存中的数据与处理器更近,cpu—>寄存器—>缓存—>主存)和减少主存的访问频率以降低总线的繁忙程度(因为很多操作可以通过缓存的数据自满足,不需要在主存交互)来提高cpu整体的运行速度。
虽然缓存可以明显的优化性能,但是缓存技术的引入也带来了很多调整。比如:当两个处理器同时访问同一个内存地址时会发生什么?在什么情况下这两个处理器会看到相同的值?缓存的引入会造成数据不一致问题?
在处理器层面,一个内存模型中需要定义必要的、充足的条件限制,这些条件保证了一个处理器写入主存的数据对其他处理器的可见性,并且其他处理器的写入操作也可以对当前处理器可见。
一些处理器设计所展现出的是一个强内存模型 ...
一、题前话本人一直崇尚一个原则,“我思,故我在!”。一直以来忙于编码,但是不甚如人意(写了较多重复性、耦合性太强的代码)。行有行规,面向对象编程的Java语言也不例外,遵循其相关原则,才能高效快速的编写高性能的代码。那么期间过程学习很重要,从一开始的基础知识学习,到大量的编写代码,回过头来再将学习的理论和实践相结合,每一个环节都很重要,这样才能成为高手,特别是最后一环(将理论与实践相结合——重构之前不符合理论原则的代码,反过来加深理论的理解)。
二、正题一般对Java面向对象编程的高度概括是——三大基本特性(封装、继承、多态)和五大基本原则(SOLID)
1)三大特性是:封装,继承,多态所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象 ...
javagc
未读什么是Java垃圾回收器Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动分配(Memory Allocation)、自动回收(Garbage Collect) 功能,这两个操作都发生在Java堆上(一段内存快)。某一个时点,一个对象如果有一个以上的引用(Rreference)指向它,那么该对象就为活着的(Live),否则死亡(Dead),视为垃圾,可被垃圾回收器回收再利用。垃圾回收操作需要消耗CPU、线程、时间等资源,所以容易理解的是垃圾回收操作不是实时的发生(对象死亡马上释放),当内存消耗完或者是达到某一个指标(Threshold,使用内存占总内存的比列,比如0.75)时,触发垃圾回收操作。有一个对象死亡的例外,java.lang.Thread类型的对象即使没有引用,只要线程还在运行,就不会被回收。
回收的机制依据统计分析可知,Java(包括一些其它高级语言)里面大多数对象生命周期都是短暂的,所以把Java内存分代管理。分代的目的无非就是为不同代的内存块运用不同的管理策略(算法),从而最大化性能。相对于年老代,通 ...
