『字节青训营-3rd』青训营 x 掘金技术社区专场班会
如何在掘金高效学习 一个帮助开发者成长的社区 学习的价值:编程技术处于高速更新换代中 分享的价值:在分享中成长,鼓励开源精神 掘金社区要解决的问题: 定位:面向全球中文开发者提供优质技术内容 文化:坚信善于分享和学习优质内容的开发者会成长得越来越好 规则:激励持续输出原创优质内容的用户 高效获取内容 多平台 标签体系 优秀技术团队/创作者 干货直播 学习课程 高效笔记 使用掘金插件写笔记 持续写文章 休闲交流 JYM,欢迎来沸点摸鱼 各种活动 从 Go 菜鸟到 Go 专家 技术深入 成为专家的路线 学习基础语法与使用 学习问题与解决方法 学习原理和底层设计 必须掌握的工具 各种 IDE GitHub Go 的调试器 DELVE 性能分析工具 邻域拓展 一手的消息源 理性看待技术文章 社区参与 了解开源技术组织和社区 工业界广为接受的开源技术组织 Apache CNCF etc Go 语言本身的技术社区 golang-nuts golang-dev 为什么要参与开源社区 哪些社区项目值得参与 我喜欢的 星星多的 名气大的 我想去的公司的项目 思考总结 为什么要总结 科学的总结方法 卡片笔记 个人代码库 体系化总结 多做技术方面的输出 将笔记内容组织为文章输出 打造个人品牌 著书立说
『字节青训营-3rd』L8:打开抖音互联网会发生什么
刷抖音网络是怎么交互的 网络接入 互联网 路由 路由发包原理 同网段:配置网段即可默认添加静态路由。获取对端MAC直接发包 跨网段:配置网关路由。获取网关MAC地址发包 动态路由:BGP/OSPF等,路由表在动态变化 路由是网状的,不一定是对称的 路由传递时,始末 IP 是不变的, 始末 MAC 地址是一直改变的 ARP协议 ARP广播/应答:协议原理 免费ARP:主动广播告知MAC地址 ARP代理:虚拟网络/伪造MAC地址 ARP 的本质是查找下一跳的 MAC ,不是请求目标地址 IP 协议 Q:为什么不能用 MAC 代替 IP 地址? MAC 协议是在第二层的,但是第二层还有很多其他的协议,为了兼容其他二层的协议就又封装了一层 IP Q:IPv4不够用,除了IPv6还有什么方法 使用 NAT NAT NAT 是不是就改了改 IP 地址呢? NAT 同时改了 IP + 端口 网络传输 数据包 本质上是一段内存,里面存储的内存是有序的,一般是按照TCP/IP的多层协议去封装。拆包/封包都是按照协议去写内存/读内存。 数据包发送 先请求 DNS 递归迭代解析 DNS 的传输协议 UDP 协议简单 想发什么包,就分配一个 UDP 的头,把 payload 里面塞数据发出去就好 需要考虑可靠性的场景使用复杂 每次发多少?怎么避免分片? 怎么知道没丢包? 怎么权衡传输效率和质量? TCP 三次握手 什么是 TCP 连接? 拔了网线,连接会断吗?(靠心跳包探活) 你真的了解 TCP 三次握手吗? 三次握手:确认传输的序列号/MSS...
『离散数学』集合论:二元关系
本篇源于 B 站的【离散数学】3.5h让你离散数学不挂科,感谢老师! 概念 补充: LAL_{A}LA 小于等于关系 DAD_{A}DA 整除关系 R⊆R_{\subseteq}R⊆ 包含关系 补充:关系的运算 domRdomRdomR:定义域 ranRranRranR:值域 fldRfldRfldR:域,等于定义域并上值域 R−1R^{-1}R−1:R 的逆 F∘GF\circ GF∘G:复合关系 例:设 F={<3,3>,<6,2>},G={<2,3>}F = \{<3,3>,<6,2>\},G = \{<2,3>\}F={<3,3>,<6,2>},G={<2,3>} F−1={<3,3>,<2,6>}F^{-1} = \{<3,3>,<2,6>\}F−1={<3,3>,<2,6>} F∘G=<6,3>F\circ G = {<6,3>}F∘G=<6,3>(6->2->3) R↾AR↾AR↾A:R 在 A 上的限制 R 中满足第一个元素,都是来源于 A 集合的有序对 R[A]R[A]R[A]:A 在 R 上的像 R 中满足第一个元素,都是来源于 A 集合的有序对的第二个元素 例:设 R={<1,2>,<1,3>,<2,2>,<2,4>,<...
『离散数学』集合论:集合代数
本篇源于 B 站的【离散数学】3.5h让你离散数学不挂科,感谢老师! 集合的基本运算 集合相对(包含)的证明 集合运算的重要恒等式 包含排斥原理 (集合上画一根横线是补集的意思)
『字节青训营-3rd』L7:从需求到上线全流程
第七节:从需求到上线全流程 这一节的内容是讲作为一个大企的后端人,平时的工作是怎样进行的 印象很深的地方就是按照跑火车的节奏每周先拿开会需求,开发,上线测试,再开会、开发…还是很有意思的 正经的笔记真的没时间做,下面就备份一手学习资料吧(其实也基本能囊括上课讲的内容了) 概述 课程背景: 作为后端研发同学,在一个完整的需求交付周期内究竟要做哪些事情?在各个阶段需要跟不同的角色和平台打交道。介绍常见的研发模式和迭代流程,以实际的例子让同学感受一下后端研发的日常,能够提升大家在团队中协作的能力。 课程目标: 提升对流程的认知 熟悉在公司大团队中协作开发 对职业生涯的日常有更直观的理解 课前 (必须) 词汇表 分类 英文 中文 解释 研发模式 Waterfall Model 瀑布模型 瀑布模型(Waterfall Model)最早强调软件或系统开发应有完整之周期,且必须完整的经历周期之每一开发阶段,并系统化的考量分析与设计的技术、时间与资源之投入等。由于该模式强调系统开发过程需有完整的规划、分析、设计、测试及文件等管理与控制,因此能有效的确保系统质量,它已经成为软体业界大多数软件开发的最初标准 The Scaled Agile Framework(SAFe) 规模化敏捷框架 Scrum Scrum 在软件工程中,Scrum是以经验过程为依据,采用迭代、增量的方法来提高产品开发的可预见性并控制风险的理论,Scrum不是一种过程,也不是一项构建产品的技术,而是一个框架,在Scrum框架中可以应用各种过程和技术,Scrum的作用是让开发实践方法的相对功...
『字节青训营-3rd』L6:实战项目 - Go 语言笔记服务
第六节:实战项目 - Go 语言笔记服务 讲得内容就是大概地过了一下这个项目,因为内容太多就把学习手册贴这了 这个项目用到了很多新东西,例如RPC 框架, kitex 和链路追踪 我基本上是走马观花地看了一下,真要掌握还得自己写一遍 一、课程背景与目标 课程背景 在大家已经学完前 5节 Go 原理与实践课程的基础上,通过项目实战帮助大家把前面学过的知识应用起来 课程目标 将前面所学的知识应用到项目中 熟悉项目的代码,可以将项目正常运行 熟悉 Kitex/Gorm 的使用 二、课前了解 安装 Docker/Postman/Git 安装 Minikube 或 Docker Desktop 安装教程 可以使用 Minikube 或者使用 Docker Desktop 启动 Docker 安装 Postman 安装 Git 安装教程 Kitex 初体验 通过阅读 www.cloudwego.io/zh/docs/kit… 尝试运行 Kitex 的示例代码 kitex 暂时没有针对 Windows 做支持,如果本地开发环境是 Windows 建议使用 WSL2 Gorm 初体验 通过阅读 gorm.cn/docs/#Insta… 尝试运行 Gorm 的示例代码 了解 Etcd和Opentracing 了解 etcd 是什么以及 opentracing 是什么 三、项目介绍 项目简介 EasyNote 提供了一套比较完整的笔记后端API服务. 项目地址 github.com/cloudwego/k… 推荐版本 Golang >= ...
『算法拾遗』问题规模与时间复杂度
本篇节选于《算法竞赛:从入门到进阶》第二章:算法复杂度 竞赛题目的限制时间一般是 1s ,目前普通计算机的计算速度是每秒千万次,故可推导出以下结论 算法的时间复杂度 能解决的最大问题规模 O(n!)O(n!)O(n!) 111111 O(2n)O(2^{n})O(2n) 252525 O(n2)O(n^{2})O(n2) 500050005000 O(nlog2n)O(n\log _{2}n)O(nlog2n) 10610^{6}106 O(n)O(n)O(n) 10710^{7}107 O(log2n)O(\log _{2}n)O(log2n) > 10810^{8}108
『字节青训营-3rd』L5:设计模式之 Database/SQL 与 GORM 实践
【Go 语言原理与实践学习资料(下)】第三届字节跳动青训营 - 后端专场 本节课讲得东西很多,然后我太菜很多东西都听不懂,所以还是建议去看原视频吧 ☺️ 理解 Database/SQL 目标:通过统一的接口去操作不一样的数据库 Database/SQL 是一个在应用程序和数据库的中间层,暴露给应用的接口是相同的,只需更改连接接口和操作接口就可以连接不同的数据库 GORM 使用简介 设计简洁、功能强大、自由扩展的全功能 ORM GORM 设计原理 GORM 最佳实践
『字节青训营-3rd』L4:高性能 Go 语言发行版优化与落地实践
相关链接【Go 语言原理与实践学习资料(下)】第三届字节跳动青训营 - 后端专场 自动内存管理 降低开发负担、解决安全性问题 三个任务: 为对象分配空间 找到存活对象 回收死亡对象的内存空间 相关概念 名词 Mutator: 业务线程,分配新对象,修改对象指向关系(用户启动的线程) Collector: GC 线程,找到存活对象,回收死亡对象的内存空间 Serial GC: 只有一个 collector(暂停所有 Mutator ,回收后再继续运行) Parallel GC: 并行 GC,支持多个 collectors 同时回收的 GC 算法(暂停时多个有多个回收线程) Concurrent GC: 并发 GC,支持 mutator(s) 和 collector(s) 同时执行的 GC 算法 Collectors 必须感知对象指向关系的改变! 评价 GC 算法 安全(不能回收存活的对象) 吞吐率(花在 GC 上的时间) 暂停时间 内存开销 算法1: 追踪垃圾回收 对象被回收的条件:指针指向关系不可达的对象 从根对象出发,遍历并标记所有可达的对象,最后清理剩下的对象 清理的策略: Copying GC :把存活的对象分配到其他空间 Mark-sweep GC: 将死亡对象的内存标记为可分配 Mark-compact GC: 原地移动整理存活对象 分代 GC (Generational GC) 基于事实:很多对象分配出来后很快就不再使用了 每个对象都有年龄:经过 GC 的次数 然后把老的和年轻的分开,制定不同的 GC 策略 年轻代...
『字节青训营-3rd』L3:高质量编程与性能调优实战
相关链接配套实例代码:https://github.com/wolfogre/go-pprof-practice 【Go 语言原理与实践学习资料(上)】第三届字节跳动青训营 - 后端专场 前情提要: 高质量编程 高质量编程简介 什么是高质量:编写的代码能够达到正确可靠、简洁清晰的目标 各种边界条件是否考虑完备 异常情况处理,稳定性保证 易读易维护 编程原则: 简单性 可读性 团队生产力 编码规范 如何编写高质量 Go 代码 代码格式 注释 命名规范 控制流程 错误和异常处理 代码格式 推荐使用 gofmt 等工具自动格式化代码 gofmt 官方的自动格式化工具 goimports 能自动控制库的引用 注释 注释应该做的 解释代码作用(适合注释公共符号) 解释代码是如何做的(适合注释实现过程) 解释代码实现的原因(适合解释代码的外部因素,提供额外上下文) 解释代码什么情况会出错(适合解释代码的限制条件) 公共符号始终要注释 包中声明的每个公共的符号:变量、常量、函数以及结构都需要添加注释 任何既不明显也不简短的公共功能必须予以注释 无论长度或复杂程度如何,对库中的任何函数必须进行注释 有一个例外,不需要注释实现接口的方法 小结 代码是最好的注释 注释应该提供代码未表达出的上下文信息 命名 variable 简洁胜于冗长 缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写 例如使用 ServeHTTP 而不是 ServeHttp 使用 XMLHTTPRequest 或者 xmlHTTPRequest ...
『Others』Windows 如何备份驱动文件
今天太忙了,随便水一篇博客 使用如下命令即可(别忘了管理员) 1dism /online /export-driver /destination:[备份路径] 例: 1dism /online /export-driver /destination:D:\tmp
『字节青训营-3rd』L2:Go 语言上手 - 工程实践
前情提要: 没错,这是昨天上午的课,但是昨天太忙了就一直拖到现在来写了 (其实今天也很忙) 配套实例代码:https://github.com/Moonlight-Zhao/go-project-example/tree/V0 这堂课主要学习企业实际项目开发中所涉及到的一系列知识点 语言进阶 - 协程 并发 VS 并行 并发:多线程程序在一个核的 CPU 上运行 并行:多线程程序在多个核的 CPU 上运行 (Go 可以重复发挥多核优势,高效运行) Goroutine 线程:内核态,线程跑多个协程,栈 MB 级别 协程:用户态,轻量级线程,栈 KB 级别 一个简单的线程例子,快速打印 hello goroutine 0 ~ 4 : 12345678910func hello(i int) { println("hello goroutine :" + fmt.Sprint(i))}func HelloGoRoutine() { for i := 0; i < 5; i++ { go hello(i) // 使用 go 关键字开启协程 } time.Sleep(time.Second * 1) // 保证子协程执行完毕之前,主函数不退出,后面会有更好的方式} 可以看到不是按照顺序输出的,所以其实是并行输出的 协程间通信:CSP(Communicating Sequential Processes) Go 提倡使用通道来实现协程间通信(通过通信共享内存) 当然,...
『赛后感想』2022 计算机学院 Debug 杯程序设计大赛
相关链接随着阵阵花香,Debug杯来啦||计算机学院Debug杯程序设计大赛如期而至 呼~ 烧了我一下午脑细胞的比赛终于结束了 真的是累死了,比完之后眼睛痛,头也晕,腰也酸,关键是好好的睡午觉的时候要去比赛,简直要了我的命 来,来听我讲讲我今天的心路历程 中午出发前往赛场 时间来到 1:30 ,进入比赛,开始做题 T1 首先是第一题 一看就是纸老虎,前面大段大段的都是唬你的废话,直接找因子然后套公式就行了 因为找一个数的因子应该比较简单,所以我打算交给 Copliot 做,注释一写出来,代码直接就生成了,简直不要太爽 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556#include <bits/stdc++.h>#define ll long longusing namespace std;//int g(ll x){ if (x == 1) return 1; else return 0;}int main(){ // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); //求一个数的所有因子 int m; cin >&g...
『字节青训营-3rd』L1:Go 语言上手 - 基础语言
前情提要: 配套实例代码: https://github.com/wangkechun/go-by-example 简介 什么是 Go 语言 高性能、高并发 语法简单、学习曲线平缓 丰富的标准库 完善的工具链 静态编译 快速编译 跨平台 垃圾回收 哪些公司在使用 Go 语言 那必是很多呀~(略) 字节跳动为什么全面拥抱 Go 语言 Python 性能不好 C++ 不适合在线 Web 业务 早期团队非 Java 背景 部署简单,学习成本低 内部 RPC 和 HTTP 框架的推广 入门 开发环境 略 基础语法 这块就是查缺补漏了,仅挑选我认为有必要再温习的部分 [16] 字符串格式化 首先,最常用的是 Println() ,它的作用是打印变量并换行 Go 中也是有 Printf() 的,与 C 中的相比更加智能,你可以用 %v 来自动判断类型,而无需纠结整型用 %d ,实行用 %f 之类的 使用 %+v 可以打印详细信息,而 %#v 则可以更加详细 保留位数的浮点数与 C 中的做法相同 12345678910111213141516171819202122232425package mainimport "fmt"type point struct { x, y int}func main() { s := "hello" n := 123 p := point{1, 2} fmt.Println(s, n) // hello 123 fmt.Println(p) /...
『C++』标准模板库(STL)之算法篇
STL 里除了上一篇中的那些好用的容器之外,还提供了大量基于迭代器的非成员模板函数,能大量简化我们的编程工作 这些模板函数都在 algorithm 头文件里(翻译为算法) 所以我们需要先引入这个头文件 #include <algorithm> ,同时不要忘记指定命名空间,例如 using namespace std; max(x,y) 、 min(x,y) 、 abs(x) 和 swap(x,y) 这四个一起讲 如你所见,这几个分别用来求最大值,最小值,绝对值,还有交换两个变量 对于两个求最值的 x 和 y 不仅可以是整型,还可以是实型 但是 abs() 只能用于整型,实型要用 fabs() 而对于 swap(),基本上所有地方都能用上 不过在比赛的话还是建议自己写函数覆盖掉,STL 里的没自己写的块 当然,你可能说使用宏不会更快吗? 12#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b)) 我只能说尽量不要用宏,绝对值用用还行,最大值和最小值千万别用(别问我是怎么知道的) reverse(s,t) reverse(s,t) 可以将数组指针在 s~t 之间的元素,或容器的迭代器在 s~t 范围内的所有元素进行反转(老规矩,左闭右开) 12345678910int a[10] = {10, 11, 12, 13, 14, 15};reverse(a, a + 4); //将 a[0] 到 a[3] 这4个元素反转for (int i = 0; i...
『C++』标准模板库(STL)之容器篇
鄙人认为 C++ 相比 C 最大的更新就是内置的 STL 了,里面封装了一堆好用的容器,而不用关心其内部实现的原理和具体代码,十分方便快捷,除了容器外还有一堆算法,这个在下一篇会讲 本文仅记录我认为比较常用的容器,例如 pair 这种比较鸡肋的就不记录了 注意:使用 STL 必须要定义命名空间,例如using namespace std; Vector vector 直译为“向量”,但是一般当成可变长的数组用 众所周知,C/C++ 中的数组一旦定义就无法改变长度,而 vector 就可以解决这个问题,但是代价也是明显的:运行速度更慢 记得使用 #include <vector> 来引入头文件 定义 1vector<typename> name; 以上定义相当于定义了一个一维数组 name[size] ,但是 size 不确定,其长度可以根据需要而变化。其中 typename 可以是任何基本类型,例如 int、 double 、char 、结构体等,也可以套娃 STL 标准容器,例如 vector 、 queue 等 访问 使用下标 这就像是访问传统的数组一样,非常方便,例: 12vector<int> v;printf("%d ",v[index]); 注意: 不能越界,不然会报错 这种方法仅限于访问,不能通过它来修改 使用迭代器 可以将迭代器(iterator)理解为一种类似指针的变量。其定义为:vector<typename>::iterator it; ,例: 12vector<in...