计算机的基础知识有什么?怎么学?

  计算机硬件:包括中央处理器(CPU)、内存、硬盘、输入设备(如键盘和鼠标)、输出设备(如显示器和打印机)等。

  计算机软件:包括操作系统、应用程序和编程语言等。

  数据表示:计算机使用二进制系统来表示和处理数据,包括数字、字符和图像等。

  计算机网络:涉及计算机之间的通信和数据传输,包括局域网(LAN)、广域网(WAN)和互联网等。

  操作系统:控制和管理计算机硬件和软件资源,提供用户界面和运行环境,例如Windows、macOS和Linux等。

  数据结构与算法:涉及如何组织和管理数据,以及解决问题的方法和技术。

  编程语言:用于编写计算机程序的语言,如C、C++、Java、Python等。

  数据库系统:用于存储、管理和检索大量结构化数据的软件系统,如MySQL、Oracle和MongoDB等。

  计算机安全:涉及保护计算机系统和数据的措施,包括防火墙、加密和身份验证等。

  计算机体系结构:涉及计算机的组织和设计原理,包括指令集、处理器架构和存储器层次结构等。

  应该学,以及面试中的高频问题:

  1、http协议,包括:封装格式,常见响应码,不同版本的区别,常见请求方法,存在哪些安全隐患,啥是无状态协议等。

  2、https协议:http 是明文传输,https 是加密安全的,需要知道 https 是如何加密的、数字证书如何形成,啥的对称加密、非对称加密。

  3、TCP协议:三次握手、四次挥手、如何保证可靠传输、流量控制、拥塞控制。

  4、UDP:这个大致了解即可,好像内容比较少

  5、DNS、ICMP、ARP、DHCP(我就不一个一个写了)

  推荐书籍《计算机网络:自顶向下》《图解HTTP》

  操作系统也是一门非常重要的知识,在面试中也是问的非常多(当然,看公司,有些公司技术栈是 Java 的,可能问的比较少)。对于操作系统,要学的也挺多,例如:

  啥是进程,啥是线程,他们的本质区别?我们运行一个程序时,数据放在哪里?代码放在哪里?咋就还要分堆和栈?线程切换时是上下文是啥意思?

  虚拟地址是什么鬼东西?线程需要那么多种状态干啥子?什么是乐观锁、悲观锁?死锁是怎么造成的?解决死锁的策略有哪些?等等...

  1、进程的通信方式

  2、进程、线程究竟是由什么组成的?有哪些数据?

  3、内存管理,包括:虚拟内存(重点)、分页、分段、分页系统地址映射、内存置换算法(重点)。

  4、死锁的处理策略(死锁预防、死锁检测与恢复、死锁避免)

  5、进程调度算法

  6、磁盘寻道算法

  推荐书籍:我看过的书籍是《操作系统—精髓与设计原理(第八版)》、《深入理解计算机操作系统(原书第三版)》。

  1. 基本概念和环境搭建

  在开始学习MySQL之前,需要先了解数据库的基本概念,例如关系型数据库、表、列、行等。接着,安装MySQL数据库管理系统,并学会使用命令行或图形界面工具(如MySQL Workbench、phpMyAdmin等)来连接和管理数据库。

  2. SQL语法学习

  开始学习SQL(结构化查询语言),它是用于管理和操作数据库的标准语言。掌握基本的SQL语句,包括查询(SELECT)、插入(INSERT)、更新(UPDATE)、删除(DELETE)等操作。同时,了解如何使用WHERE子句、排序(ORDER BY)和聚合函数(如COUNT、SUM等)。

  3. 高级查询和优化

  深入学习高级查询技巧,包括多表连接(JOIN)、子查询、分组(GROUP BY)及分组筛选(HAVING)。在此阶段,应关注查询性能优化,如创建和使用索引、选择合适的连接类型等。

  4. 数据库安全与权限管理

  了解数据库安全的重要性,并学会设置用户、分配权限以及管理用户权限。掌握如何备份和恢复数据,以防止数据丢失或损坏。 ?

  5. 存储过程、触发器和事务

  学习编写存储过程(Stored Procedure)以实现更复杂的逻辑,了解触发器(Trigger)如何在特定事件发生时自动执行。同时,学习事务(Transaction)的概念和如何在MySQL中使用事务以确保数据的完整性和一致性。

  6. 数据库设计与范式

  掌握数据库设计的基本原则,学习范式(Normalization)的概念,并了解如何应用范式以优化数据库结构。

  7. 结合编程语言

  学会如何在常用编程语言(如Python、Java、PHP等)中连接和操作MySQL数据库,实现与应用程序的集成。

  数据结构和算法可以帮助大家更好地理解如何解决实际问题,掌握这些知识能让你写出更高效的、更易于维护的代码。

  

  学习数据结构和算法也可以帮助我们更好地理解如何解决实际问题,比如:

  文件系统:操作系统的文件系统是一个树状结构,通过学习树这种数据结构,你可以更好地理解文件系统的组织方式,从而实现文件的创建、删除、移动等操作。

  文本编辑器:文本编辑器需要高效地处理文本插入、删除等操作。通过学习链表和树这两种数据结构,你可以实现一个高效的文本编辑器。

  数据库管理:数据库系统需要对大量数据进行高效的查询、插入和删除操作。学习哈希表和树(如B树、B+树)等数据结构以及相应的算法,可以帮助你更好地实现数据库管理系统。

  路由器:网络路由器需要快速地找到目标IP地址对应的下一跳路由信息。学习字典树(Trie)等数据结构和查找算法,可以帮助你实现一个高效的路由器。

  电商网站的推荐系统:通过学习机器学习算法,如协同过滤、聚类分析等,你可以为电商网站实现一个智能的商品推荐系统。

  地图导航软件:学习图算法,如Dijkstra和A*算法,可以帮助你实现一个高效的地图导航软件,为用户提供最短路径规划。

  资源调度:在分布式系统或操作系统中,需要对任务进行合理的调度。通过学习堆、队列等数据结构以及贪心算法和动态规划算法,你可以实现一个高效的资源调度系统。

  数据压缩和解压缩:通过学习霍夫曼编码等贪心算法,你可以实现一个数据压缩和解压缩工具,以节省存储空间和传输带宽。

  以上只是举例说一下,另外很多公司面试过程中都会考察求职者对数据结构和算法的掌握程度。多学习数据结构和算法,有助于提高面试通过率。

  汇编这边,学习了汇编,能够更好着帮助我们知道计算机是如何处理程序代码的,例如寄存器和内存是如何使用的?循环、函数调用、数组是如何实现的?地址是怎么一回事?等等。

  编译原理还是挺难得,但是有时间看看高校的课程也挺好的,学了以后可以知道我们的编译器如何分析我们的代码的,例如词法分析,语法分析,语义分析等等。当然,你未来可能会自己写个特定分析代码的编译器也不一定,这个时候,就更加需要学了。

  暂时就分享到这里,这些内容,是一个持续学习的过程。计算机基础+算法,这些内容值得每一个程序员学习。但是如果你是非科班的自学同学,建议以学习编程语言为主,后期再慢慢补这些知识。

  举报/反馈