Tuesday, August 24, 2010

程序员怎么选择发展方向(ZT)

程序工作二三年后,基本上都会考虑自己以后怎么发展。发展的路径不外乎程序员-系统分析员-架构师-技术经理-CTO,程序员-项目组长-项目经理-项目总监-CTO,程序员-产品设计师-产品经理-CTO.哪一条发展的路线更加适合你?
程序员职业生涯发展到一定程度都会面临一个选择,是走业务+技术方向,还是选择纯钻研技术。程序员职业生涯 发展的问题,这是所有程序员都在关心的问题,未来究竟要怎么走,30岁之后还能不能再做程序员。
绝大多数程序员最终的职业目标可能都是CTO,做到CEO的人估计会比较少,也有一少部分人自己去创业创业去当老板,也有部分人说我转行去做业务 了,对于当老板的人毕竟是少数,对于转行的人来说,都不在这行做了,自然没什么好说的了。一般来说,程序员的发展基本上都会经历这么几条路径。程序员-系 统分析员-架构师-技术经理-CTO,程序员-项目组长-项目经理-项目总监-CTO,程序员-产品设计师-产品经理-CTO.
当然这只是一个大致的路径,不是所有程序员都必需要这么经历的,有些人可能跳过其中的一些步骤,也可能有些人会把中间的很多职位都做了。而最终做到 CTO的程序员,也是非常少的一部分,原因很简单,这个世界上不许要那么多的CTO和CXO.
也就是说,许多的程序员最终可能是做技术经理、项目经理或者项目总监之类的,那么到底我们职业生涯要选择哪一种呢?我觉得这个问题没有一个统一的答 案,因为每个人的性格不一样,际遇也不一样,就像你从小希望当贪官,可是命运却偏偏让你做了一个程序员。所以应该根据你的兴趣、性格与际遇选择一条道路, 比如说你正好有机会带一个项目,而你又不是很讨厌项目经理这个位置,那么你就可以选择向项目经理方向发展。
实际上很多时候,国内并没 有明确的技术经理、项目经理、产品经理之分,在许多的公司里,他们经常是由一个人承担。在外包公司里,通常会有项目经理和 系统分析员(也可能是技术经理)。在一些非IT公司里,可能会有部门经理,而做自己产品的公司可能会分得比较详细一些。我大致说一下这三个职位的区别,让 正在徘徊的程序员有一个大致的了解。
项目经理是项目的直接负责人,这个角色相当于一个中间接口,不管是团队成员还是需求方(客户), 或者是上级领导,有事都直接找他,所以这个职位着重 于管理与沟通。一般来说,项目经理的工作重点在同客户沟通需求、项目进度的把控、团队的沟通方面,有些公司也会需要项目经理承担团队建设的工作,不过貌似 很多国内公司都忽略了团队建设这个工作了。对于项目经理来说,重点会要求沟通能力、协调能力、危机把控能力、执行力、团队管理能力,着重于沟通、管理与计 划。当然也有些公司还要求项目经历要参与招标谈判,这就要求项目经理有一定的商务谈判能力。
技术经理有时候也可能叫系统分析员,一些 小公司可能会整个公司或者部门有一个技术经理。技术经理承担的角色主要是系统分析、架构搭建、系统构建、代 码走查等工作,如果说项目经理是总统,那么技术经理就是总理。当然不是所有公司都是这样的,有些公司项目经理是不管技术团队的,只做需求、进度和同客户沟 通,那么这个时候的项目经理就好像工厂里的跟单人员了,这种情况在外包公司比较多。对于技术经理来说,着重于技术方面,你需要知道某种功能用哪些技术合 适,需要知道某项功能需要多长的开发时间等。同时,技术经理也应该承担提高团队整体技术水平的工作。
产品经理这个职位一般在有自己产 品(不管是软件还是网站产品)的公司比较常见,产品经理主要会负责产品的设计、产品的改良等工作。需要注意的是,产 品设计与设计师是两个不一样的工作,产品设计主要会从用户体验、业务需要等层面去设计产品,而设计师更多是从用户的视觉上去做。产品经理应该是最懂业务的 人,比如说你在设计一个微博的产品,就要求你对微博这个东西非常熟悉,从用户习惯、用户体验、公司的发展战略上去设计这个产品,还要对比同类产品会有什么 优势等等。
不管是项目经理还是技术经理与产品经理,都要求要熟悉业务,业务是需求的来源,没有不谈业务的技术,所以不管你从哪个方向 发展,都要求对业务熟悉。 产品经理要求对业务最熟悉,项目经理次之,技术经理排最后。对于程序员来说,刚开始工作的前几年可以埋头扎到技术里面,一般这个时间在2-3年的时间,然 后就应该多关注业务了。这个业务不一定是指某个具体的业务,因为具体的业务的范围太少,而且也需要机遇。
我见过许多的程序员,他们是做Web开发的,但对互联网很不熟悉,对于互联网流行的趋势基本上不闻不问。不知道现在大家都在使用微博,也不知道SNS,也 可能从不使用网银。我觉得这样很不好,程序员应该多多去关注互联网的发展,多多去玩一些新的网站。

Domain Registration Check Web Site

http://www.instra.com/
Very good web site to check Domain name availability.

Biz expired Domain Name
https://www.snapnames.com/

How to Snatch an Expiring Domain
http://www.mikeindustries.com/blog/archive/2005/03/how-to-snatch-an-expiring-domain

 网上有这样一群朋友,他们喜欢后缀是拼音的,比如.ai(爱)、.bi(逼)、.de(的)、.la(啦)、.lu(路)、.si(死)、.se(色)等 等。因为这两位之母是汉字的拼音,所以很容易就能想到一些有意思的域名:zuo.ai、niu.bi、shuo.de、lai.la、zou.lu、 yao.si、hao.se等等。只要发挥你的想想,域名组合是无穷的。

网络访问攻防战

在很多大型企业中和有些国家中,为了限制员工或人民访问某些网站或使用某些网络应用程序,通常做了一些访问限制。限制的方法通常有路由器IP过滤和强制使用代理服务器等几种方式。
路由器IP过滤指的是通过在路由器中加入外网或国外的IP黑名单,使得内网或国内无法访问外网或国外的这些IP,达到限制访问的目的。强制使用代理服务 器的过滤方式通常只在大型企业中应用,指的是内网必须通过代理服务器才能访问外网,那么在代理服务器上可以实现更为复杂的过滤机制。本文主要讲述IP过滤 的攻防战,关于代理服务器的攻防战下次讨论。下面依次讲述网络访问攻防战的不断升级过程:
首先,如果要禁止人们访问某些网站,那么路由器管理者可以在路由器中设置IP过滤规则,把这些网站的IP加入黑名单,自然人们就无法访问这些网站了。
之后,人们为了继续访问这些网站,就会用代理服务器绕过限制。代理服务器的IP成千上万,而且不停在变化,使得限制网络访问的工作处于被动局面。
然而,由于代理服务器协议是明文的,通过监听网络数据包并制作自动搜集整理的程序可以知道人们访问了哪些代理服务器并自动把代理服务器的IP加入到IP黑名单中,这样使用普通代理服务器绕过访问限制的方式就失效了,绕过网络访问限制的工作处于相当被动的局面。
所以,为了避免被侦测到代理服务器地址,加密代理软件应运而生。用户和代理服务器之间的通讯协议进行了加密,使得无法简单通过侦听网络数据包分析出代理服务器的IP地址。又一次使得限制网络访问的工作处于被动局面。
但是,加密代理软件也需要和代理服务器进行通讯,也需要知道加密代理服务器的IP地址。所以加密代理软件一般会在启动时去某些发布加密代理服务器IP地 址的地方获得加密代理服务器的IP。那么,只需要单独拿出一台计算机,启动加密代理软件,对这台计算机的网络通讯进行监视,那么即可知道发布加密代理IP 地址的地方,从而对发布点进行IP过滤。而且可以做成程序自动启动加密代理软件,自动监视数据包,自动把加密代理IP的发布地点的IP加入黑名单,这样加 密代理软件无法获得加密代理的IP,加密代理软件失效,绕过网络限制的工作又一次处于十分不利的位置。
加密代理软件为了对付这种情况, 就需要把访问代理IP发布点的流量混杂在访问非代理IP发布点的流量中。比如,加密代理软件启动时,首先访问其它大量网站,在访问其它网站之中的某一次访 问代理IP发布点,这样就把流量进行混杂了,无法通过简单的网络数据包侦听获得代理IP发布点的IP地址。如果把所有侦听到的地址全部加入黑名单,那么将 会误封很多网站。限制网络访问的工作又处于不利的位置。
然后,为了能继续对网络访问进行限制,网络管理员就转而对加密代理的IP(而非 发布点的IP)进行过滤。在加密代理软件启动完毕之后,通过加密代理下载一个大文件,那么流量比较大的IP即为加密代理的IP。通过这种方法,网络管理员 仍旧可以做出自动封锁加密代理软件的程序,绕过网络限制的工作又失败了。
那么,加密代理软件可以采取同样的思路,把访问代理IP的流量 混杂在其它流量中,并使分散的流量平分并不断变换代理IP,使得无法通过网络数据包流量统计获得加密代理的IP。人们又可以重新绕过网络访问限制了。然 而,因为对流量进行了平分,所以网速通常只有几分之一了,大部分流量都耗费在混淆网络管理员的程序上面了。
到了这里,网络访问攻防战似乎走到头了,但是聪明的网络管理员并不是束手无策了。通过对加密代理软件进行逆向工程,还是可以找到代理IP的发布点,从而过滤这个发布点。不过,这样已经不能通过分析网络流量用程序自动找出IP进行过滤了。
最后,加密代理软件为了防止被逆向工程,对加密代理软件本身进行了软件加密处理,使得逆向工程变得十分困难。接下去就是软件加密与破解之间的智力较量了。
总结:如果不进行网络流量混淆,那么能被程序自动找出有用的IP进行过滤。如果不对加密软件进行加密,也比较容易被逆向工程,从而找到有用的IP进行过 滤。加密代理软件作者需要时刻提防软件被破解,一旦被破解,那么需要对升级加密代理软件,使得限制网络访问的工作需要重新破解软件才能继续实施。

通过代理服务器进行网络访问的很多情况,和直接访问网络的情况十分相似。代理服务器能做到不使用代理服务器的所有过滤方式,这些过滤方式在上一篇中 已经有了详细地说明,唯一的区别是网络访问的攻防全部在代理服务器上进行。也就是说,如果你希望应用直接访问网络的访问攻防技术到代理服务器中,那么首先 必须使浏览器或网络应用程序设置了代理服务器。
然而,寻找访问外网的代理服务器地址又是一门学问。有些网络环境是在浏览器中直接设置了代理服务器的地址和端口,这样获得其地址十分容易;而有些网络环境使用了“自动代理配置脚本”的功能,以达到访问不同的网络使用不同的代理服务器的功能,其中著名的AutoProxy插件也使用了这种技术;甚至有些网络环境使用了“自动检测网络代理设置”的功能,以达到计算机在不同的网络环境中都能自动配置代理的功能。不过,在后两种设置的网络环境中寻找访问外网的代理服务器地址就需要了解这些技术了,具体可以参考Proxy auto-configWeb Proxy Autodiscovery Protocol。如果不熟悉这些技术,也可以通过netstat工具或者sniffer工具找出访问外网的代理服务器地址。这些技术和工具不在本篇中展开讨论。
如果你顺利找到了代理服务器的地址,那么接下来我们就可以分析一下代理服务器究竟可以做哪些限制,以及如何突破这些限制的方法了。
我们略过上一篇中已经详细说明的直接访问网络情况下的攻防,来看看代理服务器还能进一步做哪些过滤。在此列举一下通常情况下会碰到的过滤方式:
1、域名过滤。在使用代理服务器访问网络时,会遇到某个域名下的所有网页都是访问被拒绝的情况,这就是域名过滤。然而,通常情况下代理服务器对于域名的过滤只是通过分析访问地址中的域名进行的过滤,而不是通过HTTP代理协议中的Host字段进行的过滤。那么我们可以通过把访问地址中的域名换成域名对应的IP地址,来解决这个问题。
2、IP地址过滤。在访问网络时,有时候访问某个IP地址下面的网页会出现全部拒绝访问的情况。和域名过滤一样,这种过滤方式很多情况下也只是对访问地 址中的IP进行过滤,那么我们可以把IP地址换成对应的域名解决问题。如果这个IP地址没有域名或者暂时找不到其对应的域名,也可以为这个IP注册一个免 费的二级域名,之后就可以把IP换域名了。
3、 端口过滤。由于浏览网页使用的是HTTP和HTTPS协议,这两个协议使用的默认端口分别是80和443,那么为了防止人们使用其他协议,很多时候代理服 务器也会限制访问的外部端口只能是80和443。碰到这种过滤方式,只能使用支持代理服务器级联的软件访问其他端口了。但由于HTTP协议是明文传输的, 所以也有很多代理服务器不对HTTP协议的端口进行过滤,只对HTTPS协议的端口限制为443。如果需要使用其他协议,而其它协议使用的端口正好是 443,那么我们正好可以利用HTTPS的密文传输特性,连接到目标服务器的443端口,代理服务器无法知道我们使用的是HTTPS协议还是其它协议。如 果不碰巧,其它协议使用的端口不是443,那么我们仍旧需要使用支持代理服务器级联的软件访问其他端口了。
4、探测HTTPS协议头。 由于HTTPS协议的初始握手过程仍旧是明文的,那么代理服务器可以检测连接到外部443端口的协议头。如果不是 HTTPS协议,那么就断开连接。碰到这种过滤方式,我们可以先把正常的HTTPS协议头sniff下来,加入到通讯双方,之后再进行其它协议的通讯,就 可以解决问题。
5、NTLM密码认证。有些代理服务器使用了NTLM密码认证,那么IE用户不会感觉到有什么问题,使用了其它内核的浏 览器或者其它应用程序时,就会提时输入访问代理服务器的口令。由于很多代理级联软件并不支持需要经过密码认证的代理服务器,会造成一定麻烦。可以使用一款 名为NTLM Authorization Proxy Server的软件解决问题。
6、URL过滤。有时候代理服务器为了防止用户访问某一类特定的应用——比如bbs——会过滤URL中带bbs的所有访问请求。碰到这种过滤方式,我们也只能使用代理级联的软件了。
上面大致讲述了会经常碰到的代理服务器过滤方式。不过由于代理服务器过滤的方式千奇百怪,本文无法罗列所有的过滤方式。而且除了代理级联软件有现成的之外,其它解决问题的方式都需要代理服务器使用者自己编写网络程序,所以其它方式也主要是供大家进行研究的。
最后,我给出使用了HTTP协议进行级联的软件源代码(下载), 使用方式为java -Dhttp.proxyHost=代理服务器地址 -Dhttp.proxyPort=代理服务器端口 net.tools.web.TunnelClient 本地代理服务器端口 级联的代理服务器URL,然后就可以使用本地代理服务器进行网络访问了。比如我们必须通过代理服务器192.168.0.200:8080进行外部网络访 问,我们可以运行命令java -Dhttp.proxyHost=192.168.0.200 -Dhttp.proxyPort=8080 net.tools.web.TunnelClient 7890 级联的代理服务器URL,之后我们把浏览器的代理服务器设置为127.0.0.1:7890即可使用。我再给出一个级联的代理服务器URL为 http://jinshan.isysjs.com.cn/tunnel/。此URL只供测试使用,请勿滥用。如果碰到NTLM密码认证的情况,请参考 上述第5种代理服务器的过滤方式。