再论关于如何学习网络编程

前些天在一个论坛上和一位朋友争论了学习网络编程的方法,而后发表了《TCP协议疑难杂症全景解析》,不算猛文,但也得到了一些回应,大家都是对Richard Stevens的两本书情有独钟:《TCP/IP详解(前两卷)》/《Unix网络编程》。我提出了自己的不同的声音,首先我不同意这两本书很重要,其次我觉得这两本书根本就不重要!
首先声明,本人并不是什么高手或者顶级黑客,也没有能力通过TCP/IP网络将电话免费盗打到梵蒂冈教皇那里,...只是稍微了解一些任何人本应该都了解的东西,只是大部分人在学校没有完成这个目标而已,不过没有关系,自学就可以了,一般而言,学校也是不怎么教深层次的网络知识的。那么现在就设计到了一个问题,那就是怎么学的问题。
要想精通网络编程,那么首先要明白,网络编程实际上是两个概念,一个是网络,一个是编程。很多人只是学会了所谓了socket接口,知道了什么recv的参数,知道了XYsockopt,就说自己精通网络编程,实际上他只是知道了编程,而可能对网络一窍不通。他知道交叉线和直连线为何这样区分吗(更进一步,为何交叉线连交换机而不能连主机[声明在非自协商情况下,以防编程的人钻牛角尖]);她可能知道慢启动这个词,然而她知道如何调优TCP吗?他可能知道路由怎么配置,然而遇到路由混乱能解决吗?这些问题往往都是很多科班出身人所忽略的,他们只在乎编程,而忽略了网络,自以为学会了编程就学会了一切,殊不知自己可能连什么是默认网关都不知道。
我不知道为何大四毕业不久的科班生有时候反而不如网吧的网管,是单纯的经验问题吗?有点原因,然而还有更深层次的原因,我不想用纸上谈兵这类贬义词,只是想说大家对C太热衷了,以至于忽略了其它,难道能用bash完成同样的事不更好吗?为何单纯只有C能体现技术含量呢?因为依恋C,因此扑在了socket,因此认为接网线,配路由,写脚本之类的事都是网管干的,结果自己就是一个代码民工。当然,这个现象也许和大学的课程安排有关,所幸我没有接受过那样的安排,我们当时只是简单的培训了网络协议和上机教程,随后我们还拿着网线钳做网线,好像是民工一样,然而正是那个时候,歪打正着的打下了日后需要的功底。
因此,学习网络编程的要点中,网络是更重要的,如果你把协议都了解了,都精通了,你的接下来的选择有很多,你可以写bash,也可以写java...但是如果你只会socket,那么可要当心夹生饭的危险,你的既有理念会阻止你去学习做网线之类的事(你认为只有写C的才是研发)(当然并不是说精通网络一定要做什么网线,只是随便举个例子而已)。学习曲线一定要确定。
Richard Stevens的两本书,从某种意义上讲,比较适合对网络协议已经很了解的人,他的《Unix网络编程》针对的就是编程,而他的《TCP/IP详解》系列我感觉还缺一本,那就是第0卷:TCP/IP协议概述,如果根本不懂什么是TCP/IP,直接通过抓包结果学习,那绝对是一头雾水或者喜欢就是论事,他的这本书比较类似国人毛德操的Linux内核情景分析两卷本,当然Richard Stevens在也不会再版了...因此也不便多说什么了。我主要想说的就是,在看Richard Stevens的书之前,你要确认自己已经很理解TCP/IP了。
另外,有位朋友提到要看TCP/IP的实现,当然这是必要,看Linux的实现是最方便的。然而对于自己来说,要看有没有必要,如果你只是一个实施人员或者售前支持,那么就没有必要十分精通它的实现,因为精通其实现最主要的目的是调优,而调优是研发的事。但是最为一条总的学习路线,看实现总是没有坏处的。
虽然我好像一直都在降低编程的重要性,但是事实上,正好相反,编程的地位应该是最高的,它正好像蒸煮好的米饭一样,是一切的最终实现,但是切莫产生夹生饭。任何的TCP实现都是通过编程语言实现的,因此我对学习网络编程的建议是:
1.写代码,了解API,但是不要在此阶段停留太久;
2.阅读RFC,了解原理,这个步骤一定要细致;
3.写代码,侧重原理的确认,确认你所在RFC中看到的事情是真的,这个阶段要花费些时间;
4.闲暇时可以看看《TCP/IP详解》,《Unix网络编程》之类的书,没时间就算了;
4.1.如果你就是想完成工作,养家糊口,那么到这一步就为止了,否则接着往下看。
5.看Linux的TCP/IP协议栈实现,必要时候Hack之,如果你真的想理解TCP/IP并且搞点大动作,这个阶段花点时间是值得的;
6.找一个网卡驱动看看,看看网卡为何这么设计,主要的是看看文档的说明,并且hack驱动,反证文档的正确性;
7.写代码,利用学到的知识不断提升性能,这个阶段就是完全自主的阶段了,你应该抛开一切的文档资料,自己实现一个优化的协议;
8.写代码,还是写代码,这个阶段,可能你要和国际大牛接触了,主要通过Maillist...


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要从头开始系统地深入学习网络,您可以按照以下步骤进行: 1. 学习基础数学知识:深入学习网络需要一定的数学基础,包括线性代数、概率论和微积分等。学习这些数学概念将帮助您理解网络背后的原理和法。 2. 了解机器学习和深度学习:深度学习是机器学习的一个重要分支,了解机器学习和深度学习的基本概念、法和应用场景。阅读相关的书籍、论文或参加在线课程可以帮助您建立起扎实的基础。 3. 掌握Python编程语言:Python是深度学习领域常用的编程语言,熟悉Python编程将为您后续的深度学习实践提供便利。学习Python的基本语法、常用库(如NumPy、Pandas和Matplotlib等)以及深度学习框架(如TensorFlow、PyTorch等)的使用。 4. 学习神经网络基础:深入学习网络首先需要了解神经网络的基本原理和结构。学习神经元、激活函数、前向传播、反向传播等概念,并了解常见的神经网络结构,如全连接神经网络、卷积神经网络和循环神经网络等。 5. 实践构建和训练神经网络模型:通过实践构建和训练神经网络模型,将理论知识转化为实际操作能力。可以从简单的示例开始,逐步掌握数据预处理、模型构建、参数优化等步骤,并逐渐尝试更复杂的任务和模型。 6. 深入学习常见的深度学习模型和法:学习常见的深度学习模型和法,如卷积神经网络(CNN)、循环神经网络(RNN)、生成对抗网络(GAN)等。了解它们的原理、应用场景和实现细节。 7. 阅读相关论文和书籍:通过阅读相关领域的论文和书籍,了解最新的研究成果和进展。深入学习网络需要不断地更新知识,并跟踪领域的最新动态。 8. 参与实际项目和竞赛:参与实际项目或者参加机器学习竞赛,将有助于您在实践中巩固所学知识,并提升解决实际问题的能力。 9. 继续学习和探索:深度学习是一个不断发展的领域,持续学习和探索是深入学习网络的关键。参加学术会议、加入相关社区讨论或与其他从业者交流,可以帮助您与行业保持同步,并不断拓展自己的知识边界。 总之,深入学习网络需要扎实的数学基础、机器学习和深度学习的理论知识,并结合实践进行巩固和应用。通过不断学习、实践和探索,您将逐渐掌握深度学习网络的原理、法和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值