昨天晚上写代码到深夜,一头扎到床上,沉沉睡去。
第二天睁开眼镜,我发现自己居然坐在一个咖啡馆里,旁边的墙上贴着最新的英文电影海报《阿甘正传》、《肖申克的救赎》
这都是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发展起一个项目,简直太有发言权了!
“如果你只有一个很酷的想法, 没有人会加入你的项目,每个人都有很酷的想法。
如果你创建的东西是半生不熟的,那么人们可能对你做的事情不屑一顾,他们会用自己的方式来解决问题。
只有你构建了足够有用的东西,大家才会来到你的身边,他们会更容易接受你的代码,然后稍微扩展来解决他们自己的问题,这样雪球才能滚动起来。
所以,要开始一个开源项目,你必须解决一个困扰你一段时间的问题,这可能会花费数月的时间才能找到真正的问题并解决掉,然后你必须接受早期采用这的建议,尽最大努力让工具对更广泛的受众有用。
最后可以考虑放弃控制权,让其他人和你一起努力,当人们用你的代码做他们任何想做的事情的时候,你的开源项目就成功了!”
“太棒了,我希望我的读者们都能看到这段话。”
“你的读者?”
“是的,码农翻身头条号,我不能说太多了,天机不可泄露,我得走了。”
说完,我就消失了。