加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 数据结构和算法
    • 计算机网络
    • 操作系统
    • 设计模式
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

必须掌握的编程基础“四大件”详解

10小时前
468
阅读需 20 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

先说结论,基础四大件包括:数据结构和算法、计算机网络、操作系统、设计模式

这几个技术和什么语言无关,但是如果是做偏软件的工作,即使是嵌入式软件,都是非常重要的,可以大大拓宽自己的职业生涯和技术深度。

正文

数据结构和算法

如果想去大厂的同学,这是必备的技能,不然最后的算法题部分肯定是过不去的。

基础的数据结构包括:

数组(Array):

一组具有相同数据类型的元素按连续内存空间存储。

可以通过索引快速访问元素。

链表(Linked List):

一组元素,其中每个元素包含数据和一个指向下一个元素的指针。

常见的类型有单向链表、双向链表和循环链表。

栈(Stack):

一种遵循后进先出(LIFO, Last In First Out)原则的数据结构。

常用于递归和表达式求值。

队列(Queue):

一种遵循先进先出(FIFO, First In First Out)原则的数据结构。

常用于任务调度和广度优先搜索(BFS)。

哈希表(Hash Table):

使用哈希函数将键映射到值的数据结构。

提供快速的插入、删除和查找操作。

树(Tree):

一种由节点组成的分层数据结构,其中每个节点可以有零个或多个子节点。

常见的类型有二叉树、二叉搜索树(BST)、平衡二叉树(如AVL树)、红黑树等。

图(Graph):

一组节点和连接这些节点的边的集合。

可以表示对象之间的关系,常用于路径搜索、网络流问题等。

基础的算法包括:

排序算法:

冒泡排序(Bubble Sort):通过重复遍历要排序的数列,比较每对相邻元素,如果它们的顺序错误就把它们交换过来。

选择排序(Selection Sort):每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

插入排序(Insertion Sort):通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

归并排序(Merge Sort):采用分治法,将问题分成一些小的问题然后递归解决,最后再将各个已排序的小段合并起来。

快速排序(Quick Sort):通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后再按此方法对这两部分分别进行快速排序。

搜索算法:

线性搜索(Linear Search):从数组的第一个元素开始,依次将当前元素与目标值进行比较,直到找到目标值或搜索完整个数组。

二分搜索(Binary Search):在有序数组中查找某一特定元素的搜索算法,搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。

动态规划算法(Dynamic Programming):

用于解决最优化问题,通过将问题分解为更小的子问题,并存储子问题的解决方案以避免重复计算。

贪心算法(Greedy Algorithm):

在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。

回溯算法(Backtracking):

一种通过探索所有可能的候选解来找出所有解的算法,如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化来丢弃该解,即“回溯”并尝试另一个可能的候选解。

分治算法(Divide and Conquer):

将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

计算机网络

这里说的计网主要是指TCP/IP协议栈,这是当今互联网通信的基础,很多面试都会涉及这部分考察,另外这部分也是做很多通信开发的基础。

TCP/IP主要协议包括:

TCP/IP协议模型由四个层次组成,分别是应用层传输层网络层网络接口层。以下是TCP/IP协议族中的主要协议及其作用:

一、应用层协议

应用层是TCP/IP协议集的最高层,负责处理特定的网络应用程序,如电子邮件、文件传输和网页浏览。应用层协议包括HTTP、FTP、SMTP、DNS等。这些协议定义了应用程序如何使用网络资源进行通信。

HTTP(HyperText Transfer Protocol):用于在万维网(WWW)上传输超文本的协议。它是无状态的、面向对象的协议,基于请求/响应模型工作。客户端(通常是浏览器)向服务器发送HTTP请求,服务器处理请求并返回HTTP响应。

HTTPS(HyperText Transfer Protocol Secure):HTTP的安全版本,通过TLS/SSL协议加密数据传输,确保数据的机密性和完整性。

FTP(File Transfer Protocol):用于在网络上传输文件的协议。它支持文件的上传、下载和管理。

SFTP(Secure File Transfer Protocol):通过SSH(Secure Shell)加密传输文件的协议,确保文件传输的安全性。

SMTP(Simple Mail Transfer Protocol):用于发送电子邮件的协议。它定义了邮件如何从发件人传输到收件人的邮件服务器。

IMAP(Internet Message Access Protocol):用于从邮件服务器读取电子邮件的协议。与POP3不同,IMAP支持在服务器上管理邮件。

POP3(Post Office Protocol version 3):另一种从邮件服务器读取电子邮件的协议。与IMAP不同,POP3通常将邮件下载到本地设备并从服务器上删除。

DNS(Domain Name System):用于将域名解析为IP地址的系统,是互联网的重要基础设施之一。

DHCP(Dynamic Host Configuration Protocol):用于动态分配IP地址和其他网络配置的协议。

二、传输层协议

传输层负责提供端到端的通信服务。传输层协议包括传输控制协议(TCP)和用户数据报协议(UDP)。

TCP(Transmission Control Protocol):提供可靠的、面向连接的服务。它确保数据完整、无损并且按顺序到达。TCP尽量连续不断地测试网络的负载并且控制发送数据的速度以避免网络过载。

UDP(User Datagram Protocol):提供不可靠的、无连接的服务。UDP不对数据包是否已经到达目的地进行检查,并且不保证数据包按顺序到达。UDP协议传输效率高,但可靠性略低,适用于传输可靠性要求不高、体量小的数据。

三、网络层协议

网络层负责数据包的路由和转发。网络层协议包括因特网协议(IP)、地址解析协议ARP)、互联网控制报文协议(ICMP)等。

IP(Internet Protocol):最重要的网络层协议,它定义了数据包的格式和地址结构,并负责数据包的路由。IP协议是一种无连接、不可靠的分组传送服务的协议。

ARP(Address Resolution Protocol):用于将IP地址解析为物理地址(如MAC地址),以便在局域网中进行数据通信

ICMP(Internet Control Message Protocol):用于发送错误和状态信息,如网络不可达、主机不可达等。

四、网络接口层协议

网络接口层负责与物理网络的接口,包括以太网、Wi-Fi等。网络接口层协议定义了如何在物理网络上传输数据帧,以及如何处理链路层的错误和冲突。网络接口层协议包括以太网协议、PPP协议等。

综上所述,TCP/IP协议族中的各个协议共同协作,确保了数据在网络中的高效、可靠传输。

操作系统

操作系统更是软件开发的重中之重,尤其是对于嵌入式开发者来说,如果你还不会操作系统,那务必得下功夫了。

操作系统开发重点(这里重点说下Linux系统):(重点我标出来了)

一、Linux操作系统基础

基本概念:理解Linux操作系统的内核、文件系统、进程管理、权限和用户管理等基本概念。

命令行操作:熟悉Linux命令行接口(CLI),掌握常用的命令,如文件操作、进程管理、网络配置等。

Shell编程:学习Shell脚本语言(如Bash、Zsh、Ksh等),掌握脚本语法和逻辑,能够编写脚本来自动化日常任务和系统管理操作。

二、Linux系统编程

系统编程接口:理解并掌握Linux系统编程接口,包括标准库函数和系统调用。

进程与线程:深入理解Linux多任务编程中的多进程和多线程,以及进程间通信(如pipe、FIFO、消息队列、共享内存、signal、信号量等)。

同步与互斥:学习同步与互斥对共享资源访问控制的重要性,确保多个进程或线程能够安全地访问共享资源。

三、Linux网络编程

TCP/IP协议:理解TCP/IP协议栈的工作原理,掌握socket编程接口。

网络编程API:熟悉Linux网络编程相关API,如TCP/UDP网络编程、Web编程开发等。

并发服务器:学习如何实现TCP协议服务器的编程方法和并发服务器的设计。

四、Linux内核开发

内核原理:深入理解Linux内核的工作原理,包括进程管理、内存管理、文件系统、网络子系统等。

内核模块编程:学习如何编写和加载内核模块,以便在内核空间运行自定义代码。

设备驱动开发:掌握Linux设备驱动的原理和框架,熟悉字符设备、块设备、网络设备等驱动的开发。

五、Linux开发工具与环境

编辑器与IDE:熟悉Linux下的文本编辑器(如Vim、Emacs)和集成开发环境(IDE,如Eclipse、Visual Studio Code)。

编译器调试器:掌握GCC编译器和GDB调试器的使用,以便进行高效的代码编写和调试。

版本控制:熟悉Git等版本控制系统的使用,以便进行代码管理和团队协作。

六、Linux系统安全与优化

系统安全机制:了解Linux系统的安全机制,如SELinux、AppArmor等,确保系统的安全性。

性能优化:学习性能分析工具(如gprof、valgrind、perf等)的使用,掌握代码优化技巧,提高程序性能。

稳定性与可靠性:通过充分的测试(如单元测试、集成测试、系统测试等)来确保软件的稳定性和可靠性。

设计模式

设计模式可以提高代码的可复用性、灵活性、可扩展性。

最经典的教材就是23种设计模式,这里也不用全部记住,掌握最常见的几种就可以,其他可以用到再说。

23种设计模式有哪些:

23种设计模式是由Gang of Four(GoF)在《设计模式:可复用面向对象软件的基础》一书中提出的经典设计模式,它们分为三大类:创建型模式、结构型模式和行为型模式。以下是这23种设计模式的详细分类及介绍:

一、创建型模式(5种)

单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。

工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。

二、结构型模式(7种)

适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。适配器模式让原本由于接口不兼容而不能一起工作的那些类可以一起工作。

桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。

组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和组合对象的使用具有一致性。

装饰器模式(Decorator):动态地给一个对象添加一些额外的职责。就扩展功能而言,装饰器模式比生成子类方式更为灵活。

外观模式(Facade):为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,这个接口使得这一子系统更加容易使用。

享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。

代理模式(Proxy):为其他对象提供一个代理或占位符,以控制对这个对象的访问。

三、行为型模式(11种)

模板方法模式(Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

责任链模式(Chain of Responsibility):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

状态模式(State):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。

观察者模式(Observer):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

解释器模式(Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

今天先梳理了这“四大件”的概念,后续会分开说下学习的资料和路径,欢迎关注。

未完待续,持续更新!以防后边找不到可以点赞收藏下!

相关推荐

电子产业图谱

90后500强外企软件研发工程师,专注C/C++/IoT等技术分享。