后端学习指导

简单记录一下,以后再充实内容,资料再多也只是占网盘/硬盘空间,关键还是看你能否坚持学下去,能否顺利消化吸收新的知识。

后端开发语言很多,原则上,并不推荐投入太多精力在学习各种不同的语言上,建议先精通一门,触类旁通,要注意提高使用算法和设计模式的能力。

基础学习

刷题

也有其它平台可以刷题,不过正常情况下,能把这两个平台上的题刷好已经需要相当时间了。

关于数据结构和算法

详细内容见 笔记

消息订阅系统

发布与订阅消息系统的概念

数据(消息)的发送者(发布者)不会直接把消息发送给接收者,这是发布与订阅消息系统的一个特点。

发布者以某种方式对消息进行分类,接收者(订阅者)订阅它们,比便接收特定类型的消息。

发布与订阅系统一般会有一个broker,即发布消息的中心点。

消息(Message)

定义:在应用间传送的数据。(简单的如文本字符串、json等,复杂的如内嵌对象。)

消息队列中间件(Message Queue Middleware)

简称MQ,是指 利用高效可靠的消息传递机制 进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。

通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。

2种传递模式

消息队列中间件,也称为消息队列消息中间件。一般有2种传递模式点对点(P2P, Point-to-Point)模式发布/订阅(Pub/Sub)模式

常用开源消息中间件

搜索引擎相关

主要是关于Sphinx、ElasticSearch相关的笔记,详见此处

负载均衡算法

(待补充)

分布式系统常见负载均衡算法

Nginx负载均衡算法

RPC

RPC: Remote Procedure Call,即远程过程调用。

详见此处

Feed

  • feed是将用户主动订阅的若干消息源组合在一起形成内容聚合器,帮助用户持续地获取最新的订阅源内容。
  • feed流即持续更新并呈现给用户内容的信息流

面试准备

一般公司面试时对知识点的广度和深度都有一定要求,虽然完全要掌握会花费大量时间,但是面试毕竟也是在有限时间内,且面试中高频被问到的知识点也是在有限范围内,故可以参考二八法则,集中利用20%的知识点去掌握好80%的知识。

阅读摘录

  • 成为优秀程序员的必要条件之一:可以根据应用场景选择最合适的算法。

其它

常见web后端组合

php + laravel/thinkphp

java + spring boot

python + django/flask

go + gin/beego

ruby on rails

新语言十步法

(by PegasusWang)

  • 1.安装并且搭建开发环境。
  • 2.基础类型和符合类型。基础类型,符合类型。
  • 3.控制流语句。判断、循环、选择。
  • 4.函数。定义方式,传值和返回值。
  • 5.面向对象。数据和方法,组合and继承。
  • 6.内置库(文件、网络、时间、日志等)。
  • 7.找一个广泛使用的第三方库开始写(抄)项目。
  • 8.边写边查,常用代码片段总结成文档。比如 golang 里边各种转换。
  • 9.第三方库快速编写 demo。
  • 10.最佳实践:遇到的坑;代码分层;单元测试;静态检查。

常用术语Term

  • 序列化 Serialization:对象 -> 字节序列,是将对象的状态信息转换为可以存储或传输的形式的过程。对应Encode,编码的过程
  • 反序列化 Deserialization:字节序列 -> 对象, 是将可以存储或传输的形式转换为对象的状态信息的过程。对应Decode,解码的过程

定位后端开发的书籍推荐

ref: 定位后端开发的书籍推荐

1.算法和数据结构。基础,无论校招还是社招。

大厂社招又不太一样,因为除了要准备算法和数据结构以外,还得准备有项目经验、了解操作系统原理、熟悉网络通信、了解数据库、熟悉要求的各种开源框架和技术等等,实在太多了,即使再怎么准备也不一定能一举拿下。

2.操作系统

Tanenbaum.A.S 《现代操作系统》,当然,我的建议是这种书毕竟流于理论知识,也不一定要看完,但一定将一些基础概念,如进程线程内存模式等基础概念看懂理解。

如果还有时间强烈推荐看看俞甲子的 《程序员的自我修养:链接、装载与库》,这本书同时涉及到了 Windows 和 Linux 两个操作系统平台,用各种辅助工具剖析了程序从源码到二进制文件再到装载到进程地址空间里面的各个细节,甚至连进程地址空间中的堆结构、栈结构也分析得清清楚楚,同时也分析了 C Runtime(CRT)、glibc 这样的操作系统接口库的原理和执行逻辑,是一本实实在在难得的帮你实战操作系统原理的一本好书。

“CPU体系结构、汇编、C语言(包括C++)和操作系统,永远都是编程大师们的护身法宝,就如同少林寺的《易筋经》,是最为上乘的武功;学会了《易筋经》,你将无所不能,任你创造武功;学会了编程“易筋经”,大师们可以任意开发操作系统、编译器,甚至是开发一种新的程序设计语言!“

3.一门编程语言

你只有熟练使用一门编程语言,你才能将你的想法变成现实。

首推 C/C++ - 《C 语言程序设计:现代方法》。 - 如果你想掌握好 C++,《深度探索 C++ 对象模型》是一定要看的

4.计算机网络

  • 《计算机网络:自顶向下方法》 你一定要看懂而不是看完。比如三次握手和四次挥手的细节,你一定要很清楚。
  • 韩国人尹圣雨写的这本《TCP/IP 网络编程》,初级水平,强烈建议看看这本书。

5.Linux系统编程 - Robert Love 的《Linux 系统编程》、《Linux 内核设计与实现》

强调一下,如果你是快毕业的学生,面临着找工作的压力,应该以算法和数据结构为主。如果你是大一大二或研一这个阶段的学生,我上面推荐的书,你还是可以考虑好好咀嚼一下,标准是看懂而不是看完。

6.汇编

  • 王爽老师的《汇编语言(第 3 版)》(有第4版了)
  • 《老码识途:从机器码到框架的系统观逆向修炼之路》

Debugging

Debugging推荐书籍: 1.软件调试修炼之道 2.Effective Debugging: 软件和系统调试的66个有效方法

常见错误类型:

语法错误、运行时错误、逻辑错误。

代码调试流程:

复现 -> 定位 -> 修复 -> 验证 ==> 复盘(记录下犯过的错误并归类,加入没通过的单元测试用例)

定位问题的方法:

  • 看日志,加关键日志(如:ELK/Sentry)
  • 命令行断点调试 (如:gdb或ipdb)
  • IDE调试
  • 小黄鸭调试(审查:请别人帮忙审查代码或自己详细地向小黄鸭解释每行代码)

常用实践型学习方式

学习基本知识点 -> 明确需求 -> 动手写代码 -> 遇到难题 -> 通过百度/Google寻找解决方案 -> 不断的测试实践发现Bug 
-> 验证解决思路 -> 寻找更好的实现方案(有精力最好代码实现并验证) -> 思考更深入的问题(很多人做不到这步)

关于发布的版本

  • RC=Release Candidate, 发布候选版,是最终版(RTM=Release To Manufacture)之前的最后一个版本。

广义上对测试有三个传统的称呼:alpha、beta、gamma,用来标识测试的阶段和范围。

alpha 是指内测,即CB,指开发团队内部测试的版本或者有限用户体验测试版本。

beta 是指公测,即针对所有用户公开的测试版本。

gamma (这个不常听见),beta测试后做过一些修改,成为正式发布的候选版本时叫做RC(Release Candidate)。

其他推荐

Jetbrains系列产品重置试用

2021.2.3之后的版本已失效

0x1. 如何安装

1). 插件市场安装:
在Settings/Preferences... -> Plugins 内手动添加第三方插件仓库地址:https://plugins.zhile.io
搜索:IDE Eval Reset插件进行安装。如果搜索不到请注意是否做好了上一步?网络是否通畅?
插件会提示安装成功。

2). 下载安装:
点击这个链接(v2.3.5)下载插件的zip包(macOS可能会自动解压,然后把zip包丢进回收站)
通常可以直接把zip包拖进IDE的窗口来进行插件的安装。如果无法拖动安装,你可以在Settings/Preferences... -> Plugins 里手动安装插件(Install Plugin From Disk...)
插件会提示安装成功。

0x2. 如何使用

一般来说,在IDE窗口切出去或切回来时(窗口失去/得到焦点)会触发事件,检测是否长时间(25天)没有重置,给通知让你选择。(初次安装因为无法获取上次重置时间,会直接给予提示)
也可以手动唤出插件的主界面:
如果IDE没有打开项目,在Welcome界面点击菜单:Get Help -> Eval Reset
如果IDE打开了项目,点击菜单:Help -> Eval Reset
唤出的插件主界面中包含了一些显示信息,2个按钮,1个勾选项:
按钮:Reload 用来刷新界面上的显示信息。
按钮:Reset 点击会询问是否重置试用信息并重启IDE。选择Yes则执行重置操作并重启IDE生效,选择No则什么也不做。(此为手动重置方式)
勾选项:Auto reset before per restart 如果勾选了,则自勾选后每次重启/退出IDE时会自动重置试用信息,你无需做额外的事情。(此为自动重置方式)
如果你的IDE已经过了试用打不开,可以运行这个临时重置脚本(注意选择对应系统版本),它可以让你暂时进入IDE进行上述操作。(登录试用版本不适用,见下文)

你的编程能力从什么时候开始突飞猛进?

转自知乎:口天师兄 的回答

百度多了

你就明白:它也许有用,但它封印了你精进计算机英语的机会。

Google多了

你就明白:各地大佬们的文章很Nice,但它们仅是你技术知识体系的精华补充。

开始读书了

你就明白:你以往东拼西凑几十篇烂文才明白的事,书上那几页纸都写着,而且详细的很。

接触到国外大社的书后

你就明白:国内那些21天宝典,7周速成,都是些什么玩意,误人子弟!

图灵牛逼,动物牛逼,Manning牛逼。

好书读多了

你就明白:技术是一环扣一环的,有牢固的技术知识体系,学啥都事半功倍。

多做业务

你就明白:所学的技术该用在哪。

多做用户量大的业务

你就明白:光会用技术,和用好技术是两码子事。

多找第三方开源

你就明白:原来工作摸鱼不是梦。

太随便用第三方

你就明白:某天需求一变,它兼顾不到,可以把你往死里坑,坑到你得去看源码。

第一次看完源码

你就明白:开始还是很讨厌的,等全盘搞明白了,发现“咦~有点意思”。

源码看多了

你就明白:自己的查克拉莫名的增多了。而且吐槽文档不全的习惯也渐渐少了,一个不服就跑去观摩别人的源码,顺便偷个师。

再往后,或许你的技术确实突飞猛进了,然而你却只会觉得编程本来就是这个样子的。

因为,但凡通过点滴付出,累积出来的结果,都是平淡无声的。