写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二,希望对学习路上的你有所助益。同时,博主也想通过此次尝试打造一个完善的技术图书馆,任何与文章技术点有关的异常、错误、注意事项均会在末尾列出,欢迎大家通过各种方式提供素材。
本文关键字:2019、新年Flag、行业解读、技术重心、学习路线
软件正在向各行各业渗透,成为重要的商业竞争武器。软件正在释放不可思议的力量,新的软件产品和软件服务将改变我们的社会。
软件行业正在发生两件激动人心的事情,一个是面向对象编程,另一个就是Web。Web将实现我们盼望已久的梦想,计算机不再仅仅充当计算工具,开始承担通信功能。
Web将深刻改变我们的社会,网络销售的潜力巨大,网络将成为最直接的销售渠道,而且在网络上小公司与大公司看起来没有区别。
如果将来回顾计算机发展历史,Web技术必然成为重要的里程碑。它的潜力很大,会吸引更多年轻人进入计算机行业,Web为IT行业开启了新的大门。
以上的访谈发生在二十几年前,那个时候怕是笔者刚出生还没多久吧。。。但是每每回顾这篇访谈都会被震撼,同时也说明了Web所蕴含的潜力。时至今日,Web相关技术发展迅速,并且一直扮演着一个不可或缺的角色。
在WebApp成为主流之前是大家最熟悉的C/S架构,也就是以软件的形式直接来运行一个应用,需要进行配置和安装。那么对于开发者来说,每一个系统的运行环境都是不同的,针对不同的系统要做不同的适配,甚至于要使用不同的开发语言来实现软件的界面。
随着互联网的兴起,用户逐渐变多,个人计算机也完全的走入家庭。那么计算机也不仅仅为了娱乐和工作,很多只能在线下完成的业务可以在通过互联网在线上完成,如:购物,即时通讯等等。
同时,为了快速的实现一个业务流程,并且能在各系统上可用,那么最优的选择就是让用户通过Web浏览器来访问。开发人员只需要维护好服务端的业务功能和数据存储,展示的界面可以快速的开发完成,并且兼容性良好,这就是我们所说的B/S架构。
B/S架构能够为PC端的用户带来良好的体验,主要应用为:公司门户,电商销售,管理系统,包括即时通讯等。由于用户不需要下载软件,所以使用起来很便捷,但是劣势就在于无法达到像C/S架构软件强大的功能以及较高的执行效率。
移动应用的兴起的一个主要时间点是安卓系统的诞生。在此之前虽然各手机厂商已经推出了各种智能机,但是当时的手机应用几乎都是通过具有跨平台性的Java语言来开发的。而是否支持Java也就成了是否是智能机的一个最直接评判标准。
但是对于用户而言,各品牌的手机操作系统操作方式也有很大差别,比较有代表性的就是诺基亚的塞班系统,曾经一家独大。在那个年代,各大手机软件下载网站必须明确标出一个手机应用是否支持某一个机型,或某一个系统,安装应用也基本靠数据线。
在安卓系统诞生后,可以说有了一个参照和统一的标准。各大厂商也都是基于安卓封装了自己的操作系统,虽也有差异,但软件的兼容问题得到了根本的解决。紧接着出现的就是各大应用市场,在大多数情况下我们只需要关注安卓系统的版本就行了,而闪退问题一般就是因为兼容性没有做好。
当然,IOS一直是IOS,有着自己的生态,也保留了自己的一小部分市场,其他的手机操作系统已经可以忽略不计。所以移动App指的就是在移动端设备(主要是手机)上运行的app,使用安卓和IOS原生语言和工具来进行开发。
相较于PC端,手机端应用的最主要优势就是在于更加便捷,并且可以及时的收到推送消息,保证了实时性,提高了效率。那么对于应用开发,主要的发展方向就是:便捷、轻量、高效。
对于数据的存储也历经了长时间的发展,并且到了今天势头丝毫不减。随着数据量的不断增大,并发量的不断提高,如何能够保证稳定的前提下提高查询速度,并且提供更为科学的数据存储和检索策略是这一领域致力于解决的主要问题。
我们从已经诞生了数据库的时间点开始讲起,在数据库管理系统产生之前,数据都以文件的形式存储在磁盘上,非常不利于查询和使用。目前数据库主要使用的是关系模型,也历经了多个模型的演进。通过关系模型,我们可以相对容易的刻画出一个应用系统的业务逻辑,便于数据的存储与按条件查询等。
也就是说数据库管理系统其实也是一个软件,是一个可以帮助我们进行数据存储和管理的软件。数据依然是以文件的形式存储在磁盘上,但是这个文件是数据库特有的文件格式,数据库管理系统通过读写相应的数据库文件来进行数据的存储与查询。
数据库软件已经能够满足绝大部分软件的数据操作需要,但是由于数据量级不断增大,也慢慢衍生出了数据库集群,数据库分库分表策略等。而且另外一个主要特点就是只能处理文本类型的数据,对于图片、音频、视频等类型的数据虽然也能直接存储,但是并不提供分析功能。并且由于关系型数据库的特点,在进行性能提升时,会消耗较多的硬件资源。
随着技术的发展和需求的进一步提高,我们需要对已有的各种类型的数据能够进行分析。在这个时候,单单使用数据库已经不能够满足我们的需要了。使用数据库来完成基本的统计分析或者较为复杂的关联查询是没有问题,但是并不能够实现复杂的算法来预测,为我们提供一些决策上的支撑。
为了拥有更强大,更快速的数据分析功能,我们需要借助其他的组件。通常这些组件各司其职,并且具有较强的扩展性,可以方便的与其他组件进行整合。比较有代表性的就是NoSQL(Not Only SQL),ETL工具,大数据技术生态圈组件等。
通过这些软件自身的功能以及开发人员的工作,我们可以实现数据流程的自定义,生成企业领导层需要的数据报表,并且可以进行各种类型数据文件的处理分析工作。
云的概念从出现至今也有差不多十个年头了,从最开始的网盘数据存储服务,到现在完备的云数据库,云服务器,云计算资源等。所有的云产品都在践行着按量付费这一准则,就像我们去网吧上机一样,使用多久就花多久的钱,我们需要买下一台电脑就为玩那一小会儿吗?不,我们不需要。
云市场概念相信大家也都不陌生,在云市场中我们挑选的都是云产品。由各大服务商来维护物理资源,以租用的方式将这些资源提供给用户。用户不需要去机房精挑细选,只需要在网页上动动手指就可以获得自己所需要的资源。
比如,我需要将自己的网站发布到互联网,让所有的人都能够访问。那么我只需要知道部署一个网站的步骤就可以了,我需要什么?一个公网IP,一台服务器,嗯,那么我去云市场租用一台云服务器就可以了,剩下的通过远程操作来完成。相较于购买一台物理机,然后再手动配置映射到公网要省钱省力的多,我们只需要专注于我们核心要做的事情就好了。
云的出现对于数据分析的一些流程也产生了一些影响。虽然云端资源具有价格低,使用方便的特点,但毕竟是第三方提供的服务。当需要进行数据分析时,安全性应该得到首要的保证,所以上云的数据需要脱敏处理,不能造成数据信息的泄露。
数据上云的一大好处是按量计费,不需要购买和维护高昂的硬件资源。同时,计算结果也能够进行快速的共享与推送。
用户在使用一个应用后,会留下各种行为信息,如操作记录,日志信息。如果对这些信息加以利用,我们就能够辅助决策一个产品的功能走向,并且了解到用户喜好,根据人群来进行划分,进行合适的推荐,就可以达到增加用户粘性的效果,并能进一步促进用户消费,以提升效益。
虽然数据分析相关领域存在较大的人才缺口,各大高校也在陆续开设大数据、人工智能相关专业。但是大家还是需要根据自身的情况量力而行,毕竟这一领域的门槛还是比较高的。正确的做法是,在了解了整个行业的情况以及自身的喜好后作出一个较为详细的规划,不要过多的受其他人的看法的影响。当一个新的技术产生时,大家势必抱有过多的期望,进入过热期,这一阶段也容易获得资本的青睐。当实际操作后,发现有很多问题并不能得到有效解决时,就会进入低谷期,会引发人们的又一轮思考。当进一步确定技术的定位以及主流框架后,就会进入复苏期和成熟期。
别因时髦而加入,别因过时而错过
在对自己的学习路线做出规划之前,一定要先了解一下整个行业的发展趋势和重心。可以很明确的说,IT行业的初级人员已经接近饱和,想找到一份工作不难,但是想要找到一份好工作,你需要有一份披荆斩棘的勇气!
在前几年,我们只需要熟练的掌握开发语言的基础语法,框架的使用流程,基本上就可以轻松的通过面试,至少实习岗是这样。因为如果想要实现一个业务逻辑,主要就是靠增删改查,并不存在很大的难度,主要框架使用的熟练,就可以胜任这份工作。但是目前,重心已经逐渐向优化转移,之前很多架构师的工作也慢慢的要求中级开发人员,甚至于初级开发人员来掌握,因为这已经成为开发应用的一部分。
在实现功能的基础上,要进一步考虑用户体验,提升整个应用系统的响应速度。这就要求我们要掌握很多其他的组件,来达到优化的目的。
目前的人才缺口在于“优秀的开发工程师”,无论是前端还是服务端,大家一定不能松懈,要不断的提升自己。如果你不想走技术路线,那么多积累业务经验,转向管理岗位也是一个不错的选择,提升文档写作的能力也能为你带来加分。
在实现业务功能代码的基础上,我们要立身于产品来进行思考,数据的流向是怎样的?产品的模式是怎样的?主要面向的用户人群是什么?不要把我们可以积累的业务经验忽视掉。毕竟追逐技术是没有尽头的,技术的发展日新月异,唯有数据和产品是不变的话题。
笔者本身也经历了很多技术的变迁,只能说非常幸运,经手了几个不错的项目,也是逼自己了一把,学到了不少的东西。
全栈这个词,如今的我断然已无法承其重,毕竟我已经脱离了一线开发有些年头了,如今所使用的前沿技术我已经不能够驾驭。
全栈,指的就是掌握前端和后端的技术吗?远远不是。独立完成产品,这是一个什么概念?从需求分析开始,到概要设计,详细设计,产品原型,页面切图,界面实现,服务端开发,数据库存取,应用发布及服务器管理。是不是一个人完成的并不重要,但是缺你不可,你必须拥有全局性思维。
几年前的我,曾经做到过。还记得在夏天三十多度的北京,骑行来回20多公里只为复现一个bug,也就在那一次我知道了汗水真的可以让一个人浑身湿透。不得不感谢那个时候的自己,让自己成长了很多,一个人完成应用的开发直至上线部署和版本迭代升级。
也许大家都做着相同的工作,但是你一定要多问几个为什么,可以是技术上的,也可以是业务上的,这样你才能快速的成长。既然早晚要经历这些学习的过程,为什不压缩一下,让他早点过去呢?当你有了一定的积累,你就会发现原来学习并不是那么痛苦的,反而可以让你自己越来越有价值,越来越不可替代。
我在从事大数据开发时接触的项目是大数据建模平台,包含了数据分析的完整流程,并且整合了机器学习库。核心功能点包括:建模系统的基本使用(用户登录注册,部门及权限管理,通用的后台管理功能等),数据采集(数据库导入,文本类型上传,其他网络传输协议及文件类型),数据源管理(结构化及半结构化数据管理,数据预览等),数据清洗(数据去重,缺失值处理,分层抽样,数据过滤,数据合并等),统计分析(自定义数据流),数据挖掘(机器学习库常用算法),可视化展示(用户自定义图表)。
由于是师范出身,一直热爱学习的分享,从事培训也有近三年了,一直在不断打磨自身的知识储备。在这里想给大家的建议就是学习是一个没有尽头的事情,你对自己的投资也不终止于某一个时间节点。大学毕业,培训结束,投资就终止了吗?学习就终止了吗?当然不,所以即使现在觉得自己不够好,也不需要有过大的压力,过去的自己无论什么样,就让他过去吧。我们的每一份努力都是为了遇见更好的自己,一定不要输给自己。
在我刚刚从事培训领域时,也一样充满了不安,也对曾经的自己不够满意,但是这一切都应该通过努力去填补,只有这样才会越来越踏实,越来越有干劲。
以上说了这么多,相信大家对整个行业已经有所了解,并且顺带着给大家打了一针鸡血,应该足够让大家把剩下的内容看完了。
对于开发工程师,可以将学习分为以下三个阶段,如果想要从事相关的工作,基础和框架部分当然是必不可少的。对于优化部分,大家可以在工作后慢慢的学习。
这一部分主要打牢基础,大家可以参照我的知识简谱,会不断进行更新和完善,需要原文件的同学可以评论留言。核心内容如下:
目前以前后端分离模式开发的项目较多,主要技术架构为SpringBoot + MyBatis + Vue。对于服务端我们肯定要学习主流框架,但是很多框架工作原理的部分希望大家通过Servlet和SSM框架的学习来掌握,尽量不要跳过。
优化部分推荐大家养成看源码的好习惯,大部分情况下,很多数据结构都已经提供了相关的参数来进行优化。另外一方面就是关注线程与线程池,框架级别的优化方案。因为对于框架来说,我们只是一个使用者,只能通过项目开发来积累相关的经验,大多数情况下不会直接修改内部的源码(源码修改大神应该不会来看我的文章吧)。
大数据开发及分析领域的门槛相对较高,大家可以做一个长期的规划,用一到两年的时间完成转型。如果你还是一个在读大学生,是相关专业,那么你可能很幸运,因为专业名称对口。但是问题在于目前的教学体系并没有十分完善,和企业的真实需求相差较多,你需要合理利用时间,自我提升才好。
大数据开发的主要工作是使用相关的软件API来开发出一个产品,用程序的方式去控制大数据集群的各组件。用户通过界面来进行数据流的定义,以及查看结果。
所以如果从事大数据开发,你的编码能力是第一位的,但是对于数据分析的流程也要有所了解,换句话说就是要对数据敏感。
至于学习路线有很多资料,从Linux开始,以Hadoop体系为基础,不断的向外扩展,大家也可以关注我的博客,我会用一到两年的时间完整写出整个学习体系的具体教程。
大数据分析算是要求比较高的一个岗位了,因为他需要的不仅仅是扎实的数学功底,还需要多年的业务经验,才能够达到精准的数学建模。一般来说需要研究生以上学历,相关专业才可以找到一个自己较为满意的工作。
云计算侧重的是服务器资源管理与维护,是从Linux运维衍生过来的一个职位,所以Linux运维相关技能是必须的,同时要对数据处理流程以及服务器上各大数据组件十分熟悉,出现问题能够及时解决。并且能够根据服务器资源情况配置相应的负载,提出优化策略等。
ETL是一个较为传统的岗位,主要指的是对数据抽取、转换、载入的相关工作,一般会使用商业或开源的软件来实现 ,如:Kettle、SmartBI等。开发人员需要做的主要工作是根据业务要求,选定相应的数据维度(数据表的字段),撰写SQL或编辑数据处理流程,最终生成可视化报表,有事也需要进行少部分代码编写工作。
当我们进入到一个新的环境中,如何快速上手项目呢?以下经验供参考。
了解技术架构的目的是为了明确自己在闲暇时的学习方向,这很重要。毕竟当遇到一个不会的问题再去查还是有些被动了,虽然大多数情况下都是这么过来的。。。但是我们还是要化被动为主动,多去了解相关知识,便于快速的定位问题,找出相应的解决方案。
当我们拿到项目代码时,及时包的命名再具体,管理再规范,在新人眼中也是一坨。。。这是没办法的事情。在着手看代码之前,我们应该先了解相应的业务逻辑是什么,哪些部分是比较关键和复杂的,在进行功能优化和添加时需要特别留意的。
当你把项目成功运行起来之后,如果是你之前很熟悉的框架,那自然没的说,你已经可以开始投入工作了。但是如果使用的框架我们并不熟悉,那么我们就从最简单的功能开始,打断点,看代码之间的调用关系,是否有过滤器,拦截器,各种验证,具体查看包与包,模块与模块之间的关系,通过几个逻辑简单的功能先来梳理清楚,然后再开始写代码,这样至少不会一上来就头大。
对于如何突破自身的瓶颈,笔者有以下三点建议。
积极拥抱变化,这一点不用多说。但是如何拥抱?拥抱什么样的变化?是一个技术产生了就去学吗?当时不是,讲真你学不过来。
所以要做的第一个步骤就是确定目标,可以定时的去查看自己相关岗位的岗位职责,用人需求,当一个新的不认识的词出现在视野中后,就去调查它,记住先调查一下就可以。
第二步需要做的就是评估,新技术对自身的相关性有多高,是否与自身的发展路线吻合,毕竟岗位职责都写的宽而全的,想要找到工作未必要全cover住。
所以接下来就是看百度指数的变化,相关社区的活跃度,半个月或者一个月关注一次就好,每次也就花几分钟的时间,如果趋势不错,可以着手开始收集相关的学习资源了。
剩下的就看自己的时间安排了,觉得很有用,很好玩,自然挤时间也会去学的,笔者就不多唠叨了。
纵向深入指的是在技术上的积累和深入,横向扩展指的是业务与管理上的经验。不管大家喜欢哪一条路,总之,早做准备就好。
技能点就那么多,纵向点满,化身架构,从此伫立巅峰;横向点满,化身经理,从此驰骋江湖。
笔者认为对于任何一个行业,与人交流,积累人脉都是放在首位的,其次才是个人的能力。虽然作为开发者可能大部分时间都在电脑前,但是这并不冲突。在自身的社群中多交流,学会如何提问和如何解答也是一个重要的过程,也是一个锻炼情商,提升自己的重要步骤。
在交流中可以有很多意外的收获也可以发现自身知识的盲点,当然一个好的交流平台很重要,聊天划水就没有意义了,不要做无用功。