年终总结!总结下这一年,做了啥??

一切要从这张图说起

在这里插入图片描述

中间那一段时间,工作比较忙,所以没有更新。

LPOJ —— 首个Big Project

ACM退役后,就开始做毕业设计。一开始OJ规模还很小,一年过去了,规模越来越大。可以说,这个OJ,完全是从0开始做。凭借着实习时候看了一一点点的后台知识,开启了OJ码代码之旅!

一开始一点前端知识都没有,仅有连HTML标签都还没熟悉的水平,开始了前端框架学习之旅。调研了好久,最后决定使用Vue.js!于是在菜鸟教程看了一天的Vue入门教程就上手了!这个时候,我还没有系统的学过JavaScript!凭借着与C++语法的相似,边学边做了~简单的看了Vue就开始搭积木了。这个时候,真正的体会到复制粘贴的乐趣了!然后又入手了Element库,越来越快乐。就这样很快的就把前端搭好了,也知道前端开发大概是个啥东西了。后来又用了其他库实现了手机版,也知道了手机WebAPP的一些库。

接着是后台,之前实习的时候了解了Django,也就顺手的用了Django,那个时候,凭借着蹩脚的Python基础,甚至没有系统的学过Python,就开始了码代码之旅了!Django用起来,是真的舒服,由于太舒服了,导致代码写的巨烂巨丑!现在真是后悔莫及啊!!!后面边学边做,慢慢的代码就好看起来了,但是,并没有重构的欲望了!

然后是判题机个各种爬虫功能,也算是Python练手项目了。

然后搞了个服务器,就正式发布了!www.lpoj.cn 了!!

天梯赛和省赛 —— 未放下的ACM

凭借着三个月复制粘贴的积累,锻炼了一手写煞笔题的技术。没想到天梯赛上的分数还能拿到广东省第一名!!省赛也就水了个银牌。毕竟已经退役!但是不得不说,ACM对我的影响非常大,虽然最后的结果很可惜,但是如果能再来一遍,我还是会选择ACM。

Docker —— 新枝的萌芽

随着LPOJ的不断壮大,而且在毕业设计答辩上打动了老师,也获得了优秀毕业论文,所以我决定把LPOJ做得更好。后来接触的东西越来越多,自然而然的就接触了运维的东西。在这之前我的OJ的部署还是npm run dev和python manager runserver
。实在是可笑啊!还不懂得部署运维。于是决定学习Docker . 在这之前,其实也接触过Docker,当时Docker刚刚推出不久,那时候对于Docker的理解停留在轻量级虚拟机的层面上,简单的试用了一下别人的镜像,还不知道他的作用是如此之大。于是我决定使用Docker把我的OJ封装一下,也因此接触了Nginx用于部署前端。然后使用Docker-Compose来编排我的容器。然后也在腾讯云上注册了域名和证书,把我的服务全部升级成了https!至此也算是入门了Docker了,但是这种方式还略显原始,直到我工作后才知道,还有许多非常方便的工具。

上升 —— 伸展的树枝

带着捉鸡的技术踏入了工作,在正式工作前,公司安排了一个练手小项目,要做一个小游戏,作为测试开发的我,不得不熟悉了一下Unity3D引擎。随后就做了一些简单的脚本开发,也因此接触了Flask框架。了解了Python Web后台的另一种框架~然后还接触了Jankins一个很方便的自动化运维工具。可以把一键打包之类的脚本挂上去,在合适的时候,就会触发,非常的方便。

Swift语言 —— 再次的激情

两个月的试用期也算是完成了,进入到正式的岗位后,我先是做一个组内的小作业。没想到这个小作业还是影响了我的技能树,因为我要做一个IOS的小小APP。所以也因此学习了Swift语言。刚开始想着像学习Python一样,边学边做,但是万万没想到,Swift这门语言,深深地打动了我。也许是因为C++是我的“母语”原因,我对Swift语言感到格外的亲切,甚至觉得它比C++更加的优秀,特别是第一次接触协议这个概念,更加是刷新了我对编程的语言的认识,吓得我赶紧买了本编译原理来看了(吃灰)一下。从此我爱上了Swift这门语言!这语法这设计的哲学太美了!新世纪的语言,没有历史的包袱,吸收了许多语言优良的特性,太舒服了!C++也在吸收现代的特性,但是历史的包袱实在太重了呀!没想到,我竟然把Swift语言的英文文档看了三四遍还是意犹未尽!!感觉这是一种享受啊!后来在IOS的开发中使用Swift语言,除了系统库很蛋疼以外,我也充分感受到了这门语言的特性带来的好处。官方的代码各种奇技淫巧深深地打动了我,不断地刷新了我的认识,不断地查阅资料,发现竟然还有这操作!!深深地爱上了这门语言!从接触编程以来,有这种感觉,还是四五年前,刚接触C++ Qt那会儿,还有一开始学习VB的时候,哦对了,还有学习机器学习的时候,所以我决定要用这门语言,搞个大工程!

运维 —— 升华试炼

小作业就到此为止,正式的工作才刚刚开始,我最先的任务是接手一个公司留下来的项目。带着兴奋的心情开始研读源码,凭借着蹩脚的Python基础,勉强能扛下来。但是从中我学到的更多的是运维的知识。一个大型项目,是如何在线上进行维护的知识。可以说通过了解这个项目,我感觉自己升华了!我学习到了前所未有的知识,感觉打开了新世界的大门。不过这次不同于Swift语言,这次是整个人对于编程技术的理解的升华。首先是学习了大型项目使用的运维系统 K8S,和监控系统 Prometheus+Grafana 虽然没有深入的去学习,但是通过学习,了解到了各种运维上的概念。以前各种对于各种服务的不解,也慢慢的一一解开。这也是我第一次,从上层角度,再次审视编程这门技术。关于这里的理解在后面我会再次谈到。在学习了大型系统运维的技术后,我开始在我的小鸡LPOJ上尝试使用这把宰牛刀!感觉的确就是杀鸡用了宰牛刀,但是这中间也深深的感受到了这中间带来的各种好处。从此我的LPOJ可以说是融合了我几乎所有的心血了!

很荣幸,在工作中我参与了一个开源的项目,自己也开始在这个项目上做贡献,不断地发展和完善它~ https://github.com/AirtestProject

AI —— 参天大树

虽然在本科期间做过简单的AI项目,但是万万没想到,现在我还是把它捡了起来。在这之前,我基本上已经了解了编程上各个领域的东西,虽然都不深入,但通过项目,也大概有个了解。不知不觉,我的技能树已经非常的壮大了。但是貌似一发不可收拾,越来越大了。在19的最后一个月里,我打开了深度学习的分支。学习了深度学习的基础知识和各种概念,然后主学强化学习部分。我深知,学习这一块是需要强大的数学基础的,但是作为业务型选手,我并没有深究里面的理论。我以我的编程能力,去快速学习代码和开发业务。但是我的好奇心驱使我,去认真地学习了里面的理论。实在觉得AI并不是计算机的一个分支,而是数学。数学家们只是借助了计算机这个工具,去实现他们的想法而已。

技能树

这就是我2019的技能树,可以说这一年我学到的计算机知识,比我之前会的加起来都要多很多,是一个爆炸式增长,到现在我都没有缓过来。我不知道是不是所有程序员都会经历这个阶段还是只有我自己。我开始重新的审视自己。从初中开始接触计算机便一发不可收拾,我非常的热爱计算机,喜欢钻研计算机技术。也很开心,能把这份热爱带到我的职业中去。我没有像OI生,把他们对算法的热爱,发展到大牛级别。我虽然会很多技能,但是回过头来,我发现我会的东西,都非常的浅显,都没有深入,当然这是相对的。这一年我踏入了社会,我开始不断地回想自己会的那些技术,比如陪伴了我最久的C++,我会熟练使用C++类的概念,会设计,会抽象,但是却一直没有机会把C++的新特性融入到我的项目中去,所以这一块并没有各种C++大牛厉害。再后来学习到的前端技术,更是只停留在会搭积木的阶段,连Js都没有系统的学习过。再到Python语言,当被一个大神用Python把我OJ黑了之后我才发现,我会的Python技术都只是皮毛。Django也只停留在搭积木的会使用阶段,内部各种原理还是不熟悉。还有各种杂七杂八的东西,我都没有一个深入的。稍微深入的,感觉就是一直在使用的Qt了。

我明白我自己的不足,我也知道我自己的技术哪里还可以继续深入学习,但是我还是会迷茫,因为我都想学!!

但是人的精力是有限的。有大牛也告诉我,这个阶段非常的正常,你要做的,就是找到一个分支并深入研究它。但是我真的能做到吗?希望在2020我能找到答案

关于编程的碎碎念

在我刚接触编程的时候,我觉得编程很炫酷,能够按照自己的意愿去编写东西,你编写的东西竟然会按照你说得去做,实在是太神奇了!后来打的代码越来越多,在我接触了运维这个概念后,我对编程有了不同的看法。

何为编程,在我看来,就是一门艺术

或者文艺一点,编程就是创作的过程。比如画家画画,作家写作,舞蹈师跳舞,钢琴家弹钢琴一样。有的人写作是为了求生,他希望他的书能卖出好价钱,但有的人写作是为了创作,为了自己开心或者得到他人的欣赏,这个时候编程就是一门艺术。如果为了卖出好价钱,那么编程就跟搬砖没有区别。网络上有很多开源的轮子,他们创作是为了别人的欣赏。然而就算网络上已经有很多轮子,但是程序员们都有一个特点,就是喜欢自己造轮子。这其实就是创作的过程,比如市面上已经有很多科幻小说,那为何还有那么多作家要写科幻小说呢?撇开这种个人情感不说,就说搬砖这个过程,最好的情况就是,你喜欢造轮子,而且这个轮子还能卖出好价钱。

搬砖也有快与慢之分,好的程序员搬砖有自己的技巧,可以搬得很快,但是有的程序员只是临时培训上岗的,并不知道搬砖的各种技巧,就会搬得比较慢。

一栋大楼的建起,肯定少不了建筑师,如果把程序员比喻成搬砖的,那么建筑师就是程序员里的架构师。在我接触了运维这个概念后,对架构师的理解更加深刻了。不论程序员怎么搬砖,无论他是把砖头横着放还是竖着放,最后的大楼,肯定是由各个模块各个部分组成的。然而架构师,就是要对最后的这个大楼,有一个整体上的把握。从一开始就要分工明确。要成为一个架构师,是非常难的,首先你要了解程序员搬的是什么砖,砖头用的是什么材料,还要知道各个模块应该怎么组合起来。然后还要知道后期怎么维护这栋大楼,某一个模块崩了,怎么做到迅速的恢复。这就需要你要有扎实的技术基础。没有技术基础的管理员那些叫项目管理员不叫架构师,或者我们称之为包工头,比如定好什么时候交工,当然好的架构师也要有管理的能力,明确了解各个部分开发需要时间,这也要他对那个部分技术熟悉才行。

下面这里引入一张技术图片 出自 https://github.com/justinamiller/SoftwareArchitect
在这里插入图片描述

根据我开发LPOJ的经验,我把开发一个产品总结为如下几个过程

假如产品经理给了你一个需求,你要做什么?

这里撇开市场资本因素不谈,仅谈技术,因为市场因素,应该是产品经理所要思考的东西,我们要做到的就是把这个产品做好,怎么把事故率降到最低。

这里从上至下,从0到开发完成,开始谈谈我的看法。仅代表个人浅显的理解观点。

1. 主要技术选型

我认为第一步要做的,是选好一门开发技术。比如做游戏,你要使用哪一款引擎,开发前端你要使用哪一个框架,后端要使用哪一个框架。这里说的是整个产品的代码占最大部分的地方。比如开发APP,使用哪一门语言?
以LPOJ为例:

前端:首要是 Vue.js + Element
后端:Python Django REST Framework
判题机:Python
APP:手机版网页

2. 次要技术选型

这里的次要技术主要是指辅助你开发的各种工具和数据库。当然,这一部分的考虑是需要结合主要技术选型的。如果Django就对MongoDB的支持还不够完善,这个时候我们就要考虑数据库使用哪一种比较好。还有其他一些工具,比如版本管理等。
以LPOJ为例:

版本管理:Git
开发工具:VSCode
操作系统:Ubuntu
数据库:MySQL
项目管理工具:GitHub Project(Github的新功能)

3. 服务的划分

这一步很多人在刚开始的时候,都是边做边想的,但实际上,这一层至关重要,我们必须尽早的确定下来。因为很多时候,开发到一半,会发现服务之间,耦合非常的严重,导致整个服务非常的臃肿,不便于维护管理。这一步通常叫做模块的划分,我们要把整个产品划分好各个模块,每一个模块都可以单独的进行测试,这样就可以很方便我们维护。
以LPOJ为例:

  1. 前端
  2. 后端
  3. 判题服务器
  4. 判题机
  5. 爬虫服务

4.服务间的通讯方式

服务划分完之后,就要考虑服务间怎么通讯了,在我开发LPOJ的时候,可以说是边开发边思考的,遇到了需求就随便的找了一种实现方式,但这其实不可取的。因为现在越来越多的通讯方式供我们选择了,每种方式都有他们优缺点,因此我们要提前确定下来。这里的通讯方式也包括与数据库的通讯方式。而且服务间的通讯方式,也决定了我们后期运维时的各种细节。
以LPOJ为例:

  1. 前端和后端使用 Axios库通讯(类REST型API)
  2. 判题服务器和判题机使用TCP通讯(这里其实有更优的解决方案,比如ZMQ或RPC)
  3. 判题机和数据库采用Python提供的MySQL接口

5. 设计模式

这个时候已经是开始开发的过程了,在开发的过程中,我们要提前确定我们的设计模式。这些模式都是前人总结下来的经验,非常有利于敏捷的开发。确定好设计模式后,我们就开始搬砖了!

以LPOJ为例:

  1. 前端 MVVC (Vue.js决定的)
  2. 后端 MVC (Django决定的)
  3. 判题机 无 (工程比较小,没有体现设计模式的思想)

实际上,在大型项目开发中,这非常的重要。

6. 文档编写

我认为,在开发过程中,就要开始文档的编写。为什么要写文档?你不写,后人不会使用你的系统,你不写,后人无法维护你的代码,你不写,你自己也无法维护你自己写的代码。一般一个月不碰你自己的代码,基本上就忘光了。所以写文档非常的重要。而且边开发边写,因为你开发完后,你很可能已经忘了你以前写的代码逻辑是怎么样的了。而且我认为,文档可以分为两类,一类是给使用人员看的,一类是给开发人员看的。其中使用人员也包括开发人员,比如开发人员有时候要使用你开发API,你要告诉他怎么使用。开发人员的文档,可以写在注释里,使用人员的文档可以做成一个文档网站,这样比较方便。而且现在也有非常多的写文档的工具,一键就能生成非常好看的文档!比如LPOJ使用的就是 VuePress.js.

7. 确定部署方式

到了这一步,恭喜你,你已经完成了搬砖的过程,接下来就是发布你的程序了。在开发过程中,你的环境,我们称之为开发环境,这个环境可以方便你调试,你可以看到各种调试信息,比如npm run dev。但是如果我们要把这个产品发布,你不能直接发布源代码,而是发布一个产品,这个时候,我们就把你发布的环境叫作生产环境。生产环境是不应该出现各种调试信息的,因为这样很不安全。而且通常一些框架都会自带一个测试环境给你测试,但是这个环境效率通常都比较低,因此我们要确定我们的部署方式,就是如何交付你的产品。
以LPOJ为例

  1. 前端 Nginx (一个非常高效的Web服务器,用户访问我的网站相当于访问这个服务器,这个服务器可以高效的把网页发送给用户)
  2. 后端 unicorn + gevent (通过Python manage.py runserver的方式是使用Django自带的Web服务器来启动服务器,是单线程而且很低效的,通过使用多进程+多线程的形式,让你的后端变得高效起来)
  3. 判题机 直接python main.py

8. 接入运维系统

这个过程才是发布你的程序的最后一道关卡。一种低端的方式,就是把服务部署在各个服务器上,然后用户访问你的服务器就OK了。但是万一某一个服务崩了,极端情况下,你要一一检查各个服务器,再看看这个服务器中哪个服务崩了。在项目做大以后,这会非常的耗时间,因此我们需要接入一个运维系统,可以非常直观的查看你的服务,并且可以动态调整你的服务。通常这一步都离不开Docker,你需要把你服务打成一个镜像,然后运维系统就会运行你这个镜像。当然这其中涉及的东西非常的复杂。通过运维系统我们做很多上层的事情,比如主机资源管理,服务调度,服务间负载均衡,证书管理,版本管理等等!然后我们可以结合监控系统,把我们的服务都监控起来,一旦出现问题可以迅速恢复。常见的运维系统有K8S。以LPOJ为例,一开始使用的是Docker-Compose,后来改成了RancherServer。

结束语

终于把这一年来的感想敲完了,上面只是个人看法,也不知道自己理解的对不对。也许在不久的将来,我会有更加深刻的理解。不得不说,这一年我的技术增进了很多,但是要学习的东西还有很多!

很高兴在2019,我遇到了更好的你,2020也请多多指教
2020-01-25

Logo

前往低代码交流专区

更多推荐