作者:鲁棒棒
写于:20240321
正文
今天接着写在实习公司的那段经历吧。昨天写了当时我参与的那个产品的情况,这个产品,我们姑且叫它 “限免应用” 吧,这个限免应用,当时我是看不懂的,而且公司的代码也是保护的很好,我接触不到,核心的东西不用说,自然是一个爬虫,这个爬虫被公司里的风风雨雨传说的很厉害,说这个爬虫可以日爬几千万个页面,性能很好,从爬虫调度到下载 html 页面,最后到页面信息的抽取,再到 APP 信息的入库,最后到用户订阅 APP,以及之后的推送环节,设计的都是非常的精良。
说归说我当时因为不懂,所以特别好奇,不知道这么神奇的程序到底厉害在哪里,由于知识储备的不足,那个时候,我还没有独立调研的能力,之后的日子里我专门加强了自己的调研能力,也就是俗称的 “面向搜索引擎写代码” 的能力,一来是必须懂得站在 “大佬” 的肩膀上做工作,二来是如果所有的功能都自己研究,那么势必什么玩意儿也做不出来了。
最后我认为最重要的一点教训就是,很多程序对开发者来说都是黑盒,理解的就是那几个 API,如果不是出于某些原因要去研究其内部的机制,原理,那么很多时候是没有时间和精力去搞清楚每一个应用的功能的。
包括比如我们日常用的 lib,比如某某框架,某某库,某某包,除非是遇到 bug,否则我个人是很少去研究其原理的。比如我最近接到一个需求,是要在 unity3d 的场景里实现载入 nes rom 的功能,也就是说,客户需要在一个 3d 场景里,去玩里面的一台 nes 终端,也就是红白机,必须能够实现 rom 的载入以及其他的全部功能,那么如果要实现这个功能,一个方案是找开源的 nes emulator 实现,然后改改看能不能编译成 unity3d 的 mono 环境可以使用的 dll 或者 so,其次就是在 mono 里自己实现一个 nes emulator,如果要自己实现,就必须去研究 6502,这是必经之路,所以这种情况就得去研究原理了,其他情况也类似。
当时我不懂技术,所以关于这个爬虫的具体实现,觉得很朦胧,我是多么希望那个开发这个爬虫的大佬,可以像在学校一样能给我讲一讲这个原理,那就好了,其次如果我可以读到代码,然后看到不懂得代码能去当面问清楚,这其实是进步最快得方法。
这种方法也是工作加学习的最好途径,不过一般很难能两全,公司项目因为是在生产环境中的,所以问题多,解决问题的方案是需要能力的,所以这种项目和自己研发的小项目以及参与一些开源项目的感觉是不同的,因为涉及到实际的经验,公司项目就非常可贵,尤其是碰到一个复杂一点的,有些技术含量的项目,如果能通过项目去精进自己的技术,那是非常棒的一件事。
不过大部分情况下都有所欠缺,有所不足,一来是很少能碰到和谐的技术环境,其次是大家都不想去说,原因很多,其次就是接触不到核心代码,这是几个不足之处吧。
这个爬虫的代码我没接触,所有的东西都是道听途说的,所以也不能当真,现在试想如果让我去写这么个爬虫,我会如何去做呢,我认为我最担心的问题有两点,其一就是反扒了,这个得见招拆招,有些情况必须牺牲效率,最极端的情况是截图然后用 OCR 识别,这样效率就非常慢,其次是得有稳定的代理,其他的就没啥了。
爬虫本身可以魔改 scrapy,有能力的也可以自己写,这个都好说,写爬虫得懂一点系统,否则无处入手,这大概就是我能想到的细节上的东西了。
下面来说一下我做的具体工作,简单的来说,我的工作就是去读取存在 postgresql 里的数据,然后显示在 web 页面上,这个工作这么描述,觉得不怎么难,但是当时简直让我难得无法形容,用抓耳挠腮来形容,其实也不过分了,接下来我详细的描述一下我的具体任务是怎么回事。
事情是如此的,限时免费这个 APP,在我来之前,已经在 APP 的代码里做了埋点,也就是用于分析用户行为的代码,这些代码的作用就是把用户每次点击某个按钮,每次点击某个页面,页面停留时间等信息都收集起来,然后通过 http 协议直接发送到远程的数据库里存了起来。当时公司的高层的意思是收集这些数据,想做更细致的用户运营的。
那个年代还没有一些三方的服务去做用户数据的收集和分析,所以全靠自己去做,我记得当时推送也没有第三方的服务,都是自己搞一台推送服务器,自己按照 apple 的协议去写推送服务的,有一次我印象深刻,那就是公司的推送貌似总会坏掉,经常需要重启服务,但是我也不明白其中的道理,只是记得有这么回事罢了。
这些收集到的用户数据,存在一个 postgres 里面,我只懂一点点数据库的知识,大学的那门 “数据库原理” 我是在后来的 “自学考试” 中才正式的去修了这门课,所以我的 SQL 和建表做的很差劲其实,不过这不影响我的工作,因为这个工作没几行 SQL 要写的,不过我的问题是 postgresql 本身,因为我装不上,我跟我的电脑战斗了很久,才勉强装上,郁闷至极,差点抑郁。
postgresql 的事并不太多,公司给了我测试数据,让我直接导入到我本地的库里,然后在程序里直接抽取出来,抽取出来之后都是一些数值,这些数值需要通过在 web 页面上画图表的方式展示出来,这个问题看来也不大,但是却很难。
这个问题难在我只会用 python 的框架来写 web 应用,而不会用别的语言,因为我是新手嘛。结果公司给我安排的工作是使用 “lua” 的一个框架来写这个 web 应用,我当时不懂,所以不能吐槽,让我干嘛我就得干嘛,现在我稍微懂了那么一点,可能公司就是为了考验我,也肯能是为了试水新框架。
最最重要的是,这个基于 lua 的框架,其实跟 lua 没啥关系,之所以用 lua 是因为公司当时在用一个组件,这个组件叫 “openresty”,不知道看帖子的朋友有没有听说过这个东西,这个东西是淘宝的章亦春开发的好像,我记不清楚了,大概就是这位大佬了,后来去了美国,因为 openresty 发展起来了,成为了强有力的组件,cf 也在用,很多大企业都在用这个组件。
那个年代,openresty 这个组件刚开始做,貌似版本还是比较低的,功能也就是在 nginx 里面搞了一个 lua vm,在 vm 里面执行 lua 代码,用来把复杂的业务逻辑从后端转移到 nginx 里面,具体如何调度的我不清楚,大概就是这么回事,优点是性能比较好。
openresty 本身只提供了执行 lua 的功能,但是如果要读写数据库,渲染 web 页面等工作,就需要嵌入一个 lua 写的 web 框架才可以,而公司让我用的那个 lua 的 web 框架,就是公司的大佬自己写的,自己人不坑自己人,第一个坑的就是我这个实习生了。
当时我看不懂这个 web 框架的代码,不会用,也不敢问,也没文档,啥也没有,属于三无开源软件,不过我还是硬着头皮搞下来了,我对我的能力基本认可,但是很可惜没得到公司的认可。
明天接着写,今天就到这里吧,时间不早了,晚安!