关于线程Thread、协程Coroutine、生成器Generator、yield资料

关于Green Thread(绿色环保线程)、Native Thread,以及线程的一些普及问题,下面这个presentation最为翔实

http://www.slideshare.net/tmm1/threaded-awesome-1922719

另外毫无疑问要看看维基百科上的这一条 http://en.wikipedia.org/wiki/Thread_%28computer_science%29

 

如果你像我一样也喜欢Lua这个支持协程http://en.wikipedia.org/wiki/Coroutine (或者我们可以称之为Green Thread)特性的编程语言,这一篇论文非常值得参考,印象中这一篇论文以及《revisiting coroutine》介绍了为什么Lua不实现抢先式以及continuation的设计思路 www.inf.puc-rio.br/~roberto/docs/corosblp.pdf  http://www.inf.puc-rio.br/~roberto/docs/MCC15-04.pdf

这一篇教程可以帮助你了解Lua协程的基本用法http://lua-users.org/wiki/CoroutinesTutorial 

有人也许质疑Lua的协程功能不支持C函数扩展,那么可以试试大名鼎鼎的LuaJit作者出品的Coco http://coco.luajit.org/ 

喜欢中文资料的可以参考TimYang这篇介绍http://timyang.net/lua/lua-coroutine/ 

另外如果想实战使用的可以试试copas http://keplerproject.github.com/copas/manual.html

我也有翻译一篇Lua协程与Python Generator比较的文字 http://sunxiunan.com/?p=1654

还有使用Lua协程实现斐波拉切 http://sunxiunan.com/?p=1689

 

关于Native Thread,还有一个词语叫做Fiber纤程,意思是比纤程更细微轻量,好像Pthread和Windows都有支持。印象中看到过一篇文字说C#的yield就是利用Fiber实现,这个问题先放着。http://en.wikipedia.org/wiki/Fiber_%28computer_science%29 另外也有人称之为绿色环保线程 http://en.wikipedia.org/wiki/Green_threads

Erlang也有类似术语,叫做Green Process,大致意思差不多(?)。

Python相关概念http://en.wikipedia.org/wiki/Generator_%28computer_programming%29

前面提到了一个continuation概念 http://en.wikipedia.org/wiki/Continuation 不过好像前面Lua论文里面提到过,设计一个正确continuation的程序太复杂(就我看来能正确理解coroutine这种简化级别continuation的都不容易),所以很少有程序语言支持(smalltalk?)。

DotNet程序员面试问题评估

欢迎各位Dotnet程序员回答。不需要回答出具体问题,只要标记大致程度即可。
1什么是DotNet的CLR? CLR作用是什么?

A不知道     B知道很少    C知道一些    D非常了解

 

2 DotNet中如何使用Win32的DLL?(没有reference可以添加)

A不知道     B知道很少    C知道一些    D非常了解

 

3 C#使用什么关键字实现可变个数参数(variable number parameters)?

A不知道     B知道很少    C知道一些    D非常了解

 

4 C#中的weak reference是什么?用于什么场合?

A不知道    B知道很少    C知道一些    D非常了解

 

5 C#中的using dispose模式是什么?用于什么场合?

A不知道     B知道很少    C知道一些    D非常了解

 

6 C#中Garbage Collection是什么?简介GC的internal工作方式(如果你是微软开发人员,如何实现GC)?

A不知道     B知道很少    C知道一些    D非常了解

 

7 C#中的关键字as, yield, out/ref, virtual/abstract/override?

A不知道    B知道很少    C知道一些    D非常了解

 

8 Strong name signature是什么?有什么用?

A不知道     B知道很少    C知道一些    D非常了解

 

9 字符串intern暂留机制是怎么一回事?

A不知道     B知道很少    C知道一些    D非常了解

 

10 Windows平台下多进程通讯方式?越多越好

A不知道     B知道很少    C知道一些    D非常了解

 

11 Delegate, Event, Action, Func都是什么?

A不知道    B知道很少    C知道一些    D非常了解

 

12 MVC, MVP, MVVM设计模式?

A不知道     B知道很少    C知道一些    D非常了解

 

13 除了工厂模式和单例模式,列举并且简单介绍你知道的设计模式以及应用场合?

A不知道     B知道很少    C知道一些    D非常了解

 

14 C#中overload和override如何实现?

A不知道     B知道很少    C知道一些    D非常了解

 

15 接口和抽象类有什么区别?都应用在什么场合?

A不知道     B知道很少    C知道一些    D非常了解

 

16 LINQ是什么?写一个简单的LINQ语句?

A不知道     B知道很少    C知道一些    D非常了解

 

17 C# Lambda是什么?写一个简单的lambda?

A不知道     B知道很少    C知道一些    D非常了解

 

18 C#中class与struct区别?

A不知道     B知道很少    C知道一些    D非常了解

 

19 是否听说过或者了解MEF, Unity, Prism?

A不知道     B知道很少    C知道一些    D非常了解

 

20 面向对象设计思想/原则有哪些?(SOLID)

A不知道     B知道很少    C知道一些    D非常了解

 

21 如何实现一个plugin插件可扩展系统?

A不知道     B知道很少    C知道一些    D非常了解

 

22 DotNet中的LinkedList与SortedList有什么不同?内部如何实现?

A不知道     B知道很少    C知道一些    D非常了解

 

23 设计一个字符串类(不能使用类库中的string class)?简要说明关键方法

A不知道     B知道很少    C知道一些    D非常了解

 

 

大连InfoQ活动QClub记事-35岁程序员这个坎如何进行职业规划

2011年的7月23日必定会成为一个令人难忘的日子,因为这一天发生了太多神奇的新闻。不过这里想说的是大连IT从业者、程序员的一次聚会,是由InfoQ组织的QClub。

(下文中提到的推,是指的twitter,而微博指的是新浪微博)

大概一两个月之前,有人在微博上提醒我,@侯伯薇 会组织一次大连的QClub活动。这个事让我感觉很兴奋、很开心。

作为程序员,会经常被人搭上各种各样固定的tag,比如“宅”,比如“闷”、“无聊”,“不会沟通”,“害羞”,“冷笑话”等等。QClub不能说是宅男们的反击,而应该说是程序员期待与人面对面沟通交流的那种感觉。在这个时候,一个名字、一个ID会变得更鲜活生动,更加有生命力。

早上起来发现天气极为恶劣,@gamtin在推上说,也许又要像去年Python用户组那次(大连Python用户组活动简记)的天了,好在接近中午的时候雨渐渐小了,而且天气也开始放晴。侯伯薇在微博上发消息说,他已经出发去会场准备了。

我也提前一小时出发,到的时候大概是一点左右(定的是一点半开始),屋子里还没有几个人,前面有两三个人在准备电脑神马的,由于去的早,InfoQ的海报也还没有放在会议室外面,我是好一顿撒磨(大连话,意为探头探脑的看)才敢进去,吼吼。

过了十几分钟,侯伯薇与欧兰辉 @ouland 一起到了,侯伯薇看上去比网上感觉的要年轻,这也是搞技术的最大好处啊!!我们简单交谈了几句,提到了这次InfoQ对于大连程序员以及搞IT方面的朋友,真是极为难得。侯伯薇提到了百年人寿对本次活动提供赞助。

IMG_20110723_141051这次QClub主要是三个议题,由于是架构专场,演讲议题都与架构有关系。首先是时代麦微(follow5)的CTO张爽介绍了follow5这个微博平台的架构。个人感觉由于不是太了解听众群兴趣、层次,张爽的presentation偏向于普及,我比较感兴趣的问题涉及的不多,也许是不方便,具体的数据也不多(比如具体架构选型,神马Linux用了神马开源项目,数据流量多少,哪个微博同步量更多,基于用户微博是否有二次数据挖掘的想法,如何盈利,下一步计划等等)由于我也是一个Open话题的主持人,所以就没法分身与张爽进行讨论。其实大言不惭的说一下,我对另外两个讨论话题或多或少都有涉及,比如微博同步,我有写过一个twitter同步到新浪、腾讯微博的小程序,用了GAE;再比如NodeJS,那件让人羞射的T恤就是我研究写文章得来的哦。

 

第二个话题是侯伯薇主讲的“选择合适的架构”。其中我觉得很关键很同意的观点就是,架构本身不是一成不变的,要根据具体的情况来做平衡(trade off)抉择,架构师之所以值钱,不是因为他们知道架构如何如何,而是他们知道在某种情况下应该选择什么架构、不应该选择什么架构技术,而且能够用代码把这种技术的可能性show出来。

 

第三个议题我这里也有参与,准备的话题是“35岁程序员这个坎,如何进行职业规划职业发展”,没想到参与的人也不少。欧兰辉在开始帮我撑了一会场子(后来这家伙跑到别的讨论组去了)。为什么要选这个话题?其实大家搜索一下各种招聘网站或者是各种博客就能发现“35岁为程序员应聘上限”“35岁以后不写程序,要搞管理”“35岁以后的程序员没有前途”之类的言论比比皆是。35岁以后就必须转型?不能搞技术?不是做管理就不行了?这次讨论组就想跟其他朋友一起探讨一下这个问题。

首先让大家做了一个简单的自我介绍,发现做了几年、接近35的开发者还不少,也有刚毕业入职的学生对前途比较迷茫,还有人对程序员这个职业很迷惑不知道该如何走,另外也有人关注程序员这个群体的健康问题。关注的点都非常有价值,我把问题记在便签上,后面慢慢讨论。

要说明的是,我提到的35岁程序员,指的是在这个年龄段可能是Senior Developer,可能是Leader或Manager,也可能是架构师,也可能是业余的移动App开发者;这里说的程序员,指的是35岁以及35岁以后还有兴趣继续编程,而且在工作中也能够继续编程,而且以编程为乐趣的IT从业者。如果把程序员局限在某个头衔下,天天看着式样书敲程序的码工(coding worker)那我也不同意35岁的时候还是这样。

在讨论中我提出一个观点,在总结的时候也是这样说的,就是程序员这个职业,在中国现阶段,赚钱方面比其他行业可能还要差一些,如果坚持做技术可能会有类似的问题。很多人选择程序员作为职业,是因为自己喜欢编程,喜欢编程中能控制一切的感觉,喜欢与电脑打交道的直接(而不是管理团队要考虑的麻烦事),或者说,编程就是一种业余爱好。如果觉得大连程序员收入低,可以试试北上广,或者试试肉身翻墙,学英文学日文的翻墙出去有啥用?我们这样搞技术的技术移民那就相对容易多了。另外也可以试试与志同道合的朋友一起搞搞App开发,虽然说现在不是那种一个人包打天下的时代,但是两三个高手做出一个应用程序,也不是不可能。最重要的还是要经营自己的品牌,把自己在这个圈子里变得知名,把技术功底打得扎扎实实,这样才有比较好的前途有比较多的选择方向。

有些朋友选择程序员,是因为就学的这个专业,也找不到别的好工作(类似工资水平下)。这时候我的建议是,在30岁之前考虑你的转型问题,30岁左右开始做转型。程序员在现阶段的中国,只能算是一个中等甚至中等偏下的行业,它的长久发展可持续性在中国体现的非常不够(在日美这些地方就不一样了)。所以说,但你仅仅为了养家糊口而选择成为程序员,要么早点考虑转行,要么早点出国多赚钱镀金。

大家讨论了一个多小时,在5点多的时候各位主持人做了总结发言。然后会议结束。

这次QClub可以说是一个胜利的大会,一次奋发向上的大会,一次令人斗志昂扬的大会,一次红旗飘飘的大会。。。。。。

System.Collections.Generic代码阅读笔记LinkedList SortedDictionary SortedList SortedSet

代码来自ILSpy分析结果,与实际代码可能有些微出入。手写版http://min.us/mqjnYB

从下面可以看到,LinkedList是双向链表,但是SortedList实际上使用的还是数组。

而SortedDictionary与SortedSet关系非常紧密。

 

LinkedList<T> 通过双向链表这种数据结构实现。

关键数据成员:LinkedListNode head;

很显然这是链表的头。每个Node会有Previous以及Next这样的property。

Find()功能通过遍历List实现,所以是O( n )

 

Queue<T> 先进先出的队列。

关键数据成员: T[] _array; 毫无疑问,是通过数组来存放数据。

_tail; _head; _size;

有头有尾有大小,基本就是这样。

关键操作Enqueue()入队列 Dequeue()出队列。

 

SortedDictionary<T> 键值对字典数据类型,接口是IDictionary<TKey, TValue>。

内部关键数据成员TreeSet< KeyValuePair<TKey, TValue> > _set;

而TreeSet继承了SortedSet,操作基本上都是通过类似这样:第一个值使用Key,第二个值使用Default(TValue) 构造产生,然后调用_set的相关操作。

 

SortedList<T> 排序列表

TKey[] keys;

TKey[] values;

_size;

Add(),通过Array.BinarySearch<TKey>找到索引位置,然后进行插入操作。O(log n)。

 

另外要说一下,这里面的比较都是使用了IComparer,这实际上使用了设计模式中的策略模式,让用户可以自己定制。默认情况下是使用Comparer<T>.Default.

 

SortedSet<T>

关键数据成员:SortedSet<T>.Node root;

插入操作为AddIfNotPresent()这个函数名字已经说明了一切。

内部构造使用的数据结构为红黑树(一种自平衡二叉搜索树),有IsBlack和IsRed,以及Left、Right这些property。

搜索、插入、删除都是O(log n)。

另外要注意其中的Reverse()函数,使用了yield return xxx;以及yield break;这两种用法。

 

Stack<T>

T[] _array; 后进先出,没啥可说的。

 

HashSet<T>

关键数据成员:

int[] m_buckets;

HashSet<T>.Slot[] m_slots;

 

Slot的定义如下:

internal struct Slot
{
    internal int hashCode;
    internal T value;
    internal int next;
}

搜索或者是插入算法基本上是这个路子:

int num = this.InternalGetHashCode(value);
for (int i = this.m_buckets[num % this.m_buckets.Length] – 1; i >= 0; i = this.m_slots[i].next)
{
    //if (this.m_slots[i].hashCode == num && this.m_comparer.Equals(this.m_slots[i].value, value))

}

这里是搜索,先算出一个哈希值,然后判断在那个桶中,拿到桶里面第一个元素(this.m_slots[i])。

然后通过next这个成员变量来获取下一个索引位置,然后对hash代码以及通过comparer比较。

450px-Hash_table_5_0_1_1_1_1_1_LL.svg

(图片来自http://en.wikipedia.org/wiki/Hash_table

 

插入操作也差不多,在这里面有一个this.m_freeList(一个int整数)保存了空闲列表位置,

然后把要插入的元素放在这个列表位置,再把m_freelist设置为这个列表位置的next。

因为空间可能不是连续的,所以我们使用的m_freelist这个位置与next未必是紧挨着的关系。

这个空闲列表的next关系维护,是由IncreaseCapacity()函数完成。其实C语言中的malloc函数也可以这样简单实现(当然实际中malloc肯定是复杂的多得多得多)。

 

ILSpy是个好东西,最新版本在这里下载http://www.ilspy.net/