Shell's Home

Sep 9, 2008 - 1 minute read - Comments

程序员的几个分类

程序员有高下之分,可高下怎么分?到底什么是高程?程序员要完成哪些任务,怎么评价是否完成的很好? 下面由贝壳同学来胡诌一下他的个人感想,以下的程序员都指商业程序员。当然,爱好者可以类推。 首先我们先讨论一个风马牛不相及的问题,程序值钱么?废话,人家账单大门兄都已经是世界首富了。可贝壳认为,程序不值钱,算法也不值钱,如果说值钱的话,就和软件光盘上面的光盘一样,是个成本性质的辛苦钱。软件里真正值钱的是软件的思想,我们大可以想象一下,写一个让人想穿脑子也想不出怎么用的程序——当然,会写的程序员想穿脑子——然后想想值钱不值钱。大家就会了解到,其实程序员,编程本身,是和装配线上的装配工一样的低附加值行业。不同之处在于,不同培训程度的人劳动生产率不同,而且生产率差异远远大于普通行业而已。好的Coding比差的生产率会高上数倍,而且很难多找几个差的来替换好的,水平不足。但是,做Coding,无论做多快,其价值只会线性增长。 那么为什么软件也被称为今年来发展最迅猛的产业呢?其实关键在于软件业让人可以实现以前无法实现的一些想法。例如,以前不会有人能做到让地球上所有的人 (好吧,是大多的人)坐下来一起讨论一个事情的方法。那么,今天我们的技术已经可以做到。有个人针对当前的技术,设计出一个很好的让所有人坐下来讨论事情的系统。包括一个BBS,带自动翻译系统。在线视频会议中心,可以附加购买在线翻译。一个邮件列表,带存档功能。一个文档编辑和管理系统,带同步编辑,版本管理和资料索引。当我说出上面这堆东西的时候,可能有的人已经晕了,当然,六牙四皂小姐估计已经不继续看了。不过做过一些时间和电脑有关商务的童鞋应当都理解这些东西的意义,并且可以想象这些东西带来的便利。在线翻译的支持系统,邮件列表存档系统,同步编辑,版本管理,资料索引,这些都是技术。尤其是资料索引和自动翻译,更是技术的巅峰之作。可是如果不是结合起来让客户用的舒服,这些东西有价值么? 软件业的价值在于将技术转换为客户的满意,并且最终转换成客户的钞票。越成功的规划,越能满足更多的客户,并且让他们付更多的钱。从这个角度讲,不论软件做的怎么样,微软的规划是全球一流的。同时,能促进这个过程的人,才是具有价值的。不过遗憾的说,到这步基本就不是程序员,而是CTO了—— 程序员的最高价值,在于根据技术和行业,判断应当发展什么技术,采用什么框架,从而低成本,高效的做出让客户满意度最高的系统——而且不是一个系统,而是一堆。这有两个非常苛刻的要求同时存在,对于技术非常熟悉,视野开阔感觉敏锐,否则怎么去感觉技术的价值,判断应当研发的技术?就这点而言,许多程序员在超过30岁后往往都可以在熟悉的领域内做到,有条件的话大概可以在多数领域做到。然而最麻烦的在于,做这个事情的时候,你必须熟悉客户,熟悉客户需要什么。这点往往是不可能的!客户是不可理喻的!技术不是万能的!要知道,使用最好的技术,设计你最喜欢的系统,往往是客户最讨厌的事情。行业客户如此,通用客户更如此。 如果上点你做不到,自然有高水准(也许吧)的人来做,那么你可以做次之的工作。什么呢?执行他们制定的方向。上层的人会告诉你应当发展什么技术,采用什么框架。现在要求你——不用会——能够整合实现这个目标。说明白点,你可以招,但是要求能留下人,低成本。你可以培训,但是要求能做事。你可以研发,但是要求好用。你可以买,但是要求低成本。如果你能实现这些目标,那么同样,你也是有价值的。 这个层次的程序员往往是Project Manager(当然,很多PM根本不是程序员)/Team Leader/Core Programmer。对于他们的要求往往是兼顾技术,行政和人事的。他们需要能够组织研发,积累技术,产生产品。很遗憾的,个人编程能力往往又是次之。不过程序员是很艺术化和个性化的一群人,在这个位置上的人,如果没有相当的技术水准,很难镇住下面的人,用普通管理人员来管理程序员的结果往往是给程序员联合起来耍。因此一般情况下也需要了解大致的程序,并且最好有一定技术水准。 最下面一个层次的人,基本就是能够实现程序,会用上面决定的框架和技术,编码效率高,工资要求低——别的没了——当然,以上是从职业分工来讲一个职业程序员的价值的,你可能说上面没道理,贝壳乱讲。不过事实是,职业的情况下就是上面的状态。当然,从业余爱好者,技术研发者来说,程序员又有另外一种不同的分法。 第一个层次,是刚刚学会技术。能够使用某种特定语言,按照一些例子编写一些程序。实话说,按照贝壳的程度,入手一般语言做到这点不超过7天。然而很多人会徘徊在这个水准无法进步,原因在于——他们能写程序了,而且写了能用。从这个引申开来,顺便说一下,程序员的进步是个很吊诡的事情。一方面来说,要勤于钻研技术才能进步。但另一方面来说,如果不够懒,是很难有足够动力学程序的。因此,好程序员都是勤于钻研的懒汉。 第二个层次,学会了使用框架,并且能够设计一些中度复杂的系统,开始接触第二语言。和初级程序员不同的是,他们能实现一套完整的系统,而不是一个个零散的功能了。这要求他们了解框架,什么时候触发什么函数,系统间怎么互相通讯。并且,有水准的还可以写一些小型的框架。 再上一个层次,了解软件工程对软件的意义,能够跨多种语言编程,灵活使用设计模式,能够设计复杂框架,习惯文档化。和上面的区别看起来不大,不过是能多用几种语言,朴素的设计被设计模式所规范,设计的框架复杂化,并且会写一堆无聊的文档。不过从这步开始,程序员开始了迈向大道的第一步,在这个层次以下的只能算爱好者。无论是研究技术,研究数学理论,还是什么,规范化都是必须而且是非常重要的。我们很难想象一堆工程师,各画各的图纸,最后房子还建的多快好省的。同样,作为高级程序员,头一步就是学会和别人合作。使用设计模式的规范进行设计,使用文档描述系统,可以跨越多种语言协作,了解多种语言思想,这是必须的。 再上一个层次,就已经不是程序员的境界了。作为程序员,上个水准已经到头了。更强的程序员意味更规范?效率更高?那是八级钳工!作为程序员,你可以不认识英文,你可以大字不识一个,然而你必须是个数学高手(其实现在数学高手大字不识一个几乎不可能)。作为程序员的巅峰,你可以很轻易和他人协作,使用合适的语言,然而无法规避的是对问题的抽象描述和求解。在贝壳作为程序员的这段时间里,无数次的碰到数学问题,有些往往是大学里面我们所不屑一顾的。例如蒙特卡洛法,拉格朗日乘子算法,这些在程序里面都有很重要的应用。有的时候更要自行抽象数学模型,并且设计满足时间限制和空间限制的解法。能够抽象问题,解决问题的,才是真正的技术系的高手。 OK,上面,贝壳从两个方面(工程和技术)论述了程序员的高下之分,作为他胡诌的结果,他目前的水准大致是——不知道。并且很遗憾的告诉大家,目前贝壳能看到的就这么多,再上面是什么样子——要么等到了再告诉您?

Sep 8, 2008 - 1 minute read - Comments

火灾

2008年9月7日下午15时45分前后,南泉路1200弄门口的餐馆二楼厨房着火。火灾造成了部分居民家中电视线路中断,从而引发了居民围观。目前着火原因并不清楚,有附近居民说该厨房使用柴油工作,因为墙壁挂油起火。火势在16点前后得到控制,渐渐熄灭。 下面请自己去看相簿,里面有六张照片,并且贝壳手里有10分钟左右的录像,需要的可以在http://shell909090.3322.org/fire.3gp下载到内容,http://shell909090.3322.org/fire.rar可以下载到全部照片。

Sep 6, 2008 - 1 minute read - Comments

C++下的Variant

所谓C++语言,是一种强类型语言。即是说,C++种的某个变量,在使用时类型是已经确定的。这个并不是设计者的喜好或者是偏心,而是C++中的变量都会被翻译成准确的内存地址和大小,如果类型不确定是不可能处理的。但是在事实中,我们经常要处理一种”变类型”。例如,我们可能需要解析表达式,这个时候我们可能用一个或者两个栈来解决这个问题。可栈里面塞的东西就精彩了,对象,函数,数据,都在里面。这时候,如果是python,我们可以直接用list,他是弱类型的。但是C++怎么办? 一般来说,我们会使用Variant类型来解决这个问题。这是C++面对对象机制和算子机制所派生出来的产物,能够让用户自行定义对象的行为。如果一个对象,可以表现的像这个又像那个,那不就解决问题了?因此在COM中就有一个variant。不过贝壳看过机制,是一堆东西的集合,非常的不美丽。今天贝壳又看到一个variant的实现,漂亮多了。 废话少说,上代码。 #include using namespace std; #include using namespace boost; int _tmain(int argc, _TCHAR* argv[]) { any a; a = 10; printf ("%s: %dn", a.type ().name (), any_cast(a)); a = 10.5; printf ("%s: %fn", a.type ().name (), any_cast(a)); a = string ("str"); printf ("%s: %sn", a.type ().name (), any_cast(a).c_str ()); return 0; } 当类型错误时,出现bad_cast exception。

Aug 27, 2008 - 4 minute read - Comments

python的性能问题

贝壳最近在一个朋友的网站上看到了关于SICP零钱兑换问题的python求解,使用了记忆机制,然后他给出了代码。然而他的代码计时上有点小问题,也没有用包装器(奇怪的是,有写),而且python的栈深度有限。因此贝壳做了几个修改的版本,需要测试下性能,下面就是关于性能的几个问题和过程。 本文详细论述了python语言下和C++语言下使用各种方法测试代码性能的方法,以及粗略的关于两种语言不同算法性能对比。 原始的python代码是这样的: def change_coins(money): first_denomination = { 1: 1, 2: 5, 3: 10, 4: 25, 5: 50, } def cc(amount, kinds_of_coins): if amount == 0: return 1 elif amount < 0 or kinds_of_coins == 0: return 0 else: kind = cc(amount, kinds_of_coins - 1) kind += cc( amount-first_denomination[kinds_of_coins], kinds_of_coins) return kind print("change_coins return %s" % cc(money, 5)) change_coins(300) 利用记忆原理包装后是这样的: def memoiza(fun): cache = {} def proc(*arg): if arg in cache: return cache[arg] else: x = fun(*arg) cache[arg] = x return x return proc def decorator_change_coins(money): first_denomination = { 1: 1, 2: 5, 3: 10, 4: 25, 5: 50, } @memoiza def cc(amount, kinds_of_coins): if amount == 0: return 1 elif amount < 0 or kinds_of_coins == 0: return 0 else: kind = cc(amount, kinds_of_coins - 1) kind += cc( amount - first_denomination[kinds_of_coins], kinds_of_coins) return kind print("decorator_change_coins return %s" % cc(money, 5)) decorator_change_coins(300) 不记忆,利用栈模拟递归展开是这样的:

Aug 15, 2008 - 1 minute read - Comments

运气真好

昨天晚上吃完晚饭,觉得应该勤快点,还指不定什么时候回去呢,把衣服洗了。刚刚把衣服放进去,电话过来,说系统出问题了,要赶快去看看。于是,贝壳赶快出门,去看看系统有什么问题。 进去被一顿狂说,怎么这么不稳定,怎么解决。贝壳一个头两个大。马上去看看什么问题,一看把我气个半死。原来新华社的稿件都是一个xml,一个txt,一个图片,主文件名一样,贝壳的程序也是基于这个原理写的。现在到好,只有图片没有xml,或者只有xml没有图片。这叫贝壳做个P啊!据说是因为新华社要推新格式,所以老格式不怎么支持了。问题是,上面说保奥保奥,居然奥运期间来这手,这不是要整死人么?而且通知都没有的,要不过来看,黑锅就我背定了。 抱怨归抱怨,贝壳还是赶快改程序,做了个入新格式的。进度还挺快,虽然差异一堆,但是做到早上三点半基本就做好了。到实验机器上一跑,全部通过。然后到生产环境中一炮——全部报错。 OK,下面可就是贝壳无能为力的了。毕竟数据库那里应该都是一样的,而且也不是贝壳写的,无法调试。于是今天只有这样,回去睡觉。走到电梯里面,贝壳觉得不对,味道不对,一股臭脚的味道。这种味道只有两种可能,一种是中国男足来过了,一种是下雨。出门一看,果然,大雨滂沱。最要命的是,贝壳只带了两套衣服,还有套正在水池里面泡着~~~ 于是贝壳一路狂奔,跑过去没两步,哗的一声,贝壳就不知道陷到什么里面去了。吓了一跳,赶快站直,包举高。仔细看看,原来前面马路修路,旁边的土还没有填完整,给水一冲就变成了泥浆坑。贝壳就是陷到这里去了,水刚好漫过小腿肚。 慢慢爬上来,然后贝壳就不敢跑了。前面毕竟还是有几个没有完成的井的。万一掉里面去,连申诉都不会有人管的,毕竟那是还没修好的工地。于是慢慢慢慢走回去,到宾馆的时候全身湿透,外带两脚泥。而且两套衣服全报销了,连第二天吃饭怎么出门都不知道~~~ 奥运期间,这个运气还真是——无敌了。

Aug 11, 2008 - 1 minute read - Comments

最近悟到了一个道理

贝壳问上帝,中国房价什么时候下来。上帝说,通涨结束,或者居民消费上去就下来了。 贝壳问上帝,中国居民消费什么时候上去。上帝说,全民保障体系搞好就上去了。 贝壳问上帝,中国什么时候结束通涨,搞好全民保障体系呢?上帝哭着说,我看不到那天了。 上面是拿中国足球的玩笑改的一个玩笑,不过贝壳真的悟到了房价高的原因。通涨乱高无比,保障一塌糊涂,赚了钱不敢花,也不能放,当然只有买房了。房价上涨,通涨更加高高高。

Aug 3, 2008 - 1 minute read - Comments

程序员入门的12个问题

以下题目是应一个朋友问而写的,适用于刚刚入门有志或者有需要做程序的朋友的题目。题目脱胎于日常编程中常见的一些问题,很多是贝壳实际碰到问题的变形。题目不注重所用语言,每道题目可以用不同语言解决。有意思向计算机方向发展的可以试试用不同语言来解决,看看哪种语言最方便解决这种问题。如果打算增加难度的话,请使用C++来做,并且尽量抽象复用。在这个过程中积累下来的可复用代码会对以后编程有很大帮助。 1.读出文件中的以下格式内容,计算逆矩阵,并按照同样格式输出。 1 2 4.5 3 0 1 9 5 2 数字间以空格分割,行以回车分割。 难点: 输入和输出应当可以选择是键盘输入还是文件输入,输出到屏幕还是输出到文件。 逆矩阵计算中有可能求不出,出现除零。设法避免直接的报错。 评价: 很中规中矩的一个问题,有点竞赛的味道。只要做过程序的人一般不会失手。 2.某个XML,其中记录了一些信息。信息是按照时间-地点-人物的顺序记录的,例子如下: … 现在需要你颠倒一下,变成这样的: … 难点: 看看能想出多少解决问题的方法。 试试尽量减小内存消耗。 评价: 解决问题的方法很多,比较一下这些方法的优劣。 有一年以上程序经验的就可以最终解决,但要解决的比较完善需要两到三年经验。 3.下载google的首页,跟踪二级连接(二级连接,就是首页中连接指向的页面,上面连接指向的页面)。 并计算其中所有页面,显示出的非空白字符的个数。(显示的文字中的非空白字符) 难点: 试试看跟踪js脚本链接。 登陆后的google首页是不一样的,包括提示,语言类型,设法统计登陆后的首页。 如果是多级呢? 评价: 宽度优先和深度优先算法的应用,对集合运算有一定要求。 重点在于获取和处理html页面的方法。 一年以上即可解决,完善程度和技术水平关系不大。 4.运行两个程序,A和B,将A的输出输入到B中。 难点: 需要等待A的输出和B的输入,以及程序的终止条件。 评价: 需要对系统熟悉,知道管道和用法。知道进程间交互的API。 需要研究过系统,程序水平没有要求。 5.遍历某个目录,找出其中的特定图片文件。 难点: 怎么分析图片文件?文件名是比较粗略的方法,更好的是使用文件签名分析。 下次遍历的时候速度怎么提高(假定文件不变化)。 评价: 还是深度和宽度搜索题目,分析文件是难点。 扩展要求对于数据缓存有一定要求。 一年以上即可解决,文件签名分析看个人水平。 6.监视某个目录的变化,将新加入的mp3的相关信息(IDv3)邮件发给我。 难点: 怎么监视目录变化? 怎么提取MP3的内容? 怎么发邮件? 怎么保证不漏内容。 评价: 要对系统熟悉,了解mp3格式或者能够自行寻找库扩展语言。 了解邮件发送协议,或者能使用系统库发送邮件。 两年以上可解决,完善需三年以上水准。 7.写一个程序,可以计算加减乘除,支持括号。 难点: 让你的程序算算1+2*3,看看是多少。正确应当是7,设计不良是9。 看看你的程序,2/6*3得多少,是不是1.0(最好是1)。 让你的程序设法支持乘方和函数。 评价: 对数据结构和算法要求很高。 一年以上可解决,要扩展支持算符和算法,需要三年水准。 8.画一只乌龟,保存为图片。 难点: 让用户动手画? 试试保存为各种格式的图片。 评价: 实用项目,按照书本教程最多12小时就可以掌握。 然而需要自行解决并做好,至少一年以上。

Jul 31, 2008 - 2 minute read - Comments

avast4 collide with ext2ifs

引用 Affected Product: Avast4 home edition ext2ifs 1.10c ext2ifs 1.11 Description: avast4 home edition is a free anti-virus tools. In 2008-07-30 it update some files, include some file called ‘aswSP.sys’. According infomation in autoruns, it’s avast self protection module. [Here is info from autoruns.] aswSPavast! self protection module ALWIL Software c:windowssystem32driversaswsp.sys [Here is info from update-log] 2008-7-30 7:36:14 file Direct move of file: C:Program FilesAlwil SoftwareAvast4SetupINFAMD64aswSP.sys 2008-7-30 7:36:14 file Installed file:C:Program FilesAlwil SoftwareAvast4SetupINFAMD64aswSP.

Jul 16, 2008 - 1 minute read - Comments

今天25岁

今天贝壳25岁了。 前两天时间紧,赶快找两个人吃了顿当过25。今天早上起来,就收到了六牙四皂小姐的恭喜。这一刻,我总算了解她收到我一堆废纸当生日礼物时的心情了。路上第二个过来,是老妈的。到公司,兔子姐的第三个来了。然后,贝壳把名字改成了今天25岁。猫小姐的第四个和蛆小姐的第五个也来了。才五个,还有两个是提醒的,好失败。 不过无论如何,还是谢谢上述人,在我不长的人生中,还有你们记得我。