金山卫士开源了,我认为这是好事,对于那些想涉足安全领域的人来说。有这样一份代码总比没有强。

    以前金山毒霸收费的时候,被人骂,免费了被人骂了,卫士开源了,依然跑不了被人骂,这里暂撇开水军不说,貌似不骂人就无法说话了。

    这篇文章的URL是从一个开源社区转过来,我承认,第一眼看的时候我也想骂人,想写个驳XXX,然后以专业测试角度去痛批一顿,但看第二遍,我认为这篇文章写的有很多地方还是比较中肯,所以我在这里为我第一印象对作者**表示道歉。但我同时也想说,对于不符合贵公司代码规范的地方就叫做实习生写的,这点我是不太认同。我们都知道,看一段代码是要参考开发环境以及代码上下文的,而不能通过一段代码来痛批别人水平太烂,单不说领域不同,所造成对于某些实现理解的不同,比如读取ini文件,我相信很多人都会去用WIN API,但有多少人了解这个API背后做的事情,和他的潜规则呢?所以在我不了解整个项目之前,我都不妄下结论。另外就assert的问题,我是想不到用assert会对自动化测试有帮助,在运行上万个测试用例时,一个assert,BOOM!的弹出来一个框,然后整个流程就傻掉了,这种蛋痛的assert除了让我想骂人以外,没发现别的好处。并且在某些服务端程序上是禁止用assert的,如果你不理解,可以仔细想想。

    我是金山的一份子,虽然不是搞安全方面的,但我每天都会看到毒霸那帮小伙子几乎每天都加班,通宵达旦的工作,我很是佩服。公司能把投入那么多资金的产品开源,做为支持开源的人,我也为之感动。开源后,相信有很多技术非常NB人,可以很快看出别人代码的错误,我希望您们可以提交patch,增加卫士的代码质量,这对于国内安全软件以及开源软件都是一个不小的贡献。:)

posted @ 2010-12-06 10:50 高级动物 阅读(4967) 评论(66) 编辑


虽然我不算是真正社会认为的那种程序员,但也是做程序开发,在开始的工作还算得心应手,但慢慢的遇到了瓶颈,通过跟别人沟通,分析以及反思,我发现有很多不好的习惯可能会导致日后工作的瓶颈,在这里跟大家分享一下,希望不要跟我一样。
1.用别人的库,API等,如果有源码,一定要研究源码!这点真的很重要,平时我们Coding,大多是能用,就OK了,不去管使用的函数是怎么实现的,会有什么问题。但在工作中发现很多问题却是由于我们没有正确使用函数导致的。说白了就是不了解他们的潜规则。所以建议大家如果能弄到源码,那么就一定要研究源码。
2.一定要读不错的源代码。比如Python的实现,C库的实现等等。
3.一定要弄明白,不要一知半解。这个我认为是最致命的,由于以前的懒惰导致现在很多东西知道是什么,但深究起来就不清楚了,虽然表面很清楚,但实际是不明白的,经不起推敲的。
4.读书一定要写符合自己格式的读书笔记。没有沉淀,就没有积累,不要相信自己的大脑。
5.多与人沟通,学会忍耐。当别人指责你代码的问题的时候,多听问题,但也要排除一些没用的话语。
6.编程的时候不要开QQ等可能会打扰你思路的工具。Coding是一个连续的大脑活动,如果被打扰次数过多就很难回原来的思路。这点真的很重要。

posted @ 2010-07-09 10:21 高级动物 阅读(3008) 评论(36) 编辑

    开始说下,写代码的时候难免会遇到算法的问题,所以无论是做什么职位,只要跟code有关,最好多多少少会一些算法,不会算法有时是很痛苦的,比如我。。。囧。

    需求很简单,就是检测在一堆无序的,有向区间内的连通性,比如:

    假设有如下的序列:

    1-4

    9-12

    2-6

    9-10

    6-9

    1-8

    其中,已知有1-8这个区间,那么如果有6-9的区间进入时,就可以确定1-9是联通的,因为6-9的起点在1-8的区间内。

    这里最低的起点是1,最高点是12,那么用什么办法可以快速的得到这队序列是否是联通的。

    经过思考,本打算用A*来解决这个问题,但发现需要维护两个队列,并且由于区间序列是无序的,还要用二叉树堆来维护排序,也是增加很多成本,最后就决定使用首先构建出区间矩阵,并通过不停的拓展区间的起点和终点,然后通过遍历来解决这个问题,思路如下:

  1. 创建一个map,用来维护矩阵(map用红黑树,查找效率很不错。)。
  2. while(插入一个区间):  #设插入节点为p,  p.x为区间起点, p.y 为区间终点
    1. map是否为空。
      1. 直接放入map,继续循环。
    2. 是否有以p.x为起点的节点。
      1. 检查p.y所能达到的是否比当前区间的终点要远。
        1. 更新当前区间的终点。
    3. 是否有以p.y为起点的节点。
      1. 检查p.x所能达到的是否比当前区间的起点要近。
        1. 更新当前区间的起点。
    4. 遍历map,查找p能插入的区间,并修改区间的起点和终点。
  3. 从最低起点深度遍历(此时矩阵基本是已经是一条线了)到最高顶点,成功就联通。

     经过程序实现,测试后验证想法是正确的,用时0.06m测试通过了97个无序的区间队列的连通性,当然还可以算出最短路径,那就直接上Dijkstra就行了。

     由于本人并未系统的学习过算法,也非数学专业的科班出身,所以很多地方还是可以继续优化的,也可以用其他更好更优的办法来做,还希望各位科班出身的人不吝赐教哈。

posted @ 2010-03-26 10:06 高级动物 阅读(942) 评论(4) 编辑

刚刚同事贴了一个代码:

上面那段代码是单例模式的一个实现,多线程并发时候会不会有问题?

 

大牛的答案是,可能会有问题
原因在于编译器的实现与优化。如果,pInst = new T;转换成机器码时,是先将分配的地址空间赋值给pInst,(这时可能其他线程获取了pInst)然后再进行对象的初始化,可能其他线程调用的时候得到的是一个尚未进行初始化的对象...

要解决这个问题就要用cpu的栅栏指令,阻止编译器调整机器码序列

代码如下:

#define barrier() __asm__ volatile ("lwsync")//powerpc提供的栅栏指令

volatile T* pInst = 0;
T* GetInstance()
{
    if (pInst == NULL)
    {
        lock();
        if (pInst == NULL)
            T* temp = new T;
            barrier();
            pInst = temp;
        unlock();
    }
    return pInst;
}

 

这样的问题估计VC或者GCC都不会有问题,但不保证其他编译会不会出问题。

问题来自:程序员的自我修养 那本书第一章

posted @ 2010-03-24 15:43 高级动物 阅读(323) 评论(0) 编辑

    看到很多大学生的朋友都很迷茫,不知道以后毕业做什么,能不能找到一份理想的工作,怕找不到,或者不是很理想的工作,就去考研,我认为这是逃避现实的做法,如果想深入学习,考研无可厚非,但如果只是为了避免找工作,那就太不应该了。
    在小学的时候,我就希望快点毕业,早点挣钱,做自己喜欢做的事情,但到了大学了,迷茫了,就业形势愈来愈紧张,怕找不到工作,每天吃不下饭,睡不着觉,有一天我鼓足勇气去找了一家公司,希望做实习,哪怕不给钱都行,那家老板人很不错,告诉我,你现在实力不行,就算不给你钱,但也要给你电脑,工位等等,平时的水费,电费(开公司就知道贵了)都是成本,你目前不能给公司带来效益,所以建议你回家好好看着基本书,然后再来。就这样,我抱着2本书回来了。
    之后的日子我每天的任务就是读书,写代码,不会就到处找人了解,慢慢的我发现IT领域很大,慢慢的发现自己有很多东西要学,慢慢的我感觉我找到了路,那个时候的感觉是不是怕找不到工作,而是怕时间不够,来不及学习更多东西,毕业的日子一天天临近,我都是抓紧每天的学习时间,毕业后找到了一份不错的工作。
    说这么多其实就想跟大家说,过分的担心都是自己想出来的,走出一步,勇敢的去了解外面的社会,了解公司,去面试,不要怕被拒绝,因为每次面试你都会有收获,找你有经验的人对你的能力做下评估,对你的目标与现在的能力做个落差分析,都会对你很有帮助的。
    学无止境,但学不一定非要在学校。逃避不是办法,最好的防守是进攻。没有改变不了的命运,只有不愿意改变命运的人。

posted @ 2010-03-11 23:34 高级动物 阅读(2234) 评论(17) 编辑
摘要: 非常简单的方法:MIT(Most Important Task)就是你当天最想、或必须完成的事。我曾经很忙乱,所以让自己每天有3个MIT——当天我必须完成的三件事。我还可以去做别的事么?当然可以。但无论我今天干了什么,这三件事要确保完成的。所以MIT是我每天首先要去做的事,一起床喝完水就开始。 MIT的规则的关键:至少有一个必须和我的目标有关。另两个可以是工作上的(通常都是...阅读全文
posted @ 2010-03-09 17:55 高级动物 阅读(126) 评论(0) 编辑
摘要: 在学编程的时候,都是一边抱着书,一边敲代码,这样的小孩学舌的方式学习,慢慢的就把书变成字典,需要的时候再查查,去开发小工具,基本都是一边写,一边解决问题,程序可以跑了,就是算完成了,这样作坊时的学习办法在学习期间是经常用到的,但到了工作中,这样做就不行了。 在最开始的工作中,我还是依靠自己的习惯去开发,任务布置完毕,风风火火的就打开了VS并建立了工程,然后不停的敲代码,不停删代码,直到把这个任务完...阅读全文
posted @ 2010-03-05 10:09 高级动物 阅读(502) 评论(1) 编辑
摘要:   测试开发这个职位在国内的IT行业算是一个比较新的职位,但在国外却很常见。   所谓的测试开发很容易就被理解成白盒测试,就是看看程序写的代码,给他们挑挑毛病,然后写一些测试代码什么的,其实这么理解也不错,绝大部分测试开发做的也就是这些事情。但测试开发不光做这些,虽然是测试,但也不要忽略它的“开发”。   在测试上,他们对程序的代码进行CodeReView,写测试...阅读全文
posted @ 2010-03-01 10:41 高级动物 阅读(114) 评论(4) 编辑
摘要: 工作快2年了,积累的东西都在脑子里,随着年龄的增加,记忆力开始降低,再加上没有写东西的习惯,很多好东西都忘记了,这次开博,主要是把这些东西记录下来,以后好有个查看的地方。 由于我的工作是测试开发,所以大部分的东西可能跟测试平台有关,当然也有一些其他扩展的内容,以及工作以外产品的内容,只要想到什么就写什么,希望可以坚持下去。阅读全文
posted @ 2010-02-26 15:46 高级动物 阅读(40) 评论(0) 编辑