2021,“鑫”挑战!(2021年度总结)

1,699 阅读11分钟

前言

时光不负,创作不停,本文正在参加2021年终总结征文大赛

2021年的尾声如期而至,满脸通红看着(打脸几巴掌),手里握着去年立下的Flag,总体成绩只能马马虎虎的给自己60分。勉强及格。只完成了其中比较重要的几项,不过这也是我成长没能落下的重要原因。但是今年自己还是没能练出一身腱子肉啊。既然结果如此,也只能欣然接受了,因为今年的Flag打脸,所以明年Flag,我在这里就先卖个关子隐藏,等待明年的时候我再说明给大家。所以,今年的年终总结就不像往年一样,说明自己各个方面的成果,我们就来点不一样的东西:

回想自己的职业生涯,从一只小菜鸟,扑腾成如今的我,似乎都是在自己熟悉的领域做自己擅长的事情,在Java和Spring的光环下,我不需要去关注旁枝末节的东西,我只需要专心的关注我的核心业务,我需要的一些Integration,Spring都帮我做到了开箱即用,完全堪称保姆级的Framework。那么,我们换一种方式,去思考下,在这样框架高度流行的情况下,我们需要提升的是什么能力?
首先,第一点肯定是TroubleShooting,你用一天完成Integration,我用5分钟完成,这就是遇到问题下,解决问题的时间长短成就差距,有的人可能会认为,反正都是面向搜索,反正能完成就行了。那你再往上一层去思考,有一句话是这么说的,你永远不知道你不知道的东西。你根本就不知道的情况,你从何搜索?你如何使用关键词搜索?同样的,更高程度的人依然是5分钟,而现在的你所花的时间是未知!这一直是大家普遍存在的误区,反正都是面向搜索,这也是我面试立马会淘汰一个人的原因。能力不足,还在那里大言不惭。不过我也不奢望改变这个群体的人,每个人都有自己想要的目标的权利,包括我自己也是在追求自己的目标中。

其次,代码设计也是非常重要的一环,今年我是完全吃了没有设计的亏啊,没有系统性的学习代码设计,导致画流程图,思维导图,时序图的时候,思维乱绽,完全把控不住,导致有的时候自己把自己打结了。查阅源码的时候,他们精巧的设计让我很惊奇,就像古代的榫卯结构一样,使用最小的空间,发挥最大的作用。这里就不抨击了,不然就变发牢骚了,也不是我的性格。在接近下半旬的时候,我接触了DDD的模式,这个模式让代码decouple,扩展性急速提升,稳定性也非常好。写Junit Test的时候也很方便。目前自己也是对这个模式大概入门,之后还是要继续深究。一个好的代码设计,可以提升自己的宏观抽象能力。从全局下去看系统,一下子就能看到不足之处。

第三点,算法的训练,这方面对于所有人是最公平的,每个人只要努力了,就能掌握的,经典的算法能提升你的思维能力,不再局限在一个囚笼里不知所错。算法是支撑你写核心业务的思维基础。有很多CASE,一些Trade-off在你编写的时候,都能灵光一现的。编写出来的代码的稳定性都非常高,好处真的不少,虽然我最近也没咋练,在肯算法老本,很惭愧。

最后一点,底层知识,知其然所以然,撕开框架的光环,去计算机底层世界里,看到本质。能使你的思维高度提高不止一点点。这里我也没啥话语权,因为还在探索中,等我探索完后,再来分享给大家。

如果你认真看完了以上四点,我非常感谢,希望以此共勉。

在即将进入自己的第5年的职业生涯(实习期计算开始)时,我想给自己的一个挑战,为什么会有这个挑战呢?萌生这个想法的原因是:我看到油管上的一个视频,一个在我觉得是比较厉害的某硅谷大厂的工程师,做了一个挑战,用自己完成不知道的编程语言,做一个Hard的算法题。花了两个小时左右。中间对语法的调试,各种异常信息,再各种调试修复,反反复复让我我大受震撼。所以我就决定做一个类似的挑战,同时也为了弥补我没完成的几个FLag。现在的我恳请未来的我一定要原谅过去的我。

那么这个挑战让我置身在我不熟悉的领域,我的表现是怎么样呢?这也是最能验证人的成长的一部分,No Java ecosystem的我,是否能够如鱼得水呢?在未知领域的我是否能够像在Java的大海里一样的自由翱翔呢?(事实证明未知领域还是很艰难的,但是能让人更快速成长,手动狗头),于是我换着满心期待和憧憬,踏上了未知的路途。(隐藏彩蛋:本次挑战全程未使用中文进行搜索,虽然我也很久没用了,Spark使用的是PySpark,不是我熟悉的Scala version 的Spark)

这次挑战的主要目的如下:

  1. 检验一下自己4年以后的成长
  2. 测试自己的TroubleShooting的能力
  3. 重新把自己的学过的Python基础和C语言融汇贯通一下
  4. 向我的偶像(霜神,左耳朵耗子等等)致敬。
  5. 给自己的职业生涯留下一些美好的回忆

结论

有的人,可能不想看太长的文章,那么我就在这里先说结论,我挑战成功了,我当时目标是定义一个月内完成这个Web日志分析系统,我总共花费21天60小时的时间,完成了两个核心功能,离线分析日志,以及实时分析日志。首先,它不是一个企业级的系统,它不会庞大,它只是一个小小的但是功能精悍系统。这两个核心功能在Web日志中的需求十分常见。希望可以给阅读过这篇文章,并且之后有这方面的需求的人,提供一些参考价值。还有我做这个系统所使用的参考资料,都在文章的结尾,一些小问题的搜索我就没有放上来了,主要是放了一些难点问题的。还有一些打开后是官方的整个文档,你不用怀疑,我就是看完了整个文档的。你就明白了我有多痛苦。还有我将自己编写的源代码都上传至Github仓库了:

  1. 项目的主体Django项目,里面包括了使用PySpark的各种常见操作,已经如何使用Django去编写业务系统。项目地址
  2. C语言编写的远程版Tail。项目地址
  3. Python的测试项目,调试通过的功能,会迁移到主题项目中。项目地址

如果这些代码和参考资料,能帮助到一些人,那么它就发挥了它的作用

2022年再见吧。这里请允许我致敬下鬼灭。现阶段的我实在太喜欢这部动漫!

1049584.jpg

挑战简述

2021-11-27日,这个挑战开始后,我开始接受了没有Java和Spring的生活,也被我的未知领域所支配,导致我茶饭不思,整个人都很兴奋,像打了鸡血一样,几乎每天都是在和BUG以及各种各样的调试问题做斗争,这么多天下来整个人都消瘦了。不知道头发有没有变少。但是,今天我终于完成了这个挑战,总共花费21天60小时的时间。完成了这个Web日志分析系统。我终于可以松一个口气了,这个系统主要有两个核心功能,离线分析日志,以及实时分析日志。为什么选择这个方面呢?因为在我们开发的系统中日志是十分常见的,数量也是十分巨大的,隐藏的信息价值也是十分巨大的,所以我决定提出这部分的信息价值出来。提供给开发人员作为参考,所以我选择的架构是

  1. Python作为主要编程语言,此时的我一拳打飞Java
  2. Spark使用PySpark,此时的我一拳打飞Scala Spark。
  3. Web框架使用Django,此时的我一拳打飞Spring
  4. 日志采集使用C语言编写的TCP信息交互,此时的我一拳打飞Kafka
  5. 前端使用python的plotly图表框架,此时的我一拳打飞Vue和Echart.js 这些部分都是我完全不熟悉,或者是熟悉度非常低的领域,Python和C语言,我有一段时间专门学习过,但是根据艾宾浩斯遗忘曲线,我差不多也忘光了,PySpark可能会有点熟悉的感觉,因为Scala和Python的语法结构会有相似性。官方在设计Client的时候也是使用相同的函数名,函数结构去设计的,所以两者的相似度会很高。但是Django是我之前完完全全没有接触过的,一个陌生的领域。

这个系统主要是用5种维度图标去揭示系统的不足。我会一一解释,以下是离线分析展示图(样式请忽略,使用Django,我实在不想调样式了):

FireShot Capture 027 - test - 127.0.0.1.png

维度解释如下:

  1. 请求变化情况的两种维度,一是按小时,二是按分钟,这两种维度可以让我们知道系统的请求峰值是如何的,可以进行必要限流以及削峰,来保证系统的稳定运行。

  2. 接口请求时长的降序排序,可以清晰的看到哪些接口的请求时间过长,还有优化的空间

  3. 请求内存的变化率,检测每次请求,整个系统的内存变化率,当绿色的线靠近红色部分的那些接口都是存在高内存的使用情况

  4. 内存累计消耗最多的请求排名,这边具体的分析出了,哪些接口存在耗费内存的情况,结合第三点,可以查看下是否可以进行代码的内存优化,或者物理内存的扩大。

这5个维度,是我认为最有价值部分的信息,当然,如果你想要使用自己的日志模版,也可以修改成自己的模版去进行日志的分析,只需要稍微改动下代码的模式即可。

实时日志分析就是在系统内部填写远程的服务器信息,C语言的服务端会传输到远程服务器上,讲日志的实时信息传输到客户端上,类似把你统计好信息的tail命令给你参考的。虽然图上只有两个启动监控和查看实时监控数据的按钮,那时候调试的太痛苦了。只有经历的人才懂。

image.png

参考资料

首先真的得感谢以谷歌搜索以及stack overflow,我还提出了人生中的第一个stack overflow问题,没过一会就得到了回复,虽然后面在外国友人的热情指导下,才明白了自己的问题是多么的简单。总之非常感谢!
Google
stack overflow

书籍

《Spark大数据快速分析》
《C语言程序设计现代方法第二版》
《Python则是蟒蛇书》

网站博客

Python

Django基础教程
Python3 官方文档
How to copy a file to a remote server in Python using SCP or SSH
"Apps aren't loaded yet" and "django.core.exceptions.ImproperlyConfigured" in Django?

C语言

Socket Programming in C/C++
Socket programming - setsockopt: Protocol not available?
What Is sleep() function and How To Use It In C Program?
How to convert a string to an integer in C

Spark

Spark官方文档 Spark DataFrame操作
Structured Streaming Programming Guide
How to wrangle log data with Python and Apache Spark