“是什么?为什么?怎么样?”的灵魂三连问在我们生活中比比皆是,目的是为了清晰思考和看到事物的本质。对于编程学习也是一样,需要带着疑问从本质上去学习编。

本人是某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%免费

转行做“程序员”很难?这里有几个建议...相关推荐

  1. “转行做程序员”很难?这里有4个建议

    近几年来,传统行业多处于经济下行,加上互联网行业的赚钱效应,想要转行到这一行的人越来越多,其中程序员这个行业更是很多人梦寐以求的. 但另一方面,我们也发现,这些想要转行的同学们往往会遇到很多困扰.就在 ...

  2. 特别策划:非计算机专业如何转行做程序员?

    随着互联网的飞速发展,云计算.大数据由"热点"到落地,也带动着市场对软件开发者的需求,而目前国内软件开发从业者本已供不应求.互联网的火热不仅给软件开发者带来更为广阔的空间,就业薪资 ...

  3. 关于要不要转行做程序员的问题

    写在前边: 种一棵树,最好的时间是十年前,其次是现在. 什么时候开始都不晚. 这篇文章废话少说,我作为一个普通本科电气工程及其自动化专业的人转行作为Python程序员来说的经历到现在已经工作两年了,距 ...

  4. 30 岁转行做程序员,晚了吗?

    点击名片 关注我们 Change Yourself 30岁,而立之年, 在这个尴尬的年龄段, 我选择了转行做程序员! 如果本科毕业,30岁正常至少有五六年工作经验了.这时候选择转行,意味着要抛弃已有的 ...

  5. 2020年转行做程序员_2020年制作教育应用程式需要多少费用

    2020年转行做程序员 Undoubtedly, 2020 has bought a drastic change in almost every industry, and education is ...

  6. 想要入IT行业成为一名程序员很难吗?

    我不是计算机专业毕业的,现在IT行业发展这么好所以想转向IT发展可以吗?要成为一名程序员很难吗? 在中国,虽然程序员这个职业已经非常普及,但大多数人对程序员的了解还仅仅停留在薪资高的层面上.至于为什么 ...

  7. 我不是学计算机专业的,想转行做程序员,怎么办?

    我不是学计算机专业的,想转行做程序员,怎么办? 1.很多人想转行程序员是因为互联网行业薪水高.但坦率说,进入互联网行业道路千万条,转程序员的难度第一条.而且这个岗位还始终伴随着持续的加班.无尽的学习. ...

  8. 如何看待 30 岁转行做程序员这件事

    在我自己的知识星球上,有位读者问我:池大如何看待30岁转行做程序员这一现象? 这句话的潜台词是 30 岁转行做程序员是不是可行.当时我的回复是:为什么不呢?不过读者并没有买账,非让我写一篇文章回复他. ...

  9. 零基础、学历无优势、逻辑能力一般”,能转行做程序员吗?

    此前,拉勾数据研究院对程序员群体做了一次深入调查,并发布了<2022程序员群体职场洞察报告>,报告显示,"高薪"依然是程序员的职业标签之一. 在调查的程序员群体中,年薪 ...

最新文章

  1. rasa算法_(六)RASA NLU意图分类器
  2. java spring cloud版b2b2c社交电商spring cloud分布式微服务-docker-feign-hystrix(六)
  3. DEDE模板教程【Mytag 标记】
  4. 11月17日学习内容整理:jquery文档处理,事件细讲,动画
  5. android fitsSystemWindows的使用
  6. esp mounter pro_对比 | 以大欺小?剑指宋Pro和哈弗H6,欧尚X7的黑马潜质从何而来?...
  7. JAVA调用 keras,在TensorFlow(Python, Java)环境下使用Keras模型
  8. mysql启动错误处理
  9. java.net.URLEncoder 、URLDecoder 编码与解码
  10. c语言二级题库中会有错题吗,二级C语言题库-改错题
  11. 脚本录制软件python 按键精灵 tc_喜讯。tc也能录脚本了!录制鼠标键盘,tc脚本录制工具!!...
  12. 蜗牛连珠五子棋改进版
  13. USB协议详解第29讲(USB设备状态及数据交互条件)
  14. Power BI——关系函数(RELATED和RELATEDTABLE)
  15. 推荐一个易学预测、学术研讨、资源分享网站:龙腾易学网
  16. WAVE SUMMIT+峰会,飞桨八大亮点发布,全面助力产业智能化
  17. C#基于虹软SDK人脸识别签到系统
  18. unity无光照着色器(顶点片元着色器)使用TAA抗锯齿后角色移动时模糊(虚影)解决方案
  19. C语言:有一个一维数组score,内放10个学生成绩,求平均成绩。
  20. mysql数据库备份工具

热门文章

  1. 数学基础(1)~ 概率论基础知识
  2. 1.27 Daisy Chains(花瓣)
  3. visio自己画的图怎么填充_VISIO自定义图形填充
  4. 配置Samba服务器
  5. 二叉排序树详解及实现
  6. java 比较两个字符串大小
  7. java支付宝对账功能开发_java后台实现支付宝对账功能
  8. sublime显示当前文件的编码格式
  9. JAVA的简单数据类型和复合数据类型
  10. 关于海报和插画的区别