昨天接到公司技术总监电话,去日本大阪工作已经定下,任职日本分部的技术负责人,全权负责日本分部的人员招聘管理,团队建设和技术方向管控,在这公司做了三年半纯技术,终究又被派到了管理岗位,这次是要好好认真的做好技术管理了。

趁着明天五一不上班,做一下这些年的技术方向和简单整理。

技术方向

Call to adventure

一切从06年开始,大学玩了四年游戏混迹网络一事无成,也不知道接下来怎么办。这时碰到一个时机接触到RPG Maker xp这么一个软件。它是一个简单的日式RPG开发工具,只需要简单的做一些脚本设置,就可以做出一款简单的游戏来,当然需要更多的自定义功能的话,需要自己添加 Ruby 脚本(因为是日本人开发的,日本人最爱ruby)。期间也接触了一些flash小游戏,于是用过网页三剑客搭配几行 action script 做过一些小东西。

基本当时就是昏头的苍蝇,看到什么就玩什么,游戏编程只是恰巧是其中之一罢了。

技术关键字:编程的概念,Ruby皮毛,ActionScript皮毛


Meeting a mentor

随着同学答辩,大四快结束了,心里很着急,突发奇想不如做游戏好了,于是从武汉启程到了北京,跟着李sir的程序补习班先学了一点点简单的 J2ME 的摩托罗拉手机游戏开发入门,然后学了些C++基础,并第一次接触了Direct3d固定渲染管道,当时刚出Directx9.0的样子,但做面试demo的时候还是用了很多的direct7的 directDraw,通过这个3d demo找到在北京的第一份工作。

这段时间非常非常刻苦,租150元一个月的8人通铺,窗户都是破的,冬天的北京深夜敲代码作业,手全冻疮肿了,熬过来了。

技术关键字:J2ME皮毛, C++入门,d3d皮毛


Departure

第一家公司的人都是金山做《剑侠情缘》出来的,有一套现成的稳定的引擎代码,用C++ builder的VCL组件+directdraw开发的,当时主要让我做的是一套内挂系统,就是自动寻路打怪捡东西的功能,但是内嵌在游戏内的UI功能中的,现在很常见,但在06年,还是非常新颖的做法,而被当时的我认为是“不齿的”做法。

于是我了解了大量的游戏客户端的逻辑框架,例如场景角色管理,技能管理,UI,动作状态管理这些东西,也包括他们的那套自定义的静态解释脚本机制。最后做了p2p下载器和lua脚本的更替,当然,都没有真正上线使用。

因为C++builder的组件实在太好用了,很容易做小工具自己玩,于是自己捣鼓了不少小软件,顺道也自学了同样属于borland公司的delphi,语言是object pascal.

当时其实很菜,老大基本不依赖我做出什么,好在工资也奇低,就1500,所以没责任没压力没存在感,可以慢慢学。

技术关键字:C++进阶,游戏客户端逻辑框架入门,VCL入门, ObjectPascal入门, p2p皮毛,MFC入门, LUA皮毛


Trials

然后还是图钱多,去了深圳。公司是新公司,但也有一套非常成熟的2.5D引擎(其实是3D引擎啦,只是性能限制,尽量锁死视角。),新来的程序员一起负责消化这个引擎,并换皮做个游戏。我被安排负责UI,特效部分的研究,因为引擎非常成熟,还附带有一堆的编辑器,粒子编辑器,材质编辑器,动作编辑器,特效编辑器之类的都要处理。 后来还和后端人员配合把登录部分的功能做完了,出了个简单的demo。

期间沉迷于引擎学习,特别是因为有个3D狂热爱好者“仗剑”的影响下,对3D渲染方面也加强了非常多,业余对 irrlicht 做了很深的研究,写了好几个第三方功能扩展库和学习demo,可惜的是这个引擎挂了。

另外也学了ogre,后来在隔壁的一个公司做了一些类似Wii的视频捕捉游戏,用的就是Ogre + CEGUI(不得不吐槽,CEGUI真难用),我还专门写了非常庞大的一个地图编辑器并且使用了命令设计模式和插件思维,可以说是代表了我当时最高的软件设计能力,可惜代码应该是丢了。不过,想到当时如日中天的Ogre,现在也没有了任何信息,也就没什么可抱怨了,no king rules forever。

期间还接触了最原始的网页游戏,PHP+JS写的,业余也自学了一段,终究觉得太奇怪,放弃掉了。

当时那段时间是我学习最快的时间段之一,这一票子朋友也是一直是关系最好的一圈朋友,07年在深圳打拼的人,身上都有一种劲头。现在大家混的都666,当时就我技术最菜,现在恐怕也差不多。

技术关键字:3D进阶,游戏引擎进阶,Ogre+CEGUI/Irrlicht进阶,PHP皮毛,MFC进阶, javascript皮毛,服务器皮毛


Challenges and Growth

然后被李sir召唤回了北京,口头原因嘛,想学到新东西,心底原因嘛,还是钱多。

老师没让我失望,他这边也是开发3D MMORPG游戏,demo已经有了,在进一步完善。于是我先是被安排处理物理碰撞问题,然后处理了一些音频问题,然后他把服务器全推翻了,于是跟他一起酸爽的重写服务器框架,数据库的设计和开发,网络层IOCP/epoll,期间我要着重说道一点:没错!我们用了万恶的超重量级的ACE网络库,它的模板编程看的我每分每秒都想骂娘,这是我编程历史上觉得最难理解的库,没有之一,甚至从这之后,我对c++这个语言都产生了阴影 。

最后08年经济危机公司挂了。虽然项目没出来,但我眼睁睁的从0看到了一个服务器组的出现,可以说是为我打开了一扇新的大门。

另外,之前主要做一些简单的逻辑功能或者一些渲染相关的东西,这次确确实实的被逼上了不熟悉的“前线”,李sir毫无疑问是我接触的第一个有“技术科学家”气质的人,比起开发,他更喜欢研究。这点对我也有一些影响。

技术关键字:服务器组框架入门,网络入门,数据库入门,物理入门,音频入门


Bad smell

然后我再次回到了深圳,这次做起了主程序。

当时公司有一套ogre 做了一层封装的引擎,也已经有了demo,我更多是负责客户端逻辑框架的搭建。当时还有个服务器主程序,能力很强的台湾人。他也是既懂客户端也会服务器,而我在李sir的“关怀”下也对服务器有了一些了解,俩人都年轻,技术也有的谈,很快我们成了朋友,然后……他也很快的跟他的漂亮老婆回了台湾,结果,客户端服务器两边的逻辑就都丢到了我一个人头上。

于是公司大量招人,我自然是面试官。第一次掌控别人是否入职,薪资评定,第一次在公司有这么重要的位置,开会我主持发言,策划美术有问题都找我,也和很多策划同事玩的挺好,我被夸的上了头。

这段期间,没有学到什么,没错,几乎就没学到东西,连自学都断了。除了一点点管理知识,但后来事实证明,我的管理挺失败。

啊,当时还有个事,就是当时狂妄的自大也导致了和第一任女朋友发生了多次争吵,我该引以为戒。

公司最后差点被腾讯收购,但我是非常痛恨腾讯的,也没去,跑路了。

技术关键字:客户端逻辑框架熟悉,服务器逻辑框架熟悉,管理入门


Helpers’ abyss

那段时间我的运气其实很不错,人在27青春年华,做过主程序,前后端引擎都懂,机会非常多,腾讯,北京大宇,日本光荣都有offer,所以人一直在飘着,于是就“该死”了。

从深圳跑后,我被网友介绍,去了日本konami做PSP的开发;没做几天,之前的台湾哥们召唤我去成都,做gamebryo的引擎和客户端开发;又没做多久,两位朋友到成都召唤我一起去北京创业开了游戏公司。

心比天高的三个年轻人聚在一起,上来直接要做3D MMOARPG,招了三四十个人,开始动力很大,我整天睡在公司,结果困难重重,三个月只做了一个单机DEMO,进度不佳加上投资人资金链断裂,公司再次挂了,那俩朋友还因此互相憎恨起对方,实在令人扼腕。

就是在那段日子里,我和初恋女友分手了,因为自持有创始人特权,整天喝着酒敲代码,虽然也学到了一些东西,但对我来说,依然是一个深渊。

半年多时间,因为朋友关系三地奔跑,都无疾而终,终于把自己的人品耗尽了。

技术关键字:3D美术对接入门,客户端逻辑框架精通,服务器逻辑框架精通,lua入门,gamebryo入门


Death in confused

因为11年创业公司挂了,三四十号人的解散,还是令我很有责任压力,最终,还是联系到一个公司愿意基本全部收留我们,于是我也顺道过去做了主程序。

原本计划打算立新项目的,但公司临时砍掉了,导致我无所事事,挂了一个开发三组主程序的头衔,跑去一组二组做各种支持,但显然不容易被接受,期间只能被安排做了一些shader相关的优化工作,以及美术流程对接工作。

公司一组二组用的引擎是Unreal2,其美术开发流程也的确很有自己的一套规则,所以也是做一些事情。

但很快,公司CTO出了一些问题,和CEO干上了,最终CTO跑路。于是CEO将大量的技术管理,技术方向制定的问题交给我处理,嗯,我在不到30岁的时候成为有200多号人的公司的“技术负责人”。

完全做管理的代价就是:技术毫无进步。

如果一定说有进步的话,可能是更容易理解BOSS的话,以及能更清楚的看清楚一些形势了吧,然而这些东西并没有在后来的生活中给我带来足够的好处。

最终,因为一些魔幻的原因,我再次离职,回到了深圳。(没错,非常十分很唐突,我想当时一定是被下降头了。)

技术关键字:Unreal2入门,cryEngine皮毛,shader入门,管理进阶


Revelatiom

这次我死也不做管理了。

于是我到了一个页游公司做小弟。之前一直做pc端游,对页游理解很少,只记得当时有一个3D页游非常火,我在其中花了有数千元,深感这个平台有希望,于是果断跳槽做页游。这是第一次我薪资下降,却远远不是最后一次。

这公司有个腾讯出来的CTO,很厉害。我当时跟他做服务器方面,接触了很多之前不会去做的,例如linux平台下开发和运维(之前我不用VC是不会敲代码的),学习了memCache做缓存,一些简单的AS3开发之类,还没来得及学更多东西的时候,快播出事了,我们公司是快播投资的,它倒我们也跑不了,于是第三次和深圳说再见。

技术关键字:linux基础开发和操作入门,memCache缓存机制入门,数据库进阶,游戏服务器进阶


Atonement

然后我被朋友介绍到了无锡,任职服务器主程序。

那里风景很美,人心淳朴,工资很高,消费很小,但加班极其严重,正常情况下都是晚上12点休息,上版本debug的话2-3点也是常事,公司提供住宿,宿舍和办公楼临接有走廊,我可以过一个月不见天日的生活,嗯,比现在的肺炎隔离可毫不逊色。

在公司主要是开发游戏服务器逻辑功能,维护游戏服务器的稳定运行,以及一些性能优化等工作。我在那里呆了两年半,是之前而言最稳定的时间了。

但因为长期的作息不规律,人的精神状态始终很差,也没有什么自学欲望,基本上我的超强自学能力就是在那里被断送掉的,直到现在也没恢复回去。

啊,对了,中间想学一下前端AS开发的,但始终没有真正去做,到是认真学了一段sliverlight,结果是微软将它放弃了……所以基本就是白学。

最后任职项目经理的阶段,到是为了手游开发做了一些cocos2dx的学习准备。

技术关键字:lua精通,游戏服务器组架构精通,数据库掌握,管理进阶, sliverlight掌握,cocos2dx入门


New start point

我第四次回到深圳。转行手机游戏开发。薪资从5w+降到1W5不到。带着妻子。

上来我就开了大招,然后也被回应了一个大招。深圳入职的新公司就我一个程序员,做了一年,从对手机一点不懂,cocos2d仅仅入门,到顺利出了产品,一切都是神奇莫测。

然后我果断又跑了,工资低,又没牛人,学不到东西。

这次依然是深圳的一家大型公司,公司里还是有很不错的优秀程序员的,只是我总被几个项目组调来调去(原因我反而记不起来了),大致做了一些Unity3d的角色管理,多种shader编写,cocos2dx骨骼动画支持,自定义图片压缩等专项技术功能,期间对cocos2dx的确是非常熟悉了。

但是时间并不长,我的第二次噩梦来了。

技术关键字:Unity入门,shader进阶,cocos2dx进阶,Android开发入门


Betray

当我在无锡得知有第二次创业机会的时候,我是非常开心的。那时我的作息被破坏,人处于行尸走肉的状态,自学完全停滞,也希望自己能得到一些梦想之火焰。于是大幅度降薪来到深圳。

在自己研究+偷师学艺一年半之后,我们都认为时机成熟了,于是和朋友一起创业继续做游戏开发公司。

公司得到网易的投资,资金链稳固。我找到了三位核心程序,也吸取了先前的经验,不出DEMO绝不扩人。而我先前在无锡做了很久的服务器,这一年半也认真学习了cocos2dx,又有自己主导的产品上线,一切看起来会非常顺利。

然而,不到四个月时间内,项目设计案多次更变,甚至从2D项目换成3D。引擎从积累多时的cocos2dx,转换为Esenthel3d,刚用它做出demo,美术觉得效果不好,最终决定换到Unity3d。我积极性下降了,最终被合伙的朋友开除了,而且我介绍的三位核心程序也均被开除。

这是有史以来我第一次被开除,我也不知道怎么面对那些被我拉出来的程序朋友,就直接在家里闭门做了接近俩月独立游戏才找工作。

那四个月时间到是没有浪费,依然是除了睡觉就在公司的节奏,进步很快。之后在家的独立游戏开发进展也不错,还顺道参加了game jam。

技术关键字:Unity了解,Esenthel掌握,godot了解,cocos2dx精通


Crossing threshold

为了证明我不是“被人开除的废物”,我决定不再在中小公司混,我要进入大厂,而我讨厌腾讯;而那个创业公司是网易投资,我不想回去太尴尬;暴雪中国公司没有开发职位;于是我投递了简历给游戏开发大厂 EA和育碧。

然后到了EA做极品飞车。

EA的开发人员能力之强,令我咋舌。他们强的不是编码能力,而是自主解决问题的能力。

我之前面临的大部分问题都是上网查一下基本就可以得到结果的,要么就是跟踪代码上下文,好吧,更厉害一点,用一些辅助工具辅助库,必然能解决,还不行的话,多半会放弃掉,从设计层面或者其他层面去处理。

但EA解决的都是方向层面的问题,创造性的问题,这种问题每个细节点都依赖巨大的知识积累,而且几乎不给“讨价还价”的可能。但他们就这么死磕解决了,完全靠全面的技术视野,和坚实的技术深度撑得。

这里我到是可以以后再细谈。

总之,当时虽然没有什么“功劳”,却也熟悉了游戏引擎的一些开发机制,以及shader编译的很多细节问题以及标准。没错,我很用功,但收益却很小,因为太专项了。

最终我因为自己没有产出,自惭形秽离职了。

技术关键字:引擎优化掌握,shader编译流程精通


Another dawn

我认为自己输在了英语上,因为英语不好,导致看一手资料白皮书这些能力不足,输给了EA的那些程序员,所以之后我坚定的选择外企,以有更多机会锻炼英语,最终找到了这家新加坡公司。

我在这家公司呆了4年,几乎一点都没有一路顺风,四年,四种生活,四个职位。

第一阶段:软件开发工程师。

开始我面试的是游戏部门,但中途被当时公司人事另行安排,强行调到网站开发部,因为当时公司业务分离,游戏开发部和网站开发部刚好从统一的技术体系分割为两个部门,而网站开发部最开始没有C++人员,全是php/java/js程序员,导致无法承接一些网站附属软件的支援工作,于是招我过去做一些c++的mfc软件维护,属于编外人员。

因为工作不多,比较闲,所以很快就开始做各种奇怪的事情。包括用 QT, DuiLib, selenium 做一些网页自动化软件,然后用c#做内部通讯软件和浏览器二次封装,又用纯c做了一些公司内部USB驱动、键盘驱动的安全管理。

因为工作不属于核心业务,实在没压力,技术栈又无人可审核,一切完全自己管控,所以这期间我自学了很多的东西,除英语之外,还认真学了monoGame(U3D底层依赖), VoxelGame(体素游戏,例如maincraft),另外,就近原则向同事们认真学习了JS开发,特别是phaser.js,所有自学都是基于游戏开发,因为,时刻准备着被调到游戏开发组。

技术关键字:JS游戏开发掌握,C#winForm开发进阶,devOps开发入门,驱动开发入门,浏览器渲染基础入门

第二阶段:大数据工程师。

然而,虽然我身在曹营心在汉,公司却迟迟没有将我调到游戏开发部的样子,而且游戏开发部甚至直接搬离了我们这边办公区,原本打算慢慢混熟关系,托朋友调岗的想法也逐渐没有希望了。我逐渐又失去了干劲,BOSS看出了我的想法,把我调到了大数据开发组。

大数据开发组老大是个台湾人,光头大叔,很爱笑,像琦玉老师,很会因人适宜的用人。他先让我从负责开发golang API服务器,js前端图标可视化入手,然后一步一步开始docker,k8s,服务发现的devops工作,最后转向Scala ETL以及python 算法的开发,期间逐步引导我去熟悉hadoop, spark等大数据相关的信息,使我逐渐了解整个大数据数据处理流程和框架,可以说是完美的新人导师。而且他还给我们经常布置一些side-project,连我的自学都给指引了方向。

后来他离职了,大数据组也基本散了,我才知道他是台大(就是国内北大)的博士生,另外,当时坐我隔壁的那位数据科学家也是约翰.霍普金斯的lecturer讲师,但终究又是散掉了。

那段期间我基本没有太多精力自学,一年时间吃掉大数据的那么多新鲜东西已经很费力了,唯一一点时间就是前期还没有全力投入的时候,学了一些区块链Solidity合约编程和人工智能深度学习的东西,后面就跟着公司节奏学大数据了,最后我有考虑转数据科学家,于是在coursera上学了一系列统计学以及数据建模,数据分析方面的课程。

但终究没有意义,覆巢之下无完卵。

技术关键字:大数据基本框架了解,Hadoop/Spark技术全家桶了解,linux进阶,golang进阶,python入门,scala皮毛,各类数据库优化和设计掌握,javascript网页开发掌握,区块链入门,人工智能入门

第三阶段:网站安全/渗透测试工程师。

大数据组分崩离析之后,我也失去了主要任务。此时,我们的销售网站受到了不明的黑客攻击,于是公司派我去做一些调研工作,从此踏上了安全/渗透工程师的道路。

首先做了一些WAF防火墙,设置蜜罐,代码审查防止sql注入工作,之后为了进一步防范,公司招募了台湾的安全工程师配合一起进行了红蓝对抗,因为对方善于蓝方,所以我就全职演练渗透模拟。期间熟悉了不少渗透框架metasploit, burpsuite, nmap, AWVS, sqlmap, Nessus, hydra这些kali linux常规套餐, 对python编程和php也有一些了解,期间顺道做了一些大小马,自动化漏洞扫描工具和爬虫等工程,也配合做了一些安全工程师的各种防御性工作。

技术关键字:渗透技术掌握,kali linux渗透工具掌握,PHP网页入门,JS网页掌握,挖洞入门

第四阶段:IT顾问。

嗯,没错。经过一番折腾,公司受到的攻击减少了,也有专门的安全工程师部署的waf以及代码的审查制度,更偏向于渗透攻击的我,工作内容再次下降。于是二度成为了游走的救火队员。

这次就非常夸张了,C# .net网页开发,基于xposed对Android进行定制修改任务,基于NLP的自动客服系统,用户付费时需要的面部识别视觉神经网络,基于小型IOT设备机Arduino和RaspberryPi的体感设备嵌入开发,到接手aardio开发的驱动外包项目的维护,python,Django,Flask开发的管理平台,node.js开发的DNS检测后台,以及最近安排的java spring全家桶+VUE全家桶做项目管理系统任务,没有任何一丝一毫的相关性。

从嵌入式,互联网全栈,大数据,人工智能,手机App全部技术决策会议都被要求参加并做评审。这不是全栈,是全能程序员,就这样天天挑战的日子,又过了快一年。

终于,接到通知,去日本分公司做技术负责人。

技术关键字:……how to define my JD? can’t use any keywords.

第五阶段:技术负责人

反观回去,很久没有做管理职位了,就之前的表现来说,自己也没有表现出很好的管理才能。庆幸的是有多位不错的leader为我做了很好的榜样,接下来又是更大的挑战,是要翻开一个新的篇章了~

Risk ? or a opportunity? that’s a question depends in part on me.


An end not the end

总之,10年+游戏开阿发,4年互联网周边开发就是这样,只要在这家公司,我还会更多的接触互联网工作。

接下来,需要更多的去补英语和自己的知识组,形成技术图谱。

我现在并不担心之后无法转回去做游戏,因为我前不久抽空去看了看之前觉得很不容易理解的unreal代码,现在可以很轻易的找到头绪去分析,也拥有了更直接的学习途径,问题解决方案也有了更简便高效的方式。

那些看似毫无关联的技术点,其实其中都有蛛丝马迹的联系,我认为这就是我之前输给 EA 程序员的核心原因,起码是之一。

好吧,继续加油。


闲聊技术

安卓开发

安卓上我的开发不多,没有大型项目经验,但无论cocos2dx做游戏最后通过jni提供给安卓java开activity调用,还是偶尔reactNative做小app,甚至用Retrofit,okhttp做一些测试demo,也会经常使用简单的安卓开发。

公司在中间有一段时间,安卓人员流失严重,个别在岗人员也有事请假,所以有2个月左右时间安卓人员面试是由我进行,为了装做高深,也是认真研究了一段安卓的面试题……

后来做了一段xposed的内核嵌入,还有和竞品的调研工作中被迫大量的对apk进行逆向,过程中也是了解了不少android 代码结构和开发库之类的。

大致来说,这个相当于干了一年的新手程序员的状态,底子不怎么扎实不能解决疑难问题,但能凑合做点小APP自己玩。

我觉得android开发最重要的想法之一是投资kotlin,它的代码比 java代码少不少,而且还有很多不错的特性,例如java只有线程,而kotlin有协程;支持lambda表达式;支持包外扩展函数;委托,单例的标准化;类型推断和智能转换这些都算是新语言都必有的特性。

不仅仅在手机上,Kotlin已经完全可以替换 Java,而且在后端开发也有这个趋势,例如 spring boot可以用kotlin开发。虽然kotlin可以自动转为java代码,但是机器转换还是有不舒服的痕迹的,很少人这么做。建议还是学会kotlin比较靠谱。

另外还有就是跨平台开发是很重要的,所以对javascript的React native,以及Dark语言的flutter都要保持关注。

顺道说说这俩东西

  • reactNative是你用 javascript 写页面布局,然后reactNative会将布局解析生成原生控件在做渲染,简单来说就是的html标签,给你转义为android的imageView/UIImageView原生控件类,然后丢到某个activity里。
  • Flutter的话更像游戏开发的openGL/OpenGL ES,android只要给个surface和Canvas,好了,接下来就是flutter自己的widget管理,它的底层是C++的,性能不错。但注意的是,它的开发者我怀疑是严重网页开发粉,虽然使用的openGL这一套机制,却依然在里面用上了网页那一套,内置虚拟dom树,布局结构也非常的有html味道,另外也有一点点VUE的万物皆component的感觉,它则是万物皆widget。

因为我是游戏开发出身的,的确更喜欢flutter一些,但是要注意的,flutter有先天的麻烦,就是它是自己的一套UI管理,后果是如果你想内嵌一个android原生的东西,例如webview,都是很痛苦的事情。

reactNative则不会,它解析完了就是原生的android UI,所以里面内嵌任何android原生东西都很简单。

不过从设计理念上来说,我个人看好flutter,毕竟它是独立无依赖的,所以发展速度也好,执行效率也好,都显得更加轻松灵活,reactNativa背负的包裹太多,我不会考虑投资它,除非我原本就是react web程序员。

最后第三项建议就是,可以多投资一些android,因为现在物联网IoT这些在发展,android是该领域一定无法逃开的模块,我现在已经看到不少物联网,以及人工智能的小硬件工具底层都是android系统的。


网页开发

一般网页开发分为 前端,后端和全栈三种。其中,全栈就是前后端都做,我觉得如果仅仅是为了省API沟通那一层,意义其实不大。更多可能是历史原因,因为之前很多动态页面都是后端完全处理好,不仅仅是数据,也包括页面布局,一起组装好交给前端,所以逼出来的全栈。

其实对于我这种做游戏出身的人看来,有些不可思议……你让后端开发人员做做渲染pipeline我看看?

当然,互联网和游戏这俩业务有很大的不同性,这里不多说了。好事是,现在互联网网站开发也开始推崇前后端分离了,我是好事。

前后端分离是个很重要的方向,意思是,让前端负责页面路由和数据传递渲染方面,后端仅仅负责数据提供(API,Controller)以及业务逻辑(Service)和存储层(Enity->ADO->ODBC/JDBC->DB)方面。它的好处是将整个项目的复杂度进行拆开,工作安排也相对更加明确。

  • Django: 过于全栈框架了,前后端不能分离,让我感觉很差。而且当项目过大的时候,代码很散,实际上非常难以控制。
  • ASP .net Blazor:最近刚兴起的一个C#的全栈框架,对它了解度不足。不过,其客户端模式号称支持webAssembly,我是很喜欢这个技术的。另外它的好处也非常明显,C#语法远比js健全,而且该框架前后端都负责,不用学更多东西,比较省事。但就现在看起来,其完成度还不够高,而且我曾经大力投资sliverlight,后果令人失望,使我对微软缺失信心,先观望一年看看。
  • node.js系列+VUE3:都使用 typescript,看起来能在这个领域混好很久,语言也比较统一,个人觉得值得投资这里,nodejs技术的框架主要有express, koa, 基于express的nest,以及eggjs。一般来说,express, koa偏底层,nest,egg偏应用层,其中nest和Angular非常友好,简直是一对,但是我不是太喜欢angular,所以主要采用的还是 Nest + VUE.
  • 整体来说,我会强推 Nest + VUE3,都支持ts.

前端框架

  • Angular: 很稳定从2到8兼容很好,支持typescript,数据双向绑定,使用service状态管理,依赖注入使得实例化比较简单,纯MVC结构也使得更适合大型项目。
  • React: 改动比较大,从ES5到ES6到现在的,数据单向绑定使用更繁琐,使用redux进行状态管理,它可以便利的开发多页应用程序。
  • Vue: 3.0支持typescript,数据双向绑定,使用vuex进行状态管理,它的学习曲线平缓也很轻便灵活。
  • 就我个人而言,没有做超大型网站,一般的管理后台之类的,用VUE就是完美的,如果有必要的话,我会考虑angular,而react里面一些奇怪的数据流让我很难受,支持typescript和路由都要额外设置很不方便,我不会选用它。 VUE > angular > React

后端框架

  • .net core:这个C#的,用来写后端,也可以跨平台的哟,兼容.net framework很良好。它和spring boot相当类似,基本是不分伯仲,唯一区别就是java阵营实在太强大,而MS之前总是在windows那一亩三分地混,导致人际关系不好,即使用mono向外闯,还是略晚了一步。
  • spring/spring boot: 这里顺道要提一下 springMVC,讲真,真不行。建议能学vue,react,就不要再用spring MVC了。不过spring boot做服务器还是非常优秀的。
  • go系列:一般做后端服务,提供API那些,性能非常不错,语法也简单,容易开发上手。就我现在了解, beego略胜于gin,我当时开发的时候用的是 gin,略微后悔,在正则路由和数据库ORM处理上都输了一些,结构性也不如beego。我推荐beego。
  • flask: 我用它做过简单的API服务器,感觉怎么说呢,很轻量级容易入手,但感觉过于简单。另外在性能上实在问题有点严重,可能是我的技术问题,当时一个API服务器一秒200多个连接压测就卡顿到不行,还好当时需求不强,也没解决,但是很怀疑它。
  • Lavaral:额,我差点忘记PHP这个天下最优秀的语言,它有个知名框架是lavaral,用过没几天不好评价。后来也很遗憾我一直没机会去学习它,除了在做安全工程师的时候发现PHP的劣迹斑斑之外,基本没有什么印象。虽说PHP7做了非常大的改动,但我依然没有办法给他投票,原因很简单,技术栈太少。
    • C#可以做winform软件开发,可以做全栈,可以做mono游戏,可以用Xamarin做手机跨平台。
    • go可以做后端服务,微服务, DEVOPS,云计算,区块链等。
    • python可以做自动化脚本,人工智能科学计算,web后台,爬虫,云计算。
    • Java可以做各种商务系统,企业应用,分布式系统,WEB应用,android手机。
    • 你说说PHP除了做个web服务还能干啥……
  • 就上面几个而言,我会优先选用beego,因为我是C++出身的,喜欢简洁工具库,不是特别喜欢限制性强的框架。如果队友是java开发系的,我会采用 spring boot。 Beego >= spring boot = .Net core > flask > Lavaral

人工智能

包括大数据分析,模式识别,专家系统,机器学习等等,我当时学习重心主要在大数据分析,NLP,以及计算机视觉识别方面,从最基本的线性回归,逻辑回归,到CNN, LSTM, RNN都认真了解过,比较熟悉,做过简单应用。

但对于更传统的SVM, 随机森林,贝叶斯,PCA优化就是只了解定义,没用过。

而对于更底层硬核的的,例如sigmod, Tanh, ReLu激活函数比较,梯度膨胀解决方案,感知机的比较之类就没有经验了。

而更新的对抗学习,转移学习就是只有时间去看看皮毛了,但是我很看好这两个方向。

所以大致级别是学了一年左右的大学生,有两三个小DEMO的状态,工作中也是只会调调API解决样例性质的问题。

Python是最适合最简单的进行该领域的开发语言, go性能虽然很好,但是当前支持库还是不足以支撑,Java毕竟老字号完整生态圈,所以也可以用来开发人工智能相关,它们主要支撑是应用层库。

到底层算法和内存文件管理的地方,毫无疑问,C/C++效率更好,Rust可以观望。

但是在数据科学方面,Python是前狼后虎的,前面有MATLAB,R,后面是Nim, Julia在奋起直追,前景堪忧。

  • Python: 现在Python最大优势其实不是简洁,而是有大量支持库。其性能问题已经劣势尽显

  • Nim 命令式静态语言,其优点是

    • 性能非常高,能逼近C
    • 能非常便利的和C,C++,ObjectC以及javascript进行集成编程
    • 能生成C和javascript语言代码,还能将python代码转为Nim代码

当前缺点是:

  • 非常非常缺少第三方库,没有重量级产品和库。

  • Julia 强类型的动态编译型语言,其优点是

    • 速度很快,也能逼近C

缺点是:

  • 当前仅仅适用于科学计算领域

大数据

大数据主要就是进行 数据收集,数据清洗,数据统计分析 的,所以它的过程也非常明确.

  • 用kafka, RocketMQ, RabbitMQ, ActiveMQ, ZeroMQ等等各种MQ, Redis之类的进行数据收集,包括各种日志,爬虫,数据库信息都抓过来。
  • 然后因为数据量很大,一般的mysql, mango这种数据库可能不足以支撑,就会使用一些特殊的方式进行存储,例如建立在hadoop的HDFS文件系统上的hbase列数据库,hive等,用他们建立原始的数据仓库。对一些临时的小型的实时数据仓库可以使用flink, storm等,周边辅助也有sqoop, flume等。 在建立数据仓库这步对数据表设计有较高的要求。
  • 然后做一些数据清洗和分类工作,也称为ETL/ELT工作,一般离线的超大数据会使用hadoop mapreduce,用azkaban设置定时任务,用Sacla,python做一些编程工作,对数据做操作。实时的会使用spark streaming等进行编码工作。期间对各种分布节点的控制,则需要用k8s, zookeeper等进行服务管理。 这一步对软件架构能力要求较高,对了解shuffle机制的编程设计技巧也有要求。
  • 通常上一步处理后的数据,已经做了一些垃圾数据清除,以及针对某些功能的筛选,我们得到了干净的并且针对某种功能的特征数据集存储在分布式数据库中,例如Elastic search等,或者关系数据库Neo4J,文档数据库mangodb等,然后对这些数据集进行编码做一些聚合统计工作,此时数据科学家会介入,设计出数据分析算法,程序员将其实现,最后得到一些想要的预测或统计分析结果,存储到普通的数据库中。 这一步对统计学和算法要求比较高。
  • 然后写个可视化网页,跟做网站一下,一边API服务器读最终结果数据,一边前端JS渲染各种图表让决策者或者用户查看。这一步就是传统的网页开发要求了。

大数据和传统的编程开发有一点点区别,在周边软件使用,架构设计,以及统计算法方面有额外要求,业务层本身开发反而不多,即使有一些也非常重视性能,和常规的那些开发不太一样。

我在这里虽然只做了一年时间,但因为老大给了足够的支持和教导,还经常开培训交流会,自己业余时间投入性也非常高,所以进步效果非常不错,已经可以做不少的事情。大约可以顶一个两年左右经验的大数据工程师,是能够勉强胜任该工作的。

大数据开发分为三部分,架构师,大数据工程师和数据科学家。

科学家那个专业性太强,不多说了,大致就是使劲学数学统计学,研究各种统计学算法,和人工智能方向有一点点类似,从一大堆数据中找到其规律规则。

大数据工程师是大部分其他开发工程师最容易转过来的,先做做数据可视化部分的东西,然后做一些ETL数据清洗脚本的开发工作,一般是用 Python,Scala,或者java,通常基于spark框架或者mapreduce,代码量不大,所以不会太要求软件架构设计思想。大多是数据库操作以及数据变换处理,所以一定要时刻注意底层性能。

大数据工程师做久了,接触各种不同的数据库,知道优劣,然后再了解一些devops运营方面的东西后,再熟悉一下业务,就可以考虑全局架构了,于是就做了架构师。这个和传统的架构师差不多,不多说了。


区块链

因为中途听说有区块链游戏,想了解下,于是自学了一段,也做了一个类似《区块狗》的一个东西,依靠的是以太坊支链的智能合约,期间也了解了一些区块链,然后就放弃了,感觉它非常的“老瓶混装新酒”。

我们看他的技术核心词汇:

  • 分布式数据存储: 这不算新,而且这个是大型分布式存储的三大理论是大数据的根基,不是区块链的。
  • 点对点传输: P2P路由打洞这在08年时候迅雷做的都比这个好。
  • 共识机制:为了解决出名的拜占庭将军问题,使用的无论是 POW,POS,都是从社会经济学角度去考虑和解决的,我不否认这种想法很有创意,但我要说明,这不是新的技术。
  • 加密机制:没错,区块链不仅仅在公钥生成时使用了椭圆加密算法ECC,还大量使用了RIPEMD160,SHA256,base58来生成摘要和钱包地址,但这些没有一个是区块链发明的,它只是组装了这些东西。最核心的ECC算法其实在中国国密U盾中一直在被使用。
  • 说到它的名字,更是一个典型的数据结构,block组成的双向chain,也算不上什么神奇的东西。

再强调一遍,我不认为区块链没有价值,而是从技术角度来说,它是聪明的组装了一系列技术到一个应用中,并且解决了金融业很不错的问题,但从程序技术角度,我不认为它有质的突破。

例如:大数据三大理论是颠覆式的;人工智能的神经网络的确很早存在,但其真正落地使用和质的革新也是最近的事,而且已经非常强烈的作用于当前生活;反观区块链,太多人拿来炒作,所谓做区块链的大多是发币做交易所做钱包圈钱。

好吧,我承认自己过于个人情绪化了,总之我弄了一段时间,对它彻底放弃了。特别是某厉害-国连它的“去中心化”这个最最最最最最最核心的思想都给砍掉了之后,我完全想不到它除了一个招牌之外还有什么。

对于区块链,我仅仅读了它的go钱包代码,学了以太坊智能合约,做了个小游戏发了个币玩玩之外,什么都没有。也只能算一个级别是学了一年左右的大学生,有两三个小DEMO的状态。不再妄言了。


云计算

这个概念其实我一直有点不清晰,不过我做过一段dev-ops工作,用过 docker, K8s(Kubernetes), ServerLess,了解过 服务网格,据说这些是云计算范畴的。另外我们公司很多服务也部署在aliyun, AWS的ec容器上,学人工智能的时候大部分运算和训练资料也都在AWS上,也算半个云计算用户。

就个人感受而言,K8S其实当时吓到我了,它不仅仅能自动进行pod容器管理,还可以对硬件卷的动态管理让我觉得它异常的强大,如此方便的运维部署工具是我当时不敢想象的。到现在我也不知道其实现原理,只会写yaml配置去创建容器,用一些kubectrl简单命令去管理容器。

因为它在运维方面的强大支持,在我看来之后还值得进一步研究。

搭建一套自动git提交,unit test, Jinkens编译打包,jira版本控制提交,appnium/selenium的流水线我一直很在乎的事,如果搭配上docker打包,,k8s管理,动态服务发现扩容均衡,我觉得这就是一个公司的技术流水框架。比一个开发架构甚至还重要。

现在还有一些摸索不的不足,欢迎留言探讨。我想之后去日本分部做技术总负责人之后,也要在这上花更多功夫。

就现在来说,我估计也就一个初中级运维人员的水平。

顺道说一下云计算,大数据,人工智能之间的关系。

如上面所描述,云计算是分布计算基数的一种,使用网络将巨大计算量进行拆分为小程序分开计算和存储。它是服务于大数据的一个方案,也是大数据的根基,而大数据对数据进行处理了之后,又通常需要人工智能的计算手段对数据进行业务加工,得到最终有意义的结果。

三者是逐层依赖的关系:云计算是底层支持,大数据是中间一点的,人工智能是最顶层的最对接业务的


安全渗透

这个领域我原本就有一些不错的天赋,早起玩单机游戏用金手指,锁内存;后来玩网游,通过重发网络封包做了简单外挂;然后用rpg maker的时候为破解别人的资源包,还研究了二进制逆推出了解密算法;也有以前玩冰河灰鸽子的经历,还有在游戏汉化组也经常需要做一些资源破解的工作。

其实就那些经验,就覆盖了大部分的黑客攻防的方面,内存寻址破解,网络封包分析,逆向工程软件破解,木马外挂开发等,加上加密免杀脱壳,配上专业性强一些:网络渗透,社会工程,溢出攻击,挖掘0day,病毒木马蠕虫payload编写,基本也就全了。

不过我所在部门是网站开发部,意味着更多是针对HTTP封包,网站渗透和防护这部门,对系统,app的攻防反而没什么要求,所以正好弥补我原本的网页相关攻防不理解的缺陷。

我本身很喜欢这块工作,原本为OSCP考证做了不少准备,打算今年2020年9月考试的,但因为疫情和这次工作安排的事,应该又黄了。

这个工作的特点是,杂。对,就是什么语言,什么平台,什么方向都要了解一点点,如果说程序员是锁匠的话,渗透黑客就是小偷,锁匠可以只会造一种锁,造好它就可以,而小偷就必须什么锁都了解一点都会破才是称职的。而我现在的特点显然就是技术面广杂而不精,是比较适合的。

唯一的麻烦是,在国内无法从事这块的研究,除了绿盟等和国家相关的公司几乎没有什么公司可以做这个,毕竟这种职业很敏感,而且国内是个局域网,大家信息隐匿几乎做不到,所以情况是防御者的信息安全防护意识很差,而攻击者风险也很大,练手难度很高,难以提高技术,牛X的黑客都在俄罗斯伊朗了。

这个东西在国内拿出来讲也是不合适的,所以打住。总之很有趣,考OSCP也还在计划内。

当前自己的情况大致是,大部分的中小站点都可以拿下,做个渗透工程师是合格的。


计划

主动接触:

  • Flutter(Dark)
  • .net core后端 (C#)
  • Vue3 (Typescript)
  • NestJS (Typescript)
  • Kotlin Android开发
  • OSCP证书
  • DevOps进阶k8s,Istio
  • pyTorch
  • 基础项加强kafka, redis
  • 刷leetcode

不再研究/主动逃避:

  • React/ReactNative
  • Scala
  • 区块链相关
  • 大数据进阶
  • 数据科学家方向
  • Tensorflow
  • python的web系列
  • PHP相关
  • 嵌入式(kernal层, driver层)

挂起/观望:

  • 游戏相关的全部挂起。
  • go, rust