我为什么从工程转了算法?

一句话总结下:年龄大了,总想让自己做的事情有意义点,所以想让自己写的代码对产品有更多的影响、可衡量的影响。

1、我发现自己的JAVA开发和大数据业务处理对产品影响甚微

我自己工作快7年,工作主要有两个方向:

A – JAVA后台业务开发

来什么需求做什么开发,增删改查,接消息发消息,因为之前做的是公司商业运营部门的需求,面向公司运营市场人员,不直接面向普通用户,系统访问量特别低,往往一天几千个访问量很不错了,这也导致出去面试的时候别人问我系统QPS有多少,我真是不好意思说是不到两位数;

B – 业务大数据处理

现在做业务的都要看数据,毕竟数据能反映业务的状况,一旦涉及数据就不只是mysql里面的那些少量数据,往往需要查一下各个渠道来源的流量之类的,这就要去查公司级别的数据仓库,而他们每天的数据量每天几十上百TB,不用HIVE/SPARK这些大数据技术搞不定,但说到底就是SQL取数做个图表出来,出去面试人家问大数据建模方法论、怎样实现跨业务的统计指标统一我照样是一头懵逼;

虽然我知道JAVA的后台服务开发确实可以往后发展,但是我没有接触到高并发这些难度大的方向;而大数据业务处理虽然只是出了一些报表,但是我自己却没有分析报表的能力,报表也是老大们看他们根据什么数据拍了什么板我也不知道。

这两个方向都让我觉得有种不那么精准发展的感觉,如果我对别人说自己的职业发展方向是JAVA,恐怕别人会觉得你是随着业务走什么都得干,称作"方向"有点虚虚的,同时它俩都是非常间接的影响着业务,或者说影响很微小,缺少了那么点"意义"。

2、对数据相关的学习,让我关注到数据分析和数据智能领域

大数据领域这么的火,它真正的对产品业务有哪些影响呢?

上面我整理的图表是我的理解,数据仓库、数据报表其实都是基础技术,只是工具或者手段,属于公司的基础技术部分,这两层的技术其实就像在打造一把刀,然而刀怎么用却跟这两层没关系。

你跟别人说你是搞大数据的,被人怼你就是个取数的,你能反驳吗?

再往上层走,是数据分析,通过数据分析,能够发现产品的问题、发展的趋势等等,然后影响产品的往后发展,但是我们开发人员其实跟这层也没有关系,因为分析的目标是决策,而我们码农并没有决策权。

最上层数据智能,我指的推荐、搜索、用户增长等各个算法领域,搜索算法造就了百度谷歌、推荐算法造就了头条快手,用户增长领域是所有产品都要核心关注的事情,而这个领域,我们写的代码能真正看到对产品的影响,也能用线上点击率、购买率等真实有效的指标衡量。

所以数据智能这一层才是我想要的,也是我觉得可以定准的方向。

3、说是转了算法,其实是实现了算法在业务的落地

没有足够的耐心,真的读不懂算法论文里面的公式,到现在我也没法手推算法公式,不能算是真正的算法人员。

然而我却发现,我的目标是“让自己的代码给业务带来更多直接的影响”的话,潜伏在业务团队中、能快速运用成熟机器学习算法框架让算法落地上线产生线上价值,反而走对了。

听很多人都说过,现在缺的其实不是研究算法的人,而是将算法结合业务落地的人才,吴恩达在他的视频课程中提到,他讲的算法虽然很基础,但是能搞定80%商业公司的需求;

仍然在业务中做算法,实现在业务中的算法落地让我的代码真正产生对业务的影响才是我的目标,让我去专门的算法团队,一是我写不了算法公式去不了(哈哈),二是去了离业务远了点也违背了我的初衷。

4、其实掌握算法技能,本来就是搞工程将来必备的要求?

人恐惧的经常是对未知的恐惧,接触了算法领域,我才发现并没有那么的高深恐怖不可接触,各种机器学习深度学习框架,比如sciketlearn、tensorflow、paddlepaddle等,完成一个简单的CTR排序模型,只要简单的几十分钟就能参照教程实现训练。并且几乎所有的所谓算法人员,并没有从零实现一个算法发明一个算法,都是直接修改现成的模型代码,做各种的数据获取、数据处理、特征提取等事情。

体现算法能力能力高低的,变成了一是这个人是调参圣手,第二就是这个人能把算法很好的结合业务落地,数据智能这一层因为是顶层,会依赖大量的底层技能,下层的pingback、业务数据、数据仓库、数据分析、JAVA开发与架构能力等都需要涉及,如果团队人少的话(就像我一样)所有的事情你都得干,这一层其实需要极强的工程能力,这方面专门搞算法的恐怕没有工程出身的玩的好。

要将算法在业务中落地,更多的还是得靠工程开发人员,这方面也会越来越侧重,而专门的算法团队做一些基础设施、提供算法平台恐怕是更有可能发展的方向。

人工智能越来越火,算法框架越来越简单,学习成本门槛越来越低,等越来越多的工程都会算法,面试一个JAVA程序员时必问算法落地能力时,懂得算法就是一个程序员的必备技能,而不是加分技能。

关注这个公众号,一起学习吧哈哈!

珠玑:在仔细研究数据的基础上得出程序的结构

优化代码,编写优秀程序绝佳的方法,就是对数据的研究。对数据的仔细研究,之后采用合适的良好的数据结构,会对程序结构代码极大地优化和良好的改变。

该章节试着解决这样的问题:很多繁琐、重复、耦合、难以维护的程序,其实可以用简单的数据结构应用,变得精巧、清晰和完美。

举个例子,一个程序需要统计1到500之间的数字,每个数字在文本中出现的次数,可能会有人写出这样的程序:

if( k==1 ) c1++;
if( k==2 ) c2++;
if( k==3 ) c3++;
if( k==498 ) c498++;
if( k==499 ) c499++;
if( k==500 ) c500++;

该程序用了500个变量存储每个数字出现的次数,然而仔细研究发现可以用一个500个元素的数组轻松实现。

恰当的数据视图实际上决定了程序的结构,很多程序都可以通过重新组织内部数据而变得更小(并且更好)。

使用模板技术来解决格式化大型文本的需求。

能用小程序实现的,就不要编写大型程序。比如要处理某个N=23的情况的程序,其实完全可以编写只针对N的程序,最后将N赋值为23来实现。

程序员在节省空间方面无计可施时,将自己从代码里解脱出来,退回起点并集中心里研究数据,常常能有奇效。(数据的)表示形式是程序设计的根本。

以下是一些参考方法:

  • 使用数组重新编写重复代码。冗余的相似代码常常可以用最简单的数组来描述。
  • 封装复杂结构。如果数据结构比较复杂,直接抽象成类
  • 尽可能使用高级工具:超文本、名值对、电子表格、数据库、编程语言
  • 从数据得出程序的结构:通过使用恰当的数据结构替代复杂的代码,从数据可以得到程序的结构。

万变不离其宗:在动手编码之前,优秀的程序员会彻底理解输入、输出和中间数据结构,并围绕这些结构创建程序。