2013年8 月月 发布的文章

java竖线分割字符串的问题

例1:
String[] paraStr = “6010;320100;A”.split(“;”);
System.out.println(Arrays.toString(paraStr));
输出:[6010, 320100, A]
Ok
例2:
String[] paraStr = “6010|320100|A”.split(“|”);
System.out.println(Arrays.toString(paraStr));
输出:[, 6, 0, 1, 0, |, 3, 2, 0, 1, 0, 0, |, A]
NO,和期望值相差甚远
例3:
String[] paraStr = “6010+320100+A”.split(“+”);
System.out.println(Arrays.toString(paraStr));
输出:
Exception in thread “main” java.util.regex.PatternSyntaxException: Dangling meta character ‘+’ near index 0
+
异常!
有现象,才能总结出结论:
使用String.split方法时要注意的问题
在使用String.split方法分隔字符串时,分隔符如果用到一些特殊字符,可能会得不到我们预期的结果。
我们看jdk doc中说明
public String[] split(String regex)
Splits this string around matches of the given regular expression.
参数regex是一个 regular-expression的匹配模式而不是一个简单的String,他对一些特殊的字符可能会出现你预想不到的结果:
1.用竖线 | 分隔字符串,你将得不到预期的结果。
2.用 * 分隔字符串运行将抛出java.util.regex.PatternSyntaxException异常,用加号 + 也是如此。
显然,| + * 不是有效的模式匹配规则表达式,用”\*” “\+”转义后即可得到正确的字符串结果。
“|” 分隔串时虽然能够执行,但是却不是预期的目的,得到的是每个字符的分割,而不是字符串,”\|”转义后即可得到正确的字符串结果。
还有如果想在串中使用””字符,则也需要转义.首先要表达”ab”这个串就应该用”a\b”,如果要分隔就应该这样才能得到正确结果:
String[] aa = “aaa\bbb\bccc”.split(“\\“);
注意:除了使用“\|”外,也可以用”[.]” 进行分隔!
如:
String[] paraStr = “6010|320100|A”.split(“[|]”);
String[] paraStr = “6010.320100.A”.split(“[.]”);
http://www.cnblogs.com/haitao-fan/archive/2013/01/27/2878537.html

字符编码-ASCII

计算机中的信息包括数据信息和控制信息,数据信息又可分为数值和非数值信息。非数值信息和控制信息包括了字母、各种控制符号、图形符号等,它们都以二进制编码方式存入计算机并得以处理,这种对字母和符号进行编码的二进制代码称为字符代码(Character Code)。计算机中常用的字符编码有ASCII码(美国标准信息交换码)和EBCDIC码(扩展的BCD交换码)。
编码
在显示器上看见的文字、图片等信息在电脑里面其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片。假设,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1,凹的地方代表数字0。硬盘只能用0和1来表示所有文字、图片等信息。那么字母”A”在硬盘上是如何存储的呢?可能小张计算机存储字母”A”是1100001,而小王存储字母”A”是11000010,这样双方交换信息时就会误解。比如小张把1100001发送给小王,小王并不认为1100001是字母”A”,可能认为这是字母”X”,于是小王在用记事本访问存储在硬盘上的1100001时,在屏幕上显示的就是字母”X”。也就是说,小张和小王使用了不同的编码表。小张用的编码表是ASCII,ASCII编码表把26个字母都一一的对应到2进制1和0上;小王用的编码表可能是EBCDIC,只不过EBCDIC编码与ASCII编码中的字母和01的对应关系不同。一般地说,开放的操作系统(LINUX 、WINDOWS等)采用ASCII 编码,而大型主机系统(MVS 、OS/390等)采用EBCDIC 编码。在发送数据给对方前,需要事先告知对方自己所使用的编码,或者通过转码,使不同编码方案的两个系统可沟通自如。
ASCII
美国(国家)信息交换标准(代)码,一种使用7个或8个二进制位进行编码的方案,最多可以给256个字符(包括字母、数字、标点符号、控制字符及其他符号)分配(或指定)数值。
ASCII码于1961年提出,用于在不同计算机硬件和软件系统中实现数据传输标准化,在大多数的小型机和全部的个人计算机都使用此码。ASCII码划分为两个集合:128个字符的标准ASCII码和附加的128个字符的扩充和ASCII码。比较EBCDIC。其中95个字符可以显示。另外33个不可以显示。 标准ASCII码为7位,扩充为8位。
目前使用最广泛的西文字符集及其编码是 ASCII 字符集和 ASCII 码( ASCII 是 American Standard Code for Information Interchange 的缩写),它同时也被国际标准化组织( International Organization for Standardization, ISO )批准为国际标准。
基本的 ASCII 字符集共有 128 个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符。标准 ASCII 码使用 7 个二进位对字符进行编码,对应的 ISO 标准为 ISO646 标准。
字母和数字的 ASCII 码的记忆是非常简单的。我们只要记住了一个字母或数字的 ASCII 码(例如记住 A 为 65 , 0 的 ASCII 码为 48 ),知道相应的大小写字母之间差 32 ,就可以推算出其余字母、数字的 ASCII 码。
虽然标准 ASCII 码是 7 位编码,但由于计算机基本处理单位为字节( 1byte = 8bit ),所以一般仍以一个字节来存放一个 ASCII 字符。每一个字节中多余出来的一位(最高位)在计算机内部通常保持为 0 (在数据传输时可用作奇偶校验位)。
由于标准 ASCII 字符集字符数目有限,在实际应用中往往无法满足要求。为此,国际标准化组织又制定了 ISO2022 标准,它规定了在保持与 ISO646 兼容的前提下将 ASCII 字符集扩充为 8 位代码的统一方法。 ISO 陆续制定了一批适用于不同地区的扩充 ASCII 字符集,每种扩充 ASCII 字符集分别可以扩充 128 个字符,这些扩充字符的编码均为高位为 1 的 8 位代码(即十进制数 128~255 ),称为扩展 ASCII 码。
通过了解字符的存储编码,可以解决很多由编码不匹配引起的问题,比如网页乱码、邮件乱码,本文简单扼要地阐明了ASCII编码、EBCDIC编码、GB2312编码、Unicode编码、UTF-8编码、以及Base64编码。
MBCS
GB2312
GBK
Big5
Unicode
http://baike.baidu.com/view/1204863.htm

实现ssh无密码登录的实现方法

实现ssh无密码登录的实现方法:
步骤1: 用 ssh-key-gen 在本地主机上创建公钥和密钥
先在本机上创建一个文件夹执行命令:mkdir .ssh
接着生成公钥和密钥,执行命令:ssh-keygen -t rsa
Enter file in which to save the key (/home/jsmith/.ssh/id_rsa):[Enter key]
Enter passphrase (empty for no passphrase): [Press enter key]
Enter same passphrase again: [Pess enter key]
Your identification has been saved in /home/jsmith/.ssh/id_rsa.
Your public key has been saved in /home/jsmith/.ssh/id_rsa.pub.
The key fingerprint is: 33:b3:fe:af:95:95:18:11:31:d5:de:96:2f:f2:35:f9
ligh@local-host
步骤2: 用 ssh-copy-id 把公钥复制到远程主机上
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.3
ligh@remote-host‘s password:
Now try logging into the machine, with ―ssh ?remote-host‘‖, and check in:
.ssh/authorized_keys to make sure we haven‘t added extra keys that you weren‘t expecting.
[注: ssh-copy-id 把密钥追加到远程主机的 .ssh/authorized_keys 上.]
步骤3: 直接登录远程主机
ssh remote-host
Last login: Sun Nov 16 17:22:33 2008 from 192.168.1.2

数据分析相关概念的理解

所有的数据产品最后都可以抽象成:指标 +维度
维度,能够向上聚合(实际上就是SUM)
对于部分复合型指标,实际上就是由多个基础指标经过一些简单的数学运算得到
指标和维度是业务来定的,与技术无关
将这些指标和维度,按照分析的主题域梳理成指标维度矩阵

伪造COOKIE

按照浏览器的约定,只有来自同一域名的cookie才可以读写,而cookie只是浏览器的,对通讯协议无影响,所以要进行cookie欺骗可以有多种途径:
1、跳过浏览器,直接对通讯数据改写
2、修改浏览器,让浏览器从本地可以读写任意域名cookie
3、使用签名脚本,让浏览器从本地可以读写任意域名cookie(有安全问题)
4、欺骗浏览器,让浏览器获得假的域名
其中:
方法1、2需要较专业的编程知识,对普通用户不太合适。
方法3的实现有2种方法:
1、直接使用签名脚本,不需要签名验证,但是产生很严重的安全问题,因为大家都要上网的,如果这样做你的硬盘文件就……
2、对脚本进行签名后再使用签名脚本,但是需要专用的数字签名工具,对普通用户也不合适。
方法4看样子应该是最合适的了,域名欺骗很简单,也不需要什么工具(当然如果你的机器装有web服务器那更好了),下面我以the9为例,以这种方法为基础,阐述一下cookie欺骗的过程(下文中提到的任何服务端的bug,the9都已经做了改进,所以本文对the9无安全方面的影响):
注:我们讨论的cookie是那种不会在硬盘的cookie文件里留下踪迹的cookie,就是那种只在浏览器生存周期内(会话)产生的cookie,如果浏览器关闭(会话结束)那么这个cookie就被删了!

Java系统程序员修炼之道

从2002开始接触Java学会HelloWorld这么经典的程序到如今不知不觉已经十年啦,十年中亲耳听到过不少大牛的演讲,见到过项目中的神人在键盘上运指如飞的编程速度,当时就被震撼了。当编程越来越成体力活,我们还能有自己的思想,还能修炼为Java系统级别的程序员嘛?学习与修炼以下知识与技能,帮你早日达成愿望。
一:Java语言学习
线程(thread),串行化,反射,网络编程,JNI技术,容器(Map,List, Iterator), 类加载器(ClassLoader),输入输出流,垃圾回收机制, 有比较深入的了解,最起码做过项目应用。有过Java项目的性能优化经验,最起码掌握一种性能监视工具的使用,熟悉JVM参数,最起码知道可以在JVM启动时指定不同垃圾回收机制,以及不同垃圾回收机制之间的差别,熟悉JVM参数优化。
二:J2EE方面
最好知道JDBC规范是怎么回事情,面对Oracle数据库如果告诉你JDBC驱动不能用了,你还知道有OCI驱动可以。掌握常见的SQL语句,熟悉JMS, JNDI等组件,掌握一套web开发模式,从前台到后台,有能力整合好这样的框架。理解并掌握MVC思想,像SSH已经实现了MVC的分层,几乎不需要你自己再实现,假设你开发一个简单的Swing程序,你能MVC就说明你真的掌握了MVC的精髓。有能力在J2EE前端开发中构建自己的MVC模式,知道什么是WEB2.0,知道什么是SOA, SaaS, SaaP等含义
三:理解并能合理运用设计模式,UML建模
知道并理解设计模式中蕴含的几种基本原则如:里氏替换原则, 开闭原则,合成复用原则,依赖倒置原则有很好的理解,并能举例说明。对常用的设计模式如工厂模式,单例模式,观察者模式,责任链模式,桥接模式等知道灵活运用,明白什么是回调(Callback)。最后用一位高人话来总结设计模式,它是为了让软件更容易被别人读懂,更容易维护而产生,设计模式本质是程序员之间的交流,如果A用工厂模式设计一个模块B来接替,A只要说该模块是工厂模式实现,B维护起来应该容易得多,所以设计模式是关于交流,不关于代码。切忌滥用设计模式。学会使用UML建模工具至少熟悉一种URL建模工具。
四:注重用户体验,掌握KISS原则,知道欧卡姆剃刀原则
顾客就是上帝这个口号我们已经喊了N年了,程序员的劳动成果最终也需要转换为服务提供给客户,用户体验至关重要,常常看到的场景是功能实现了,软件很难使用,程序员有个很充足的理由我不是美工,其实注重用户体验跟美工八杆子也打不到一起,FoxMail的成功在很大程度是用户体验的成功,友好,清晰的用户提示,强的容错与纠错设计是获得好的用户体验的不二法门。傻瓜相机顾名思义傻子都会使用,这个就著名的KISS原则(Keep it simple and stupid)意思是UI设计要简单明了,傻子一看就知道怎么用,想想我们做出来的东西,对照说明书都不知道怎么用。另外一个就是最著名的例子IPhone手机外观设计,是典型的欧卡姆剃刀设计原则来完成人机交互。
五:自动测试与软件配置管理(SCM)实现
知道什么是软件配置管理,知道Hudson – http://java.net/projects/hudson/运用该工具SCM,知道怎么获取测试代码覆盖率, Java有效代码行数(NCSS),完成firebug, JDepend等工具集成ant/maven。熟悉并注重在开发过程中使用JUnit单元测试,理解白盒测试规范。
六:熟悉常见的网络通信协议
HTTP协议,知道POST, GET的区别是什么,阅读过HTTP相关的RFC文档。学会使用sniffer工具查看数据包,帮助查找与调试程序,知道TCP与UDP的区别,知道并理解E-Mail发送与接受的协议如SMTP, POP3,IMAP等协议,了解MIME与Base64编码。知道组播是怎么回事情。
七:面向市场,永远对新技术保持渴望
计算机技术的发展日新月异,做为IT行业的软件开发人员要不断的给自己充电,更新自己的技术与时代保持同步,同时还要面向市场,华为总裁任正非说过-“华为的技术革新必须面向市场”,作为程序员同样要有市场意识,很多人都后悔没有在android刚出来的时候加以关注学习。那些很早关注android开发技术的很多程序员因此获得丰厚回报。如今HTML5得到越来越多的浏览器厂家支持,你是否已经跟上脚步,开始学习。
八:保持谦虚,三人行必有我师
乔帮主说他要保持初心,努力学习,我等更应该保持谦虚,IT技术发展日新月异,在你眼中不可能实现的技术,也许别人早已经有思路。保持谦虚就有机会吸取别人身上的长处,古人有云:满招损,谦受益。一个得道的高人更是说出了”下下人,上上智”的禅语。永远不要拒绝帮助你周围的人解决难题,解决难题是进步最快途径。不要放弃任何一次可以提升自己技术与能力的机会。
九:养成总结的习惯,不断反思
上学的时候老师常让写小结,也没总结出来所以然,以至于工作以后再也不提这档子事情,建议每个项目做完以后对自己都有个小结,总结自己在项目里面学到了什么,反问自己能不能完成在不需要别人帮助的情况下自己完成这样的系统搭建,是否熟悉与掌握项目中所用到的技术,即使有些东西不是你负责完成的但是什么也不能阻挡一颗求知的心,总结要尽量详细记录你遇到那些难题是怎么一个一个的解决的,下次再遇到你是否可以很快解决或者避免这样的问题。有总结才有提高,孔子曰:学而不思则罔,如果我们只是coding到吐血,不思考,不总结提高,永远不可能有能有本质提高,秦相李斯有云:“泰山不让土壤,故能成其大,河海不择细流,故能就其深”,点滴积累不断总结方能量变导致质变。
十:数学功底与算法知识
用任何编程语言开发应用,都离不开核心算法支持,很多国外的软件单单从UI上看,恐怕写几年程序的人都可以模仿,但是UI之下的那些真实深浅不一,相信不是你想模仿就可以模仿的,为什么我们越来越山寨,因为我们没有核心竞争力,对于程序员来说算法与数学显然是他最重要的核心竞争力之一。《算法导论》,《编程珠玑》等书绝对值得读十遍。微软亚洲研究院视觉计算组负责人在一次演讲中说到他们招人的标准是“三好学生– 数学好,编程好,态度好”。可是现实的普遍情况却是 – 微机原理闹危机,汇编语言不会变,实变函数学十遍。计算机基础知识被大家普遍忽视。从今天开始好好学习吧……
十一:Java代码反编译与代码保护
Java编译产生字节码,因而可以被轻松的逆向工程(反编译),微软的C#生产的DLL也一样可以被轻松反编译。正式由于这个原因产生了许多Java开源的代码保护工具,而Proguard是其中佼佼者,已经被google集成在android之中用于Java代码保护,访问这里了解更多:http://proguard.sourceforge.net/
十二:努力成为某个行业或者领域骨干
面对漫长的职业生涯,要想不被淘汰,必须具备一招鲜吃遍天下的能力,选择自己感兴趣的方向,努力而深入的研究,计算机技术发展到今天已经细分很细,努力研究一种Java开源框架或者开源HTTP服务器源码或者研究过网络爬虫源码或者WEBKIT内核,不愁没有人要你。如果你是非常了解金融,企业ERP,证券,保险,移动应用行业的应用开发业务的人,一样不用愁工作。这些知识不随语言而改变,努力做一个有核心竞争力的Java程序员。
十三:提高语言与书面表达能力,掌握基础的项目管理知识
文档与语言表达能力是最好的向外界展现自己能力的方式,很多程序员编程能力很高,表达能力一般,Linux能够成功,除了归功于网络社区的力量之外,也得益于Linux作者本人给各大基金会写信,宣传推广,试想如果没有良好的书面语言表达能力,即使Linux系统再优秀,却无法被准确表达,失去各大基金会的支持,Linux还会像今天这么好的局面嘛。所以重视文档,重视提升沟通与表达能力,才有可能成为Java系统程序员。掌握基本的2/8原则,学会将模块细化分配给不同的人,预见并控制项目风险,把握项目进度,优化流程,合理的时间管理,了解TDD,熟悉敏捷开发模式,常规软件开发模式。
十四:掌握英语,良好的读写能力
英语是计算机的母语,掌握好英语对于阅读英文资料学习新技术大有帮助,我的建议是尽量读英文原版书,如果是算法方面的可能会困难一点,但是其它像设计模式,软件工程,OO编程思想等尽量读原版,提高自己的英文水平,多多访问开发者,code project,程序员天堂,Pc-magazine等英文IT网站。英语绝对是你必须修炼与提高的技能。此外英语好在外资企业尤其重要,只有外语足够好才可能在外资企业中突破职业瓶颈,向上发展。
转自:http://bbs.csdn.net/topics/390103026

俞敏洪致青春

“青春跟年龄没有任何关系,一个90岁的老头,依然拥有青春。”对于青春,俞敏洪总是有说不完的话。在他眼中,青春就是犯傻的同义词,就是爱情无悔,爱情纯粹,是无怨无悔、不计得失地交往生命中最好的朋友和同学。
俞敏洪指出,青春其实跟三个“想”有关,叫做理想、梦想和思想。如果我们能够坚持自己的理想,追逐自己的梦想,并且探索自己独立的思想,我们的青春就开始成熟了。青春最大的标志是坚决不承认失败,历经挫折,初心不改。
俞敏洪:
同学们,大家好!今天给我的题目是《致青春》,青春是年轻的同义词,你们就是青春的化身。青春时期我们想什么?我想大家可能和我年轻的时候一样,男生想美女,女生想俊男,当然也有俊男想俊男,美女想美女的,但那是例外。反正我年轻时候想的就是欧阳夏丹这样的美女,现在我也想美女,这反过来说明我还年轻,至少心理上年轻。我在年轻的时候,到底做过什么样的事情?想来想去,我发现,青春是犯傻的同义词,我们很难把老于世故、老奸巨滑这样的词语跟青春连在一起,也很难把正确和青春划等号。也许,青春最大的奢侈就是可以犯傻可以犯错误。犯傻,被人欺负,对于青春是不可避免的事情。
就像在大学的时候,我们班一起上山唱歌通宵不归,两个男生为了一个女生围着校园一路厮打,为了写出一首好诗咬断一堆铅笔,全班同学跳贴面舞会被学校点名批评,都是我们青春的记忆。我在大学帮一个女生扛包,上火车我给她扛包,下火车给她扛包,后来发现这个女生跟另外一个男生在散步。我就问这个男生是谁,她说是我男朋友。我就说有男朋友为什么还让我给你扛包?她说,我要让男朋友休息一下。我们班的另一个男生为了表达自己的爱情在女生宿舍前拉小提琴,结果被泼了一盆洗脚水。这些犯傻,也许就是青春的代名词。
青春没有后悔。如果我们计算好了,能从一个人身上得到什么,再去做自己该做的事情,我们就已经变成了一个计算型的人物,而计算型的人物等同于老奸巨滑,和青春无关。
青春的第二特征就是爱情无悔,爱情纯粹。现在很多同学是没有爱情的青春的。很多女生在找男朋友的时候,先计算这个男生是什么家庭出身,到底有多少钱,家庭地位如何。这样计算的女生,跟巫婆差不多,基本上很难说跟青春有关。青春是一种脱离世俗的真爱,当男生看上女生,或者女生看上男生,不管她是灰姑娘,还是红姑娘,不管他是富二代,还是穷二代,你都全身心去爱,不顾一切去爱,而他/她的背景,只是一缕云淡风轻,这就是青春的爱情。
其实,在座的同学想一想,如果你先计算,然后按照计算的标准去寻找爱情,常常会是一场错误。《红楼梦》里说,机关算尽太聪明,反误了卿卿性命,我觉得恰恰是对计算爱情和计算人生的批判。像我这样的人,在大学的时候如果用计算的眼光看,是没有女生会看上我的。我在大学的时候,家里一穷二白,穿着打补丁的衣服,知识一片空白,文艺活动、体育活动一无所长,而且我长得还非常的土,马云尽管长得难看,但是长得比我还洋气一点。
青春的第三个特征,是无怨无悔、不计得失地交往生命中最好的朋友和同学。大家可能看过《中国合伙人》这部电影,是以新东方为背景拍的,那个电影中的角色之一成冬青是以我为背景拍的。其实,我对这部电影没有感觉,我谈不出来喜欢不喜欢这部电影,因为审美需要一定的距离。但我对这部电影惟一觉得有魅力的地方,就是三个哥们,从大学开始,一起变成朋友,最后一起创业,最后不断为了公司发展,打打闹闹,一起共同努力,让公司成功上市。在现实中,这个故事一直延续到今天,因为里面的另外两个人物就是新东方的徐小平和王强,他们都是我在大学时代交往到的最好的朋友。到今天为止,我们依然在一起共同事业,所以我们的青春一直延续到今天。
在大学的时候,如果说你跟宿舍同学打了架,就一辈子不再理睬,这是失去青春的标志。因为青春就是,不管为了什么打架,为了利益打架,为了女朋友打架,为了分数打架,为了虚荣打架,但打完架后,哥们还能在一起抱头痛哭,那才是真正的青春。在大学的时候,我跟宿舍同学,无数次喝醉了酒,为了自己的成绩落后,为了自己生命的卑微,为了自己被看不起而抱头痛哭,互相鼓励着一直到能够坚强地抬起自己的头颅。所以,在我的生命中,到今天依然拥有青春时代的朋友。
青春其实跟三个“想”有关,叫做理想、梦想和思想。如果我们能够坚持自己的理想,追逐自己的梦想,并且探索自己独立的思想,我们的青春就开始成熟了。当我们坚持自己理想,你就会有永不放弃的精神。这一点,我在小时候就学会了,所以我在16岁开始高考,第一年失败,第二年失败,坚持考了第三年。我的理想中,并没有北京大学,但是我最后进了北京大学,因为我坚持了自己必须上大学的理想,知道在农村没有广阔天地,也不可能大有作为。但是,人世沧桑,我们很容易放弃自己的理想和梦想。梦想常常跟青春有关,因为青春是一个多梦的时节。但当岁月流逝,我们常常会屈服于现实放弃梦想,当我们放弃梦想,也就意味着精神生命的结束。
下面在座的柳传志先生等会儿也会上来讲话,他算是我的老大哥,我们还一起在优酷做过《老友记》节目。大家都知道,他年龄比我们大一些,当他追逐自己梦想的时候,已经是40岁的年龄。大多数40岁的人,都已经习惯于习惯的生活,抛弃一切去追逐梦想是不容易的,尤其在80年代那种国家体制非常顽固,个人梦想极其压抑的情况之下。但是正是因为这样的勇气,主动丢掉铁饭碗,最后柳传志创造了伟大的联想,创造了联想电脑走向世界的奇迹。人年轻的时候很容易有梦想,但是当青春消失,你还能坚持梦想,你才能把自己叫做伟大,你才能把自己叫做生命的榜样,青春的榜样。
当然,光有梦想和理想是没有用的,因为很多人都有理想和梦想,但是他们的理想和梦想是贪污更多的钱,占国家更多的便宜,通过权钱交易获得更多的财富。所以,人必须同时有思想,有良好的价值体系。在大学的时候,如果我们没有为普希金、拜伦的诗歌所感动,我们没有因为康德、黑格尔的理论争得面红耳赤,我们没有苦苦追寻尼采、亚里士多德和柏拉图的脚步,没有去分辨这些伟大的思想家和马克思、恩格斯的区别在哪里,没有通过阅读去体会西方社会制度跟中国的社会制度到底差别在什么地方……如果我们从来没有独立思考过,你就不能叫自己大学生,因此你也就不是一个真正拥有青春的人。因为青春最伟大的标志,是思想的困惑和在困惑中苦苦地寻求,寻求真理,寻求人类进步之道,寻求心灵的自由。
青春最大的标志是坚决不承认失败,历经挫折,初心不改。青春的心是永远拥有一颗美丽的心,一颗希望的心,从绝望中寻找希望的心,拥有一颗勇敢的心。面对任何挫折、失败和打击,你都还能够站起来,挺立生命向天空呐喊,依然感到世界充满美丽,依然能用快乐之心来面对苦难。当你遇到绝望,被人侮辱欺骗,你依然相信,世界大多数人都是好的,这个世界永远会有机会。被踩到泥土里,你依然能像种子一样,破土而出,让生命成长。面对失败的考验,是每一个人都将经历的,等会儿上来的企业家,每个人都至少失败3到5次。在我的生命中,失败比成功多得太多了。我的成功只有一个,就是创办了一个小小的新东方,而我的失败有无数个。从高考三次失败,得肺结核在医院住了一年,到最后被北大处分,每一次都是失败。但是所有这些失败,都是我走向成功的垫脚石。
同时,请同学们真的相信,青春跟年龄没有任何关系,有的人在16岁、20岁的时候,青春已经死亡,他对生命已经没有任何期待,也不再具有奋斗精神。有的人到了80岁以后,依然具有青春的色彩,在思考未来的生命到底应该怎么过。大家稍微想一下,杨振宁教授到了82岁还结婚,那是一种什么样的青春洋溢,那是一种什么样的生命期待。三个月前,我跟杨振宁教授在一起吃饭,他依然在设想,未来的20年,到底应该为社会做些什么,为教育做些什么。他正在设想成立一个杨振宁基金,为中国学生到美国读书提供资金上的帮助。生命不息,战斗不止,这才叫做青春。所以,一个90岁的老头,依然拥有青春。等会儿你看到一个70岁的老头柳传志,也依然饱满青春的热情,但是你们在座的学生,我相信,已经有人把青春消灭掉了。
青春就是拥有热情,相信未来。中国诗人食指所写的一首诗,就叫做《相信未来》,我把最后一段背给大家听一下:
朋友,坚定地相信未来吧,
相信不屈不挠的努力,
相信战胜死亡的年轻,
相信未来,热爱生命!
谢谢大家。

对技术的态度

最近人品爆发,图灵社区,InfoQ,51CTO相继对我做了采访,前两天我把InfoQ对我的采访张贴了出来,今天,图灵社区和51CTO对我的采访发布了(图灵的访谈 ,51CTO的访谈),我是一个有技术焦虑症的人,我的经历比较特殊,对大家来说可能也没有什么意思,这两个采都有一些重叠的部分,不过有些观点我想再加强一些,并放在这里和大家一起分享一下。

对于日新月异的新技术,你是什么态度?

遇到新技术我会去了解,但不会把很大的精力放在这些技术(如:NoSQL,Node.js,等)。这些技术尚不成熟,只需要跟得住就可以了。技术十年以上可能是一个门槛。有人说技术更新换代很快,我一点儿都不觉得是这样想。虽然有不成熟的技术不断地涌出,但是成熟的技术,比如Unix,40多年,C,40多年,C++,30多年,TCP/IP,20多年,Java也有将近20年了……,所以,如果你着眼成熟的技术,其实并不多。
我的观点是——要了解技术就一定需要了解整个计算机的技术历史发展和进化路线。(这个观点,我在《程序员练级攻略》和《C++的坑多吗?》中提到过多次了。)因为,你要朝着球运动的轨迹去,而不是朝着球的位置去,要知道球的运动轨迹,你就需要知道它历史上是怎么跑的
如果要捋一个技术的脉络,70年代Unix的出现,是软件发展方面的一个里程碑,那个时期的C语言,也是语言方面的里程碑。(当时)所有的项目都在Unix/C上,全世界人都在用这两样东西写软件。Linux跟随的是Unix, Windows下的开发也是 C/C++。这时候出现的C++很自然就被大家接受了,企业级的系统很自然就会迁移到这上面,C++虽然接过了C的接力棒,但是它的问题是它没有一个企业方面的架构,而且太随意了,否则也不会有今天的Java。C++和C非常接近,它只不过是C的一个扩展,长年没有一个企业架构的框架。而Java在被发明后,被IBM把企业架构这部分的需求接了过来,J2EE的出现让C/C++捉襟见肘了,在语言进化上,还有Python/Ruby,后面还有了.NET,但可惜的是这只局限在Windows平台上。这些就是企业级软件方面语言层面就是C -> C++ -> Java这条主干,操作系统是Unix -> Linux/Windows这条主干,软件开发中需要了解的网络知识就是Ethernet -> IP -> TCP/UDP 这条主干。另外一条脉络就是互联网方面的(HTML/CSS/JS/LAMP…)。我是一个有技术忧虑症的人,这几条软件开发的主线一定不能放弃。
另外,从架构上来说,我们可以看到,

  • 从单机的年代,到C/S架构(界面,业务逻辑,数据SQL都在Client上,只有数据库服库在S上)
  • 再到B/S结构(用浏览器来充当Client,但是传统的ASP/PHP/JSP/Perl/CGI这样的编程也都把界面,业务逻辑,和SQL都放在一起),但是B/S已经把这些东西放到了Web Server上,
  • 再到后来的中间件,把业务逻辑再抽出一层,放到一个叫App Server上,经典的三层结构。
  • 然后再到分布式结构,业务层分布式,数据层分布式。
  • 再到今天的云架构——全部移到服务器。
我们可以看到技术的变迁都一直再把东西往后端移,前端只剩一个浏览器或是一个手机。通过这个你可以看到整个技术发展的趋势。所以,如果你了解了这些变迁,了解了这些变迁过程“不断填坑”的过程,你将会对技术有很强的把握。

另外,我听到有很多人说,一些技术不适用,一些技术太学院派,但对我来说,无论是应用还是学术,我都会看,知识不愁多。何必搞应用的和搞学术的分开阵营,都是知识,学就好了。
技术的发展要根植于历史,而不是未来。不要和我描述这个技术的未来会多么美好(InfoQ 的 ArchSummit大会上有一个微软来的人把Node.js说得跟仙女一样,然后给了一个Hello World),我承认你用一些新的技术可以实现很多花哨的东西。但是,我认为技术都是承前的,只有承前的才会常青。所以说“某某(技术)要火”这样的话是没有意义的,等它火了、应用多了,规模大了,再说。有些人说:“不学C/C++也是没有问题的”,我对此的回应是:如果连技术主干都可以不学的话,还有什么其他的好学呢?这些是计算机发展的根、脉络、祖师爷,这样的东西怎么可以不学呢?
另外,我们要去了解整个计算机文化,我觉得计算机文化源起于Unix/C这条线上(注意,我说的是文化不是技术)。我也写过很多与Unix文化相关的文章,大家可以看看我写的“Unix传奇尤其是下篇)”。

可是在应用环境中,对新技术的需求是很高的,你觉得在教育领域计算机科学的侧重应该是什么样的?

学校教的大部分都是知识密集型的技术,但是社会上的企业大部分都是劳动密集型的。什么是劳动密集型的企业呢?麦当劳炸薯条就是劳动密集型的工作,用不到学校教授的那些知识。如果有一天你不炸薯条了,而要去做更大更专业的东西,学校里的知识就会派上用场。有人说一个语言、一个技术,能解决问题能用就行了,我不这样认为。我觉得你应该至少要知道这些演变和进化的过程。而如果你要解决一些业务和技术难题,就需要抓住某种技术很深入地学习,当成艺术一样来学习。
我在“软件开发‘三重门’”里说过,第一重门是业务功能,在这重门里,的确是会编程就可以了;第二重门是业务性能,在这一重门里,技术的基础就很管用了,比如:操作系统的文件管理,进程调度,内存管理,网络的七层模型,TCP/UCPUDP的协议,语言用法、编译和类库的实现,数据结构,算法等等就非常关键了;第三重门是业务智能,在这一重门里,你会发现很多东西都很学院派了,比如,搜索算法,推荐算法,预测,统计,机器学习,图像识别,分布式架构和算法,等等,你需要读很多计算机学院派的论文。
总之,这主要看你职业生涯的背景了,如果你整天被当作劳动力来使用,你用到的技术就比较浅,比较实用,但是如果你做一些知识密集型的工作,你就需要用心来搞搞研究,就会发现你需要理论上的知识。比如说,我之前做过的跨国库存调配,需要知道最短路径的算法,而我现在在亚马逊做的库存预测系统,数据挖掘的那些东西都需要很强的数学建模、算法、数据挖掘的功底。
我觉得真正的高手都来自知识密集型的学院派。他们更强的是,可以把那些理论的基础知识应用到现在的业务上来。但很可惜,我们国内今天的教育并没有很好地把那些学院派的理论知识和现实的业务问题很好地接合起来。比如说一些哈希表或二叉树的数据结构,如果我们的学校在讲述这些知识的时候能够接合实际的业务问题,效果会非常不错,如:设计一个IP地址和地理位置的查询系统,设计一个分布式的NoSQL的数据库,或是设计一个地理位置的检索应用等等。在学习操作系统的时候,如果老师可以带学生做一个手机或嵌入式操作系统,或是研究一下Unix System V或是Linux的源码的话,会更有意思。在学习网络知识的时候,能带学生重点学一下以太网和TCP/IP的特性,并调优,如果能做一个网络上的pub/sub的消息系统或是做一个像Nginx一样的web server,那会更好。如果在学图形学的过程中能带领学生实践一个作图工具或是一个游戏引擎,那会更有意思。
总之,我们的教育和现实脱节太严重了,教的东西无论是在技术还是在实践上都严重落后和脱节,没有通过实际的业务或技术问题来教学生那些理论知识,这是一个失败。

那么,现在做一个软件开发者是否更加困难了?

我觉得倒不是。做一个软件开发者更简单了。因为现在互联网很发达,你可以找到很多共享的知识——相对于我那个时候。第一,知识你容易查到,然后社区很多,文章、分享的人也越来越多。我们那个时候没有的。上网一查,什么都没有。都得去自己琢磨,自己去调查。所以我觉得相比我们那个时候更容易了。第二,工具变多了。现在的工具比那个时候好用多了。我们那个时候就是一天到晚在vi里面,连个自动提示都没有,连个版本库管理都没有。不光工具变多,框架也多了,各种各样的编程框架。我们那时候都是生写。写JavaScript,生写,连个jQuery都没有。没有这些辅助性的、让你提高生产力的东西。J2EE那时候也没有。而且整个(开发环境)都很不成熟。一个服务器的最高配置就1GB的情况下,一个WebSphere起来就占了900多MB——这还能跑什么应用?所以只能去用最基础的系统。所以我觉得现在,无论是环境,还是开发的过程,都更规范了。以前我做开发的时候就是,什么都不懂就上了,瞎搞,没有什么开发规范,没有人理你,反正你搞得好就搞好,搞不好就搞不好了,全靠自己,包括做测试维护等等。我觉得现在的软件开发就很好,你一上去,就有好的工具,有好的知识库,有好的社区,有好的开发框架,还有好的流程,方法,甚至还有人帮你做测试,还有人告诉你应该怎么做。幸福得很。现在好多人还说这个不好那个不好,开发难什么的。其实容易多了。
但是,有个东西我觉得是现在的软件开发者比我们那时候变得更难的。就是,你享福了以后,人就变懒,变娇气了。对很多东西的抱怨就开始多了。我们那个时候哪有什么好抱怨的?没啥好抱怨的,有活就干,有东西学就赶快学。现在呢,学个什么东西还挑挑拣拣的,抱怨这个语言太扯,那个IDE不好,这个框架太差,版本管理工具太扯,等等。这就好像以前我没东西吃,只有个糠吃,要是有面包有馒头,我就觉得非常非常好了。现在是,好吃的东西多了我们还学会挑食了,这也不好用,那也不好用
根本就不是技术变难了,环境变差了,是程序员变娇气了。所以软件开发变难,归根结底还是程序员们自己变娇气了。

你如何在进度压力下,享受技术带来的快乐?

中国人中庸的思想,入世和出世,每天的工作就是入世。举个例子,我十年前在上海的时候,给交通银行做项目的时候,每周休息一天,早九点到晚十点,每天工作12个小时,这样的工作持续了一整年,没有节假日,项目上的技术也没什么意思。当时我晚上十点回到住处,还想学一些C++/Java和Unix/Windows的技术,于是就看书到晚上11:30,每天如此,一年下来学到很多东西,时间没有荒废,心里就很开心。我觉得当时是快乐的,因为有成长的感觉是快乐的。
现在的我,工作、写博客、养孩子,事情其实更多。我早上7:30起床,会浏览一下国外的新闻,hacker news, tech church, reddit, highavailability之类的站点,9点上班。晚上6、7点钟下班,开始带孩子。十点钟孩子睡了觉,我会开始重新细读一下这一天都发生了些什么事情。这个时间也有可能会用来看书。学习的过程(我)是不喜欢被打断的,所以从十点到十二点,家人都睡了,这正是我连续学习的好时间。可能从晚上11:30开始,我会做点笔记或者写博客。我现在对酷壳文章的质量要求比较高一些,所以大概积累一个星期的时间才可以生成一篇文章。每天我大概都在一两点钟才会睡觉。没办法,我有技术焦虑症。但是觉得这样的生活很充实,也很踏实。
另外,任何一门技术玩深了,都是很有意思的。有些人形成了一个价值取向,“我只做什么,绝不做什么”。前段时间有一个刚来亚马逊的工程师,他原来做的是数据挖掘推荐系统,原来的公司重组要让他做前端,他不肯就离职了,他说他不想做前端。我觉得,前端后端都是编程,Javascript是编程,C++也是编程。编程不在于你用什么语言去coding,而是你组织程序、设计软件的能力,只要你上升到脑力劳动上来,用什么都一样,技术无贵贱。你可以不喜欢那个技术,但是还是要了解了解,也没有必要完全不用,完全抛弃。Javascript啊——只要能被Javascript实现的,未来总有一天会被Javascript所取代。
回到问题,怎么才能享受到快乐呢?

  • 第一,入世和出世要分开,不要让世俗的东西打扰到你的内心世界,你的情绪不应该为别人所控,也不应该被世俗所污染,活得真实,活得真实你才会快乐。
  • 第二,就是要有热情,有了热情,你的心情就会很好,加班都可以是快乐的,想一想我们整个通宵用来打游戏的时光,虽然很累,但是你也很开心,这都是因为有了热情的缘故。

总之一句话——如果你没有兴趣,什么都是借口,如果你有兴趣了,什么都是好玩的
转载本站文章请注明作者和出处 酷壳 – CoolShell.cn  http://coolshell.cn/articles/8088.html

敏捷团队的角色定义

敏捷团队的角色定义作用:描述敏捷团队Team中涉及的各类角色,每个角色的工作内容。Team中的全体成员遇到问题之后可以找对应角色的人员来协助解决障碍。
PO
1、产品负责人,负责产品整体规划,设定阶段目标,明确产品演进思路和版本发布规划,对外的统一负责人
2、负责明确产品需求、编写故事和设置优先级,输出Product Backlog 。
3、规划工作至少提前研发团队一个月;需求细化至少提前一个Sprint。
4、负责组织需求评审
5、负责解答Team中所有人员关于需求的疑问
6、负责验收研发团队交付的系统,对系统出厂的质量负责
项目负责人
1、跟进项目进度,并对外汇报项目进展
2、依据敏捷Team的各类输出,翻译成周报的格式提交给管理层
3、协调资源
Agile Coach
敏捷教练,协助SM进行敏捷实践和过程改进,推动Team完成持续改进
SM
1、Scrum Master,负责指导Team成员开展工作,确保各项工作的高效开展
2、优化工作流程和机制,确保各个角色之间顺畅、高效的协同工作
3、解决团队开发中遇到的障碍
4、作为研发团队与外部的接口,为团队排除障碍,屏蔽外界干扰
5、保证开发过程按计划进行,组织 Daily Scrum, Sprint Review and Sprint Planning meetings
需求分析师
1、在PO输出的Product Backlog基础上,与PO沟通,将对应的故事细化成软件需求
2、解答研发团队开发过程中的需求疑问
技术负责人
负责整个系统的架构设计工作,对系统的技术架构和技术选型负责
子系统负责人
1、作为子系统的整体负责人
2、基于运营中心整体架构的基础上,完成子系统的架构设计和关键技术选型工作,对子系统的技术架构和技术选型负责
3、为子系统研发团队排除技术障碍,解决技术难点
4、指导子系统研发团队的开发工作
过程改进
1、协助SM开展过程改进工作,具体如下:
《1》关注研发过程中涉及的各类环境,确保各类环境正常稳定运行
《2》协助大家完成TDD的工作
《3》关注CI运行情况,提醒团队解决CI中的问题
《4》优化CI的执行过程
《5》定期Review大家的工作,如:Wiki、代码
2、发现团队中大家技能的短板,与SM一起提升大家的技能水平
开发工程师
1、依据Sprint Backlog,选取对应的任务,完成详细设计、代码编写(含测试代码)、修复BUG
2、承担项目中部分技术难点的攻关
WEB前端工程师
1、依据UI的设计方案,实现方案中的交互效果
2、将静态页面转换成动态页面,并完成与后端逻辑代码的集成
3、在技术负责人或者子系统负责人的指导下,完成WEB前端技术难点的攻关和结构的优化
UI
与PO沟通,基于需求完成线框制作、人机交互设计、效果图设计
UE
1、依据UI的设计方案,完成静态页面的实现
2、负责静态页面的浏览器兼容性测试
3、协助WEB前端工程师完成交互效果的实现
测试工程师
1、Review需求分析师输出的需求,从测试的角度判断是否具备可测试性
2、编写测试用例
3、负责运营中心各子系统的测试工作(功能、性能、稳定等),对系统出厂的质量负责
4、跟进BUG的修复进展
5、定期分析BUG,输出测试报告,作为团队改进的数据输入
版本管理
1、负责SVN的管理,如:账号、权限、branche和tag的创建
2、明确版本号及输出版本的发布说明