2018 年终总结
前言
今年,想说的和总结的其实挺多的,但奈何不善写作,卯足劲才憋出这篇总结(文笔不好,所以文章语言会很生硬且没有衔接感)。
对待技术
对待技术方面,一直以来的观点是“不要过分执迷技术,应该学习的是技术背后的东西”,但总觉得措词怪异。直到今年,看到下面阮一峰老师博客里的这段话,才明白应该这样去表述。
实施细节并不是知识,而是操作步骤。如果技术栈发生变更,实施细节就会毫无用处。但是,你又不能不学习它,不知道实施细节,就没法做出项目。我觉得,程序员应该要警惕,不要落入实施细节的陷阱,不要把全部精力花在实施细节上面,然后以为自己学到了真正的知识。对待各种语言和工具,正确的态度应该是”进得去,出得来”,既要了解足够的细节,也要能够站在宏观的角度看待它,探寻底层到底是怎么实现的。
摘自阮一峰博客《每周分享第 28 期》
总而言之,就是要以宏观角度来看待实施细节,才能学到真正的知识。下文阐述的内容,是今年的经历、想法与思考,这些让我对这个观点有了更深刻地感触。
从项目经验中“掘金”
今年暑假留在了学校,导师布置了个项目,并充当提出需求的客户和前期设计的分析师,团队四个人参与整个项目的生命周期。由于没有经验及技术不成熟,整个过程是边学习摸索着边推进。但暑期结束了也没大进展,因而项目只能被搁置了。不过从此次经历中学习到了很多知识,同时也总结了项目推进失败的教训。
转变开发方式
项目开始前,导师给我们讲述许多关于软件开发的问题,其中提到了“基于领域驱动”的软件设计模式。同以往课设项目围绕着“数据库”进行开发不同,基于领域驱动的开发注重领域的知识,领域模型更加符合自然系统,而围绕数据库开发只会将重心偏移到数据的设计和处理。
可惜的是,早先没有基于领域驱动开发软件的经验,以至于暑假项目上的前期分析还是以往的方式。下半年拜读《领域驱动设计》后,对软件开发方式有了不同理解与体会,同时也将该开发方式应用在一门课设上。
项目失败的教训
此次项目失败有技术原因也有工程上的问题,但主要还是败在工程问题上。
在项目架构选择上,犯了很大的错误,选择过于激进的微服务架构。由于项目的复杂程度,还不至于使用该架构,导致对项目的划分粒度过细,就像是为了微服务而微服务。而且这导致了维护成本变高,由于划分过细,修改一处就得重新改写其它关联的部分,当然这也与前期设计不当脱不了关系。最后,由于种种问题放弃了还不熟悉的微服务架构,转而使用传统的单块架构。
此次项目,采用了前后端分离的开发方式,但前后端测试成了问题。最开始使用原始的手工测试,测试非常耗时间,而且有时候难以判断错误发生在哪一端。于是,后来采用了替身测试,前端使用 Mock.js 框架模拟接收到的数据,而后端使用 JUnit 框架模拟发送的请求。虽然解决了前后端测试问题,但开发中接口的统一,就只能靠传递定义接口文档实现。
框架的优秀思想
这个项目的后端用到了 Spring 框架,前端用到 Vue.js 框架,这两个框架都十分优秀且其设计思想耐人寻味。
模块解耦
首先,非常欣赏 Spring 框架解决软件复杂性的思想,而且让我了解到原来模块可以这么解耦。
Spring 框架通过依赖注入来解决模块间高耦合的问题,框架负责代码模块的依赖,就像是代码模块的粘合剂。且其低侵入的特性,使得编写代码时基本无需考虑框架的存在。
数据驱动视图
大一也曾接触过 Vue.js 框架,老师让我用其做个登录演示页面,于是花了两天阅读了官方文档,草草做了个演示。当时只觉得其写法很奇怪及别扭,并没有过多的思考。
上半年做 Oracle 数据库课设时,用手动修改 DOM 来实现视图变化,但当项目变得复杂时,代码也会变得非常难维护。而 Vue.js 框架的优秀之处在于,让数据驱动视图的变化,从而不需要手动修改 DOM ,降低了数据与视图关联的复杂性。
重新接触前端
由于项目需要,又重新接触了前端。虽然清楚前端这几年发展迅速,但当真正接触时,更是惊叹其巨大变化。
学习成本变高
现在编写前端工程,不仅需要掌握最基本的 HTML 标记语言、CSS 样式表和 JavaScript 脚本语言,还得搭建 Node.js 环境及会使用依赖包管理工具 NPM,同时会配置使用例如 Webpack 之类的构建工具。
掌握了上面这些,还得学习一个热门的框架,例如我使用的 Vue.js 还有基于此的前端界面库 ElementUI 。学习这些内容的成本是很高的,而且上面提到内容,还只是整个“大前端”的冰山一角。
前端工程化
前端的学习成本随着其发展不断增加,而前端发展的同时也使其复杂性增加,于是就有了“前端工程化”一说。前端工程化同软件工程为了解决软件复杂性一样,首要任务是为了解决前端的复杂性。
前端工程化涉及诸多方面的内容,由于篇幅有限,只阐述我认为的核心内容。首先一个是,强调前端工程进行组件化开发,同模块化用于封装隔离不同,组件化更强调复用,一个很好的例子便是 Vue.js 的模板文件。还有便是规范化的开发,项目需要考虑语言规范、编码规范、项目结构规范等等方面,而这些也有利于团队的开发与维护。
寄望 2019 年
今年算起,入门也大概有六七年头了吧,现在自己的境遇是涉猎广但深度不够,所以计划明年着重研究大数据计算方面。同时,希望明年 ACM 比赛能有个好成绩,不会像今年一样只是去走个过场。还有,继续练好自己的写作水平。