我是按照我买他们的时间来安排列表的,从这里你也可以看到我是怎么开始学编程的,顺便把我的一些经历说说。
所有的书都是外国人写的,对这点我深感遗憾,国人写的不如我法眼。。。(这话说的)
1.首先是从高中带过来的两本:
一本是《时间简史简装版》一本是《薛定谔的猫》,这两本是我高二时候买的。其实还有一本《时间简史精装版》的,可惜后来被我搞丢了。
这两本都是讲理论物理的,很有意思,而且讲得不深入。。。特别是《薛定谔的猫》我老喜欢了,书籍资料跳转看:
《薛定谔的猫》 http://book.douban.com/subject/1089271/
略。
这个有兴趣的拿去吧,我现在对理论物理无爱了,因为我直到现在这门课还没过。
2.c#
大二之前我不知道啥是编程。。。大二有门课叫做c++,后来我那个暑假想借本书看看啥是c++,然后去了图书馆,我看到好多c啊,c,c++,c#。我不知道他们有啥区别,于是我随便找了一本,后来发现拿的是c#。然后之后就开始我的编程生涯了,从c#开始。
首先是一本重量级的书 《c#2005&.net3.0高级编程》(第5版) ,现在我只有下半本,上半本被人偷了。原价158.00元,现在10块钱处理。这本书很经典哦,主要是很厚,从新街口书店拿到学校,差点没压死我。。。
然后是一本《beginning c# objects–从概念到代码》,这是一本思想重于概念的书,和上面这本书结合起来看最好不过,算是进阶版吧。这本是完整的,18块钱,卡卡
其实我买了很多本c#的书,不过都被我搞丢了。。。
3.php
学了一些c#后,一直没突破,也就给院里做个小软件啥的,都幼稚的要命。后来偶然我不记得啥时候我开始了php旅程,之后php一直跟着我接近一年。。。
php我看过N本书,不过我买的书就可怜的少了,只有一本《php函数参考手册》。php程序员必备,哇咔咔。原价:69.我出 18元。
4.工程方法
学了编程,难免接触点方法学和工程学的东西,毕竟这些东西才是真正的修养,要不一辈子都是一个代码工人而已。
最经典的一本:《代码之美》,如果你不知道这本书有多牛逼,那你真的out了,不多说。原价:99.我出30元。
第二本:《编程之美》,微软那波人写的,很牛逼很好玩,原价:40元,我出20.因为是本好书。
第二本:《系统分析与设计方法》,这本书也很有用。但是我看的很少,我一个学长推荐我看的,我看不懂。。。原价:69,我出20
第三本:《设计模式初学者指南》,这本比较通俗易懂,也是很出名的书。原价:49,我出:15.
第四本:《uml用户指南》,买了没看过,uml太复杂,还是画脑图划得来。原价:49,我出:12.
第五本:《数据结构与算法-java语言版》第二版,我对算法不感冒,看到树那里就看不懂了。罪过啊。原价:59,我出18.
5.电
《无线电合订本 2007 下》,很经典的电子学杂志,里面很多可爱的例子和教程,5元抛了。
6.flash
大三暑假的时候,有个公司说要要我,但是要会flash,于是我花了三个月学flash。之间买了很多书,不过很多都没了,不知道去哪了。
第一本:《flash ActionScript3.0动画教程》很经典的一本书,看了保准不后悔。原价:59,我出 22.
第二本:《游戏关卡设计》,我无爱。5块钱
第三本:《advanced ActionScript3.0 animation》,这是英文版的,装订比书店那种好多了,之所以是英文版是因为没有中文版。我出 18元。
第一个来买的送程序员杂志一本。。。
No tags
首先说明下这里说的遮罩不是大家平常所谓的遮罩层\lightbox之类的效果,而是跟flash中的遮罩层类似的效果,也就是在一个层上覆盖一个遮罩层,只有这个遮罩层有内容的地方,下面那个层的内容才会显示出来,而且透明度也会起作用,感觉上说来有种反相的感觉,遮罩层上显示的地方下面的层就显示,遮罩层没有内容的地方下面的层就不显示,而不是被遮罩层盖住.
我们利用webkit中新增的一个css属性可以来实现这个效果:
-webkit-mask
这个属性可以在某个层上显示一个遮罩,关于此属性的具体文档,请跳转:
下面举个简单的例子来说明:
下面有两个图,左边是实例图,右边的图则将作为一个遮罩层附加到左边的图上,点击后就可以看到效果(务必使用最新版chrome或者safari4.0以上浏览器)


看了这个例子应该就可以理解什么是遮罩了.
我们发现这种遮罩实现的时候必须要一个图片才行,是不是觉得很麻烦呢,如果在程序中要多次改变遮罩形状,岂不是麻烦死了,于是我们就用canvas来实现一个动态设置的遮罩,当然不要对这个效果的期望太高,因为遮罩的渲染是不连续的,不要梦想用这个实现动画的遮罩,只是这种方法可以免去图片的烦恼,也可以自定义一些形状.只要你把这些形状画在canvas里就可以.
原理并不神奇,canvas元素有一个好用的方法,那就是:
toDataURL()
这个方法会把当前canvas里的图形转换成DATAurl格式的图片编码,然后…
我们把这串编码赋给css里的url()里就可以了…是不是很简单…
下面是个例子,在页面上点击,canvas就会重新绘制一个图形,然后作为遮罩,注意中间会闪一下,这就是瓶颈…
希望有人可以用的着这个效果…
dsssssssssssssssssssssssssssssssssssssssssssssssssssssssss
dsssssssssssssssssssssssssssssssssssssssssssssssssssssssss
sdssssssssssssssssssssssssssssssssss
关于target=”_blank”去留的问题在网上已经被反复争议很多次了。有的说要留,有的说要去掉。主张留的一方主要是考虑到target=”_blank”的属性目前来讲还没有一个好的方式来解决,而主张去的一方则拿出了rel与JS的解决方案。target=”_blank”是否的存在是否有必要我想目前还有很多正处在一种盲区。我查阅了相关的文献,发现其实情况并非是我们所想的那样,事实上target=”_blank”并非是不符合标准的,而用rel与JS的解决方案也是没有必要的,因为这是个误区,只要我们了解了rel与target的真正含义我们就清楚了其实这里本不应存在争议。下面我将我通过查阅文献所得到的知识与大家分享,我们先来了解一下target与rel的含义:
target ,允许指定在什么位置显示已经选择的超链接内容。也就是说链接的内容将在什么样的窗口被显示。target 的属性值有四个保留的名称,分别是:_blank,_self,_parent,_top。其中_blank的意思是浏览器总在一个新打开的、未命名的窗口中载入target=”_blank”链接的文档。这里大家也许会很不理解“未命名”是什么意思。事实上target 是可以给新打开的窗口赋一个ID,例如:target=”name” 这就表明通过target=”name”链接载入的文档将会在一个叫”name”的窗口显示。如果没有ID为”name”的窗口,那么浏览器就会新建一个名为”name”的窗口来显示链接文档。如果当前窗口的ID就是”name”那么这个链接文档就会在当前的窗口中替换原有的内容显示出来。而_self的意思其实就是当前文档,<a>的默认目标就是_self,这个属性值一般来说是用不到的。_parent是使链接文档在父级窗口显示,这个属性值只在框架结构中使用,如果身本就是顶级框架,那么其作用与_self相同。_top同样是应用在框架中的,但是他的效果是清除框架来显示目标文档。这对于从框架结构转向无框架结构是很有作用的。
现在我们知道了,target 是一目标显示的属性与浏览器密切相关的。那么rel又是什么呢, 为什么很多人把他当作是target 的替代属性呢?下面我们就来认识一下rel。其实不只有一个rel还有一个与之对应的属性叫rev,这两个属性的意思分别是:从源文档到目标文档的关系;从目标文档到源文档的关系。这里的源文档可以理解为链接所处在的当前文档,而目标文档也就是这个链接将要打开的文档。这下我们应该清楚了,其实rel与rev是一种文档之前的链接关系,而并非是与浏览器相关的如何显示目标文档的属性。
那么rel与rev有哪些关系呢?下面将一一列取并解释其中的含义:
next,链接到下一个文档;
prev,链接到前一个文档;
head,链接到集合中的顶级文档;
toc,链接到集合的目录;
parent,链接到源上面的文档;
Child,链接到源下面的文档;
index,链接到此文档的索引;
glossary,链接到此文档的术语表;
其中next与prev是一组。表明了当前文档与目标文档之前的关系是同级的关系,可以写成这样<a href=”movie_002.htm” rel=next rev=prev>。head与toc可以形成一个组合,表示者是由目录链接到最终的文档,或是由文档链接到目录。parent与child是一组,表示着由当前的文档链接到父级文档或是子级文档。而index与glossary可以与head分别组合,形成由文档到索引,或是由索引到文档;文档到术语表或是术语表到文档。
也许这样讲可能还是不很清楚,下面举个例子:我这里整理了一个电影文档资源,那么我需要对这些资源进行分类,我把电影分成:武侠片、战争片、爱情片、恐怖片、纪录片。那么我在电影根目录需要链接到下面的子类的时候那么链接的关系应该是:rel=child rev=parent ,而如果当前是武侠片的频道页,我需要转爱情片频道或是其它频道时,那么链接关系就应该是:rel=next rev=prev,当我们由一个武侠片链接到“卧虎藏龙”这部电影的文档时链接的关系应该是:rel=head rev=toc,当由“卧虎藏龙”链接到索引的时候链接关系又变成了:rel=index rev=head。
由于目前的CSS还不能抓取rel与rev的属性值,所以没有办法给不同关系的链接提供不同的样式,所以现在rel与rev只是用来使得网页的语义性更为完善。
然后来看看今天我开始怀疑哪个权威哦家伙了。。。
自从开始学编程,自从接触到数组这个东西,我就一直在不同的地点和不同的时间不断看到有人提醒:在用for遍历数组的时候一定要用 for(var i=0,n=arr2.length;i<n;i++)的方式哦,而不要用for(var i=0;i>arr.length;i++)的方式哦,因为用脑子想想也知道,第二种方法的第二部分会一直去计算数组的length,所以自然效率比较低。
哦?我们这里不说其他程序语言,而只讨论js,因为不同的语言,实现可能不同,其他语言是什么情况还要靠大家去探索喽。 其实上面说到的所谓的“动脑子想想就知道”也许只是因为大家只是用脑子想了想,而不是仔细想了想或者亲自去试了试。所以现在我们仔细想想,第一种写法真的会比第二种写法快么?arr.length会耗费很多cpu么?不会啊,为什么要耗费cpu呢?arr.length并不是调用了一个方法,而只是读取了一下数组的length属性啊,你认为读取原生属性和读取定义的变量,哪个会快呢? 我认为读取length会更快,所以我写了个测试来测试自己的想法: 我用了一个我自己的小测试框架,
var arr=[],arr2=[],i=0
while(i<100000){
arr.push(i)
arr2.push(i)
i++
}
M.TA.begin("0000");
for(var i=0;i<arr.length;i++){
arr[i]=arr[i]*arr[i]*arr[i]
}
M.TA.end("0000","for(var i=0;i<arr.length;i++)")
M.TA.begin("0001");
for(var i=0,n=arr2.length;i<n;i++){
arr2[i]=arr2[i]*arr2[i]*arr2[i]
}
M.TA.end("0001"," for(var i=0,n=arr2.length;i<n;i++)")
M.TA.showResult()
当然,这段代码是很变态的,占用了300多兆的内存。 结果如下:
总结:?
其实做这个测试不是为了强调for(var i=0;i<arr.length;i++)的写法快多少,因为测试也是有些许误差的,只是为了说明这种写法并不会慢到哪里去,而且这种写法有一定的灵活性,书写也简单,代码量又少,那我们为什么不用它呢? 如果是第一种写法,在循环的时候数组长度发生变化呢?这种情况就处理不了了吧
其实我还是尊敬权威的,所以写到这里的时候我心里仍然提心吊胆,难道是我哪里搞错了么?如果是,大家就当一笑而过吧,如果不是,那我总算写了篇人模狗样的博文了。。。
(hello,JavaScript)
补充1:有人提出对于NODELIST缓存length会有明显速度提升,我做了个测试,结果没有成功,因为对于nodelist的操作,上万级的操作浏览器就受不了了,所以测试没成功,但是我看着貌似也差不多。速度提升有限。。。
补充2:本文不是为了讨论哪种方法更快,而是讨论两种写法都差不多,何必用复杂的方法呢。。。
经常使用svn,但是项目经常做一些大的改动,很多时候我的项目所有的文件结构都会更改一遍,这时候一些svn的配置文件夹就会被我搞的乱起八糟,造成svn使用的时候发生错误和冲突。这个时候最好的办法就是清除所有的svn配置文件夹,然后重新配置svn,可是svn会在项目里每个文件夹下都建一个svn配置文件夹,要手动删除要累死了,于是我写了一段ruby脚本来做这个事情,删除某个文件夹下所有的svn文件夹,包括所有子文件夹
require 'find'
require 'fileutils'
Find.find('C:/xampp/htdocs/my') do |file|
if file=~/\.svn$/
FileUtils.rm_r file if File.exists?file
puts file
end
end
有的哥哥说我最近懒死了,博客好久没更新,の。我在学校做毕设,难得悠闲几天,不想写博客了,而且最近在做一些系统性的东西,总结性的比较少,不过以后的好菜还是不会缺的,等我归来吧。。。
酷狗音乐不错的,就是点试听也会把歌下载到本地,虽然有一段时间取消了这个功能,但是后来又加上了。
不过最严重的就是,酷狗这位哥哥虽然喜欢把所有格式的音乐文件都关联到自己,但是它在下载文件的时候认为所有的文件都是mp3格式的。
这真是个悲剧啊,不知道哥哥你怎么想的。
那好吧,wma的文件被按了个。mp3的后缀,后果就是foobar放不了,大多数mp3也放不了。
于是我写个脚本吧,ruby脚本,
require 'find'
Find.find('F:/') do |file|
if File.ftype(file) =="file"
File.rename(file,file.gsub(/((\.mp3){2,})/ ,'.mp3').gsub(/(\.wma\.mp3)/ , '.wma') )
end
end
改一下路径,就可以遍历这个文件夹了,然后自动把后缀改过来,做了两个处理,一个是去重,一个是wma纠正
在某个论坛上看到有人在问——“Which programming language should I learn first?”,看到了下面的这个回答,有点意思。
Depends.
- To program in an expressive and powerful language: Python
- To get a website up quickly: PHP
- To mingle with programmers who call themselves “rockstars”: Ruby.
- To really learn to program: C.
- To achieve enlightenment: Scheme.
- To feel depressed: SQL
- To drop a chromosome: Microsoft Visual Basic
- To get a guaranteed, mediocre, but well paying job writing financial applications in a cubicle under fluorescent lights: Java.
- To do the same thing with certifications and letters after your name: C#
- To achieve a magical sense of childlike wonder that you have a hard time differentiating from megalomania: Objective C
I could go on… but I’m not feeling hateful enough today.
翻译如下:
看你的需要了。
- 如果你想找一门表达力和功能都很强的语言:Python
- 如果你想更快速地开发WEB程序:PHP
- 如果你想和那些“摇滚明星”的程序员为伍:Ruby
- 如果你想学真正的编程:C
- 如果你想顿入空门的话:Scheme
- 如果你想压抑的话:SQL
- 如果你想基因突变成为非人类的话:Microsoft Visual Basic
- 如果你想要得到一个有保证的,但普普通通的,收入还不错的,在一间小卧室的荧光灯下写一些金融应用的工作:Java
- 如果你想在你的名字后放上一些认证和证书:C#
- 如果你想得到一些很难在自大狂和孩子气中区分的那种魔幻般的感觉:Objective C
我还可以再写去,因为今天我还没有足够的愤怒。
跟着这个思路,我也补充几条吧,
- 如果你想寻找在被虐中被大众称道的感觉:C++
- 如果你想整天都在说Fxxk的脏话:JavaScript (哪种程序员嘴最脏)
- 如果你想成为无所不能的BS一切的神:汇编
- 如果你想成为一个像春哥或犀利哥一样真正的男人:Brainfuck (BT雷人的程序语言)
呵呵,欢迎留下你的回答!
No tags
安装地址:https://chrome.google.com/extensions/detail/mlfjkaiaifhihimenekgfipnddpfpama
这个插件还算有用,现在的软件下载网站页面里都有N多假链接,而且版面很乱,如果不熟悉的话,很容易误点广告,于是我就做了这个插件,你浏览这些网站的下载页面的时候,他会把真实链接提取出来,显示在屏幕中央的显眼位置,这下子大家有福了,哈哈
上截图:
直接利用 icon那里的19*19px的空间,用canvas画出一个时钟来,可以设置显示不同的时间项哦.
https://chrome.google.com/extensions/detail/hehpdfonjepjabaegkbgaelghomhliih
要让一个程序运行起来其实很简单,但是如果要让一个程序稳定运行却是一件很不容易的事情.
1。功能探测.
很久前,偶然在哪里听说不要用UA探测来判断浏览器这个事情.但是我一直没有搞懂为什么不能用UA探测来判断浏览器,后来偶然发现某些版本的ie的UA混乱,判断的ie版本不准确.这是一个方面,还有一个更重要的方面是,我们不推荐使用UA判断的原因更多是因为我们不推荐使用浏览器探测来hack应用程序.
在css中,我们经常使用ie的条件判断来清楚滴区分各个ie版本,然后分别hack,通常不推荐使用特殊的hack,例如下划线,星号,\9等.原因可能是因为这样写不符合规范,而且不易于维护,也有一个比较特殊的原因,你用的hack可能被浏览器修复,
而在js中,可以来说恰恰是相反的,浏览器探测可以看做是准确的规范的类似css的条件性选择的探测方式,而另一种js探测则是功能探测.功能探测就类似于特殊的hack,浏览器每天都在不断更新,hack也在不断被修复,不支持的功能也在不断在增加.然而,js和css的确是相反的,在js中,我们需要使用功能探测,而不是浏览器探测,因为你应该关注功能,而不是浏览器,浏览器总是会变的,使用功能探测你能够知道浏览器是否支持这个功能,而使用浏览器探测,之后浏览器修复了这个bug,你的hack就不起作用了,而且可能引起其他更严重的bug.
opera在自己的文档库里举了一个例子:
Opera 9.2x的年代opera有一个严重的bug,那就是在某些特定的条件下(貌似还比较复杂),当向range插入多个 node 时,插入顺序是错误的。TinyMCE发现了这个bug,于是他们做了一个简单的hack:
if (isOpera) {
r.insertNode(bef);
r.insertNode(aft);
} else {
r.insertNode(aft);
r.insertNode(bef);
}
如果发现时opera,就把插入顺序反过来.很奇妙,bug也解决了,然后接下来呢.
opera发现了自己的这个bug,这是一个功能性的bug,需要立即修复.虽然他们知道在TinyMCE里会引起问题,但是它还是修复了这个bug,然后杯具出现了,在TinyMCE里,opera里出现了错误,造成诸多用户的困惑,虽然在新版本的TinyMCE中修复了此bug,但是老用户不能及时升级代码,这个错误一直困扰着用户.
而且在新版本中,TinyMCE再次使用了浏览器探测来hack:
if (isOpera && parseFloat(opera.version()) < 9.5) {
r.insertNode(bef);
r.insertNode(aft);
} else {
r.insertNode(aft);
r.insertNode(bef);
}
又是浏览器探测,TinyMCE应该提心吊胆才对,玩意opera哪天bug又重现了,那才是杯具中的杯具啊.
这个例子很明显地告诉我们,浏览器探测是靠不住的,
为了说明如何使用功能探测来解决这个问题,opera给出了解决方法:
// create a separate document to test in, to avoid adding debugging stuff to our working document var doc = document.implementation.createDocument( '', 'test', null ); // add some content doc.documentElement.appendChild( doc.createTextNode( ' test' ) ); // create range (make sure we create it in the test document) var r=doc.createRange(); r.selectNodeContents( doc.documentElement ); // insert something r.insertNode( doc.createTextNode( ' world') ); // and some more into the range r.insertNode( doc.createTextNode( 'hello') ); // content should be inserted at start of node, so what we inserted last is .firstChild var has_range_collapse_bug = doc.documentElement.firstChild.data != 'hello';
完美的解决方案,不是么?
2。错误处理.
前几天,遇到一个js的bug,bug倒很简单,很容易就解决了,但是由此却引发了我的思考.
bug是这样引起的,在淘帮派的发帖页里,用了一个异步提交数据的js,利用yui的script来直接提交form,在这里面有个获取form的过程,遗留的js里是用getbytagname来获取到页面里所有的form,然后取form[0]的.
因为我们一个页面里被分成了很多部分,每个部分由不同的人和组织维护.有人可能在页头里加了个form,于是乎,form[0]取到的不是正确的form了,程序在这里出错了.
由此想到:
[1。取元素还是要通过id来取,class和tagname都不应可靠.
[2。在程序中涉及到获取元素或者dom操作的时候,记得判断是是否获取到了.dom元素是否存在.
大道理我不会掰,主要是两个小例子吧,提醒大家在使用js的时候还是要注意很多东西的.
译注:开发人员如何从无休止的需求、项目进度中摆脱烦躁的心态,这是每个人都值得思考的话题。无意间看见了这篇文章,恐于太长遂将其精简翻译,错误之处难免欢迎指正。
同时如果你有有关程序员修身养性的观点和心得,欢迎说说你的看法。
-- Split --
其实每个程序员或多或少都会有个毛病,就是具有某种有强烈的“优越感”。而这种“优越感” 有可能成为激励自身不断发展的动力,同时也有可能成为其职场中的绊脚石。
程序员的这种心态,源自自身掌握的技术、以及多年积累的经验。正如上面所言,这种心态 能使其一切都力求完美、同时准确按照自己的思路行事,能使其技术不断的提升。而另一方 面,如果将这种态度套用给身边其他的人(包括陌生人、同事、朋友甚至家庭),则会发现 他的生活将会如履薄冰 — 他们只会看见完美的一面而忽略了更多更需要关注的事物。
总而言之,越早发现并解决这一问题,越对自身有利。套用 GeraldWeinberg 在《计算机编程心理学》中的一段话
这种想法是程序员必须解决的,他们对待自己的代码犹如对待自己身体的 一部分,因此他们拒绝所有的负面评价。相反,它们(指代这种心态)应 该及时的引导到正途,使其发挥真正的效用。人非圣贤,这不仅仅是心态 更是精神上的境界,并非所有人都能达到,但仍旧值得去尝试。
症状
那么,你如何得知这种“优越感”正在伤害到自己?除了应付那些没完没了的催促项目进度的 电话,以及给同事擦屁股的优化工程,其它的现象并非显而易见。
其实就我个人而言,时常也会自我责备,这就能窥出事态的严重。例如一方面你对项目疲于 奔命,而同时却忽略身边的人对你表达的看法(该死,这个时候我应该放下手头的工作听他 们说完的)。或者你“假装”静下心来听取他们的意见,但不就繁杂的工作却让你左耳进右耳 出。
其他的些症状
- 如上面所说的,不会妥善处理批评
- 不放心同伴的代码,经常性地对他们进行代码审查(Review)
- 报复性的编写大量充斥着错误的代码
- 个人的消极心态,对自身和团队造成不利的影响
- 必须要求进行测试,但出发点却是炫耀
- 对事物的看法仅仅局限于个人或者本职位的角度
这不仅仅是你个人的事情,编程以及项目开发实际上是团队活动。了解到这些,你将会意识到 你的心态将会直接影响到你的同事。
事实就是这样,当我对您的代码提出写意见甚至批评时,你应该听、并且认 真的听,这样你才能理解我的看法。
有可能最糟糕的情况就是,即便早已经收到其他同事的提醒,当事人已经陷入此泥潭无法自拔。
准则
让我们回到文章的题目本身,正如上面的例子中看到,“谦逊编程”不是编程技术本身,而是 种态度,但它的确会比你掌握的某种技术要有用的得多。
行为准则的确能改变人的心态,下面是些不成文的建议,或许你可以尝试下
- 不要草率的宣布你的决定,在大多数情况下,你应该和你们的同事们讨论
- 不要使用这些论调,这非常让人感到不适:“这是见过的最糟糕的代码了”,换之你可以这样说,“我有个更好的解决方案,要不看看?”
- 不要轻易认为他们没有考虑到你想的方式,即便很不幸是这样,应该善意的提醒。例如“你觉得我这个看法怎么样…”
- 不要无理由的批评你认为很弱智的现象,例如“我觉得 DBA 脑门子被夹了,这个字段竟然使用 INT 型”
更多的,可以参考 Tech Republic 中的“谦逊编程”十条诫律:
- 理解和接受你将犯下的“错误”。
重点是及早的发现你已经犯下的错误,当代码投入使用以后,改动起来就会非常的困难。 - 你的代码不能代表你的人。
记住始终要 Review 你的代码,即便你已经认为无懈可击,经验证明总能发现些错误。 - 不管怎么样,有些“奇技淫巧”总能派上用场,而可能这些技巧别人知道的比你更多。
如果你坚持不耻下问,你的同伴总能分享你更多。 - 不要在完全没有沟通的情况下,自作多情的进行代码重构。
当你确定要更改别人的代码时,必须加上良好的修改记录,这也是出于对他人的种尊重。 - 对待那些新手要保持充分的尊重、细心以及耐心。
记住当他们成长起来后,能帮你解决的问题会比你想象中的还要多。 - 唯一不变的是变化。
怀着开放的心态对待变化,对于各种需求、平台甚至开发工具的变更,应该是迅速适应而不是牢骚满腹 — 这样解决不了问题。 - 真正的权威来自学识,而不是立场。
权威源自学识、尊重源自权威。 - 优雅的接受失败。
最终你的一些观点将会被推翻,即便你有能力证明你的观点是正确的,请不要重复的争辩。帮助其他人意识到这点的最好工具,就是你的理解以及时间。 - 不要成为“办公室男”。
不要在昏暗的办公室里独自喝着可乐敲着代码。当与外界隔绝,离开同伴的视线,也就说明你离开了一个开放、合作的环境。 - 批判代码而不是编写它的人。
要知道你的意见可以影响到代码也可以影响到其人,如果你想尝试下如何打击别人的自信并造成冲突,那么尝试下吧。
F = 8×{100-[4×(JS文件数-3)+4×(CSS文件数-2)+3×(CSS背景图连接数-6) ] }
+6×(100-10×未使用CDN的连接个数)
+10×[100-11×(Expire时间小于172800秒的连接个数) ]
+8×[100-11×(文件大小大于500字节且 未使用gzip的连接个数)]
+4×[body中没有CSS连接 ? 100∶ (99-10×body中的CSS连接数) ]
+4×(100-5×head中的JavaScript连接数)
+3×[不存在CSS表达式 ?100: (90-2×CSS表达式数目) ]
+3×[100-5×(域名数-4)]
+4×(100-10×未精简的CSS与JS个数)
+4×(100-10×Redirect个数)
+4×[100-5×(重复的JavaScript个数+重复的CSS个数) ]
+2×(100-11×未使用Etag的连接个数)
+4×(100-5×未缓存或者缓存时间不足3600秒的AJAX请求个数)
+3×(100-5×请求方式不是GET的AJAX个数)
+3×{DOM元素数量<MaxDOM ?100∶ [99-10×⌈((DOM元素数量-900))/250⌉ ] }
+4×(100-5×状态为404的连接个数)
+3×[cookie大小不超过1000字节 ?100∶ (99-10×⌊页面cookie的大小/1000⌋ ) ]
+3×(100-5×不满足cookie free要求的链接个数)
+4×[100-(2×使用hack的filter个数+5×未使用hack的filter个数) ]
+3×(100-5×在HTML代码中设定width和height的图片数)
+2×[100-(favicon不可缓存或缓存时间小于3600秒 ? 5∶0)-(favicon大小超过2000字节? 5∶0)]
Score = F / 89
No tags





