|
|
51CTO旗下网站
|
|
移动端

挨踢部落故事汇(34):全栈工程师的自我修炼

程序员的职场很公平,你的待遇几乎和你的知识成正比,前提是你真的掌握。进了这个圈子就是一场看不到终点的修行,最好的结果是,你一直在前行的路上、在离终点越来越近的路上,这就够了。

作者:51CTO开发者交流群来源:51CTO|2017-12-22 09:33

【51CTO技术沙龙】10月27日,让我们共同探索AI场景化应用实现之道

【51CTO.com原创稿件】 史亚风是一个全栈工程师,5年的开发经验,积累了很多idea,这些idea从传统的Java Web到Golang、SVM、hadoop、UI Automation都有涉及,对每一件事情,他都有自己的思考,剑走偏锋。另外亚风是一位兼职的魔术师,在省赛国赛等魔术大赛中屡屡获奖,工作之余也经常参加演出,也许是魔术打开了亚风的灵感,如下文中提到的FoolQQ,让很多开发者看完源码后大呼很神奇。

史亚风•实验室执行主任、高级工程师

零基础自学编程独立建站

亚风从2013年7月参加工作开始,一晃,快五个年头了。他初次接触编程是在2010年的时候,大一上学期刚结束,春节,大家忙着串亲戚、走朋友。在上海创业的叔叔回来过年,吃过年夜饭,照例是一次深入的家庭谈话。寒暄过后,叔叔提出想建个网站,一开始亚风是拒绝的,毕竟才大一,只学过C语言,没接触过Web,当时连“Web”这个词都没听过。但是看着叔叔焦急的样子,亚风还是硬着头皮答应下来。他做事是个激进派,直到现在也是这样,别人交代的事情总想尽快落实。当时他家里没有网,第二天就去了附近的网吧,搜搜怎样建个网站。幸好亚风找了一套视频,讲的HTML/CSS/JS基础。现在看来当时的路很正确,对初学者而言看视频跟着做,很容易成功并一步一步建立信心。学了一周,依葫芦画瓢地把网站的几个主要页面做出来了,满满成就感。当然,后面花了一些时间磨合需求,期间也了解了绕不过去的兼容性问题。

但是下一个问题是,后台程序怎么办呢?很巧,视频后面是Java Web开发的内容,从此,也让他走上了Java工程师的道路。现在他回想起来真的很神奇,如果视频后面是PHP他现在大概就是PHP工程师了吧。从未接触过Java的亚风,要从Java基础语法学到JSP,然后是SQL。周期不短,没有之前那么顺,他叔叔也在催,说实话很多东西似懂非懂,亚风也就学了20多天,还是硬生生把一个后台程序做出来了。又过了一个学期,暑假,直接去了叔叔那儿,基于用友的ERP、CRM做一些软件的二次开发,在这个过程中他熟悉了Java体系,学习了Spring、MyBatis、Maven,前端又系统的学了一遍,然后是jQuery等等。接下来每逢寒暑假他都会去叔叔那儿帮忙,在这个过程中不断完善自己,也为后面的就业积累了实战经验。

海量大报文数据持久化

毕业,亚风来到了一家信息领域技术研究公司,接触的第一个项目就是一个高并发下大报文数据的持久化问题。基于TT/TC做的,但是压测性能一直上不去。客户要求单节点18KB报文持久化达到5000TPS,他在数据库和代码优化后只达到单节点2100TPS,不过很快事情有了转机,一次偶然的实验,亚风单独压测TC,发现不经过TT并发写入多个TC文件可以达到5000TPS,而之前使用TT访问TC的方式只能基于一个TC文件,结合应用“写多读少”的特点,并考虑分布式架构,可以设计出如下架构:

如图,每台server上有一个基于socket的read server供Web读取,而写的部分并发写入多个TC文件中。现在需要解决的是,你需要知道某个报文存在哪儿了,也就是在哪台server的哪个文件中,很显然只需要在数据库中保存server所在的IP信息和文件的名称就ok了,这个数据库就像hdfs中的namenode一样。数据表应该至少包含三个字段,分别是IP、TC文件名称、报文的key。这个案例他还记得很清楚,毕竟当时花了很长时间做实验,在不改变原有系统架构的情况下,这是个好办法。另外TC真的很强劲而且稳定。

基于SVM的验证码识别

2014年,亚风出差北京,待了半年多。给中国电信集团做内部门户项目,当时要做一个手机门户,在和外围多个系统谈接口,进展缓慢。于是他自己提出用爬虫的方式试试,短短一周完成了很多接口,积累了不少爬虫经验,不过很多系统都用到了验证码,因此这是一个绕不过去的关。亚风基于像素比较和SVM做了识别,效果不错,在人工智能在中国火起来之前接触了这些,还是很不错的。为了让读者有个感性的认识,举个例子,你经常看到形形色色的验证码,它们有不同的颜色,甚至会扭曲的很严重。以数字“8”为例

计算机怎么分别这是8而不是6或者7呢?

我们把“8”放大,可以看到图像是由一个一个色块组成的,每个色块都有一个颜色值,再设置一个阈值,大于这个阈值的色块设置成黑色,反之设置成白色,就得到了一个黑白的数字“8”,这叫二值化,接下来从左到右、自上而下,白色的标记为0,黑色的标记为1,得到一个二进制的数组,这就是SVM的输入,SVM会自动根据这些数据构建多维空间,根据距离判断数字到底是几。这些数字组成多维空间的坐标,这个坐标可以看做一个点,通过很多张“8”图片的训练,会形成一个“8”组成的点群,看上去就像银河系的星河。显然,判断某颗星球属于银河系,它必然在银河系划分的范围之内,否则可能是别的星系。

基于单例对象的定制Ajax框架Fela

日子平静的来到了2015,亚风公司各产品的UI也开始基于UED统一设计,摒弃了之前Extjs的厚重,这带来了一个问题,使用最多的分页表格页面需要结合UED提供的CSS重新实现,如果放手不管,每个人都会有自己的实现,又因为样式和网上的差别大,无法直接套用某个Ajax框架,因此只能定制。需要一个轻量级的Ajax框架,满足分页、查询、各种事件支持、后台数据解析、表单数据打包、以及尽可能的简单,Fela应运而生。Fela基于单例对象,和传统Ajax框架不同,单例对象的使用使得Fela更轻量级,在JavaScript中单例有很多优势,诸如更小的内存开销,加载即创建,方便覆盖重写,对象结构清晰以及易于和JSON互转等;

但是这样做也带来一些问题,比如一个页面里只有一个对象,为此,亚风使用克隆代替new来生成新的对象,避免了初始化大对象时构造方法中的耦合,也使得使用者对大对象得以按需取用,书写结构清晰的代码。他设计了别名和方法链,力求让一个传统的表格数据页面、查询框等等的开发尽可能简单。编写Fela只用了三天时间,不到500行的代码小而精巧,公司的几个产品基于此开发,基本做一个页面前台只需要简单的配置,缩短了开发周期。最重要的是,Fela通过有限的API约束了代码,使得每个人写出来的代码看上去都差不多。它的源码在这>>

搭载黑科技的表单工具——如意

2016年起,亚风开始完善自己的理论,工作之余挤出时间看了不少书籍,JVM原理、并发编程、TCP/IP原理等等,也做了一些hadoop技术栈的学习,很多东西之前知道,但大都太碎片化,不成体系,读书让他理顺了他们的关系。在IT行业,知道的越多,就越发觉得自己还很渺小,反倒是读书少时,更容易自满。根据项目要求,这一年他花了四分之一的时间独立做了一个表单平台——如意。如意相对亚风以前的作品可谓是大制作,为此他还拍摄了一部宣传片。如意有很多特性,全控件支持、首创可视化业务逻辑设计、多数据源、多租户、在线JS编程等等。2017年10月份,亚风用这个项目参加了51CTO开发者大赛,很幸运,如意已经入围了,希望后面它能取得好成绩。这一年,他被任命为公司软件实验室的执行主任,负责创新型项目的研发、以及疑难问题的解决。

让计算机识别自己!

亚风参与了很多新兴项目,如GIS、声纹时长识别、问答机器人等等。在GIS项目的开发过程中他提出了一个基于让计算机通过图像识别来操作自己的屏幕的方法论,这就好像在计算机前面摆了个镜子,这样它就可以看到自己,从而操作自己。这为项目节省了不少人工的工作量,主要用于自动化的批量几何图形绘制。后来把它应用在操作QQ上,由于目前读写QQ的机器人都是基于爬虫分析SmartQQ报文来实现的,然而SmartQQ腾讯已经不再维护,其HTTP服务端经常不可用,且经常需要不定时的重启,于是基于图像识别,亚风开源了FoolQQ。由于计算机给自己截图的输出图像是高清的,意味着开发者可以直接基于像素比对来实现图像比对。判断一个图像中是否包含某个子图像就会像下面这样简单:

  1. public static boolean isEqual(int x, int y, BufferedImage image, BufferedImage point) { 
  2.  
  3. int pointW = point.getWidth(); 
  4.  
  5. int pointY = point.getHeight(); 
  6.  
  7. for (int m = 0; m < pointW; m++) 
  8.  
  9. for (int n = 0; n < pointY; n++) { 
  10.  
  11. if (image.getRGB(x + m, y + n) != point.getRGB(m, n)) { 
  12.  
  13. return false; 
  14.  
  15.  
  16.  
  17. return true; 
  18.  

很幸运,这个项目得到了一些个人开发者的捐助,也让亚风有了维护下去的动力。

【写在最后】

2017年很快就结束了,前面是亚风这些年一些代表性的研发,篇幅有限,还有很多例子不说了。程序员的职场很公平,你的待遇几乎和你的知识成正比,前提是你真的掌握。最后总结一些研发的经验:

1.架构永远是第一位的,如果你的性能和目标差很远,请不要尝试细节优化;

2.不要重复造轮子,关注IT领域的动态,经常访问51CTO这样的网站,知识的广度可以让你省不少事;

3.如果非要造轮子,设计则显得尤为重要,一定要站在用户角度看问题,要知道你的用户是谁;

4.个人技术提升和日常工作有时候是冲突的,找到双赢的点很重要,优秀的员工应该是一个合作者的心态;

亚风和朋友常说,进了这个圈子就是一场看不到终点的修行,最好的结果是,你一直在前行的路上、在离终点越来越近的路上,这就够了。

如果你也愿意分享你的故事,请加51CTO开发者QQ交流群 669593076联系群主小官,期待你精彩的故事!

51CTO开发者交流群⑦群 669593076

【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】

【编辑推荐】

  1. 挨踢部落故事汇(29):开发转型测试是一种怎样的体验
  2. 挨踢部落故事汇(30):我与Python的相爱相杀
  3. 挨踢部落故事汇(31):一名合格的网络工程师是如何炼成的?
  4. 挨踢部落故事汇(32): Java深坑如何填?
  5. 挨踢部落故事汇(33):“小白”带你分分钟玩转数据分析
【责任编辑:何星 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

The Ruby Way(第二版)中文版

本书采用“如何解决问题”的方式阐述Ruby编程,涵盖了以下内容:Ruby术语和基本原理;数字、字符串等低级数据类型的操作;正则表达式;国际...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊