2007年12月24日

广告:祝成科技微软高级培训

作者 非鱼

上周一收到一封邮件,介绍祝成科技的.net高级培训,看了看课程,挺感兴趣,就打电话去咨询了一下,然后就是砍价。(砍到多少就不说了,如果出多了显得丢人,出少了就是人家的商业机密了)。

周五早上赶到微软在美罗大厦的办公室,到的人不多。领了份资料,里面还有一份早餐,呵呵,真是了解程序员啊,知道我们都有不吃早餐的习惯。

李建忠先生看上去相当年轻,温文尔雅,讲的东西很有逻辑性,从面向对象设计的要素,到敏捷开发的重点,再到设计模式,然后挨个分析设计模式。对于每个模式所举的代码都相当的浅显易懂,恰到好处。我学习设计模式是从Bob martin的敏捷开发那本书开始的,然后也陆续看过其它的书,但是每次都只能看进去前面一半,因为到了后面举例的项目就会变得很大,示例代码也会变得很复杂,而且很多时候示例代码不再使用Java,而是开始用C++,可能是模式本身的限制,用Java或者C#已经不好表现了。这次算是多搞清楚了几个模式。不过周五这天不知道为什么,我的眼睛特别的困,可能跟空调和灯光有关系,虽然并不是真的困,但是眼睛却睁不开,不过即使如此,大部分内容仍然听的很明白。

中午吃饭发的是东方即白的餐券,吃完回来发现每个人桌子上摆着一瓶饮料,感觉很体贴,会议安排工作做的很到位。

而第二天的上午剩下的一些模式就讲的特别的快,很多模式一带而过,没有再举例。可能觉得后面的这些模式用处不大吧。

从第二天下午开始课程换成熊力先生的性能方面的课程。能力看上去比李先生还要年轻,我甚至怀疑他是不是比我还年轻。熊力语速很快,而且讲课的时候行为动作之类都比较随意。先是以淘宝为例一步步分析用什么样的系统结构才能设计出一个超大负载的系统,性能方面需要考虑哪些因素,以及有什么样的方案可选。有些地方听的我茅塞顿开,虽然现在还用不上,但是,我自己的确是不太可能想到这样分拆数据库来解决性能问题的。

第三天的课程基本上集中在windbg的应用上。相信用asp.net的人都会遇到过看上去正常的网站系统在发布出去以后出现不正常的CPU和内存的情况,而这种问题在本地是调试不出来的,在服务器又没可能去调试。大部分时候,我们只能靠猜测来一步步的尝试解决问题。(畅享网的这种问题已经害我用去了两个多月的时间,依然无法解决。)所以这一天的课程大家都表现出非常大的兴趣,听的很认真。但是windbg本身的应用太复杂,不是那么容易记住。当时看熊力先生三下五除二就从几百M的内存Dump文件中定位到了出问题的代码,然后通过这个函数的名字直接就定位到了源代码,(没有源代码的部分就用Reflector),直接找到死锁所产生的lock原因。

不过回来以后自己下载安装了windbg,发现光是配置这种东西就够麻烦的,自己的服务器又产生高CPU占用的时候做了个Dump出来,结果Load进来一看,28个线程只有4个是托管线程,其它都是非托管的。但是当时并没有讲太多非托管程序的调试,根据自己的印象,使用了几个命令,还真的看到了一些东西。似乎是用户上传了头像以后,先把头像保存在硬盘上,再Load进来生成缩略图,而许多进程都显示在这个LoadImage的地方有一个WaitForSingleObject的等待。于是尝试换了种生成缩略图的方式,目前来看,今天一天程序运行很正常。如果真的解决了网站的这个问题,那仅凭这一点,这个培训就算赚回来了。

最后一天结束的时候有一个花絮。一个高高大大的朋友上来问了两个比较高难度的问题,第一:在一套已经完成的系统上,想不修改原来的任何代码,给它加上记录日志的功能。熊力先生的结论是,想不改一行代码而改变整个系统的行为,那恐怕不可能。当然,如果原来的系统够精致,能够改变一个基类而给所有的子类添加行为的话,那可能还比较简单。第二个问题就有趣了,想把Aspx所对应的cs文件放到App_Code目录里,但是系统似乎不允许,问有什么办法。我说建个类文件在aspx.cs里调用不就行了,对方说不行,我们就是有这个需求把它直接放到App_Code目录里。至于原因是什么,我不得而知,也真的想不出来。看了下他的代码,我说你把/App_Code前面的/去掉,别让它用/开头试试,对方说,这是用文件选择对话框选择的时候系统自动生成的。我说你去掉试一下嘛,对方说,那不可能,我不试,要试你自己回家试。当时真想把已经装好的笔记本拿出来试一下,又转念想想,何必呢,又不是我的问题。不过回家来自己试了一下,的确是不行,编译器显示App_Code是特殊目录,不允许把CodeBehind文件放在这里。实在想不明白他要这样做的真正原因是什么。

程序员钻牛角尖真可怕。