大连对日外包程序员如何提高自己基础水平以及一些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就是这么简洁明朗!

C#初级程序员培训计划Junior Developer training plan

初级程序员培训计划

非技术培训目标

1)了解熟悉公司工作流程
2)如何进行团队合作,计划以及任务分解训练
3)一些有用的工作习惯养成锻炼,个人时间管理
4)演讲技能、英语技能、领导力提升
5)自学能力、解决问题能力的培养

 

技术培训目标

力争四个月时间将新人从C#新新手变成比较靠谱的C#程序员。

培训以个人阅读、实做为主,每天进行检查反馈,
每周有个可运行成果以及学习目标,每个月有个具有实用性完整的项目结果。

 

1)C#基础知识部分精读

http://msdn.microsoft.com/en-US/library/67ef8sbd%28v=VS.100%29.aspx
http://msdn.microsoft.com/en-US/library/618ayhy6%28v=VS.100%29.aspx
从1.0开始每个版本的What’s New精读。

时间:三到四周
结果:PPT,以及部分知识点的demo

2)C#代码示例解读

http://1code.codeplex.com/
http://msdn.microsoft.com/en-US/library/z9hsy596%28v=VS.100%29.aspx

时间:两周
结果:PPT,以及部分代码项目实际运行调试

3)C#常见手筋以及WPF/SilverLight/WCF使用

http://msdn.microsoft.com/en-US/practices
<Effective C#>
<More Effective C#>
<C# cookbook> http://go.microsoft.com/fwlink/?linkid=195369
<C# design pattern> http://go.microsoft.com/fwlink/?linkid=195402
SL数据绑定,CRUD操作
WPF的RSS阅读器以及本机ServiceBus的实现

时间:六周
结果:阅读笔记以及项目Demo

4)C#高级话题泛读以及快速应用

http://msdn.microsoft.com/en-us/vcsharp/aa336800
<CLR via C#>
垃圾收集等等

interview question for senior engineer
http://www.hanselman.com/blog/NewInterviewQuestionsForSeniorSoftwareEngineers.aspx

时间:两到三周
结果:PPT,以及部分代码项目实际运行调试

5)C#规范specification阅读,C#编程规范

http://msdn.microsoft.com/en-US/vcsharp/aa336809.aspx

时间:一周到九天
结果:PPT

6)C#开源项目快速阅读及应用,辅助工具使用

http://www.codeplex.com
http://csharp-source.net/
“mono project”

丰富多彩的一天

傍晚,走到家附近卖鱼汤包的店铺就有点拿不动腿了,中午吃得不多,下午消耗太大,看小潘潘发短信来说饿了,我也突然感觉饥肠辘辘,走进去要了碗馄饨边用手机上网边等,还真是饿了,感觉时间那么漫长,百无聊赖中发现了座上的“魔力星座宝贝”,突然就来了兴致,别说,一块钱没白花,讨了个吉运,哈哈。虽然上面只有四项有关运势的,说的却挺准。

                                   *运势:想放轻松,让自己悠哉一下。                               准确  最近的确有点儿疲惫,工作太努力:)

                                    *爱情:何不安排玩乐的节目,有机会遇到艳遇。             胡扯  已婚妇女艳遇就算了

                                    *财运:财运一般,没什么大的开销。                               精辟  除了晚上买菜没有额外花费,吃饭洗澡有人请啦,哈哈

                                    *工作:完全把工作抛诸脑后。                                          神了  压根儿就没干活,相当于翘班一天

一大早就跑到关系单位报到,简单整理数据后就聊天上网,这所谓的工作真是轻松加愉快啊,哈哈。和小潘潘一起跟着人家去吃川菜,当然也可以说成被请,细节自不必言表,反正席间总总挺搞笑。

酒足饭饱后跑去高档洗浴中心,美美地洗澡喝茶,因为特殊时期,麦饭石那个屋子俺喜欢,恨不得把自己全埋起来才好。我右边的膝盖受到了我特别优待,谁让它阴天下雨和特别日子之前总是酸溜溜难受,不知往哪里搁呢?小潘潘回去值晚班,我又大大地高兴一把,上次录数据我吭哧瘪度回去的不爽抛诸脑后咧。这一高兴又蒸了会儿,算是彻底透了,出来在大堂坐了半天脸还是红通通的,鼻尖的汗也是渗了一层又一层,担心感冒足足做了一半个小时,又是手机上网偷菜加回复留言。没忘顺手拍了几张照片留着得瑟……

我这成倒叙还是插叙了,馄饨快吃完时发现邻座八九岁男孩戴着眼镜在昏暗的灯光下看书,职业病犯了,跟他妈妈叨咕了几句近距离用眼和用镜的注意事项,有点儿好为人师了,不知人家是否领情呢,怎么跟小潘潘似的,哎!去菜场买一大堆东西,居然顺手还买了坠子,明儿去配个挂绳,嘻嘻。看着它我就喜欢就想跟着笑……

人一开心就爱管闲事儿,看见楼梯上一十一二岁的女孩儿哄她两三岁的弟弟,不免怜惜起来,小小儿啼哭不止,鼻涕横流,小归宁手足无措,满头是汗,我弯下腰帮着哄哄,拿出湿巾让小姐姐给弟弟擦鼻涕,小小儿可能对那味道比较满意,止住了哭声,又对我手里大包小卷儿的东西有点儿垂涎,我立刻心领神会,拿了块儿蛋糕给他,姐姐说不好意思,弟弟却笑嘻嘻,在姐姐的要求下,男孩儿说了谢谢,我摆摆手乐颠颠儿往电梯跟前走去,这也算助人为乐吧,哦?

一人吃饱全家不可能不饿啊,那个赚大钱的还没回来呢,水果是命菜饭也不能少啊,营养餐咱是少不了的。晚上青菜豆腐伺候着,不知人家满意否,瞧我多不容易,还得看人脸色活着,上班得给人家做饭,休息得给人家做饭,出去吃喝玩乐回来还得给人做饭,不管人家都说我贤惠呢,行了,今天得瑟得不轻,记账也没力气了,很久不写估计回头检查又得被批,还是贴照片,收工吧。

 

P29-06-11_15.37[01]P29-06-11_15.44P29-06-11_20.07P29-06-11_20.08P29-06-11_23.13P29-06-11_23.14

Lua编程、弱引用、招DotNet程序员

Lua社区最近有很多值得关注的新闻,第一条毫无疑问是Lua5.2.0接近release,最新一版Lua 5.2.0 (beta-rc4)(http://www.lua.org/work),按照作者Luiz Henrique de Figueiredo的说法,大概还有一个多月时间就应该能看到release版本了。Lua5.2.0比较值得关注的是增加了一个关键字(goto),可以通过goto实现continue的功能,所以不出意料的依然没有continue,在twitter上云风回复说他统计了一下自己某个代码,里面好像也是continue远远少于goto的使用。另外还是要赞叹Lua作者的牛逼,现在Lua大概还是二十几个关键字,其它语言上百个关键字的伤不起啊!你都记不全!

另一个新闻是LuaJit也接近release版,现在是2.0.0 Beta8,http://luajit.org/download.html 对于性能追求者来说,LuaJit是一个很好的选择,但是支持平台不够多(比如我的PowerPC啊)。最新一版对于ARM的支持是亮点,啥Android、iPhone的,统统都支持。另外FFI Library也是亮点,这个功能可以极大地提高对C API的开发支持。

在新浪微博上(我的微博是http://weibo.com/sagasw )有人问我,学习Lua与C交互,什么项目比较好。下面是我的建议:

1)主要用Lua,想用C作为模块支持某些特性。如果你想完成类似程序,那么Lua自己的module毫无疑问是最好的学习项目,比如5.2.0中的lbitlib.c、ldblib.c、lstrlib.c、ltablib.c,都是通过Lua API开发出来的。另外比如LuaSocket、LuaFileSystem都是很常用的模块,学学也都不错。

2)主要用C,想用Lua作为动态支持。如果想达到这个目的,可以参考Programming In Lua(可以在网上免费阅读下载)中的示例。与1)也差不多,基本上都是通过Lua stack来与Lua访问。1)和2)基本上编程方式是共通的。

另外可以参考这个项目http://labix.org/lunatic-python,可以实现Lua与Python互操作,类似项目还有http://pypi.python.org/pypi/lupa/0.17 

 

Weak Reference是一个编程领域通用的概念,在http://en.wikipedia.org/wiki/Weak_reference 这里可以看到比较详细的介绍。DotNet中就有WeakReference这个概念,另外Lua有Weak Table概念。弱引用是指在有垃圾收集机制的程序语言中,常规情况下对某个对象的引用都是强引用,比如a=b,a就引用了b,如果b在其它地方不再被使用,但是a依然存在有效,那么b就仍然是可达的(reachable),或者用引用计数这方式来讲,就是reference count仍然大于0。但是这有一点问题,是我以前碰到过的。

我在某个项目的性能改进中引入了cache机制,有一个全局的对象缓存管理器。我的实现很简单,就是用一个vector保存对象指针,在类析构函数中查找对象缓存管理器,决定是否真正释放对象,还是说仅仅把对象放到管理器中。

由于代码写得不是很完美,其中有一个问题,就是指针在缓冲管理器中放着,但是实际对象实例已经被释放了。也就是说,为了真正释放对象实例,需要做两步才正确:第一步是查找缓存管理器,查找删掉里面的指针引用,第二步是真正释放对象。

很麻烦是不是。对于C#这样的没有确定析构时间的编程语言来说,也有类似问题。我们举一个很典型的例子,如下图所示(from http://diditwith.net/2007/03/23/SolvingTheProblemWithEventsWeakEventHandlers.aspx):

EventLeak

可以看到当myForm释放,但是没有移除handler,那么handler指向就有问题。

强引用的另外一个问题是会影响垃圾收集。比如我前面那个需要,如果把引用存放到某个全局对象管理器,那么GC会认为这个对象是可达的(reachable),没法正确的释放了。

弱引用就是完成这个目的,一个弱引用对象,可以通过对Target是否为空来判断引用对象是否已经释放,而且不会影响垃圾收集有效性。实现方式(好像是)与我前面提到的也很类似,对象析构时,先从某个全局的弱引用队列中把相关Target删掉,然后再析构(所以弱引用是会影响一点点性能)。

 

最近在找两个DotNet程序员,最好是有两三年开发经验,如果有WPF/SilverLight经验最好,要求DotNet知识牢固,对编程有兴趣,另外有较强的自学能力,英语能够进行基本对话交流。有意者请发简历到sagasw#gmail.com(替换#哦)。

我的新技术生活、培训学校及六一儿童节

第一件事,最重要。

四月初,我换工作了。离开了工作八年的罗克韦尔,到了另一家单位。生活变得忙碌,但是感觉很充实。

罗克韦尔这是一家好单位,可惜的是我没有随之一起成长,走了不少弯路。如果能穿越或者回溯,估计很多事情可以做的更好。感想很简单:如果你在某公司,觉得呆着没意思或者不受重视,早点离开为好。另外建议大家多看看《职来职往》这个节目,里面达人提供的经验很宝贵,我后悔没早看到。

第二件事,关于做人的底线。

最近在csdn上看到“著名的”传智培训的老师张孝祥替人写技术面试题,以至于都累病了。这件事太让人感动了。一个没有底线,不知什么是对错好坏,逻辑思维混乱,善于偷换概念转移话题的人都可以创业成功,还在微博上受到csdn某大腕的吹捧,那还有什么不能做的?只要敢做,错事都能都敢吹的全世界都知道。最可贵的是,还有很多人鼓吹叫好,为之呐喊助威,所以说现在,成功真的很容易复制,只要你没有底线。

第三件事,关于孙秀楠。

六一那天中午给家里打了个电话,萌萌接电话告诉我她在看书。我感觉很难过,六一没法带她出去玩。其实我应该请假领她出去的。好在也没必要后悔,周末好好出去玩玩,补偿她一下。