昨天晚上写代码到深夜,一头扎到床上,沉沉睡去。
第二天睁开眼镜,我发现自己居然坐在一个咖啡馆里,旁边的墙上贴着最新的英文电影海报《阿甘正传》、《肖申克的救赎》
这都是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
。
我这才意识到,原来遇到了<strong>PHP之父</strong>
!
很快就有其他程序员找上门来, 问我们:Rasmus, 你们怎么开发得这么快!
Rasmus说:我有个人工具箱啊!
“那我能不能用?”
Rasmus说:“可以啊,工具只是我的锤子,每个人都可以用我的锤子。”
我赶忙阻止他:“Rasmus, 你把锤子给别人, 那咱们靠什么赚钱?”
“我不靠锤子赚钱,我卖的是解决问题的服务。”
我心想他真是傻瓜,为什么不靠卖他的工具来赚钱呢?学学Bill Gates,过几年上市!
让我没想到的是,神奇的事情发生了。
PHP를 사용하는 사람들은 Rasmus에 패치를 보내기 시작했습니다. 그들은 Rasmus가 발견하지 못한 버그를 발견했습니다!
그래서 Rasmus는 고객에게 가서 이렇게 말했습니다. 새 버전으로 업그레이드하고 이것을 변경하고 저것을 변경했습니다.
고객들은 우리의 작업 효율성이 매우 높다고 생각합니다. 기능을 빠르게 완료할 수 있을 뿐만 아니라 버그도 빠르게 수정할 수 있습니다.
갑자기 깨달았습니다: 이것은 오픈 소스가 아닌가요?
물론, 그때는 1994년인가 1995년이었는데, 아직 오픈소스라는 용어가 등장하지도 않았던 당시에는 RMS가 옹호하는 자유 소프트웨어만 있었습니다.
더 많은 사람들이 패치를 제출하면서 PHP는 점차 개선되었습니다. 1995년에 Rasmus는 때가 무르익었다고 보고 공식적으로 PHP 1.0의 탄생을 발표했습니다.
이렇게 PHP가 시작되었습니다!
라스무스는 PHP의 독점권을 포기하면서 리더의 관대함과 스타일을 보여주었습니다.
모든 사람이 기여할 수 있도록 프로젝트의 소유권을 다른 사람에게 부여함으로써 PHP는 Rasmus만의 프로젝트가 아닌 모든 사람의 프로젝트가 됩니다.
당시에는 PHP 소스 코드가 CVS에 들어 있었습니다. Rasmus가 GitHub에 PHP 소스 코드를 올려주길 바랐는데, 그 당시에는 Hub도 없었습니다.
여기에는 관리가 없으며 모두가 소규모의 자체 조직 그룹이며 관심 있는 주제를 중심으로 자체 조직할 수 있습니다.
사람들의 장점을 적용하고 코드 자체가 말하도록 하세요.
이것은 PHP의 본질을 진정으로 변화시킵니다.
어느 주말, Rasmus와 저는 다시 커피를 마시러 카페에 와서 말했습니다. "PHP에 몇 가지 고급 기능을 추가해야 할 것 같아요!"
"제네릭, 주석, 함수 지향 프로그래밍, Lambda, ."
"아니요, 저는PHP를 사용하든 기여하든 상관없이 PHP에 대한 진입 장벽을 낮게 유지하길 바랍니다. 웹 문제를 해결하려는 사람은 대개 PHP 솔루션을 통해 매우 직접적인 해결책을 찾을 것입니다. , 웹 문제를 해결한다고 주장하는 대안들 중 다수는 너무 복잡합니다. 생각해보세요. 금요일까지 작업을 완료해야 하는데, 800페이지에 달하는 매뉴얼을 넘겨야 하는데, 이것이 답답합니다. "
" 생각해 본 적 있나요? "
"하하, 이게 가능할까요? "
라스무스는 PHP가 리눅스, MySQL, 아파치와 결합해 크게 성장할 줄은 몰랐습니다. , 끊임없이 도시와 영토를 정복합니다.
W3Tech 통계에 따르면 PHP가 웹을 지배하고 있으며 거의 80%의 웹 사이트가 PHP를 사용하고 있습니다!
"성공적인 오픈소스 프로젝트를 만드는 방법을 요약하라고 하면 뭐라고 말하겠습니까?"
이 주제를 이야기할 때 갑자기 라스무스는 0에서 1A로 발전했기 때문에 끝없이 이야기하기 시작했습니다. 프로젝트는 정말 강력해요!
"멋진 아이디어가 하나만 있으면 아무도 프로젝트에 참여하지 않을 것이고 모두가 멋진 아이디어를 가지고 있을 것입니다.
어설프게 만든 것을 만들면 사람들이 아마도 당신에게 그렇게 할 것입니다. 문제가 되지 않습니다. 그들은 문제를 해결하기 위해 노력할 것입니다.
충분히 유용한 것을 구축해야만 사람들이 당신에게 올 것이고 그들이 당신의 코드를 받아들이고 조금 더 확장하는 것이 더 쉬울 것입니다. 그래서 눈덩이가 굴러가기 시작합니다
그래서 오픈 소스 프로젝트를 시작하려면 한동안 당신을 괴롭히던 문제를 해결해야 하며, 실제 문제를 찾아 고치는 데 몇 달이 걸릴 수도 있습니다. 해결한 다음에는 얼리 어답터의 조언을 받아들여 더 많은 사람들이 도구를 유용하게 사용할 수 있도록 최선을 다해야 합니다.
마지막으로 사람들이 귀하의 코드를 사용할 때 제어권을 포기하고 다른 사람들이 귀하와 함께 작업하도록 하는 것을 고려하십시오. 원하는 것은 무엇이든 하세요. 귀하의 오픈 소스 프로젝트는 성공했습니다! "
"멋져요. 독자들이 이것을 볼 수 있기를 바랍니다."
"당신의 독자들이요?"
"예, 코더가 헤드라인을 뒤집었습니다. 너무 많이 말하지 마세요. 비밀이 누설되면 안 돼요."
그 말을 하고 나는 사라졌습니다.