5

《后端从入门到熟悉-正式篇》

 2 years ago
source link: https://segmentfault.com/a/1190000040853910
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

嗨喽,大家好呀!我是简凡,一位游走于各互联网大厂间的新时代农民工。从本篇开始,我开始按照企业对于后端开发者的需求层级,将成长阶段拆分为入门、初级、中级、高级、史诗级,逐步深入的为大家介绍后端的学习内容,下面开始正题。

一、前期准备

首先说前期准备,承接序言中的观点,为了让每一轮的知识学习更加扎实,也为了学习的结果、Demo沉淀下来,用于以后的复习、回溯,我们要开始做以下事情:

  • 选择自己的云笔记,个人建议用语雀,上一篇做过分析。然后参考简凡一样建立自己后端的体系框架,未来逐步往里面增添内容
  • 准备好集成开发环境,建议直接用jetbrains,Java选用idea,Go选用Goland,https://www.jetbrains.com/
  • 我会给大家提供的Excel学习路线,并整理成WBS的格式,放在我的微信公众号"简凡丶"中供大家下载,公众号回复“学习路线”即可获取。大家可以按照自己的情况完善计划,然后每天进行打卡,用于监督学习进度,激励自己不断完善自己的知识体系。后面我会定期对路线图进行完善,补充内容,大家可以通过关注我的公众号,第一时间获得更新通知。
  • 学习思路:
    • 入门阶段建议用视频+文档的方式学习,视频可以帮助我们少走一些弯路,尽快建立认知。文档可以帮助形成完整的知识体系,并帮助我们快速整理笔记。高级阶段通过文档学习往往效率会更高,接收的知识也更加准确,且成体系。
    • 初级阶段要多敲代码,手敲代码时我们才会发现对一些知识点并未理解透彻,对所学的知识一定要做扎实。高级阶段要多读优秀的开源代码,从中学习借鉴好的代码设计,去粗取精,最终形成自己的代码风格。

二、入门阶段:掌握一门语言

2.1 编程语言

其实做软件开发有时候就和写一篇说明文一样,将一件业务需求描述清楚,程序就可以按照预想的运行起来了。所以我们先要掌握一门语言,用于和计算机打交道,告诉它我们要做些什么。

为了和操作系统打交道,我们先要学习Java、Golang、Python、C++等后端语言。这里简单说一下编程语言的选择,现在的中、小型公司多以Java为主,因为Java的生态更完善,说白了就是应用框架更丰富,开箱即用,各种业务需求场景都有比较成熟的解决方案,社区也比较活跃,甚至到了内卷的状态🐶。然后就是Golang,目前生态还不够完善,开源项目不够丰富,但解决大多数的需求还是没问题的。现在大厂都在拥抱云原生,而且大厂自己也有一定的自研能力,所以有些转向了Golang。另外,Golang语法相对Java较为简单,学习成本较低,并且天然支持并发编程。最后说下Python,现在比较常见的应用领域是机器学习、数据分析等,但作为后端语言在性能方面无优势,而且是弱类型语言,不利于建立自己的代码规范,不太建议新手将其作为主要的后端语言来用。

言归正传,下面分别列举了Java、Golang的语言入门内容:

img

2.2 数据库

有时我们需要将数据存储起来,就要用到数据库,为了与数据库打交道,我们需要学习:

img

2.3 前端

为了后续与前端页面打交道,我们需要开始掌握前端基础:

img

2.4 研发工具

为了更高效的开发程序,我们需要一个集成开发环境,这里为大家推荐idea全家桶,golang用goland:

img

至此,我们就算完成的常用语言的入门,但这还不足以让我们开发出一个Web项目,我们来继续看下一节。

三、初级阶段:Web开发初窥

3.1 网络、计算机系统基础

既然要开发一个web应用,我们就首先需要掌握一些网络基础知识,以便于了解数据是如何在网络上进行传输的。企业级的项目基本都是部署在Linux服务器上的,所以我们要开始学习linux知识和shell命令。
image.png

3.2 Web入门

我们选择的后端语言都有成熟的Web框架供我们使用,这样我们就可以很方便的与前端页面,与数据库打交道。对于Java我们要开始学习JavaWeb基础,学习Spring全家桶。对于Golang,现在比较主流的Web框架是beego或者是gin。此外,开发者们会把某些通用功能,开发成组件,通过SDK包的方式开源出来,所以我们要学习包管理工具,以便引用自己或他人的代码。Java中常用的是Maven和Gradle,Golang中官方提供了go module。

img

3.3 前端框架

此时我们可以开始学习一些前端框架,来帮助我们更好,更快速开发前端页面。这里只写了JQuery,因为上手比较容易,当然你也可以学习下VUE,本篇我将其放到了中级阶段里了。

img

img

至此,我们就可以开发一个小型单体Web应用了。中级阶段里我们会开始利用各种开源框架协助我们实现复杂的业务需求,然后学习如何接入微服务,将大型应用拆分为一个个单体服务,以便在企业级开发中更加快速的迭代需求。学习代码管理,并关注自己的代码规范。

四、中级阶段:应对复杂多变的业务需求

 中级阶段我们的目标就是成为一个合格的CRUD Boy,那我们要做哪些事情呢?

4.1 巩固基础

进入中级阶段,建议大家首先要做一遍基础的巩固,要将我们在入门和初级阶段沉淀的知识真正成为我们自己的。那该怎么做呢?很简单,通过阅读业界优秀书籍,官方文档,再次比对我们的笔记,并对其进行总结和完善。这时我们对前面知识的理解会更加深入,甚至上升一个层次。此时我们可以再学习一下Nginx、Netty网络框架,加深我们对网络通信的理解。Java的话还可以学习一下Java8。

img

我们还需要学习一些并发编程的知识,来提升我们程序的运行效率。

img

  • Golang

img

进一步学习一些编程语言是如何与计算机系统打交道的,以便于我们理解程序的运行机制,也为以后做性能调优打下基础

img

  • Golang:GPM、pprof

4.2 提升代码质量

为了避免流水账形式的代码,我们要开始学习设计模式和代码规范。让自己的代码变得优雅起来。学习下Mysql的底层知识和性能优化,让我们的sql也变得高效起来。另外,我们需要开始学习数据结构的知识,开始刷刷算法题了。

img

img

  • Golang

img

  • Mysql

img

  • 算法与数据结构

img

4.3 学习应用框架

为了解决大型应用开发中的种种需求,每种通用的业务场景都有写开源框架和中间件来支持我们方便快捷的解决需求。

img

img

对于前端,我们也可以学习下vue、Node.js、npm,协助我们更好、更方便的开发前端项目

img

4.4 代码管理

我们在这个阶段每天可能都会写很多的代码了,我们需要学习下代码管理工具,将我们的项目管理起来。

img

4.5 分布式系统

真正的企业级大型项目往往都是分布式部署,所以我们要开始学习各种分布式场景解决方案对应框架的使用。另外,企业为了更快的迭代、更好的组织大型应用分分向微服务进行转型,把单体项目拆分成了一个个微服务。所以这里也变成的很多企业对于后端开发者的必备需求之一了。

img

学习完第四章节,恭喜你变成了一个合格的CRUD boy了。

五、高级阶段:面向薪资编程

为了"薪资提升",咳咳,不,是为了技术的进阶。我们需要了解我们应用的框架的设计原理,实现细节,常见问题,技术选型等等,开始向高级研发工程师进阶。另外,还需要多多阅读开源项目,了解其项目结构,实现细节等,俗话说“它山之石可以攻玉”。

5.1 框架进阶

这个阶段我们要做的有:

  • 拓展知识的广度,学习掌握更多需求场景的解决方案,如分布式事务,数据库的读写分离、分库分表,如何解决接口的幂等性问题等。
  • 拓展知识的深度,了解框架原理、实现细节、技术选型、常见的生产问题,帮助我们更好的使用框架来解决需求,也让我们的系统运行的更加稳定。企业中,尤其是在线业务系统,都非常重视系统稳定性,如果我们平时不注重相关底层知识的积累,对于中间件的应用浮于表面,很可能就搞出个BUG,并且出现问题时还无从着手。或是,我们想去做基础架构相关的开发,更加需要积累底层知识了。

img

5.2 项目实战

这个阶段我们要开始积累实战经验,如果还在学习阶段,就多看看开源的框架源码。如果我们已经工作,那就要注重工作中的总结。行动中思考,就是始终保持好奇,不断从工作中发现问题,不断带着问题回到工作中去;不断思考,不断在工作中验证思考;不断从工作中总结抽象,不断对工作进行复盘,持续不断把工作内容和全领域的知识交叉验证,反复实践。

img

六、史诗级阶段:持续精进

如果把前面5步都做到优秀,基本你已经可以对齐高级研发工程师了,如果你项目经验很好,还可能会更高。那我们还可以做些什么呢?

6.1 持续精进

这个阶段其实就是第5步的进一步递进,继续拓展知识的深度和广度,例如进行源码阅读,例如学一些机器学习、大数据相关的知识。但有我们要记住技术永远是服务于业务的,我们尽量不要脱离业务盲目去拓展广度,而是注重原有业务进行深度的钻研,甚至可以尝试依据于技术,创造出新的产品需求,来让产品变的更好,或是提升产研效率等。

img

6.2 系统设计

作为技术人,我们给自己定的职业目标可能是一个技术专家,可能是一个架构师,也可能是技术和管理兼具的技术经理。但是无论如何,我们都需要一定的系统设计能力。此外,我们还需要开始积累行业背景知识,例如,如果设计一个电商系统,如何设计一个机器学习平台,如何设计一个供应链系统等等,当然要根据你的工作背景而定。

img

6.3 由术到道

我们部门在每一轮面试求职者的时候,除了看求职者的技术能力如何,还会观察他是否在工作中勤于思考、善于总结,甚至能否沉淀出方法论来;是否具有自己思维体系,有结构化思维能力;是否具有良好的沟通力、共情力、表达力等等。其实,这些往往是我们容易忽略的。如果我们未来想走的更远,这些往往是必要的,甚至是首要的。后面我也会写一些相关的文章,与大家共勉。

七、写在最后

写了这么多终于算是完结散花了,祝大家早日找到自己心仪的工作,我们下期见,Peace😘

我是简凡,一个励志用最简单的语言,描述最复杂问题的新时代农民工。求点赞,求关注,如果你对此篇文章有什么疑惑,欢迎在我的微信公众号中留言,我还可以为你提供以下帮助:

  • 帮助建立自己的知识体系
  • 互联网真实高并发场景实战讲解
  • 不定期分享Golang、Java相关业内的经典场景实践

我的博客:https://besthpt.github.io/

微信公众号:1460000040792849.webp


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK