五 后端(Java/python/go)
说到后端,其实我主要想说的是Java。C和PHP这两种语言我都不喜欢,之前也说过了,我自己绝对不是一个说话公平公正的人,什么观点都带着自己偏激和极端的调调。
我之前在贴吧跟Java吧的吧主一直在撕逼(原因很简单,我说教大家学Java,一个月收400块钱,他说我是骗子封我贴。然后我说好吧,我不说教大家学Java了,我来给大家解决在学习过程中遇到的困惑,他说贴吧不能发问答贴。我说行,那么我就写一些新人学Java必须要学数据库,数据结构和计算机网络,于是一群吧主过来喷我说,我没学过这些我也照样学会Java了啊,什么多线程什么继承等等,我无语了解释说Java语法不重要,重要的是要学会后端的架构,要懂算法,要懂业务,要懂系统的扩展性,要会调试程序,于是吧主们就把我封了,我很不爽,就新开贴子跟他们撕逼对骂--我从来不是一个重身份的人,我骂人会很脏,所以如果看到这个贴子觉得我很厉害那么你瞎眼了,我就是一个不喜欢就说,谁喷我一脸我喷谁一身的性格,现在的结果就是Java吧的吧主每隔10天就来封我一次-哈哈哈哈哈比闹钟都要准,所以三个月过去了,我带出来很多CSS和JS的学员,然而Java的学员并没有多少。所以如果有人去Java吧替我骂一下那些XX吧主并且截图给我看,我会很开心很开心很开心,说不定就会给你们开小灶哈哈哈哈。)
之所以说这些,一方面是400多的赞让我觉得有点羞愧,另一方面也是想强调一个概念,学后端,学会语法只是开始而已,最后一个就是我是一个小人,谁欺负我我就想欺负回去。
我想想该怎么描述后端的工作。后端跟前端是截然不同的,之前讲过。前端是Gank,后端是大后期,要等到16级以后才能V5起来,而且我非常不推荐前端去学后端(所谓的全栈工程师完全是扯,我有时间会写一下,为什么不要去做一个全栈工程师)。后端要积累到足够多的项目经验,才能够成为一个靠谱的后端工程师。我觉得。我来举一个跟着我线下半年的小培宇的例子就能简单说明一下后端的工作。
小培宇是第一个来到我大修院面试(嗯,最初我是给他们发工资然后带他们学习的)的人,跟我讲他是考研失败,差了几分,然后也做过点项目,我随便问了几句就知道了他的状态:人挺聪明的,但是在学校肯定玩的疯,所以问点排序算法还是能够答的出来,数据结构也懂一点儿,LinkedList和ArrayList删除数据谁更快也能答的挺靠谱的,但是绝对绝对没写过一行工程代码。
他打动我的那句话就是:不在乎工资多少就想多学点东西。很好,我默默的点个赞,因为我本身就想把自己这几年积累的经验和知识和走过的坑整理出来,告诉互联网的新人,所以也不抵触带新人,坦白说,愿意像我这样带新人的公司,几乎没有,带新人真不是一般的累。幸好我之前在各种公司中都带过各种新人,好的坏的都带过,所以还算是熟悉。
于是我给培宇精心设计了他的学习曲线,这也是我大IT修真院的核心观点:
1.先搭建基础环境(Maven,SVN,Eclipse,jetty,SecureCRT,Linux,Mysql)
2.做简单的CRUD(DAO-自己封装的数据层,junit,Log4j,Rest,Spring,Spring MVC,Json,JsonTaglib)
3.做一个相对复杂的系统DB设计,接口设计,项目部署,错误提示,Bug查找,怎么打系统日志。
4.做了一个微信相关的项目,了解微信的API,交互方式,Cookie,拦截器,AOP,登录系统的设计,命名规范等。
5.拆分Service,将Home和Service分开,使用RMI调用,实现各个层次之间都可以完成分布式的部署,使用Tuscany(真心喜欢Tuscany)完成SCA。
6.使用MongoDB完成地理位置的搜索,短信,图片上传,云存储,使用Tiles来配置页面模板。
这些内容他花了将近三个月的时间。对他来说已经是学会了很多东西了,这三个月是几乎没日没夜的学出来的,要知道他之前压根就不知道什么是Spring,生成Json和套JSP的区别我骂了他好几次他才弄明白,经常会遇到一些Maven或者是Tuscany的报错不知道该怎么解决,数据库字段的规范和接口规范常常被我黑的体无完肤。很多东西都只是知道个皮毛而已,你们自己说说,学会Java语法算什么?
这还是有我来带,有我来教,有我给他定制合适的项目教给他去做,如果没有这些,你们自己学,学会我说的这些东西要多久?
别的不说,学会怎么打日志,怎么根据线上的报错去找错就不是一个月两个月能解决的。做为一个工程师,应该明白,很多时候要学会正确的路怎么走,还必须要知道错误的路是走不通的。正确的路大概就那么几条,错误的路呢?
为什么很多时候我看到错误日志就会明白是什么地方报错了,是因为我之前花了无数的心血和心力在查找这些错误上,所谓的经验就是这样,看的多了,一眼就知道大概什么地方报错了,然后随便百度下,就能找到解决方案,跟着去尝试倒底行或者是不行。这些是看书,或者是看视频能教会你的么?
到现在为止培宇已经跟了我快半年了,还是被我骂的狗血喷头,别的不说,就是接口的Wiki文档和代码保持一致,他都会经常犯错---这跟Java语法有什么关系,然而不经过一个好的训练,想做的很好,很不容易。
其实他接下来要学的东西更多。Memcache或者是Redis,ActiveMQ或者是RabbitMQ或者是QPid,Mybatis或者是SpringJDBC,Struts或者是SpringMVC,我告诉他的只是一个我们在项目中经过实践的,认为最合适的架构体系,然而他并不知道是怎么选择的。他必须要把这些相关的选择都有所了解,然后才能成为一个架构师。这个时间,如果一直跟着我,我觉得应该是在一年到两年左右。
这是一个横向扩展的内容,在这个时候我还没有要求他去看一些深层的东西。只是需要他停留在会用的状态就可以。在会用这些技术之后,再去了解一些自己喜欢的技术的细节,不成为一个只会使用工具的码农,所以培宇问我还需要多久才能达到我的水平的时候,我其实并不想打击他。我也是很刻苦努力的人啊,曾经无数个日夜也是默默的去一行一行代码去用最笨的方法调错,并没有人告诉我怎么样是正确的只有靠一个又一个的项目总结出来的经验。
而且我还会一些Drools,CRM,Lucene等等一些和架构师关系不大的事儿偏算法一些的东西,毕竟当年也学过点数据挖掘机器学习之类的内容。
就算是学会这些了,对于一个后端工程师来说就够了么?不不不,还需要学习JVM优化,监控,部署流程,发布流程,项目进度管理,代码重构等等等等。
所以,你们自己算算,这些东西如果都学会,一个Java工程师要多久才能成为架构师?
然而我还是对带培宇很有信心,首先他相信我,他愿意学,跟我当年一样,不怕苦不怕累,人也够聪明,做事也有责任心,其次我知道他应该怎么走这条路,先做什么,再做什么,哪些该花时间和精力,哪些不该花。
我希望他能够在一年之内就成为一个架构师。就如他在三个月和六个月之间独立做项目已经不成问题了一样(记着,我说的是独立做项目,自己设计DB设计接口设计架构完成需要的功能,从设计到实现完全自己来)。
我也希望我能够帮助很多和培宇一样,有实力有能力只是没有遇到我的那些人,这也是我为什么在知乎发贴的原因,IT技术的培训,哪些培训机构能做到这一点?
这个真实的小故事,就是想跟大家提前说清楚,我对后端的要求有多高,这也是后端特别好玩的地方。你必须要会很多种框架,有足够宽广的视野,还需要有足够多的项目经验(做金融和做地产是两个完全不同的概念),还需要懂项目开发流程以及快速定位线上问题的能力。
这些,就是我说的后端的主要工作内容了,这也是为嘛我说到后端的时候,大部分就是在指Java,而我说Java的时候,基本上是只指后端,根本就不是指Java的语法。更不是说是Android。
现在明白为什么后端是大后期了么, 为什么不建议前端学后端了么。后端要懂的东西,太多了。
言归正传,我来讲一下后端工程师的相关内容。
1 工作内容:
大部分的后端工程师都停留在功能实现的层面上。这是现在国内二流或者是三流的公司的现状,甚至是在某些一流的公司。很多时候都是架构师出了架构设计,更多的外包公司根本就是有DBA来做设计,然后后端程序员从JS到CSS到Java全写,完全就是一个通道,所有的复杂逻辑全部交给DB来做,这也是几年前DBA很受重视的原因。
所以你能看到成千上万行的存储过程(存储过程,视图,事务,外键 这些东西我真心希望永远不要在Mysql里出现),这就是外包公司中最常见的架构体系。来个SSH,Over。
好一点的会个WebService,用过ActiveMQ,也用过Redis,甚至还会用过Dubbo。然而大多数情况也根本不了解为什么这么用。
很多人写了两年或者三年代码都没做过独立的DB设计,不知道什么是REST,不懂怎么做接口设计,也不知道怎么去定位问题。
所以对于他们来说,拿到产品经理的需要,会有一个项目经理或者是Leader分配任务,跟着按步就班的把代码写完,跟前端调试完,QA测试不通过,加班改回来重新改,改完QA又没通过,再加班再改,QA终于通过了然后上线了突然发现另一个好的功能不能用了,跟着再接着改,在线上发布一次又一次。。眼睛熬的通红最终真的受不了了,休息几天换另一家公司涨个40%左右的薪水继续这样的日子。
不不不。我带出来的后端程序员并不要这么做。所以,我带的后端程序员的工作方式是这样的。
拿到产品需求-》后端程序员做接口设计,架构设计,DB设计-》拿出方案来做技术方案评审-》评审通过,开始预估时间-》每日更新自己的Task-》接口完成自测一百遍,每日部署到开发环境,随时集成-》CodeReview-》重构代码-》性能测试-》Demo通过-》发布到测试环境-》修正Bug-》重新发布-》发布到线上环境。
这中间需要理解需求,需要拿出多个方案,需要跟前端配合,需要跟QA配合,需要跟运维配合。需要跟产品沟通,有时候还需要找UI。后端几乎是一个核心节点,而这个核心节点接起来了所有的人。
我不知道我讲清楚没,很多时候我都发现我可能太久没做一个IT新人了,都忘记了新人们关心的问题或者是困惑是什么。
这就是我知道的,两种后端程序员的工作内容。你选哪一种?
2 需要技能:
环境【IDE(Idea/Eclipse,Maven,jenkins,Nexus,Jetty,Shell,Host),源码管理(SVN/Git) ,WEB服务器(nginx,tomcat,Resin)】
基础【Http,REST,跨域,语法,Websocket,数据库,计算机网络,操作系统,算法,数据结构】
框架【Spring,AOP,Quartz,Json TagLib,tiles,activeMQ,memcache,redis,mybatis,log4j,junit等等等等等】
业务【金融,教育,医疗,汽车,房产等等等等各种行业】
第三方【微信,QQ等各种第三方登录,支付,IM,地图,语音,视频,图片】
环境不说了,搭环境永远是后端人员比较头疼的事儿,所以才会有很多人想用简单方便的的语言来解决这些问题,比如说Python之类的。我还是喜欢Java,大概很多人觉得重,然而我喜欢,我觉得不是“重”,而是“正”。好像剑一样,王者之剑,路子很正。
基础知识太多了,正是我一直强调的,做后端,这些基础知识了解多少,其实就是决定了你以后能走多远。这些科班出身的计算机ER,会了这些,才有了一个平台,才可以站在这个平台之上去搭建更高层的建筑,如果根基不稳,你觉得你会对上层的知识理解透彻么?
框架是Java最有资格说自己是架构师的原因。无数的开源框架,选型,筛选,对比,填坑,优化,维护,寻找最适合的业务场景,很多时候很多公司的架构简直了(我不吐了,很多技术都在用然而每一种用法几乎都是错误用例的典范)。所以你想想,你大概要有多少框架要学要用?很多时候,你必须要想清楚,哪些是需要认真了解的,哪些是需要一笔带过的。
业务对于后端人员来讲无比重要,不懂业务,就没有架构。这是我经常说的一句话,这个世界上不存在不懂业务的架构师(我不怕被打脸),一个架构师必须要深入了解业务体系,知道哪些是会变的,哪些是不会变的,哪些是重要的,哪些是不重要的,然后才能做出来适合某个应用场景的架构来。比如说,同样的表,几千万的量和几亿的量差别非常大,频繁读和频繁写的设计也完全不同。会有一些通用的架构思想和理念在里面,但是都是需要跟业务结合落地的。
PS:很多金融证券行业的程序员,就是靠业务知识混饭吃的。对他们来说,对业务体系的了解要比在技术上的追求重要的多。
第三方的东西和JS的内容相似,我不想多说了,而且 JAVA的第三方的东西更是多的离谱,坦白的说Drools这东西我就没彻底研究明白,虽然很喜欢。而像这种类似的东西,太多太多了。
3 发展前景
对于后端人员的发展前景,我有两点想说的。
A.无论是B/S还是C/S,无论是WEB还是原生,或者是智能硬件,后端都会屹立不倒。
B.随着后端架构体系的稳定和成熟,后端人员在性能上需要担心的问题不多(再加上大部分应用场景其实并不需要那么多的性能),所以更多的应该会关注于一个稳定的扩展性好的架构,以及快速实现能够复用的业务逻辑模块实现上。
最近后端人员在价格上,其实有点偏低于前端人员的,就向我之前所说。两年的JS可能拿到20K。两年的Java想拿到这个,非常难。然而,五年的Java或者是七年的Java,拿到30~40K,不难。
更高的,也不稀奇。
0~12个月:4K~10K
一年~三年:8K~20K
三年~五年:18K~30K
五年以上:30K~
成长路径:
Java初级工程师-Java中级工程师-架构师-技术经理-技术总监-CTO-CEO
后端的爆发力并不差,只要你给他时间,只要你愿意前进,后端的路线很深,深到你有时候会觉得自己还没来得及全部了解,就已经有无数的新人涌进来要替换你的位置了。
4.入门门槛
计算机网络,数据结构,数据库,操作系统,Java基础语法。
Java是入门门槛最高的一个,没有之一。(好吧,我虽然说的是后端,然而一直把Java等同于后端)
当然,如果你的志向并不是一个架构师,只是像NodeJS和Python或者是PHP一样随便做点小项目,那么也可以说的得上是没有门槛,但是我说过我有偏见,所以可以直接把我无视掉。如果你觉得我说的哪点不对,你过来揍我啊。
要跟我学Java,就必须把这些基础知识学好,我只带想成为架构师的人。
5.哪些行业适合做后端工程师
IT界:无
其他界:无
科班生:计算机专业的中等水平能力以上
所以如果有各种培训学校告诉你零基础4个月20000块钱把你教出来做Java后端,然后你月薪上万,你就直接一锅盖盖他脸上吧。
6.职业限制
后端的职业限制有很多,第一个职业限制就是不去做独立的项目,不做DB设计,不做接口设计。
第二个职业限制就是视野不开阔,不知道有什么样的开源软件可以用。
第三个职业限制就是不重视线上环境,不知道如何写日报,也不知道如何快速定位。我不得不说我带过的兄弟,有一次解决线上问题的时候快把我气疯了,他们在那里猜测问题出现的原因,跟玩福尔摩斯一样,不打日志不看日志,根据现象倒推结果,直接盲改代码再扔到线上看看有没有解决问题---那是最后逼不得已的办法好么,在此之前能不能安静的把日志打出来,确认一下到底是哪里出错了?
第四个职业限制就是不懂版本管理,不懂Bug修复流程,不懂开发流程。这些其实都是一整套的流程体系(等我心情好了,有人把Java贴吧吧主骂的狗血喷头了,我大概也会写出来)
大部分后端的人员都会抱怨自己不会写前端代码,不会写Android或者是IOS,不能自己独立完成项目,所以他们才倾向于自己做一个全栈工程师,做一个自己喜欢做的东西。
这也是后端人员会经常觉得不爽的地方,自己写的东西完全感受不到,而且一旦出问题很多时候都是大问题,解决起来很麻烦,经常不敢改代码,因为看不懂前人的东西。
有时候后端人员会比较木,虽然很各种职业都交流,但是多数都会觉得自己很NB其他人都很SB。
这也是后端人员比较大的问题,往上走的话也容易遇到各种瓶颈,做技术的,做到CTO,再去做CEO,其实很难的。
而且,等你走到足够高的高度,你会发现,一个七年工作经验的正常发展的后端工程师,一定会有一个七年工作经验的产品或者是运营,在薪水和职业上秒杀他。这也是做技术的最大的悲剧。
不过大部分的后端工程师都比大部分的产品和运营人员薪水高,这也是这个行业的特征之一,所谓高不成低不就,小富即安,就是这样的。
如果你是一个有理想的后端工程师,我建议你多关注一些敏捷开发,多关注一些项目管理,学会带着自己的兄弟们一起做事儿。再不然,就是在技术这条路上一直走到黑。
--------------------------------------------------------------------
六 DBA
首先说,我对DBA的了解并不专业,也不够多,而且对这个职业也有偏见。所以,我只能把我感受到的,我会的讲出来,然后如果说你们觉得我说的不对,要么自己开贴回答来打我的脸,我虚心学习,要么就直接笑笑走开,表在评论里说三道四,最烦这个。
七年或者八年或者很早之前,DBA是非常吃香的职业。讲这个,大概要从系统的性能瓶颈说起。
很早之前,互联网刚开始的时候,算是蛮荒时代。那时候大家写代码还没有规范,能把功能做出来就不错了,大家拼的是什么呢,Sql的性能。基本上就是没有中间层,也不会分什么服务层和Web层,很多时候SQL都写到页面上。
然后Sql呢,又属于那种外键,视图,存储过程的天下。这就导致了出现一个问题。大部分的功能都是通过DB来实现的,也就是说,什么计算啊,分组啊,排序啊,筛选啊,全是靠DB来做。
小功能还没问题,功能一多,问题就出来了,一个Sql语句执行了半个小时没做完,然后整个系统崩溃掉了。
那么,怎么解决呢,解决的方案就是。。。。我其实很难理解这种思考方式。。。。 就是找一些人,对DB特别熟悉,他的职责就是审核所有程序员的Sql语句,去找出来这些Sql哪些用到索引了,哪些没用,能不能执行,怎么优化,以及监控线上的慢Sql。一个公司能养得起DBA的,很NB了。很贵的!
所以这是那个时候的DBA,但是,很快大家发现有不同的方式了,这种方式就是,我靠,原来我可以用分库分表,我可以做读写分离,我能做主从。于是对于DBA的依赖又重了一些,再加上数据的安全和备份,所以DBA的作用已经有点偏移,然而最关键的还是系统架构的发展变化了。分布式的概念慢慢的起来了,大家明白了一件事儿:机器不够,并不是说把服务器升级成小型机就能搞定了,而是应该用更多的机器来做,因为便宜,而且更简单。所以后台的系统架构慢慢的演化出来很多不同的层。WEB层,服务层,缓存层,DB层。对于缓存的使用越来越重要,由此而变化的观点就是数据分成了缓存和持久两种结果,DB慢慢的变成了持久层-也就是说,只是要把数据持久化,并不希望它去承载用户的压力,缓存主要用来扛并发,不需要做持久。这是一个很关键的点,也是决定DBA命运的转折点。
当然现在还看不出来(像MongoDB,Cassandra,这些,又是另外一种不同的技术走向,包括Mysql也在不断的想要提升自己的性能),所以这些东西我们先抛到一边不谈。只说这中间发生了一个变化,对于后端人员来说,对数据库访问的变的严格起来了。尽量单表操作,不允许复杂查询,设计架构的时候必须考虑缓存,甚至我们在白社会的时候还设计了一套通用的DB访问机制--虽然是七年前的设计然而现在一直都觉得很赞,只是再也没有如我在搜狐的时候那群人做这些事了-反正我见识少,一直在小公司混,也不怕你们嘲笑我见识少。
这样就导致DBA的一个很重要的工作职责,失去意义:就是查找慢Sql,因为我们在系统架构层已经决定了不再这么使用DB。这样使得Oracle什么的也慢慢的失去了价值-我知道我说的每一句话都有可能会引起争论,所以我不得不再次强调一次,纯属个人的脑残关点,不喜欢的话,要么认真的回复来打我的脸教我做人我认真学习,要么就是滚远点表理我。 包括建表,去除外键,去除事务,去掉视图等等等,一瞬间,DB的使用简单多了。
那么,DBA还能做什么呢?
对于我现在的理解来说,DBA的职责慢慢变成了数据备份和安全策略--然而这部分又跟运维的工作有了冲突,所以在某种程度上来讲,我都会在五十人左右的公司把DBA安排到运维部分,跟运维的兄弟们做基友。可是现在云服务器也变的越来越好用了,这里也推荐一下好友的金山云和Ucloud。阿里云跟我并没有神马认识的人,所以不推。
DBA除了之前提到的主从,读写,数据备份,权限控制,分库等等,还应该再扩展视野,把MongoDB,Redis,memcache,elasitcSearch,hadoop等等这些数据全部管起来。我觉得,更像是一个运维的分支了。
这就是我目前认可的DBA的价值和意义,已经从之前的性能优化部分转移到了数据备份和安全。
毕竟,性能,架构,和优化这些东西,是离不开业务系统的。
那么,接下来,和之前一样,继续介绍一下DBA的工作内容。
1 工作内容:
如果你做了一个DBA,基本上会遇到两种情况。一种是你的后端工程师懂架构,知道怎么合便使用DB,知道如何防止穿透DB,那么恭喜你,你只是需要当一个DB技术兜底的顾问就好,基本上没什么活可以做,做个监控,写个统计就好了。你可以花时间在MongoDB了,Hadoop了这些,随便玩玩儿。再按照我之前说的,做好数据备份。如果需求变动比较大,往往会牵涉到一些线上数据的更改,那么就在发布的时候安静的等着,等着他们出问题。。。。如果不出问题就可以回家睡觉了。
另一种情况就是我刚刚提到的,大部分程序还是靠SQl,然后有时候DBA还需要写几万行的存储过程,那么你的主要职责还是优化Sql,优化Sql,永远不停的优化SQL。
嗯。就这样。
还有就是多花点时间把MongoDB和hadoop这些都维护起来,或者简单说,只要跟数据安全,备份相关的东西,都维护起来。
2 需要技能:
环境【Linux,Mysql,Oracle,MongoDB,Hadoop】
工具【各种DB的版本,工具,备份,日志等】
这个说是环境已经有点勉强了,毕竟是一些吃饭的家伙。就是各种DB,各种维护什么的。
工具也是相关的内容,再强调一下对版本的熟悉程度。
马丹我感觉我没什么可说的了。因为刚刚又被
这个贴子恶心到了。我被Java吧封了,然后他们还@我。我要赶紧写完然后想办法去跟他们对骂去。
3 发展前景
DBA的发展前景我说不好。一些简单的工作。运维也是慢慢学会了。包括薪水,这个是我比较没把握的。之前的薪水都是有迹可寻的,DBA的薪水我接触的比较少,实在是没什么底气。
1年~5年:8K~25K
5年以上:20K~40K
(我好心虚。。我只给一个DBA开过工资)
成长路径:
也不知道有啥成长路径,感觉这个职业的物种越来越稀少了。
4.入门门槛
DBA的入门门槛也是比较高的,而且,很少于有刚工始就是做DBA的,大部分都是工程师转的,所以呢,至少要两到三年左右的时间才有可能做DBA,才能负责一些相对负责DB的事情。
5.哪些行业适合做DBA
IT界:后端工程师,运维工程师
其他界:无
其他行业的想转DBA,刚刚也说过了,不合适,只能先写代码,再慢慢的转。
6.职业限制
这个职业最大的限制大概就是。。很容易无事可做,前面有后台架构师蚕食,后面有运维工程师侵入,中小公司都不太会设置这个岗位,所以有的时候会比较尴尬,大概还有一些外包公司,或者是传统的IT企业,会是由DBA去设计表,去理清业务还有一些岗位,其他的都不太好。
所以对于其他的各种持久化数据的备份和优化,特别是对一些正在使用的框架,又不够成熟的东西,更容易找到自己的位置。如果你要做DBA的话,就记着,跟持久层相关的优化,数据安全,备份都要去了解--顺便再学点运维的东西