前篇:10年前的程序员,走过的成长之路

Qt 塞班应用开发

上回说到在国企离职了。但其实还有很多事情没说完,先继续国企这两年的编程经历吧。

那段时间,我用了一段时间诺基亚的N81:

程序员第一个10年规划(10年前一个程序员想写个网站)(1)

诺基亚N81

上点岁数的程序员可能知道,这款手机的操作系统是当时最受欢迎的第一代智能操作系统:诺基亚的Symbian塞班。时过境迁,这个名字现在也已经不是个操作系统了,好像有个泰国人一直在找他:

程序员第一个10年规划(10年前一个程序员想写个网站)(2)

塞班操作系统

这是我接触到的第一款开放手机操作系统(之前的摩托罗拉只是开放了Java应用,非常可怜),程序员可以在上面自己写应用。开发语言依然是C ,这次用的不是VC 6.0了,而是Qt Creator。提到Qt估计现在依然有很多人还知道它。正是诺基亚自己研发的一款跨平台C 开发工具包。而现在大家对他的认识也许都是以PyQt的形式存在的吧。。。

程序员第一个10年规划(10年前一个程序员想写个网站)(3)

这是Qt Creator后来的样子

由于对C 比较熟悉,直接很快就可以上手,但细节还是很难一下掌握的。心血来潮想做一个能给室友同事炫耀的小应用,而且当时疯狂迷下五子棋,于是决定就做个五子棋!

用了将近一个月的时间,经常通宵写代码到第二天上班之前,开发了一个自己很满意的五子棋对战版,可以蓝牙跟室友联机用诺基亚下五子棋。

关于Qt这段,立个Flag,单独介绍一下它吧,这十多年也算是跟它有着不解之缘。

第一次接触web

这是一段蠢得要命的经历。在国企的一个项目中,有一台电脑连了一个设备,领导想看它的运行状况。

这个设备有一根网线能连接到PC上,可以烧进去C语言程序去监听网卡端口。于是我的第一版设计方案出来了。用C#在PC端UDP询问设备,在设备上收集数据后用C语言监听回复给PC端。运行结果就是这样的,每秒钟刷屏一次:

程序员第一个10年规划(10年前一个程序员想写个网站)(4)

设备管理系统

不要笑,这就是我理解的管理系统。参考《学籍管理系统》《图书馆管理系统》。。。懂的都懂。

我当然不会满足于此。凭借扎实的基本功,我判断:既然设备能使用网线,能使用tcp和UDP协议,那它就能支持HTTP!但我对之后的事情一无所知。不过当时我的组长开发过一个非常厉害的工具,就是一个socket代理工具,一端收消息另一端直接转发出去。大概类似这样:

程序员第一个10年规划(10年前一个程序员想写个网站)(5)

网络图,原软件已经找不到了,找到也带不出来

这让我有了灵感:我直接把浏览器连到这个软件的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程序?当我第一次看到浏览器上真的显示出一个网页时,简直兴奋到爆!

程序员第一个10年规划(10年前一个程序员想写个网站)(6)

设备管理系统2.0

为了让多个浏览器同时访问这个网页,我甚至还把它用epoll改写了一遍。。。

当天晚上,我跟同样学计算机的高中同学视频聊天,给他讲了我的重大发现:我已经学会了开发网站了!!

然后的故事可能你们能够猜到:我同学给我介绍了有一种叫PHP的东西。并且他给我一句评语:你可真牛逼,C语言字符串拼接手写http server。。。而我一开始居然以为这真的是在夸我。。。

程序员第一个10年规划(10年前一个程序员想写个网站)(7)

原来不用自己拼HTTP协议?

“我说呢,写这么个网页我大概搞了小1000行代码,一大半都是在给HTTP协议拼字符串,这要是写个网站不得几十万行代码啊?”

后来的故事

这个同学给我打开了web开发的一扇大门。后来我们直接一起去创业写网站了。当然,用的并不是php,后面的文章我再详细讲创业写代码的故事吧。

但“设备管理系统”的经历,让我对“协议”终于有了直观的认识:所谓的协议,就是字符串的格式罢了。而在此之前,我一直以为这只是一个类比,协议应该是看不见摸不到的玄学的东西。

现在回忆起来,我一直认为,在编程这件事情上,我的天赋真的是非常差。上面的事情可能很多人都会当笑话来看吧。但这些事情的确对我产生了非常深远的影响。

总结

所以这里想对能看到我文章的萌新们说句话:这么笨的人是可以成为技术负责人的。

关注我不要只看故事!

当然我会一直把我的沙雕技术成长之路的故事讲下去。但我还会有一个系列,把真正影响我成长的一些原则、方法论总结出来给大家看的。

如果你是入行不久的萌新程序员,请一定要关注我故事系列之外的专题文章。我不会讲任何具体框架、语言细节、技巧的。但每一篇都是我认为非常重要的一些启发和实践经验,一定不要错过~

前篇:10年前的程序员,走过的成长之路


我是@写代码的莎白先生

什么代码都写,还喜欢带萌新入门

欢迎关注,欢迎提问!

,