获奖经历/任职

  • 阿里云前端/Node.js实习生
  • ACM/ICPC国际大学生程序设计竞赛亚洲区域赛三等奖
  • 湖南省第十届“蓝狐杯”大学生程序设计竞赛三等奖
  • 湖南科技大学校级程序设计大赛全校第一名
  • 微知著高潜质大学生奖学金 (全校唯一)
  • 湖南省第五届“蓝桥杯”大赛省赛一等奖

技能清单 网页版点击跳转至对应项目

  • Node.js:暑假实习于cnodejs社区管理员alsotang所在的团队(阿里云-数据平台),技术栈全部基于Node.js。
  • python:阿里实习之前大部分作品都基于Python,拿过腾讯Python开发实习生offer,写过Web后端、爬虫、运维脚本等。
  • golang: 从golang1.2发布就开始关注,完整阅读过其标准库文档,主要用来实现代理服务器,翻墙工具等需要操作底层TCP/IP协议的工具。
  • Web前端:
    • 熟悉AngularJS,能够使用Angular进行模块化开发较复杂的单页应用,实习期间多个项目都基于angular。
    • React、Webpack、 Isomorphic JavaScript、ES2015等新技术很早就有所涉猎,并能正确评估在核心项目引入这些技术的风险。
    • Gulp、Grunt、Less、RequireJS、CoffeeScript、Lodash等工具无压力。
    • 可以使用BootStrap快速的进行相应式布局设计。
  • 算法能力/抗压能力:两年ACM经历,良好的算法能力,期间担任ACM集训队副队长,并多次代表学校参加省级、市级、国家级算法竞赛。
  • 学习能力:超强的自学能力,比如Node.js是阿里实习前一个月现学的,但到目前为止对Node.js核心模块以及流行npm模块的熟悉程度甚至超过很多老员工。
  • 折腾能力:常用软件Chrome/Sublime Text 写过插件,npm/python模块用的时候习惯翻翻源码,不好用就fork一个改改或者再造轮子。
  • CS基础:学校专业课基础扎实,拿过奖学金。
  • 熟练操作Linux/OS X/Windows,有过独立服务器、VPS、BAE、SAE等的管理部署经验。
  • 持续关注各种新技术的发展(Hacker News,Startup News、GitHub Trending、开发者头条、python日报等)



学习经历&项目经验

大三下&大三暑假
  • 3月开始找暑假实习,先后拿到腾讯和阿里的实习生offer,最后选择去了阿里。
  • 3月获得湖南省第五届“蓝桥杯”大赛省赛一等奖
  • 6月至今,实习@Alibaba, Node.js开发工程师/前端工程师
  • 阿里暑假实习的主要成果
    • 基于jison写了一个SQL到AST的parser(独立完成)
      • 之前某个API服务会根据输入的复杂查询条件来计算,之前他们有设计过一套查询表达式,是一个冗长复杂的json结构,学习成本很高。
      • 新版本决定用sql来表达这个查询条件代替原有的json结构。 我基于jison实现了一个sql的parser把sql转换成先前的json结构(基于网上的SQL文法定义文件修改而成)。
      • 相关项目:
      • 以前在编译原理课程上, 修改过sre2(一个golang的正则库)的代码使得其可以根据输入的正则表达书生成nfa的图像和正则表达式引擎的运行的函数调用图。 同时发现golang tools的一个bug并报告官方修复。
    • 实现了一套类似jsdoc的通过扫描源代码注释生成api文档的工具(独立完成)
      • 这是我们团队的一个api开发框架里面集成的文档生成工具
      • 开始考虑过开源工具apidoc,最终因为和我们的需求不符以及学习成本高等原因弃用,遂自己实现了一个语法更简洁,使用更方便的工具。
      • 这个由于语法简单并没有像之前解析SQL一样使用jison等工具,而是直接使用的正则。
      • 难点是要求解析器有足够的容错能力以及友好的报错信息。
      • 后期考虑通过jsprime/uglifyjs等工具解析出AST然后充分利用代码的信息生成文档而不完全依赖注释。
    • 把一个nginx的模块转换为Node.js的模块(独立完成)
      • 某个项目需要用到了高德的地图数据, 但是拿到的某些图片数据是用私有格式打包的(类似tar), 然后是一个c++的nginx模块来负责解析这些格式提供服务,但是nginx模块在我们的平台上部署十分麻烦。 我独立把这个c++模块转换成了纯Node.js模块。
      • 主要技术难点: 对方拒绝提供相关的文档资料, 只提供了那个模块的源代码,只能通过代码去猜测私有格式的规范并转换成Node.js。
      • 此外, 由于javascript数值类型的设计缺陷,c++代码中很多位运算和64位整数的计算转换成javascript代码需要很多hack。
      • 相关项目: 以前在学校做过手写过socks5代理,设计过类似shadowsocks的翻墙工具(基于golang),逆向过经过混淆的js源代码。
    • 给集团内部一个web框架加上了hot reload的功能(免重启,参考Erlang的热更新功能),大幅度提升开发效率,
      • 原理:监听文件系统然后清除node模块缓存,用闭包避免旧对象缓存。
    • 一套Node.js+React开发的脚手架(基于GitHub多个类似项目修改而成)
      • 特性 react, webpack, hot reload, es6/coffee, jsx/cjsx/jade, less/sass/scss, Isomorphic JavaScript。
    • 基于react的在线表格工具(react的练手项目)
    • 一个基于angular的某个系统的管理后台





大三上
  • 9月至12底远程为某团队远程工作
    • 写过爬虫,用于机器学习数据标注的WEB管理系统。
    • 写过QQ|微信机器人,模拟过QQ协议1.4和WebQQ协议。
    • 接触过简单的机器学习和自然语言处理处理(仅限于调用三方库完成需求)
    • 写过简单的验证码识别以及调用在线打码平台的API。逆向过经过压缩混淆的JavaScript(Google Maps JavaScript SDK的非公开接口)。
    • 主要涉及的技术:Flask、AngularJS、MongoDB、MongoEngine、Scrapy、Requests、Gevent、IPython、Fabric、Supervisor、NumPy、Matplotlib、Pandas、D3.js
    • 服务器用过阿里云、DigitalOcean、BAE。
    这个团队的工作是利用大数据分析、机器学习等手段来提供各类预测服务,
    我主要负责编写爬虫,从或含有大量Ajax内容,或国内无法访问,或有IP、访问频率限制,或含有验证码等各类网站抓取信息。 我需要独立负责爬虫的编写,部署,监控,数据导出全过程。
    我还负责编写一些用于机器学习数据标注的WEB管理系统,因为数据抓取下来之后往往需要找人手工标注一些信息,需要一个对应的标注系统给标注人员使用。
    这些项目的特点是时间要求很紧(一般1-3天),成本限制很严格(因为很多可能只用一两次),对界面要求低而对使用便捷性,流畅度要求高。
    其中的几个小项目简介:
    • 图片标注系统
      • 需求:有大量图片,要求标记人员可以标注图片的类型并视情况加上注释。
      • 实现:这个需要在每页显示多张图片来尽可能提高操作效率。最后系统构架:前端基于AngularJS框架,后端基于Flask框架。
      • 实现这个的过程中我封装了一个基于JSON的类似RPC协议的东西,包括一个AngularJS服务和一个Python装饰器。可以在JavaScript里面直接调用Python的函数,用法如下,这个东西现在也常会用。代码示例如下:
      • Python代码:
      • \n@addapi
        def add(a,b):
          return a+b                      
      • CoffeeScript代码
      • \nflask('add', a:1, b:2).success (data)->
          console.assert(data==2)
        # or
        flask('add',1,2).success (data)->
          console.assert(data==2)                      
      • 我用的ngStorage(操作localStorage)代替了用URL参数来保存状态,给大部分操作加上了快捷键以提高速度,在前一页就预先加载下一页的图片来避免用户需要等待图片加载。 在浏览器中实现了和PC软件类似的体验。独立完成。
      • 效果预览
    • 图片关键点标注系统
      • 需求:有大量图片,需要让标注人员在其中标注出5个点,然后导出每个点的坐标信息成json文件,并输出在每个关键点上用红色数字标明之后的图片,以及以按标注点为中心的矩形区域裁剪下来保存为指定格式图片,允许多人同时使用。
      • 想到的方案:
        • 实现方案把图片显示在canvas上面,然后用js捕获鼠标事件,在canvas上绘制当前的编号,所有点标注完成之后再把处理之后的图片以及坐标数据post会服务器保存进数据库。
        • 直接用img标签显示图片,然后根据鼠标点击在上面绘制文字的div(绘制div然后用css美化比在canvas上绘图一个相对美观的图案要容易得多,而且dom可以删除,canvas只能重绘。),最后用html2canvas转成图片post回服务器。
        • 捕获鼠标点击把坐标post回服务器然后更新图片的src属性。后台调用PIL直接最终的图案然后被下载到浏览器上面。
      • 最终选择的是方案三,因为前两种方案最后一步按矩形裁剪之后还是要用到PIL处理,而且由于浏览器缩放等原因可能造成处理之后的图片质量变低,被缩放。 第一版1天半,3天之内完成所有后续需求。独立完成。
    • Google Map api非公开接口逆向
      • 需求:给定经纬度,需要下载Google Maps的不同角度不同尺寸下的卫星图片。Google Maps JavaScript SDK的功能无法满足其需求,然后只能在Google Maps网页版本抓包获得图片链接下载。 但是其图片链接里面的两个参数x值和y值计算方式未知。经过简单的抽样然后曲线拟合没有发现规律。只能逆向Js得出计算方法。
      • 这个项目原来是由另一个人完成,在此处受阻最后交给我来完成。
      • Google Maps的JavaScript全部经过压缩混淆,比看汇编还困难(汇编至少每个变量地址是唯一的,而js在每一个作用域变量名称都是从a-zA-Z然后aa-zz这样,单纯根据变量名根本无法区分变量), 思路:先经过Chrome开发者工具的prettify功能美化代码,然后下dom断点找到大概的位置,然后单步调试并观察可疑变量。 最后发现部分代码是通过eval运行的,无法对代码下断点。最后我采取的方法是通过reres浏览器插件用本地的js替换线上的js(很多人用nginx这样做)。 然后在其中加入debugger和”//@ sourceURL=name“来帮助调试。经过一个下午和晚上的努力,成功还原URL参数的算法。独立完成。
    • QQ协议模拟
      • 这个是使用python模拟QQ协议,实现登陆,获取好友列表,收发消息等功能。
      • 我们一共模拟了两个版本的QQ协议,一个是手机QQ1.4版协议,一个是WebQQ协议
      • 手机QQ协议版本是和同学一起实现的,登陆验证码识别因为较为复杂我们使用的第三方人工打码服务。
      • WebQQ协议版本由Github上代码修改而来。
      • 在此基础上的QQ机器人使用截图:
  • 9月获得微知著高潜质(IT)大学生奖学金
  • 10月参加湖南省第十届“蓝狐杯”大学生程序设计竞赛
  • 10月把学校OJ从普通主机迁移到了专业服务器
  • 10月利用空闲服务器资源建立Docker虚拟机搭建了众多内网服务(开源镜像站点、Git服务、FTP/Samba服务)
  • 12月ACM/ICPC国际大学生程序设计竞赛亚洲区域赛
  • 12月计算机网络课程设计&安卓课程设计
  • 寒假在自学编译原理
    • 试图阅读sre2(google的re2的go语言实现版本)的代码,期间试图通过Graphviz生成函数调用图和nfa的图像来分析代码。
    • 阅读代码过程中曾经发现Golang tools代码的一个小错误,目前已经通过邮件列表报告官方并fix
    • 课程是网易云课堂的编译原理课程,该课程的作业我使用Golang代替课程中的C实现,
      用ply(Python版本的lex、yacc)代替了课程中的flex bison
    • PS:由于不久之后在v2ex发现了校园招聘内推的帖子,然后跑去写简历去了,目前此课程进度已经处于无限搁置中
大二暑假
大二下
  • 2014年1月给一加拿大留学生写了一个定时抢占自习教室的脚本,赚得第一桶金2000元。
  • 2014年3月负责新生C语言课程设计(在OJ上面做题)的服务器维护
    • 用memcache缓解了mysql的性能问题(同时在线用户500+,而服务器当时还是普通I3台式机)。
    • 用apache2的mod_limitipconn模块解决了有学生恶意访问的问题
  • 2014年3月成为集训队副队长,同时开始负责学校OJ(程序设计在线评测系统)的维护。
  • 2014年5月在校赛中拿到第一名
大二上
  • 自学了Golang
  • 写过几个Chrome扩展和Greasemonkey脚本
    • 一个通过修改css优化几个小说阅读网站的字体并去除广告
    • 一个后门插件记录所有的登陆表单的用户名密码并上传到服务器
    • 一个修正教务网在非IE浏览器下无法使用的问题(非独立未完成)
大一下
  • 自学了HTML/CSS/JavaScript/PHP
  • 写过几个Demo网页|网站,如HNUSTOJ
大一上
  • 入校之后才开始拥有自己的电脑
  • 发现学校学籍管理系统漏洞(cookie欺骗+弱密码),一周之内零基础自学易语言爬下所有数据并写出一个图形界面查询工具。
  • 以第一名的成绩进入ACM实验室
  • 自学Python
大学之前
  • 接触过电子词典上的一门玩具编程语言BBASIC,独立完成一个记忆游戏(开发全过程在词典上完成)。
  • 在一个MTK手机上用MoMo C写过C语言
  • 这是简历的打印版本,更多内容请阅读在线版本 http://r.hi-hi.cn
  • 其它

    • 此简历为本人独立完成,部署于Github Page上,如果是Chrome浏览器可以直接Ctrl+P打印。
    • 联系方式: hi@hi-hi.cn / QQ/微信:978750903 / tel:18207421948 / 建议QQ/微信交流