续写一个程序员的故事(10年前一个程序员想写个网站)
续写一个程序员的故事(10年前一个程序员想写个网站)由于对C 比较熟悉,直接很快就可以上手,但细节还是很难一下掌握的。心血来潮想做一个能给室友同事炫耀的小应用,而且当时疯狂迷下五子棋,于是决定就做个五子棋!这是Qt Creator后来的样子上点岁数的程序员可能知道,这款手机的操作系统是当时最受欢迎的第一代智能操作系统:诺基亚的Symbian塞班。时过境迁,这个名字现在也已经不是个操作系统了,好像有个泰国人一直在找他:塞班操作系统这是我接触到的第一款开放手机操作系统(之前的摩托罗拉只是开放了Java应用,非常可怜),程序员可以在上面自己写应用。开发语言依然是C ,这次用的不是VC 6.0了,而是Qt Creator。提到Qt估计现在依然有很多人还知道它。正是诺基亚自己研发的一款跨平台C 开发工具包。而现在大家对他的认识也许都是以PyQt的形式存在的吧。。。
前篇:10年前的程序员,走过的成长之路
Qt 塞班应用开发上回说到在国企离职了。但其实还有很多事情没说完,先继续国企这两年的编程经历吧。
那段时间,我用了一段时间诺基亚的N81:
诺基亚N81
上点岁数的程序员可能知道,这款手机的操作系统是当时最受欢迎的第一代智能操作系统:诺基亚的Symbian塞班。时过境迁,这个名字现在也已经不是个操作系统了,好像有个泰国人一直在找他:
塞班操作系统
这是我接触到的第一款开放手机操作系统(之前的摩托罗拉只是开放了Java应用,非常可怜),程序员可以在上面自己写应用。开发语言依然是C ,这次用的不是VC 6.0了,而是Qt Creator。提到Qt估计现在依然有很多人还知道它。正是诺基亚自己研发的一款跨平台C 开发工具包。而现在大家对他的认识也许都是以PyQt的形式存在的吧。。。
这是Qt Creator后来的样子
由于对C 比较熟悉,直接很快就可以上手,但细节还是很难一下掌握的。心血来潮想做一个能给室友同事炫耀的小应用,而且当时疯狂迷下五子棋,于是决定就做个五子棋!
用了将近一个月的时间,经常通宵写代码到第二天上班之前,开发了一个自己很满意的五子棋对战版,可以蓝牙跟室友联机用诺基亚下五子棋。
关于Qt这段,立个Flag,单独介绍一下它吧,这十多年也算是跟它有着不解之缘。
第一次接触web这是一段蠢得要命的经历。在国企的一个项目中,有一台电脑连了一个设备,领导想看它的运行状况。
这个设备有一根网线能连接到PC上,可以烧进去C语言程序去监听网卡端口。于是我的第一版设计方案出来了。用C#在PC端UDP询问设备,在设备上收集数据后用C语言监听回复给PC端。运行结果就是这样的,每秒钟刷屏一次:
设备管理系统
不要笑,这就是我理解的管理系统。参考《学籍管理系统》《图书馆管理系统》。。。懂的都懂。
我当然不会满足于此。凭借扎实的基本功,我判断:既然设备能使用网线,能使用tcp和UDP协议,那它就能支持HTTP!但我对之后的事情一无所知。不过当时我的组长开发过一个非常厉害的工具,就是一个socket代理工具,一端收消息另一端直接转发出去。大概类似这样:
网络图,原软件已经找不到了,找到也带不出来
这让我有了灵感:我直接把浏览器连到这个软件的tcp端口上,再代理到设备上,于是我就可以观察到浏览器的行为!
这样一搞不要紧,我看到了天书:
GET / HTTP/1.1
Host 10.10.10.10
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp image/* */*;q=0.8
Accept-Encoding gzip deflate sdch
Accept-Language zh-CN zh;q=0.8
我的C语言程序的socket居然真的就收到了这样一个字符串??
原来脑海中之前很抽象的所谓“HTTP通信协议”,居然就是在TCP socket上直接发送了一串带有格式的字符串!这下我完全懂了!
于是第二个方案产生了:
我在设备端监听80端口,用c语言socket收到浏览器发来的HTTP协议字符串之后,把它们解析出我需要的内容,然后把设备的状态拼成一个HTML网页的样子,再在外面套上HTTP协议应答的格式,生成一个更长的字符串,然后TCP socket再发回给浏览器。
char str1[] = "HTTP/1.1 200 OK\
Date: Fri 22 May 2009 06:07:21 GMT\
Content-Type: text/html; charset=UTF-8\
\
";
char *str2 = strcat(str1 "<html>\
<head></head>\
<body>\
<li> 主机状态 正常</li>\
<li> 8000端口 正常</li>\
<li> 接收字节数 2000</li>\
<li> 发送字节数 5000</li>\
</body>\
</html>\
";
// 太蠢了原谅我实在无法完全复刻当年的代码
就这样一个程序,我大概花了整整三天时间在设备间调试。其实我完全没有自信在理论上证明这个方案可行:浏览器不是看网站的吗,真的能用来浏览我的C程序?当我第一次看到浏览器上真的显示出一个网页时,简直兴奋到爆!
设备管理系统2.0
为了让多个浏览器同时访问这个网页,我甚至还把它用epoll改写了一遍。。。
当天晚上,我跟同样学计算机的高中同学视频聊天,给他讲了我的重大发现:我已经学会了开发网站了!!
然后的故事可能你们能够猜到:我同学给我介绍了有一种叫PHP的东西。并且他给我一句评语:你可真牛逼,C语言字符串拼接手写http server。。。而我一开始居然以为这真的是在夸我。。。
原来不用自己拼HTTP协议?
“我说呢,写这么个网页我大概搞了小1000行代码,一大半都是在给HTTP协议拼字符串,这要是写个网站不得几十万行代码啊?”
后来的故事这个同学给我打开了web开发的一扇大门。后来我们直接一起去创业写网站了。当然,用的并不是php,后面的文章我再详细讲创业写代码的故事吧。
但“设备管理系统”的经历,让我对“协议”终于有了直观的认识:所谓的协议,就是字符串的格式罢了。而在此之前,我一直以为这只是一个类比,协议应该是看不见摸不到的玄学的东西。
现在回忆起来,我一直认为,在编程这件事情上,我的天赋真的是非常差。上面的事情可能很多人都会当笑话来看吧。但这些事情的确对我产生了非常深远的影响。
总结所以这里想对能看到我文章的萌新们说句话:这么笨的人是可以成为技术负责人的。
关注我不要只看故事!
当然我会一直把我的沙雕技术成长之路的故事讲下去。但我还会有一个系列,把真正影响我成长的一些原则、方法论总结出来给大家看的。
如果你是入行不久的萌新程序员,请一定要关注我故事系列之外的专题文章。我不会讲任何具体框架、语言细节、技巧的。但每一篇都是我认为非常重要的一些启发和实践经验,一定不要错过~
前篇:10年前的程序员,走过的成长之路
我是@写代码的莎白先生
什么代码都写,还喜欢带萌新入门
欢迎关注,欢迎提问!