通过心理学知识提高问题定位与解决能力(上)

作者:黄文海   本文属于作者原创,原文发表于InfoQ

前言

软件开发工作无论是从宏观还是微观上看,都可以看作一个问题解决的过程。从宏观上看,软件开发,简单来说,就是弄清楚客户的需求是什么,然后通过分析、设计、编码和测试等一系列活动解决如何将需求转换为代码的问题。从微观上看,开发人员的日常工作中也面临各式各样的问题。比如,用于调试代码的Web服务器突然启动不了,开发人员必须先解决这个问题,否则手头上的工作可能无法进展。

作为开发人员,与其抱怨加班,不如去反思下自己的时间都去哪里了。我相信开发人员的大部分时间都花在解决各种各样的问题上了。不管是资深的开发者、还是新手,在日常的工作中都会遇到各式各样的问题。所不同的是,资深开发者可以在几秒内解决的问题,新手却可能要花上几个小时,甚至一两天的时间!可见,提高开发者的问题解决能力,无论对于个人还是对于团队,都有着重要的意义。

其实,心理学作为一门独立的学科,对于问题解决有其专门的研究。其研究成果值得我们借鉴,以提高我们自身以及团队中的其它成员的问题解决能力。本文将为读者介绍心理学关于问题解决方面的知识,并结合软件开发工作的特点给出提高问题解决能力的相关指导意见。没有心理学背景的读者,也不必担心“隔行如隔山”,本文所涉及到的一些心理学术语,大多都是浅显易懂的。

阅读全文

《Redis官方文档》Redis简介

原文链接  译者:ethfoo

Redis 是一个开源的基于内存的数据结构存储器。通常可作为数据库,缓存和消息中介。它支持的数据结构有:字符串哈希表列表集合、支持范围查询的有序集合位图hyperloglogs和带查询半径的地理空间索引。Redis有内置的复制Lua脚本LRU缓存事务和不同层级的磁盘持久化功能,还通过Redis Sentinel提供了高可用性,通过Redis集群实现了自动化分割。

阅读全文

《Redis官方教程》-Redis加密

原文链接   译者:Alexandar Mahone

虽然给Redis增加SSL特性被提议了很多次,然而目前我们认为只有小部分用户需要SSL支持,事实上由于不同方案侧重点不同,使用不同渠道策略可能会更好。我们在将来可能改变这个计划,但是目前推荐使用如下项目,它可以满足多数加密场景:

阅读全文

《Redis官方文档》Data types—数据类型

原文链接

String类型(字符串类型)

String 是Redis中最基本的类型。Redis中的String 类型是二进制安全的,也就是说在Redis中String类型可以包含各种数据,比如一张JPEG图片或者是一个序列化的Ruby对象。一个String类型的值最大长度可以是512M。

阅读全文

《Redis官方文档》 Pipelining – 请求应答模式和往返延时

原文链接  译者:Tiffany

  Redis是一个CS结构的TCP服务器,使用”请求-应答”的模式。,客户端发起一个请求是这样的步骤:

  • 客户端发送一个请求给服务器,然后等待服务器的响应,一般客户端使用阻塞模式来等待服务器响应。
  • 服务器收到请求并处理完毕后,发送结果给客户端。

阅读全文

阿里感悟(十三)降低成本的敏捷设计

作者:方腾飞scrum agile

最近在参与一个比较大的项目,需要耗费上千人日,而细分设计和设计评审就花掉了几百人日,基本上10几个人写了几周的设计文档,并开了几周的设计评审会。整个过程模式比较重,所以耗费的人力比较大。

为什么模式比较重?

  • 参与者众多。设计评审会时,要求与本会相关的人都参与设计评审,一个屋子里可能坐着几十人,哪怕一个小时的会议和你相关的就5分钟,你也要参加。而且这样的公司会议太多,如果每个相关的会议都去参加,那就基本上是白天开会,晚上写代码的节奏,所以现在当有人找我开会时,我会问是否必须要我参加,能否会前或会后找我沟通确认,可能10分钟就能解决的问题。
  • 设计文档内容多。系分设计非常全,需要把所有设计场景都写上去,首先需要花大量时间写系分设计文档,其次需要几个小时的会才能评审完。而这样全面的设计文档,可能需要三个月到半年才能开发完成。
  • 有的设计评审没有经过小范围初审,有些设计遗漏了,导致要反复评审。

阅读全文

《Redis官方教程》-Redis的配置

原文链接   译者:   校对:方腾飞

Redis支持采用其内置默认配置的方式来进行启动,而不需要提前配置任何文件,但是这种启动方式只推荐在测试和开发环境中使用。

阅读全文

《Groovy官方教程》Grape依赖管理器

原文链接 译文链接 译者:JackWang

1 快速入门

1.1添加一个依赖

Grape是一个内嵌在Groovy里的Jar包依赖管理器。Grape让你可以快速添加maven仓库依赖到你的classpath里,使脚本运行更加简单。最简单的一种用法是只需要在你的脚本里添加一个注解:

[code lang=”groovy”]
@Grab(group=’org.springframework’, module=’spring-orm’, version=’3.2.5.RELEASE’)
import org.springframework.jdbc.core.JdbcTemplate
[/code]

@Grab也支持简洁版:

[code lang=”groovy”]
@Grab(‘org.springframework:spring-orm:3.2.5.RELEASE’)
import org.springframework.jdbc.core.JdbcTemplate
[/code]

注意,这里我们用到了import,这是推荐的做法。当然你也可以在mvnrepository.com搜索到依赖包然后使用@Grab注解形式加到pom.xml实体里。
阅读全文

《Redis官方文档》翻译邀请

并发编程网定期组织翻译官方指南,十一月组织翻译Redis官方文档, 官方地址,有兴趣的同学可以通过评论领取,每次领取一节,翻译完后再领取其他章节。如果翻译超过10篇文章,并发网会赠送一本作者签名的《JAVA并发编程的艺术》。

如何交稿?直接在并发网注册账号后点新建文章,参考我要投稿

阅读全文

《Java并发编程的艺术》-Java并发包中的读写锁及其实现分析

作者:魏鹏  本文是《Java并发编程的艺术》的样章封面立体图

1. 前言

在Java并发包中常用的锁(如:ReentrantLock),基本上都是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。

除了保证写操作对读操作的可见性以及并发性的提升之外,读写锁能够简化读写交互场景的编程方式。假设在程序中定义一个共享的数据结构用作缓存,它大部分时间提供读服务(例如:查询和搜索),而写操作占有的时间很少,但是写操作完成之后的更新需要对后续的读服务可见。

阅读全文

运行时和编译时元编程—编译时元编程

原文链接    译文链接     译者:JackWang

运行时和编译时元编程 第二部分

2 编译时元编程

Groovy的编译时元编程支持编译时生成代码。这些变换(译者注:原文该专有名词是transformations,译者直译为变换,也许不准确。如果有知道准确翻译的读者恳请不吝赐教,待译者修正)叫做程序的抽象语法树(AST),在Groovy里,我们叫做AST变换。AST变换支持在编译过程中植入钩子,修改抽象语法树之后继续编译生成正常的字节码流。和运行时元编程相比,这种转换可以在类文件的修改可见(或者说是字节码流)。如果你想要你的转换成为类协议的一部分(类协议是指实现接口,继承抽象类等等…)甚至你需要你的类可以被Java(或其他JVM语言)调用,在字节码流的修改可见是非常重要的。比如说,一个AST转换可以添加方法到一个类。在运行时元编程里,你需要使你的新方法在Groovy里可见,在编译时元编程要实现同样的功能,这个方法仅仅需要对Java可见即可。最后也同样重要的是,编译时元编程相比运行时元编程能活的更好的性能(因为没有初始化阶段)。
阅读全文

《Java并发性和多线程介绍》-Java TheadLocal

原文链接 作者:Jakob Jenkov   查看全部文章

Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作。因此,尽管有两个线程同时执行一段相同的代码,而且这段代码又有一个指向同一个ThreadLocal变量的引用,但是这两个线程依然不能看到彼此的ThreadLocal变量域。

1、创建一个ThreadLocal对象

2、访问ThreadLocal对象

3、ThreadLocal泛型

4、初始化ThreadLocal

5、Full ThreadLocal Example

6、InheritableThreadLocal

阅读全文

泛型中? super T和? extends T的区别

原文链接          李璟(jlee381344197@gmail.com)

经常发现有List<? super T>、Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T的父类,<? extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。

阅读全文

深入浅出: Java回调机制(异步)

Writer      :李强强

什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道“就一个回调…”。此时千万个草泥马飞奔而过(逃

哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉。不妨总结总结。

一、什么是回调

回调,回调。要先有调用,才有调用者和被调用者之间的回调。所以在百度百科中是这样的:

软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用

回调是一种特殊的调用,至于三种方式也有点不同。

1、同步回调,即阻塞,单向

2、回调,即双向(类似自行车的两个齿轮)。

3、异步调用,即通过异步消息进行通知。

阅读全文

深入浅出: 大小端模式

Writer      :李强强

一、什么是大小端?

大小端在计算机业界,Endian表示数据在存储器中的存放顺序。百度百科如下叙述之:

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

这两种模式,泥瓦匠记忆宫殿:“小端低低”。这样就知道小端的模式,反之大端的模式。 阅读全文

return top