读后感:淘宝技术这十年

这是一本好玩的书,从前面两章看,主要是讲故事;从后面两章看,主要是讲人物;从中间几章看,主要是讲技术。我在写作的过程中,把部分章节贴到了博客上,有人看了说励志,有人看了说对技术有帮助,有人看了说对产品有帮助,有人看了说对创业有帮助,有人看了说里面的段子特别逗,现在我也不知道这是人文读物还是技术书了。

正如序章所说,这根本就不是算是一本技术书记, 技术书很容易写成催眠的读物,这本书一开始作者就没有当做技术书来写。所以读者也大可抱着看一本淘宝历史的心态来阅读此书。

里面有一句话说的让我特别有感触,淘宝从最开始的主动改版,创新,到最后需求,规模的不断扩大,不得不被动创新,这一步步走来和我这几年在公司项目的不断重构尤其相似,恰好我所处的项目也是电商项目。以下我针对此书总结的淘宝技术发展阶段:

  1. 最初的淘宝是一套买来的 LAMP(Linux+Apache+MySQL+PHP)架构系统,一个很常见的网站架构模型。客户化也只是拆分成了一个主库,两个从库,数据库读写分离这些最基本的改进。
  2. 到接下来简单架构的升级,把数据库换成了Oracle,并使用了一个开源的连接池代理服务SQL Relay,买了NAS作为数据库的存储设备,加上Oracle RAC(Real Application Clusters)来实现负载均衡。
  3. 以及作者所说的脱胎换骨的升级:PHP替换称为Java,打造一个自己的WebX MVC框架,持久层支使用ibatis,控制层则是EJB和Spring,引入搜索引擎iSearch,以及后来开始使用IBM小型机,EMC存储,引入缓存系统Berkeley DB,CDN等等。
  4. 再之后的随着规模扩大,成本大幅度增加,开始自主研发出淘宝文件系统TFS和淘宝KV缓存系统Tair。
  5. 分布式电子商务系统的产生,服务化后使用的高性能服务框架HFS和消息中间件Notify,分布式数据访问层TDDL,TBSession框架。

其实可以看出来作者很多也是点到为止,如果读者感兴趣完全就可以根据作者给的各种技术的名字找相关资料阅读。

最后在聊聊自己,在一个电子商务项目三年了,前前后后重构了三次,最开始参与搜索引擎的替换,摸索中前进,到后来去除JSP里面所有业务逻辑(没办法,零几年的项目大量逻辑直接写在JSP),公司内部自己创造的MVC框架,再到最后一年整个Checkout重构,前后端分离,使用React,去除form表单,所有请求使用Rest。这中间踩过的雷和坑也是一言难尽,总之之后会单独歇歇这几年来项目重构中间的技术变化。

Eclipse to IntelliJ IDEA

身边越来越多的人开始使用IntelliJ IDEA,都在向我推荐用了之后工作效率提高了一大截。抱着半信半疑的心态,我也尝试使用这个新的IDE,经过一周的使用,个人体会就是好比玩dota的从dota键位改成了QWER,用智能ABC的换成了搜狗输入法。当然不要认为我是在夸这个IDE,因为到目前为止我还没发现有什么特别的理由让我一定要从Eclipse切换到IDEA。
不过还是分享下摸索一周来的一些小技巧,说说如何减轻IDE过渡之间的不使用。

快捷键

开发工具中的重中之重,工作效率提升最直接的体现。IDEA支持直接切换快捷键模版,习惯Eclipse的人可以直接使用Eclipse模版,另外IDEA还提供了Eclipse for MAC OS X和Eclipse两套快捷键,方便习惯MAC键位的人员。

1
2
Windows: Files → Setting → keymap
Mac: Preference → keymap

另外要单独推荐的就是find action这个快捷键了,可以方便开发人员搜索IDEA的各种功能,而不需要记住快捷键。
还有代码补全依然和Eclipse一样,要修改成Alt+Slash的可以打开

1
Main Menu → Code → Completion → Basic

视图

默认的两个试图显示其实不错,不过个人喜欢Sublime,这里推荐下:

  1. 下载 Eclectide Monokai 主题的jar包
  2. 打开 File → Import Settings → Select the jar file
  3. 重启 IntelliJ

作者原文:monokai-theme-intellij

优化IDEA

都说IDEA最大的好处是没有了Eclipse的卡顿问题,但是我个人使用来看,Mac上确实比Eclipse流畅,可是在Windows上,编索引的时候占满CPU我也就忍了,可是平时也巨卡无比。经过google之后才知道,原来因为我Windows电脑没有JDK1.8,导致IDEA默认启动是idea32.exe,于是悄悄安装JDK1.8,环境变量配置 IDEA_JDK_64指向JDK1.8即可,这样就不影响开发用的JDK版本。详细可以参考: http://www.tuicool.com/articles/NBRnYn

插件

Check Style:导入Eclipse的xml即可。

Code Formatter:要在IDEA的Plugin Repositories里面搜索一个叫Eclipse Code Formatter的插件,但是貌似不支持IDEA 2016。

Getter & Setter:这个不算插件,顶多就是个模版配置,但是也写了我好久,分享给大家:

Getter:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* Getter method for property <tt>$field.name</tt>.
*
* @return property value of $field.name
*/
public ##
#if($field.modifierStatic)
static ##
#end
$field.type ##
#if ($StringUtil.startsWith($helper.getPropertyName($field, $project),"_"))
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($StringUtil.substringAfter($helper.getPropertyName($field, $project),"_"))))
#elseif ($StringUtil.startsWith($helper.getPropertyName($field, $project),"m") && $StringUtil.isCapitalized($StringUtil.substringAfter($helper.getPropertyName($field, $project),"m")))
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($StringUtil.substringAfter($helper.getPropertyName($field, $project),"m"))))
#else
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#end
#if ($field.boolean && $field.primitive)
#if ($StringUtil.startsWithIgnoreCase($name, 'is'))
#set($name = $StringUtil.decapitalize($name))
#else
is##
#end
#else
get##
#end
${name}() {
return $field.name;
}

Setter:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#if ($StringUtil.startsWith($helper.getPropertyName($field, $project),"_"))
#set($paramName = $StringUtil.substringAfter($helper.getParamName($field, $project),"_"))
#elseif ($StringUtil.startsWith($helper.getPropertyName($field, $project),"m") && $StringUtil.isCapitalized($StringUtil.substringAfter($helper.getPropertyName($field, $project),"m")))
#set($paramName = $StringUtil.substringAfter($helper.getParamName($field, $project),"m"))
#else
#set($paramName = $helper.getParamName($field, $project))
#end
/**
* Setter method for property <tt>$field.name</tt>.
*
* @param p$paramName value to be assigned to property $field.name
*/
#if($field.modifierStatic)
static ##
#end
void set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($paramName))($field.type p$paramName) {
#if ($field.name == $paramName)
#if (!$field.modifierStatic)
this.##
#else
$classname.##
#end
#end
$field.name = p$paramName;
}

GIT: 比Eclipse的git插件使用起来方便很多,但是遇到个小问题就是有时Pull代码会不起作用,老是找不到有些branch,然后使用自身的那个update project却可以了。

Debugger:初次配置不是Eclipse的Application,而且搜索一个叫remote的选项,配置IP和端口即可,http://yiminghe.iteye.com/blog/1027707,使用过程也发现一个奇怪问题,在方法上打断点会特别慢,而且有时还不进断点。

总之,找不到特别的理由让人使用IDEA,一切还是看个人习惯。

读后感:驱动力

上周末闲来无事,一口气把驱动力(DRiVE)看完了,书中的观点其实不错,但是太啰嗦。

书中阐述了三种驱动力:

驱动力1.0,来自生存冲动。衣食住行,食色性也,人类本能。就大多数人而言,找第一份工作的时候往往基于第一驱动力。

驱动力2.0,来自外在驱动,激励,KPI 考评,胡萝卜加大棒,这也是绝大多数公司采取的驱动方式;绝大多数人可能终身在第二驱动力范畴内,找到一家合适的公司,一个还可以的工作,薪水不错,给点激励就努力一点,激励不够就磨一下洋工。

驱动力3.0,则为内在驱动,自发自主。而第三种驱动力又包括三大要素:自主、专精和目的。需要强调一下所说的「目的」:将自己正在从事的事情变换成乐趣,以兴趣最大化原则为导向而非利润最大化,把利润看做是取得成就后让人愉快的副产品。可能创业者或是有创业者心态的人都是用第三种驱动力做事情。用这种驱动力做事情的人,一定是一个最值得合作的人。

所谓的科学向左,企业向右指的就是科学虽然不断印证驱动力3.0的正确性,可绝大多数企业却始终采取驱动力2.0的方式激励员工,提高生产力。
从个人出发,想想自己更倾向于哪一种人,可以更明白自己的定位,提高自己的工作效率。

而书中从各种不同的角度举例印证驱动力3.0的正确性,两百多页完全没有必要。总的来说还是推荐快速阅读,了解大概即可,Daniel H. Pink的观点可以在其TED演讲上已经讲述:

附平克的TED演讲

官网视频:
http://www.ted.com/talks/dan_pink_on_motivation

网易公开课翻译后的视频:
http://v.163.com/movie/2011/7/U/D/M7CTOI99C_M7E3PUTUD.html

读后感:Soft Skills

一直想认真写我的博客,可是每次都不知从何说起。最近终于发现可以把读过的每一本书都分享出来,一方面帮助自己回忆书中的要点,同时也是分享给身边的人,让大家对每本书都个大致的了解。

这次要聊的是一本叫软技能的书,一本关于程序员的方方面面,唯独不讲代码的书,尽管这本书有着不少缺点,妄图面面俱到,结果却都浅尝即止,但它依旧是一本值得一读的好书。

说说优点吧,书里讲的道理其实谁都懂,但是在这个浮躁的社会,生活节奏越来越快,大家忙于工作很少有时间静下心来思考,思考生活的方方面面,本书其实就将一些很重要却又容易被人遗忘的道理有条理的整理出来。

职业发展

The driven force of a career must come form the individual.

职业生涯属于个人,很多人不明白自己想要什么,随波逐流,一个人在职业生涯明确自己的目标,知道自己想要什么尤其重要。

自我营销

At its core, marketing is just connecting a product or service with someone who wants or needs that product or service.

在程序员心中营销的名声其实并不好,这也是我现在不爱发朋友圈的原因,总觉得朋友圈的意义早已变成了一个炫耀的平台,而不是分享身边的美好。

同时切记陷入林黛玉困境,吴军博士前几天刚聊了对10000个小时的理解,随着程序员coding水平的上升,面也会越来越窄,到最后身边的人谁都瞧不起,生活在自己的世界里,哪怕自己再牛也无人知晓。本书也一直在讲述一个观点,读书,自我学习的最后一步永远是分享,成为人师,帮助他人也是帮助自己。

所以对于程序员,博客永远说是绝佳的营销手段。现在国内前端开发的大牛们,似乎个个都是老博主。

自我学习

身边的不少朋友总是认为大学毕业之后我们再也不用拾起书本,甚至对我会在空余时间看书嗤之以鼻。

我们走出学校,学习就变成了自己的事,没人会像老师一样督促你,引导你。网上有句话说,一个人的成就取决于下班之后的几个小时,这点其实我非常认同,而学会学习是teach yourself的核心技能。

生产效率

外行静坐等待灵感,其他人则唤起激情努力工作。 ?? 斯蒂芬 金

No more Procrastination, 做一个行动主义,工作之中学会专注,工作之外学会找寻各种工具来节省重复工作时间。

Find your time wasters.

戒掉电视,少刷微博吧,好好想一想,时间都去哪了。戒掉那些耗费大把时间而又毫无意义的日常行为。

FINANCIAL, FITNESS, SPIRIT

理财,健身和心态,好的身体,好的心态才能更好的工作,更好的生活,学会理财可以让我们更好的管理自己的财产,工资不是一个人所有的财产。

人的身体就就是人的灵魂的最好写照。

总之,书中的道理人人都懂,但是如何看待这些观点,如何执行就要看自己了。

IOC和AOP

Ioc简介

什么是Ioc

IOC(Ioc—Inversion of Control),即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

Ioc图解

传统程序时序图:

Ioc设计思路程序时序图:

Ioc能做什么

IOC(控制反转)的其实本质是一种工厂模式的实现。
它指导我们如何设计出松耦合、更优良的程序。传统应用程序都是在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于维护;而有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

AOP简介

什么是AOP

AOP是面向切面变成,其本质是代理模式的一种实现。其实就是划分出来了一个切面,然后在这个切面里面进行了一些增强,最后产生一个增加了新功能的代理对象,注意,是代理对象,这是Spring AOP实现的基础。这个对象只不过比原始对象(Bean)多了一些功能而已,比如Bean预处理,Bean后处理,异常处理等。

AOP能做什么

例如Spring的事务管理,或者我们之前实现过的LogManager

he