“是什么?为什么?怎么样?”的灵魂三连问在我们生活中比比皆是,目的是为了清晰思考和看到事物的本质。对于编程学习也是一样,需要带着疑问从本质上去学习编。
本人是某985高校的本硕连读,非计算机科班出身,目前从事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、自己去设计网络请求框架,怎么做?
网络编程怎么学?
关于推荐书籍,有许多推荐《计算机网络:自顶向下》、《图解http》这两本。但我看了一下术语太多难理解,并不适合初学者。
我觉得有以下两本就够了,韩国人尹圣雨写的《TCP/IP网络编程》,都是通过举例子来串起知识点。写得非常好,大概一星期就看完了,接着读第二本就能非常深刻的理解。第二本推荐的是来自于游双的《Linux高性能服务器》;我就是看了这本书正式从嵌入式端转为服务器开发的。(文中所有推荐书籍已整理电子版,可于文末免费领取)
纸上学来终觉浅,绝知此事要躬行。挨个儿把里面的demo代码一个个敲完,收获一定会非常大。
二、操作系统
操作系统是什么?
结论如图所示:
强烈推荐一本宝藏书籍,叫做《操作系统哲学》。我个人建议不要学那些网上推荐得最多的《现代操作系统》、《操作系统—精髓与设计原理》,《深入理解计算机操作系统》,看过目录感觉就是枯燥无味。当我看了《操作系统哲学原理》之后,真是太佩服这个作者了,能够把如此生涩难懂的操作系统写得如此有趣。吐血推荐!
为什么要学操作系统?
还是为了面试和写程序,直接来看大厂关于操作系统的高频面试题:
怎么学操作系统?
书我已经推荐了,只有那一本。别的书类似于《深入理解计算机系统》,你们也别去看了,太枯燥我坚持了2天就放弃了。
把内容分解到极致,小到每个知识点,一行一行地去敲demo,自己慢慢理解。当经历了这个过程,能力自然而然就提升了,操作系统就像是编程里面的《易筋经》一样,主要是练内功,只能一步一个脚印。
高频面试题
1、进程/线程使用场景、内存分布、区别与联系
2、操作系统的内存对齐/字节对齐
3、处理器管理与存储管理
4、进程的通信方式/线程同步方式;linux常见的进程间通信方法有哪些,自己用过哪些?可举例。线程的同步方式有哪些?
5、僵尸进程是怎么产生的?怎么回收,请讲出回收僵进程的至少两种方法?如何查看进程是僵尸进程?程序退出后,Linux为什么不直接回收该僵尸进程?
6、fork及wait问题,什么作用?返回值代表什么意思?
7、linux应用程序中如何处理信号,有哪些常见信号,分别代表什么意思,怎么利用信号做进程间通讯?编写一个守护进程的方法?
三、数据库( MySQL OR Redis)
数据库是什么?能解决什么问题?
数据库是存放数据的仓库。在后台开发里面是必然要用的,数据库的种类太多了。也不必全部掌握,最典型的就是mysql和nosql里面的redis。
为什么要学数据库?
因为操作服务器,存储数据不可能全都存到内存里面,所以必须有存储的地方。能够共享数据,减轻冗余程度;集中控制数据;安全;还有数据恢复等等;在后台服务器开发里面,把MySQL学好,非常重要,但是不仅限于增删改查,也要知道一些原理;
怎么学习数据库?
最常见的mysql和redis。其他的比如mongodb,nginx,sqlite等了解就行了,没必要什么都去死磕。达到这种地步:1、会安装与配置;2 会用;3 清楚底层的原理;4 源码结构清晰;像redis的源码3.0版本也就三万多行;大致走一下脉络。理解设计思路就行了。但是像mysql就没必要去看源码了,大概知道索引是怎么实现的?各种锁,比如表锁,共享锁,行锁。还有就是了解一下数据库的备份原理。如何保证数据不丢失。数据库的事务的概念,一致性,还有就是mysql集群;mysql优化的话,大概背那几个常见的场景就行了。用得多自然就熟悉了。
推荐书籍:《深入浅出MYSQL》。看到电子书的截图目录就觉得棒棒哒。还有一本叫做《redis设计与实现》。时间不多的话,看Mysql就行了。毕竟还要花很多精力去干数据结构和算法嘛!
四、数据结构与算法
数据结构是什么?能解决什么问题?
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。
为什么要学数据结构?
早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。可现实中,我们更多的不是解决数值计算的问题,而是需要一些更科学有效的手段(比如表、树和图等数据结构)的帮助,才能更好地处理问题。
怎么学习数据结构?
1
记忆,记住算法思想
我觉得这个是数据结构与算法学习最基础的部分。
学完之后,你至少得能给人说明白,什么是”堆栈“,什么是”平衡二叉树“等等等吧。我之所以说”记住“,是希望这些能够形成长久记忆,存储到你的”硬盘“里,而不仅仅在学习的时候过了一遍你的”内存“。例如,学习哈夫曼树的时候。哈夫曼树的定义:WPL(带权路径长度)最小的二叉树;哈夫曼树的特点:(1)没有度为1的结点(2)n个叶子结点的哈夫曼树共有2n-1个结点(3)哈夫曼树的任意非叶节点的左右子树交换后仍是哈夫曼树。关于”数据结构“,需要记忆的内容也需要自己在其中慢慢领悟。
至于”记住算法思想“,举个例子,思考我们如何构造一个”哈夫曼树“。当然,在知道它的定义后,我们可以自己去设计一个算法。如果,自己可以想出来,恭喜你。如果自己没想到,再看到先人的解决办法后,不是仅仅“惊叹”一声,更要去记住它。我强调“记住”,并没有死记硬背的意思,而是,很多东西的理解和创新都是以记忆为前提的。
2
练习,用编程语言去实现某一数据结构上的算法;
因为人的精力有限,千万不要贪多,只需要搞定那些常见的就行了,那就足以去搞定90%以上的公司了,如果是算法岗位就当我没说,如果只是一个开发岗位,那就只需要掌握最常用、最基础的20个数据结构与算法,学习他们的:“来历”、“特点”、“适合解决什么问题”和“实际的应用场景”。
数据结构:数组、链表、栈、队列、散列表、二叉树‘、堆、跳表、图、Tire树
算法: 递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法;
具体分为3个小步骤:
1. 边学边练,每周花 1~2 小时集中攻关一个数据结构和算法,全部写出来。
2. 多思考、多拓展、还有理解适合解决什么样的问题。
3. 自我激励,每次学习完做一篇学习笔记。
五、设计模式
设计模式是什么?能解决什么问题?
设计模式是在软件工程实践过程中,软件开发者们总结出的良好的编程方法,使用设计模式能够增加系统的健壮性,易修改性和可扩展性,当你进行开发的软件规模比较大的时候,良好的设计模式会给编程带来便利,让系统更加稳定。
为什么要学设计模式?
1. 写出高质量的代码,做出可高用的稳定的以扩展系统,秒杀搬砖代码。
2. 设计模式,是架构之路的基础,不懂设计模式的人,很难成为架构师。
3. 提升自身价值,不管是做开发还是设计,掌握设计模式,都能够凸显自己的技术水品。
4. 升职加薪
怎么学习设计模式?
1、记忆,记住典型案例
2、看一些开源代码,比如redis;
3、练习,用编程语言去实现一些设计模式;
最后免费分享给大家一份Python全套学习资料,包含视频、源码,课件,希望能帮到那些不满现状,想提升自己却又没有方向的朋友。
关于Python技术储备
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、Python练习题
检查学习结果。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【
保证100%免费
】