昨天晚上写代码到深夜,一头扎到床上,沉沉睡去。
第二天晨曦初露,我缓缓睁开双眼,惊讶地发现,自己竟然坐在一家咖啡馆中,而咖啡馆墙壁上,则贴满了时下流行的英文电影海报,诸如《阿甘正传》和《肖申克的救赎》等。

这些影片均是1994年的经典之作,我猛然意识到,自己竟然置身于1994年的美国!
对面坐着一个帅哥,一边操作电脑,一边在不停地赞叹。
我探过头去,发现他正在看这个东西:

我问道:“这浏览器是安德森制作的吧?看着挺难看的,你为何不选择使用网景浏览器呢?”
网景,这是个啥玩意儿?但你可真不一般,我在这家咖啡馆喝咖啡好些天了,你算是第一个能看懂其中的门道的人。而且你对安德森也有所了解,看来你也是个程序员。不如咱们合作一把如何?
“干什么啊?”
浏览器无疑是互联网发展的关键所在,目前众多企业纷纷热衷于采纳它。他们用Word来编辑文档,再将这些文档转换成HTML格式,并通过FTP上传至网络。这其中蕴藏着巨大的商机。
“写个HTML会有什么商业机会?”
静态的网站往往显得单调乏味,而这些企业很快便会意识到,只有那些能够与用户进行互动的动态网站,才真正具备商业潜力。我计划提供专业的咨询服务,帮助他们打造多样化的动态Web应用。顺便提一下,我还没有自我介绍,我的名字是……
这个人名怎么这么熟悉?
既然我穿越到了这里,便想探究一下1994年那些动态网站的构建过程。
我说:“我叫张大胖,主要用Java编程。”
“Java?那是什么语言?” 他两眼立刻放光了!
我意识到说漏嘴了,Java这时候还没诞生呢!
“其实叫C++--,一个小众语言。”
“和C语言相关,那就好,我们得用C语言写CGI脚本。”
我和他合伙开了个咨询公司,专门接开发动态网站的活儿。
然而,项目启动之初,我便陷入了困境:缺乏前后端分离的设计,没有Java,也没有JSP,更别提ASP,整个项目竟然完全依赖于C语言!
给大家看看:
执行主函数,参数包括整型变量argc和字符指针数组argv。
定义字符指针params、data、dest、s和tmp。
char *name, *age;
输出内容类型为:text/html,回车换行符。
puts("Form Example ");
puts("My Example Form
");
puts("");
获取环境变量"QUERY_STRING"的值,并将其赋值给变量data。
if(data && *data) {
params = data; dest = data;
while(*data) {
若数据指针指向的内容等于正号,则目标指针指向的字符将被设置为空格。
若数据指针指向的字符为百分号,且其后两位字符均为十六进制数,则执行相应操作。
dest赋值为data字符串中从第二个字符开始的子串转换成的字符类型值。
data+=2;
} else *dest = *data;
data++;
dest++;
}
*dest = '\0';
s = strtok(params,"&");
do {
tmp = strchr(s,'=');
if(tmp) {
*tmp = '\0';
若字符串`s`与“name”不进行区分大小写比较后相等,则将`name`的值设为`tmp`加1。
若字符串s与"age"相等,则将age的值设为tmp加1。
}
} while(s=strtok(NULL,"&"));
输出信息如下:“你好,%s,你现在的年龄是%s岁。”
}
puts("");
}
用一句话来说那就是:在C语言当中输出HTML代码。
这是人干的活吗?我都快写吐了!
确实如此,用C语言来编写CGI脚本,以实现动态网页的功能,这是必须的途径。而且,顺便问一下,你对Perl语言熟悉吗?
“就是那个写出来以后代码谁都不认识的语言?我不想用!”
日子久了,便觉得难以忍受:“这些计算机生成图像的脚本大多只是处理表格、提交数据、筛选等操作,重复的代码实在太多,究竟该如何提升工作效率呢?”
他时常思考这一问题,某日,他灵机一动,决定将那些常用功能整合进一个C语言库中,并将其嵌入当时广泛使用的NCSA Web服务器中php做网站,随后又增设了一个模板系统,使得调用这些功能变得简便易行。
于是代码就是变成这个样子:
Form Example
My Example Form
Hi , you are years old
换句话说:就是在HTML中“混入”代码。
与计算机生成图像技术相较,此方法对软件开发者而言极具亲和力,使得我们的工作效率显著提升。
坦白讲,我其实对这种技术手段,比如ASP和JSP,并不陌生,只是自身缺乏相应的技术能力,因此无法将其付诸实践。
迅速锁定了一位新客户,借助新型工具,为其量身定制Web应用程序,实现与数据库的顺畅对接,全面满足其多样化的需求。
客户数量的增加带来了多样化的需求,因此,该系统不断丰富其功能,起初只是基础的解析器,随后逐渐融入条件标签、循环标签以及函数等复杂元素,如今它已经演变为一门完整的语言。
把它们称为 Home Page,简称PHP。
我这才意识到,原来遇到了PHP之父!
不久,其他程序员纷纷前来询问,好奇地问道:你们是如何如此迅速地完成开发的呢?
说:我有个人工具箱啊!
“那我能不能用?”
说:“可以啊,工具只是我的锤子,每个人都可以用我的锤子。”
我赶忙阻止他:“, 你把锤子给别人, 那咱们靠什么赚钱?”
“我不靠锤子赚钱,我卖的是解决问题的服务。”
我暗自思忖,他怎么这么不明智,为何不利用自己的工具来赚取收益呢?何不效仿比尔·盖茨,待时机成熟便将公司上市!
让我没想到的是,神奇的事情发生了。
PHP用户们已经开始提交补丁——他们竟然发现了之前未曾察觉的漏洞!
于是,我向客户汇报道:我已经推出了一个更新的版本,对这里进行了调整,对那里进行了修改。
顾客对我们的服务感到十分满意,他们觉得我们的工作效率极为出色,不仅能够迅速实现功能需求,而且能够迅速解决程序中的错误。
我突然意识到:这不就是开源吗?
当然,在1994年和1995年那个时期,"开源"这一概念尚未问世,那时人们所倡导的仅仅是RMS所推崇的自由软件理念。
随着越来越多的人提交修正方案,PHP的功能不断完善,到了1995年,鉴于条件已经成熟,官方正式宣告了PHP 1.0版本的问世。

原来PHP就是这么起步的啊!
彰显了一位领导者的宽广胸怀与高尚气度,他毅然决然地放弃了对于PHP的独占控制权。
将项目的所有权转让给他人,使得众人得以共同参与,PHP因此变成了众人的共同项目,而非单一个人的专属。
那时,PHP的源代码存储在CVS系统中,我打算将其迁移至其他位置,然而那个时期Git尚未问世,又怎能提及的存在呢?
此处缺乏管理机制,众人形成各自独立的小团体,他们能够依据个人兴趣自发地组织起来。
任人唯贤, 代码说话。
这真正地改变了PHP的本质。
那是一个周末,我再次光临了咖啡馆,一边品味着咖啡,一边说道:“我觉得PHP应该增添一些更为高级的功能!”
“比如泛型,注解,面向函数编程,之类。”
不是的,我期望将踏入PHP领域的门槛设定得相当低,不论是运用它还是为其贡献力量。对于那些寻求解决Web问题的人来说,PHP往往能提供非常直观的解决方案;而许多宣称能解决Web问题的替代方案却过于繁琐复杂。试想,你需要在周五前完成工作,却不得不翻阅800页的指南,这无疑让人感到极度沮丧。
“你有没有想过,将来PHP会统治Web?”
“哈哈, 有这种可能吗?”
往昔无人预见,PHP将在网络洪流中迅猛发展,与Linux、MySQL结盟,持续扩大其势力范围。
数据显示,PHP在Web领域占据主导地位,约有80%的网站采用了PHP技术。

若要我对创建一个成功的开源项目的方法进行概括,我的回答会是:首先,需要有一个明确且吸引人的项目理念,其次,构建一个活跃的社区至关重要,再者,确保代码质量与良好的文档支持,最后,持续的项目维护和社区互动是不可或缺的。
谈及这个议题,他顿时话匣子打开,滔滔不绝,这全因他亲历从无到有打造一个项目的全过程,对此他有着丰富的经验和充分的发言资格。
若你仅持有独到的创意,鲜有人会投身你的计划,因众人皆怀揣着出色的点子。
若你所造之物尚显稚嫩,他人或许会对你的所作所为嗤之以鼻,他们倾向于采取自有的方法去解决难题。
唯有你打造出极具价值的成果,众人方会聚拢于你身旁;他们更倾向于采纳你的代码,进而稍作拓展以应对个人需求,如此方能推动雪球持续滚动。
因此,若欲启动一个开源项目,你需先克服一个长期困扰你的难题,这一过程可能耗时数月,才能精准定位并解决该问题。之后,你还需采纳早期用户的建议php做网站,竭尽全力使该工具对更广泛的用户群体具有实用性。
最终,你可以选择放手,与他人携手共进,一旦他们运用你的代码去实现各自的愿望,你的开源项目便宣告胜利!
“太棒了,我希望我的读者们都能看到这段话。”
“你的读者?”
确实,作为码农翻身头条号的作者,我无法说得过多,其中的奥秘不宜外传,现在我得离开了。
说完,我就消失了。

