我穿越到了1994年,終于發現了現在80%的網站都用 PHP 的原因!
昨天晚上寫代碼到深夜,一頭扎到床上,沉沉睡去。
第二天睜開眼鏡,我發現自己居然坐在一個咖啡館里,旁邊的墻上貼著最新的英文電影海報《阿甘正傳》、《肖申克的救贖》
這都是1994年的經典電影,我意識到,自己穿越到了1994年的美國!
對面坐著一個帥哥,一邊操作電腦,一邊在不停地贊嘆。
我探過頭去,發現他正在看這個東西:
我說:“哥們兒,這不是安德森開發的Mosaic瀏覽器嗎?這么丑,你怎么不用網景?”
“網景?那是什么東西?不過兄弟不簡單啊,我在咖啡館喝了這么多天的咖啡,你是第一個識貨的,還知道安德森,肯定也是個程序員吧,要不一起干吧!”
“干什么啊?”
“瀏覽器絕對是互聯網的未來,現在很多公司都在狂熱地擁抱它, 他們就使用 Microsoft Word寫文檔,然后將文檔保存為 HTML,通過 FTP 將它們放到網上,這里邊有商業機會啊。”
“寫個HTML會有什么商業機會?”
“靜態的網站是和枯燥的,這些公司很快就會發現,可以和用戶交互的、動態的網站才有商業價值。我準備專門提供這樣的咨詢服務,為他們開發各種動態的Web應用程序。對了,忘了自我介紹了,我叫Rasmus Lerdorf。”
這個人名怎么這么熟悉?
我想既然穿越而來,那就看看1994年的動態網站是怎么開發的吧。
我說:“我叫張大胖,主要用Java編程。”
“Java?那是什么語言?” 他兩眼立刻放光了!
我意識到說漏嘴了,Java這時候還沒誕生呢!
“其實叫C++--,一個小眾語言。”
“和C語言相關,那就好,我們得用C語言寫CGI腳本。”
我和他合伙開了個咨詢公司,專門接開發動態網站的活兒。
但是開發一開始,我就崩潰了:沒有前后端分離,沒有Java,沒有JSP,ASP, 真的全靠在C語言!
給大家看看:
- void main(int argc, char *argv[]) {
- char *params, *data, *dest, *s, *tmp;
- char *name, *age;
- puts("Content-type: text/html\r\n");
- puts("<HTML><HEAD><TITLE>Form Example</TITLE></HEAD>");
- puts("<BODY><H1>My Example Form</H1>");
- puts("<FORM action=\"form.cgi\" method=\"GET\">");
- puts("Name: <INPUT type=\"text\" name=\"name\">");
- puts("Age: <INPUT type=\"text\" name=\"age\">");
- puts("<BR><INPUT type=\"submit\">");
- puts("</FORM>");
- data = getenv("QUERY_STRING");
- if(data && *data) {
- params = data; dest = data;
- while(*data) {
- if(*data=='+') *dest=' ';
- else if(*data == '%' && ishex(*(data+1))&&ishex(*(data+2))) {
- *dest = (char) htoi(data + 1);
- data+=2;
- } else *dest = *data;
- data++;
- dest++;
- }
- *dest = '\0';
- s = strtok(params,"&");
- do {
- tmp = strchr(s,'=');
- if(tmp) {
- *tmp = '\0';
- if(!strcmp(s,"name")) name = tmp+1;
- else if(!strcmp(s,"age")) age = tmp+1;
- }
- } while(s=strtok(NULL,"&"));
- printf("Hi %s, you are %s years old\n",name,age);
- }
- puts("</BODY></HTML>");
- }
用一句話來說那就是:在C語言當中輸出HTML代碼。
這是人干的活嗎?我都快寫吐了!
Rasmus:“沒辦法啊,C語言編寫CGI腳本,實現動態網頁,可不就得這樣嘛?對了,你會用Perl嗎?”
“就是那個寫出來以后代碼誰都不認識的語言?我不想用!”
時間長了,Rasmus 也受不了了:“這些CGI 腳本無外乎就是處理表單, Post數據,過濾等,重復代碼太多了,怎么樣才能提高效率呢?”
他有空就琢磨這件事情,有一天,他想到了一招,把這些常用的功能都包裝到一個C語言庫中,它“植入”NCSA Web 服務器中(這是Apache之前最流行的服務器),然后在上面添加了一個模板系統,可以輕松地調用他們。
于是代碼就是變成這個樣子:
- <html><head><title>Form Example</title></head>
- <body><h1>My Example Form</h1>
- <form action="form.phtml" method="POST">
- Name: <input type="text" name="name">
- Age: <input type="text" name="age">
- <br><input type="submit">
- </form>
- <?if($name):?>
- Hi <?echo $name?>, you are <?echo $age?> years old
- <?endif?>
- </body></html>
換句話說:就是在HTML中“混入”代碼。
和CGI對比,這種方式對程序員來說非常友好,我們的工作效率一下子提高了很多。
說實話,我早就知道這種方式,就是ASP,JSP嘛,但是自己沒那技術實力,實現不了啊!
Rasmus 很快就找到了一個新客戶,用新工具為他們開發Web程序,連接到數據庫,滿足他們各種各樣的需求。
隨著客戶的增多, 客戶的需求也略有不同,于是,Rasmus 就不斷地擴展它的工具箱, 從簡單的解析器慢慢發展為包含條件標簽,然后是循環標簽、函數等各種復雜的東西,這已經是一門語言了。
Rasmus 把它們稱為Personal Home Page,簡稱PHP。
我這才意識到,原來遇到了PHP之父!
很快就有其他程序員找上門來, 問我們:Rasmus, 你們怎么開發得這么快!
Rasmus說:我有個人工具箱啊!
“那我能不能用?”
Rasmus說:“可以啊,工具只是我的錘子,每個人都可以用我的錘子。”
我趕忙阻止他:“Rasmus, 你把錘子給別人, 那咱們靠什么賺錢?”
“我不靠錘子賺錢,我賣的是解決問題的服務。”
我心想他真是傻瓜,為什么不靠賣他的工具來賺錢呢?學學Bill Gates,過幾年上市!
讓我沒想到的是,神奇的事情發生了。
使用PHP的人開始給Rasmus發送補丁了 ——他們發現了Rasmus都沒有發現的Bug!
于是Rasmus到客戶那里說:我又升級了一個新版本,改了這個,改了那個。
客戶非常滿意,他們認為我們的工作效率非常高,不但能快速完成功能,還能快速修復Bug。
我突然意識到:這不就是開源嗎?
當然,這是1994、1995年,開源這個詞還沒有出現,當時只有RMS提倡的自由軟件。
隨著越來越多的人提交補丁,PHP逐漸完善,1995年,Rasmus看到時機成熟,正式宣布了 PHP 1.0的誕生。
原來PHP就是這么起步的啊!
Rasmus展示出了一個領袖的大度和風范,他放棄了對PHP的獨家控制權。
通過把項目的所有權分給其他人,這樣大家都可以投入,PHP成了大家的項目,而不是Rasmus一個人的項目。
當時,PHP源碼放在CVS中,我想讓Rasmus把PHP源碼放到GitHub, 可是那個時候連Git都沒有,哪而來的Hub?
在這里沒有管理,大家是自我組織的小群體,可以圍繞自己感興趣的東西,自我組織。
任人唯賢, 代碼說話。
這真正地改變了PHP的本質。
有一個周末,我又和Rasmus來咖啡館喝咖啡,我說:“我覺得你得給PHP添加一些高級的特性了!”
“比如泛型,注解,面向函數編程,Lambda之類。”
“不不,我希望 把進入PHP的門檻控制在很低的水平,無論是使用它還是向他做貢獻。任何想解決Web問題的人通常會通過PHP找到非常直接的解決方案,許多聲稱可以解決 Web 問題的替代方案太復雜了,想想看,你需要在周五之前完成工作,但是得翻閱800頁的手冊,這讓人崩潰。”
“你有沒有想過,將來PHP會統治Web?”
“哈哈, 有這種可能嗎?”
當年的Rasmus并不知道,PHP將在互聯網大潮中野蠻生長,和Linux, MySQL , Apache聯姻, 不斷攻城略地。
W3Tech的統計顯示,PHP統治了Web, 接近80%的網站在使用PHP!
“如果讓你總結一下,如何才能創建一個成功的開源項目,你會怎么說?”
聊到這個話題,Rasmus突然就滔滔不絕起來,因為他從0到1發展起一個項目,簡直太有發言權了!
“如果你只有一個很酷的想法, 沒有人會加入你的項目,每個人都有很酷的想法。
如果你創建的東西是半生不熟的,那么人們可能對你做的事情不屑一顧,他們會用自己的方式來解決問題。
只有你構建了足夠有用的東西,大家才會來到你的身邊,他們會更容易接受你的代碼,然后稍微擴展來解決他們自己的問題,這樣雪球才能滾動起來。
所以,要開始一個開源項目,你必須解決一個困擾你一段時間的問題,這可能會花費數月的時間才能找到真正的問題并解決掉,然后你必須接受早期采用這的建議,盡最大努力讓工具對更廣泛的受眾有用。
最后可以考慮放棄控制權,讓其他人和你一起努力,當人們用你的代碼做他們任何想做的事情的時候,你的開源項目就成功了!”
“太棒了,我希望我的讀者們都能看到這段話。”
“你的讀者?”
“是的,碼農翻身公眾號,我不能說太多了,天機不可泄露,我得走了。”
說完,我就消失了。
后記:這次嘗試了一個新的寫法,讓張大胖穿越到了1994年,以旁觀者的身份講解了PHP的起步歷程。最精華的部分就是末尾關于“如何創建一個成功的開源項目”。
有人可能要問,哪些情節是真的?這個要賣個關子,只要在公眾號回復“PHP之父”就能得到答案。