“是什么?为什么?怎么样?”的灵魂三连问在我们生活中比比皆是,目的是为了清晰思考和看到事物的本质。对于编程学习也是一样,需要带着疑问从本质上去学习编。
目前从事C/C++嵌入式+服务器+音视频全栈开发,我自己其实是非计算机科班出身的,那要怎么去了解编程学习呢?最高效的就是去高校官网下载计算机科班的培养方案,拿到最精确的信息,学最重要的课程。以下是某985计算机专业的核心课程。
结合自己的实际经验,我把计算机学习(除语法外)分为基础五大块。我会分开来简述,同时罗列每一块的高频面试点。
一、网络编程
目前的互联网时代,程序基本上都离不开网络,了解计算机网络是必须的。大学的课程中也基本上会开设这门课程。
那大家有没有想过,一台计算机是怎么把数据发给另外的计算机的呢?把问题再细分一下:
1、两台计算机完全没有连接,怎么通信?
2、全世界有那么多计算机,如何识别呢?---类比到人类,用什么来识别你是一个真真正正存在的人?也就是说如何识别那台特点的计算机呢?有人说我们可以 MAC或者 IP 来唯一标识啊,可是,全世界那么多计算机,有了这个IP,我们如何查询呢?难道去遍历吗?
3、多个程序同时发消息给一台计算机,计算机是如何准确把这些信息拿到,并分配给这些不同程序的呢?
4、如何处理丢失的信息?
如果大家理解了这几个信息,那么网络编程的原理就能理解一大半。
用灵魂三连问来梳理网络编程这一块的知识
网络编程是什么呢?
网络编程就是对信息的发送到接收,把数据从一端通过网络传输到另一端的编程。
为什么要学网络编程?
a找工作需要;b互联网公司需要;c是面试的高频要
来看看多家大厂面在网络编程这一块的高频面试题
1、http协议,数据格式,常见响应码和返回码,HTTP1.0与2.0的区别、请求方法,存在哪些安全隐患,知道 https 是如何加密的、数字证书如何形成,什么是对称加密、非对称加密。http会话结束标志;Get与Post的区别。https建立连接的详细过程,哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解
2、TCP协议:三次握手、四次挥手、TCP/IP的数据链路层的交互;如何保证可靠传输、流量控制、拥塞控制。定时器,数据报文格式;socket编程的每个步骤的意义与参数代表。TCP的状态转换?TIME_WAIT状态的作用?
3、UDP:主要考察应用场景以及与TCP哪些不同;
4、select/poll/epoll的相关原理;select的各个参数作用?有哪些读/写事件?有没有更高效的IO模型?
5、send/recv有哪些出错情况?分别应该怎么处理?阻塞和非阻塞套接字的区别,send/recv的在阻塞和非阻塞下表现有啥不同,和同步/异步概念的区分?
6、网络框架对比和源码分析ACE/ICE/ZeroMQ/Mudo/Libevent/nginx
7、自己去设计网络请求框架,怎么做?
网络编程怎么学?
我看了一下术语太多难理解,并不适合初学者。
我觉得有以下两本就够了,韩国人尹圣雨写的《TCP/IP网络编程》,都是通过举例子来串起知识点。写得非常好,大概一星期就看完了,接着读第二本就能非常深刻的理解。第二本推荐的是来自于游双的《Linux高性能服务器》;我就是看了这本书正式从嵌入式端转为服务器开发的。
纸上学来终觉浅,绝知此事要躬行。挨个儿把里面的demo代码一个个敲完,收获一定会非常大。