“面面”是开课吧的“JavaEE企业级工程师”08期课程的第一个实战项目。该实战项目要完成的是一个带运营管理后台的刷技术面试题的微信小程序产品。不同的运营人员可以扮演诸如试题录入、试题管理和试题审核等各种角色,并可以对题库以及题目所属的企业、学科和行业等信息进行管理,可以添加各类介绍面试技巧的文章或视频。普通用户则可以通过微信小程序访问面面,根据自己的职业方向选择不同的题库进行刷题,并提交查看正确答案。
该实战项目有124个小节。其中包含122个视频和一些项目课件以及相关资料。内容涉及前后端开发的各种技术,前端部分不但涉及到后台管理系统的开发(使用VUE框架),而且还会涉及到微信小程序的开发。后端部分涉及到SpringBoot+SpringMVC+Mybatis,即目前主流的“SSM”框架,数据库采用MySQL并使用Redis作为缓存。
我并不想仅仅跟着老师的课程敲一遍代码就算完成了,我对自己有更高的要求,那就是从0到1从头实现一遍整个系统:从产品需求文档开始了解整个业务,然后从需求分析开始,到架构设计,再到编码实现,把软件开发的整个流程全部熟悉一遍。即以架构师的标准来要求自己。一开始是想一口吃成个大胖子来着,但通过一段时间的反复思考意识到这么做难度太大,容易打击士气导致半途而废。作为软件工程师,我对前端开发的理解还停留在很浅的层面上,不够深入,特别是对一些底层原理了解不多,还需要对以前学过的知识进行一定的复习和巩固。虽然我对后端开发要熟悉一些,但主要熟悉的是长连接网络编程,对基于Spring全家桶的Java Web开发则经验欠缺,脑子里是一锅粥。基于这样的客观情况,要完成该项目,就要采用分阶段实施的策略,稳扎稳打。
我在个人能力发展报告里分析过,在技术成长的策略上,未来要变“广度优先”为”深度优先“。实际上这个“未来”已经来了。这个项目是我作为软件工程师的最后一仗,作为系统架构师的第一仗。按照"慎重初战"的原则,一定要打好这一仗,切不可敷衍了事。应"主动地、灵活地、有计划地执行防御战中的进攻战和持久战中的速决战"。
所谓"主动、灵活、有计划",体现在项目实战的分阶段实施和每阶段要侧重解决不同的问题上面。把所有的问题揉在一起,不抓重点,解决问题的效率会非常低下,要抓主要矛盾。执行"防御战中的进攻战",是因为一方面我对这些开发技能不够熟悉,有个逐步熟悉和掌握的过程,跟着视频敲代码是一种被动防御性质的学习,而学习的过程中主动通过阅读课外资料或者书籍掌握相关知识则是一种主动进攻性质的学习,两者要相结合。执行“持久战中的速决战”,是指既要坚持长期长时间学习的毅力,又要在每个具体任务上速战速决。这122个视频以及配套的资料内容是很多的,会遇到很多困难,要全部看完并理解消化需要付出很大的努力。战略上的持久要和战术上的速决相结合,分割包围,各个击破。
第一阶段战役总结
战役的目的
阶段1要达到的目的主要是熟悉如何使用SSM框架开发Web应用,特别是MVC分层架构:controller如何对外提供服务,controller如何调用service,service如何通过mapper获取数据,mapper又如何与POJO类进行交互。另外一些常用插件比如PageHelper也值得注意。
完成的情况
视频课程主要分为三个大的阶段:项目准备、后台管理系统开发和微信小程序开发。开始学习之前,我首先对要做的内容进行了分析,然后分别统计了每个部分视频的总的播放时间,然后将其换算成番茄钟(一个番茄钟为25分钟)。并根据视频内容和自己掌握知识的熟练度进行工作量估算(乘以系数2),预估的时间和实际完成的时间如下表所示:
内容 | 预估完成时间(单位:番茄钟) | 实际完成时间(单位:番茄钟) |
---|---|---|
项目准备阶段 | 7.12 | 17 |
登录功能 | 4.08 | 3 |
学科管理 | 2.32 | 3 |
题库管理 | 32 | 35 |
微信小程序 | 2.4 | 3 |
城市定位 | 5.04 | 3 |
获取学科 | 1.6 | 2 |
登录注册 | 1.12 | 1 |
会员功能 | 4.72 | 2 |
城市学科 | 2.64 | 4 |
题库列表 | 13.6 | 3 |
答案提交 | 4.4 | 2 |
个人中心 | 4.56 | 1 |
我用了79个番茄钟完成学习,约33个小时。我用1.5倍的速度来播放视频,然后边听边跟着老师敲代码,还举一反三地完成了课上没细说的相关功能的开发。比如课程介绍了如何获取按学科目录分类的题目列表,我就把按企业或行业方向获取题目列表的功能完成了。不总是跟随教程,自己有一点独立完成的能力总是能加速理解和掌握。不过不得不吐槽一句,课程问题还是有一些的。讲课老师的英语是真的差,好多单词都读错或者拼错,看的我很难受。后端开发没有遵循比较好的设计范式,返回给前端的额外的字段直接在POJO类上做修改,违反了“开闭原则”,代码看着有点混乱。命名不规范,前后端不统一,一会儿大写一会儿小写,导致各种bug。
遇到的问题
第一阶段的学习暴露了自身存在的大量的短板和不足。这些短板和不足主要体现在“软件设计”、“Mybatis框架”、“Spring框架”、“Java语言”、“前端开发”和“网络协议”等6个方面。
软件设计相关
不理解业务系统数据建模的良好设计。POJO类、ViewObject(VO)和Data Transfer Object(DTO)之间是什么关系?Mybatis如何使用resultMap与这些数据传输对象建立映射?
对于这样的业务系统,其数据库表是怎么一步一步设计出来的?
API要怎样管理才能统一前后端接口规范?
怎样从需求建模、分析建模和设计建模一步一步完成系统的分析和设计?
定义良好的RESTful API是怎么设计的?
Mybatis相关
resultType和resultMap的区别和联系是什么?
分页插件的原理是什么,如何使用?
MyBatisGenerator怎样生成POJO代码?
Spring相关
怎样从0到1搭建Spring的Web开发项目,特别是多模块的?
Springboot的yml配置文件如何使用?
如何深入掌握Maven构建工具的使用?
Java相关
Java的动态代理技术是怎么回事,它是如何自动生成接口的实现的?
Java的枚举类型有什么高级用法?
如何深入理解Java的泛型和容器类?
前端开发相关
如何开发微信小程序?
如何使用VUE框架进行前端开发?
ThymeLeaf模板引擎如何使用?
网络协议相关
- 如何深入理解HTTP协议?
第二阶段战役部署
第二阶段战役比第一阶段要更艰巨。因为系统架构师的“武”的技能,是对架构本质的深入认识和对架构设计流程的熟练掌握,“文”的技能,则是对基本的项目管理常识的掌握。也就是说,开发一个这样的业务系统,对业务的理解,对需求的分析,对系统的架构设计是一个维度。而对于要解决的问题的界定,对问题的拆解,执行解决过程中开发计划的制定和事中事后的复盘又是另一个维度。根据这样一些情况,我做如下部署调整,主要是谈4个方面的问题。首先是战略方针问题,其次是项目管理问题,然后是架构设计问题,最后是编程实践问题。
战略方针问题
什么叫问题?问题就是事物的矛盾。哪里有没有解决的矛盾,哪里就有问题。既有问题,你总得赞成一方面,反对另一方面,你就得把问题提出来。提出问题,首先就要对于问题即矛盾的两个基本方面加以大略的调查和研究,才能懂得矛盾的性质是什么,这就是发现问题的过程。大略的调查和研究可以发现问题,提出问题,但是还不能解决问题。要解决问题,还须作系统的周密的调查工作和研究工作,这就是分析的过程。提出问题也要用分析,不然,对着模糊杂乱的一大堆事物的现象,你就不能知道问题即矛盾的所在。这里所讲的分析过程,是指系统的周密的分析过程。常常问题是提出了,但还不能解决,就是因为还没有暴露事物的内部联系,就是因为还没有经过这种系统的周密的分析过程,因而问题的面貌还不明晰,还不能做综合工作,也就不能好好地解决问题。一篇文章或一篇演说,如果是重要的带指导性质的,总得要提出一个什么问题,接着加以分析,然后综合起来,指明问题的性质,给以解决的办法,这样,就不是形式主义的方法所能济事。
第二个阶段的战役没有手把手指导的教程,一切都要靠自己去摸索、去实践、去领悟。总的方法还是多做“调查研究”。有三个方面的东西是需要重点调查研究的。首先是第一阶段所完成的内容,多读前一个阶段写的代码和相关课件文档,认真研究之前没有注意到的部分,着重思考问题的解决方式,进行总结提炼。其次是与所实践的内容息息相关的理论知识,比如上面暴露出来的问题,要充分收集资料并一一查缺补漏。最后要结合实战项目的具体实践,深入理解软件工程思想,特别是面向对象的分析和设计思想。然后在充分的调查研究的基础上,发现问题和定义问题,并对问题进行分析,找到问题各要素的内部联系,然后综合起来,形成解决思路,这就是第二个阶段解决问题的总的方针。
项目管理问题
系统架构师掌握必要的项目管理知识,是十分有必要的。如果将系统架构师比喻为一支军队的统帅,那么项目管理技能就好比其指挥千军万马的能力,是“文”的方面的能力。掌握项目管理技能的主要参考资料包括一本书、一套在线课程以及一份OmniPlan用户手册。第一本书是前埃森哲战略咨询顾问邵文瀚写的《掌控工作》,拟采取本书中介绍的“四步法”,对“面面”实战项目进行界定问题、拆解问题、执行解决并总结复盘。其实就是上面所说的先做初步调查研究然后提出问题,在做深入的调查研究分析问题,揭示其内部联系,掌握客观规律后再综合起来解决问题的方法。在拆解“面面”实战项目的时候可能要用到专业的项目管理知识,此时需要复习之前学习过的《项目管理实战20讲》,结合OmniPlan的产品用户手册,尝试将项目管理知识运用到任务拆解中,形成一系列的项目管理视图,科学合理地跟进整个开发过程。最后还要整理项目管理实战的学习笔记。这些总结成册的知识和技能,以后也可以运用到实际工作中去。
架构设计问题
能够进行复杂系统的面向对象软件建模和架构设计,是系统架构师的核心竞争力,是“武”的方面的能力。如果还是将架构师比喻为一支军队的统帅的话,那么架构设计能力就好比“消灭敌人,取得胜利”的能力。系统架构师必须对问题的本质了如指掌,必须对各项开发技术有深刻的理解,必须提前预判系统演进过程中会遇到的问题,并给予解决办法(破敌之法)。最重要的,架构师必须亲自动手写代码,否则就会丧失对技术细节的把握,最后变成“PPT架构师”。
“PPT架构师”由于丧失了对技术细节的把控,很容易主观主义地自作聪明地发表许多意见,使自己的意见变成不切实际毫无作用的空论,进而无法有效地指导技术团队的工作,这是必须旗帜鲜明的加以反对的。卓有成效的架构师,必须坚持一般和特殊相结合,领导与团队相结合的工作方法。系统架构设计的完成并不是架构师工作的结束,而是开始。架构师必须亲自指导团队解决具体的实际问题,从而取得经验,然后利用此经验去指导解决其他问题,从个别的经验中总结一般规律,从而检验自己的架构设计是否符合客观实际。架构师在工作中要坚持“从团队中来,到团队中去”的正确的领导方法。将团队的意见和反馈集中起来,进行研究,然后将集中的系统的意见用于指导团队的开发,使团队坚持下去,转化为团队的行动。
要深入掌握架构设计能力,并利用架构设计和面向对象建模的知识,重新对“面面”进行架构设计、需求建模、分析建模和设计建模,形成一系列的设计文档,从而指导下一步的编程实践。主要参考的资料有三本书。首先阅读李运华的《从零开始学架构:照着做,你也能成为架构师》,掌握架构设计的原则、流程和各种架构模式。然后阅读李运华的《编程的逻辑:如何用面向对象方法实现复杂业务需求》,结合Hassan Gomaa的《软件建模与设计:UML、用例、模式和软件体系结构》,掌握面向对象的软件建模和设计方法。
编程实践问题
“面面”实战项目涉及到了前后端开发的各项技能,是一次宝贵的,多种开发技术混合编程的实战机会,相当于多兵种联合的大兵团作战,很锻炼一个人的全栈开发能力。对于前端开发,主要涉及到的是VUE框架、Thymeleaf模板引擎和微信小程序开发。要先复习一下以前学过的前端开发知识,特别是Flexbox布局,这块知识现在好久不碰有点生疏了。然后要找一些VUE开发和小程序开发的教程来学习,利用学到的知识重新开发“面面”的小程序端和题库管理系统界面。对于后端开发,主要涉及到SpringBoot、SpringMVC和Mybatis框架,可以通过阅读《SpringBoot实战》和《精通Spring4.x企业应用开发实战》来深入学习,平时收集到有道云笔记的相关资料也可以找来读一读。对于数据库密集型的应用,如何将静态模型转化为关系数据库设计也是一个难点,这方面的知识可以通过阅读《数据库系统概念》一书来了解掌握。利用学到的知识重新开发“面面”的后端。
我对“面面”实战项目第一阶段的工作复盘和第二阶段的工作指导就到这里。我们要继续发扬艰苦奋斗的精神,不断地实践、实践再实践,为早日成为系统架构师,完成更多更有挑战的任务而努力前进!