后台开发涉及的东西很多,一篇文章没办法覆盖完,所以我这篇,就说说后台开发的基础要求吧 。
在正式开篇前,我想简单说说, 对后端和后台这两个词的理解。
后端和后台
后端和后台这两个词,我特地去google 了一番,好像也没有特别精确的定义,各种说法都有。
我主要是从事后台开发的,我们一直以来的习惯叫法是后台,公司内部的职位定义也是后台开发,不是叫后端开发。
我仔细想了下这个事情。觉得后台的称呼更合适一些。 我们称前端后台。我觉得端和台很形象,准确的描述了两者的根本区别。前端,一个端,可以是一台手机,一台pc, 一个浏览器,所以称为端。后台,有可能是一台服务器,但更多是几台,十几台,甚至几百上万台服务器,有平台的的感觉。所以我觉得后台的叫法更加的形象和准确。 前端后台,也很形象准确的描述前后之间的差异。 当然,这是我的一家之言,说的不对,还望指正。
言归正传,我们来看看一般后台开发的基本要求
语言层面: 语言 + 对应的框架 + 运行时机制(语言解释执行器,垃圾回收等)
数据库: 有一种或几种常用数据库的操作经验,至少能进行增删查改的操作
算法数据结构: 常用数据结构, 队列,堆,链表;常用的算法, 哈希, 各种排序,字符串查找等。
操作系统(类unix,windows, 类unix偏多): 线程,进程,cpu 调度, 内存分配机制,文件缓存系统, epoll/select
网络协议: tcp/udp, http, https 等
以上是基本需求,进阶需求,各公司各岗位不太一样,这里就不一一列举了。
上面列举的基本需求,可能很多同学在各个公司的招聘要求上也看过。
下面,我例举些实际的例子,来看看这些知识或技能要求,在实际工作中的使用情况和对工作带来的实际影响。
语言层面
例如java, python, php , c/c++ 等,和对应的开发框架。 这个是基本要求,因为你至少要熟悉一门语言和常用的框架,你才有可能接手正式的工作,要不你都干不了活。
语言和框架,包括对应的运行时环境,是贯穿整个职业生涯的东西。不同阶段对语言和框架的要求是不一样的;不同公司对新入职员工的要求也不一样。大公司对毕业生甚至没有框架的要求,就算你只会一门语言而不会任何框架也可以, 但相应的,对算法,操作系统等方面的要求就会高很多。中小公司就很看重入职新人语言框架方面的实际能力。因为中小公司本身的资源有限,没有那么多的时间来培养新人,他们更想要进来就可以干活的。所以如果你的算法或其他方面很牛B,你可以不太理会这块,想办法去大厂。 但如果你其他方面都不怎么行,基本的语言和框架就是你的敲门砖了。
语言框架,这个算是最基本要求了,也是贯穿整个职业生涯的要求,越高阶,需要掌握的程度也越高。
数据库
对数据库的要求跟语言框架是一样的。 首先你得会,不会的话,就没办法工作。 现在大部分公司的数据库都是mysql。 当然也有使用Mongodb ,Redis 等的。 数据库的增删查改操作是最基本的,是能干活的基础。进阶一点的时候,需要开始理解数据库的存储结构,索引实现,要对性能优化有所了解。 再进阶,数据库的锁,事务,高并发设计等。数据库的要求也是越高阶越难的,到后面甚至出现自研数据库的需求。 这个就是分布式存储的领域了,很复杂,可以讲很久了。对于新人而言,会增删查改应该可以满足初期需求了。后面需要开始对性能,对并发等有要求的时候,就需要对数据库本身的实现机制有更进一步的了解了。这些可以在实际工作中慢慢学习和积累。
数据库,必备的技能,贯穿整个职业生涯,随着开发的等级越来越高,要求也会越来越高。
算法数据结构
算法的重要度,都已经不需要再次阐明了。 几乎所有人,所有公司都是觉得很重要的。 就类似武侠小说里面的内功,拥有深厚的内功,才能将各种招式充分的发挥出来。我这里说说,在实际工程中,算法数据结构的应用情况。
实际工程中,算法数据结构的实现和应用情况,可能跟大家想象的不太一样。 对于通用的算法,类似快速排序,快速查找,都有现成的库可以使用,一般团队也不会让你直接手写一个快速排序---低效,说不准还会有bug。 而类似哈希,链表,队列,这几类的使用会多很多。 特别是哈希 和 链表,使用频率最高。 不过,实际工程中, 对数据结构实现的要求跟教科书上的不太一样。 对于哈希,你可能懂得用开放地址法或链表的方式来处理冲突,而实际工程中这些远远不够。 实际的生产环境,基本都是多并发的环境, 你还需要保证你设计出的数据结构,是线程安全的,也就是可以多并发处理,而且可能还有一定的性能要求。 这个就要比较教科书难不少了。 再比如, 你可能会被要求去实现一个队列,因为要应对并发,你的队列要设计成多进多出的,所以你要加锁,但因为要高效,所以最终你要设计一个无锁队列。这个也会比教科书的难。但在我的实际工作中,几乎没遇过要我去手写一个平衡二叉树的需求,好像我周围的同事也几乎没遇到。我想除非是做数据库的同学会遇到吧。这些都是实际工作和教科书的区别。
算法数据结构,总的来说,是最重要的内功之一,但实际工程中的要求可能跟教科书的要求会有些不一样。
操作系统(类unix, windows , 类unix偏多)
刚入行的时候, 对操作系统的理解还不需要太深入,只要知晓有操作系统 的存在就行。在后面慢慢进阶的过程中,操作系统对你整个工作的影响会越来越大。会影响你的整体设计,性能,更直接的是,你在实际工作中首次碰到的很多无法解释的“灵异事件”,都可能跟操作系统的机制和策略有直接或间接的关系。 这里举个实际设计中的例子: 我一个同事,早期的时候,做个一个自研的队列组件(类似rabbitmq那种), 设计的极其复杂。我看他的文档看了好久才明白其中的原理。 后面找他讨论, 才发现他很多的设计都是为了追求极致的磁盘写入性能。 他做了写入缓存,做了各种数据对齐,这些又使的他的上层设计变得复杂。 后来跟他一起讨论了linux文件系统的缓存机制,发现直接用write 系统调用,顺序的写入文件就完美解决问题了。而他围绕此处所有的设计都是多余的。类似的情况,我还遇到不少。所以操作系统的知识,特别是对操作系统机制和策略的深入理解,对后台的设计,开发,真的会带来完全不一样的结果。如果一个后台开发对操作系统的理解不能深入到一定程度,我觉得他是没办法在这条路上进阶的。
操作系统,这个属于进阶需求,需要长远在这个方向发展的话,就要注意这块的积累。
网络协议: tcp/udp, http, https 等
一般情况,网络协议, 需要到达清楚理解机制的程度。
比如tcp 和udp 的区别。tcp 的链接建立和断开的过程. http 和 https 的区别。 实际工作中, 如果你的工作涉及底层网络框架的开发,那对tcp /udp的实现机制就需要有深入的理解了,要不你无法设计出高性能的框架。 其他协议也是类似。
总得来说,如果不是专门做网络框架或涉及设计类似p2p等私有网络协议的。 相对其他,个人觉得这个在实际工作中的运用相对没有那么多。但是,大家不要混淆了网络协议和 epoll / select 这种服务器开发机制的区别。 类似socket 套接字的使用,epoll/select 的深入理解,还是很重要的。目前很多公司已经不用从socket 套接字和epoll/select 层面来构建服务了,而是直接采用了现成的rpc框架,但对于想长期往后台方向发展的同学,还是建议掌握socket epoll select 。我记得我当初进公司,第一个任务就是不用任何框架,实现一个服务器,要求高性能,支持高并发。基本都是采用socket 套接子 + epoll来实现。做完,基本可以熟悉和知晓在数据传输上需要解决的一些问题。
网络协议,需要达到清楚理解机制的程度。如果是从事网络框架开发或需要设计私有网络协议, 则会有更高的要求。
上面说的东西,对于客户端开发,基本也是匹配的。前端开发对操作系统的关注没有那么高,会更关注浏览器的行为。本质上,都是要求,你在做设计和开发的时候,能从底层开始,知晓你所写每一行代码会带来什么影响。这里在设计和开发有一个终极的要求: 一切尽在掌握。也是我们一直在追求的目标了。
以上例举了后台开发的关键技能点,也例举了一些实际工作中应用的例子。下面再来说说面试的一些情况。
一般面试,上面提到的知识都是会涉及的,虽然每个公司每个面试官问的具体问题不一样,但基本都会考察的。
除了以上的知识点,有以下情况的可以加分
对于毕业生,如果你的算法牛B, 基本可以畅通无阻
这个在大厂基本是这样的, 估计对于很高估值的独角兽公司,也是如此。 这里算法牛B,一般是指ACM 省级以上的金银牌,有的甚至要求,洲际级,国际级的那种。 基本都是顶尖人才了。如果你有这么牛, 你可以不太懂其他的基础知识,没有项目经验。你一样可以面过最后一轮,甚至拿到特殊offer. 不过这种人太少了,基本简历一出现,就被抢走了。
有丰富的项目经验,也是很受欢迎的
有丰富的项目经验,也是面试官很喜欢的。 不过相对算法的考察,项目经验的考察会偏主观。因为判断一个人的能力是从项目中判断的,而一个项目的好坏以及个人在整个项目中的贡献,都会因应聘者的描述,面试官的理解,造成差异,甚至经常出现各个面试官的意见不一致的情况。 所以拿项目经验面试的时候,要注意自己的经验跟面试官经验的匹配度。 如果刚好面试官也是做这块的,你通常会比较高分,反之就会差些。这种时候,就多试试吧。而且就经验来看,一般社招,都是看项目经验了,算法要求反而没那么高了。
没有特别突出的,就拼基本功了
这个没办法,也只能降低一些要求了。 大厂和独家兽公司应该是比较难了。 不过如果以上列的基础知识掌握的不错,面试官问的都能回答出来,再加上一些自己做的小项目。比如一个个人网站,或者自己动手做的一个小游戏,都可以。也还是有比较大的通过机率的。
总的来说,如果你算法很牛或者你项目经验很丰富,会有很大的优势。 如果没有这两个,就基本押宝你的基础知识了,例如我上面列出的那些。
最后希望上面的星星点点,能为你提供一些帮助。如今各个行业领域的分工都已经十分的精细,要想在一个特定领域的一个分支上做出成绩,都需要几年甚至十几年以上的投入。在确定合适的方向后,剩下的就是持续的学习和积累了。没有捷径,唯有脚踏实地。
欢迎工作一到五年的Java程序员朋友们加入Java架构交流:810589193
本群提供免费的学习指导 架构资料 以及免费的解答
不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导
网友评论