2012-05-28 12:24:29
大会第一天是keynote的形式,邀请了多位主讲人主要就目前最为Hot的“云”(云计算)和“端”(终端软件开发)技术进行了各自的阐述。“云”自然是各家说各家的,私有云、公有云、数据中心…...也端的是众说纷“云”。相对而言终端方面的议题倒是重点突出,就是IPhone和Android,纵观整个三天的会议中,二者相关的session数量也是平分秋色,本届大会终端方面就只是二者的对台戏。遗憾的是..
大会第一天是keynote的形式,邀请了多位主讲人主要就目前最为Hot的“云”(云计算)和“端”(终端软件开发)技术进行了各自的阐述。“云”自然是各家说各家的,私有云、公有云、数据中心…...也端的是众说纷“云”。相对而言终端方面的议题倒是重点突出,就是IPhone和Android,纵观整个三天的会议中,二者相关的session数量也是平分秋色,本届大会终端方面就只是二者的对台戏。遗憾的是每位主讲人只有20分钟左右的时间,即使主讲人再如何了得也只能提纲挈领,点到为止,既无法讲透也无法展开。所以虽然Schedule List上密密麻麻,产品、工具、愿景讲得轰轰烈烈,但这种走马观花还是感觉广告的成分多一些。这时候想起以前参加学术会议时的KeyNote基本是一个每天上午都会有一个主讲人进行2-2.5小时的独角戏,深入、完整、透彻,做的什么明明白白,真正让与会者知道这个演讲是“Key”。不过目前的情况可能也和大会性质有关,总体感觉第一天的KeyNote组织得更像厂商论坛。比较明显的就是微软和阿里巴巴的云计算分享,微软的谢总自然是底气十足,拿出了新发布的Windows Azure计算平台,似有大包大揽之势:想要Server吗?就用Windows Azure吧。想用数据库?SQL Azure恭候着您。开发应用?.NET Service Platform给您提供了运行程序所需的一切必要环境。将这些东西整合起来自然要用咱的Visual Studio 20XX,开发、测试、部署都有了。最重要的一点是,虽然我们今天说的是“云”,但是我们更注重“端”,Win Mobile 6.5 可以让部署在云上的计算资源可以同时服务于PC、TV和Phone上,“一次编写,到处服务”(我总结的…...)。阿里的王坚同样是说云,但是和谢总的切入点完全不同,如果说谢总主要精力放在产品推介上,那么这位老兄更像是在描绘一个以数据为中心的美好未来。其观点是随着Internet的发展和普及,网络已经成为人们生活工作必不可少的基础设施,而数据中心(Data Center)从抽象层面看已经成为了一个巨型计算机,在此基础之上“计算”就成了一种公共服务(Utility)。在这种趋势的影响下,传统的以功能为导向的软件开发模式已经过时,应用的发布周期越来越短(影射微软的开发模式?),如今的趋势是数据驱动的开发模型,强调了存储技术发展的重要性。整个分享没拿出具体数据,也没有成果展示,所以更像是一个愿景和展望。此外在最后一天,我还参加了一个Amazon的工程师主持的有关云计算的WorkShop,不过这位印度老兄似乎更想教给我们如何使用Amazon的产品以及告诉我们他们的产品有多棒。总体而言,虽然云计算是本届大会的主题之一,而且相关内容不少,但是比较缺更翔实的内容,实用性也不是很高,所以没有成为我的主要关注点。
由于后面的Session是同一时间多个主题同时进行,没有分身术的我只能秉持“从心选择”的原则来进行取舍。不过这个选择并不困难,《Java夜未眠》的作者蔡学镛、《深入Java虚拟机》的作者Bill Venners,《软件调试》的作者张银奎,大话西游的主力开发者云风,牛人的Session自然值得一听。看人下菜碟的选择虽然初看起来有些幼稚,不过在经历的几个标题党的Session之后还是感觉这种选法最明智。值得一提的是,本届大会淘宝的工程师全面出击,作为多个Session的主讲人,很有一种全面出击、多点开花的意思。相反微软、百度、google等大公司都比较低调,与会人员只是当听众(可能顺带猎头:))。
2012-05-28 12:24:59
张银奎
简介上写的是“资深 Windows 系统内核和调试技术专家,英特尔亚太研发中心高级工程师,国内第一部软件调试技术专著,畅销书《软件调试》的作者”,有鉴于 Session 的主讲人的来头都不小,所以这个简介大概并不能提高先前不认识他、或没看过他写的书的人对于其 Session 的期望值。不过在听过他的 Session 之后,回味之余不能不竖起大拇指称赞“真高人也”。值得一提的是,在后半段...
张银奎
简介上写的是“资深 Windows 系统内核和调试技术专家,英特尔亚太研发中心高级工程师,国内第一部软件调试技术专著,畅销书《软件调试》的作者”,有鉴于 Session 的主讲人的来头都不小,所以这个简介大概并不能提高先前不认识他、或没看过他写的书的人对于其 Session 的期望值。不过在听过他的 Session 之后,回味之余不能不竖起大拇指称赞“真高人也”。值得一提的是,在后半段实例演示的时候,讲到精彩之处,全场自发为之鼓掌,这是其他所有 Session 主讲人都不曾有过的待遇,足见其所讲内容之精彩。只是可惜其讲述内容大多以实际演示为主,且涉及很多 Windows 相关内容,我记录速度跟不上他的演示过程,只能尽力回忆希望能大概重现所讲述内容和方法给大家分享。
这个 Session 的名称为《调试应用程序的崩溃和挂死》,分别就 Winodws 下程序崩溃和挂死两方面进行了讲解以及对如何利用 windbg 进行调试作了精彩的演示。但调试技巧并非凭空而来,需要对系统有着深入的了解和丰富的经验,遵循一定的法则和规律才能事半功倍。例如对于进程 / 系统的崩溃,我们至少要了解其发生的一般原因,即 OS 检测到违反系统规则的行为或违反系统安全的情况(进程倍 OS 杀掉),抑或是内核代码有问题 OS 主动自杀( Windows 蓝屏)。其次就是要善于使用调试工具,俗话说工欲善其事必先利其器嘛,调试程序的话一个好用的调试器是必不可少的,张先生用的是 windows 平台的即时调试工具 windbg ,其他平台大家可以自己找到适合的工具就好。
对于调试动作本身而言,大体可以分为用户态调试和内核态调试。用户态调试相对比较简单,因为只需要面对自己的那一个进程。而内核态调试需要面对的对象是系统中所有进程,要想精准定位问题需要了解都有哪些内核服务程序、他们之间的关系以及自己的程序与这些服务进程之间会产生怎样的关联,调试起来相对要复杂的多,对于调试工具的使用及掌握程度也有相当程度的要求。
1. 用户态调试
这种调试我们作为程序员应该视之为空气和水一样的存在了,具体操作规则也很简单,就是利用调试器找到程序发生异常的地点,查看调用栈的内容,具体程序集体分析即可。张先生举了一个栈溢出 [ 注 ] 的例子,具体过程就不再赘述了,主要是在程序启动之前向系统注册调试器 windbg ,当发生异常时系统自动调用调试器并打出当时的程序调用栈,找出异常的地址和产生地点从而解决问题。
2. 内核态调试
由于应用程序一旦进入内核态之后其行为就不再像用户态那样可控,甚至有时候是不可观察的( Win7 的内核 Session 就是不可见的),一旦用户程序由于某种原因粘在内核态出不来,所谓应用程序的挂死大多数都是这个原因。在 Windows 平台上的表现就是,一个窗口突然在某个动作之后就失去响应,怎么点都白搭,甚至有时候用任务管理器都杀不掉(例如驱动程序不返回)。由于内核调试既是重点又是难点,所以张先生在这里给出了两个精彩的实例演示。
(1) 起机就挂的 Win7 ( Win7 溢出漏洞)
首先用 VirtualBox 启动一个虚拟的 Win7 ,发现启动之后立刻就死掉,必须重起,但重起之后仍然是老样子。这时候只有一个办法,对,就是上调试器! windbg 开启内核调试模式,进行一些配置注册进系统。在系统出问题的时候调试器被激活,这时可以看到程序陷入内核的地点,在陷入点分析程序进入了哪个地址、哪个模块,最后分析出是调用了一个自定义的电源驱动,该驱动在内核态势中不应答(后来看源码就是一个 while(true); )而造成了应用程序的挂死。
(2) 解除 Word 的挂死状态
我们都遇到过这样一种情况,就是用 word 写东西的时候想要插入一个图片或者其他资源文件之后突然发现 word 死在那里了,怎么点都不动,又没保存不舍得强行关闭,但是最终一般都得接受失掉部分资料的痛苦经历。这个解决 Word 挂死在内核态的演示引起了大家的高度兴趣,堪称本 Session 中最精彩的部分。张先生首先打开一个 Word 文档,然后把一个事先准备好的有问题的资源文件拖拽到 Word 中,然后 Word 就不响应了。这种情况自然还是上调试器,找陷入地址,分析 API 和部分汇编代码,找到进程僵死的调用栈。分析后(需要很多经验且非常熟悉 Windows 内核才能这么分析)发现是 Word 调用 OLE 僵死了,原因是 OLE 的老 API 会发广播消息到所有系统注册的顶层窗口,等待所有窗口的应答之后才能进行下一步处理。而偏偏有一个注册了顶层窗口但又不显示任何窗体的进程(事先准备好的)对于这种广播的处理函数中没有返回应答的代码,导致 Word 一直僵死在等待应答的状态。我上面这段描述漏过了对于 WinAPI 、地址、模块、汇编代码的分析,虽然听得时候觉得很酣畅淋漓,但是要达到他那种分析的境界丰富的实践经验和内核熟悉程度二者缺一不可,像我这种 Windows 编程一窍不通的只能高山仰止了。不过好在可以学习一下分析问题和解决问题的方法,工具的使用技巧和分析结果反倒不那么重要。
小结一下本 Session 涉及的软件调试的经验:
( 1 )栈回溯。找到程序的调用栈就离解决问题靠近了一半。
( 2 )一个趁手的调试器, Windows 平台必备 windbg ,其它平台肯定也有类似的替代品,就看各人喜好了
( 3 )了解应用程序挂死通常都是陷入内核态出不来造成的
( 4 )多去了解内核,多思考多分析
注:栈溢出,在写地址的时候覆盖了栈中返回值的地址,导致函数返回时跑到错误的地点引发的错误。主要识别方法:观察栈的长度,观察是否有异常的函数返回地址(该地址不属于任何模块)
2012-05-28 12:25:23
蔡学镛(jerrytsai1218@gmail.com)
之所以认识这位仁兄是因为看过他的《Java夜未眠》和几本译作,感觉文笔顺畅言之有物,没想到也被淘宝挖去作架构师了。初见此人很是有眼前一亮的感觉,T-Shirt、牛仔裤加运动鞋,面相很是青春。没想到会场里和我一样八卦的人也不在少数,有好事者问他的年龄才知道实际已近不惑,遂慨叹其驻颜有术保养得真好。所主持的两个Session:“尼古丁加咖啡因-...
蔡学镛(jerrytsai1218@gmail.com)
之所以认识这位仁兄是因为看过他的《Java夜未眠》和几本译作,感觉文笔顺畅言之有物,没想到也被淘宝挖去作架构师了。初见此人很是有眼前一亮的感觉,T-Shirt、牛仔裤加运动鞋,面相很是青春。没想到会场里和我一样八卦的人也不在少数,有好事者问他的年龄才知道实际已近不惑,遂慨叹其驻颜有术保养得真好。所主持的两个Session:“尼古丁加咖啡因--不瞌睡的PPT制作秘诀”和“DSL设计与实践”内容都相当不错,为人也很大方,找他copy幻灯片也欣然应允,给人留下很好的印象。
(一)DSL设计与实践
Domain Specific Language(DSL),是近几年才兴起的一个新兴的软件工程领域,我们可以将其理解为一种抽象的语言。该语言与我们日常使用的C/C++、Java等编程语言不同,DSL是面向问题域的,是用来描述某领域问题和解决方案的工具。举个例子来说,在音乐的领域,通用语言是五线谱,各种乐曲都可以用五线谱来描述,五线谱就是DSL;数学家解决数学问题,数学公式就是他们的DSL。说白了DSL更像是一种领域相关的脚本语言,该语言用该领域的知识进行描述和解决,最后如果想要在计算机上得到结果,需要把这种用领域知识写成的“脚本语言”翻译成一种计算机可以支持的语言(如C++,Java),并编译执行以得到最终结果。这里,DSL对应的计算机可以支持的语言称为Host Language。一个DSL可以对应多个Host Language,类似于我们既可以用C写的程序去计算数学公式,也可以用Java。以上只是我对DSL的一个粗浅的理解,对于DSL更精准定义和说明jerry说他也在等Martin Fowler(不认识此君?赶快去面壁)的书,他的书出来之后DSL才能算是有了真正意义上的理论基础。不过请记住两个关键点就够了:1 DSL是一种抽象程度更高的语言,2 它是以脚本语言为核心设计的
现在我们已经大致了解了什么是DSL,那么它有什么好处呢?如何在工作中使用DSL呢?这是必须解决的两个关键问题。
首先,我们已经知道,DSL是一种领域相关的抽象语言,在语法上肯定要比Java/C++这些具象的语言来的简练。更关键的是,DSL作为某一领域的“方言”,可以方便领域的专家用其更为熟悉的方式来描述和解决问题,避免了通常情况下领域专家也必须学会编程语言才能利用计算机工作的尴尬。比方说一个数学家想要利用一个复杂的数学模型(一个或一堆数学公式)解决一个数学问题,问题是他不会C语言,没办法直接写程序。但是他可以使用Matlib的脚本这个更贴近原来的数学公式的方式来描述问题和解决方案,Matlib软件会把脚本编译成机器某种语言书写的代码病编译执行,这里的Matlib脚本就是DSL。
虽然DSL威力强大,但是使用起来还是有不小的门槛,只有我们能够回答下面几个问题的时候,才可以真正动手构建DSL
1. 使用在那个领域?
2.使用者(及其知识背景)为何?
3.有没有模仿与参考的对象?(SQL,CSS...)
4.是否有制作工具的必要?
5.使用何种Host Language?
正如你所料,构建一个DSL是复杂且代价颇高的,下图就给了我们一些这方面的启示。首先我们需要定义一套对应领域的语言规范,但是创建一个新东西是很困难的,这也是上面第3点提到的要看看是否有模仿与参考对象的原因。有了语言规范之后,就需要一个解析器和代码生成器来将DSL翻译成一种我们熟知的程序设计语言,最后再将生成的源码编译成机器语言并执行。
这里我们可以看到,由于涉及了多个中间环节,且每个环节的产出物的构建过程都是相对较复杂的,所以一般来说自定义一个DSL是相当麻烦且极易出问题的。那么如何降低复杂度、提高效率呢?简而言之两个字:方言。所谓方言可以粗浅地理解为某一个Host Language(比如Java)的功能子集。举例来说,Java语言是一个功能强大的Host Language,但是数学家并不需要知道gui怎么做(即不需要swing),也不关心网络和线程(即不需要IO、NET、Concurrent API)等等,他只需要做算术计算的部分。于是对于数学领域的DSL,我们只需给出一个类似Java的语言,去掉数学家不关心的功能,剩下的就可以作为该领域的DSL。
这样做的好处显而易见,既避免了自己定义语言规范,又可以省去翻译和解析的过程,领域专家写的DSL几乎可以直接翻译成目标代码。此外,如果DSL需要扩展功能的话只需要把这个Host Language的相应部分取出来用就可以了,方便快捷。即增加了弹性又可以减少自定义DSL与Host Language之间的阻抗。
JerryTsai在最后给出了一个支付宝后督系统的实例。由于支付宝中每天有海量的支付单需要处理,每单又可能需要与多个外部系统打交道,这就需要一个系统来记录每一单目前的状态以及下一步骤应该进行什么操作。但是由于定制支付单流程和规则的人可能并不是程序员而是相关的业务人员,如果每次都由产品获业务人员定义规则、提交给技术开发、完成后再调试,整个过程就会相当繁琐且容易出错,而且对于某些易变的业务采取这种策略也不合适,这时DSL就可以派上用场了。
经过一系列参考和权衡之后,选定了状态机语言作为作为这个领域的DSL,于是业务人员只需要掌握简单的状态机语言就可以完成整个流程,而无需程序员的参与。更进一步地,我们知道由穷状态机用状态转换图来表示是最直观的,如果有一个状态机GUI,只需要拖拖拽拽就可以完成DSL的编写,连状态机语言都不需要了。不过由于为DSL构建专门的GUI工具是比较麻烦的,我们在实际工作中需要评估提供GUI工具是否合算,对于重点业务且直接写DSL脚本容易出错的情况下提供GUI工具自然是很理想的,但如果重要性不高的话也没必要花很多时间去实现GUI。
小结:
1 DSL的本质是抽象
2 DSL是以脚本语言为基础的
3 决定使用DSL之前需要做足够的调研
4 虽然DSL威力强大好处多多,但是创造一个DSL是很复杂的,尽量使用方言和已有工具简化中间过程
(二)尼古丁加咖啡因--不瞌睡的PPT制作秘诀
自学生时代起,讨论论文、毕业答辩、分享经验、演讲….PPT成为了生活中不可或缺的一部分。虽然演讲技巧因人而异、演说内容千差万别,唯一不变的只有一点,那就是有吸引力的、内容丰富的PPT是成功的一半。而与此相对地,内容单调、满篇文字、冗长拖沓的PPT则是打瞌睡的幕后推手。想要做成一份精彩的PPT,我们确实还是需要一些技巧。
首先我们要知道PPT简报主要包含材料、结构和修饰三个基本要素,有的放矢地针对要素进行优化,才会有事半功倍的效果。
1 材料
简报选材首先要确定目标听众,只有目标明确,才会在演讲中与听众产生共鸣,促进交流。其次就是要精简,简洁明了、 不拖沓是放之四海皆准的道理。对于所讲述的内容最好要以类似说故事的方式来陈述,避免死板地堆砌概念名词,或者讲述的经过枯燥无味。最后,一份简报的内容最好不要超出一本书中一章的长度,因为据统计,一份简报的时间长度应以90分钟为限,超过这个时间打瞌睡的指数就会成倍增加,所以简报内容不易过长。
2 结构
简报结构尽量结构化、扁平化,不要采用树状结构,而应以链式结构为宜。在每一页的内部,应慎用单字页面,多用句子页面,少用段落页面,不用小节页面。
3 修饰
PPT中最好的修饰就是图片,好的图片不但美观,而且可以起到视觉刺激、加强解释和加深记忆和联想的效果。在使用图片的过程中要适当留白以减缓心理压力,要注意画面布局会影响阅读次序与重点判断,图片的“噪声”会影响欣喜地接收;颜色,配色会产生心理作用。既然图片这么重要,那么如何找到切题且美观的图片呢?主要可以通过以下下4个步骤:
概念的图片相对好找一些,对于实物的找到对应物品的图片即可,抽象的就得使用下面的联想方式了。联想指我们看到某个事物之后头脑中的抽象反馈,例如看到维纳斯雕像的时候我们会反映出“美”,而太极图所表达的含义则为“平衡”,不过按照这种方式找图属于逆向查找,得平时积累很多素材才行。关键词就比较简单了,一旦联想出抽象概念之后就将其转化为关键字,然后问问无所不知的google和baidu就行了。本Session后半段就是一堆演示的实例,最主要还是强调图片与内容完美结合,我们回去可以多攒一些素材,以后说不定作PPT就用得上哦 :)
2012-05-28 12:25:47
Bill Venners
宽宽的额头,蓬松的头发,黑框眼镜和温和的笑容,初识Bill Venners还以为他是个学究式的人物,但是轻松诙谐口吻和同声传译根本赶不上的语速让我们见识到了一个严谨而不失幽默感的演讲大师的风采。他的经典书《深入Java虚拟机》是我学习JVM内部运转机制的第一手资料,内容翔实而准确,例子代码也相当有价值,特此广告一下。
Bill本次的演讲为我们带来了《Scala: 一种Ja...
Bill Venners
宽宽的额头,蓬松的头发,黑框眼镜和温和的笑容,初识Bill Venners还以为他是个学究式的人物,但是轻松诙谐口吻和同声传译根本赶不上的语速让我们见识到了一个严谨而不失幽默感的演讲大师的风采。他的经典书《深入Java虚拟机》是我学习JVM内部运转机制的第一手资料,内容翔实而准确,例子代码也相当有价值,特此广告一下。
Bill本次的演讲为我们带来了《Scala: 一种Java平台的新语言》。众所周知,在Java平台上,语言方面自然是Java语言为我独尊。但是随着Java语言功能日益强大的同时复杂性也随之水涨船高,再加上其静态语言的特质,使得其在完成某些功能的时候显得较为繁琐。于是便出现了JRuby、Groovy这样的动态语言来弥补Java语言在这方面的弱项。而Scala则是将二者优点相结合而产生的一个Java平台上的新语言,它融合了面向对象和函数式编程的理念,简洁的语法和良好的表达性让人感觉所使用的好像是一个动态语言;另一方面,scala本质上是一个静态语言,拥有一切静态语言带来的编译期类型检查等好处。更重要的是,Scala可以不加修改地直接使用Java现有的类库,避免了重新造轮子的苦恼。
虽然是基于Java平台的静态语言,我们可以预期它编译完之后就是java字节码,但是在语言层面scala和Java的差异还是相当大。举两个最明显的例子:首先是在Scala中,一切操作都是函数调用。不要惊讶,+和-是函数名,甚至连for也是函数调用,所以scala里面a+b实际就是a.+(b)。其次是在Scala中,没有所谓的primary type,即Java中的int、float等原生类型,而代之以经过wapper的类型,所以scala里面不需要所谓的boxing和unboxing。具体的语言细节这里就不多说了,Scala的官方网站资料很全,我只想分享一下我在听了这个Session之后的几点感受:
(1)Scala虽然是静态语言,但是使用起来无论是书写还是命令行编译执行的过程都很像在使用一个动态语言一样方便,当然这要归功于scala的设计理念。
(2)Scala语法上较Java更为简洁,扩展性更强
(3)可以使用现成的Java类库,避免了重复开发
(4)还不成熟,没有什么成功的应用成果(据传twitter是用scala写的)
(5)编译之后的代码采用了大量的Wrapper和Reflection,效率上是否会有影响尚未可知
作为一个新语言,Scala的应用场景还不广泛,Bill的演讲实例都是以JUnit的应用为主的,当时给人的感觉好像只能用在做junit上似的:),而且目前市场上没有什么成功的应用实例。这个应该是其软肋,因为一个语言成功与否最后还是要以其产出品为检验标准的。其次就是在Bill的演示过程中我发现其编译出来的代码很多地方使用了Wrapper和反射操作,我当时提问说这些反射会否影响系统运行效率,但是Bill没有正面回答,只是说有人测了说和Java一样快而有人说会慢一些,所以在效率方面还是让人有一些疑虑。
就我个人而言,这门语言最令我感兴趣的是类似动态语言的书写方式和可以直接使用java类库,不过这些好处和让重新学习一门新语言而且又不能确定其效率是否满足要求的门槛比起来还是缺乏进一步的吸引力,可能会让我觉投入和付出达不到预期。所以虽然目前呼声很高,也只能在有时间的时候“把玩”一下了。还有一位自由软件开发者邓草原先生也开了一个Session介绍了Scala的详细语法和代码实例,其题目是《Scala带来了什么,Scala会是Java的继承者吗?》,不过这部分内容相对枯燥乏味,题目和内容相去甚远,有些标题党的嫌疑。一觉醒来基本忘了大半,头脑中只记住一些琐碎复杂的东西,反倒让我感觉语言本身的魅力有所下降。
以上就是我参加本次SD2.0大会的各个Session中觉得比较有价值、值得分享的一些内容,可能记录得并不是特别全面,但是里面有相当部分加入了我自己的理解,希望能够起到抛砖引玉的作用,给各位带来一些新的想法,认识一下新的工具,掌握一些新的经验。有问题欢迎与我讨论