继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

《如何掌握企业级技术和项目经验》技术分享

2019-08-08 12:53:408680浏览

神思者

9实战 · 7手记 · 5推荐
TA的实战

各位同学大家好,我是慕课网讲师神思者I,今天我来给大家做一场在线分享。先简单介绍一下我自己,我曾经供职于Intel和IBM,有着17年的IT行业工作经历。做过产品研发,也做过项目经理跟架构师,现在拥有了自己创办的公司。

这次分享的主题是《如何掌握企业级技术和项目经验》。因为和学习有关,所以我就先从学习这个话题谈起,学习方向和方式对了路子,不管多难的技术在有限的时间内都是可以攻破的。这次技术分享,我就做一回知音大姐,跟大家分享一下学习的事情。

为什么我意识到学习方法的重要性了呢?因为我在咱们慕课网的QQ群里面,发现有的同学很迷茫。技术这么多,学也学不完,更不知道应该学什么?其他讲师分享的都是某个技术某个框架,很少看到有人谈学习方法的,所以借着这次分享,我跟大家先聊一下学习的事情。

首先我们要做好学习计划,时间就按照一年来规划。每年给自己制定一个研究的方向,比如说今年我要成为数据库领域的专家;明年后年我要作Java领域的达人;大后年我要成为前端领域的小强。每年集中精力突破一个技术方向,是最容易取得成就的。

这就跟恒星诞生的过程一样,一个天体在宇宙里不停地俘获物质,增加自己质量,总有一天,到达临界点的时候,这个天体突然点亮了,发生核聚变反应,于是照亮了宇宙。学习的过程也是这样,你专攻一个领域的时候,积累了大量的学习材料,努力专研是最容易出成果的。

因为我看咱们群里很多小伙伴都是20多岁上下的样子。年轻人容易受到新事物的吸引,不容易集中注意力,往往生活中刷个抖音、逛个淘宝,打一局王者荣耀,时间就不知不觉过去了。咱们群里面不知道有没有做大数据业务的,大数据里面有个协同过滤算法很厉害,网站不需要长期跟踪你,积累用户数据,就能快速的识别出你的喜好。

比如说你刚下载了淘宝APP,不需要下订单买东西,淘宝就能找出你的喜好。假如你看一个运动鞋挺好的,点开看两眼,然后就给关上了。下次再打开淘宝APP,首页出现的商品都是你喜欢的。这就是淘宝后台利用协同过滤算法,分析出看这个运动鞋的一类人,大部分人会买什么东西,比如很多人买了篮球、充电宝、护肤品等等。所以你的APP上就会出现这类东西,然后你的购物欲就被勾引起来了,不停地买买买。抖音也是类似的原理,让你不停的看视频。

现在的年轻人在学习的时候,越来越难以集中精力了。然后更糟糕的是,学习编程技术,必须要用大段大段的时间,才有效果。你用碎片化的时间去学编程,拿过来一个框架看五分钟,然后就去聊QQ、打游戏去了。过了几个小时,再回来看学一会儿,这一天下来,跟什么都没学一样,什么东西也记不住。

人的大脑,调动理性思维让它活跃起来是需要时间的,前半个小时都是预热的过程,然后才能进入到学习的状态。所以我给大家的建议就是舍小取大,把零碎的事情都集中在一起处理,然后留出大段的时间去学习,这样的效果会非常好。

那么有的同学会说,学习这么辛苦,我坚持不下来。确实,学习是这个世界上最痛苦的事情。打游戏可比学习有意思多了,这是因为打游戏跟结果之间存在必然联系。砍死一个Boss能掉什么装备,得到多少经验,是有明确结果的。所以很多人追求这个明确的结果,不停的升级刷装备,沉迷于游戏。但是我们平时很少看见有人能沉迷于学习的,这是因为学习跟成果没有必然联系。比如说你今天背了50个单词,没人会给你承诺,四六级考试一定会考这些单词。

我们的大脑进化的还不完全,大脑只会为有明确结果的事情,分泌出多巴胺,让你感到快乐。你在做没有明确结果的事情的时候,大脑就不会分泌多巴胺,用不了多久,一件事情你就会做腻了。原始社会,物质条件很差,你要是整天不务正业,仰望星空,就容易饿死。所以大脑为了禁止你做一些消耗能量,而又不会有结果的事情,就不给你分泌多巴胺,让你感觉不到快乐,从而放弃一件事情,达到节省能量的目的。

恰恰学习就是一个没有明确结果的事情,所以从你上学的第一天起,就感受不到学习快乐,原因就在这儿。我们现在开始制定学习计划,要是一路枯燥的学习,恐怕有很多人都坚持不下去。那该怎么办呢?先找到一个参照物,然后自我鼓励。这个参照物可以是你自己,也可以是周边的人。你在学习的过程中,经常与这个参照物去比较,感知到自己的进步,就很容收获成就感。这样就把一个没有结果的事情,转化成有明确结果的事情。起码我知道我每个月的学习,都在进步。

比如说,公司目前用的是SSM单体架构。如果遇到高负载的情况下,肯定有问题。所以我应该学习一下Nginx负载均衡。等你搞明白负载均衡以后,又发现轮询式的请求转发,会造成Session丢失。比如说用户访问网站,Nginx把请求负载均衡到A节点,你在A节点登陆之后,HttpSession保存在A节点。如果刷新一下浏览器,请求被负载均衡到了B节点,B节点没有你的HTTPSession对象,于是就被判定成没有登陆。这时候就得用Redis缓存Session了,或者说把认证信息以Token的形式存储在客户端。

然后没多久,你又发现数据表记录太多了,需要缩表,要搞冷热数据分离,于是又要学习TokuDB引擎。这么一路研究下来,再跟你周围的同事比较一下,或者跟半年前的你自己,比较一下。技术水平,还有思考的维度都大不一样了,这种技术上碾压周围人的快感就是成就感。这种成就感会一路推动你后续的学习,从而走上终身学习的道路。学习是一件快乐的事情,其实很容易做到。这比会一个框架,学习一门语言,更重要。

接下来,我举一个反面的例子,相信很多同学都有过相似的经历。刚学会一个新的语言或者框架,就急不可待的虚构一个项目,立即用这种语言或者框架实现一下。比如说你刚学会Spring框架,于是就虚构了一个小型的微商系统,采用极限编程的方式,先不写文档,匆忙建了几张数据表,直接就进入到编码环节了。

过了几天,你在录入数据的时候,忽然发现有重大问题,商品表创建的不对,很难把所有商品数据都保存进入。食品有保质期属性,电视没有保质期属性。手机有操作系统属性,化妆品就没有这个属性。我建表怎么规定字段呢?不行,得重新设计数据表。一下子,SQL语句要改、PO和VO类要改、业务层要改、视图层也要改,然后还要跑一堆测试案例。你看,这是你的项目第一次推翻重来。

没过多久,你又发现了一个重大设计问题。如果订单表直接引用商品ID的话。如果顾客购买了进口奶粉,卖家偷换成了国产奶粉发货。顾客来投诉,卖家马上篡改商品信息,跟顾客说,我们卖的就是国产奶粉。电商平台绝对不可以出现这种行为,所以你又得去修改数据表结构。然后项目又推翻重来一次。

这种把项目反复退倒重来的经历,我相信很多小伙伴都有过。错误的学习实践方法,只会浪费我们大量的时间。每个人的职业生涯都是有限的,我们要在有限的时间里,学习到更多的技术,这样才不会出现中年职业危机。关于职业危机的事情,我放在后面再说。

在学习的过程中,同学们不要先着急做虚拟项目。每一个项目都不是靠单一技术实现的,所以我建议大家先充实理论知识,然后再去做项目。你掌握的技术多了,创建项目的时候,考虑的维度和深度也就到位了,具备了整合能力,所以再去做项目,基本上就可以驾驭了。

下面我来说一下,怎么选择学习方向。很多同学感叹,现在技术太多了,听上去都挺重要的,自己好像都快追赶不上了。这就需要我们抓大放小,利用有限的时间,多学习关键性的技术。

比如说技术体系里面,速成的是前端和Python方向,慢成的是Java方向。各位擅长Java的小伙伴,也都发现了,Java领域太复杂了,学起来太累了,那我们学习Java的意义何在呢?不如搞前端或者学习Python去了。其实从后台转前端和移动端,很容易;转到大数据领域也不难。但是从前端往后端转,就很困难,至少我身边前端工程师转型做后台开发的成功案例很少。所以我建议,大家在选择学习方向的时候,应该先从后端开始。

大上周有同学问我,该不该学习一下GO语言。我觉得这是一个典型的普遍性问题。面对一个冉冉升起的语言或者技术,很多人都觉得自己不应该落下。但是理性思维告诉我:抓大放小,先学习主流技术。你不妨问问自己,GO语言是不是主流语言?GO语言的就业市场有多大?GO语言的资料多不多?GO语言工程师月薪是多少?GO语言职位在北京有多少,Java工程师职位有多少?一路追问下来,虽然你感兴趣GO语言,但是还是得把学习的注意力放在主流的语言上。编程语言的老大哥Java语言,你学透彻了吗?

如果把需要研究的后台技术,排一个先后次序的话,无疑应该先从数据库开始。我知道你会用MYSQL,会写CRUD语句,这些还都太初级了,钻研的深度不够。比如说我们经常编写表连接SQL,数据库可不会按照书写的顺序去连接数据表,优化器会筛选出数据最少的表,优先查询,因为结果集数量比较少,所以连接大表的速度会很快。

当然了,这是理想的情况,有的时候SQL语句里面带上GROUP BY或者ORDER BY之后,优化器对SQL的优化就出问题了,不是小表驱动大表,这就需要我们在SQL语句里面添加STRAIGHT JOIN关键字调整表连接的顺序。一直以来我都保持手写SQL语句的习惯,对于Hibernate跟MyBatis Plus框架提供Criteria操作方式,一直都不感冒。

这些只是SQL层面的事情,还有数据库架构层面的事情。想去BATJ工作,写代码不懂得从MySQL集群中提取数据,怎么能行。所以作为一个大厂的后端程序员,操作数据库集群是个必备的工作。然而数据库集群的SQL语句跟单实例MySQL差别又很大,不能按照原有思路去想问题。

举个例子,在数据库集群中跨分片的表连接就很难实现。在水平切分的场景下,数据被切分到不同的数据库分片中。A分片具有客户表和订单表,B分片也有客户表和订单表。如果李强的客户记录被切分存储在A分片的客户表里面。李强开始在电商平台购物,他的订单如果有的被切分到A分片的订单表,有的被切分到B分片的订单表。如果这种情况下,你要查询李强等人的购物记录是不可能的。无论A分片把数据传给B分片,还是B分片把数据传给A分片做表连接,都要在网络里传输大量数据,而且查询的速度又很慢。所以就要在数据库中间件上配置父子表,客户表是父表,订单表是子表。子表的数据跟随父表,被切分到同一个分片里面。

比如李强被切分到A分片,他的所有购物记录都被切分到A分片。如果陈浩被切分到B分片,那么他的所有购物记录就连带着被切分到B分片,这样我们做表连接的时候,就不用跨分片了。分片内做表连接就能查询出数据,然后两个分片的数据汇总到MyCat,做一下合并就可以返回给客户端了。

还有就是冷热数据分离方面的事情,InnoDB引擎数据超过2000万,读写性能会很差。即便你加上很多索引也无济于事。所以我们要定期缩表,比如把1年以上的数据转移到归档库。如果冷数据也很重要,那就用TokuDB存储,带着事务写入速度是InnoDB的7-11倍。如果不是重要数据,扔到MongoDB里面就好了。

数据库是所有项目的基础,大部分人每天写程序都是围绕数据处理展开的,所以我建议你第一年应该彻底把数据库研究明白,看SQL语句优化、数据库参数优化、Replication集群、PXC集群、MHA集群、分布式事务等等。想了解这部分知识的同学可以看一下我的两门数据库实战课。

《阿里新零售数据库设计与实战》

https://img.mukewang.com/5d4baa3d000165fd14760454.jpg

《MySQL数据库集群-PXC方案》

https://img1.mukewang.com/5d4baa670001fcce14590451.jpg

吃透MySQL方向的前提下,有多余时间可以研究一下MongoDB、Redis之类的。Oracle、PG数据库之类的,非主流的数据库尽量少碰,节省时间学习下一个阶段的内容。

当你成为数据库专家之后,下一个要攻克的是编程语言跟设计模式。我知道大家会Java编程、有的人还会Python、PHP什么的。我在工作中经常能遇到有的程序员明显对一门语言的API掌握的不够。

举个例子,有很多人知道Java语言里面调用Math.random(),能生成一个0~1之间的随机数。但是更多的人不知道,ThreadLocalRandom.current().nextInt(1,100);可以生成1~100之间的随机数。

再比如,所有编程语言里面的浮点数运算都不精确,Java里面用BigDecimal来做精确的浮点数运算,那你搞懂了为什么BigDecimal的运算就一定精确呢?所以这个阶段,我建议同学们花上3个月左右的时间,查缺补漏,彻底搞明白一门编程语言。将来在笔面试的时候,基础知识牢固,对你是一个很大的加分项。

另外我说一下设计模式的问题。这个一定一定要认真学习。有不少人,是在学习完框架之后才去看设计模式。我建议在学习框架之前看设计模式。Struts、Spring、MyBatis、Hibernate都用了大量的设计模式。包括很多公司私有的框架,也都使用了很多设计模式。如果先有设计模式的基础,学习框架会更加透彻。

我这里就举工厂模式的例子。工厂模式每个人都会写,看似简单,实则意义非凡。工厂模式不就是创建对象的么,比我直接new对象复杂多了,我干嘛要用工厂模式呢?那么多框架都是用工厂创建对象,是不是设计者脑子进水了,你们不会直接new对象么?

初学者这么想问题也比较正常,如果你了解设计模式,那就到了“看山不是山,见水不是水”的境界了。工厂模式最大的好处就是可以对调用者和被调用者解耦。

如果Person类里面直接new了一个Car对象,那么Person类跟Car类就产生了强耦合关系。

在没有SVN的年代,改代码最好的办法是做一个子类,在子类中修改代码。这样就形成了代码版本的升级(较为原始)。如果直接在当前类修改代码,代码覆盖之后,将来就没法找回上一个版本的代码了。

https://img3.mukewang.com/5d4ba32f0001fe1204700377.jpg

你也知道,平时我们不能不修改代码。如果代码是强耦合的关系。你创建了CarSubVerion_1这个子类,还要去修改以前所有new Car对象的对方。改成new CarSubVersion1。没过几天你又写了CarSubVerion_2这个子类,接着还要修new对象的代码,你说多麻烦。

https://img4.mukewang.com/5d4ba4ba0001190504880428.jpg

如果使用了工厂模式,工厂方法的返回类型是Car,至于说返回的是Car对象,还是CarSubVersion_1或者CarSubVersion_2,Person类根本不知道。某天,你写完CarSubVersion_3这个类,只需要修改一下工厂方法的XML文件,从此以后Person类从工厂方法获得对象就是CarSubVersion_3。

你仔细看,随便插拔一个Car子类,对于Person来说不需要修改任何代码,其他依赖Car的地方也不需要修改。我们只需要集中修改工厂类的XML文件即可。这样就把原来分散的强耦合,变成了松耦合,集中到了工厂类身上,维护代码的时候只需要修改工厂类XML文件即可,这样维护程序的工作量就小多了。每个框架为了自己的可维护性,都是用工厂来创建对象的。

工厂模式的另一个好处就是创建对象之后,可以初始化对象,变量怎么赋值,你可以自己在XML文件中规定。省去了我们自己初始化复杂对象的麻烦过程。

了解了这么多,你觉得new对象跟工厂模式比起来是不是low爆了。那么以后所有的对象都用工厂类去创建行不行呢?也不行。如果有的类,需求已经固定,不会再变了。将来它不会再派生出version_n,那么我们就直接new对象,出现强耦合又有什么关系呢?像是Java API中类,不会发生变化,所以我们直接new对象就好了,根本不用工厂类去创建对象。

Java有23种设计模式,都是精髓中的精髓,我建议你用两个月左右的时间去吃透这些设计模式。你再去看Spring框架,它不就是用工厂模式去整合各种技术么,一下子就顿悟Spring了。

讲到Java语言,我不得不提一件事情。很多初学者都闹不清楚的一个问题。上学的时候,老师告诉我们设计程序要优先用抽象类或者接口去建模。我怎么觉得,写程序不写抽象类跟接口,也能行呢?那么抽象类跟接口是不是摆设啊。“老师,你让我们用抽象类跟接口去建模,我觉得没有必要,你这是照本宣科,不是实干做派,实际写程序根本用不上抽象类跟接口。”

年轻人,我觉得你是没有体会到程序设计的美感。抽象类跟接口就很美,可惜你没体会到。我简单说几句。抽象类跟接口解决的是并发编程的问题,你先记住这一点。我来慢慢跟你解释。

比如我家里现在来客人了,我跟妻子说,你把冰箱里的苹果、香蕉和橘子拿出来,招待一下客人。我这么说的前提是,我要先打开冰箱,确认这里有苹果、香蕉跟橘子,然后才能跟妻子说上面的一番话。两个动作变成了依赖关系,先打开冰箱确认之后,才能跟妻子说话。

如果我把具体的苹果、香蕉跟橘子抽象成水果这个概念,我跟妻子说,你把冰箱里的水果拿出来招待一下客人。水果是抽象概念,我用抽象指代具体水果,所以我就不用打开冰箱门,直接就可以吩咐妻子做什么事情,这不就产生了行为上的并发么。我不用等什么东西,先用抽象指代一下,我接着做我的事情就好了。

两个人写程序,甲要调用乙写成的代码。想要并发编程,乙把自己要写的程序,先定义成抽象类或者接口,发给甲不就行了么,甲就可以写程序了。你看这才是抽象类和接口的真正意义所在,刚才我让你记下,抽象类跟接口是解决并发编程的,你仔细想想,是不是这么回事儿。(PS:这里应该有掌声,我就当你鼓掌了,呵呵)

有的同学还不死心,“我不写抽象类跟接口也能写代码?没觉得抽象类跟接口有多重要。”

同学,你自己一个人写程序,当然不需要定义抽象类跟接口了。没人跟你并发编程。不妨你试试团队开发,少了抽象类或者接口行不行。(PS:再次鼓掌)

接下来说一下框架阶段,集中精力学好Spring、MyBatis这两个框架就行了。Spring体系,上周有老师分享过了,这里我就不细讲了。

MyBatis框架也不难学,但是我对Criteria操作保留意见。

学完框架,再简单了解一下常用的第三方组件技术,比如说各种项目都能用到的权限框架,你可以学习一下Shiro之类的框架。还有报表组件、任务调度、Excel开发包、工作流引擎、全文索引等等。

以上是夯实后端技术的一个整体计划,我知道这个群里面的同学,多少都懂一些技术。我列出的学习计划仅供参考,你觉得那里不行,就重点学习哪里。比如说Spring你很熟悉了,不妨去看看设计模式。

实施学习计划的时候要两耳不闻窗外事,不要管前端、Python、人工智能、大数据怎么发展,大家要坚持自己的学习计划,先稳扎稳打,努力成为后端领域的专家。然后你再往前端、大数据、Python方向转型也来得及,而且还很容易。

有一些同学面临抉择,我现在已经精通后端技术了,下一步应该学习大数据、人工智能还是前端呢?趁着年轻,先挑战最难的?前端最难。你没听错,前端确实很难。难在你无法设计出精致的界面。我见过太多的后端人员,要么界面设计的超级丑(EasyUI、BootStrap),要么就是不会设计界面。这个短板你一定要补齐。

35岁是开发人员都要面临的一个门槛,在35岁之前尽量争取做到行业翘楚。如果做不到,退而求其次,你也得做一个万金油,各个领域都擅长。

比如说之前江苏卫视有一个24个女人跟两个光头男主持人的相亲节目。男嘉宾刚上台,没有什么权利可言,被24个女嘉宾指指点点,品头论足一番。如果男嘉宾能坚持到最后,熬到权利反转的时候,你就有权利选择跟那个女嘉宾牵手离开。

https://img4.mukewang.com/5d4ba68e0001a9e110240768.jpg

在职场里,你的技术就是你的议价权。我建议大家在35岁之前,要补齐自己的技术短板。对于公司而言,既可以把你调往前端组,也可以把你调往运维组,你的使用价值远远高过其他员工,所以即便到35岁,你依然可以活跃在IT行业。而且技术全面还有一个好处,就是可以再往上做到架构师或者技术总监的职位。

选择技术专才做为技术总监或者项目经理,经常会出现很多事故。比如说甲方周末打电话给你,有个模块的需求发生改变了,要你评估一下,开发周期跟开发费用是不是有变更。如果你只擅长前端,周一开会的时候,问了一下Java组的人,他们说这个需求的两三天就能做完。然后你就是这么回复给甲方客户的。

实际开发的时候,数据表一改动才发现,好多模块的VO、PO、SQL语句、业务层都要跟着改,然后还要跑一大堆测试用例。这下可坏了,没法按时交付了。作为一个技术领导,技术不可以有短板,你才能可以带好整个团队。

下面我说一下前端的学习计划。都知道前端的技术挺杂,而且更新速度还很快。

传统的HTML/CSS/JavaScript,学习资料很多,重点学习一下CSS的排版布局。动画特效方面,我认为没有必要去重点学习,毕竟还有UI工程师不是么。JS可以深挖一下面向对象、Prototype、事件冒泡处理等等。

JQuery可以作为过度阶段了解一下,重点学习一下Node.js还有VUE,这两个是前端的重点。其他的像什么React、AngularJS有时间可以看两眼,没时间就略过。

掌握前端之后可以了解一下移动端,Hybird模式用的基本也是前端这些技术,所以学习起来并不困难。UNI-APP移动端框架不错,可以把VUE工程编译成微信小程序、支付宝小程序、APP等等,可以学习一下这个框架。比如说我上架一门《七夕告白神器》的课程,里面就用到了uni-app框架开发微信小程序,价格只有1元钱,作为简单的移动端入门小案例,你可以看一下。

https://img4.mukewang.com/5d4ba7080001569707501334.jpg


下面是这门课程的链接地址,各位同学可以去观看一下:https://www.imooc.com/course/introduction/id/1148

说过了应用层面的技术,第三阶段,我建议你认真学一下系统级的技术,因为这些技术对设计架构很用用处。初级一点的比如说Linux系统、高级一些的像什么Docker、K8S都要学习一下。

架构层面可不是什么人都能进入的,你完成了这个阶段的学习,基本上给自己打造了一个别人无法介入的技术壁垒,以后就不存在职业危机这种事情了。这就是我们多年辛苦奋斗和学习所要达成的最终目标。

接下来我说一下怎么去开发一个企业级的项目。这个QQ群里面,有的同学已经步入开发岗位了,有的同学还在学校里努力学习。工作了的同学,拿到业务需求相对简单一些。没有参加工作的同学,要想参与企业级的项目,只能先找一个参照。

在校的学生选择模拟项目的时候,尽量选择跟钱无关的项目去做,比如说新闻类的项目、信息聚合类的项目、招聘类项目、某某管理系统等等。因为只要跟钱沾边,申请移动支付的资质你不具备,再者跟钱有关系的项目,技术实现上要求都很苛刻,你写在简历上,面试官会问的非常详细,所以在校同学最好不要选择跟钱有关系的项目。

作为在校学生,自己不了解需求的情况下,自己去设计一个模拟项目,还是比较困难的。所以你可以在网上找到很多云端的体验版本的管理系统。比如说有一个云端软件,叫做易订货。这是网址,可以在线体验。https://www.dinghuo123.com/

https://img1.mukewang.com/5d4ba76d000128de19201028.jpg

https://img1.mukewang.com/5d4ba76d000149db19201028.jpg

https://img.mukewang.com/5d4ba76c00014e2a19201029.jpg

https://img.mukewang.com/5d4ba76e000110fd19201030.jpg

大家可以看这几个截图,老司机们,看到菜单列表,基本上就明白这个进销存项目的业务模型还是比较完整的,而且它还有移动端,你也可以体验一下。或者说,你找到别的在线体验项目,觉得不错也是可以的。

挑选好模拟项目之后,先使用一个礼拜。你在这个系统上不断的做业务,熟悉整套系统的业务模型和流程。我们只不过是把网上的业务模型拿过来而已,程序实现还是要我们自己动手完成的。你可以把学到的各种技术,在模拟项目中整合到一起。写程序不要模仿极限编程。你在敲代码之前,先要做好充分的设计。因为是做逆向工程嘛,可以免去Axture原型设计。先画用例图,这个过程可以帮你理清思路。系统用多少个模块,每种角色可以使用其中哪些模块,角色之间的权限是怎么继承的。然后要画部署图,你这个项目打算部署在什么样的服务器上面,用几个节点,使用什么样的负载均衡。根据自己本地电脑的硬件条件,规划好部署方案,然后才能去搭建项目架构。

比如说,数据库我们采用的是Replication集群,做了两个4节点分片(集群)对数据切分,用MyCat管理,而且还做了读写分离。用Zookeeper存储MyCat配置信息,两个MyCat做双机热备,争抢虚拟IP。一个MyCat宕机,另一个MyCat立即投入使用。并且全局主键也是用Zookeeper来生成的。

如果是跟钱有关系的项目,重要的数据一定要存储在MySQL的PXC集群中,那就是另外一套数据库集群的方案了。不管怎么说,数据库平台搭建出来之后,接下来就应该是对业务数据建表了。我让你熟悉了一周的业务,建表应该不成问题。这个阶段是一次性集中时间把所有的数据表都创建出来。反复修改表结构的痛苦,大家都知道。所以设计数据表就一次成型,以后尽量不要再动数据库的表结构。

再往下就该搭建项目了。我不建议大家把大量的时间花在项目搭建上,没必要重复发明轮子。我们可以借助开源项目,做二次开发。比如说人人网开源了一个renren-fast项目。是前后端分离的结构。后端用的是SpringMVC+MyBatis,还集成了Shiro、Swagger、Jwt、Druid等一系列第三方的组件。

https://www.renren.io/community/project

https://img4.mukewang.com/5d4ba8070001192b03380578.jpg

我对比过很多开源框架,只有renren-fast做的最好。它自带了一个代码生成工具,可以根据数据表来生成DAO、Service、Controller代码,而且还可以自动生成前端的VUE画面,如下:

https://img2.mukewang.com/5d4ba82a0001addb15000819.jpg

https://img4.mukewang.com/5d4ba82a00014ba916480658.jpg

https://img4.mukewang.com/5d4ba82a0001d01416960878.jpg

https://img3.mukewang.com/5d4ba82a0001c89916460768.jpg

我们把生成的代码拷贝到工程里面,这就省去我们70%的工作量,开发效率也就提高了很多。

renren-fast不是微服务项目,只是一个前后端分离项目。但是我们可以把它做成分布式的项目,以后部署的时候,把后端项目组成集群,用Nginx或者Haproxy做负载均衡。加上Keepalived技术,Nginx或者Haproxy挂掉一个也不用担心,冗余的Nginx马上会上线。

Java项目搭建出来之后,因为还要使用缓存,所以配置一套RedisCluster集群出来,然后对接到Spring Cache上面,让Spring管理缓存。

写模拟项目的时候,就跟正式的项目开发一样。日志文件正常生成;防止XSS攻击,数据要转义后再存储;有审批的地方,就引入工作流。需要任务调度,就用QuartZ。

renren-fast前端用的是VUE+ElementUI,都是常用的前端技术。而且页面已经生成的七七八八了,你往里面再添加点东西就可以了。而且renren-fast生成的VUE页面里面是包含了权限判断的。权限不够,根本看不到VUE页面的内容。

综合来看,如果数据库平台已经建立起来的条件下,我自己写一个普通的管理系统,一个月左右的时间吧。

如果你来写一个管理系统,边查资料边写程序,三个月左右差不多能完成一个管理系统。前提是数据库一定一定要设计的合理,要不然你这个项目总是推翻重来。

如果是已经工作的同学,直接可以把你当前项目的需求拿过来,然后把它改造成微服务或者分布式架构的,再实现一遍。因为是模拟项目,所以技术的取舍完全由你来把控,各种厉害的技术都往上添加吧。

项目做完之后,就到了部署环节。MySQL、Redis都已经集群了,后端项目也要集群,然后做负载均衡,前端前端项目也是如此。

我不建议大家把模拟项目部署在云平台,分布式架构的项目需要很多云主机实例,配置还不能低了。为了省钱,大家还是在本地用VMware搭建虚拟机环境吧。给自己的电脑多加一条8GB的内存,也就是200多块钱的事情。

在面试的时候不用跟面试官大吹特吹自己会多牛的技术,容易招致反感。首先你从包里掏出设计文档,交给面试官过目,他看到你写的需求文档,还包括用例图、流程图、部署图、状态图,ER图,对你的第一印象会比较好,起码项目是真实做过的,而不是“包装过”的。

接下来,你打开笔记本,演示一下你的项目。当场挂掉几个数据库节点、Redis节点、Java节点和前端节点,然后再访问这个Web系统,依然可以正常使用。于是你就可以跟面试官聊一下,你这个项目架构是怎么设计的。

这么一套流程走下来,基本上offer就到手了。大家记住,在面试的时候一定要演示自己项目,切记切记。

之前我在咱们群里说过,曾经我项目组里面有个实习的同学,读的只是个普通的211学校,高校排名90多,几乎相当于一本B段的学校了。2015年实习期满,去北京投了几家公司,大半天时间去了百度、京东、用友面试,当天就拿到这些公司的offer,然后又去了中石油旗下的中油瑞飞面试,也顺利的拿到了Offer。

他说面试的当天,都是清华、浙大、交大、复旦这些学校的人,而且研究生还占了一大半。之所以中石油这么受欢迎,因为入职满五年就可以落户北京。他等到面试的环节,按照我说的,把项目演示了一遍,于是就拿到了Offer。这是他签完offer之后,在微信上跟我的聊天。

https://img2.mukewang.com/5d4ba91c000192fd07201280.jpg

所以你看,学历没优势,技术够强悍,依然能脱颖而出。去BATJ大厂面试,仅凭一门技术是不行的,要精通多种技术,并且精通Linux系统,能熟练驾驭项目集群架构。如果你具备这些,对于BATJ的HR来说,你每天思考的程序,就是BATJ这些程序员每天做的事情。录用你,基本上不用什么培训,短期就能上岗。进BATJ这些还是很容易的,但是你磨练技术的过程是艰辛的,努力吧!

这么多年,从我项目组离开的实习生基本上都进入到世界500强企业工作了,以下是这些同学的反馈。

https://img3.mukewang.com/5d4ba9430001cb3102490443.jpg

https://img.mukewang.com/5d4ba944000144df02500443.jpg

https://img3.mukewang.com/5d4ba944000160eb02490444.jpg

当然了,慕课网上的讲师都有很多优秀的就业案例,只要同学们跟着老师们认真学习技术,都能进入到名企工作。

接下来,我谈一下第一份工作应该选择创业公司,还是大型名企?这个问题,想都不用想,往名企努力。如果你一上来就选择去小企业工作,三年之后,技术提升的并不大,再想去大企业工作,难上加难。年纪大了,成本比应届生高,但是技术水平并不比应届生高多少。小企业往大企业跳槽真的很难,建议大家,听完今天的分享,奋发图强,抓大放小,利用有限的时间学习更多的技术。

今天的主题是怎么样掌握企业级的技术,我列出来一个学习计划,把企业级技术融入到平时学习的过程中,而不是在模拟项目中学习企业级技术,那样你永远是推翻再重来,既浪费时间,又没做出来什么东西。

这次分享,我是在战略的层面介绍了一下学习的路径。虽然没有像上一个讲师那样,深入讲解某一个知识点。但是战略层面的东西往往更加重要。

比如说楚汉相争,项羽在战术层面上,每次都赢了刘邦。但是形势对自己却越来越不利,人心跟地盘都在往刘邦那一方聚集。最后一战,终于输给了刘邦。

说这个例子是想劝告大家,你距离35岁职业危机的大限时间是有限的。你不能在这期间胡乱学习技术,时间浪费了,就再也找不回来了。按照我规划的路径,抓住这些核心技术,找准战略目标,几年之后你也能成为公司里的技术大牛!好了以上就是我这一次的技术分享,感谢大家的支持!

打开App,阅读手记
107人推荐
发表评论
随时随地看视频慕课网APP

热门评论

老师能分享下如何学习设计模式,还有就是并发相关的内容…

无敌 这是我买过最值的一门课

请问老师的个人博客是什么多少?

查看全部评论