July 2008 - Posts
[原文发表地址] Team Foundation Server - plays well with others...
[原文发表时间] Friday, July 25, 2008 8:46 AM
无论是在Visual Studio集成套件中,亦或是在客户/服务器端的集成应用中,TFS已经变得越来越流行.
这个世界大多存在并运行在一个多元化的环境里, 我们了解到开发人员使用各种不同的开发工具来创建他们的产品,并且不管使用什么工具或面向什么平台,开发人员都需要存储和访问他们的作品。
客户端的情况大部分都涉及到和一个已经存在的开发环境进行集成,因此在这些环境下创建的产品都可以使用TFS来管理, 下面是一些有关这种集成的例子:
· Teamprise – 一个合作伙伴提供的解决方案,使非windows平台的用户和windows上的Eclipse用户也能够使用TFS。
· MSSCCI client for TFS– 是一个IDE的扩展模型,它允许版本控制系统能够和各种IDE进行集成,比如 和VB6, VC6, VS2003, PowerBuilder等开发工具集成.
最新的一个和客户端集成的案例是最近发布的Microsoft Dynmics,这个集成版本允许Dynamics应用程序的开发人员使用TFS来存储他们的源代码,并将TFS集成到他们的IDE中,他们正研究在下一个版本中达到更深入的集成。你可以通过这里来了解更多有关Dynamic AX 2009的一些信息,并且通过阅读这份白皮书来了解如为Dynamics AX搭建TFS环境。
下面是一些有关TFS集成的屏幕截图:

Dynamics AX 2009中的集成开发环境:
服务器端的使用场景关于集成TFS和其他的ALM系统, 主要案例包括:
· TFS Migration & Synchronization toolkit – 是一个开源的类库,提供的功能允许客户和合作伙伴创建一些工具来帮助TFS和其他一些系统同步,或从其他系统迁移到TFS。
· ClearCase Synchronization tool – 是一个用TFS版本控制系统和ClearCase 系统同步的工具,它允许团队在TFS,或ClearCase任一环境中工作。
· Mercury Quality Center Synchronization – 这是一个我们正在开发的工具,它允许工作在QC中的测试团队和工作在TFS中的开发团队对这两个系统的bug记录进行同步。
所有这些集成使得我们更进一步确信,不管使用什么样的环境,每一个人都可以在团队开发中使用TFS。
Namaste!
我们在SharePoint上查看列表视图的时候,默认的那个Web部件(ListViewWebPart)提供了丰富且友好的功能,可以在上面进行排序、筛选等操作,每个列表条目上还有一个友好的下拉菜单。在2007中,SharePoint内置了一个类似的控件SPGridView来达到类似的效果,所以当我们需要显示一些其他数据的时候(例如来自SQL Server等),将数据绑定到SPGridView上就可以实现类似的排序和筛选效果,而不用写一行排序筛选相关的代码,下拉菜单的实现通过几行简单代码可以搞定。
关于SPGridView网上有很多文章介绍它的用法(例如jianyi的这篇文章,其中介绍了如何通过ObjectDataSource来显示一个SharePoint风格的数据视图,并有一个比较简单的下拉菜单,也可以做排序和筛选)。但是文章的后半部分,也就是如何显示SharePoint列表数据的部分,有比较大的问题,而且根据我搜索的结果,也很少有文章提到这个问题。
网上的一些例子在使用SharePoint列表作为数据源的时候,直接使用了SPDataSource来进行数据绑定。这个东西也是2007中新加上去的,配合SPGridView的一个控件,可以直接通过List属性绑定到一个SharePoint列表上。显示成那个样子没有问题,但是在排序和筛选的时候就有问题了。不知道那些文章的作者是否试过绑定SharePoint列表,反正在我这里用无代码方式是不能进行筛选的(排序似乎OK)。处理筛选的时候,一般介绍的方法是指定SPGridView的FilteredDataSourcePropertyName属性为“FilterExpression”、指定FilteredDataSourcePropertyFormat属性为“{1}='{0}'”,但是这种方法对于数据源为SPDataSource的SharePoint列表绑定是行不通的,因为SPDataSource并没有FilterExpression这个属性,也没有任何和筛选相关的属性,我也没找到其他解决筛选的方法。从这一点看来,我觉得SPDataSouce并不是一个完善的数据源实现,不知道在2009中会不会有改进。
其实解决SharePoint列表数据绑定的方法也很简单,那就是先把列表数据转换成DataTable(通过SPListItemCollection的GetDataTable方法),再用ObjectDataSource作为数据源绑定到SPGridView上,这样就可以实现不写代码的排序和筛选了(不过也有一些不如用SPDataSource的地方,放到后面再说)。
先来说筛选,关于SPGridView的筛选问题网上几乎所有的文章都提到了这一篇:Filtering with SPGridView。这篇文章主要说的内容有两点:第一、在SPGridView绑定的时候,如果希望实现筛选功能,那么在绑定时需要指定SPGridView的DataSourceID为ObjectDataSource的ID,而不能直接将DataSource指定为ObjectDataSouce;第二、默认情况下SPGridView的筛选和排序同时进行的时候会有问题(显示不合逻辑),文中给出了一种使用ViewState保存筛选条件的解决方案,在这里就不再赘述了。
然后说说数据绑定问题,SPGridView是不支持自动生成绑定列的,所以必须把AutoGenerateColumn设成false。一般我们在写asp.net的时候,绑定数据列使用BoundField控件,在SharePoint中有一个更好的选择,那就是SPBoundField。它的使用方法和BoundField完全一致,但是它对SharePoint的数据类型(也就是栏类型)做了处理,对超链接、多选、查阅项等内容都有比较好的处理,它的底层是调用了对应SPField的GetFieldValueAsHtml方法(所以,如果你希望这个东西能很好地显示你的自定义字段类型,你最好在实现自定义字段的时候把GetFieldValueAsHtml重写)。当然,这个所谓的“比较好的处理”指的是使用SPDataSource作为数据源。当我们使用ObjectDataSource绑定用GetDataTable方法获得的DataTable时,问题就出现了:多选项不能正常显示为多选(而是;#那种内部表示)、超链接不能显示为链接(显示为“url,说明”)、人员没有链接、最不能忍受的是多行文本都不是以html形式显示的,这是因为在GetDataTable的时候,SharePoint就已经做过一次数据转换了,即使用SPBoundField绑定,也会有问题。解决方法也有,就是实现一个自己的GetDataTable……其实也不麻烦。
最后,SPGridView是继承了GridView的,所以可以加“选择”功能,直接在最后加一列CommandField就行了。也可以通过一些trick的方法把选择按钮隐藏掉,然后实现单击一行的时候选中,比如下图:
当然,既然是继承了GridView,也可以做一些其他操作,比如加个按钮什么的。但是另一个问题又出现了,SPGridView在按钮列(或者那种下拉菜单)PostBack的时候,数据绑定失败。也有解决方案:SPGridView, SPMenuField, Grouping, Postback。
阅读本博客前,建议阅读我前一篇博客:IIS5、IIS6、IIS7的ASP.net 请求处理过程比较 这样知识会比较连贯。
对于 IIS6、IIS7, 每个应用程序池都会创建一个 W3WP.exe 进程。 但是, 并不是所有情况都是一个应用程序池对应一个 W3WP.exe 进程。 Web Garden , 或者一些异常发生时候,就会一个 应用程序池对应多个 W3WP.exe 进程。
Web Garden 指的是一个应用程序可以在多个进程(w3wp.exe)中来执行,一次请求使用其中的一个。用这个的主要目的是提高程序的可用性。当其中一个进程发生错误,那么也不会影响其他进程。发生错误的进程可以根据规则关闭,而其他的进程则可以继续工作。
需要注意的是:一般使用 InProc HttpSessionState / HttpApplicationState / 静态变量来储存关键信息 的程序是不支持 Web Garden的。
由于应用程序池会在没有请求的时候定时回收,或者发生错误的时候,自动重新建立一个处理进程 W3WP.exe 进程。如果你中大运,你可能会看到没有配置 Web Garden 时, 一个应用程序池对应多个 W3WP.exe 进程, 如这篇文章中提到的 http://www.eggheadcafe.com/forumarchives/inetserveriis/Feb2006/post25881024.asp 。
IIS 6 (Win2003 )中查看某个应用程序池对应那个 W3WP.exe 进程,可以使用如下命令,输出结果类似如下:
C:\WINDOWS\system32>cscript iisapp.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
W3WP.exe PID: 1172 AppPoolId: StsAdminAppPool
W3WP.exe PID: 2656 AppPoolId: MSSharePointAppPool
W3WP.exe PID: 2148 AppPoolId: WMS App Pool
W3WP.exe PID: 3604 AppPoolId: defaultwebsite
参看这篇博客: http://blogs.msdn.com/jb/archive/2006/02/22/536693.aspx
IIS 7 中则是如下命令,输出结果类似如下:
C:\Windows\system32>%windir%/system32/inetsrv/appcmd list wp
WP “5716″ (applicationPool:DefaultAppPool)
WP “968″ (applicationPool:MyOtherAppPool)
WP “5836″ (applicationPool:TheThirdAppPool)
参看: http://dirk.net/2008/06/01/identify-which-w3wpexe-belongs-to-which-application-pool-in-iis7/
参考资料:
找出“w3wp.exe进程”对应的“应用程序池”
http://www.cnblogs.com/windpole/archive/2007/11/19/964819.html
Which w3wp.exe process belongs to which App Pool in IIS6
http://weblogs.asp.net/owscott/archive/2004/09/21/Which-w3wp.exe-process-belongs-to-which-App-Pool-in-IIS6.aspx
What Application Pool does this W3WP.EXE belong to?
http://blogs.msdn.com/jb/archive/2006/02/22/536693.aspx
New in IIS 7 - App Pool Isolation
http://adopenstatic.com/cs/blogs/ken/archive/2008/01/29/15759.aspx
对w3wp.exe的一点认识!
http://www.cnblogs.com/hjh1982/archive/2006/06/28/438032.html
关于Web Garden与Web Farms
http://www.cnblogs.com/huashanlin/archive/2007/07/30/836652.html
你的程序支持 IIS6 - Web Garden 吗?
http://blog.joycode.com/lostinet/archive/2005/02/02/44017.aspx
Web Farm And Web Garden
http://www.cnblogs.com/kingclever/archive/2007/12/13/993152.html
Identify which w3wp.exe belongs to which Application Pool in IIS7
http://dirk.net/2008/06/01/identify-which-w3wpexe-belongs-to-which-application-pool-in-iis7/
SharePoint内置了一套相对比较完整的Web Services提供给开发者,这样就可以在客户端、跨平台的程序中读取甚至修改SharePoint中的内容。不过当SharePoint网站不允许匿名访问的时候,调用Web Services自然也需要提供身份验证。
SharePoint身份验证最常用的是Windows验证(Windows Authentication)和表单验证(Form Authentication)两种。
Windows验证即使用Windows账号或者AD账号来进行身份验证,对于这种验证方式,在SharePoint SDK中已经给出了如何提供身份验证的方法,假设我们使用最常用的lists.asmx来获取SharePoint列表数据,添加的Web引用的命名空间是spwsList:
使用当前帐户身份:
1 spwsList.Lists wsLists = new spwsList.Lists();
2 wsLists.Credentials = CredentialCache.DefaultCredential;
3 Console.WriteLine(wsLists.GetListCollection().OuterXml);
使用指定帐户:
1 spwsList.Lists wsLists = new spwsList.Lists();
2 wsLists.Credentials = new NetworkCredential("username", "password", "domain");
3 Console.WriteLine(wsLists.GetListCollection().OuterXml);
上面的CredentialCache、NetworkCredential都是在System.Net命名空间下。
表单认证是SharePoint 2007新加入的一种身份认证方式,其后台是使用.Net Framework中的Membership机制进行用户身份的识别,对于外网来说,大都是使用表单认证的方式来实现的。在使用表单认证的SharePoint网站中通过Web Service获取数据稍微麻烦一些,不过也可以通过SharePoint提供的表单认证Web Service来创建用户身份相关的Cookie。
表单认证Web Service的地址是:http://[server]/[site]/_vti_bin/authentication.asmx
在使用Web Service的程序中再次加入上面这个Web引用,假设其命名空间是spwsAuth,那么使用表单认证构造身份并访问数据的代码实例如下:
1 spwsAuth.Authentication auth = new spwsAuth.Authentication();
2 auth.CookieContainer = new CookieContainer();
3 auth.AllowAutoRedirect = true;
4 spwsAuth.LoginResult lr = auth.Login("username", "password");
5 if (lr.ErrorCode == spwsAuth.LoginErrorCode.NoError)
6 {
7 spwsList.Lists wsList = new spwsList.Lists();
8 wsList.CookieContainer = auth.CookieContainer;
9 XmlNode res = wsList.GetListCollection();
10 Console.WriteLine(res.OuterXml);
11 }
1
以前找打折机票,都是通过打电话找卖机票的,或者在携程上订。
反正都不是直接和航空公司打交道。
最近发现,最低折扣的机票,都在各大航空公司自己的网站上。
航空公司终于醒悟过来了,与其让二道贩子赚中间的差价,不如让旅客直接得益。而旅客更多的选择了自己航空公司的航班,实际上航空公司也得益了。
网络,让普通旅客和机票贩子以前的信息不对称消失了。
2
网络,让买机票很方便。
以我自己的经历来说,在网上用酷讯搜索机票,在航空公司的网站上买票,用电子银行付款,到机场直接拿身份证自己打印登机牌。除了安全检查和开飞机,其他一切自己搞定,非常简单而快捷。
网络是可以提高生活和工作效率的。
3
技术本身并无论贵贱的,给用户提供价值是最重要的。航空公司自己搞个网上订票系统,从技术上看,不是特别复杂一件事情。但对于旅客而言,是省了实实在在的钱的。
扯点更远的,一点不赚钱的事情,或者未来永远都赚不到钱的事情,肯定也是搞不大的。互联网产业,总的来看,也就是个服务行业。搞免费服务,肯定不可能的。但是,看上去不少人都在搞免费服务,大部分人其实不会那么活雷锋的,只谈奉献不谈回报,可是就怕一直被强迫着免费,直到钱烧完了。钱烧完了,那就要改烧纸钱了。
1
以前找打折机票,都是通过打电话找卖机票的,或者在携程上订。
反正都不是直接和航空公司打交道。
最近发现,最低折扣的机票,都在各大航空公司自己的网站上。
航空公司终于醒悟过来了,与其让二道贩子赚中间的差价,不如让旅客直接得益。而旅客更多的选择了自己航空公司的航班,实际上航空公司也得益了。
网络,让普通旅客和机票贩子以前的信息不对称消失了。
2
网络,让买机票很方便。
以我自己的经历来说,在网上用酷讯搜索机票,在航空公司的网站上买票,用电子银行付款,到机场直接拿身份证自己打印登机牌。除了安全检查和开飞机,其他一切自己搞定,非常简单而快捷。
网络是可以提高生活和工作效率的。
3
技术本身并无论贵贱的,给用户提供价值是最重要的。航空公司自己搞个网上订票系统,从技术上看,不是特别复杂一件事情。但对于旅客而言,是省了实实在在的钱的。
扯点更远的,一点不赚钱的事情,或者未来永远都赚不到钱的事情,肯定也是搞不大的。互联网产业,总的来看,也就是个服务行业。搞免费服务,肯定不可能的。但是,看上去不少人都在搞免费服务,大部分心里当然不会那么活雷锋,只谈奉献不谈回报,可是就怕一直被强迫着免费,直到钱烧完了。钱烧完了,那就要改烧纸钱了。
今天遇到一个SharePoint网站,在服务器上可以访问,在服务器外访问不能(写到这里估计大部分人都能猜到是什么问题了)。于是弱智的我查看了所有IIS、Web应用程序、管理中心、SSP的相关设置,都没有找到问题所在。于是惊动了kaneboy同学,在其指导下,在IIS里新建了一个站点,扔了个hello world页面进去,依旧是里面能访问,外面访问不能。于是kaneboy同学沉思了一下,说“你防火墙关了么?”于是我就点点点了……我什么时候把服务器的防火墙打开的……
于是这篇日志就当作blog复出吧……上半年被毕业事宜折磨了半年……我过一段时间重新开始写自定义字段类型的开发,最近又有了一点心得……
ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用。
绝大多数的人只熟悉高层的框架如: WebForms 和 WebServices --这些都在ASP.NET层次结构在最高层。
这篇文章的资料收集整理自各种微软公开的文档,通过比较 IIS5、IIS6、IIS7 这三代 IIS 对请求的处理过程, 让我们熟悉 ASP.NET的底层机制 并对请求(request)是怎么从Web服务器传送到ASP.NET运行时有所了解。通过对底层机制的了解,可以让我们对 ASP.net 有更深的理解。
IIS 5 的 ASP.net 请求处理过程

对图的解释:
IIS 5.x 一个显著的特征就是 Web Server 和真正的 ASP.NET Application 的分离。作为 Web Server 的IIS运行在一个名为 InetInfo.exe 的进程上,InetInfo.exe 是一个Native Executive,并不是一个托管的程序,而我们真正的 ASP.NET Application 则是运行在一个叫做 aspnet_wp 的 Worker Process 上面,在该进程初始化的时候会加载CLR,所以这是一个托管的环境。
ISAPI: 指能够处理各种后缀名的应用程序。 ISAPI 是下面单词的简写 :Internet Server Application Programe Interface,互联网服务器应用程序接口。
IIS 5 模式的特点:
1、首先,同一台主机上在同一时间只能运行一个 aspnet_wp 进程,每个基于虚拟目录的 ASP.NET Application 对应一个 Application Domain ,也就是说每个 Application 都运行在同一个 Worker Process 中,Application之间的隔离是基于 Application Domain 的,而不是基于Process的。
2、其次,ASP.NET ISAPI 不但负责创建 aspnet_wp Worker Process,而且负责监控该进程,如果检测到 aspnet_wp 的 Performance 降低到某个设定的下限,ASP.NET ISAPI 会负责结束掉该进程。当 aspnet_wp 结束掉之后,后续的 Request 会导致ASP.NET ISAPI 重新创建新的 aspnet_wp Worker Process。
3、最后,由于 IIS 和 Application 运行在他们各自的进程中,他们之间的通信必须采用特定的通信机制。本质上 IIS 所在的 InetInfo 进程和 Worker Process 之间的通信是同一台机器不同进程的通信(local interprocess communications),处于Performance的考虑,他们之间采用基于Named pipe的通信机制。ASP.NET ISAPI和Worker Process之间的通信通过他们之间的一组Pipe实现。同样处于Performance的原因,ASP.NET ISAPI 通过异步的方式将Request 传到Worker Process 并获得 Response,但是 Worker Process 则是通过同步的方式向 ASP.NET ISAPI 获得一些基于 Server 的变量。
IIS6 的 ASP.net 请求处理过程

对图的解释:
IIS 5.x 是通过 InetInfo.exe 监听 Request 并把Request分发到Work Process。换句话说,在IIS 5.x中对Request的监听和分发是在User Mode中进行,在IIS 6中,这种工作被移植到kernel Mode中进行,所有的这一切都是通过一个新的组件:http.sys 来负责。
注:为了避免用户应用程序访问或者修改关键的操作系统数据,windows提供了两种处理器访问模式:用户模式(User Mode)和内核模式(Kernel Mode)。一般地,用户程序运行在User mode下,而操作系统代码运行在Kernel Mode下。Kernel Mode的代码允许访问所有系统内存和所有CPU指令。
在User Mode下,http.sys接收到一个基于 aspx 的http request,然后它会根据IIS中的 Metabase 查看该基于该 Request 的 Application 属于哪个Application Pool, 如果该Application Pool不存在,则创建之。否则直接将 request 发到对应Application Pool 的 Queue中。
每个 Application Pool 对应着一个Worker Process:w3wp.exe,毫无疑问他是运行在User Mode下的。在IIS Metabase 中维护着 Application Pool 和worker process的Mapping。WAS(Web Administrative service)根据这样一个mapping,将存在于某个Application Pool Queue的request 传递到对应的worker process(如果没有,就创建这样一个进程)。在 worker process 初始化的时候,加载ASP.NET ISAPI,ASP.NET ISAPI 进而加载CLR。最后的流程就和IIS 5.x一样了:通过AppManagerAppDomainFactory 的 Create方法为 Application 创建一个Application Domain;通过 ISAPIRuntime 的 ProcessRequest处理Request,进而将流程进入到ASP.NET Http Runtime Pipeline。
IIS 7 的 ASP.net 请求处理过程
IIS7 站点启动并处理请求的步骤如下图:
步骤 1 到 6 ,是处理应用启动,启动好后,以后就不需要再走这个步骤了。

上图的8个步骤分别如下:
1、当客户端浏览器开始HTTP 请求一个WEB 服务器的资源时,HTTP.sys 拦截到这个请求。
2、HTTP.sys contacts WAS to obtain information from the configuration store.
3、WAS 向配置存储中心请求配置信息。applicationHost.config。
4、WWW 服务接受到配置信息,配置信息指类似应用程序池配置信息,站点配置信息等等。
5、WWW 服务使用配置信息去配置 HTTP.sys 处理策略。
6、WAS starts a worker process for the application pool to which the request was made.
7、The worker process processes the request and returns a response to HTTP.sys.
8、客户端接受到处理结果信息。
W3WP.exe 进程中又是如果处理得呢?? IIS 7 的应用程序池的托管管道模式分两种: 经典和集成。 这两种模式下处理策略各不相通。
本文作者:郭红俊 http://blog.joycode.com/ghj
IIS 6 以及 IIS7 经典模式的托管管道的架构
在IIS7之前,ASP.NET 是以 IIS ISAPI extension 的方式外加到 IIS,其实包括 ASP 以及 PHP,也都以相同的方式配置(PHP 在 IIS 采用了两种配置方式,除了 IIS ISAPI extension 的方式,也包括了 CGI 的方式,系统管理者能选择 PHP 程序的执行方式),因此客户端对 IIS 的 HTTP 请求会先经由 IIS 处理,然后 IIS 根据要求的内容类型,如果是 HTML 静态网页就由 IIS 自行处理,如果不是,就根据要求的内容类型,分派给各自的 IIS ISAPI extension;如果要求的内容类型是 ASP.NET,就分派给负责处理 ASP.NET 的 IIS ISAPI extension,也就是 aspnet_isapi.dll。下图是这个架构的示意图。
IIS 7 应用程序池的 托管管道模式 经典 模式也是这样的工作原理。 这种模式是兼容IIS 6 的方式, 以减少升级的成本。

IIS6 的执行架构图,以及 IIS7 应用程序池配置成经典模式的执行架构图
IIS 7 应用程序池的 托管管道模式 集成模式
而 IIS 7 完全整合 .NET 之后,架构的处理顺序有了很大的不同(如下图),最主要的原因就是 ASP.NET 从 IIS 插件(ISAPI extension)的角色,进入了 IIS 核心,而且也能以 ASP.NET 模块负责处理 IIS 7 的诸多类型要求。这些 ASP.NET 模块不只能处理 ASP.NET 网页程序,也能处理其他如 ASP 程序、PHP 程序或静态 HTML 网页,也因为 ASP.NET 的诸多功能已经成为 IIS 7 的一部份,因此 ASP 程序、PHP 程序或静态 HTML 网页等类型的要求,也能使用像是Forms认证(Forms Authentication)或输出缓存(Output Cache)等 ASP.NET 2.0 的功能(但须修改 IIS 7 的设定值)。也因为 IIS 7 允许自行以 ASP.NET API 开发并加入模块,因此 ASP.NET 网页开发人员将更容易扩充 IIS 7 和网站应用程序的功能,甚至能自行以 .NET 编写管理 IIS 7 的程序(例如以程控 IIS 7 以建置网站或虚拟目录)。

IIS 7 的执行架构图(集成托管信道模式下的架构)
小结
IIS5 到 IIS6 的改进,主要是 HTTP.sys 的改进。
IIS6 到 IIS7 的改进,主要是 ISAPI 的改进。
参考资料:
ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI
http://www.cnblogs.com/artech/archive/2007/09/09/887528.html
ASP.NET Internals – IIS and the Process Model
http://dotnetslackers.com/articles/iis/ASPNETInternalsIISAndTheProcessModel.aspx
模组化的IIS 7 与.NET 能力整合
http://www.microsoft.com/taiwan/technet/columns/profwin/33-iis7-componentization-integration.mspx
Introduction to IIS 7.0 Architecture
http://learn.iis.net/page.aspx/101/introduction-to-iis7-architecture/
工作九年了,网站相关的开发工作也干了八年多。负责带领团队也好几年了。面试和带领刚工作的人也不少了。其中的优秀者不少,但是大多数都存在下面提到的几个认识误区。把这些问题提出来,希望对刚参加工作没有多久的程序员们有所帮助,少走弯路。
公司招你进来,其实最重要的就是看到你的工作能力和工作态度是可以接受的。
工作能力指你能满足他们的工作期望,或者在可接受的时间范围内,经过培训后,可以满足这个工作期望。
工作态度指你能有些做职员的基本素质。
这个道理应该所有人都清楚。但是到实际事情时候就经常犯迷糊。下面几点是经常会出问题的地方:
1、不经测试,Review,就认为自己工作完成了。
你的代码或者应用一旦被别人Review ,或者进行试用。这时候你代码的好坏,或者功能是否在各种场景下是否可用,都会影响你这个人在上级及同事眼里的可信任度。
代码书写的规范,性能的高质量,各种功能在各个场景都可用,则表示你这个人是完全可信的。下次上级给你分派任务的时候,就可以给你更多的自由度来发挥。长此以往,前途和钱途自然就随手可得。
反之,代码不规范,功能好些场景不可用。这只能让上级或同事觉得你不可信任。每次都需要处理你带来的这些问题,说恶心点就是你每次拉完大便都没擦屁股,每次都得你的同事和上级帮你擦屁股。数次都这样后,上级或同事下次跟你沟通的时候就会觉得你这个人不可信任,一件事情必须反复多次强调,总觉得你还会作出问题。你的信用已经非常危险了。
你在别人眼里的信用就这样被你慢慢透支了。透支到一定程度,走人吧。整个团队的效率会因为你而变慢(每个人跟你沟通的成本都会影响到他本人的产出),你不走人谁走人。
2、最短可接受的工作时限
你有没有统计过,公司分派给你一个工作时候,上级指定的这项工作计划做多久的预计,跟你自己的预计有多大差异?
如果你预计时间大于上级给的工作计划时间,同时上级没有增派人手进行相关工作。除了BT的领导外,那只有一种情况:上级对你的工作态度非常不满,认为你的薪水对应的工作能力不是这么点。
对于刚工作的,更多的是你表现出来的工作能力在公司的平均工作能力之下。同时公司觉得你对工作没有表现出足够的热情。 一个能力在平均水平下面,又缺乏工作激情的人,他的前途在那里??
如果这个人还没有表现出几个月后能达到平均水平之上的希望,为啥会留这样一个人呢?
3、工作能力不等于技术水平
我曾看到过有人抱怨说大公司的员工也不过是这技术水平, 这么简单的技术问题都不会。我自己早期也有这样想法,后来发现是不对的。
不论大公司还是小公司,要得是解决问题的工作能力。 我的曾经手下就有好几个技术水平很牛的,但是作出来的应用却一次次返工的。为啥,工作能力这些非技术因素他们做的很不好。
工作能力的非技术因素包括的很多: 责任心,表现就是对自己写出来的代码有一定要让人放心的责任; 沟通能力,一个典型的表现就是需求不理解或者需求不明时,及时得跟相关人沟通,而不是自己先按自己想法实现,造成代码写完后再返工的恶果等等。
技术水平低,但是解决问题能力强的,我也碰到过一些人。 工作的能力更重要的是这些非技术的工作能力,而不是技术水平。技术人员很容易技术水平高,但是非技术的工作能力差。 这是很糟糕的。
4、发展潜力,学习能力
公司使用的技术不可能一直不变,一直不变的公司只能慢慢被市场淘汰。这就要求员工能不断的学习新的知识,并应用到工作中来。
要想不会出现几年后,自己发现跳槽找个工作都没人要,赶快学习吧。
坚持,是一个人最难做到的。 但是不坚持,那就等着灭亡吧。
5、笨鸟先飞
一个人,在公司,如果工作能力在平均线以下, 加班吧, 不要有任何幻想。
最可怕的是自己没这个意识, 自认为自己技术水平很牛, 但是解决问题的工作能力却在平均水平线以下, 眼高手低 , 这样的人, 公司是不能留的。
6、承诺到的事情一定要做到,不要找理由
一件事情没有被做完,想找理由能找很多的。既然你承诺了某个时间点前完成,就不要再找各种理由推脱。
公司同事和上级虽然可能这次接受了你的理由,但是下次呢, 慢慢的就会让你的上级,同事觉得你是一个喜欢推托的人。 感觉你干事是非常不可靠的。不知道那次就会不完成,下次谁敢再找你干事?
可能很多人在看到我这篇博客的时候,觉得我写的很刻薄,好像都是从公司的角度欺压技术人员。很没有人情味。
只要你不是公司的董事, 你永远是被剥削者,公司的目的就是利润最大化,这是公司存活的根本目的。作为普通的职员,要有所为的白领意识,其实就是被剥削意识。这是个适者生存的生态圈,不适用的人只能被淘汰。
实际的公司其实有很多人情味在里面,或者同事和领导有些话不便于说出口。 这也就造成了一些技术人员被开除,还自以为如何如何? 都是没有这些意识造成的。我写这篇博客就是希望能增加技术人员的这些意识,不要犯了这些问题还自己不知道。
【原文地址】A Live Mesh Moment
【原文发表日期】15 July 08 09:35
当最近我在南非的Kruger国家公园附近的灌木丛中游玩时,我发现了Live Mesh一个绝妙的用途……在观赏了一整天精彩的大型游戏之后,我拍了一大堆的照片,希望给大家展示我的劳动成果。
夜里,回到了我的临时往处后,我匆匆地连上了网络,只有非常低的带宽的无线网络可以使用。因此我通过live mesh分享我的照片,很快地我那些宝贵的照片就在云端(Cloud)创建了备份。在照片上传时,我不由在想,我是多么地希望能够将我的经历与我的妻儿们分享啊,她们现在正在半个地球之外的地方熟睡呢!
如果能让厨房里的手提显示我最新的照片,我想那会很有趣的。于是我“连接”到我妻子的电脑上,并成功地获得了远在10000英里之外的终端服务会话。
完全就如同我正在坐在我们的厨房里的手提的键盘前面一样,即使是非常糟糕的网络,我依然很快地更改了她的屏保,将其指向了包含我的精彩照片的那个新的live mesh的文件夹。
当她们在早上起来后,我五岁的儿子是第一个注意到厨房里的手提上的长颈鹿和狮子的人!这就是用live mesh分享体验的魔力!
在整个旅途中,只要我能获取一丁点儿的网络连接,一批新的照片就会上传上去。当我到达微软的约翰内斯堡的办公室时,我的家庭已经完整地体验了我的旅程。
感谢Mesh。
容我说点陈年往事。 去年的软件产业的数据,尽可能直观的说说,欢迎大家指正。
去年软件产业的总收入5800亿,增长20.8%。就相当于软件产业的GDP是5800亿,占中国总GDP的1/40。假设总共从业人数为140万(大概就是这个数),所以软件行业的人均GDP,就是41万元,是人均GDP的22倍。
按照记者的口气是,从某某大会获悉,2007年软件产业产值已经达5800亿。实际上根本不用去开会,这些数据都能第一时间看到。去年的数据,在信息产业部的网站上,2008年2月3日就出来了,链接见本文最后。
我第一时间看了,幸好当时没写blog,否则就闹笑话了。我把“教训”总结一下。 我当时拿excel加了一下,整整11600亿,1.16万亿啊,当时是有点吃惊了,差不多就是中国总GDP的1/20了。 最近终于从这个错误中反应过来了。你们可以看看,第一列是“软件业务收入”,实际上这是后面的总计。后面的“软件产品收入”“系统集成收入”都是属于分类的统计了。不过这几列,都没有任何直观上的区分,容易弄混,还算情有可原。
回到正题,软件产业在地域上,相当的集中。看看2007年的数据,北京占了21.8%,广东16.9%,江苏,14.35%,上海8.5%。 北京和我想象的差不多。江苏比想象的多,上海比想象的少,不太明白其中的原因。
以下摘录了2007年的前12名,单位亿元。合计 5800.1 北京市 1263.1 广东省 981.2 江苏省 832.4 上海市 494 浙江省 354.3 山东省 302.9 四川省 240.2 辽宁省 234.1 福建省 220 陕西省 144.8 吉林省 93 湖南省 78
其实数据仅仅是问问题的起点。比如,和其他国家横向的比较也很有意义。可惜我还没有找到太多详细的数据,其实本文有点想抛砖引玉的意思,欢迎更多的数据和分析。
具体数据请参照 http://www.miit.gov.cn/art/2008/02/03/art_5104_47694.html
更多的相关数据 http://www.miit.gov.cn/col/col5104/index.html
最近几天发现我始终不能在博客堂发布带有较多图片的Blog了,无论是Web发布还是Writer发布,都提示SQL错误:
“
发生服务器错误 0
String or binary data would be truncated.
The statement has been terminated. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at SubSonic.SqlDataProvider.ExecuteQuery(QueryCommand qry)
at SubSonic.StoredProcedure.Execute()
at Joycode.Framework.Data.DatabaseObjectProvider.InsertEntry(Entry entry) in D:\Projects\Joycode\Joycode.Blog\Joycode.Framework\Data\DatabaseObjectProvider.cs:line 623
at Joycode.Framework.Data.DatabaseObjectProvider.CreateEntry(Entry entry, Int32[] categoryIds) in D:\Projects\Joycode\Joycode.Blog\Joycode.Framework\Data\DatabaseObjectProvider.cs:line 576
at Joycode.Framework.Entries.Create(Entry entry) in D:\Projects\Joycode\Joycode.Blog\Joycode.Framework\Entries.cs:line 259
at Joycode.Framework.XmlRpc.MetaWeblog.newPost(String blogid, String username, String password, Post post, Boolean publish) in D:\Projects\Joycode\Joycode.Blog\Joycode.Framework\XmlRpc\MetaWeblog.cs:line 274
”
比如这三篇:
Reporting Service Tips 101(#5) - 在报表页面上添加交互式排序
Reporting Service Tips 101(#6) - RS中从一个报表jump到另外一个报表
Reporting Service Tips 101(#7) - 使用RS制作树状可折叠报表
在CnBlogs正常发布,但是博客堂全部失败。
在奥运会期间, IE 8 Beta 2将会发布,而且随着英文版的发布,中文版也会在第一波当中进行发布。
IE 8将会是Internet Explorer历史上最重要的一个版本发布,除了其带有中国传统的吉祥数字“8”以外,最主要的是其对标准的兼容性上得到了极高的增强,这对于网页开发人员来说,最大的便利就是不用再为每种浏览器(甚至某种浏览器的不同版本)开发不同的CSS来进行适应。以后网页开发人员只需要兼容W3C的标准即可,而不需要把过度的精力放在不同浏览器标准的相异性上。
发布时间在即,那么您的网站是否已经准备好了呢?
1) 兼容性考虑
目前的网站由于各种历史原因,可能针对不同的浏览器设置了不同的CSS文件。而针对IE 8,可能大部分网站尚没有做好准备。可能很多朋友知道,IE 8带有一个“切换IE 7模仿模式”的按钮,而且在Beta 1以及Beta 2期间,这个按钮是设置在默认选中状态。但是在IE 8正式发布的时候,该按钮默认将会是非选中状态,这就表示着如果一个网站没有做任何准备功课,在IE 8下将会以严格模式来常解析CSS。
前段时间,我与合作伙伴见面时,曾经特意使用IE 8 Beta 2的严格模式浏览过大部分合作伙伴的网页,都会出现或多或少的显示变形的问题,使得网站无法进行正确浏览。如果您的网站尚未做过IE 8的兼容性测试,建议您尽快下载IE 8的Beta 1,并且将其切换到IE 8严格模式,对您的网站进行浏览。
如果您发现问题,并且感觉在短期内无法修复,您也可以通过在页面当中添加Meta标签,在服务器端强制IE 8使用“IE 7模仿模式”,做法很简单:
a. 针对全站页面: 您可以修改Web服务器(如Apache/IIS/Resin等)的HTTP头信息,在其中增加以下指令: X-UA-Compatible: IE=EmulateIE7。这个是我个人强烈推荐的做法,在您无法进行全站测试的情况下,可以先使用此方式使IE 8的严格模式暂时失效。
b. 针对单独页面:如果您的网站大部分页面在IE 8严格模式下显示正常,只有个别页面出现问题,建议在出现问题的页面的页首,即Head标签内添加以下Meta标签:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />。
更多信息,请参考: http://support.microsoft.com/kb/952030/
2) 制作Activity以及WebSlice
IE 8在Beta 1期间曝光了两个新特性,即Activity(活动)以及WebSlice(源剪辑),目前国内很多网站已经基于Activity以及WebSlice制作了相关的内容,在IE 8 Beta 2期间,您会发现更多的网站会发布这些实用的小工具。以下是目前已经对外发布的一些网站:
a. 淘宝:http://ie8.taobao.com
b. 网易:http://ie8.163.com
c. 百度:http://stock.baidu.com/ie8/ie8.html
d. 腾讯:http://labs.qq.com/e/49/
甚至包括.NET开发人员常去的博客园也已经发布了其最新文章的Web Slice,有兴趣的话可以使用IE 8 Beta 1来访问博客园的首页。另外,如果您也使用Firefox 3,您可以发现已经有人开发了面向Firefox 3的Activity以及WebSlice插件。
Activity的使用场景:您的网站提供一系列的服务,允许贵网站的用户通过在其它网站的主动操作来调用此服务。比如假设您是一个财经网站,提供查询股票/基金信息的服务,通过Activity,您可以让您的用户在其它网站上浏览股评信息时,不需要跳转到贵网站,即可以通过右键菜单调用贵网站的相应服务。如果感兴趣,可以下载Activity开发白皮书。
WebSlice的使用场景:您的网站提供一些实时性信息,比如新闻、股票信息等,而希望用户可以在不返回相应页面的时候,当内容发生改动时,即可以推送给最终用户,您可以选择WebSlice。而开发代价仅仅只是将页面当中的某一个标签内的“Class”元素设置为“hslice”这个特殊名称即可,详细信息请阅读WebSlice开发白皮书。
另外,在IE 8 Beta 2发布时,微软将会发布一个面向IE 8全新的Gallery网站,用以搜索各个网站开发的WebSlice/Activity等面向IE 8新特性的组件,并且提供最终用户评估/下载,如果您希望您开发的WebSlices/Activity能够得到用户的青睐,那么就从现在开始吧:早起的鸟儿有虫吃。 :)
3) 其它
IE 8 Beta 2发布时,还将会带来一系列的新特性,在前段时期,已经面向国内一些领先的网站进行过交流,很多合作伙伴都非常感兴趣,并且正在开发此上的服务,相信在奥运会期间大家会看到此类的成果(依据NDA协议,此类网站也已经从微软拿到了IE 8 Beta 2的早期内部版本)。微软也将会举办一系列的市场活动,用以推广我们的合作伙伴所开发的各种面向IE 8的新的服务。
IE 8 Beta 2即将发布,无论您是企业网站的网页设计人员,还是个人网站的站长,都需要尽快为IE 8做好准备。 希望本文对您有帮助。
More Posts
Next page »