Wo Ai Ninn....

by roychan 16. December 2010 04:29

" WO AI NINN" No 3 shot like an arrow to win the very first game for our staff visiting the race course for the first time!! What a wonderful win for a memorable first bet...!!
I am so pleased to hear a lot of "我爱你“.....

 

K223_l.jpeg (110.89 kb)

Tags: ,

Email2Blog | General | 娱乐八卦

如何在 Blog 中使用语法高亮显示

by Richard 6. March 2010 11:11

大家写博客时,常常需要贴出代码,但显示在blog页面上的效果往往很难让人满意(不能语法高亮),习惯了在开发工具中看语法高亮代码的我们肯定也想在blog上看到同样的效果。那如何实现一个代码高亮效果呢?经常上一些技术大牛的博客,发现很多都是用的SyntaxHighlighter语法高亮工具,于是推荐给阿东,由于它不需要与服务器交互,所以安装这个扩展很简单,只需要包含相应css文件,js文件,就可以轻松实现代码高亮。很快,阿东便在APJ的博客上安装了SyntaxHighlighter扩展。

使用SyntaxHighlighter高亮显示代码也非常简单,下面就以实例介绍如何使用syntaxhighlighter语法高亮工具优化你的代码显示,让你和那些大牛一样能在博客上写出"漂亮"的代码。更详细的使用说明可以访问SyntaxHighlighter的网站

首先来看一段javascript代码使用高亮后的效果: 

    /**
     * demo function
     */
    function foo()
    {
        alert('Hello World!');
        // it works!
    }

效果还不错吧。我们来看看是怎么做到的:

第一步,打开一个notepad,在里面贴入要显示的语句,例如上面例子中的:

    /**
     * demo function
     */
    function foo()
    {
        alert('Hello World!');
        // it works!
    }

注:如果你的代码中有“<”(小于号),还要把全部的“<”都替换为“&lt;”,后文会解释原因。

第二步,用一个<pre></pre>把代码包裹起来,并通过pre元素的class来指定要展示的是什么语言。就像:

<pre class="brush: js">

......

</pre>

 注:为了节省篇幅,我们用......代表要显示的代码块。

第三步,从notepad中拷贝上面所有的代码,并粘贴到你想要显示的blog的位置,注意这里要在blog编辑器的HTML模式下进行粘贴。在APJ的博客上可以有两种方式切换到HTML模式:

 方法1是点击“HTML”按钮:

方法2是选中“User raw HTML editor”单选框:

 

现在再来具体解释一下其中的细节:

第一步中,为什么要把“<”替换成“&lt;”呢?上面的步骤中也提到我们最后的代码块加上pre的包装是以HTML的方式放入文章中的,在HTML中“<”代表一个标签的开始,后面的内容就不会正常解释了,要想在HTML中正常显示一个“<”,要用它的转义符“&lt;”。其实大家平时想在网页中多显示几个空格时,就会用到空格的转义符“&nbsp;”,其实是同一个意思。 其实SyntaxHighlighter支持两种方式高亮显示,一个是用我们正在介绍的pre标签来显示,还有一个是用script标签来显示。用script标签可以解决转义的问题,可以免去替换“<”的步骤,它的实现方法是把代码放在“<![CDATA[”和“]]>”中间(点击了解更多)。但是不幸的是我们APJ的博客的编辑器不支持输入“<![CDATA[”和“]]>”,所以只能使用pre的方式,杯具啊!而且我试过,我们用pre的方式,只需要替换“<”,不需要替换“>”,我发现“>”是被自动替换成“&gt;”。那为什么我们不需要替换空格,接着看下面。

第二步中,为什么要用pre标签来显示代码呢?如果直接把代码块放在HTML中,其中的一些空格,回车换行,以及缩进都会被忽略掉,而pre标签元素(preformatted text)是专门用来展现预定义格式(包括空格,回车换行,以及缩进)的标签。

在<pre>标签中可以通过不同的配置,为各种语言做高亮显示,目前SyntaxHighlighter支持二十多中语言高亮显示,我们用的比较多的是: 

语言

配置值(注意全都是小写)

C#

c#, c-sharp, csharp

VB.net/ VB Script

vb

C/ C++

c, cpp

CSS

css

Javascript

js

Java

java

PHP

php

Plain Text

plain, text

SQL

sql

XML/ HTML

xml, xhtml, xslt, html, xhtml

下面再多看几个例子:

SQL ,写法:<pre class="brush: sql">......</pre>

delete from [cqaInterfaceFilter]

insert into [cqaInterfaceFilter]([QualCode] ,[SystemCode])
select [QualCode],'' from cqaQualCode where Substring(Upper(QualCode),1,1) in ('R','S')

HTML:<pre class="brush: html">......</pre>

注:第二行自动换行了,因为一行摆不下,但是行号还是对的。

<?xml  version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Hello, world!</title>
  </head>
  <body>
    <p>Hello, world!</p>
  </body>
</html>

C#:<pre class="brush: c#; highlight: [4, 18]">......</pre>

注:第18行自动换行了

注:如果想要特别突显某行,如下面的第4行和第18行,配置也很简单,就是在pre的class中写上 highlight: [4, 18]

using System;
using System.Web;

namespace Test
{
    /// <summary>
    /// Test class for highlight in blog
    /// </summary>
    public partial class WebForm1 : System.Web.UI.Page
    {
        /// <summary>
        /// Page load event
        /// </summary>
        /// <param name="sender">The sender</param>
        /// <param name="e">The event parameter</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            HttpContext.Current.Response.Write("Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World ");
            HttpContext.Current.Response.End();
        }
    }
}

VB.net:<pre class="brush: vb">......</pre>

Imports System
Imports System.Web

Namespace Test
	''' <summary>
	''' Test class for highlight in blog
	''' </summary>
	Public Partial Class WebForm1
		Inherits System.Web.UI.Page
		''' <summary>
		''' Page load event
		''' </summary>
		''' <param name="sender">The sender</param>
		''' <param name="e">The event parameter</param>
		Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
			HttpContext.Current.Response.Write("Hello World")
			HttpContext.Current.Response.End()
		End Sub
	End Class
End Namespace

CSS:<pre class="brush: css">......</pre>

.syntaxhighlighter {
	width: 99% !important; /* 99% fixes IE8 horizontal scrollbar */
	margin: 1em 0 1em 0 !important;
	padding: 1px !important; /* adds a little border on top and bottom */
	position: relative !important;
}

Java:<pre class="brush: java">......</pre>

/** 
 * The HelloWorldApp class implements an application that
 * simply prints "Hello World!" to standard output.
 */
class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
    }
}

介绍一个小技巧,当你想要拷贝某段代码时,直接从页面上copy,会把行号一起拷贝,如果想只拷贝原始代码,可以把鼠标移到代码块上,代码块的右上角会出现一个工具栏,其中第一个按钮“view source”会弹出一个只包含原始代码块的窗口,再Ctrl+A,Ctrl+C。或者直接点击第二个“copy to clipboard”按钮就拷贝到了剪贴板,不过第二个按钮是用Flash做的,你的机器必须有安装Flash Player才能使用。不过我相信只要有上网,大家都应该装了Flash Player,所以“copy to clipboard”按钮是最方便的拷贝代码方式。

SyntaxHighlighter还可以改变Theme,甚至定制Theme,让代码显示更符合用户自己的需要,看看它提供的另外一个深色背景的Theme吧:

这个黑色背景的看上去也不错,眼睛看着不累,也节能环保。不过Theme不是每个blog用户可以自己改的,这是由admin来管理,一旦修改便会改变所有用户代码显示的样式。如果大多数人都喜欢某个Theme才好叫管理员修改配置。

就介绍这么多,如果想知道更多,可以去访问它的网站。有了这么好的条件,还希望大家多多写博,多来秀秀你的代码。

Tags: ,

General | 使用技巧

Joel Spolsky的软件开发成功12法则之二

by Daniel 15. December 2009 09:05

接上一篇Joel Spolsky的软件开发成功12法则之一, 具体介绍Joel 12衡量法则的细节.

1. 你们用不用源代码管理工具(Do you use source control)?

我用过一些商业化的源代码管理工具,我也用过免费的工具,比如CVS,告诉你吧,CVS挺好用。但如果你根本就没有用源代码管理工具,那你就是累死了也没法让你的程序员出活:他们没法知道别人在改动什么源文件,写错了的源文件也没法恢复。

使用源代码管理工具还有一大好处是,由于每一位程序员都是把源代码从源代码管理工具签出到程序员本地硬盘,几乎不会发生丢失源代码的事,最起码我还没听说过。

2. 你们可以把整个系统一步构建吗(Can you make a build in one step)?

这句话问的问题是:从你们最新的源码开始到建立起能够交出去的最后文件,你们有多少步骤要做? 一个好的团队应该有一个批处理程序一步便可将所有的工作做完,像把源文件提取出来,跟据不同的语言版本要求(英文版,中文版),和各种编译开关(#ifdef)进行编译,联接成可执行文件,标上版本号,打包成安装文件或直接送到网站上去,等等等等。

如果这些步骤不是一步做完,就有可能出人为差错。而且当你很接近产品开发尾声的时侯,你可能很急于把最后几个虫解决,然后尽快地交活。如果这时候你需要做20步才能把最终文件制出来,你肯定会急得要命,然后犯一些很不该犯的错误。

正因为这个原因,我工作的前一个公司从用WISE改用InstallShield:我们必需要让我们的批处理程序完全自动化地,在夜里,被NT scheduler起动把最终文件制成,WISE不能被NT scheduler启动而InstallShield可以,我们只能把WISE扔掉。(WISE的那帮家伙向我保证他们的下一代产品一定支持在夜里自动运行)

3. 你们有每日构建吗?且每天白天都有构建系统至少一遍吗(Do you make daily builds)?

你们有没有遇到过这样的事情:一个程序员不小心把有毛病的源码放进源代码管理系统,结果造成构建失败。比如,他建立了一个新源文件但忘了把它放进源代码管理工具,然后他高高兴兴锁机回家了,因为在他的机器上整个编译得很好。可是别人却因为这没法工作下去了,也只好闷闷地回家了。

这种造成最终构建没法完成的情况很糟糕,但却很常见。如果每天在白天就构建一遍的话,就可以让这种事不造成太大危害。在一个大的团队里,要想保证有毛病的源码及时得到纠正,最好每天下午(比如午餐时)构建一次。午餐前,每个人都尽可能地把改动的源文件签入到源代码管理系统里,午餐后,大家回来,如果构建成功,好!这时大家再从源代码管理系统里取出最新的源文件接着干活。如果构建出错,出错者马上修正,而别人还可接着用原有的没问题的源程序干活。

在我以前曾干过的微软Excel开发组里,我们有一条规定:谁造成构建出错,谁就得被罚去负责监视以后的构建过程,直到下一位造成构建出错的人来接任他。这样做不仅可以督促大家少造成构建出错,而且可以让每个人都有机会去了解构建过程。

如果想更多了解这个话题,可以读Joel的另一篇文章 Daily Builds are Your Friend.

4. 你们有软件Bug管理系统吗(Do you have a bug database)?

不论你有任何借口,只要你写程序,哪怕只是一个人的小组,如果你没有一个系统化的管理软件虫的工具,你写的程序的质量一定高不了。许多程序员觉得自己可以记得自己的软件虫。没门!我从来记不住超过2到3个软件虫。而且第二天早上起床后忙着去买这买那,好不容易记住的软件虫早忘掉了。你绝对需要一个系统来管住你的那些虫。

软件虫管理系统功能有多有少。但最少要管理以下几种信息:
如何重复软件虫的详细步骤(如何重现问题)
正常情况(无虫)应是怎样(本来应该是怎样)
现在情况(有虫)又是怎样(可是你的是怎样)
谁来负责杀虫(负责人)
问题有没有解决(状态)

如果你觉得用软件虫管理系统太麻烦,可以简化一下,建立一个有以上5列的表来用就行了。

如果想更多了解这个话题,可以读Joel的另一篇文章Painless Bug Tracking.

5. 你们在写新程序之前总是把现有程序里已知的软件Bug解决吗(Do you fix bugs before writing new code)?

微软Windows Word的第一版的开发项目曾被认为是“死亡之旅”项目。好象永远也做不完,永远超时。所有人疯狂地工作,可怎么也完成不了任务。整个项目一拖再拖,大家都觉得压力大得受不了。最后终于做完了这个鬼项目,微软把全组送到墨西哥的Cancun去度假,让大家坐下来好好想想。

大家意识到由于项目经理过于强求程序员们按时交活,结果大家只能匆匆地赶活,写出的程序毛病百出。由于项目经理的开发计划并没有考虑杀虫的时间,大家只能把杀虫的任务往后推,结果虫越积越多。有一个程序员负责写计算字体高度的程序,为了图快,居然写一行”return 12;”了事。他指望以后的测试人员发现这段程序有毛病后报告他再改正。项目经理的开发计划事实上已变成一个列写程序功能的清单,而上面列的所谓程序功能迟早都会成为软件虫。在项目总结会上,我们称这种工作方法为“绝对劣质之路”。

为了避免再犯这个错误,微软制定了“零缺陷策略”。许多程序员嘲笑这个策略,觉得经理们似乎在指望靠行政命令来提高产品质量。而事实上“零缺陷策略”的真正含义是:在任何时候,都要把解决现有程序里的问题作为首要问题来抓,然后再去写新程序。

为什么要这样做呢?

一般说来,你越不及时地杀虫,杀虫的代价(时间和金钱)就会越高。比如,你写程序时打错了一个字,编译器马上告诉你,你很容易就把它改正。你刚写好的程序在第一次运行时发现了一个问题,你也很快就能解决它,因为你对你刚写的程序还记忆犹新。如果你运行你的程序时发现了一个问题,可这个程序是几天以前写的,你可能就需要折腾一会儿,还好,你还大致记得,所以不会花太长时间。但如果你在你几个月以前写的程序里发现了问题,就比较难解决了,因为你已经忘了许多细节。这时候,你还没准儿正忙着杀别人程序里的虫呐,因为这家伙到加勒比海阿鲁巴岛度假去了。这时候,解决这一堆问题的难度不亚于从事尖端科学研究。你一定得小心翼翼地,非常系统化地从事,而且你很难知道多长时间你才能把问题解决。还有更糟糕的,你的程序已交到用户手里了,才发现问题,那你就等着掏腰包吧。

总结起来,就一条:越早解决问题,越容易解决。

另外还有一个原因,刚写的程序里发现问题,你能够比较容易地估算解决它的时间。举个例子,如果我问你写一段程序去把一个列表排序需要花多长时间,你可以给我一个比较确切的估计。如果你的程序,在Internet Explorer 5.5安装以后,工作不正常。我问你要多长时间把这个问题解决,你恐怕都估计不出来,因为你根本就不知道是什么原因造成了这个问题。你可能要花三天时间才能解决,也有可能只花两分钟。

这个例子告诉我们,如果你的开发过程中有许多虫没有及时解决,那你的开发计划肯定不可靠。反过来,如果你们已经把已知的虫全部解决了,要做的事只是写新的程序,那你的开发计划就会比较准确。

把已知的虫全部解决,这样做还有一个好处:你可以对竞争对手快速反击。有些人把这叫着“让开发中的产品随时处在可以交给用户的状态”。如果你的竞争对手推出一个新的功能想把你的客户抢走,你可以马上在你的产品里加上这个功能,立刻将新产品交付用户,因为你没有一大堆积累下来的问题要解决。

6. 你们的产品开发日程安排是否反映最新的开发进展情况(Do you have an up-to-date schedule)?

为什么我们需要开发日程安排?如果你的程序对公司的业务很重要,那公司就必须知道你的程序何时能写完。满世界的程序员都有一个通病,那就是他们都搞不清自己何时才能写完要写的程序。他们都只会对管理人员嚷嚷:“等我做好了就做好了!”

不幸的是,程序写完了,事远远没完。作为一个公司,在发行产品之前,还有许许多多的事情要做:何时做产品演示?何时参加展览会?何时发广告?等等。所有的这一切都依赖于产品的开发日程安排。

定下产品开发日程安排,还有一个很关键的好处:它逼着你只做叫你做的功能,甩掉那些可要可不要的功能,否则这些可要可不要的东西有可能把你缠住。

定下产品开发日程安排,按照它开发,这并不难做,请看Joel的另一篇文章 Evidence Based Scheduling ,这篇文章告诉你一种制订产品开发日程的好方法。

7. 你们有没有软件开发的详细说明书(Do you have a spec)?

写软件开发的详细说明书就像是绣花:人人皆知是好东西,可没谁愿意去做。

我不知道这是为什么,也许是因为多数程序员天生就不喜欢写文章。其结果是,一个开发组里的程序员们,宁可用程序来沟通,也不愿写文章来表达自己。他们喜欢上来就写程序,而不是写什么详细说明书。

在产品的前期设计过程中,如果你发现了一些问题,你可以轻易地在说明书里改几行字就行了。一旦进入了写程序的阶段,解决问题的代价就要高得多了,不仅仅是时间上的代价,而且也有感情上的代价,因为没人愿意将自己做成的东西扔掉。所以这时候解决问题总有一些阻力。

没有产品开发详细说明书就开始写程序,往往会导致程序写的乱七八糟,而且左拖右拖不能交付使用。我觉得这就是Netscape遇到的问题。前四个版本的程序越写越乱,以至管理人员作出一个愚蠢的决定:把以前的程序统统扔掉,重新写。后来他们在开发Mozilla时又犯了同样的错误。产品越做越乱,完全失控,花了几年的时间才进入内部测试阶段。

我的一贯主张是:让那些不情愿写文档的程序员们接受一些写文章的培训和训练,而以上所说的糟糕的例子就有可能少发生。

另一个解决问题的办法是:雇一些能干的项目经理,专职写产品开发详细说明书。

不论采用以上哪种方法,道理只有一个:在没有产品开发详细说明书之前,决不可写程序。

如果想更多了解这个话题,可以读Joel的4-part series

8.你们的程序员是否工作在安静的环境里(Do programmers have quiet working conditions)?

当你让你的智囊们工作在安静,宽敞,不受人打扰的环境里,他们往往能更快地出活,这已是不争的事实。有一本经典的讲软件开发管理的书Peopleware(人件) 把这个问题阐述得很清楚。

问题在于,我们都知道最好不要打断这些智囊们的思路,让他们一直处于他们的最佳状态中,这样他们就能全神贯注,废寝忘食地工作,充分发挥他们的作用。作家,程序员,科学家,甚至篮球运动员都有他们的最佳状态。

问题还在于,进入这个最佳状态不容易。我觉得平均起来,需要15分钟才能进入最佳状态,达到最高工作效率。有时侯,当你疲劳了或已经高效率地干了许多工作了,你就很难再进入这个状态,只好干点杂事打发时间,或上网,玩游戏等。

问题更在于,你很容易就被各种各样的事打扰,被拽出你的最佳状态:噪音啦,电话啦,吃午饭啦,喝杯咖啡啦,被同事打扰啦,等等。如果一个同事问你一个问题,只花你一分钟,可你却被拽出你的最佳工作状态,重新回到这个状态需要花半小时。你的工作效率因此而受到很大影响。如果让你在一个嘈杂的大房间里工作(那帮搞网站的家伙还就喜欢这样),边上的推销员在电话里大叫大嚷,你就很难出活,因为你进入不了你的最佳工作状态。

作为程序员,进入最佳工作状态更难。你先要把方方面面的细节装在脑子里, 任何一种干扰都可能让你忘掉其中某些东西。你重新回来工作时,发现好些东西记不起来了(如你刚用的局部变量名,或你刚才的搜索程序写到哪里了等),你只好看看刚写的程序,回忆一下,慢慢地回到你刚才的最佳工作状态。

我们来做一个简单的算数。假设一个程序员被打扰一下,哪怕只有一分钟,他却需要花15分钟才能回到最佳工作状态(统计资料显示如此)。我们有两个程序员:杰夫和愚夫, 坐在一个大办公区里工作。愚夫想不起来用什么函数去进行Unicode 字符串复制。他可以花30秒查一下,或者花15秒问杰夫。由于他坐在杰夫的旁边,他就选择去问杰夫。杰夫被打扰了一下,耽误了他15分钟,节省了愚夫15秒钟。

现在,我们把他们俩用墙和门隔开,让他们俩分坐在不同的办公室里,愚夫又想不起来什么函数名,自己查一下要花30秒;问杰夫,要花45秒,因为他要站起来走过去问(对这帮程序员来说,这可不是件简单的事,看看他们的体质就知道为什么了)。所以他选择自己去查。愚夫损失了30秒钟,可是杰夫少损失了15分钟。哈哈!

9. 你们是否使用现有市场上能买到的最好的工具(包括软件和硬件)(Do you use the best tools money can buy)?

如果你用于编译的时间超过几秒钟,你就应该换一台最新最快的计算机了。因为如果编译时间超过15秒,程序员们就会不耐烦,转而去上网看一些无关的东西比如The Onion,弄不好一看就是好几个小时。

调试图形界面软件时,用只有一个显示器的计算机不仅不方便,有时甚至是不可能。用有两个显示器的计算机,要方便许多。

程序员们经常不可避免地要去画一些图标或工具栏图。多数程序员没有一个好的图形编辑器可用。用微软的“画笔”软件去画图标简直是笑话,可事实上大家还就在这样做。

在我的前一个工作,系统管理员成天给我发来自动警告,说我在服务器上使用了超过220兆的空间。我告诉他,按现在硬盘的价钱,超出这点空间的价钱远低于我用的厕纸的价钱。让我花10分钟去清理我的文件绝对是我工作效率的莫大浪费。

一流的开发组绝不折腾它的程序员。工具落后会让人用起来觉得难受,一点点积累起来,会让程序员们成天叫苦,而一个成天叫苦的程序员绝对不会是一个高效率的程序员。工欲善其事,必先利其器

再添一句,要想使你的程序员高兴,最好的办法就是给他们买一些最新最棒的工具软件。用这种方法可以让他们乖乖地为你工作,这可比用高薪吸引他们来得便宜得多。

10. 你们有没有专职的软件测试人员(Do you have testers)?

如果你的开发组里没有专职的测试人员,或没有足够的测试人员(两到三个程序员就应该配一个测试员),那你的产品就一定是毛病百出。想在测试员身上省钱,绝对是打错了算盘。我真不明白为什么这么多人算不过来这笔帐。

Joel有另一篇文章专门讲这个,请看Top Five (Wrong) Reasons You Don't Have Testers

11. 你们招人面试时是否让写一段程序(Do new candidates write code during their interview)?

我问你,让你去招一个魔术师,你是否连看都不看一眼他的魔术玩得怎样就要他?当然不会!

你举办婚宴,要请一个厨师,你是不是连尝也不尝他做的菜好吃不好吃就要他?我想也不会。

奇怪的是,几乎每天都有这样的事发生:在面试一个程序员时,简历写得漂亮,谈得热火朝天,问几个简单的问题(如CreateDialog()和DialogBox()有什么区别?这种问题,查一下帮助文件就知道了),人就招进来了。你真正应该关心的不是这人记不记得这些写程序的边边角角的东西,而是他能否出产品!更糟糕的是,许多问题是知道就知道,不知道,想死也不知道的问题。

不能这样下去了!在面试时,请一定要让写一段程序。在Joel的这篇文章里Guerrilla Guide to Interviewing,我有许多好建议。

12. 你们是否有随便抓一些人来试用你们的软件(Do you do hallway usability testing)?

这句话的意思是,让你从走道里走过的人中,随便抓几个人来,让他们试用你的软件。如果你抓五个人来用你的软件,那你就可能把你的程序中95%的不方便使用的地方找出来。

要想让用户去买你的软件,你必须要设计好你的用户界面。这其实并不难。你可以读Joel的free online book on UI design打打基础。

用户界面设计的关键是,如果你让几个人去用你的软件(五六人可能就够了),你可能很快就找出最大的问题。想知道为什么吗,请读Jakob Nielsen的文章Why You Only Need to Test with 5 Users, 只要你坚持随便抓一些人来试用你的软件,你就能将你的用户界面设计得越来越好。

Tags:

General

Joel Spolsky的软件开发成功12法则之一

by Daniel 15. December 2009 09:03

作者简介:
作者:Joel Spolsky 是纽约市一家小软件公司Fog Creek Software 的创始人。他毕业于耶鲁大学,曾在美国微软公司、Viacom、Juno 任软件设计师及经理。他的网络日志“Joel谈软件”(Joel on Software)非常有名,读者人数可以排进全世界前100名。

这篇文章是Joel写于Auguest 09, 2000, 原文地址是The Joel Test: 12 Steps to Better Code, 虽然是9年前写的文章,但对于我们还是有参考意义。

“有没有听说过SEMA?这可是衡量一个软件开发组好坏的很深奥的系统。别动,等一下!别按那个链接!给你六年你也搞不清这玩意儿。所以我自己随便攒了一套衡量系统,信不信由你,这系统,三分钟就可掌握。你可以把省下的时间去读医学院了(译注:美国的医学院可是要读死人的!)。

(注:SEMA:Software Engineering Measurement and Analysis)

Joel 衡量法则:

怕翻译不标准,造成理解困难,附上鸟文原版

  1. 你们用不用源代码管理工具?
      Do you use source control?
  2. 你们可以把整个系统一步构建吗? 
      Can you make a build in one step?
  3. 你们有每日构建吗?且每天白天都有构建系统至少一遍吗?
      Do you make daily builds?
  4. 你们有软件Bug管理系统吗?
      Do you have a bug database?
  5. 你们在写新程序之前总是把现有程序里已知的软件Bug解决吗?
      Do you fix bugs before writing new code?
  6. 你们的产品开发日程安排是否反映最新的开发进展情况?
      Do you have an up-to-date schedule?
  7. 你们有没有软件开发的详细说明书?
      Do you have a spec?
  8. 你们的程序员是否工作在安静的环境里?
      Do programmers have quiet working conditions?
  9. 你们是否使用现有市场上能买到的最好的工具(包括软件和硬件)?
      Do you use the best tools money can buy?
10. 你们有没有专职的软件测试人员?
      Do you have testers?
11. 你们招人面试时是否让写一段程序?
      Do new candidates write code during their interview?
12. 你们是否随便抓一些人来试用你们的软件?
      Do you do hallway usability testing?

“Joel 衡量法则”好就好在你只需照着逐条回答以上问题,然后把所答为”是”的问题算成一分,再加起来就可以了,而不需要去算什么每天写的程序行数或程序虫的平均数等等。但咱丑话说在前面,可别用”Joel 衡量法则”去推算你的核电站管理程序是否可靠。

如果你们得了12分,那是最好,得了11分还过得去,但如果只得了10分或低于10分,你们可能就有很严重的问题了。严酷的现实是:大多数的软件开发公司只能得到2到3分。这些公司如果得不到急救可就玄了,因为像微软这样的公司从来就没有低过12分。

当然,一个公司成功与否不仅仅只取决于以上标准。比如,让一个管理绝佳的软件公司去开发一个没有人要的软件,那开发出来的软件也只能是没有人要。或反过来,一帮软件痞子以上标准一条也达不到,没准照样也能搞出一个改变世界的伟大软件。但我告诉你,如果不考虑别的因素,你只要能达到以上12条准则,你的团队就是一个可以准时交活的纪律严明的好团队。”

The Joel Test 软件开发成功12法则的四个实用领域:

1. 用该法则来衡量你的软件开发组,告诉我你得的分数,让我们来品头论足O(∩_∩)O~。

2. 如果你是开发组的经理,用该法则来使你的组提高效率。如果你们一上来就能得12分,你就别再打扰你的程序员了,专心致志别让公司的管理人员来烦你的程序员吧。

3. 如果你在找一份程序员工作,问问你未来的老板他能得几分,如果分数很低,你一定要确信你进去后有足够的权力来改变这一切,否则,最好躲远点,不然,你在那儿会很难受的。

4. 如果你是投资者,正在决定是否向一个软件公司投资,或者你的软件公司正在决定是否兼并另一个软件公司,该法则可以帮你做决定。

 

 

Tags:

General

2009年软件部开发部工作重点

by Aoxinjun 25. August 2009 23:36

1.      代码检查

这可能是目前最急迫的工作!因为从最近Stockholm项目的检查工作(包括翻译和功能两方面)中,还真发现2005年开发ODMS(也是当年APJ最大的一个项目)存在不少编码问题,比如说Hardcode、对象未释放等老问题,说明我们对编码标准的执行还很不够。其实,5月份还委托TownGas项目组对JPSSBMIS也进行了一次Code Review,也发现在代码组织、层次关系、数据库操作方面存在一些问题,所以安排一次公司级的大检查是完全必要的!

已经决定, 9月下旬将对全公司刚刚完成的项目(如MFC Phase IIRMISSIFSIM Phase I等)以及正在进行的项目(如CASMFC Phase IISIM Phase II)进行互查,之前要求各个项目组在9月中旬开展自查。为方便自查与互查工作,9月上旬将讨论并确定代码检查的准则和清单。

 

2.      Common Library的建设

如果说代码检查是当务之急,那么Common Library的建设则更加具有战略意义。凡是从事过开发工作的人都不否认Common Library的建设对一家软件公司发展的重要性。APJCommon Library的建设,从2003年开始也历经了几年时间,但始终没有达到大家的期望。今年我们应该横下一条心把这件大事情做成!

为此我们还改变了之前“开发→培训”的模式,为“设计→讨论+培训→开发”的模式。这样一方面使设计尽可能满足众多项目要求,而且集众家所长;另一方面通过设计讨论的过程对每位参与人员(项目负责人必须参加)进行了非常深入培训,可以在实践中更好执行标准。

但在实际执行当中还是有新问题出现,就是参与人太多、且各有各的想法,拖慢了Common Library建设进度。所以还恳请大家献计献策、推进Common Library建设。

 

3.      项目估计、工作量、效率

一般情况下,我们所作的项目估计与客户期望的进度是存在差距的。之前的做法大多是“质量屈服于进度”,想尽办法也只是为了满足客户的进度要求。但实际上,这已经埋下了后患。为了解决这个问题,争取合理的项目时间是必要的!

但如何才能说服客户制定更加合理的开发计划呢?我想事实胜于雄辩,我们应该基于已有的项目经验向客户提供更多的数据,比如人工生产率(代码产出率)、功能点的复杂度(低、中、高)以及预估的代码行数(不同的复杂度代码行数不同,但相同复杂度的功能点代码行数在一定范围内浮动,根据生产率可以预估工作时间)。这样客户不接受也不行。

其实这样做还有一个好处,就是让每位同事的工作也透明起来,一个人做了多少功能点、复杂程度如何、代码量多少,方便对个人工作能力评价。

但说实话,如何确定功能点和复杂度,目前我们还没成体系,需要一定的时间去研究、探讨,也希望大家积极献计献策。

Tags:

General

质量改进目标进展状况

by Aoxinjun 17. August 2009 00:33

时间过得好快,转眼就八月中旬了!年初制定的那些质量改进目标,目前执行如何,也应该有个中期总结了:

 

质量目标1   积极参与到项目的前期分析与设计中

执行情况1   ARiskMFCCASAMCM都已经做到,但SIFSIM却没有做到,所以还需要继续推进:一是要保证我们有合适的人才可以承担分析设计工作;另一方面要向客户积极争取分析设计的工作任务。

 

质量目标2   前期设计工作要包括测试用例的设计

执行情况2   由于进度计划的问题,目前各个项目都还没有实现,希望可以在8月开始的几个项目(比如CASAMCMMFC Phase IISIMS Phase II等)落实。

 

质量目标3   开发期间的测试以项目组为主、测试组为辅

执行情况3   今年开始的所有项目都已经开始这样做,比如CAS就为项目组预留了一定系统测试时间,由项目组自己执行。SIM之前也有这样的安排,但受一些客观原因限制实现得并不好。希望8月开始的几个项目继续改进。

 

质量目标4   合理安排设计、编码、测试的时间

执行情况4   今年开始的所有项目都已经开始这样做,比如CAS就为项目组预留了一定系统测试时间,由项目组自己执行。SIM也有这样的安排,但受一些客观原因限制实现得并不好。希望8月开始的几个项目继续改进。

 

质量目标5   执行持续的技术培训

执行情况5   有很好的计划,但执行效果并不怎么样。7月开始的新员工培训,能够吸引人的课程并不多,所以还需要从课程安排、授课准备、课堂互动等多个环节进行改进。

 

质量目标6   公司级知识库的建设

执行情况6   一直拖到6月才开始,但进度缓慢,目前连第一项工作“菜单”还没有完成,一定要抓紧了!

 

质量目标7  真正落实项目负责人制

执行情况7  这个已经实现。7月推出了张志鹏、赵晓冰、古煜中、湛旭东、刘玉祥等5PM分别负责MTRHKCG的相关项目,统一由公司新任命的CSO David Fung进行工作指导。

 

质量目标8   设立公司级质量奖励

执行情况8   这项工作还没有开展。要尽快落实评定标准。

 

Tags:

General

从OMIS项目安排看中港文化差别(三)

by Aoxinjun 15. August 2009 21:37

OMIS项目进度是非常紧张的!但说实话,安排的人手也不少,光项目组本身就有10人,还从其他项目组以及测试组借调了不少资源。如何使用好这些人员,变成非常重要的一个课题。

 

一般情况下,我们会根据每位成员对系统的熟悉程度以及自身的技术能力来安排工作任务。但前面也说过,OMIS中的ODMS是早在2005年开发的系统,当时的开发人员基本都已经被调整到其他项目组或者离开APJ,目前项目组中熟悉ODMS的人很少;这也就意味实际可以调用的合适资源并不多。但客户并不这么看!他们认为给你了有10几个人呢,即使对系统不熟悉,但人多力量大,也是可以配合到进度的!所以,当客户发现有Delay时,常常会质问:怎么不安排某某做什么?某某现在做什么?……

 

我把客户设想的这种工作安排方式称为“液体安排”,也就是说把我们每位工程师设想成液体,可以随意、到处流动,哪儿有空隆就往哪儿安排。说实话,一开始我也是有诸多牢骚的!但仔细想想,也不是没有道理。我们共产党不是就提倡“哪里需要就去哪里”吗!况且客户也不是不明白事理;如果真是由于对系统的不熟悉、或者受相关工作的影响不能完全达到计划,客户一定愿意协商新的办法。

 

既然这样,我们就要改变一下以前在工作安排上的思维和方式:

 

首先,不要再一味排斥客户的“液体安排”,特别要作好项目组成员的思想工作;

其次,在项目开发过程中,通过项目会议、代码走查、交叉测试等方式,尽可能安排项目组成员多了解整个系统而不是单一功能,为今后的工作安排留出更大空间;

最后,如果由于客观原因确实无法实现客户期望的“液体安排”,要尽早提出,与客户协商解决办法。

Tags:

General

软件外包相关知识: ITO、BPO、KPO详解

by Aoxinjun 13. August 2009 12:53

        早在1989年,著名管理学家彼得·德鲁克就在其著作中这样描写,“任何企业中仅做后台支持而不创造营业额的工作都应该外包出去,任何不提供高级发展机会的活动与业务也应该采取外包形式”。

        ITO和BPO是目前软件外包领域的两大主要业务领域。ITO主要包括编程、测试等软件开发工作;而BPO则是指企业将自己辅助甚至关键的业务系统委托给专业服务公司,由专业服务公司按照双方协定的要求为企业提供相应的服务,比如银行业务数据处理、企业呼叫中心、人力资源管理等这样的关键业务系统。由于将这些关键业务流程外包的价值远远超过简单的软件编码外包,所以往往认为ITO是外包的第一个阶段、而BPO是第二个阶段。

        目前,KPO(Knowledge Process Outsourcing, 知识流程外包)的时代已经来临。顾名思义,KPO介入比业务流程外包更为高端的知识工作的外包。这包括在知识产权的研究和工作、产权和财务、analytics、市场研究和数据管理和规定制订等。例如,法律文书处理、会计事务处理等等。预计KPO将被视为第三代外包流程——现在开始正逐渐成为现实的、主流的外包选择之一。之前其他的外包方式相比,KPO最具吸引力的地方在于知识套利,涉及外包更高技能的流程,而不是在于降低成本的潜力。在金融领域,KPO已经被用于处理信用评分,损失抑减估算和欺诈分析等工作。

        正是基于以上的发展趋势,国内的软件外包公司都期待实现从ITO到BPO跨越。随着越来越多的企业进军日本外包市场,传统的ITO市场已经陷入恶性竞争的困境。与此同时,欧美BPO业务开始出现向中国转移的趋势。一个是要求不高、利润稀薄、过度竞争的市场,一个是要求严格、利润丰厚、空间巨大的市场,这种跨越对任何企业都将是一种诱惑。
 

        据说印度正在往第三阶段:KPO,转型。 预测全球到2010年,KPO的市场会到170亿美金。其中印度接120亿美金。印度的从事kpo的人员也会从目前的2万5千人发展到25万人。 
 

Tags:

General

从OMIS项目安排看中港文化差别(一)

by Aoxinjun 4. August 2009 02:38

OMIS系统,就是去年MTRAPJ都投入了大量人力的PI-8002项目,它包括ODMSLPMOPDSOM等四个子系统。除了ODMS是之前2005就开发的(去年完成了一些Enhancement),其余3个都是在2008年重新开发的(0PD2005年也开发过一个版本,但去年作了较大修改,所以也认为是重新开发的)。今年项目组的主要工作就是在去年版本的基础上不断完善,从而可以得到一个可以为更多用户使用的Product版本。

 

这样也就很容易了解OMIS当前的主要工作:一是作好多语言处理,二是尽可能发现目前系统中存在的问题并将其修正过来。单从这两项工作来说,难度和挑战性都比去年小了许多,而枯燥性相对增加,很容易让人丧失新鲜感、忽视其工作的重要性。不说别人、就说我自己,也是把这个项目归入维护一类,认为项目组按部就班去做就好了,应该不会有太大的问题。所以在开发资源、测试资源、设备资源方面,都没有特殊关照。

 

但就在7月中旬接到MTR通知,要求我到MTREricMTR ITSD7个系统经理中排名非常靠前)、Olivia(直接负责OMIS的系统经理)、Michael(负责与APJ协调的MTR系统经理)、VincentMTR SQA Manager)等人协商OMIS的工作安排,以确保在规定的时间内交付有质量的产品版本;如果需要,优先确保在OMIS项目上的资源投入,并要将结果直接汇报给Daniel LaiMTR CIO)。在7月最后一周里的两次重要会议(PMGPSG),也都拿出了相当时间来讨论、部署这个项目。可见,在MTR眼里,这个项目的重要程度是非常高的,与我们APJ的认识有着天壤之别!

 

其实MTR的道理很简单,OMIS现在是一个产品,不象以前的项目时只有港铁自己使用,目前需要提供给全球的客户使用(今年112日将在瑞典的斯德哥尔摩投入运行,之后还会有墨尔本等地用户,当然也包括众多的国内客户,比如深圳、沈阳等),其质量代表了港铁形象,是绝对不能出差错的!

 

明白了这个道理,我就必须领导我的团队作出合适的调整。首先723日以来,每天我都会拿出相当的时间来处理OMIS的事情,和项目组一起商量解决办法;其次,我和要跟SQA和测试组协商,如何调配资源对OMIS项目进行独立测试;要跟其他项目组协商,是否可以调配有经验的人员对OMIS进行Code Inspection;要和南方软件检测中心合作,对OMIS进行第三方检测……所有这些,还要监督执行的情况。但产品是出自项目组的,真心希望项目组成员能够明白这个道理,重视起这个项目,认真对待分配的工作,真正把有品质的产品交到用户手中。

 

想对APJ每一位工作人员多说一句,是否我们都能够把自己的工作看成是在为下一个环节使用者(可能是客户,也可能是我们内部的同事)提供产品,其质量代表着自己的形象?如果大家认同这点,就希望项目组交给测试组的代码是有质量的,而测试组交给客户的是更加有保证的!

Tags:

General

检查Excel的打印设置

by jkeen 28. July 2009 09:06

自己也常常不注意这个问题,在用Excel做一个报表或客户想要的一些报告的时候往往不注意设置打印区域,这样很不专业,客户在收到文件之后还需要自行设置打印区域,如果不进行打印设置,一般是不能直接打印的,输出效果会很差。

和大家分享这个问题,也希望自己保持好的习惯。

Tags: ,

General

Copyright © 2009 APJ Software

最新评论

Comment RSS

公告

欢迎使用APJ Blog!

日历

<<  February 2012  >>
MoTuWeThFrSaSu
303112345
6789101112
13141516171819
20212223242526
2728291234
567891011

View posts in large calendar