网络安全编程心得——大学篇
报名入口来源:中国教育在线 2022-06-01
开设这个专栏,不是为了炫耀技术,仅仅是因为舍不得。这种舍不得来自于自己曾经的付出,付出就会倾注精力和时间。在读研期间,研究内核、操作系统、网络协议,倾注了自己大量的心血。可惜,最后自己选择的却是和这些不相关的工作,不得不说这是一种遗憾。本人一般211研究生毕业,不知名、不是大牛,很可惜的是一路走来没有高人指点迷津,学习中走了很多的弯,在不断的总结和反思中感觉应该和大家分享一下这些走过的坑,希望有缘的你看到能够绕开,更加顺畅的走到对岸。
一、大学本科我们应该做什么
(如果觉得大学几年是为了混个文凭简单找个工作,或者已经打算好了以后考公务员或者爸妈已经联系好了工作那么请绕开,这篇心得可能不适合你。如果你对计算机充满了热情,希望更加深入的去研究找准自己的方向那么不妨读读,或许我们之间能找到一些共鸣的地方)
大学本科,迷迷糊糊,不知道自己把时间和精力倾注到了什么地方。网络、计算机组成原理、数据结构、编程语言、高等数学、线性代数。范围广而不精。也不知道再继续往里走会遇到什么。那个时候,生活的简单粗糙现在想来确实有点后悔,没有什么收获,时间却白白的浪费掉了,但是有什么办法?一个从农村出来的孩子,进入大学才开始学习计算机,才开始了解什么叫编程。又怎么知道如何深入,如何找准自己的方向呢?所以针对大学期间学习计算机我认为有几点是需要注意的:
1.一定要重视专业基础课:或许你以为高等数学、线性代数、概率论、英语课只是为了期末考试的时候及格,或者考个高分拿点奖学金那么你也太狭隘了。大学本科这几门课和我们的关联性不大(看起来也确实不大)。大学的老师教高等数学、线性代数、概率论一般是数学系的老师,他们偏重数学基础理论性研究,往往也把手伸不到计算机领域来(数学建模除外),所以大学期间或许很多人会疑问,我学这个干嘛?这不就是为了期末考试嘛!那么现在请您注意了,这些课都是你以后深入计算机成为大牛的必经之道。中国有句俗话:”出来混,总是要还的“。如果大学期间不重视这些基础,工作后的你会用2倍的精力去把这些浪费的时间找回来。
如果你毕业以后想要从事AI(人工智能)你会发现,编程的特别少,研究数学特别多什么。每天的工作不是读paper就是推导。如果你不好好学习概率论、线性代数、高等数学,你就不会知道怎样去求导、矩阵怎样去转置不会理解为什么要去降维,什么是线性,什么是非线性。这些都不懂又怎么可能把AI学好呢?要知道,AI是建立在数学的基础上的。如果你掌握了基础,恰好又会点python或者java那么恭喜,您能够从事AI工作了。另外做图像处理,那一定会涉及到图像压缩、图像变换。如果你不懂矩阵不知道傅里叶变换,那么你只能干瞪眼了。但是,请记住读AI最好还是读个研究生,况且现在一般本科学校根本就不开设,即便开设了,但是那些学校的人也不会来看我这篇博客了。目前AI 研究生出去工作年薪在20万上下,我有个兄弟在阿里巴巴达摩院,刚毕业起薪30W所以只要努力还是很有机会的。读个博士技术好点一般都是80W还招不到人那种,这几年前景很乐观。如果家庭条件允许,又想多奋斗几年读博是个不错的选择。但是学数学还是很费神的,光有毅力不够也得靠一部分天赋……
如果你想单纯一点,找个开发型的工作一个月工作1万是不是就够了呢?那么到了1万难道你不想涨到2万吗?。如果学软件工程是不是掌握C/C++、java、html、C#就可以了?如果是计算机网络是不是考了个CCNA、CCNP、CCIE就够了呢?做开发不论是应用层的还是内核层的,都需要基础的支撑。你用mallo()函数分配了内存,如果不使用free()函数进行释放会导致什么结果你知道吗?那么为什么动态内存申请了必须释放?不释放会导致什么结果?编写多进程或者多线程的代码的时候为什么要注意死锁?信号量是个什么东西?野指针是怎么产生的?如果你不了解操作系统、不懂计算机组成原理。这在你调试的代码出现问题的时候你将会变得一筹莫展,束手无策。现在云计算很火热,虚拟技术作为云技术的支撑,听起来很高大上,但是你只要稍微掌握一些基础你就会发现原来一切这么简单。掌握基础,会让你以最快的速度和时间找到破解问题的根本方法。我一再强调基础,是因为基础真的很重要。技术含量高一点,网络安全涉及的面就更加宽泛了除了计算机组成、操作系统之外还需要懂编译原理、简单的汇编和加密解密算法等等……懂的多了,你觉得工资会不涨反跌吗?
所以,大学期间专业课一定要学好。个人觉得要在计算机领域走远一些非常重要的几门基础课:高等数学、线性代数、概率论(以上三个如果要从事AI不但要掌握而且必须掌握)数据结构、计算机组成原理、计算机网络、操作系统原理。(像开设的什么模拟电路、数字电路。个人觉得可以适当放弃因为确实用处不大)学数字媒体的可以跳过。这方面更多的是软件的应用以及对艺术的敏感。
2.找准自己的定位。计算机的方向是很多的。网络、开发、嵌入式、物联网、数字媒体。第三个和第四个因为接触的比较少,也就不滥竽充数,不懂装懂了。
就网络来说,一个合格的网络从业者,我个人觉得掌握原理是必须的,编程是应该的,操作是绝对的。网络从业人员对编程的要求不高。更多的时候是和交换机、路由器打以及各种IDS、IPS设备打交道,以及安装和部署各种服务器提供相应的服务。为什么掌握原理是必须的呢?网络运维工作非常重要,一旦网络出现问题需要在第一时间分析问题,找到原因,及时解决。试想一下,如果淘宝网络瘫痪了一个小时,将会造成多么大的经济损失?对于网络从业人员来说,网络的原理是必须要掌握的。举个简单的例子:什么是正向代理?什么是反向代理?什么是透明代理?这几种代理的区别是什么?什么时候用什么代理?CDN有没有使用代理技术?DNS有没有使用代理技术?DNS除了域名解析还能不能用于流量迁移抵御外部的网络攻击呢?只有掌握了这些原理,展开联想并不断的思考和总结,才能在实际的工作中结合实践合理运用起来。之前在一家公司实习,该公司使用DNS做流量迁移,同时用于抵御DDos攻击。里面涉及到了DNS技术、虚拟化技术等等,看起来很复杂,仔细一想却也是那么简单。而编程则是为了分析和了解各种协议。一个好的网络技术人员以及专家对协议的掌握程度直接反映了他的专业能力。局域网要知道arp协议的重要性,因特网需要知道IP协议的重要性,网络应用服务需要了解TCP、UDP协议的重要性。而通过编程可以很好的了解这些协议、拆分这些协议、利用这些协议。怎样通过发送特定的数据包使局域网中某个主机断网?又怎样通过注入让上网本伪造别人的地址上网?利用TCP的超时重传机制怎样把服务器的资源耗尽?这些都可以通过编程进行实现,同时可以利用这些编程实现更好的了解网络,掌握网络。运维一定要会操作,这是吃饭的家伙,务必熟练。