金山卫士开源了,我认为这是好事,对于那些想涉足安全领域的人来说。有这样一份代码总比没有强。
以前金山毒霸收费的时候,被人骂,免费了被人骂了,卫士开源了,依然跑不了被人骂,这里暂撇开水军不说,貌似不骂人就无法说话了。
这篇文章的URL是从一个开源社区转过来,我承认,第一眼看的时候我也想骂人,想写个驳XXX,然后以专业测试角度去痛批一顿,但看第二遍,我认为这篇文章写的有很多地方还是比较中肯,所以我在这里为我第一印象对作者**表示道歉。但我同时也想说,对于不符合贵公司代码规范的地方就叫做实习生写的,这点我是不太认同。我们都知道,看一段代码是要参考开发环境以及代码上下文的,而不能通过一段代码来痛批别人水平太烂,单不说领域不同,所造成对于某些实现理解的不同,比如读取ini文件,我相信很多人都会去用WIN API,但有多少人了解这个API背后做的事情,和他的潜规则呢?所以在我不了解整个项目之前,我都不妄下结论。另外就assert的问题,我是想不到用assert会对自动化测试有帮助,在运行上万个测试用例时,一个assert,BOOM!的弹出来一个框,然后整个流程就傻掉了,这种蛋痛的assert除了让我想骂人以外,没发现别的好处。并且在某些服务端程序上是禁止用assert的,如果你不理解,可以仔细想想。
我是金山的一份子,虽然不是搞安全方面的,但我每天都会看到毒霸那帮小伙子几乎每天都加班,通宵达旦的工作,我很是佩服。公司能把投入那么多资金的产品开源,做为支持开源的人,我也为之感动。开源后,相信有很多技术非常NB人,可以很快看出别人代码的错误,我希望您们可以提交patch,增加卫士的代码质量,这对于国内安全软件以及开源软件都是一个不小的贡献。:)
虽然我不算是真正社会认为的那种程序员,但也是做程序开发,在开始的工作还算得心应手,但慢慢的遇到了瓶颈,通过跟别人沟通,分析以及反思,我发现有很多不好的习惯可能会导致日后工作的瓶颈,在这里跟大家分享一下,希望不要跟我一样。
1.用别人的库,API等,如果有源码,一定要研究源码!这点真的很重要,平时我们Coding,大多是能用,就OK了,不去管使用的函数是怎么实现的,会有什么问题。但在工作中发现很多问题却是由于我们没有正确使用函数导致的。说白了就是不了解他们的潜规则。所以建议大家如果能弄到源码,那么就一定要研究源码。
2.一定要读不错的源代码。比如Python的实现,C库的实现等等。
3.一定要弄明白,不要一知半解。这个我认为是最致命的,由于以前的懒惰导致现在很多东西知道是什么,但深究起来就不清楚了,虽然表面很清楚,但实际是不明白的,经不起推敲的。
4.读书一定要写符合自己格式的读书笔记。没有沉淀,就没有积累,不要相信自己的大脑。
5.多与人沟通,学会忍耐。当别人指责你代码的问题的时候,多听问题,但也要排除一些没用的话语。
6.编程的时候不要开QQ等可能会打扰你思路的工具。Coding是一个连续的大脑活动,如果被打扰次数过多就很难回原来的思路。这点真的很重要。
开始说下,写代码的时候难免会遇到算法的问题,所以无论是做什么职位,只要跟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*来解决这个问题,但发现需要维护两个队列,并且由于区间序列是无序的,还要用二叉树堆来维护排序,也是增加很多成本,最后就决定使用首先构建出区间矩阵,并通过不停的拓展区间的起点和终点,然后通过遍历来解决这个问题,思路如下:
经过程序实现,测试后验证想法是正确的,用时0.06m测试通过了97个无序的区间队列的连通性,当然还可以算出最短路径,那就直接上Dijkstra就行了。
由于本人并未系统的学习过算法,也非数学专业的科班出身,所以很多地方还是可以继续优化的,也可以用其他更好更优的办法来做,还希望各位科班出身的人不吝赐教哈。
刚刚同事贴了一个代码:
上面那段代码是单例模式的一个实现,多线程并发时候会不会有问题?
大牛的答案是,可能会有问题
原因在于编译器的实现与优化。如果,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都不会有问题,但不保证其他编译会不会出问题。
问题来自:程序员的自我修养 那本书第一章
看到很多大学生的朋友都很迷茫,不知道以后毕业做什么,能不能找到一份理想的工作,怕找不到,或者不是很理想的工作,就去考研,我认为这是逃避现实的做法,如果想深入学习,考研无可厚非,但如果只是为了避免找工作,那就太不应该了。
在小学的时候,我就希望快点毕业,早点挣钱,做自己喜欢做的事情,但到了大学了,迷茫了,就业形势愈来愈紧张,怕找不到工作,每天吃不下饭,睡不着觉,有一天我鼓足勇气去找了一家公司,希望做实习,哪怕不给钱都行,那家老板人很不错,告诉我,你现在实力不行,就算不给你钱,但也要给你电脑,工位等等,平时的水费,电费(开公司就知道贵了)都是成本,你目前不能给公司带来效益,所以建议你回家好好看着基本书,然后再来。就这样,我抱着2本书回来了。
之后的日子我每天的任务就是读书,写代码,不会就到处找人了解,慢慢的我发现IT领域很大,慢慢的发现自己有很多东西要学,慢慢的我感觉我找到了路,那个时候的感觉是不是怕找不到工作,而是怕时间不够,来不及学习更多东西,毕业的日子一天天临近,我都是抓紧每天的学习时间,毕业后找到了一份不错的工作。
说这么多其实就想跟大家说,过分的担心都是自己想出来的,走出一步,勇敢的去了解外面的社会,了解公司,去面试,不要怕被拒绝,因为每次面试你都会有收获,找你有经验的人对你的能力做下评估,对你的目标与现在的能力做个落差分析,都会对你很有帮助的。
学无止境,但学不一定非要在学校。逃避不是办法,最好的防守是进攻。没有改变不了的命运,只有不愿意改变命运的人。