研发十年-成长之路

序言:

还记得十年前,口袋里揣着1000块钱与同学一起坐着硬座绿皮火车,用了20多个小时从青岛来到上海,8个人合租着潮湿透风的房间,每天吃着街边苍蝇小馆中的蛋炒饭,拿着一个月不到2000块钱的实习工资,梦的起点总是辛酸并快乐着。

        十年后的今天,我又要离开这个充满挑战和机遇的城市,去另一个梦的起点。我用生命中最有活力的十年换来了车房妻孩,我不认为自己是成功的,因为以我现在的视野回首这十年如果再让我重新来过,我应该能走的更好。一个只懂Java开发的小伙子,缺少了指路人为我领航,虽然每份工作都做的很努力,同事和领导对我的评价都很高,但是到现在我仍然觉得自己不应该只是这个高度。

        选择比努力更重要!埋头干活只是为企业创造价值,但是自己的价值要靠自己额外的时间去补充和提高,选择的前提是要有足够的视野,要知道自己处在领域的哪个位置,最新的技术进展是怎么样的,给自己一个合理的职业规划,剩下的就是利用业余时间去努力吧。

        本文写给10年前的自己,也写给跟我一样曾经迷茫过和迷茫着的程序员们,如果大家觉得有收获,帮忙多多传播。

        

 

产品鸟瞰:

从层次上分,我把它拆分为4层,这种分层结构大家都不会太陌生了。

1最底层为基础层;

2上面运行着HaddopDB、内存、MQ等划分为一层作为组件层(组件可能是运行在容器上的,也可能直接运行在虚拟机上的);

3核心产品这一层就代表着企业软件开发人员基于自己擅长的语言进行开发实现的产品了;

4产品做大做强后就会出现最上面一层,首先为了与其它企业或产品对接要做一些列的安全机制并暴露在公网中,基于现有的数据可以做人工智能方面的文章来提高产品的“逼格”,甚至推出Daas服务。

下面我会一层层的进行更详细的描述,不过顺序会变一下,我会站在软件开发人员的视角,以自己的职业发展曲线来逐层分析。

 

 

开发语言:

掌握一种语言是远远不够的。作为软件开发人员,语言就是生命。或者说语言的生命周期就是程序员的生命周期。我们很幸运,也很迷惑。

 

我们很庆幸,作为 IT 从业者赶上中国的这波互联网高潮,而且我们选择的 Java 语言经过了 10 个大版本依旧屹立不倒,这口饭让我们吃了很久。但是随着各种新语言的兴起,可以预料 Java 语言已经不再具备绝对优势,现在是多足鼎立、百花齐放。作为软件从业人员还是要多为自己准备些退路,多掌握一门语言,多一条腿走路,就会走的更稳。我推荐除 Java 外要掌握 Python C or C++ ),因为有了这三种独立风格的语言基础就可以涵盖 IT 界的所有热门技术的学习。

Java,无需多说,强类型语法的面向对象编程,在客户后端产品自研发领域独一份,从JDK1.4开始崭露头角,JDK5.0 Tiger奠定老大地位,到现在已经是JDK10,经历过这么多年这么多版本的迭代,可谓是后端开发的常青树。但从JDK8开始逐渐向脚本语言倾斜,渐渐抛弃了Java初期的一些原则,可见新技术对Java的冲击很大,Java为了生存不得不做一些妥协。

 

Python,目前版本还不是太稳定,3.X2.X之间的向下兼容做的可以说是惨不忍睹,但是它凭迷人的语法与丰富的扩展包现如今已经让人痴迷,伴随着AI领域近期的兴起,python被推向了一个前所未有的高度,可以说按这种步伐发展下去挤掉Java老大的地位也就是时间问题。当然了,python也存在致命的缺陷GIL,因为GIL的存在使python在处理CPU密集型运算时基本是个废物,这个处理不好在后端开发中很难与Java抗衡。

 

C/C++,这头远古神兽可以算是PythonJava的爷爷辈和太爷爷辈了,而且存活到现在因为其效率上的优势依然在软件开发行业占据不可替代的地位。它可以作为孙子们的虚拟机实现语言,它也有自己很多例如Redis之类的明星产品,其它嵌入式、Linux方向的应用几乎是垄断的,而且过去几年云计算、虚拟化、容器化的发展,又让这远古老怪的地位得到了飞升。

 

多学习一种语言,就相当于多了一门手艺,这门手艺不仅用来写程序,更重要的是用来读程序,有了语言基础才能看得懂新技术的源码,否则永远是个埋头苦干的码农,不知道利用自己的已经有技能去pick up新的能力。

 

如果你实在不想去学习其它语言,就抱死Java一棵大树,那么以下是你必须要掌握的:

Java+Spring Framework+DB+MQ+Redis+Docker,这套组合构成了核心产品。必须要学好Hadoop,按顺序必学的有MapReduceYARNHDFSSparkHadoop生态圈的其它模块根据需要和兴趣自己选学。Spark利用缓存解决了Hadoop性能慢的问题,在数据挖掘和机器学习领域有举足轻重的地位,所以一定要掌握Spark,核心思想是RDD+DAG


 

 

网络安全:

网络安全的出现是好事情,代表着你的产品已经做大做强,吸引到更大的流量,寻找到更多的合作企业和产品,你只有强到足够亮眼才会被bad guy盯上,要获取更多的数据必先解决安全问题。

Http协议是基础,因为只有弄明白Http协议才能明白这种设计有什么漏洞,也才能明白解决手段是什么原理。

先看几个没有安全机制时http的漏洞:


为了解决上述问题,最有利的武器就是Http+TLS

Https就是为了解决上面4张图片中的漏洞而生的。前提需要掌握对称加密和非对称加密,以及其各自的优缺点。还需要了解散列和加密方式。握手生成密钥的过程是重点。


我写过一篇更详细解释Https的请参考《https://blog.csdn.net/yejingtao703/article/details/78723276

 

解决好安全问题后,产品进一步做大,同一个企业会产生很多子产品,而这些子产品之间需要做统一的用户管理,这就需要引入SSO单点登录了。

 

企业继续做大,要与其它合作伙伴分享服务,就会出现OAuth2.0了。OAuth2.0是平台与平台之间暂时性的获取部分能力的解决方案。

 

无论是SSO还是OAuth2.0都大量使用Token这个概念,因为没有不透风的墙,再严密的安全设计也有被攻克的可能,Token代替账户本身的鉴权在网络中传输,就算Token被破解也是暂时性的,因为Token是有生命周期的,可以将危害降到最低。

 

 

人工智能:

产品并不是核心价值,数据才是核心价值,基于数据的分析才是核心竞争力!

语言:python/C++/matlab/R语言

好的基础层à好的核心产品à更多的数据à更精准更智能à更好的客户体验à更多的数据à良性循环

机器学习与神经网络就是理论派与经验派的对决。

机器学习是根据场景套算法,修改参数进行调优,可以在较少数据时获取很高的实用性;

神经网络是根据经验数据每个网元用最简单的算法来反向优化网络参数,数据越多越精确。

PS:数据越多对机器学习效果的提高也很明显,神经网络更依赖数据。

 

机器学习:

机器学习的步骤:

1收集数据

        砸钱、传感器采集、资料买卖等,搞到原始的数据资料。

2数据处理

        原始的数据不能直接使用,需要转化成数学模型,并对缺省值做基本处理

3训练算法

        根据场景选择合适的机器学习算法,并调整因子做优化,直到达到满意的精准度

4测试算法

        只针对监督学习才有该环节,利用数据集对训练算法的产出做准确率校验

5学习结果产出

        机器学习结果封装成可以直接投入实际应用的产出。

 

机器学习属于低级别的AI,拆分方式很多,我们这里还是按是否可测试验证来将其拆分为监督学习和非监督学习(按目的可以拆分为回归、聚合、概率等)

机器学习的算法都是来自线性代数、微积分、矩阵运算、概率论等高数内容,算法相对比较公开,谁拥有的数据集更多谁的的学习效果就更好。同时不能把机器学习理解为简单的算法问题,还涉及到数据收集、数据预处理、算法测试、学习结果产品级应用等范畴。

 

机器学习的常用算法需要参考具体的博文,有如下算法:

1 k-近邻算法,用于分类,寻找距离目标数据欧氏距离最近的k个样本中权重最大的那个结果为算法结果.

优点:容易理解,精度高,

缺点:空间和时间的复杂度高,计算量大.

2 ID3决策树,利用信息增益决定每一次的最优分路.

优点:可以将训练结果保存文档直接使用,可以直观的给出数据的含义.

缺点:过程不易理解,特性衰减过于迅速

3朴素贝叶斯,利用概率之间的关系对结果进行分类概率上的判断

优点:对数据较少时任然有效,可以处理多类别问题

缺点:对输入数据的准备方式较为敏感

4 Logistic回归,

优点:计算代价不高,易于理解和实现。

缺点:容易欠拟合,分类精度不高

5支持向量机SVM,利用支持向量求出超平面对数据进行二选一分类

优点:可以通过核函数解决线性不可分的数据,训练结论可以保存起来使用时节省时间。

缺点:设计理论太强非常难理解,核函数的因子、松弛度等参数需要人为干预。

6 AdaBoots元算法,利用串行的弱分类器组成精准度更高的强分类器。

优点:泛化错误率低,易编码,可以应用在大部分分类器上,无参数调整。

缺点:对离群点敏感

7线性回归,用线性找到最佳拟合直线,预测数值型目标

优点:原理易理解

缺点:容易欠拟合或过拟合,需要选择适当的拟合参数 

8分类回归树CART,对数据先分叉直到叶子节点再求预测值。

优点:原理易理解,可以对复杂和非线性的数据建模

缺点:训练产出不易理解,数修剪对预设值或者算法上要求比较高

9 k-均值聚类算法,将相似的对象归到同一个簇中

优点:容易实现,也容易理解

缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢,需要优化

10 Apriori关联分析,通过支持度和可信度分析数据间的关联关系

优点:精度高,适合与数据间可信度的计算

缺点:尽管Apriori原理减少计算量,但是计算量还是较大,对大数据处理速度不理想

11 FP-growth构建FP,FP树中挖掘频繁项集,多用于搜索引擎的关键字关联

优点:性能要比Apriori好两个数量级以上,可以高效地发现频繁项集。

缺点:不能用于发现关联规则

除此之外还有数据预处理降维技术:主要的降维技术有主成分分析PCA和奇异值分析SVD

 

神经网络:

神经网络理论上是与机器学习是平行的关系,都是人工智能领域的一种实现方式,而且在历史上两者此消彼长各自独领风骚数十年。

神经网络和机器学习所用的数学知识几乎是一样的,甚至神经网络更简单些,但是两者在原理上完全不同。机器学习是人类根据场景提前干预预置了精妙的算法,经过对算法中参数不断的调优来达到满意的效果;神经网络是是人类只负责搭建每一层的神经网络的网元节点同时告知网络正确的结果,节点上是Sigmoid等很简单的算法,通过网络规模来提高精度,同时通过预测值与真实值之间的cost function来向前Back Process网络上网元的参数,不断循环,直到训练出满意效果。

从原理上可以看得出机器学习需要复杂的算法,属于CPU密集型;而神经网络是大量简单运算,属于GPU密集型。GPU的发展使神经网络如鱼得水,而神经网络的发展又让GPU的价格水涨船高(游戏高玩勿喷)


神经网络按隐藏层数目是否大于等于3层,分为浅层网络和深度网络。

根据算法的优化由衍生出卷积网络,解决梯度消失的问题。

 

在人工智能领域Hadoop+Spark也是很实用的技术。数据集太大、CPU和内存资源不够等原因,在人工智能领域又用到了分布式计算和分布式存储。

人工智能领域,得论文者得算法,得数据者得天下

要进入人工智能领域需要技术栈:

高等数学(矩阵、链式求导、微积分、概率论、线性代数)、英语、Haddop+SparkPythonC\C++,matlab,R

 

我所能理解和掌握人工智能领域,包括上面的机器学习和神经网络,都是属于后端智能,有高延时、低效率等缺点,更高端的AI领域是AI芯片,这个很遗憾已经超出了我的知识范畴,有兴趣的朋友可以自己去研究下,本人确实没有接触过。

 

虚拟化:

在学习虚拟化之前必须要先掌握Linux,不止是Linux的常用命令,还要掌握KernelFile System、多租户安全、网络设置等,因为不明白Linux这些前提知识,学习虚拟化将寸步难行。

虚拟化从模块上来分,有CPU虚拟化、内存虚拟化、网络虚拟化、存储虚拟化等,从实现方式上来分有虚拟机和容器两种方式。

 

OpenStack是个很好的虚拟机虚拟化平台,模块有:

OpenStack的模块:

Nova:管理VM的生命周期,是OpenStack的最核心服务。

Neutron:负责创建L2L3网络,为VM提供虚拟网络和物理网络连接,是OpenStack最难的部分。

Glance:管理VM启动镜像,会被Nova调用。

Cinder:为VM提供存储服务,为VM提供Volume

Swift:提供对象存储服务,与Cinder看似功能上有重叠。

Keystone:为OpenStack的各种服务提供认证和权限管理。

Ceilometer:为OpenStack提供监控和计量服务,为报警、统计或计费提供数据。

Horizon:以上组件大部分都是API调用的,HorizonOpenStack用户提供了一个Web的自服务Portal,是OpenStack的控制台。

其中Nova是核心,Neutron是难点,Driver设计是设计灵魂。

 

Kubernetes是容器化平台:

容器平台与虚拟机平台在设计原理上有很多共同点,掌握了OpenStack再来学习K8s会有很大帮助。容器现在应用最多的就是Docker,学习Docker基本可以与学习容器挂等号。容器比虚拟机轻量、便捷、效率高,但本身也受到宿主机OS的制约,存在一定局限性。

 

运维保障:

回到鸟瞰中的那张图,其中所有细节已经都解释到位了吧,但一个成熟稳定的产品在这张图中还缺少一部分,就是运维保障。

运维保障一般包括:监控报警、故障处理、系统升级、应用发布、安全防控、业务监督等模块,整个保障体系不仅是单独对IassPass、应用某一层的保障,而是多层的全方位的监控,并根据自己的业务定制行之有效的策略。

 

为配合运维,也为了产品长期稳定的发展,在做产品架构设计时需要坚持以下几个原则:

1尽可能用成熟组件,被广泛认可和业界证明过的组件才是安全的组件。

2尽可能的拆分服务,粒度越细治理越灵活,产品伸缩性更好。

3尽可能的容错,没有无故障的产品,要在设计阶段把故障点都考虑到并做好高可用性。

4尽可能的自动化,产品服务节点体量上去后可以更好的管理产品并降低运维成本。

5尽可能异步和缓存,削峰填谷,降低延时,提高客户体验。

6最终一致性,配合上面3容错和5异步。

 

 

结束语:

本文强调的是视野,其中提到的技术细节在我个人博客中都有专栏在介绍,想进一步了解某一具体模块的可以参考下,博客地址https://blog.csdn.net/yejingtao703,当然这么广的领域很多东西我掌握的并不是很深,日后抓紧一切时间努力学习吧。

最近宝宝出世,我也更换了新的工作环境,来到了新的平台,想在智能运维领域发展下,争取在这一方向能留下自己一个脚印。所以后面要专心学习和养娃,等沉淀一段事件后再回来把自己所学的与大家分享。


评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值