先說(shuō)結(jié)論,基礎(chǔ)四大件包括:數(shù)據(jù)結(jié)構(gòu)和算法、計(jì)算機(jī)網(wǎng)絡(luò)、操作系統(tǒng)、設(shè)計(jì)模式
這幾個(gè)技術(shù)和什么語(yǔ)言無(wú)關(guān),但是如果是做偏軟件的工作,即使是嵌入式軟件,都是非常重要的,可以大大拓寬自己的職業(yè)生涯和技術(shù)深度。
正文
數(shù)據(jù)結(jié)構(gòu)和算法
如果想去大廠(chǎng)的同學(xué),這是必備的技能,不然最后的算法題部分肯定是過(guò)不去的。
基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)包括:
數(shù)組(Array):
一組具有相同數(shù)據(jù)類(lèi)型的元素按連續(xù)內(nèi)存空間存儲(chǔ)。
可以通過(guò)索引快速訪(fǎng)問(wèn)元素。
鏈表(Linked List):
一組元素,其中每個(gè)元素包含數(shù)據(jù)和一個(gè)指向下一個(gè)元素的指針。
常見(jiàn)的類(lèi)型有單向鏈表、雙向鏈表和循環(huán)鏈表。
棧(Stack):
一種遵循后進(jìn)先出(LIFO, Last In First Out)原則的數(shù)據(jù)結(jié)構(gòu)。
常用于遞歸和表達(dá)式求值。
隊(duì)列(Queue):
一種遵循先進(jìn)先出(FIFO, First In First Out)原則的數(shù)據(jù)結(jié)構(gòu)。
常用于任務(wù)調(diào)度和廣度優(yōu)先搜索(BFS)。
哈希表(Hash Table):
使用哈希函數(shù)將鍵映射到值的數(shù)據(jù)結(jié)構(gòu)。
提供快速的插入、刪除和查找操作。
樹(shù)(Tree):
一種由節(jié)點(diǎn)組成的分層數(shù)據(jù)結(jié)構(gòu),其中每個(gè)節(jié)點(diǎn)可以有零個(gè)或多個(gè)子節(jié)點(diǎn)。
常見(jiàn)的類(lèi)型有二叉樹(shù)、二叉搜索樹(shù)(BST)、平衡二叉樹(shù)(如AVL樹(shù))、紅黑樹(shù)等。
圖(Graph):
一組節(jié)點(diǎn)和連接這些節(jié)點(diǎn)的邊的集合。
可以表示對(duì)象之間的關(guān)系,常用于路徑搜索、網(wǎng)絡(luò)流問(wèn)題等。
基礎(chǔ)的算法包括:
排序算法:
冒泡排序(Bubble Sort):通過(guò)重復(fù)遍歷要排序的數(shù)列,比較每對(duì)相鄰元素,如果它們的順序錯(cuò)誤就把它們交換過(guò)來(lái)。
選擇排序(Selection Sort):每次從待排序的數(shù)據(jù)元素中選出最?。ɑ蜃畲螅┑囊粋€(gè)元素,存放在序列的起始位置,直到全部待排序的數(shù)據(jù)元素排完。
插入排序(Insertion Sort):通過(guò)構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。
歸并排序(Merge Sort):采用分治法,將問(wèn)題分成一些小的問(wèn)題然后遞歸解決,最后再將各個(gè)已排序的小段合并起來(lái)。
快速排序(Quick Sort):通過(guò)一趟排序?qū)⒋庞涗浄指舫瑟?dú)立的兩部分,其中一部分記錄的關(guān)鍵字均比另一部分的關(guān)鍵字小,然后再按此方法對(duì)這兩部分分別進(jìn)行快速排序。
搜索算法:
線(xiàn)性搜索(Linear Search):從數(shù)組的第一個(gè)元素開(kāi)始,依次將當(dāng)前元素與目標(biāo)值進(jìn)行比較,直到找到目標(biāo)值或搜索完整個(gè)數(shù)組。
二分搜索(Binary Search):在有序數(shù)組中查找某一特定元素的搜索算法,搜索過(guò)程從數(shù)組的中間元素開(kāi)始,如果中間元素正好是要查找的元素,則搜索過(guò)程結(jié)束;如果某一特定元素大于或者小于中間元素,則在數(shù)組大于或小于中間元素的那一半中查找,而且跟開(kāi)始一樣從中間元素開(kāi)始比較。
動(dòng)態(tài)規(guī)劃算法(Dynamic Programming):
用于解決最優(yōu)化問(wèn)題,通過(guò)將問(wèn)題分解為更小的子問(wèn)題,并存儲(chǔ)子問(wèn)題的解決方案以避免重復(fù)計(jì)算。
貪心算法(Greedy Algorithm):
在每一步選擇中都采取在當(dāng)前狀態(tài)下最好或最優(yōu)(即最有利)的選擇,從而希望導(dǎo)致結(jié)果是全局最好或最優(yōu)的算法。
回溯算法(Backtracking):
一種通過(guò)探索所有可能的候選解來(lái)找出所有解的算法,如果候選解被確認(rèn)不是一個(gè)解(或者至少不是最后一個(gè)解),回溯算法會(huì)通過(guò)在上一步進(jìn)行一些變化來(lái)丟棄該解,即“回溯”并嘗試另一個(gè)可能的候選解。
分治算法(Divide and Conquer):
將一個(gè)復(fù)雜的問(wèn)題分成兩個(gè)或更多的相同或相似的子問(wèn)題,再把子問(wèn)題分成更小的子問(wèn)題……直到最后子問(wèn)題可以簡(jiǎn)單的直接求解,原問(wèn)題的解即子問(wèn)題的解的合并。
計(jì)算機(jī)網(wǎng)絡(luò)
這里說(shuō)的計(jì)網(wǎng)主要是指TCP/IP協(xié)議棧,這是當(dāng)今互聯(lián)網(wǎng)和通信的基礎(chǔ),很多面試都會(huì)涉及這部分考察,另外這部分也是做很多通信開(kāi)發(fā)的基礎(chǔ)。
TCP/IP主要協(xié)議包括:
TCP/IP協(xié)議模型由四個(gè)層次組成,分別是應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層。以下是TCP/IP協(xié)議族中的主要協(xié)議及其作用:
一、應(yīng)用層協(xié)議
應(yīng)用層是TCP/IP協(xié)議集的最高層,負(fù)責(zé)處理特定的網(wǎng)絡(luò)應(yīng)用程序,如電子郵件、文件傳輸和網(wǎng)頁(yè)瀏覽。應(yīng)用層協(xié)議包括HTTP、FTP、SMTP、DNS等。這些協(xié)議定義了應(yīng)用程序如何使用網(wǎng)絡(luò)資源進(jìn)行通信。
HTTP(HyperText Transfer Protocol):用于在萬(wàn)維網(wǎng)(WWW)上傳輸超文本的協(xié)議。它是無(wú)狀態(tài)的、面向?qū)ο蟮膮f(xié)議,基于請(qǐng)求/響應(yīng)模型工作??蛻?hù)端(通常是瀏覽器)向服務(wù)器發(fā)送HTTP請(qǐng)求,服務(wù)器處理請(qǐng)求并返回HTTP響應(yīng)。
HTTPS(HyperText Transfer Protocol Secure):HTTP的安全版本,通過(guò)TLS/SSL協(xié)議加密數(shù)據(jù)傳輸,確保數(shù)據(jù)的機(jī)密性和完整性。
FTP(File Transfer Protocol):用于在網(wǎng)絡(luò)上傳輸文件的協(xié)議。它支持文件的上傳、下載和管理。
SFTP(Secure File Transfer Protocol):通過(guò)SSH(Secure Shell)加密傳輸文件的協(xié)議,確保文件傳輸?shù)陌踩浴?/p>
SMTP(Simple Mail Transfer Protocol):用于發(fā)送電子郵件的協(xié)議。它定義了郵件如何從發(fā)件人傳輸?shù)绞占说泥]件服務(wù)器。
IMAP(Internet Message Access Protocol):用于從郵件服務(wù)器讀取電子郵件的協(xié)議。與POP3不同,IMAP支持在服務(wù)器上管理郵件。
POP3(Post Office Protocol version 3):另一種從郵件服務(wù)器讀取電子郵件的協(xié)議。與IMAP不同,POP3通常將郵件下載到本地設(shè)備并從服務(wù)器上刪除。
DNS(Domain Name System):用于將域名解析為IP地址的系統(tǒng),是互聯(lián)網(wǎng)的重要基礎(chǔ)設(shè)施之一。
DHCP(Dynamic Host Configuration Protocol):用于動(dòng)態(tài)分配IP地址和其他網(wǎng)絡(luò)配置的協(xié)議。
二、傳輸層協(xié)議
傳輸層負(fù)責(zé)提供端到端的通信服務(wù)。傳輸層協(xié)議包括傳輸控制協(xié)議(TCP)和用戶(hù)數(shù)據(jù)報(bào)協(xié)議(UDP)。
TCP(Transmission Control Protocol):提供可靠的、面向連接的服務(wù)。它確保數(shù)據(jù)完整、無(wú)損并且按順序到達(dá)。TCP盡量連續(xù)不斷地測(cè)試網(wǎng)絡(luò)的負(fù)載并且控制發(fā)送數(shù)據(jù)的速度以避免網(wǎng)絡(luò)過(guò)載。
UDP(User Datagram Protocol):提供不可靠的、無(wú)連接的服務(wù)。UDP不對(duì)數(shù)據(jù)包是否已經(jīng)到達(dá)目的地進(jìn)行檢查,并且不保證數(shù)據(jù)包按順序到達(dá)。UDP協(xié)議傳輸效率高,但可靠性略低,適用于傳輸可靠性要求不高、體量小的數(shù)據(jù)。
三、網(wǎng)絡(luò)層協(xié)議
網(wǎng)絡(luò)層負(fù)責(zé)數(shù)據(jù)包的路由和轉(zhuǎn)發(fā)。網(wǎng)絡(luò)層協(xié)議包括因特網(wǎng)協(xié)議(IP)、地址解析協(xié)議(ARP)、互聯(lián)網(wǎng)控制報(bào)文協(xié)議(ICMP)等。
IP(Internet Protocol):最重要的網(wǎng)絡(luò)層協(xié)議,它定義了數(shù)據(jù)包的格式和地址結(jié)構(gòu),并負(fù)責(zé)數(shù)據(jù)包的路由。IP協(xié)議是一種無(wú)連接、不可靠的分組傳送服務(wù)的協(xié)議。
ARP(Address Resolution Protocol):用于將IP地址解析為物理地址(如MAC地址),以便在局域網(wǎng)中進(jìn)行數(shù)據(jù)通信。
ICMP(Internet Control Message Protocol):用于發(fā)送錯(cuò)誤和狀態(tài)信息,如網(wǎng)絡(luò)不可達(dá)、主機(jī)不可達(dá)等。
四、網(wǎng)絡(luò)接口層協(xié)議
網(wǎng)絡(luò)接口層負(fù)責(zé)與物理網(wǎng)絡(luò)的接口,包括以太網(wǎng)、Wi-Fi等。網(wǎng)絡(luò)接口層協(xié)議定義了如何在物理網(wǎng)絡(luò)上傳輸數(shù)據(jù)幀,以及如何處理鏈路層的錯(cuò)誤和沖突。網(wǎng)絡(luò)接口層協(xié)議包括以太網(wǎng)協(xié)議、PPP協(xié)議等。
綜上所述,TCP/IP協(xié)議族中的各個(gè)協(xié)議共同協(xié)作,確保了數(shù)據(jù)在網(wǎng)絡(luò)中的高效、可靠傳輸。
操作系統(tǒng)
操作系統(tǒng)更是軟件開(kāi)發(fā)的重中之重,尤其是對(duì)于嵌入式開(kāi)發(fā)者來(lái)說(shuō),如果你還不會(huì)操作系統(tǒng),那務(wù)必得下功夫了。
操作系統(tǒng)開(kāi)發(fā)重點(diǎn)(這里重點(diǎn)說(shuō)下Linux系統(tǒng)):(重點(diǎn)我標(biāo)出來(lái)了)
一、Linux操作系統(tǒng)基礎(chǔ)
基本概念:理解Linux操作系統(tǒng)的內(nèi)核、文件系統(tǒng)、進(jìn)程管理、權(quán)限和用戶(hù)管理等基本概念。
命令行操作:熟悉Linux命令行接口(CLI),掌握常用的命令,如文件操作、進(jìn)程管理、網(wǎng)絡(luò)配置等。
Shell編程:學(xué)習(xí)Shell腳本語(yǔ)言(如Bash、Zsh、Ksh等),掌握腳本語(yǔ)法和邏輯,能夠編寫(xiě)腳本來(lái)自動(dòng)化日常任務(wù)和系統(tǒng)管理操作。
二、Linux系統(tǒng)編程
系統(tǒng)編程接口:理解并掌握Linux系統(tǒng)編程接口,包括標(biāo)準(zhǔn)庫(kù)函數(shù)和系統(tǒng)調(diào)用。
進(jìn)程與線(xiàn)程:深入理解Linux多任務(wù)編程中的多進(jìn)程和多線(xiàn)程,以及進(jìn)程間通信(如pipe、FIFO、消息隊(duì)列、共享內(nèi)存、signal、信號(hào)量等)。
同步與互斥:學(xué)習(xí)同步與互斥對(duì)共享資源訪(fǎng)問(wèn)控制的重要性,確保多個(gè)進(jìn)程或線(xiàn)程能夠安全地訪(fǎng)問(wèn)共享資源。
三、Linux網(wǎng)絡(luò)編程
TCP/IP協(xié)議:理解TCP/IP協(xié)議棧的工作原理,掌握socket編程接口。
網(wǎng)絡(luò)編程API:熟悉Linux網(wǎng)絡(luò)編程相關(guān)API,如TCP/UDP網(wǎng)絡(luò)編程、Web編程開(kāi)發(fā)等。
并發(fā)服務(wù)器:學(xué)習(xí)如何實(shí)現(xiàn)TCP協(xié)議服務(wù)器的編程方法和并發(fā)服務(wù)器的設(shè)計(jì)。
四、Linux內(nèi)核開(kāi)發(fā)
內(nèi)核原理:深入理解Linux內(nèi)核的工作原理,包括進(jìn)程管理、內(nèi)存管理、文件系統(tǒng)、網(wǎng)絡(luò)子系統(tǒng)等。
內(nèi)核模塊編程:學(xué)習(xí)如何編寫(xiě)和加載內(nèi)核模塊,以便在內(nèi)核空間運(yùn)行自定義代碼。
設(shè)備驅(qū)動(dòng)開(kāi)發(fā):掌握Linux設(shè)備驅(qū)動(dòng)的原理和框架,熟悉字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備等驅(qū)動(dòng)的開(kāi)發(fā)。
五、Linux開(kāi)發(fā)工具與環(huán)境
編輯器與IDE:熟悉Linux下的文本編輯器(如Vim、Emacs)和集成開(kāi)發(fā)環(huán)境(IDE,如Eclipse、Visual Studio Code)。
編譯器與調(diào)試器:掌握GCC編譯器和GDB調(diào)試器的使用,以便進(jìn)行高效的代碼編寫(xiě)和調(diào)試。
版本控制:熟悉Git等版本控制系統(tǒng)的使用,以便進(jìn)行代碼管理和團(tuán)隊(duì)協(xié)作。
六、Linux系統(tǒng)安全與優(yōu)化
系統(tǒng)安全機(jī)制:了解Linux系統(tǒng)的安全機(jī)制,如SELinux、AppArmor等,確保系統(tǒng)的安全性。
性能優(yōu)化:學(xué)習(xí)性能分析工具(如gprof、valgrind、perf等)的使用,掌握代碼優(yōu)化技巧,提高程序性能。
穩(wěn)定性與可靠性:通過(guò)充分的測(cè)試(如單元測(cè)試、集成測(cè)試、系統(tǒng)測(cè)試等)來(lái)確保軟件的穩(wěn)定性和可靠性。
設(shè)計(jì)模式
設(shè)計(jì)模式可以提高代碼的可復(fù)用性、靈活性、可擴(kuò)展性。
最經(jīng)典的教材就是23種設(shè)計(jì)模式,這里也不用全部記住,掌握最常見(jiàn)的幾種就可以,其他可以用到再說(shuō)。
23種設(shè)計(jì)模式有哪些:
23種設(shè)計(jì)模式是由Gang of Four(GoF)在《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書(shū)中提出的經(jīng)典設(shè)計(jì)模式,它們分為三大類(lèi):創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式。以下是這23種設(shè)計(jì)模式的詳細(xì)分類(lèi)及介紹:
一、創(chuàng)建型模式(5種)
單例模式(Singleton):確保一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)全局訪(fǎng)問(wèn)點(diǎn)。
工廠(chǎng)方法模式(Factory Method):定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。工廠(chǎng)方法使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)。
抽象工廠(chǎng)模式(Abstract Factory):提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口,而無(wú)需指定它們具體的類(lèi)。
建造者模式(Builder):將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
原型模式(Prototype):用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi),并且通過(guò)拷貝這些原型來(lái)創(chuàng)建新的對(duì)象。
二、結(jié)構(gòu)型模式(7種)
適配器模式(Adapter):將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。適配器模式讓原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。
橋接模式(Bridge):將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。
組合模式(Composite):將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。它使得客戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。
裝飾器模式(Decorator):動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就擴(kuò)展功能而言,裝飾器模式比生成子類(lèi)方式更為靈活。
外觀模式(Facade):為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。
享元模式(Flyweight):運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。
代理模式(Proxy):為其他對(duì)象提供一個(gè)代理或占位符,以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn)。
三、行為型模式(11種)
模板方法模式(Template Method):定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。模板方法使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
策略模式(Strategy):定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可相互替換。本模式使得算法的變化可獨(dú)立于使用它的客戶(hù)。
命令模式(Command):將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶(hù)進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可取消的操作。
責(zé)任鏈模式(Chain of Responsibility):為解除請(qǐng)求的發(fā)送者和接收者之間耦合,而使多個(gè)對(duì)象都有機(jī)會(huì)處理這個(gè)請(qǐng)求。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它。
狀態(tài)模式(State):允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。對(duì)象看起來(lái)似乎修改了它所屬的類(lèi)。
觀察者模式(Observer):定義對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,以便當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都得到通知并自動(dòng)刷新。
中介者模式(Mediator):用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。
迭代器模式(Iterator):提供一種方法順序訪(fǎng)問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素,而又不需暴露該對(duì)象的內(nèi)部表示。
訪(fǎng)問(wèn)者模式(Visitor):表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類(lèi)的前提下定義作用于這些元素的新操作。
備忘錄模式(Memento):在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到保存的狀態(tài)。
解釋器模式(Interpreter):給定一個(gè)語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來(lái)解釋語(yǔ)言中的句子。
今天先梳理了這“四大件”的概念,后續(xù)會(huì)分開(kāi)說(shuō)下學(xué)習(xí)的資料和路徑,歡迎關(guān)注。
未完待續(xù),持續(xù)更新!以防后邊找不到可以點(diǎn)贊收藏下!