After receiving a Ph.D. in computer science from MIT in 1979, Jeff joined IBM's Thomas J. Watson Research Center. During his tenure at IBM, he held a wide variety of technical and management positions, including vice president, Systems and Software Research, corporate vice president of technology, and general manager of IBM's SecureWay business unit, where he was responsible for IBM's security, directory, and networking software business.
Jeff then served as president of Bell Labs Research and Advanced Technologies, where he established new facilities in Ireland and India, and served as chairman of the board of the New Jersey Nanotechnology Consortium.
Most recently, Jeff served as the Executive Vice President and Chief Technology Officer for Novell. He was responsible for Novell's technology direction, as well as leading Novell's product business units.
Jeff was appointed by President Bill Clinton to serve on the Advisory Committee for the Presidential Commission for Critical Infrastructure Protection. He has also chaired the Chief Technology Officer group of the Computer Systems Policy Project, and has served on the National Research Council's Computer Science and Telecommunications Board. He is a Fellow of ACM and the IEEE.
Dr. Jaffe holds a BS in Mathematics and an MS in Electrical Engineering and Computer Science in addition to his Doctorate from the Massachusetts Institute of Technology.
在HTML中,form元素用
W3C的HTML 4.01 specification說(shuō),form元素的method屬性用來(lái)指定發(fā)送form的HTTP方法。 這可以簡(jiǎn)單地理解為,get僅僅是拼接一個(gè)URI,然后直接向服務(wù)器請(qǐng)求數(shù)據(jù)(需要提交給服務(wù)器的數(shù)據(jù)集包含在URI中)。比如: 這個(gè)form在提交的時(shí)候,會(huì)產(chǎn)生這樣能夠一個(gè)get請(qǐng)求:FormGet.aspx?ProductID=1。 而post會(huì)把form的數(shù)據(jù)集,即ProductID=1這個(gè)鍵值對(duì)包裝在請(qǐng)求的body中,發(fā)送給服務(wù)器,然后向服務(wù)器請(qǐng)求數(shù)據(jù)。對(duì)于: 這樣一個(gè)form在提交時(shí),我們將看到一個(gè)干凈的URI:FormPost.aspx。因?yàn)閿?shù)據(jù)不是拼接在URI中。 如果用get提交一個(gè)驗(yàn)證用戶名和密碼的form,一般認(rèn)為是不安全的。因?yàn)橛脩裘兔艽a將出現(xiàn)在URL上,進(jìn)而出現(xiàn)在瀏覽器的歷史記錄中。顯然,在對(duì)安全性有要求的情況下,應(yīng)該使用post。 HTML 4.01 specification指出,get只能向服務(wù)器發(fā)送ASCII字符,而post則可以發(fā)送整個(gè)ISO10646中的字符(如果同時(shí)指定
注意get和post對(duì)應(yīng)的enctype屬性有區(qū)別。enctype有兩個(gè)值,默認(rèn)值為application/x-www-form-urlencoded,而另一個(gè)值multipart/form-data只能用于post。 HTTP specification并沒(méi)有對(duì)URL長(zhǎng)度進(jìn)行限制,但是IE將請(qǐng)求的URL長(zhǎng)度限制為2083個(gè)字符,從而限制了get提交的數(shù)據(jù)長(zhǎng)度。測(cè)試表明如果URL超出這個(gè)限制,提交form時(shí)IE不會(huì)有任何響應(yīng)。其它瀏覽器則沒(méi)有URL的長(zhǎng)度限制,因此其它瀏覽器能通過(guò)get提交的數(shù)據(jù)長(zhǎng)度僅受限于服務(wù)器的設(shè)置。 而對(duì)于post,因?yàn)樘峤坏臄?shù)據(jù)不在url中,所以通常可以簡(jiǎn)單地認(rèn)為數(shù)據(jù)長(zhǎng)度限制僅受限于服務(wù)器的設(shè)置。 由于一個(gè)get得到的結(jié)果直接對(duì)應(yīng)到一個(gè)URI,所以get的結(jié)果頁(yè)面有可能被瀏覽器緩存。而post一般則不能,參考5。 出于和上面相同的原因,我們可以用一個(gè)URI引用一個(gè)get的結(jié)果頁(yè)面,而post的結(jié)果則不能,所以必然不能被搜索引擎搜到。 在服務(wù)端的ASP.NET程序中,對(duì)于get,我們用Request.QueryString[control-name]來(lái)取得對(duì)應(yīng)的=current-value;對(duì)于post,我們用Request.Form[control-name]。 我們也可以籠統(tǒng)地使用Request[control-name]。但這樣做的效率不如前者。我們可以用下面的程序比較Request.QueryString和Request的效率: 同樣的辦法我們可以比較Request.Form和Request。 最后得到的結(jié)果(Request.QueryString[control-name] / Request[control-name]和Request.Form[control-name] / Request[control-name])大多數(shù)時(shí)候是小于1的。因此,我們因該盡量用Request.QueryString或Request.Form來(lái)代替Request。 W3C的官方建議是:當(dāng)且僅當(dāng)form是冪等(idempotent)的時(shí)候,使用get。冪等是一個(gè)數(shù)學(xué)上的術(shù)語(yǔ),其定義是:對(duì)于一個(gè)函數(shù)f : D -> D,如果D中的所有x滿足f (f x) = f x,那么這個(gè)函數(shù)是冪等的。HTTP specification(比如RFC 2616)中,將冪等解釋為:多次相同請(qǐng)求產(chǎn)生的副作用,和一次請(qǐng)求的副作用相同。 打個(gè)比方,如果你提交一個(gè)form會(huì)從Google上查詢(xún)一個(gè)關(guān)鍵詞,那么我們可以認(rèn)為這個(gè)form是冪等的,因?yàn)?次提交和10次提交的副作用是差不多的(10次查詢(xún)可能會(huì)多消耗一些電能);如果你提交一個(gè)form是訂購(gòu)一個(gè)終極大黃蜂(Utimate bumblebee),那么這就不是冪等的:要是你不小心多提交了1次form的話,你可能會(huì)被老婆亂罵,你不小心又提交了10次的話,你可能就破產(chǎn)了——一次提交和多次提交的副作用明顯不同,所以這不是冪等的。 所以,一般來(lái)說(shuō),如果提交這個(gè)請(qǐng)求純粹只是從服務(wù)端獲取數(shù)據(jù)而不進(jìn)行其他操作,并且多次提交不會(huì)有明顯的副作用,應(yīng)該使用get。比如: 如果提交這個(gè)請(qǐng)求會(huì)產(chǎn)生其它操作和影響,就應(yīng)該使用post。比如: 另一個(gè)要考慮的因素是安全性。見(jiàn)2.1。1. get和post的定義
<input type="text" name="ProductID" value="1" />
<input type="submit" value="Get" />
</form>
<input type="text" name="ProductID" value="1" />
<input type="submit" value="Get" />
</form>
2. get和post的區(qū)別
2.1 安全性
2.2 編碼
2.3 提交的數(shù)據(jù)的長(zhǎng)度
2.4 緩存
2.5 引用和SEO
3. 服務(wù)端的處理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_PreInit(object sender, EventArgs e)
{
if(Request["InputString"] != null)
{
int count = 1000000;
DateTime start;
DateTime end;
string value = "";
start = DateTime.Now;
for(int i = 0;i < count;i++)
{
value = Request.QueryString["InputString"];
}
end = DateTime.Now;
double requestGet = (end - start).TotalSeconds;
start = DateTime.Now;
for(int i = 0;i < count;i++)
{
value = Request["InputString"];
}
end = DateTime.Now;
double request = (end - start).TotalSeconds;
compare.InnerHtml = requestGet.ToString() + " / " + request.ToString() + " = " + (requestGet / request).ToString();
get.InnerHtml = value;
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Request.QueryString / Request</title>
</head>
<body>
<form method="get" action="FormGet.aspx">
<div>
<input type="text" name="InputString" /><input type="submit" value="Post" /><br />
Get: <span runat="server" id="get"></span><br />
Request.QueryString / Request: <span runat="server" id="compare"></span>
</div>
</form>
</body>
</html>
4. 正確地使用get和post
5. 瀏覽器差異
并且,在后退的過(guò)程中有可能出現(xiàn)“Page has Expired”(通常是向自己post,然后后退時(shí)):
微軟的技術(shù)支持人員號(hào)稱(chēng)“this is not a bug or problem specified to the ASP.NET but a security feature of the IE Browser”,并且說(shuō)“You can also inform your users of this”,實(shí)在是荒唐。另外,IE 7:和IE 6相同;
6. 參考
昨天QQ的馬化騰到我們這邊來(lái)聊天,談到了創(chuàng)始人重視產(chǎn)品在企業(yè)成功的重要性。即使在QQ已經(jīng)這么成功,市值近百億美金的今天,他還花很多時(shí)間在產(chǎn)品上。聽(tīng)上去很簡(jiǎn)單也很自然,但是我看到很多創(chuàng)始人做不到。
創(chuàng)業(yè)者要管的太多了,產(chǎn)品,市場(chǎng),銷(xiāo)售,財(cái)務(wù),技術(shù),找人,炒人,公關(guān)。不可能每件事情都事必躬親,一定有些需要交給手下領(lǐng)頭。哪兩件最重要?我覺(jué)得是找人和產(chǎn)品。別的事都可能找到好的人代勞,但產(chǎn)品和找人不行。
找到一個(gè)好的人太關(guān)鍵了。我從前寫(xiě)了很多:海龜還是土鱉?,招不到稱(chēng)心的人怎么辦?,招怎么樣的人,今天就不多說(shuō)了。只加一句:找什么樣的人,決定公司的文化,所以創(chuàng)業(yè)者是一定要自己做的。
找到好的人,可以一手代包市場(chǎng),銷(xiāo)售,財(cái)務(wù),技術(shù),公關(guān)(找到好的人,能放心的把我的一個(gè)部門(mén)讓他管,知道他會(huì)管的比我更好時(shí),感覺(jué)太好了!),但產(chǎn)品是一個(gè)公司的靈魂。它需要融會(huì)貫通:從市場(chǎng)這邊了解目標(biāo)用戶是誰(shuí)和他們的需求,平衡銷(xiāo)售那邊經(jīng)常和市場(chǎng)部不同的意見(jiàn),與技術(shù)討論什么能做,什么不能做。其中有很多取舍,很多推動(dòng),不是創(chuàng)始人CEO,很難做好這個(gè)工作。另外,創(chuàng)始人應(yīng)該是最了解用戶的需求的人,因?yàn)樗麆?chuàng)業(yè)的激情就來(lái)自于為用戶解決一個(gè)問(wèn)題,增添一個(gè)價(jià)值。
做易趣時(shí)我產(chǎn)品放權(quán)太多。雖然我們那時(shí)的產(chǎn)品部很不錯(cuò),但沒(méi)有創(chuàng)始人每天的介入,他們的任務(wù)是不可能完成的。我給我們那時(shí)候2002年的產(chǎn)品打75分。2003年走了后,平臺(tái)遷移到eBay后,分?jǐn)?shù)就慘不忍睹了。網(wǎng)站改個(gè)字需要九個(gè)禮拜,改個(gè)功能需要在總部排隊(duì)九個(gè)月。(這里的故事很長(zhǎng)了,產(chǎn)品只是一部分,文化的變化更致命。以后有空和易趣那些老員工們應(yīng)該一起寫(xiě)本書(shū)。)
放眼世界上翹楚的產(chǎn)品,AMAZON,APPLE,NINTENDO,他們的CEO或創(chuàng)始人都是注重產(chǎn)品,不放權(quán)的瘋子。
上一篇創(chuàng)業(yè),管哪個(gè)事情最重要?引起了一些有趣的爭(zhēng)議,關(guān)于產(chǎn)品還是市場(chǎng)重要。我覺(jué)得這個(gè)問(wèn)題對(duì)創(chuàng)業(yè)者很關(guān)鍵,所以再來(lái)寫(xiě)一篇。ha,這個(gè)月寫(xiě)了兩篇,為前幾個(gè)月補(bǔ)過(guò)。
首先,問(wèn)題不是說(shuō)企業(yè)里哪個(gè)部門(mén)重要。一個(gè)企業(yè)的成功,是很多因素的乘法。乘法和加法不同:后者如有一個(gè)因素是零,對(duì)整體不一定有大影響,但前者里如果有個(gè)因素是零,結(jié)果是零 - 產(chǎn)品,市場(chǎng)做得再好,財(cái)務(wù)出問(wèn)題,公司照樣死。當(dāng)企業(yè)成功是乘法時(shí),討論哪個(gè)部門(mén)重要,沒(méi)什么意義。比較有意義的問(wèn)題是:創(chuàng)業(yè)者哪個(gè)比較可以放權(quán),哪個(gè)需要自己抓。(謝謝keso幫我澄清too。)這個(gè)問(wèn)題太重要了,因?yàn)槲覉?jiān)信一個(gè)初創(chuàng)的企業(yè),最重要的資源是創(chuàng)始人的時(shí)間和精力。我們現(xiàn)在談的,是這個(gè)資源的分配問(wèn)題。
第二,做產(chǎn)品,從來(lái)不是(或不應(yīng)該是)空想的。我覺(jué)得產(chǎn)品部是公司最難的工作。它需要綜合權(quán)衡各個(gè)部門(mén)的要求。
a)市場(chǎng):我們的現(xiàn)有用戶是這么樣的人?他們的需求是什么?我們的潛在用戶是誰(shuí)?他們的需求是什么?很多時(shí)候,人(尤其是經(jīng)理人)會(huì)太注重現(xiàn)有顧客,忽視潛在客戶。人也會(huì)太注重用戶能表達(dá)的需求(市場(chǎng)調(diào)查拿得到得),忽略用戶不知道怎么表達(dá)的需求(需要靠創(chuàng)業(yè)的自覺(jué)來(lái)發(fā)掘的)。
b)銷(xiāo)售:什么樣的產(chǎn)品賣(mài)得掉,容易銷(xiāo)售?在有些公司,市場(chǎng)和銷(xiāo)售的目標(biāo)用戶是一樣的。在有些公司,用戶(主要用產(chǎn)品的人)和顧客(付錢(qián)的人)是不一樣的。如何滿足和權(quán)衡他們不同的需求?在易趣那時(shí),用戶是買(mǎi)家,顧客是賣(mài)家,他們的需求往往不同,甚至相反。
c)技術(shù):那些產(chǎn)品容易做,那些難做?如何取舍時(shí)間vs功能?技術(shù)部會(huì)經(jīng)常說(shuō):市場(chǎng)部要的功能不可能做,或需要太久。有時(shí)技術(shù)部有個(gè)好點(diǎn)子,能做個(gè)眩的新功能,市場(chǎng)部不要。相信誰(shuí)的判斷?
d)客服:用戶很多的反饋和問(wèn)題,需要多重視?什么是1%的不重要的用戶提出來(lái)的,什么是我們的核心用戶的要求,或是潛在的核心用戶的問(wèn)題(解決了這個(gè)問(wèn)題,他就成了核心用戶)?
還有很多例子可舉。我的感覺(jué)是產(chǎn)品最最需要一個(gè)創(chuàng)始者以一個(gè)公司總體和長(zhǎng)遠(yuǎn)的發(fā)展為目標(biāo),權(quán)衡各個(gè)部門(mén)的利益和偏見(jiàn)(甚至慣性或惰性),最終以創(chuàng)始者的直覺(jué)做決定。
“從昨天開(kāi)始我們的用戶就看不到我們站點(diǎn)上的Logo了。”
“他試過(guò)重啟瀏覽器么?”
“是的。”
“他試過(guò)重啟電腦么?”
“是的。”
“他清空過(guò)瀏覽器Cache么?”
“是的。”
“他的瀏覽器版本是IE6么?”
“是的。”
“他確信是真的看不到Logo了么?”
“是的。”
“他是在電腦顯示器屏幕上看我們的站點(diǎn)么?”
“什么?”
“比如說(shuō),它可能是打印出來(lái)看不到?”
“不。他是在顯示器上看的。”
“除了站點(diǎn)Logo之外,他是不是其他的圖片都看不到?”
“什么?哦。我再問(wèn)問(wèn)他。”
也許,聰明的程序員遇到這個(gè)問(wèn)題的時(shí)候,甚至可能去找個(gè)圖形算法分析下這個(gè)圖片是否有問(wèn)題!
最后,以http://blogoscoped.com/archive/2005-08-24-n14.html中的故事結(jié)尾,,以博列為看官一笑^_^
It’s like the story of the centipede(蜈蚣). The centipede was very good at walking with its hundred legs. It never spent a thought on just how it could walk. Until one day, when a big black bug(臭蟲(chóng)) asked the centipede “How can you manage to walk with all those feet? Don’t you find it hard to coordinate their rhythm?” The black bug already left, when the centipede was still sitting down, pondering how it could walk, wondering, and (for the first time in his life) even worrying a little bit. From that day on, the centipede couldn’t walk anymore.
So you better not think too much if you want to achieve something. And of course this is only half the truth, too...