数据传输工程学什么

这是一位同学的留言提问,感觉近期接到类似的问题比较多,因此在这里统一作答。

一家之言哈,欢迎拍砖:

原问题如下:

肖老师你好!我是一个通信工程专业的学生,我现在在学校的网络融合技术实验室里学习,最近老师给我布置任务,希望我这学期能写一个简单的局域网聊天软件。我应该要怎样学习呢?我已经学了C++,了解简单的一些数据结构。我想的是先学习windows编程,然后再学习MFC,再学习计算机网络(我们这学期有“计算机网络”这门课),然后再写程序。这样可以吗?还有就是学习这些东西是系统地学习还是有重点地学习呢?

我的回答:

这位同学你好,我看了你的问题,感觉到你这个问题问得说实话有点难。

我做数据传输工程前前后后大约十几年,越学习,越觉得这门学问比较大,很难钻研透,就是现在,我也不敢说自己研究得有多深入,仅仅是入门而已。

为什么这么说呢?其实网络通信不难的,一个人,找本教材,3天,甚至3个小时,写两段程序,利用socket套接字开发,使之通过TCP/IP协议通信,其实不难的。但是,如果说要能做出真正的商用数据传输工程,比如像QQ、MSN那样,像各种网络游戏那样,公网运营,百万级、千万级,我得说,3年都不够,甚至,这根本就不是一个人能做的事情。

有这么难吗?我们来思考一下,做个传输工程,首先要有Client和Server的划分,就是C/S架构,B/S目前比较流行,但是,别忘了,底层的IE和apache等http服务器,其实还是C/S架构的。

有了Client和Server的区别,其实就有了分工:

Client主要面向用户,要求图形漂亮,界面华丽,OK,GUI开发出来了,如果是游戏,DirectX也出来了,OpenGL也来了。

Server主要面向公网运营,要求尽可能多地接纳客户端,OK,任务池出来了,IOCP,epoll都出来了,这种大并发量的并行系统,并行程序开发的要求也来了,另外,服务器不可能没有数据库,ok,数据库访问也来了。

是不是比较复杂?

但复杂的还不在这里,在与组织与架构,一个系统,从无到有,刚开始的时候,大家很难说什么架构是合理的,是星型,树型,还是P2P的直连,分布式运行?都有道理,但具体该用哪个,需要经验,需要计算,根据自己的业务需求计算。比如QQ的聊天部分和QQ的游戏大厅,显然用的就不是一种模型。

这又带出另外一个话题,现代数据传输应用,通常不是单一服务,都是多种应用的结合体,QQ左边竖着的一排图标,每个都是一个应用,MSN也差不多,甚至里面还聚合了求职和征婚交友的内容,仔细看看,是不是这样?

这么多应用,需求不用,用户行为模式不同,使用方式不同,架构不同,设计要求不同。。。。。。

那完了,这么复杂,是不是我们就没办法学了?

呵呵,其实不是的,很多时候,饭要一口一口吃,事情要一步一步来。

传输系统之所以复杂,我认为是因为它通常不是一个唯一性计算,而是多种计算的混合体,需要程序员具有非常广博的知识,如上面我随口一提,设计多少门知识,你可以自己算算。

其次,传输系统通常在实战时,有很多细节操作,这个细节,要求程序员对每门知识掌握得非常“深”才行。这个深,不是说我每本书都背下来了,门门考试100分的深。而是你掌握很多细节,很多情况,尤其是异常情况,在一开始做事的时候,就能预估到风险,这部分知识,学校是学不来的,只有到实战中去学习。经验,嗯,其实我个人认为,教训,才是最重要的。只有失败过,自己被打痛了,才能记住。

但是,上述问题我认为还不是最重要的,上面说的所有的知识,其实在传输系统中,都是贴合应用,贴合业务模型来的。因此,你以后出去到公司里面工作,永远记住,业务才是最重要的,知识是为业务服务的。

什么叫业务?客户说,我要个这个,我要个那个,就是业务。客户说,我喜欢集中式,不喜欢分布式,就是业务,或者反过来,也是业务,简单说,就是各种各样的客户需求,就是业务,哪怕这个需求再无理,再不合理,明知道做出来是垃圾,这就是业务,客户既然买单,你就得做,而且,还得把垃圾做成精品。这才是你的核心竞争力。

嗯,说到这里,貌似我们忘了点什么哈。

程序设计,我们是程序员,归根到底,写得是程序,程序写不好,什么都是假的。

上面的模型,知识,业务,说起来很吓人,很唬人,但是,没有程序区实现,什么都是假的。

商用数据传输系统的程序员,对于自己的语言掌握必须是非常透彻的,首先就得是一个语言的专家,学习Windows系统开发,就要掌握VC,Linux就要掌握gcc,这些,不仅仅是需要掌握C和C++的基础知识,而是要掌握很多操作系统平台的细节。各种常用的api要熟练之极。

什么叫熟练?会用不是熟练,要去体会api下面的实现机制,比如说,一个memcpy,会不会用?肯定会啦,好,我问题,C语言在实现的时候,是“从前拷贝”,还是“从后拷贝”?估计是不知道。那么,有一天你使用memcpy(p+5,p,10);这个语句的时候,就可能会获得错误的结果。

嗯,还有,Sleep会不?可是如果你不理解Windows和Linux的差异性,写个Sleep(1)出来,我问你到底睡眠了多少毫秒?你可能就回答不出来了?我写了1,当然是1ms啦。错!Linux可能是正确的,Windows下一定是错的,因为Windows精度没有那么高,大约只有10ms左右,也就是说,Sleep(1)和Sleep(10),结果相同。

这意味着什么?这意味着你原来预设承接并发量1000用户的系统,实际在Windows跑的时候,只能并发100用户,一个是可以商业运营的工具,一个是儿童玩具。呵呵,你能体会这中间的差异吗?

嗯,还有个最重要的,商用系统,通常比较复杂,复杂到程序员必须花80%~90%的精力来应对需求的实现,就是实现业务逻辑,随时考虑用户一个要求怎么做,还要结合系统平台实际情况,来分析设计是否合理,性能是否达到目标。我们通常说,bug不是问题,性能才是问题,因为bug只要暴露出来,一般都有解,可是如果一个系统架构设计得不好,性能差了,那简直没有办法,一般都是推翻重来。

所以,商用系统开发时,程序员一般没有什么时间和精力,精雕细琢自己的代码,都是凭着直觉写,但是,这样写出来的程序能没有bug吗?出了bug怎么办?

这一方面要求我们对基础知识很熟练,语言掌握很透彻,另外一方面,也要求我们掌握很多写程序本身的技巧和方法。这需要学习。

呵呵,说了那么多,不是想打击你的信心,而是觉得你刚刚开始涉足一门巨大的行业,应该给你一个比较宏观的介绍,避免想错了。

归结到你的问题,其实还是比较简单,局域网,就没有公网问题,没有NAT穿越,另外,用户数较少,没有必要做大容量,高并发,因此,建议考虑使用MFC中的CSocket类,在某个端口监听,开启一路服务,所有人连接到这个端口收发消息,就用TCP吧,没必要用UDP的P2P那么复杂,大家的消息通过协议和信令传送到服务器,服务器再转发给每个人就好了。界面上,使用MFC的Dialog对话框模型,画个聊天窗口,输入窗口,每次发送,就直接发给服务器好了。

应该很简单,以后有兴趣,可以考虑在这个基础上扩容,逐渐扩展大规模,公网运行,那你学习的东东就很多了。

上面讲的很多知识其实是商用和工程设计的知识,可能大家学习这部分知识,比较困难,自己学习的话,总得花几年时间。考虑到这种情况,我最近和电子工业出版社合作,准备出一本书,书名暂定为《0 Bug ---- C/C++商用工程之道》,主要就是给大家讲解商用开发的基础知识,内容包括跨平台开发,内存池,线程池,任务池,时间片划分等并行知识等,目的是帮大家训练一种方法,程序写出来就没有bug,这算是我十几年开发经验的总结,这里共享出来。建议有兴趣的朋友可以考虑买本来学习,也算做次广告哈。呵呵。

关于数据传输,比较复杂,不是几张纸能说完的,因此这本书里面我没有涉及,计划在下一本书中,我将向大家展示商用数据传输工程的细节,以及系统架构方面的知识。敬请大家期待。

你可能感兴趣的:(职场,数据传输,休闲,工程学)