Misc

浏览模式: 标准 | 列表 | 图文
阅读代码真的很难

阅读代码真的很难

在转载这一篇文章之前,我想,做为一名开发人员,或多或少总得读过多少代码的吧。读代码之前有感觉一亮的代码,也有让你看的很郁闷的代码吧?
如果仅仅是学习,你或许还会放弃那些读的很郁闷的代码,可是如果你是在工作中,你在做二次开发的时候,你遇到那些让你郁闷的代码你怎么办?忍着,不断忍着,然后得继续看下去。

恩。看看人家微软的人怎么说的:
编者按:原文作者Eric Lippert是一名资深软件设计工程师,从1996年起一直在微软开发部门任职,协助设计并实现VBScript、JScript、JScript .NET、Windows Script Host、Visual Studio Tools for Office 和 C#。

Escalation的工程师JeremyK在他博客中问到:

你是怎么教人们快速深入挖掘不熟悉的代码(不是自己所写的)?我学习如何编程的方法很传统 —— 自己动手编码。但我现在很纠结:到底是集中精神阅读源码,还是自己编写。对我而言,似乎唯一有效的方法就是自己写过。

不是和Jeremy开玩笑,写代码的确没有读代码难。

首先,我同意你的看法,几乎很少有人能读代码但不会写代码。这不像自然书面语或口语,理解他人的意思并不需要去理解他们为什么要那样说。比如,如果我说:

“写代码有两种方式:一种严格且详细,另一种模糊且草率。前者生成简洁分层的婚礼蛋糕,后者却是意大利面条。”

上面这句话产生一个平衡且幽默的效果,但即使听众和读者不理解我使用“零照应”和“并列句”这样的文字技巧,也会理解我要说的意思。但是说到代码,既要从代码本身中理解代码作者的意图,又要理解代码产生的预计效果,这两者都极为重要。

因此,我又回到那个问题了,有些人需要快速切入代码,但不需要动手写代码,那我们如何编写适合这些人的代码?

下面是我在编写代码时,尽力去做的事,目的就是使其他人能轻松阅读:

  • 使代码遵从工具。Object Browsers和Intellisense虽然很好,但我告诉你,我是守旧派。如果找不到我想要的,我会不高兴。什么使得代码成为可查询的呢?
    • 像"i"这样的变量名不好。如果没有明确的错误提示,你就无法轻易查找代码。
    • 避免使用是其他名字前缀的名字。比如,在代码中有个“perfExecuteManifest”,如果再有一个“perfExecuteManifestInitialize”,这就会让我抓狂,因为每次在源码中查询前者时,我不得不费力地过滤掉后者所有的实例。
    • “临时传递数据”(tramp data)应使用相同的名字。所谓“临时传递数据”(tramp data),就是指那些传递给方法A的变量,还要传给方法B的变量。这两类变量实际上是相同的,所以如果它们有着相同的名字,则更好。
    • 别用宏来重命名东西。如果有个方法叫get_MousePosition,那别这样GETTER(MousePosition)来声明该方法。因为我会找不到实际的方法名。
    • Shadowing会引起很多问题,请不要用它。
  • 坚持使用一种命名模式。如果你打算用匈牙利命名法,那就坚持并广泛使用,否则将适得其反。使用匈牙利命名法来记录数据,而不是存储类型;记录普遍事实,而不是临时条件。
  • 使用断言来记录先决条件(preconditions)和后置条件(postconditions)。
  • 别缩写英文单词。确切来说,别缩写成稀奇古怪的形式。在脚本引擎中,有个变量名叫“NME”,这让我非常抓狂!它应当叫“VariableName”。
  • C语言标准运行时库的设计不是很优秀。别去效仿它。
  • 别写“聪明”的代码;当代码出现问题,维护代码的程序员没时间去理解你的聪慧。(编注:这条建议即为:编写可维护的代码,详情可参见《明星软件工程师的10种特质》中的第8点。)
  • 理解编程语言特性的设计初衷,使用这些特性去做它们适合完成的工作,而不是它们能做到的工作。例如:别把异常当做一般的流控制机制来使用(即便你能做到),而应该用它们来报告错误。别强制把接口指针转换成类指针,即便你知道这样没问题。
  • 按功能单元划分源码树,而不是按组织结构。比如:我目前所在团队中,有2个根子目录的名字是 “Frameworks”和“Integration”,这是两个团队的名字。不巧的是,Frameworks团队名下有一个叫“Adaptor”的子目 录,而“Adaptor”却是Integration的子目录,这就非常令人迷惑。同理,(如果)有着相同子目录的不同的子树,有些是客户端的组件,有些 是服务端的组件;有些是管理组件,有些是非管理组件;有些是处理型组件,有些是非处理型组件;有些是零售组件,有些内部测试工具。这就会乱七八糟的。


当然,我实际上根本没有回答Jeremy的问题——如何调试不是我写的代码?

这取决于我的目的。如果我只是因为一个bug,而深挖一段具体的代码,我会在调试器中逐步跟踪所有代码,写下我“走过”的调用分支,记录下哪些方法是 特定数据结构的“生产者”,哪些方法是“消费者”;我也会仔细盯着输出窗口,查看出现的有用信息;还要打开异常捕捉器,因为异常通常是问题所在。设置断 点;我会记录所有和我上面建议相反的地方,因为这些东西很可能误导了我。

如果我想在理解一段代码后修改它,我通常是从代码头部开始,或者先查找公共方法。我要知道类是如何实现的,它是如何扩展的,它的作用,它是如何嵌入整 个代码中的?我会尽力理解这些东西后,才去了解这些特定部分(代码)是如何实现的。这耗时虽更长些,但如果你准备改动复杂代码,你应当那样做。
译文出处:伯乐在线 - 职场博客
译文链接:http://www.jobbole.com/entry.php/438

原文作者:Eric Lippert  编译:伯乐在线 敏捷翻译组 - 关关

--EOF--

我承认,我写过垃圾的代码。更垃圾的代码也写过。。。。。
我希望我未来写的会好一点。最起码,自己看的不难受吧。。。
所幸,在写过那么久的代码后,我现在看代码的速度也可以接受了,也能够忍受各种各样的代码。

乱七八槽

乱七八槽

闲在家里居然连博客也写的少了。嗯。是抄的少了。。。
所以记录点东西吧。。。
1、Yii的语言包。参考官网GUIDE中i18N的说明。如果要最方便的处理,那就是在config里设置language为zh_cn,这样所有的出错信息都是中文了(让我郁闷的是,好象主框架里的文件是GBK的?)如果中途需要变更语言,则直接在URL里加入?language=en_us之类的。关于localID,在i18N一章有介绍。如果是自己的程序中的语言包,那就是直接在/protected/messages目录下建立localID的目录,同时写入你的语言包分类的名称,比如我建了一个system.php,那么我在Yii里的调用就可能是如下的: Yii::t("system","要翻译的内容");第一个参数对应了文件,第二个就是语言包中的名字,可以有参数,可以很多。。。请查看手册

2、学着做PPT,发现WPS的模版库还是不错的,然后看到这个博客:http://blog.sina.com.cn/changshappt,觉得哇,好厉害啊。。。

3、前两天说我收藏了一些做WEB的小工具,其中就有配色方案的,如果需要可以去下载。当然现在我说的是在线版的,地址在这里:http://www.mb5u.com/tool/peise/。其实可以把它COPY到本地的,但我目前还是想着算了。。

4、做PPT的时候参考的文章之一:浅谈各浏览器的Javascript引擎。来自于http://blog.csdn.net/maco_wang/archive/2009/11/02/4758573.aspx,主要借鉴了以下的内容:

1、Chrome浏览器的V8 Javascript引擎,使包含大量Javascript的网页装载速度提高30%。
2、Opera宣布新JS引擎"Carakan" 速度提升2.5倍。
3、Firefox 3.5拥有一个全新的JavaScript引擎,叫做TraceMonkey,在该引擎上跑JS应用要比Firefox 3快到3-4倍。
4、safari浏览器新的js引擎squirrelfish非常快。
5、傲游浏览器3.0.3.3 alpha JS引擎升级,脚本执行速度提高9%。

郁闷:装了一夜的操作系统

郁闷:装了一夜的操作系统

刚到手的一体机换操作系统让我折腾了一个晚上。
其实最主要的问题并不在于操作系统,而是在于那个系统分区(长这么大没见过1T的硬盘一下子太大了我受不了了)
对于机器也有一些初体验:
1、无线的键盘和鼠标确实让人眼前一亮,最起码方便了很多,象这种一体机的目标本来就是为了让线少一点,现在更少了
2、硬盘的声音不小,可能是因为在上面 的关系。直接面对着,感觉比较强烈,以前机箱都在地上,感觉没有现在强烈。
3、win7下的驱动不太全。显卡驱动居然默认认不出的。非得装个驱动人生才 OK。现在在找前置摄像头的驱动了。。。
4、显卡温度较高,不知道装了驱动后会不会好一点。还没有折腾过总体感觉还行,没有想象中那么差。只是不知道夏天 散热怎么样了。毕竟都放在一起,用的也是台式机的硬盘。不过昨天看鲁大师的时候,硬盘温度和CPU温度都一般,就显卡温度高了一点,估计应该可以挺过去缺 点是。散热孔在最上方,这里也就是以后灰尘最多最容易沾染的地方了。

硬盘是挺大,然后就带来了一些问题。。。
安装win7的时候,我采用了默认安装,结果在C盘前多出了100M的系统分配空间,查了网上的一些资料,发现这100M的空间其实挺有用,我在C盘上好象依稀记得可以attach VHD之类的。记不清了。
搜索 100M隐藏分区(http://www.google.com/search?q=100M%E9%9A%90%E8%97%8F%E5%88%86%E5%8C%BA&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a),可以查到很多资料。我就不一一说明了。
反正为了这100M我折腾了很久啦,因为我不想要这100M空间。。
大致介绍一下我的过程
1、先安装一遍 ,发现装错了,装了64位的。好吧,重开始折腾。。
2、第二遍,装了32位的,嗯。多了100M,所以想去掉它
3、启动的时候删除所有分区,结果发现。。。那100M居然无法删除(用win7启动盘启动的)
4、换光驱启动,换 成linux启动,删除所有分区,保留根分区
5、重装win7,格式化所有硬盘,安装,结果进系统后又发现多了100M
6、继续折腾,怎么办呢?嗯,用分区大师,结果装了很多种,ParginMagic 7不支持win7 ,OO partaion进去后,不小心把C盘 设为活动的,然后就再也不能操作了。装 partationmagic最新版,可以操作提示重启
7、重启后发现ntdlr不见了。系统没了。。靠,继续重启,这时候想办法用winPE了,用winpe启动分区,分成四个主分区,最后150G空着准备做其他的(winpe不能分逻辑区。。。晕 )
8、重装进去后,这回是没有100M了,嗯开始装软件,装了一部分后想起来,150G还没有折腾它,在磁盘管理里操作,提示我如果把这个分区设为活动的,将不能在上面安装操作系统,嗯。我同意,我不会在最后一个分区上装操作系统的。等我确认后,发现。。。所有的分区都变成活动分区了。也就是说,我的C盘将不能启动?测试一下。。。
9、重启,果然不能启动了。。。继续第8步的操作。我这回只要四个主分区,不要其他分区了。NND
如此折腾,已经到了凌晨三点了。累啊。

一体机

一体机

昨天订购的20寸的一体机,今天就到货了。。装系统中,不说别的,先上图吧。总体来说还是比较满意的。只是自带的redflag操作系统也太烂了。或者是我自己水平烂吧,看着那模拟的win界面,怎么着都感觉不舒服 。。。
所以,只能自己把它咔嚓了,装个win7折腾一下。。。
IPOD拍的照片不太清楚。将就一下下吧

(晚上拍的,啥时候白天拍一下,颜色啥的都看不清楚)


a1bae3bf04e9cf81954bac072695cff4
家中的两台电脑
cd10758f689c321869df9f93259c3eb5
单独一台机器
e8e741e7ba632051402a0e804e8a7171
正面对比大小

昨天买的就是这一台:

买了一台一体机

最近这段时间休息在家里,因为要写代码,原来的12寸的笔记本屏幕太小了,于是就萌生了要买一台台式机的想法。
毕竟,众所周知的,台式机嘛,同样价格的情况下,性能要优于笔记本。嗯,更重要的是,屏幕大了,屏幕大的好处就太多了。比如我的IDE,就可以看的更舒服,而不至于像现在,IDE一开,可视的范围就剩一点点大了。。。几乎无法写代码,郁闷啊。

最终,我选择了两台电脑作为挑选,没有选择imac。实在是没钱了。买imac的钱,可以够我买两台台式机了。我也没有选择普通的台式机,因为老婆觉得家里再堆一个机箱,有N多线连着很烦人。所以我在选择了很多电脑之后,确认了两台机器,那就是:


这两台电脑其实我是比较偏向于后一台,因为,他是4G内存,我就无所谓再添加2G内存了,而且23寸的屏幕,也可以让我看的很爽。然而,京东上,这一台电脑一直没货。。。太郁闷了。最终我买了前面一台 5139cx,缺点是只有2G内存,其他我也就忍了。其实还有一款3699的HP20寸的电脑,但是那台电脑的鼠标是有线的,键盘也是,所以我最终还是确认这一台了。。

下周开始,我的开发速度估计又会上升一点了,毕竟笔记本开发,12寸,1024*768的分辨率也太低了。。。当然有钱的话,我是会考虑imac。。

来自cnbeta:程序员那些悲催的事情。。。

来自cnbeta:程序员那些悲催的事情。。。

来自cnbeta的一篇文章:程序员那些悲催的事情。。。
原文地址是:http://www.cnbeta.com/articles/138034.htm
很多人看完都觉得好象是自己经历过的,有可能会都会经历过一样两样,据我一朋友说,他有一次喝多了,然后半夜在维护服务器。执行rm -f ./的时候,少打了一个点。然后,就悲催了啦 。

看看cnbeta上那些悲催的故事吧。。。。
新闻来源:酷壳
在StakeOverflow上有这样一个贴子叫“Confessions of your worst WTF moment”(WTF就是What the fuck的缩写),挺有意思的,我摘几个小故事过来,希望大家在笑过之后能从中学到什么——所有的经验都是从错误中来的(我在其中加了一些点评)

我们公司的软件是给警察局用的,那是一个对用来处理被逮捕的人的系统,此系统还需要收集脸部特征和指纹信息,并且,这个系 统和会向FBI的系统提交这些信息。当我们在测试这个系统的时候,我们一般都是用我们自己的指纹,当然,数据库联着的是我们的测试数据库。不过,有一次, 在我们测试完后,我们忘了把系统切换回生产库,于是我们的测试数据库就联上了生产环境,于是我们的指纹信息和照片就散布到了其它系统中……清除我们警察局 这边的还好办,但是,你需要波士顿警察局警司去法院签字才能从FBI的数据库中清除我们的信息。

点评:测试环境和生产环境的数据不要混在一起。

有一次,我需要向新系统中导入一堆数据,因为数据量太大,需要5个小时,只能在夜里来干,在系统需要正式使用前2个小时, 数据导完了,此时是凌晨4点。随后,我需要删除一些数据,于是我在SQL命令地上输入了“DELETE from important_table; where id=4”。是的,我没有看到哪里还有个分号,天啊。

点评:这就是加班工作的恶果。另,在delete之前最好先做一次select。

我把我的管理员口令提交到了一个开源软件的源码里。

点评:1)版本管理器里的东西是删不掉的。2)一些用户和口令要hard code在代码里,所以,不要混用代码使用的权限和管理员的权限,小心管理程序的运行权限,为其注册专门的用户。

我为一个很大的银行开发软件,在我的代码里,我为一段理论上根本不可能执行到的代码加了一个报错信息。有一天,不可思异的 事发生了,这条报错信息显示在了该银行的1800个分行的超过10000个终端上——“如果你看到这个信息,说明整个系统被Fuck了,回家吧,祝你过得 愉快!”

点评:“假设是恶魔”,Assume意为Ass – u – me,意为——搞砸你和我。对于一些关键东西,永远不要做假设。小心你言语中的——“可能、应该、觉得、不应该”等词语,程序可不认这些东西。

我远程登录到服务器上加几个防火墙规则。第一件我想干的事是在不允许任何人的任何连接,第二件是,为某个端口打开访问权限。不过,我在做完第一件事后就把配置保存了,结果其生效了……

点评:这样的事经常发生,做远程网络管理的人多少会有那么几次发生这样的错误。在你将你的网络配置生效前,你得想一想,断线了你是否还能登得上去。改配置不要太冲动,生效前检查几次。

我们的代码中有一个模块完美地工作了很多年了,只是代码太乱了。我说服了我的老板,我可以重写这个模块,于是我花了三个星 期来重写这个模块。今天 ,我还记得,我的老板站在我的后面看着我,而我在在流着斗大的法汗珠去fix被我重写的“超级漂亮”的那个模块中一个接一个的bug。从那以后,我再也不 重写代码了,除非有重大的利益。

点评:这就所谓的屠宰式编程。这个案例告诉我们两个道理,1)维护代码要用最最最保守的方法来进行。2)重构代码前要像一个商人一样学会计算利益。当然,ThoughtWorks的咨询师一定会告诉你TDD,结对,极限等等方法告诉你如果实践重构。但我想告诉你,一个程序在生产环境里运行好几个年能没有问题是一件很不容易的事,那怕其中的代码再烂,你再看不过去,你都要有一个清醒的头脑明白这几点,1)软件的运行质量是远远大于代码质量的,2)你的测试案例是远远小于生产环境的,3)软件的完美的质量,是靠长时间的运行、测试和错误堆出来的,而不是某种方法论。

相信大家做程序员这一生中也有很多发生在自己身上的悲催的事儿,欢迎分享。我先分享几个我亲身经历过的事。

一个发生在我的领导身上。

我98年刚参加工作的时候,在某单位网络部门,一次,我们整个部门去给下属单位培训Cisco路由器,结果我们发现带去培 训地点的设备少带了集线器HUB,设备连不起来。于是领导很不高兴,质问我们为什么没有带集线器?那几个对领导平时就不满的老员工说办公室里没有集线器 了,都借给别的部门了。领导想了想,问我:“陈皓,我记得上次我给过你个集线器”,我说,“好像没有吧,我记不起来了,什么牌的?几口的?”,领导说: “什么牌子想不起来了,不过我记得那个集线器是一个口的”。“一个口的?!”,我心里嘀咕着,“真敢说啊”。但我不敢接话了。那几个老员工来劲了——“哪有一个口的HUB啊,一个口的怎么联两台电脑啊?”,领导说:“用两个一个口的不就行了”。领导这话一出,全场一片寂静,无言以对……

后来:我们所有的组员都离开了我们的这个领导,我们的这个领导今天还在那里工作。我想告诉大家,很多时候该走的是领导(包括外企,我上一东家正在裁人,不过我觉得该被裁掉的应该是那些经理)。我们的领导经常出这样或那样的笑话,这让我随时随地地警醒自己——“不要当一个被人笑话的经理”,于是,今天我还在努力地学习技术。

另一个发生在我身上

刚刚接触Linux的时候,还不是很懂,那时的PC还只有奔3,编译公司的程序好慢啊,有时候为了调查一个问题,需要不断 地打log,来来回回地编译,很不爽。直到有一天,硬盘不够了,df一下,发现/dev/shm还有空间。于是,把全部程序copy了过去,发现编译起程 序超快无比,爽得不行。于是就把工作环境放在/dev/shm下了,连开发都放在这里了。这一天,开发一个功能,改了十来个文件,加班很晚,觉得基本搞 定,大喜,回家睡觉。第二天一来,发现/dev/shm下空了,一个文件都没有了,问同事,同事不知,同事还安慰我说,上次他的文件也不知道被 谁删了,于是我大怒,告老板!老板也怒,发邮件到整个公司质问大家谁删了陈皓的程序,无人应答。IT部门答,“昨晚唯一的操作就是重启了linux服务 器,什么也没干,不过我们天天备份服务器,可以恢复”,IT部门问我丢的文件在哪个目录下?于是,我reply to all – “在/dev/shm下……”,哎,人丢大发了……

后来:我很感谢我以前犯的这个错,从那天以后,我开始立志学好Linux,这个错误让我努力,让我发奋。所以,我想告诉大家——尤其是刚出道的程序员,你们要多多犯错,要犯错那种丢死人的错,这样你才会知耻而勇。

再来一个发生在我同事身上的

01年,我们开发银行系统,在AIX上开发,RICS6000很贵,只能在客户那里开发,开发进度很紧张,慢慢地硬盘就不 够用了,系统中有大量的垃圾文件,于是需要清除一些文件,于是有一个同事写了一个脚本,可以自动清除的各种不重要的文件,里面有一条命令大致是这个样子“ rm -rf ${app_log_dir}/*”,意为清除程序运行的日志。为了使用这个脚本,需要在root用户下运行,一开始还不错。直到有一天,某人一运行,整 个根就没了。搞得整个团队只能用一周前的备份重写已写好的代码。后来,才发现原因是${app_log_dir}变量为空,于是成了“rm -rf /*”……

后来:这个事后,我的那个同事,把rm命令改了名,并自己写了一个rm命令,把删除的文件先放到一个临时目录下。而我也因为这个事情,到今天,每次当我在root目录下使用rm时,敲击回车的手都是抖的。(另,rm时永远使用绝对路径)这里,我想告诉大家——犯错不可怕,可怕的是不会从中总结教训,同一个错犯两次。

--EOF--

嗯 ,最后一个故事和我那个朋友的事情很像。。。确实,还是用绝对路径安全。千万不要用相对路径。。太不放心了。哈哈。

盐

关于这个东西,不多说,也不敢多说。。历年来关于重大生活用品涨价的事情,国家都会严格控制。
自从昨天晚上在微博上看到杭州缺盐后,我就想着,自古以来,盐就是历朝历代所严加看管的东西,怎么会由着他缺货呢?
结果,今天上午去超市买肉的时候,就真的买不到盐了,然后网上的信息铺天盖地。为了以防万一,我让父母买了两包盐,怕家里烧菜的时候没盐了(至于说靠盐来抗啥啥,这明显是不可能的事情)
套用非诚勿扰的那个小诗:无论你吃盐还是不吃盐,辐射就在那里,躲也躲不掉。
真要来了,你想躲也躲不掉,而现在,日本还没有恐慌,国内却恐慌了,这太让人震惊了。

不过,值得让人注意的事,今天,云南盐业直接涨停,从昨天下午开始到今天的股票事件,这太让人值得深思了。
听说,江苏那边已经开始严查,如果有人私自涨价,可以举报,只是这次不知道是罚5万还是10万了。
好吧,不说了,言多必失。遇到事情之前先想想,有些事情的发生是否是人为的,是否要随大流,用点脑子吧。。。

琐事杂记

琐事杂记

辛苦写了上千个字。出门走了一次又消失了。。。。郁闷,自动保存居然也没有保存下来。。

说了几件事情。。。

1、工作,目前状态求职中。离职是我的选择。因为公司注册在浙江,社会保险等都是交在浙江的,对于我想在上海发展不太有利,所以我选择了辞职,想找家能够在上海交险交金的工作。很多人都认为我现在这样的做法很荒谬但我想,做任何事都是有得有失的吧?

2、小孩,小孩的湿疹好象又反复了。今天带他去了华山医院看了一下,在拿出以前的葯给医生看时,医生说,你们怎么可以用XXXX这个药?这个小孩不能用的。。后来仔细看了一下说明,上面写着:不能给小孩使用,过敏体质慎用。可是儿童医院还是开出了这种葯,我真的很无语。说到湿疹,我得说一下抱歉,因为家庭因为小孩的原因,我拒绝了千乘的职位,小家伙经常生病,实在放心不下。

3、自己的代码又在写了,以前一直提的sablog YII重构,目前已经正式开始写了。当然还只是初步,这次的模版用的是wordpress的模版改的。感觉改起来问题不大,5%完成中,有的等了,初期先把前台搞定。。

Java and C# Comparison

会java不会C#,或者会C#不会java?没关系,这里有对比。。。
看一下hello world的对比先。。

package hello;

public class HelloWorld {
public static void main(String[] args) {
String name = "Java";

// See if an argument was passed from the command line
if (args.length == 1)
name = args[0];

System.out.println("Hello, " + name + "!");
}
}

C#呢?

using System;

namespace Hello {
public class HelloWorld {
public static void Main(string[] args) {
string name = "C#";

// See if an argument was passed from the command line
if (args.Length == 1)
name = args[0];

Console.WriteLine("Hello, " + name + "!");
}
}
}

是不是很像吗?这里还有更多。。。http://www.harding.edu/fmccown/java_csharp_comparison.html。嗯,官方是这么说的:

This is a quick reference guide to highlight some key syntactical differences between Java and C#.
This is not a complete overview of either language. Hope you find this useful!

除了这两种语言的对比,该页还有一个链接,是VB.net与C#的对比,对于只会vb.net的人来说,又是一个学习的途径啊。VB.NET and C# Comparison.

阅读笔记

阅读笔记

1、DBANOTES中介绍QUORA的一句话:“Quora 大量使用 Amazon EC2 与 S3 服务;操作系统部署的是 Ubuntu Linux,易于部署和管理;静态内容用 Cloudfront.服务分发,图片先传到 EC2 服务器,使用 Pyhon S3 API 处理后后传到 S3。”【Quora 用了哪些技术 ?】。

我想说的是,UbuntuServer看来也越来越被N多人所接受了。原来的那种以centos等为主流的观念也开始慢慢的向ubuntu上转移了,虽然只是很少的一部分,但任何事物都要有个过程的嘛 。

2、来自“为之漫笔”的《NetBeans之父Jaroslav Tulach谈软件框架设计》,其中有一些话确实会引起人的共鸣:

  • “API的第一个版本绝对不会完美”
  • “不可能知道使用你的库的所有人”

API第一个版本绝对不会完美,这个其实是所有写代码的人遇到的最常见的问题,问题总是在不断的开发中被发现的,如果你是在不停的修正BUG,那框架还能继续下去,如果发现问题就重写,那框架永远也完成不了。。。。

3、张鑫旭的博客上有些CSS和JQuery的插件不错。比如这个:jQuery powerFloat万能浮动层下拉层插件。地址在:http://www.zhangxinxu.com/wordpress/?p=1328,还有一个弹出窗框架也挺好。一些简单的应用完全足够了。。