博客

  • 大连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可以说是一个胜利的大会,一次奋发向上的大会,一次令人斗志昂扬的大会,一次红旗飘飘的大会。。。。。。

  • String s = new String("xyz");创建了多少个String实例?

    在”传智播客DotNet面试宝典(改).pdf“有这样一道非常有意思,也比较有深度的题目。

    String s = new String(“xyz”);创建了多少个String实例?

    传智的老师告诉同学们:答案是两个,一个是”xyz”,一个是指向”xyz”的引用对象。

    貌似很正确,很有道理。没错,”xyz”是一个字符串,而DotNet字符串(其实Java也是)有驻留intern这样一种机制。

     

    抱歉的是,传智的老师没有料到,问这个问题的同学或者是公司太坏了。这道题的题目是错的,答案也不对。

    大家手头有visualstudio的可以建立一个console程序试试看,能不能编译通过?!

    至于答案为什么也不对,看看这篇非常详细的解释吧,虽然作者解释的是针对Java语言。

    http://www.iteye.com/topic/774673

    为什么Java能这样写?因为Java有这种构造函数String(String original)而DotNet中的String类没有。

    稍微修改让它能够编译

            static void Main(string[] args)         {             char[] chars = { 'w', 'o', 'r', 'd' };             String s2 = new String(chars);             String s3 = new String(chars);             int i = s2.Length;             int j = s3.Length;             Console.WriteLine(i + j);         }

    如果我们用ILSpy看,结果如下,注意,其中只调用了两次newobj,分别是针对s2和s3。

     

    .method private hidebysig static
    void Main (
    string[] args
        ) cil managed
    {
    // Method begins at RVA 0x2058
    // Code size 57 (0x39)
    .maxstack 3
    .entrypoint
    .locals init (
            [0] char[] chars,
            [1] string s2,
            [2] string s3,
            [3] int32 i,
            [4] int32 j
        )
        IL_0000: ldc.i4.4
        IL_0001: newarr [mscorlib]System.Char
        IL_0006: dup
        IL_0007: ldtoken field int64 ‘<PrivateImplementationDetails>{06FAE1C3-0E45-4AE7-A401-B8A7D1EFF5D6}’::’$$method0x6000001-1′
        IL_000c: call void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array, valuetype [mscorlib]System.RuntimeFieldHandle)
        IL_0011: stloc.0

        IL_0012: ldloc.0
        IL_0013: newobj instance void [mscorlib]System.String::.ctor(char[])
        IL_0018: stloc.1

        IL_0019: ldloc.0
        IL_001a: newobj instance void [mscorlib]System.String::.ctor(char[])
        IL_001f: stloc.2

        IL_0020: ldloc.1
        IL_0021: callvirt instance int32 [mscorlib]System.String::get_Length()
        IL_0026: stloc.3

        IL_0027: ldloc.2
        IL_0028: callvirt instance int32 [mscorlib]System.String::get_Length()
        IL_002d: stloc.s j

        IL_002f: ldloc.3
        IL_0030: ldloc.s j
        IL_0032: add
        IL_0033: call void [mscorlib]System.Console::WriteLine(int32)
        IL_0038: ret
    } // end of method Program::Main

  • 大连对日外包程序员如何提高自己基础水平以及一些C#的资料链接

    我在推上发了一些牢骚,有些朋友来面试,基础不是很扎实,理由是自己一直做对日外包,没有机会提升自己,掌握一些基础内容。

    另外一个理由是公司只用了某某技术,没有用某某技术,只用了2.0,所以我不知道3.5、4.0等等。

    这都不是理由。

    这都不是理由!

     

    这时候我假设自己是一个对日外包企业的程序员,吃完饭后老婆在看电视,我拿起Thinkpad笔记本,登录进著名的MSDN,开始继续自我提升的步骤。

    坚持每天抽出半小时到一小时学习,足够你提升自己的水平!

    这次也不推荐书了,只要能上网,就每天看一段MSDN的文章或者代码。保证能提高自己!

     

    首先要知道自己缺少什么,有一个评估很有意思也很容易评估自己需要提升哪些地方:《程序员能力矩阵》http://static.icybear.net/%5BCN%5DProgrammer%20competency%20matrix.htm 这里假定我想提升Windows平台上DotNet、CSharp开发。

    这里有一系列链接可以学习,每天一篇或者几天一篇应该没问题。其实比较好的办法是买本书系统学习,但我这里想说的是,资料到处都是,书籍唾手可及。

     

    没用心不努力才是水平差基础薄弱的最大原因!

     

    下面的链接没有什么系统性,如果有一两年经验了,看这些东西问题不大。

    http://msdn.microsoft.com/en-us/library/3bwa4xa9.aspx Using Objects That Encapsulate Resources

    这一篇要着重提一下,很多四五年经验的C#开发者,不知道using关键字的这种用法,怎么说呢,说你不求甚解好呢?还是说你不够努力好呢?

     

    http://msdn.microsoft.com/en-us/library/dd642420.aspx Visual Studio 2010 Visual Basic and Visual C#

    http://msdn.microsoft.com/en-us/library/618ayhy6.aspx C# Reference

    http://msdn.microsoft.com/en-us/library/67ef8sbd.aspx C# Programming Guide

    http://msdn.microsoft.com/en-us/library/dd460655.aspx Programming Concepts

    http://msdn.microsoft.com/en-us/library/w0x726c2.aspx .NET Framework 4

    http://msdn.microsoft.com/en-us/library/w0x726c2%28VS.90%29.aspx .NET Framework 3.5

    http://msdn.microsoft.com/en-us/library/ff921347.aspx EnterpriseLibrary Unity MEF Prism这些概念,至少知道它们是什么

    http://msdn.microsoft.com/zh-cn/magazine/default.aspx MSDN杂志

    http://msdn.microsoft.com/en-us/library/orm-9780596516109-03.aspx C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0 programmers

    http://msdn.microsoft.com/en-us/library/orm-9780596527730-01.aspx C# 3.0 Design Patterns: Use the Power of C# 3.0 to Solve Real-World Problems

     

    http://msdn.microsoft.com/en-us/library/k5532s8a.aspx .NET Framework 4 CLR Managed Execution Process

    http://msdn.microsoft.com/en-us/library/f144e03t.aspx Automatic Memory Management (GC)

    http://msdn.microsoft.com/en-us/library/ee787088.aspx Fundamentals of Garbage Collection

    http://msdn.microsoft.com/en-us/library/ms404247.aspx Weak References

    http://msdn.microsoft.com/en-us/library/ms172334.aspx Reflection and Generic Types

    http://msdn.microsoft.com/en-us/library/a4a92379.aspx Accessing Custom Attributes

    http://msdn.microsoft.com/en-us/library/ff519622.aspx Observer Design Pattern Best Practices

    http://msdn.microsoft.com/en-us/library/sd10k43k.aspx Interoperating with Unmanaged Code

    http://msdn.microsoft.com/en-us/library/hyz69czz.aspx Managed Threading Basics

    http://msdn.microsoft.com/en-us/library/ms973850.aspx Microsoft .NET Framework FAQ

    http://msdn.microsoft.com/en-us/library/ms973837.aspx Garbage Collector Basics and Performance Hints

    http://msdn.microsoft.com/en-us/library/bb985748.aspx Displaying Metadata in .NET EXEs with MetaViewer

    http://msdn.microsoft.com/en-us/library/ms973858.aspx Writing High-Performance Managed Applications : A Primer

    http://msdn.microsoft.com/en-us/magazine/cc164086.aspx Implementing Coroutines for .NET by Wrapping the Unmanaged Fiber API

    http://msdn.microsoft.com/en-us/library/aa479866.aspx Generics FAQ: .NET Framework

    http://msdn.microsoft.com/en-us/library/aa479858.aspx Generics FAQ: Best Practices

    http://msdn.microsoft.com/en-us/library/aa479859.aspx Generics FAQ: Fundamentals

    http://msdn.microsoft.com/en-us/library/aa302329.aspx Improving String Handling Performance in .NET Framework Applications

    http://msdn.microsoft.com/en-us/library/ms973880.aspx The Microsoft Shared Source CLI Implementation Refresh

    http://msdn.microsoft.com/en-us/library/bb985613.aspx Migrating Native Code to the .NET CLR

    http://msdn.microsoft.com/en-us/magazine/cc164123.aspx Calling Win32 DLLs in C# with P/Invoke

    http://msdn.microsoft.com/en-us/magazine/cc164139.aspx The CLR’s Thread Pool

    http://msdn.microsoft.com/en-us/magazine/cc164094.aspx Introducing Generics in the CLR

    http://msdn.microsoft.com/en-us/library/ms973893.aspx Object Serialization in the .NET Framework

    http://msdn.microsoft.com/en-us/library/ms973872.aspx An Overview of Managed/Unmanaged Code Interoperability

    http://msdn.microsoft.com/en-us/library/ms973838.aspx Performance Considerations for Run-Time Technologies in the .NET Framework

    http://msdn.microsoft.com/en-us/library/ms973839.aspx Performance Tips and Tricks in .NET Applications

    http://msdn.microsoft.com/en-us/library/aa302338.aspx Primary Interop Assemblies (PIAs)

    http://msdn.microsoft.com/en-us/library/bb264782.aspx Profiler Stack Walking in the .NET Framework 2.0: Basics and Beyond

    http://msdn.microsoft.com/en-us/library/aa302324.aspx Using the .NET Framework SDK Interoperability Tools

    http://msdn.microsoft.com/en-us/library/ms973826.aspx Using the ECMA Standards: An Interview with Miguel de Icaza

  • C语言中if (p==NULL)的是与非

    博客园cnblogs不知为何最近开始渐有C语言开发重启的迹象,不少人开始写一些C语言的教程。

    其中看到一段有趣的留言,提到这个写法:if (p == NULL),

    有人说这是不好的~,经典不提倡的~,会写错出问题的~,华为都禁止的~。

     

    我倒是有些不同的看法。

     

    首先这种写法是有问题,一般来讲对于空指针可以这样写

    if ( p )

    或者反义是这样 if ( !p )

    既简单,还节省字数。

     

    如果是想写的比较容易懂,那么if (p == NULL) 是我提倡的方式。

    你可以很简单的读成“如果p等于空值”,反过来的方式NULL==p就有些别扭,不是给人看的。

     

    有人提到p==NULL很容易写成p=NULL,代码出错啦!会有bug啦!

     

    好吧,我承认这是一种可能性,在早期编译器不完善的时候的确如此。那时候还提倡用匈牙利命名法,因为编译器对类型识别支持不好,很容易写出胡乱转型的代码(当然现在的C语言也容易)。但是针对正在使用的编译器以及将来更先进的编译器,在条件判断中使用p==NULL不是问题。

     

    做一个很简单的实验,使用VC2010,项目设置为compile as C,注意关键一点“把warning级别提高到最高级别4”,这时候if (p=NULL )会得到如下警告:

    1>purec.cpp(10): warning C4706: assignment within conditional expression

    很简单吧,不需要你使用那种反人类常识的代码规范。

     

    使用GCC(v4.5.2 in Ubuntu11.4)也很容易,它有一个编译选项-Wall,警告信息如下:

    /home/sun/foobar-sample/main.c:24:2: warning: suggest parentheses around assignment used as truth value

     

    如果工具支持,为何不使用一种更为合乎阅读习惯的方式呢,BTW,我查找了一下经典的K&R,其中==的使用都是我提到的p==0这种方式,其它更为经典的(有么?)我就不知道了。

  • Python程序员培训计划

    Python程序员很幸福,因为他们不需要像C#程序员那样东一榔头西一棒子的找资源学习。

    把下面资源按顺序学完,代码都自己手敲过,应该就是初级以上水平了。

    http://docs.python.org/py3k/tutorial/

    之所以选择py3k,是感觉新版本的生命力应该更长久一些。

     

    学完tutorial,再看看这个Python竞赛,花个一两周时间搞定它。

    http://www.pythonchallenge.com/

     

    最后看看这本书,了解一些有趣的话题

    http://product.china-pub.com/195771

     

    如果有问题,搜索一下“python cookbook”或者到google新闻组python.cn发文都应该很快得到答案(只要你问的靠谱)

    https://groups.google.com/forum/#!forum/python-cn

     

    简单吧,Python就是这么简洁明朗!