<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_λ-calculus in CnBlogs</title><subtitle type="text">【QQ：343056143（已满），504254078】【MSN：vczh@hotmail.com】【Email：vczh@163.com】</subtitle><id>http://feed.cnblogs.com/blog/u/42118/rss</id><updated>2011-12-16T15:44:39Z</updated><author><name>陈梓瀚(vczh)</name><uri>http://www.cnblogs.com/geniusvczh/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/geniusvczh/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/42118/rss"/><entry><id>http://www.cnblogs.com/geniusvczh/archive/2011/12/16/2290808.html</id><title type="text">进入2012 -- 回顾我走过的编程之路</title><summary type="text">（很荣幸被华南理工大学软件学院邀请撰写此文，关于毕业那会儿找工作的一些事情）前些日子被华南理工大学软件学院邀请回去参加一些活动，其中包括跟一些师弟师妹们进行座谈。期间就有一个人问，要怎么样才可以去微软。其实我从来没有想过这个问题，所以那个时候的答案自然就是微软的广告（编程好，数学好，态度好）了。09年大四那会儿，刚好碰上了美帝的次贷危机，令我们这些想去美帝的公司被剥削的这帮人倍感艰辛。所幸后来还是过五关斩六将，最后在实习结束之后成功留了下来。这其中的因果，显然不是面试的那几天所能够决定的，因此还得从hello world讲起。我有幸从初二开始就学习编程。那个时候世界已经处于一个现代化的程度了，</summary><published>2011-12-16T15:44:00Z</published><updated>2011-12-16T15:44:00Z</updated><author><name>陈梓瀚(vczh)</name><uri>http://www.cnblogs.com/geniusvczh/</uri></author><link rel="alternate" href="http://www.cnblogs.com/geniusvczh/archive/2011/12/16/2290808.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/geniusvczh/archive/2011/12/16/2290808.html"/><content type="html">&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'; color: red"&gt;&lt;strong&gt;（很荣幸被华南理工大学软件学院邀请撰写此文，关于毕业那会儿找工作的一些事情）&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;前些日子被华南理工大学软件学院邀请回去参加一些活动，其中包括跟一些师弟师妹们进行座谈。期间就有一个人问，要怎么样才可以去微软。其实我从来没有想过这个问题，所以那个时候的答案自然就是微软的广告（编程好，数学好，态度好）了。&lt;span lang="EN-US"&gt;09&lt;/span&gt;年大四那会儿，刚好碰上了美帝的次贷危机，令我们这些想去美帝的公司被剥削的这帮人倍感艰辛。所幸后来还是过五关斩六将，最后在实习结束之后成功留了下来。这其中的因果，显然不是面试的那几天所能够决定的，因此还得从&lt;span lang="EN-US"&gt;hello world&lt;/span&gt;讲起。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;我有幸从初二开始就学习编程。那个时候世界已经处于一个现代化的程度了，操作系统都有虚拟内存，有图形界面，有因特网，开发软件还有集成开发环境可用，跟一些老前辈所描述的编译一个程序还要换几次磁盘的日子已经完全不一样了。那个时候正值购买电脑半年，处于看见什么东西都感到十分好奇的时候，再加上父亲那个时候不太同意我玩游戏，所以我就在想什么时候也自己做几个游戏，就可以光明正大的玩了。所以在听到汕头华侨中学开&lt;span lang="EN-US"&gt;Visual Basic 5.0&lt;/span&gt;的课的时候，感到比较兴奋。但是其兴奋程度比起初一为了上第一节电脑课兴奋过度，骑自行车超速以至于留了一大堆血没了几颗牙的那一天，已经可以忽略了。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;那个时候还是&lt;span lang="EN-US"&gt;21&lt;/span&gt;世纪的第一年，正处于上网费用巨贵无比、&lt;span lang="EN-US"&gt;Google&lt;/span&gt;还刚起来没多久基本没人知道的时候，学习编程要比现在困难很多。当时想寻找什么知识，因特网基本上是没什么指望的，所以我就有了一个没事去书店的爱好。没过多久我就找到了一本《&lt;span lang="EN-US"&gt;Visual Studio&lt;/span&gt;高级图形程序设计教程》。这本书我很喜欢，插图十分漂亮，而且还是使用&lt;span lang="EN-US"&gt;Visual Basic&lt;/span&gt;编程绘制的，更是爱不释手。可惜内容过于高深，所以后来就有了初三的时候自学学会初步的立体解析几何，以及高三上课不听讲仅凭自己看数学分析后来还被我看明白了的故事。中间因为试图使用编程绘制很多复杂的图形和对图像进行各种复杂的变换，于是每当写程序之前都要在纸上推导长长的公式。如果程序的运行结果不对了，根本无从调试，只好重新推导，借以希望可以发现公式的几个&lt;span lang="EN-US"&gt;bug&lt;/span&gt;以解释为什么会出现错误。从此以后我对符号运算就十分拿手。而且做数学物理作业也好，为了编程推导公式也好，需要计算的东西太多懒得到处寻找废纸，从而便获得了心算复杂过程的本领（可惜现在已经丧失了）。这顺带还给我带来了一个好处，就是高考数学选择题在发卷后不许动笔的&lt;span lang="EN-US"&gt;10&lt;/span&gt;分钟内就被我全部心算出答案，而且全对了。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;图形编程做久了，就想起了当初的理想，于是就搞游戏去了。那会儿看到了成都金点工作组开发的《圣剑英雄传》，点燃了我开发&lt;span lang="EN-US"&gt;RPG&lt;/span&gt;的热情。在经历了几次失败之后，我终于在高二的正月初一那一天完成了《天地传》的所有编码工作，没过多久就上传到了&lt;span lang="EN-US"&gt;GameRes&lt;/span&gt;的网站上。这是我第一个行数过万的程序。为了顺利完成它，我悟到了很多道理，包括为什么要面向对象，为什么要划分模块减少互相依赖。这也成为我后来开发自绘图形界面和脚本引擎的契机。后来我试图用&lt;span lang="EN-US"&gt;OpenGL&lt;/span&gt;做&lt;span lang="EN-US"&gt;3D&lt;/span&gt;游戏，但是由于很难找到有共同爱好的美工跟我一起做，便作罢了。但是这却让我获得了很多时间，可以投入到图形界面和脚本引擎之中去。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;后来我就萌发了解释高级语言的想法。这是我整个编程历史上的第一个转折点。那个时候我数据结构只会用链表，而且编译原理也好，设计模式也好，都还没听过。那个时候去解释高级语言自然是比较困难的。因此我经过很多天的苦思冥想自己想出了一个如今称之为一遍编译（也就是很烂）的方法来把一个简单的高级语言重新处理成一个简单的指令集语言，就跟汇编长得差不多。那个时候已经高三了，所以其实也没多少时间可以投入在编程上面，因此做出来的第一个原型是一个简化后的&lt;span lang="EN-US"&gt;Pascal&lt;/span&gt;的解释器，用&lt;span lang="EN-US"&gt;Delphi&lt;/span&gt;开发的。现在想起来，里面肯定有巨多内存泄露和性能问题，不过当时根本不知道这些东西是什么。在高中毕业之后的三个月无所事事的日子里，我就重新把这个东西设计了一遍，得到了一个几十页的计划。由于后来没来得及做完，就打印出来带去了华南理工大学。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;刚进了大学没几天，就听一个大四的师姐说我们的班主任陈健老师是教编译原理的，于是我就把这一叠纸拿给了她看。她什么也没说（现在回想起来，只能是那一份设计实在是不堪入目&amp;#8230;&amp;#8230;），就给了我一本编译原理的课本。我很快就看完了，然后用了里面的知识做了第一个真正意义上的脚本引擎，语法山寨了&lt;span lang="EN-US"&gt;Java&lt;/span&gt;语言的一些简单的部分，还添加了一个编译的时候自动把模板参数都改成&lt;span lang="EN-US"&gt;Object&lt;/span&gt;类型的语法，起了个名字叫&lt;span lang="EN-US"&gt;JoveScript&lt;/span&gt;。后来上了&lt;span lang="EN-US"&gt;Java&lt;/span&gt;的课，发现&lt;span lang="EN-US"&gt;Java&lt;/span&gt;竟然真的这么干了，让我觉得好生奇怪。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;后来我陆陆续续写了很多脚本引擎。大一的时候做的&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span lang="EN-US"&gt;JoveScript&lt;/span&gt;&lt;/strong&gt;是第一个我觉得还能见人的脚本引擎。第二个就是大二失败了一整年吸取了很多教训之后，于大三开发出的动态语言，名字叫&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span lang="EN-US"&gt;FreeScript&lt;/span&gt;&lt;/strong&gt;（可以在我的博客&lt;span lang="EN-US"&gt;http://www.cppblog.com/vczh&lt;/span&gt;上找到）。最近正在打算将其更新到&lt;span lang="EN-US"&gt;3.0&lt;/span&gt;来配合一个正在开发中的显卡加速的&lt;span lang="EN-US"&gt;GUI&lt;/span&gt;类库&lt;span lang="EN-US"&gt;GacUI&lt;/span&gt;。接下来就是在去微软上海的&lt;span lang="EN-US"&gt;WCF Tools&lt;/span&gt;组实习的那一段时间里面，利用每天晚上的时间完成的一门纯函数式语言叫&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span lang="EN-US"&gt;KernelFP&lt;/span&gt;&lt;/strong&gt;，这后来成为了我的毕业设计。提交了毕业设计之后，我又在毕业前的几个月时间里面完成了&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span lang="EN-US"&gt;CMinus&lt;/span&gt;&lt;/strong&gt;。这不是编译原理课程设计上的那个简单到没法再简单的&lt;span lang="EN-US"&gt;CMinus&lt;/span&gt;，而是一个完整的&lt;span lang="EN-US"&gt;C&lt;/span&gt;语言编译器（其中函数指针的语法被我改掉了，但是仍然支持）。其编译结果是保存到内存中的一段&lt;span lang="EN-US"&gt;X86&lt;/span&gt;二进制代码，可以将函数的起始地址强制转换成函数指针直接在&lt;span lang="EN-US"&gt;C++&lt;/span&gt;程序中使用，这是因为我在生成指令的时候遵守了&lt;span lang="EN-US"&gt;Visual C++&lt;/span&gt;中的一些在&lt;span lang="EN-US"&gt;MSDN&lt;/span&gt;里描述得很清楚的约定。毕业后我又雄心勃勃地做了&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span lang="EN-US"&gt;NativeX&lt;/span&gt;&lt;/strong&gt;，是一个带泛型以及&lt;span lang="EN-US"&gt;concept mapping&lt;/span&gt;的&lt;span lang="EN-US"&gt;C&lt;/span&gt;语言。前几个月我又试图山寨&lt;span lang="EN-US"&gt;C#&lt;/span&gt;，但是无奈&lt;span lang="EN-US"&gt;C#&lt;/span&gt;实在是太复杂，所以转而去做&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span lang="EN-US"&gt;GacUI&lt;/span&gt;&lt;/strong&gt;。图形界面（&lt;span lang="EN-US"&gt;GUI&lt;/span&gt;）类库我也写了不少。继高中的时候为&lt;span lang="EN-US"&gt;RPG&lt;/span&gt;而开发的两个控件类库之后，在上大学的过程中使用&lt;span lang="EN-US"&gt;OpenGL&lt;/span&gt;开发的两次&lt;span lang="EN-US"&gt;GUI&lt;/span&gt;类库均告失败。后来还封装了一次&lt;span lang="EN-US"&gt;Windows&lt;/span&gt;的&lt;span lang="EN-US"&gt;API&lt;/span&gt;（&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span lang="EN-US"&gt;Vczh GUI&lt;/span&gt;&lt;/strong&gt;），试图让其易用性接近&lt;span lang="EN-US"&gt;VCL&lt;/span&gt;或&lt;span lang="EN-US"&gt;WinForm&lt;/span&gt;。毕业后我又尝试发了若干次基于渲染的&lt;span lang="EN-US"&gt;GUI&lt;/span&gt;，换了几次架构，一直到现在正在开发的&lt;span lang="EN-US"&gt;GacUI&lt;/span&gt;才感觉走上了正轨。我在这个过程中得到的一个结论就是：&lt;span lang="EN-US"&gt;Windows Presentation Foundation&lt;/span&gt;的设计实在是太完美了&amp;#8230;&amp;#8230;在做这些东西之余，我还开发了三次三维物体的软件渲染程序，前两个是在毕业前做的，最后一个是一年前因为一下子不知道要如何利用业余时间来充实生活而开发出来的，目的是用于打发时间。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;在这里我想可以回答一个月前不能很好地回答师弟师妹们的一个问题了。如何能够在微软找到工作？因为我把我上面做的这些东西都写进了简历。同时如果你们到了大四才来问这个，就已经太迟了&amp;#8230;&amp;#8230;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;值得一提的是，我从大三开始指导一名基础几乎是零的、比我低两个年级的软件学院的一位学生学习编程。为了让对方在接受我为期&lt;span lang="EN-US"&gt;3&lt;/span&gt;年的训练之后有扎实的&lt;span lang="EN-US"&gt;C++&lt;/span&gt;基础、熟练的单元测试编写水平以及能够靠直觉给出一些不算太差的设计，我回顾了许多关于&lt;span lang="EN-US"&gt;C++&lt;/span&gt;的内容，特别是给指针的几节课备课了好几天，并且每一天都要出一个作业。在这个过程中我深刻的感觉到，如果要快速提高自己的编程水平的话，你必须总是去做一些你做得出来，但是难度大到只要再难一点点你就做不出来的事情。再这么坚持好些年之后，肯定会进入高手的行列。因此我在安排作业的过程中，有意推迟了关于指针的内容。首先让对方接受变量和分支循环，然后要养成一个好的风格（譬如说不能老是用一个字母给变量命名之类），然后学会操作数组，接下来才是关于没有强制类型转换的指针的一些操作，并且在一个月之内做出一个带单元测试的字符串类。指针的重点是要对方深刻的理解，&amp;#8220;指针本身就是一个指向位置的数字&amp;#8221;这么一个概念。为此我特别设计（但没有实现）了一门只带有一个全局无限长数组的汇编语言来讲述指针背后一些复杂的概念。之后就是一些关于面向对象的知识、设计模式的知识、还有跟脚本引擎有关的一些东西。该学生的毕业设计是一个简单的动态语言的脚本引擎，并且该脚本引擎的实现正确地运行了我在上面模仿&lt;span lang="EN-US"&gt;Linq&lt;/span&gt;的一个列表处理函数库。这个实现闭包一层套一层，到处都在给一个物体添加删除函数，创建各种延迟执行的迭代器，很是能够考验一个脚本引擎的实现。对方毕业后被网易招去了，并且在待遇上给予了一些人文关怀。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;自己的编程历程不仅包括自己在业余时间内做的这些程序，而且也包括在微软实习和工作的过程。高中的时候就听说了华南理工大学有微软俱乐部的事情，再加上自己对微软也持有一定的向往，因此在入学之后，除了学院的学生会以外，我就一直在密切关注着微软俱乐部的招新，并且忽略其它所有社团。不过说实话在学生会和微软俱乐部的工作也纯属打酱油，没干过什么正事儿。大二的时候微软搜索技术中心（&lt;span lang="EN-US"&gt;STC&lt;/span&gt;）来微软俱乐部收简历的时候，我在路上碰到了陈健老师，也就是之前提到的班主任，就跟她说了这个事情。后来由于对方说我年龄太小而作罢，因为其它人全部都是研究生。到了大三的时候，陈健老师就跟我提到她可以找老同学帮我投微软的实习简历，因此我于&lt;span lang="EN-US"&gt;2008&lt;/span&gt;年&lt;span lang="EN-US"&gt;3&lt;/span&gt;月份接到了微软上海的电话面试。电话面试有两次，第一次对方是一位&lt;span lang="EN-US"&gt;HR&lt;/span&gt;，第二次则是一位软件工程师。在第二次电话面试的过程中，我们聊了上面提到的&lt;span lang="EN-US"&gt;FreeScript&lt;/span&gt;，还针对一些数据结构和框架设计的问题进行了热情洋溢的讨论。没过几天，我就收到了面试通知，前往上海闵行区的紫竹数码信息港面试。那是我人生中的第一次面试。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;微软的面试安排精确到秒，这跟某些公司比起来要人性化许多，不会动辄浪费别人数个小时的时间。实习的面试一共有三轮，对话全部使用英语，尽管里面只有一个是外国人。我还依稀记得被那个年轻的老外面试的时候由于过于紧张，而导致一道简单的问题没有给出最优解的事情。不过他们最终还是让我进入微软位于上海的一个&lt;span lang="EN-US"&gt;WCF Tools&lt;/span&gt;小组实习。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;这个小组有一位让我十分尊敬的软件开发主管。主管先生是一位热爱敏捷并且经常投身于实践中的人。他在我长达&lt;span lang="EN-US"&gt;4.5&lt;/span&gt;个月的实习过程中，教给了我很多软件工程上的东西，而其中最重要的、让我受益匪浅的则是关于单元测试的内容。除此之外，我也体验了快速迭代、&lt;span lang="EN-US"&gt;Scrum&lt;/span&gt;会议、结对编程以及基于源代码版本管理系统（我们使用的是&lt;span lang="EN-US"&gt;TFS&lt;/span&gt;）进行多人协作开发的流程。在经历了为&lt;span lang="EN-US"&gt;TechEd&lt;/span&gt;大会修改&lt;span lang="EN-US"&gt;PetShop&lt;/span&gt;制作&lt;span lang="EN-US"&gt;WCF&lt;/span&gt;的&lt;span lang="EN-US"&gt;Demo&lt;/span&gt;、为&lt;span lang="EN-US"&gt;Visual Studio 2010&lt;/span&gt;的&lt;span lang="EN-US"&gt;WCF&lt;/span&gt;开发工具修&lt;span lang="EN-US"&gt;bug&lt;/span&gt;和开发一个具有高度可扩展性的配置文件编辑器之后，我于&lt;span lang="EN-US"&gt;2008&lt;/span&gt;年&lt;span lang="EN-US"&gt;12&lt;/span&gt;月份结束了在微软的实习。经过了这次实习，我对源代码的掌控能力也得到了提高，并且直接体现在我利用业余时间开发的项目的代码质量上。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;在实习结束之前，我获得了一次面试全职员工（&lt;span lang="EN-US"&gt;FTE&lt;/span&gt;）的机会。当时形势十分严峻。&lt;span lang="EN-US"&gt;2008&lt;/span&gt;年美国的次贷危机于&lt;span lang="EN-US"&gt;10&lt;/span&gt;月份正式影响微软上海，公司在那一段时间决定减少全职员工的招聘数量。而我是&lt;span lang="EN-US"&gt;11&lt;/span&gt;月份进行转正的面试，结果这件事情令我十分紧张。后来主管先生表示他的个人建议是希望我毕业后留下来继续工作，让我吃了一颗定心丸。实习生转全职员工的面试一共有五轮。其中令我印象非常深刻的是有一轮的面试官问了我很多非常复杂的问题，最后还考了我一道关于线索二叉树在线更新的问题，不过我已经记不清楚具体是什么内容了。我只记得我花了很长时间终于想到了一个正确的算法之后，时间就结束了，根本来不及在白板上写代码。后来我终于通过了面试，少数的几个名额里面终于被我拿走了一个。不过听说几个月后限制开始放宽，没有我面试的时候那么困难了。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;在实习和面试的过程中，我觉得华南理工大学软件学院开设的很多课程其实都是十分有用的，特别是关于数据结构、设计模式和软件测试的内容。这些都是在工作中十分有用的知识，并且也需要在今后的工作中继续积累这些东西的经验。只不过因为学院学生人数众多，而一个新的学院总是免不了缺乏一些师资力量，所以我有很多同学都表示很难体会到课本中所提到内容的作用。想必如今应该比我们那几年要改善许多了。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;面试结束到获得&lt;span lang="EN-US"&gt;offer&lt;/span&gt;中间隔了几十天，最后&lt;span lang="EN-US"&gt;HR&lt;/span&gt;的通知在除夕的那一天终于到来了。之后的半年时间我就在学校里面继续做自己的事情，偶尔参加几个活动介绍经验等等，还有就是跟一些人出去游玩。毕业后动身前往上海微软。中间发生了一些事情，因为名额变动的问题，我虽然拿的是&lt;span lang="EN-US"&gt;WCF Tools&lt;/span&gt;的&lt;span lang="EN-US"&gt;offer&lt;/span&gt;，但是最后却被安排到&lt;span lang="EN-US"&gt;SQL Server&lt;/span&gt;组，在此之前我并没有收到通知。由于我比较不喜欢数据库，对&lt;span lang="EN-US"&gt;SQL Server&lt;/span&gt;了解很浅，所以我做了一年半的&lt;span lang="EN-US"&gt;SQL Server Management Studio&lt;/span&gt;（也就是传说中的&amp;#8220;界面&amp;#8221;）的开发。在这期间我跟同事们传播了一些关于单元测试、界面开发、设计模式、&lt;span lang="EN-US"&gt;Linq&lt;/span&gt;和语法分析器的知识。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;这一年半的经历让我成长了许多，主要是比起实习，正式工作的时候总是免不了经常要跟别的团队、公司、民族、国家和物种进行热情洋溢的广泛交流，而且还占用了不少的时间。有些时候还要坐飞机前往美帝，感受一下社会主义的优越性。正式软件的界面部分十分复杂，不仅要在操作系统的&lt;span lang="EN-US"&gt;DPI&lt;/span&gt;变动以及本地化（大部分内容是把界面上的文字翻译成别的语言）的过程中界面的布局需要自动调整，以便不让一些文字或者按钮只显示一半，还要照顾各式各样的残疾人（特别是失去视力的人群），并且对于某些自绘的复杂内容还要提供一些运行时的接口，使得自动测试团队可以完成他们的工作。这个经历让我感受到了开发一个严谨的界面是多么地不容易。另一个感受是关于需求变更的。设计模式的存在就是为了抵御需求变更，这个真理我直到工作之后才能明白。你必须把一个软件的架构设计得如此之好，才能在需求大规模变更之后，还能在整体上让你的代码是漂亮的、易于修改的、高性能的、并且是安全的。每一次改动都不能是打补丁，你总是需要重构来使得你的代码在任何一刻都在整体上是好的。为了达到这个目标，就需要熟练掌握并使用设计模式来开发项目。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;微软的跟别的公司比起来罕有一个好处就是他会给你很多时间，让你慢慢把软件做好。而这个好的定义，当然是以功能和可维护性为重点。倘若一段代码以非常精妙的方法来高速完成一个任务，但是却复杂到哪怕写遍了注释也不能让后续维护的人看懂的话，那这段代码是没有实用价值的。一段好的代码，不在于它的设计有多么巧妙，不在于它的算法有多么高深，而在于它可以被几千个人同时开发&lt;span lang="EN-US"&gt;10&lt;/span&gt;年，并且在持续添加功能的过程中，不会因为过于混乱而导致出现了重写的需要。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;后来我因为一些原因申请了到微软亚洲研究院（&lt;span lang="EN-US"&gt;MSRA&lt;/span&gt;）的人事调动。&lt;span lang="EN-US"&gt;2011&lt;/span&gt;年&lt;span lang="EN-US"&gt;1&lt;/span&gt;月份我在获得了经理的批准之后，从上海前往北京参加研究院的面试。这一次面试仍然有五轮。这次面试很难，其中一个面试官因为在我的简历上发现了很多跟编译器有关的东西之后，决定让我实现一个&lt;span lang="EN-US"&gt;strncpy&lt;/span&gt;函数，要求是&lt;span lang="EN-US"&gt;CPU&lt;/span&gt;对内存的访问次数要最少。这包含了很多诸如带宽、对齐和二进制字节位移操作等各种问题。方法本身就已经很繁琐，再加上纸上写代码总是免不了要犯错误，所以我依然没有时间把整个程序写完。另一个面试官老外在年轻的时候也做过一些编译器的事情，让我出乎意料的是他在面试的过程中没有跟我出题目，反而就编译器的各种算法和问题聊了整整一个小时，基本上我会的知识全部都因为要回答问题而说了出来。之后我跟这个人产生了深厚的友谊。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'"&gt;不久之后我就获得了调动的批准。在做了一些包括给上海的&lt;span lang="EN-US"&gt;SQL Server&lt;/span&gt;团队建立单元测试标准之类的收尾工作之后，我于&lt;span lang="EN-US"&gt;2011&lt;/span&gt;年的&lt;span lang="EN-US"&gt;4&lt;/span&gt;月份前往北京，正式成为微软亚洲研究院的一员，做一些跟分布式系统相关的研究。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: '微软雅黑','sans-serif'" lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: '微软雅黑','sans-serif'; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;过往的这些事情给了我很多的启示。在程序员的生涯里面，最重要的就是保持对编程的热情，不要被生活的琐事所磨灭。其次是要给自己不断地创造一些足够困难但是又有办法完成的挑战，这样才可以总是让自己保持着一个快速前进的状态。最后，记得要感谢国家。&lt;/span&gt; &lt;img src="http://www.cnblogs.com/geniusvczh/aggbug/2290808.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/geniusvczh/archive/2011/12/16/2290808.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/geniusvczh/archive/2011/08/11/2135011.html</id><title type="text">做了一个画f(x,y)=0函数图像的算法，果断codeplex之</title><summary type="text">代码上传到了http://vlpp.codeplex.com/的Candidate\Games\FunctionVisualizer文件夹下面，VS2010，.NET 4.0。做这个的目的只要是前几天看到了batman equaltion，然后浑身不舒服，因此就想起了这片新闻（http://news.cnblogs.com/n/106212/）里面的东西。就花了一个晚上和一个早上的时间做了出来。当然这里面有点瑕疵，不过大概还是好的。 在Candidate\Games\FunctionVisualizer\FvCalculation\RawExpression.cs里面可以看到用来表达函数的语.</summary><published>2011-08-11T07:05:00Z</published><updated>2011-08-11T07:05:00Z</updated><author><name>陈梓瀚(vczh)</name><uri>http://www.cnblogs.com/geniusvczh/</uri></author><link rel="alternate" href="http://www.cnblogs.com/geniusvczh/archive/2011/08/11/2135011.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/geniusvczh/archive/2011/08/11/2135011.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 代码上传到了&lt;a href="http://vlpp.codeplex.com/"&gt;http://vlpp.codeplex.com/&lt;/a&gt;的Candidate\Games\FunctionVisualizer文件夹下面，VS2010，.NET 4.0。做这个的目的只要是前几天看到了batman equaltion，然后浑身不舒服，因此就想起了这片新闻（&lt;a href="http://news.cnblogs.com/n/106212/"&gt;http://news.cnblogs.com/n/106212/&lt;/a&gt;）里面的东西。就花了一个晚上和一个早上的时间做了出来。当然这里面有点瑕疵，不过大概还是好的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Candidate\Games\FunctionVisualizer\FvCalculation\RawExpression.cs里面可以看到用来表达函数的语法树。旁边的ExpressionParser.cs有一个用unsafe+char**写的语法分析器。当我得到了语法树之后，就求f(x,y)的偏微分（RawExpression.Different函数），然后按照下面的步骤进行：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1：从屏幕的所有点(a,b)开始&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2：用牛顿迭代发求f(x,b)=0的解x'&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3：用牛墩迭代法求f(a,y)=0的解y'&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4：每个点(a,b)就变换成了(a,y')和(x',b)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5：如果Bitmap的大小是100*100的话，那么现在我就获得了两万个(double, double)点，将他们Math.Round之后画到Bitmap里面就成为函数图像了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 为了加速，我做了下面的几件事情&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1：用unsafe把string转成char*，然后做语法分析器（方法基本上就是我写的这篇文章&lt;a href="http://www.cppblog.com/vczh/archive/2008/06/15/53373.html"&gt;http://www.cppblog.com/vczh/archive/2008/06/15/53373.html&lt;/a&gt;）。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2：绘图的时候Bitmap.Lock得到指向Bitmap的颜色的缓冲区，unsafe强制转换成byte*，然后填颜色。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3：在得到f(x,b)和f(a,y)之后，对他们求微分f'x(x,b)和f'y(a,y)，然后把这些函数从RawExpression编译到System.Linq.Expression再Compile成Func&amp;lt;double, double&amp;gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 下面就放几个截图。由于|x|我还没想到好方法去支持，所以我只画了上面提到的那片新闻的一半的图。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/FV_04.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/FV_03.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/FV_02.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/FV_01.png" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/geniusvczh/aggbug/2135011.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/geniusvczh/archive/2011/08/11/2135011.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/geniusvczh/archive/2010/04/28/1722915.html</id><title type="text">Vczh Library++ 语法分析器开发指南</title><summary type="text">Vczh Library++ 语法分析器开发指南陈梓瀚前言在日常的开发工作中我们总是时不时需要写一些语法分析器。语法分析器不一定指的是一门语言的编译器前端，也有可能仅仅是一个自己设计格式的配置文件的读写程序，或者是一门用来简化我们开发的DSL（领域专用语言）。我们可以选择使用XML，不过因为XML的噪音实在是太多，所以自己写语法分析器在有些情况下是必要的，特别是那种经常需要修改的文件，使用XML有...</summary><published>2010-04-28T05:46:00Z</published><updated>2010-04-28T05:46:00Z</updated><author><name>陈梓瀚(vczh)</name><uri>http://www.cnblogs.com/geniusvczh/</uri></author><link rel="alternate" href="http://www.cnblogs.com/geniusvczh/archive/2010/04/28/1722915.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/geniusvczh/archive/2010/04/28/1722915.html"/><content type="text">Vczh Library++ 语法分析器开发指南陈梓瀚前言在日常的开发工作中我们总是时不时需要写一些语法分析器。语法分析器不一定指的是一门语言的编译器前端，也有可能仅仅是一个自己设计格式的配置文件的读写程序，或者是一门用来简化我们开发的DSL（领域专用语言）。我们可以选择使用XML，不过因为XML的噪音实在是太多，所以自己写语法分析器在有些情况下是必要的，特别是那种经常需要修改的文件，使用XML有...</content></entry><entry><id>http://www.cnblogs.com/geniusvczh/archive/2010/01/08/1642583.html</id><title type="text">为什么要MVC</title><summary type="text">最近在公司写了一大堆复杂的界面，终于体会到了前辈们那种上刀山下火海的感觉了。做完了之后回头想想，MVC还是有道理的。 什么是MVC？其实可以简单的理解为一个有UI的程序可以划分为三个部分：数据层、逻辑层和应用层。当然这些名字是我乱起的。数据层顾名思义就是用来读写数据的地方，譬如说一个电话本的文件。逻辑层就是用户在界面上的操作的抽象，譬如说要通过名字来查找消息啦，给一个关键字求得筛选后的电话信息列表...</summary><published>2010-01-08T12:02:00Z</published><updated>2010-01-08T12:02:00Z</updated><author><name>陈梓瀚(vczh)</name><uri>http://www.cnblogs.com/geniusvczh/</uri></author><link rel="alternate" href="http://www.cnblogs.com/geniusvczh/archive/2010/01/08/1642583.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/geniusvczh/archive/2010/01/08/1642583.html"/><content type="text">最近在公司写了一大堆复杂的界面，终于体会到了前辈们那种上刀山下火海的感觉了。做完了之后回头想想，MVC还是有道理的。 什么是MVC？其实可以简单的理解为一个有UI的程序可以划分为三个部分：数据层、逻辑层和应用层。当然这些名字是我乱起的。数据层顾名思义就是用来读写数据的地方，譬如说一个电话本的文件。逻辑层就是用户在界面上的操作的抽象，譬如说要通过名字来查找消息啦，给一个关键字求得筛选后的电话信息列表...</content></entry><entry><id>http://www.cnblogs.com/geniusvczh/archive/2009/12/31/1636653.html</id><title type="text">Vczh Library++3.0 开源啦！</title><summary type="text">项目主页：http://vlpp.codeplex.com/ Vczh Library++从2006年就开始开发，到现在经历了一些版本变迁，到现在已经正式步入3.0了。现在Vczh Library++ 3.0的基础部分已经成型，我的目标是将Vczh Library++ 3.0做成一个在性能不是极端苛刻情况下使用的数据处理库，附带一个高速的脚本引擎。未来可能会提供更多的东西，但主要围绕着这两个目标走...</summary><published>2009-12-31T03:06:00Z</published><updated>2009-12-31T03:06:00Z</updated><author><name>陈梓瀚(vczh)</name><uri>http://www.cnblogs.com/geniusvczh/</uri></author><link rel="alternate" href="http://www.cnblogs.com/geniusvczh/archive/2009/12/31/1636653.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/geniusvczh/archive/2009/12/31/1636653.html"/><content type="text">项目主页：http://vlpp.codeplex.com/ Vczh Library++从2006年就开始开发，到现在经历了一些版本变迁，到现在已经正式步入3.0了。现在Vczh Library++ 3.0的基础部分已经成型，我的目标是将Vczh Library++ 3.0做成一个在性能不是极端苛刻情况下使用的数据处理库，附带一个高速的脚本引擎。未来可能会提供更多的东西，但主要围绕着这两个目标走...</content></entry><entry><id>http://www.cnblogs.com/geniusvczh/archive/2009/12/17/1626184.html</id><title type="text">看到哪里排序到哪里的ListView</title><summary type="text">  做这个小demo（下载）主要是为了解决如何在ListView上排序大量数据的问题。  这个Demo窗口上的ListView有一百万个项目，点了“Sort”之后就会开始排序。但这个排序跟以往的不同，你看到哪里它排到哪里，但这个排序不仅仅是在窗口内部排，而是你看到的内容都是正确的。  举个例子，你在浏览1000-1020条的时候，我会开始排序（当然有一点点延迟，不过不会卡窗口），然后确保1000-1020一定是【全局中的】第1000小到第1020小的，就如同全部排过序一样。而且还有一个副作用，就是小于1000的全部比1000小，大于1020的全部比1020大（这可以让你继续浏览的时候排序迅速收敛，而且这听起来应该很熟悉，嘿嘿）。  欢迎下载并试用。------------------------------------------------------------------------------------------下面是代码（如果不想下载可以直接看，不过强烈建议亲身体验）---------------------</summary><published>2009-12-17T02:42:00Z</published><updated>2009-12-17T02:42:00Z</updated><author><name>陈梓瀚(vczh)</name><uri>http://www.cnblogs.com/geniusvczh/</uri></author><link rel="alternate" href="http://www.cnblogs.com/geniusvczh/archive/2009/12/17/1626184.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/geniusvczh/archive/2009/12/17/1626184.html"/><content type="text">  做这个小demo（下载）主要是为了解决如何在ListView上排序大量数据的问题。  这个Demo窗口上的ListView有一百万个项目，点了“Sort”之后就会开始排序。但这个排序跟以往的不同，你看到哪里它排到哪里，但这个排序不仅仅是在窗口内部排，而是你看到的内容都是正确的。  举个例子，你在浏览1000-1020条的时候，我会开始排序（当然有一点点延迟，不过不会卡窗口），然后确保1000-1020一定是【全局中的】第1000小到第1020小的，就如同全部排过序一样。而且还有一个副作用，就是小于1000的全部比1000小，大于1020的全部比1020大（这可以让你继续浏览的时候排序迅速收敛，而且这听起来应该很熟悉，嘿嘿）。  欢迎下载并试用。------------------------------------------------------------------------------------------下面是代码（如果不想下载可以直接看，不过强烈建议亲身体验）---------------------</content></entry><entry><id>http://www.cnblogs.com/geniusvczh/archive/2008/11/09/1330221.html</id><title type="text">学生做的正则表达式引擎提供下载！</title><summary type="text"/><published>2008-11-09T13:36:00Z</published><updated>2008-11-09T13:36:00Z</updated><author><name>陈梓瀚(vczh)</name><uri>http://www.cnblogs.com/geniusvczh/</uri></author><link rel="alternate" href="http://www.cnblogs.com/geniusvczh/archive/2008/11/09/1330221.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/geniusvczh/archive/2008/11/09/1330221.html"/><content type="text"/></entry><entry><id>http://www.cnblogs.com/geniusvczh/archive/2008/09/06/1285749.html</id><title type="text">Syngram Helper实验：读入文法文件动态生成语法分析器</title><summary type="text">我们知道Yacc和Bison都是产生C++的代码作为编译器的前端的。但是有时候我们需要动态地产生一个编译器前端，极端一点讲，譬如“文法调试器”。调试器总不能动态生成.y文件，让yacc编译，让gcc再度编译，然后execute，最后将程序的输出结果读进来。这样就太麻烦了，于是我们需要重新写一个生成编译器前端的程序。</summary><published>2008-09-06T10:56:00Z</published><updated>2008-09-06T10:56:00Z</updated><author><name>陈梓瀚(vczh)</name><uri>http://www.cnblogs.com/geniusvczh/</uri></author><link rel="alternate" href="http://www.cnblogs.com/geniusvczh/archive/2008/09/06/1285749.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/geniusvczh/archive/2008/09/06/1285749.html"/><content type="text">我们知道Yacc和Bison都是产生C++的代码作为编译器的前端的。但是有时候我们需要动态地产生一个编译器前端，极端一点讲，譬如“文法调试器”。调试器总不能动态生成.y文件，让yacc编译，让gcc再度编译，然后execute，最后将程序的输出结果读进来。这样就太麻烦了，于是我们需要重新写一个生成编译器前端的程序。</content></entry><entry><id>http://www.cnblogs.com/geniusvczh/archive/2008/08/27/1278047.html</id><title type="text">Syngram Helper开始设计：一个能用来写编译器的工具</title><summary type="text">大概一年前曾经用C++开发了一个可以在C++中直接写上下文无关文法的上下文无关文法分析器。这玩意儿叫Syngram。Syngram曾经做了两次，第一次做成了用一个类去读文法文件，后来不爽就改成了直接在C++里面写的。我弄了一个叫Term的类，重载了一些操作符，于是你可以搞分支、可选、错误处理等复杂的文法推导式。现在打算做一个周边工具。</summary><published>2008-08-27T13:07:00Z</published><updated>2008-08-27T13:07:00Z</updated><author><name>陈梓瀚(vczh)</name><uri>http://www.cnblogs.com/geniusvczh/</uri></author><link rel="alternate" href="http://www.cnblogs.com/geniusvczh/archive/2008/08/27/1278047.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/geniusvczh/archive/2008/08/27/1278047.html"/><content type="text">大概一年前曾经用C++开发了一个可以在C++中直接写上下文无关文法的上下文无关文法分析器。这玩意儿叫Syngram。Syngram曾经做了两次，第一次做成了用一个类去读文法文件，后来不爽就改成了直接在C++里面写的。我弄了一个叫Term的类，重载了一些操作符，于是你可以搞分支、可选、错误处理等复杂的文法推导式。现在打算做一个周边工具。</content></entry><entry><id>http://www.cnblogs.com/geniusvczh/archive/2008/08/15/1269022.html</id><title type="text">开博开博</title><summary type="text"/><published>2008-08-15T14:39:00Z</published><updated>2008-08-15T14:39:00Z</updated><author><name>陈梓瀚(vczh)</name><uri>http://www.cnblogs.com/geniusvczh/</uri></author><link rel="alternate" href="http://www.cnblogs.com/geniusvczh/archive/2008/08/15/1269022.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/geniusvczh/archive/2008/08/15/1269022.html"/><content type="text"/></entry></feed>
