公司网站怎么做网站备案,烟台网站开发,做网站和APP需要多少钱,山东网站推广营销设计1. 第一阶段 学好 C 语言和 Linux
1.1 学好 C 语言
无论你是科班还是非科班#xff0c;建议你一定要学好 C 语言#xff0c;它应该作为你必须掌握好的语言。你要熟悉 C 语言的基本语法#xff0c;包括#xff1a; 顺序、条件、循环三大控制语句 C 中几大基元数据类型的用…1. 第一阶段 学好 C 语言和 Linux
1.1 学好 C 语言
无论你是科班还是非科班建议你一定要学好 C 语言它应该作为你必须掌握好的语言。你要熟悉 C 语言的基本语法包括 顺序、条件、循环三大控制语句 C 中几大基元数据类型的用法 熟悉掌握数组的用法 熟练掌握指针的用法 熟练掌握结构体、枚举、联合等数据类型的用法 熟练使用常用 C 库函数如控制台输入输出流、字符串操作、文件操作、时间函数等等
以上阶段算是启蒙阶段在这个阶段是基础编程语法的学习当然你不仅仅要掌握这些基本语法你还要反复练习。
我当年总是不理解 C 语言中的一些概念和原理后来我的学长推荐了我一本书——《C语言程序设计 现代方法》并且我利用这本书也考上了相关的专业的研究生。这本书成了我迷茫时的一座灯塔今天我把它推荐给学弟学妹们。 这本书在国外是作为经典大学教材的两位译者一位是亚洲理工大学一位是中科院书翻译的也很地道。
当然如果你熟悉了 C 语言的常用语法后你想进一步针对 C 语言的一些细节和高级特性进行查漏补缺推荐看看《C 专家编程》。
无论是 C 还是 C指针一直是很多初学者的老大难可以把指针作为一个专题彻底搞明白关于这方面也有一本非常好的书这本书的语言写的也非常通俗易懂我当年读完之后对指针再无疑惑书名叫《C 和指针》。
指针是 C 语言乃至整个操作系统的灵魂一定要理解好。
1.2 学习 Linux 常用操作
一、多接触多操作
根据我自己的经历来说一下我当年从 Windows 转到 Linux虽然勉强入职了但是非常害怕工作中因不熟悉 Linux 的操作被同事质疑。后来我就在自己的电脑上撞了一个 CentOS然后自己玩再业余时间结合一些 Linux 系统学习资料/图书学习没过多久也熟悉了。
通常情况下记不住 Linux 命令有如下几种原因
原因一刚接触习惯了之前的图形化界面操作不习惯 Linux 各种命令行操作心存恐惧之心。
原因二不经常使用 Linux操作生疏。
如果是上述两个原因的话建议读者多玩一玩 Linux 操作系统可以在自己电脑上通过虚拟机安装一个 Linux 系统如 CentOS、Ubuntu。自己在虚拟机中安装 Linux 系统的好处是你可以任意把玩这个系统只要愿意可以搞清楚这个系统的方方面面。
如果你的机器配置不行或者不愿意自己安装 Linux 系统可以花一点费用去各大云主机上如阿里云、腾讯云买一些低配的 Linux 主机空间来玩然后用 XShell、SecureCRT 这样的工具去远程登录到云主机上去玩。下图就是我使用 SecureCRT 连接到我的阿里云主机上进行操作 原因三命令比较复杂用法比较多。
如果是这个原因建议先搞懂这个命令的用法例如一些常见功能实在太复杂的命令只要知道其有哪些用途需要用的时候去查一下帮助文档就可以了Linux 的 man 手册要多查多用。
举个例子我开始学习 Linux 的 lsof 命令时总是记不住这个命令的一些参数后来我总结了一下我的使用场景大多数情况下就是用来查看操作系统的 IP 地址和端口号信息其常用的参数也就 -i 和 -Pn。
[rootmyaliyun ~]# lsof -i -Pn
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ntpd 522 ntp 16u IPv4 12575 0t0 UDP *:123
ntpd 522 ntp 17u IPv6 12576 0t0 UDP *:123
ntpd 522 ntp 18u IPv4 12596 0t0 UDP 127.0.0.1:123
ntpd 522 ntp 20u IPv4 15777 0t0 UDP 172.16.210.241:123
dhclient 743 root 6u IPv4 13435 0t0 UDP *:68
mysqld 1256 mysql 13u IPv4 16416 0t0 TCP *:3306 (LISTEN)
sshd 1485 root 3u IPv4 17012 0t0 TCP *:22 (LISTEN)
nginx 1723 root 6u IPv4 26732 0t0 TCP *:80 (LISTEN)
nginx 1724 root 6u IPv4 26732 0t0 TCP *:80 (LISTEN)
server 11761 root 4u IPv4 13328465 0t0 TCP 172.16.210.241:39312-118.178.56.143:8080 (ESTABLISHED)
server 12402 root 4u IPv4 13328465 0t0 TCP 172.16.210.241:39312-118.178.56.143:8080 (ESTABLISHED)
fileserve 18483 root 5u IPv4 10028642 0t0 TCP *:20001 (LISTEN)
imgserver 18496 root 6u IPv4 10028977 0t0 TCP *:20002 (LISTEN)
route_ser 19613 root 5u IPv4 833919 0t0 TCP *:8200 (LISTEN)
file_serv 19644 root 6u IPv4 834017 0t0 TCP *:8600 (LISTEN)
file_serv 19644 root 7u IPv4 834018 0t0 TCP 127.0.0.1:8601 (LISTEN)
msfs 20274 root 5u IPv4 834510 0t0 TCP *:8700 (LISTEN)
AliYunDun 21538 root 20u IPv4 11768616 0t0 TCP 172.16.210.241:60868-100.100.30.26:80 (ESTABLISHED)
sshd 23923 root 3u IPv4 13533428 0t0 TCP 172.16.210.241:22-116.236.159.130:56739 (ESTABLISHED)
sshd 31548 root 3u IPv4 13537639 0t0 TCP 172.16.210.241:22-116.236.159.130:61055 (ESTABLISHED)
当然这个命令还可以在一些情况下恢复被删除的 Linux 文件那我知道有这么回事我实际需要的时候去查一下帮助文档就可以了。
再比如 nc 命令我用的最常用的参数就是 -v -l -p。
但是像 awk 命令的具体格式我是实在记不住的我每次用的时候都是去查。
当然良好的英语水平也能帮助你记忆一些 Linux 命令如 ls listlsof list opened file。
其实 Linux 系统常用的命令并不多。
二、理解一些 Linux 原理
有一些 Linux 操作你一定要理解其背后的原理比如经常有一些学生来面试告诉我熟悉 Linux 系统我就问他 Linux 下如何判断一个文件是可执行文件很多同学只知道可以使用 chmod x 授予执行权限却不知道这个权限怎么看。
三、多积累一些小技巧
除了系统地阅读一些 Linux 书籍之外平常可以找一些 Linux 各种小技巧的文章来看一看。比如一些同学可能不知道 vim 中如何复制粘贴、如何撤销一个操作、命令行中如何在从一键跳转到命令行的开始或者结尾处、如何使用命令与 Windows 系统之间传输文件等等。
这些技巧可以自己收集于网络也可以自己细心观察学习自你的同学、同事等等。
四、推荐一些学习 Linux 的资源
就事论事Linux 系统并不比 Windows 难多少克服恐惧一定能上手的。
推荐书籍
《Linux 就是这个范儿》
《鸟哥的 Linux 私房菜基础篇》
《鸟哥的Linux私房菜服务器架设篇》
推荐视频
linux操作系统入门到精通全套教程含pdf文档linux小白、linux零基础也能快速学会https://www.bilibili.com/video/BV1Sg4y1X7Ap/
2. 第二阶段 学好算法和数据结构
如果你想毕业后进大厂建议好好学习算法和数据结构。学习算法和数据一定不能急功近利算法和数据结构的知识一定要作为一个长期的学习目标。
对于非科班的同学由于没有像科班同学那样接受到系统的学习一定要找一两本经典书籍系统地学习下常见的算法理论、思想和常用的数据结构知识。等熟悉了这块的知识再适当地刷一些算法题目或者做一些算法练习。
对于校招或者工作年限不长的同学面试大厂必然有一些算法和数据结构的题目。
而且对于校招通常这块答的不好基本就被一票否决了。这也是我建议那些参加校招的同学要好好准备算法和数据结构的题目了。说到这里为一些学历不错但是因为在校招前不认真准备这块、最终无缘大厂的同学感到惋惜懒惰两个月影响职业生涯一辈子。
我目前人在大厂做开发有时候也担任面试官。从面试官的角度来说大多数技术岗位算法这块的题目并不难但是一定要在面试前好好准备一下。
另外很多算法题其实就是《剑指 offer》上的原题。 推荐视频教程
c/c后端开发必学数据结构与算法红黑树、B-/B树、时间轮、跳表、hash、二叉树、布隆过滤器...https://www.bilibili.com/video/BV1nc411K7vw/
3. 第三阶段 学习一门重型编程语言 如果你想成为开发高手必须要学一门重型编程语言傍身可以是 C/C/Java只会 Python 和 php 等是远远不够的。 3.1 如果是学习 C可以这么学
C 语言本身涉及到的知识点比较多需要强调的是既然是学习请抛弃各种总结经验技巧的面经逐个掌握 C 语言的各个知识点包括但不局限于 指针和引用的概念 指针与内存关系 程序编译过程静态链接库和动态链接库 static、const、#define的用法和区别 C和C区别 内存中的栈和堆分配 面向对象理解 访问限定符 public/protected/private 构造函数/析构函数/拷贝构造 多态 虚函数与纯虚函数、虚函数实现机制、虚函数表 继承原理、虚继承、菱形继承 new/delete和malloc/free 重载、重写和覆盖 类型转换方式 RAII 与 pimpl 惯用法 内存溢出和内存泄漏 STL标准模板库 迭代器、空间配置器理解 常用容器特点、用法以及底层实现vector、list、deque、set、map、unorderedmap
C11/14/17 新标准也慢慢成为主流这块也要熟悉要熟悉新标准常用的语法与新功能包括另外时至今日你一定要熟悉 C11/14/17 常用的语言特性和类库这里简单地列一下 左值/右值/std::move/std::forward 统一的类成员初始化语法与 std::initializer_list 注解标签attributes final/override/default/delete 语法 auto 关键字 Range-based 循环语法 结构化绑定 stl 容器新增的实用方法 std::thread 线程局部存储 thread_local 线程同步原语 std::mutex、std::condition_variable 等 原子操作类 智能指针类 std::bind/std::function
C11/14 网上的资料已经很多了C17 的资料不多重点掌握的还是 C11 引入的各种实用特性这就给读者推荐一些我读过的书文末有完整的书单及下载方式 《深入理解 C11C11 新特性解析与应用》 《深入应用 C11代码优化与工程级应用》 《C17 完全指南》 《Cpp 17 in Detail》
4. 第四阶段 熟悉编程语言相关的开发工具链
熟悉该语言的相关的 IDE 开发环境如果是 C 开发Windows上我推荐 Visual StudioMac 上可以使用Subline 或者VSCode如果你最终的程序需要在 Linux 跑你需要熟悉 cmake/make/gcc/g/gdb 工具链vim 的基本操作也要熟悉但绝对不要直接在 vim 中写代码纯属浪费时间实际企业级开发也没人会这么做。这里强调一下如果可能至少要熟悉 Visual Studio 和 gdb 调试调试需要掌握哪些内容呢
建议掌握 如何启动和结束调试 如何添加/删除/启用/禁用断点包括普通断点、条件断点和数据断点 如何查看当天断点下的调用对战 如何查看程序运行过程中的线程信息这块可以放到下文再学 如何查看某个变量的内存值
掌握了一门编程语言加其开发的工具链你的想法就可以通过动手变为现实了。熟悉了 C/C 语言和其相关的开发工具链接下来你可以根据你的兴趣学习相关的开发知识了。
接下来就挨个学计算机学科的各类基础知识了。如果你是非科班也建议自己找点经典的书籍系统地学习一下。下面挨个说一下这几大方面的基础知识。
5. 第五阶段 熟悉操作系统原理和常用 API 接口
5.1 学习操作系统常用 API
除了 C 本身的语法你还需要学习操作系统的常用 API 接口函数、Socket 编程等等不然可能还是很难写出有用的程序这也是为什么很多同学在学习完 C 语言之后始终只会写黑洞洞的命令行程序。很多人说操作系统的 API 接口不用刻意学习根据我个人的经验我反对这一观点操作系统的很多 API 涉及到很多操作系统原理和使用技巧绝非是想用的时候去查一查就可以了。就和开卷考试一样如果不熟悉且不说不知道如何查、在哪查就算查到了是否可以用好又是另外一回事了。
虽然现在 C 自带的 stl 库封装的操作系统的功能已经日趋完善但是做 C 开发不熟悉常见操作系统的 API 函数是行不通的。我上学的时候C 语言本身学的不错但是我总觉得实现自己想要的功能很困难例如做一个五子棋项目如何在棋盘上画方格做一个网盘项目如何高效的利用多线程分割和组装文件。当年在看别人开源项目时我发现让我觉得困难的并不是 C 语言而是各种我不熟悉的操作系统 API 和给它们传递的参数。
对于 Linux 系统我入门的时候看的是 Robert Love 的《Linux 系统编程》这本书介绍了 Linux 系统上常用的 API 函数和背后的原理。Robert Love 是 Google 的工程师他也《Linux 内核设计与实现》一书的作者。 Windows 系统 API 学习我推荐《Windows 程序设计第五版》和 《Windows 核心编程》。 说了这么多强调熟悉操作系统 API 的重要性我来举个例子吧假设我们要开发一款像电驴一样的商业软件需要软件界面如下图 电驴 - 源码下载 链接https://pan.baidu.com/s/1aZl1tfqE7D_iDj1cn5aUcg 提取码v83h 如上图所示假设操作系统选择 Windows使用语言使用 C这就要求您必须熟悉 C 常用的语法如果还不熟悉就需要补充这方面的知识。
在熟悉 C 语法的前提下从这款产品实现技术来看我们的目标产品分为 UI 和网络通信部分。下面将详细介绍这两部分。
UI 部分
对于 UI 部分我们的认识是这里需要使用 Windows 的窗口技术。可以直接使用原生的 Win 32 API 来制作自己的界面库也可以选择一些熟悉的界面框架如 MFC、WTL、Duilib、wxWidgets 等。无论您是在阅读别人的项目还是需要自己开发这样的项目在确定了这款软件使用的 UI 库或者使用原生 Win 32 API您就需要对 Windows 的窗口、对话框、消息产生、派发与处理机制进行了解。同样的道理如果不熟悉您需要补充相关的知识关于这一点下文不再赘述。
接着根据上图中的软件功能大致分为三大模块即资源、下载和分享。这三大块是可以使用一个 Windows Tab 控件去组织这个时候您需要了解 Windows Tab 控件的特性。 对于资源模块本质上是一个窗口中嵌入了一个浏览器控件WebBrowser 控件那么您需要了解这一个功能点的相关知识。当用户点击了某个列表中某个具体的资源可以对其进行下载。这就又涉及到 WebBrowser 控件与 C 宿主程序的交互了那么如何实现呢可以选择使用 ActiveX 技术也可以使用 JavaScript 与 C 交互技术。 再来看下载模块当产生一个下载操作时界面上会产生以下下载列表每个列表项会实时显示下载进度、下载速率等参数同时正在下载的项目也可以被暂停、停止和删除。那么这又涉及到 ListView 控件的相关功能以及 ListView 如何与后台网络通信的逻辑交互。 分享模块是将本地资源分享到服务器或者给其他用户。界面左侧是文件系统的一个快照那么这又涉及到如何遍历文件系统了解枚举文件系统的 API右侧也是一个 ListView 控件这里不再赘述。
网络通信部分
网络通信部分主要有两大块第一个是程序启动时与服务端的交互第二个就是文件下载与分享的 P2P 网络。您在阅读或开发的过程中如果对这些技术比较陌生您需要补充这些知识具体的就是 Socket 的各种 API 函数以及基于这些 API 逻辑的组合。当然可能也会用到操作系统平台所特有的网络 API 函数如 WSAAsyncSelect 网络模型。
另外一点网络通信部分如何与 UI 部分进行数据交换是使用队列全局变量或者相应的 Windows 操作平台提供的特殊通信技术如 PostMessage 函数、管道如果使用队列多线程之间如何保持资源的一致性和解决资源竞态使用 Event、CriticalSection、Mutex、Semaphore 等
当然笔者这里只列举了这个软件的主干部分还有许多方方面面的细节需要考虑。这就需要读者根据自己的情况斟酌和筛选了。您想达到什么目的就要去学习和研究相关的代码。
总结起来可以得到如下公式 一款 C 软件 C 语法 操作系统 API 函数调用 学习操作系统的接口不仅是学习相关操作系统 API同时也是在培养自己的动手和实践能力。常用的操作系统 API 并不多以多线程相关的为例Windows 系统提供的线程同步原语常用的有临界区、Event、互斥体、信号量等Linux 常用的有互斥体、读写锁、信号量和条件变量掌握这些并不困难你只要花一周时间挨个地学习联系一下很快就能掌握。
熟悉了常用操作系统的 API 之后你就可以自由地写出自己想要的程序了这个时候处于初级的通透状态例如你可以随手写出这样一个功能的程序 主线程创建一个新的工作线程等待工作线程获取系统时间后写入文件主线程从文件中读取时间内容显示出来。 这个例子中我们用到了创建线程的 API、线程等待与通知 API、获取系统时间的 API、显示到控制台的 API
在 Windows 上我们用到 CreateThread WaitForSingelObject GetSystemTime CreateEvent/SetEvent std::cout
在 Linux 上我们可以使用 pthread_create pthread_mutex_init/pthread_cond_init/pthread_cond_destroy/pthread_cond_wait time std::cout
这么一分析是不是觉得一下子清晰起来因为 C/C 这么编程语言不是功能完备性的如果 C/C 的 C 库或者 stl 本身没有提供这些功能你不得不使用操作系统的 API。 如果你掌握到这个阶段恭喜你你已经可以去胜任中小企业的 C/C 开发了。所以我推荐的这条路线如果你认真学习保底能让你找到一份小公司的 C 开发工作的。 5.2 学习操作系统 API 也包括学习多线程编程
这块与上文有一点重叠我们再次说一下。多线程知识你需要掌握理解线程与进程的关系、熟练使用常用的线程同步技术。推荐的一种学习方式就是找一个开源项目使用调试器跑起来然后看看这个进程有多少线程每个线程在何时被创建每个线程的作用是什么线程之间如何通信的。这也是上文建议你熟练掌握调试器的原因。
推荐看游双的《Linux 高性能服务器编程》多线程相关章节了解操作系统提供的常用多线程同步原语。 5.3 学习操作系统 API 也包括熟悉操作系统原理
操作系统原理无论是面试还是自我提高的五大基础之一我的建议学习操作系统知识时不一定要看完所有操作系统书籍但一定将一些基础概念如进程、线程、内存模式等看懂、理清。Tanenbaum.A.S《现代操作系统》是一本讲解操作系统理论不错的书作者 Tanenbaum.A.S 是 Linux 内核创始人 Linus Torvalds 的老师。
你如果还有时间强烈推荐看看俞甲子的《程序员的自我修养:链接、装载与库》。这本书同时涉及到了 Windows 和 Linux 两个操作系统平台用各种辅助工具剖析了程序从源码到二进制文件再到装载到进程地址空间里面的各个细节甚至连进程地址空间中的堆结构、栈结构也分析得清清楚楚同时也分析了 C RuntimeCRT、glibc 这样的操作系统接口库的原理和执行逻辑是一本实实在在帮你实战操作系统原理的好书。
当然学有余力的同学可以进一步了解一些关于操作系统的模式如实模式、保护模式、系统的启动与初始化、虚拟内存与物理内存、内存分表分页机制、进程与线程的调度算法等知识。
想要做好开发必须要学习操作系统的原理。学习操作系统原理不一定要看完所有操作系统书籍但一定将一些基础概念如进程、线程、内存模式等看懂、理清否则稍微复杂点的 C 程序还是会无从下手这里推荐Tanenbaum.A.S《现代操作系统》。
从一个 .cpp 文件到可执行程序经历了哪些阶段每个阶段做了什么事可执行文件里面有什么可执行文件如何被装载到进程地址空间变成可执行的进程的这些是 C 开发者要搞清楚的。强烈推荐看看俞甲子的《程序员的自我修养:链接、装载与库》这本书同时涉及到了 Windows 和 Linux 两个操作系统平台用各种辅助工具剖析了程序从源码到二进制文件再到装载到进程地址空间里面的各个细节甚至连进程地址空间中的堆结构、栈结构也分析得清清楚楚同时也分析了 C RuntimeCRT、glibc 这样的操作系统接口库的原理和执行逻辑是一本实实在在帮你实战操作系统原理的好书。搞 C 开发不看这本书学尽 C 也枉然。
6. 第六阶段 学习汇编
如果你熟练掌握汇编你就比其他人多很多优势你会能透彻地知道你写的每一行 C/C 代码背后的机器指令的效率。无论是做安全工程还是自己技术提升上都是非常不错的。这里推荐一本王爽老师的《汇编语言(第 3 版)》这本书不厚语言通俗易懂你也不用刻意去记忆基本上当小说书看一下就能很快看完了。汇编实战类图书还有另外一本《老码识途从机器码到框架的系统观逆向修炼之路》。我个人是非常喜欢这本书的。当年读这本书的时候真的有一种“笑看妻子愁何在漫卷诗书喜欲狂”的感觉。
一个不懂汇编的 C 程序不是真的 C 程序员如果你不懂汇编你很难搞得懂 C 的函数调用方式很难搞得懂栈的结构很难搞的清楚写 switch-case 语句时怎样布局 case 分支效率才高等等。
如果你熟练掌握汇编你就比其他人多很多优势你会能透彻地知道你写的每一行 C/C 代码背后的机器指令的效率。无论是做安全工程还是自己技术提升上都是非常不错的。这里推荐一本王爽老师的《汇编语言(第 3 版)》这本书不厚语言通俗易懂你也不用刻意去记忆基本上当小说书看一下就能很快看完了。
汇编实战类图书还有另外一本《老码识途从机器码到框架的系统观逆向修炼之路》。我个人是非常喜欢这本书的。我上学的时候发现这本书欣喜之致连着我在宿舍读了两个星期将这本书读完。
这本书豆瓣评分 9.1 分 7. 第七阶段 学习计算机网络和 socket 编程
学习计算机网络要从以下三个方面学习
7.1 学习计算机网络理论知识
计算机网络编程你需要掌握基础的如三次握手和四次挥手的过程以及各个状态值我建议使用 tcpdump 命令实际抓下包就一目了然了然后就是网络分层各层的用途重点熟悉下 TCP/IP 层相关的知识还有就是 TCP/UDP 的区别TCP 的滑动窗口机制、拥塞控制算法、TCP 的保序、重传、确认机制。
学习这些知识的时候一定不要死记硬背注重理解。我近来面试了一部分学历学校非常好的同学然而在问到这块的知识时却大失所望。例如有的同学只是单纯把三次握手背下来了我稍微变通一下他就不知道怎么回答了 如果连接一个目标主机不存在的 IP 地址握手过程是怎样的连接一个目标 IP 存在但是端口号不存在的主机又是怎样的握手过程呢 A 机器上的进程与 B 机器上的进程进行网络通信分别经历了哪些网络层。
7.2 学习 Socket 编程
Socket 编程你需要先掌握常用的 Socket API包括但不局限于 常用 Berkeley Sockets API 一览表
学习这些 Socket API 的时候不是让你单纯地记忆这些函数的参数而是掌握每一个函数的重难点。
例如 如何将一个 socket 设置成非阻塞模式 阻塞模式下send 和 recv 函数行为是什么样子的非阻塞模式下 send/recv 的返回值分别是什么 客户端发起连接时如何主动指定通过本地某个端口号去连接bind 函数如果端口号设置为 0 是什么行为 listen 函数的 backlog 参数用途是什么 如何实现异步的 connect 函数 accept 函数调用时三次握手是否已经完成 如何实现半关闭状态 nagle 算法的用途是什么 select 函数的第一个参数怎么设置select 函数的超时参数如果设置为 NULL 是什么行为
接着要重点学习下常用的网络模型 Windows 上常用的网络模型有 select、WSAEventSelect、WSAAsyncSelect、完成端口模型 Linux 上常用的网络模型 select、poll、epollepoll 需要重点关注的是水平模式和边缘模式。
当然也建议一定要理解不要死记硬背。C 的同学来面试的时候我会给他们准备如下面试题 epoll 边缘模式下某次读取了某个 socket 上的部分数据下次是否会出发读事件如果此时又来了一个字节的新数据是否会触发读事件 epoll 边缘模式建议尽量一次把数据读完怎样判断当前数据已经读完 epoll 边缘模式下对于写事件应该如何处理
接着还要熟悉 TCP 协议的流式特性如何解决粘包问题还要掌握常见的网络协议格式像 HTTP、FTP、POP3/SMTP/WebSocket协议的格式都建议熟练掌握。
以 HTTP 协议为例HTTP 协议包的格式是什么样的包头和包体如何分界的GET 与 POST 请求的数据分别放在 HTTP 包的什么位置如果放在包体中如何知道包体的数据有多长。
推荐视频
C/C网络编程最新筛选精读视频网络编程进阶必看tcp、udp、epoll、网络协议栈、websocket、dpdk、网络穿透、reactor...https://www.bilibili.com/video/BV1WG4y1g7H9/
7.3 学习常用网络命令
学习了常用的网络命令可以用来排查网络故障与定位问题反过来也可以加深对网络理论知识的理解建议掌握以下命令ifconfig、ping、telnet、netstat、lsof、nc、curl、tcpdump。
掌握了这些命令要做到学以致用例如现在某个服务器连接不上如何使用这些命令判断是自己网络的问题还是目标主机的问题开发了一个服务器程序手头上没有可用的客户端如何使用 nc 命令模拟一个或者反过来开发了一个客户端程序如果用 nc 模拟一个服务器端用于测试。
C 网络编程方面的实战书来我推荐韩国人尹圣雨写的这本《TCP/IP 网络编程》这本书也适合无任何 Socket API 编程经验的小白这本书涵盖从基础的 Socket API 到高级的 IO 网络模型有非常详细和生动的例子。 等你有了一定的 C 网络编程以后熟练使用常见 Socket API你可以看看游双的《Linux 高性能服务器编程》没错还是这本书这本书能让你写出完整的 C 网络项目来。
8. 第八阶段 学习数据库
如果你想系统地掌握数据库常用的知识点一定不要以网上各种散乱的文章为重点学习材料理由有二 网上的资料碎片化比较严重对于新人来说可能会造成盲人摸象的感觉无法形成成体系的技术认知 网上的很多数据库文章都是对诸如《MySQL技术内幕》《高性能 MYSQL》的二次理解和加工很多文章的内容对原有数据库知识理解不到位、甚至理解出错。
学习 MYSQL 数据库建议方法 找几本权威的数据库图书系统地学习一下当然可以选择你感兴趣的部分常用的数据库知识并不多 自己安装一个数据库进行操作、实践。
例如我在我的主机上安装了 MYSQL我就可以这么练习
Last login: Tue Jul 6 10:50:02 2021 from 106.26.160.131Welcome to Alibaba Cloud Elastic Compute Service ![rootmyaliyun ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3550
Server version: 5.5.60-MariaDB MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type help; or \h for help. Type \c to clear the current input statement.MariaDB [(none)] show database- ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near database at line 1
MariaDB [(none)] show databases;
--------------------
| Database |
--------------------
| information_schema |
| flamingo |
| mysql |
| performance_schema |
| teamtalk |
| test |
--------------------
6 rows in set (0.01 sec)MariaDB [(none)] use flamingo;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
MariaDB [flamingo] show tables;
---------------------
| Tables_in_flamingo |
---------------------
| t_chatmsg |
| t_user |
| t_user_relationship |
---------------------
3 rows in set (0.00 sec)MariaDB [flamingo] desc t_chatmsg;
---------------------------------------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
---------------------------------------------------------------------------------------
| f_create_time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| f_id | bigint(20) | NO | PRI | NULL | auto_increment |
| f_msgcontent | blob | NO | | NULL | |
| f_remark | varchar(64) | YES | | NULL | |
| f_senderid | bigint(20) | NO | | NULL | |
| f_targetid | bigint(20) | NO | | NULL | |
---------------------------------------------------------------------------------------
6 rows in set (0.00 sec)MariaDB [flamingo] select * from t_chatmsg limit 5;
Empty set (0.00 sec)MariaDB [flamingo]
数据库需要掌握的基础知识有
1熟悉基本 SQL 操作 包括增删改查insert、delete、update、select语句排序 order条件查询where 子语句限制查询结果数量LIMIT语句等
2稍微高级一点的 SQL 操作如 Group byinjoinleft join多表联合查询别名的使用select 子语句等
3索引的概念、索引的原理、索引的创建技巧
4数据库本身的操作建库建表数据的导入导出
5数据库用户权限控制权限机制
6MySQL的两种数据库引擎的区别
7SQL 优化技巧
以上属于对开发的基本的数据库知识要求你可以找一本相关入门级的数据库图书推荐 《MySQL技术内幕第5版》 高级开发除了以上要求还要熟悉高可用 MySQL、主从同步、读写分离、分表分库等技术这些技术的细节一定要清楚它们是你成为技术专家或者高级架构的必备知识。我们在实际面试时在讨论高可用服务服务方案时很多面试者也会和我们讨论到这些技术但是不少面试者只知道这些技术的大致思想细节往往说不清楚细节不会就意味着你的高可用方案无法落地企业需要可以落地的方案。
这些技术我首推《高性能 MySQL》这本书想成为高级开发者一定要通读的另外还有两本非常好的图书也推荐一下一本是《MySQL 排错指南》读完这本书以后你会对整个“数据库世界”充满了清晰的认识另外一本是《数据库索引设计与优化》这本书读起来非常舒服尤其是对于喜欢算法和数据结构的同学来说。 《高性能 MySQL》 《MySQL 排错指南》 《数据库索引设计与优化》 推荐视频
关于中间件mysql、redis、nginx你必须知道的技术_哔哩哔https://www.bilibili.com/video/BV1oq4y1t77N/
9 学习代码规范与培养良好代码风格
在你学习的过程中请一定要认真对待自己每一个变量名、函数名养成良好的代码习惯。我学生时代花了大量时间去学习一些教人写出优美风格的代码书籍、资料、源码在你还是个小白的时候要认真精读一些优秀代码不仅要学习它们的整体设计思路还要学习它们的代码风格和细节。这里推荐《程序设计实践》《代码整洁之道》这两本书特别是《程序设计实践》强烈建议学生朋友看一下能大幅度地提高你实际编码的技巧和编码风格。
10. 第十阶段 学习更多
经过前面九个阶段的学习你已经是一个高级开发了如果想进一步学习需要将业务和技术结合起来从业务的角度思考业务。
用一张图来看下 上图中染色的部分是校招的基本要求除了虚线框中的部分可以在较短的几年内掌握剩下像编译原理、设计模式、数据库等需要长期的专研和总结从熟练工到融汇贯通阶段已经与具体编程语言无关一般要掌握
10.1 学习高可用与容灾容错
服务都是人开发的既然是人开发的必然有宕机的可能性当然宕机的原因可能是程序自身 bug也可能是物理故障断电、磁盘损坏等等作为开发人员针对不同的业务场景我们没法做到服务 100% 可能至少让其尽量可用八仙过海各显神通。在宕机时如何尽量不影响业务、如何尽量快速恢复、如何保证数据和业务状态不丢失等等。这当然有一定的固定套路例如主从、主备当然固定的套路不是万能的尤其是对于一些有状态要求的服务这需要不断的磨练与自我总结。
10.2 学习分布式
分布式你需要掌握基本的分布式理论和原理常见的分布式算法然后是分布式系统设计的初衷和技巧在实际并发量高的业务中如何利用分布式解决高可用和访问效率问题。
10.3 学习 RPC
很多人都听说过这个词在面试时也可以说出来个大概但是当问到 RPC 技术解决的核心问题是什么就说不清楚了。当然学习 RPC我们还要考虑协议的设计协议格式、序列化与反序列化、兼容性问题、网络连接的重试、接口 stub 的设计等等。
10.4 学习消息中间件
目前除了自己公司自研的消息中间件主流的有 Kafka、RabbitMQ、RocketMQ如果想学习建议选择其中一种深入学习一下要掌握消息中间件的用途、选举策略、保序策略、重试策略、高可用策略等。
10.5 学习缓存
缓存的设计是一个很大的方面个人觉得与其说这是一种设计思想而非单纯的某个缓存服务。当然老生常谈的有缓存雪崩、缓存穿透、缓存击穿的解决思路。当然以缓存为代表的服务是 RedisRedis 的常用数据类型、适用场景、持久化、主从复制、哨兵与集群这些建议你掌握如果你从来没机会吃猪肉那就看看猪跑吧一些技术书籍和项目案例都有 Redis 的用途说明。
10.6 学习数据库高级知识
包括 SQL 调优、数据库调优、分表分库、主从同步等等。这个在前面介绍过了不再重复。
11. 总结
最后想说的是成为技术高手不是一朝一夕的事情既要相关工作经验的积累也需要个人勤奋的努力和不断总结才能达到融会贯通阶段。当然兴趣是最好的老师。