java学习之路

开发那点事(1)——浅谈开发的思路

2020-05-14  本文已影响0人  唯有努力不欺人丶

这又是一篇记录+闲聊+整理贴。最近在一个人做一个不算很小的项目,所以想把思路和一些设计整理下来,方便以后遇到相同需求可以快速的有思路,如果能顺便帮助一头雾水的别人那是更好不过的了。
首先说点闲话,工作以来没去过大公司,团队人数最多的就是第一家公司,标准外包续命的有自己理想的一家公司。老板是个老技术,也是我至今为止都非常感谢的一个人(虽然现在没有联系了)。现在的代码书写的习惯,项目开发的流程和思路,一些常用工具类的使用等,都是那时候学会的。在此也祝那家公司越来越好吧。

初中级程序员日常工作

首先,这么多年工作以来,也做过不少的项目了,有二次开发的,有项目重构的,有维护现有的,也有从0开始的。而二次开发又分为从头开始和接手原来的。
反正目前为止我差不多都做过。这里简单的截个图表示下我自己的理解(个人理解,错了或者不全欢迎指出,但是不接受恶意攻击)。


我心目中的初中级程序员日常工作

因为我毕竟经验也就这么多,所以不敢说我理解的就很全面了。但是这些都是我遇到过,经历过的。简单的说下目前为止待过三家公司。

简单的叙述一下工作经历,然后各个岗位和不同公司中主要的工作内容也简单说了下。剩下的一些别的内容,比如写个专利书,写个说明书,写个软件著作权,写个三级等保申请之类的感觉是杂活,工作中都用到了,但是没啥意义。所以不多说了。
对了,一些常用的第三方接入什么的,例如阿里云,腾讯云的一些设置配置,获取小程序appid,appKey啥的,这些有的也算是工作中一部分,比如我第二家公司这些所有的配置,或者说买什么服务也都是我在做,花多少钱直接找老板报销。但是第一家公司这些都是老板处理,我需要什么直接朝他要就行了。至于现在这家属于有些自己要弄,有些要找领导要。反正这些都不难,自己看人家的官方文档啥的就行了。
毕竟开发岗位最终肯定还是要落实到开发和代码上。

从需求文档开始

其实这个没办法一概而论的给一个思路解决所有问题,针对我自己遇到的这么多的工作中也有不一样的侧重点。但是熟读需求文档绝对是所有开发的前提。
而且我的习惯是熟读开发文档,在脑子里先过一遍怎么实现。而且需求文档上经常会有一些坑,需要我们自己注意。打个比方,如下截图是我们需求文档中截取的一部分内容:

image.png
说实话,没打马赛克的用户信息除外,积分,等级,勋章,签到不算标点符号就八个字。
但是呢?仔细想想这八个字后面是什么。

说实话,上面的八个字四个词可以延伸出来的东西很多。甚至细节上的实现也各有不同。虽然都是基本功能,但是我在看了需求文档后还是和领导仔细询问了,并且我个人的习惯是问清楚了,并且记录下来,把文件也发给领导确认没问题了然后才会去做。这样以后如果有改动或者如果说做出来甲方说和他想要的不一样我也有话可说,这个习惯我也推荐给大家,做之前一定要把需求确定了并且砸实了。当时在第一家公司我就受过这个坑。


不懂就问,确定再做

那时候入行时间也短,当时是一个搜索的功能,甲方的需求说只需要输入名字查询。我就只简单的做了个搜索,并且当时是口头上确认了,可能我没说清楚,甲方的人也没注意听。反正我说这块这么做那边的人肯定是说ok了。但是等实现了以后甲方测试软件的时候,说这里和他想要的不一样。然后我当时说都确定了的,你们也同意了的,但是甲方就是说没有。然后我当时也懦弱,好一点的是这块内容不是那么难改动,所以最后改完了。然后我们老板把我骂哭了。哈哈,真的是哭了一个多小时吧,一方面的委屈,另一方面是恨,我拿着炸药包炸当时对接的甲方的家的心都有了。还有一方面是对自己的恨,当时对接我什么证据都没留下,所以才造成了现在的一切。反正哭了一个多小时之后,再做什么都习惯性用文件和文字的形式来交接和确认。哪怕有时候和领导口头上谈成了什么我都会用文档微信发给领导或者用文字发给领导再确认一次。有时候不要怕麻烦,也不要怕麻烦别人。毕竟多确认一下浪费不了多少时间,你不能确定和你对接的是人是狗。所以。。。


好了,上面就是一个过来人的简单建议。然后继续说这个需求的八个字,不确认好了匆匆做出来,如果发现甲方的一些奇葩要求目前的设计不好实现或者不能实现,那就尴尬了,所以说我的建议熟读需求文档,一点点在自己脑海里建立一个完整的模型。大概做到闭上眼睛能把这个项目从头到尾跑一遍而不卡壳。同时把这个讲给甲方或者领导听都没有异议再开始真正的做。
这个还是要感谢第一家公司,让我学会了简单的word画图。比原型图还要简陋也没关系,丑也没关系。但是按钮,模块,跳转关系啥的写清楚就好。把整个项目的草图画一遍,加深了自己对业务的理解,也让自己的逻辑关系数据关系有个完整的建立。


用户页

这个图我自己看都辣眼睛。。反正就这样了,黄色的代表点了要走接口的。白色就是写死的。点了不走接口的,前端爱咋做咋做吧。然后这个页面是我觉得用户那个页面的。划重点!!这个图是我为了展示出来特意画的!!正常我给自己和领导看的比这个还要丑。。。但是画的丑时间也快,就是两分钟一张图的那种。之前的龟毛同事,一个后端话这种图画出来跟原型图似的。。说真的一方面挺佩服画工好,另一方面话这个草图能画一天也是佩服了。反正这个就是个人的建议。但是这么做的好处是每一个图都对过以后,照着图来做,不容易出错。
然后好多时候需求文档可能不是很专业,所以有问题一定要在设计之前就解决了!不然可能做的时候坎坷的多。反正目前来讲我只和领导还有甲方对接过,听说大公司是有专门的项目经理的,唔,羡慕。
然后如果你画不出这个图的流程,或者说你自己脑子里不能顺下来就说明你对需求还是不熟,一定不能抱着对付的心态开工。
正常我个人来讲,我觉得单单是看需求文档就是一个5个工作日的工期(以4个月开发时间来讲)。然后下一步数据库设计又是一个星期。

数据库设计

上面我说了,数据库的设计一般也是一个星期也就是5个工作日的工期。这里先熟悉了业务流程和逻辑,对我们设计数据库的表等好处是大大的。
我简单举两个例子:

反正这就是说明一个简单的签到功能不同设计的数据库也不同。所以说数据库的设计一定要依赖于具体的业务。
我是打算有时间把这些常用的业务的数据库的常用设计整理下。比如说权限控制的数据库,我一直习惯于用shiro的那五张表实现。虽然不用或者不那么做也可以,但是习惯了。
还有算是常用的好友是单向好友还是双向好友啥的。设计成多对多比较灵活。
关注,收藏什么的。这些其实都有一些常用是设计(我反正知道的大多数为了灵活性而增加记录的条数)。但是之前也做过一个点赞功能,是点完赞不能取消的,所以是用点赞用户名的拼接实现的。缺点也就是点完赞取消啥的不好做。

这里我就简单的说一些常用的功能的设计,而且说得也很不清楚,毕竟这个不是重点,重点是要认识到:最合适的数据结构是根据需求设计的,而不能盲目的跟风。我早就说过这个态度:不要大佬说点什么就当成圣旨,因为人家说的是常用的模式,但是谁知道你们开发有什么奇葩需求了?
反正我对这块的态度是不要急,一点点构思,一遍遍看。慢工出细活,我不能说百分之百,但是百分之八十随着项目做着做着要不断修改表中字段,添加关系甚至添加表都是因为最开始的数据库设计有问题。所以后期不断返工,不断改动。
当然了从设计完到做完项目一次数据库不改也不太现实。但是改动频繁肯定也是有问题的。
打个比方,前几天做的那个app,领导当时说半个月做完,然后看了需求文档觉得蛮简单的,我就偷懒了简单用半天勾勒一个数据库关系图就上手,虽说主体还是对的,但是几乎每个表都加过字段,甚至有的今天加一个,明天加一个,后天加一个的加。也亏得是逻辑简单,加个字段的成本比较小,不过复杂的业务这么改动谁也受不了。
所以数据库的设计关系到以后开发的速度和代码的可读性和逻辑性。我记得听过一句话:究竟数据库该怎样设计,古往今来,每一个人都有每一个人的想法,所以数据库设计并没有优劣之分,好坏之别,合适的数据库设计就是最好的。
我觉得这这句话说的真的很好,数据库三大范式我知道,但是好多时候问数据库设计或者说问多表联查,我都会说非特殊情况除外,需要跨太多表联查只能说明是数据库设计有问题。有时候数据库适当的冗余真的很有必要。说了这么多其实好多时候字段的定义,关联关系等主要还是时间的累计。有时候一个不怎么好的设计会让你知道下次怎么做能更好。
另外多学,多用,多看,多想总是有用的。

接口的定义

这个其实是分歧最大的一个,在我看来也是最难的一个。接触过很多前端,从最开始工作四五年的小姐姐(第一家公司的元老人物,我目前为止认为技术最好的 一个人),到后来的小菜鸟实习生。到中间私活的甲方提供的前端。还有现在的前端同事。
怎么说呢,我经历过很多次接口定义好了,代码差不多写完了,结果前端小哥哥小姐姐或者苦着脸或者小心翼翼也有理直气壮的和我说数据格式处理不了等。然后改接口数据格式甚至有的改逻辑等。只能说互相理解。但是有时候发生的很频繁也是真的心烦。
经常别人的看法也是,不管是前端还是后端。不非要全栈,但是多少也要懂一些对方的技术。不然真的很容易被唬(真人真事,我一个以前的做后端的同事,前端对接口数据有意见的时候大多数都是一句你这样要求java实现不了。。。。神踏马实现不了啊,然后那个前端经常被唬我觉得)。
不过随着开发我也确实发现接口的定义其实真的挺不好设计的。就前几天的个接口。本来是个添加配置接口,但是最开始的需求文档只有两个字段。我出于嫌麻烦,所以直接决定这两个字段分别以参数的形式传过来。正常来讲这么设计没啥大问题吧?然后随着开发,需求今天说应该可以传个logo,明天说应该加个标记,过不长时间又说这里有个类别比较适合筛选。。因为是自己公司项目,所以都是想到哪做到哪。不说我数据库一个字段一个字段的加。实体一遍一遍的改。单说这个接口我都改了一次又一次。这也就够糟心的了。最后的最后参数变成一大串以后,前端小哥说我这样也太麻烦了,咋不用对象包装。。ex?我特么要是早知道这样哪怕脑袋进了水也不会这样设计啊!!!
还有常常出问题的就是统计报表这一块了。毕竟功能不同,各种各样的统计 ,柱状饼状曲线,二维三维甚至有的点进去还可以放大成4维。。反正现在我几乎统计接口的数据定义都是直接交给前端,美名曰你觉得你怎么拿方便怎么定义。我按照你的要求给你。其实是真的无数次定义封装好了前端苦兮兮的说这样的数据形式展示不了给吓怕了。
还有比较想吐槽的一件事就是分布式的接口调用情况。这个是在我去年用cloud的时候发生的事。有时候一个按钮的调用会触发很多事件。最简单的例子:一个订单的签收会触发分佣,触发订单状态的改变,触发商品销量的改变,触发账户的变动,有的还会触发用户积分的变化。用户和商户的等级变动等等(包括但不限于)。而这个绝对不是一个模块可以完成的。账户模块,用户模块,商品模块,订单模块差不多是跑了个遍。feign确实可以解决。但是有些压根不用交互的模块就为了这么一个接口还要来个调用我自己的懒得写。也可能是懒癌晚期。反正我最终的实现是这么一个按钮让前端调用了两个不是三个接口。当然我不是说我的做法值得倡导。我自己都觉得其实是有点问题的。但是!!!但是方便啊。反正说这么多就是想说每一个接口的功能,作用都是由我们定义的。一个项目的交互也几乎是后端主导的。很多时候良好的接口设计确实会让工作更加融洽和方便,反正我的建议就是接口的设计要慎重,而且最好是根据需求和原型图,流程图来做。虽然随着开发接口的添加和修改不可避免。但是最大程度上减少出现还是很有必要的。
剩下参数什么的我也没啥心得,就是按需求设计,能不传不传,密码等加密传。

技术选型+基本架构

数据库好了,流程图原型图有数了,接口也定义的差不多了,最后还是要落实到代码上。至于技术选型啥的可能因为项目都是非互联网项目,要求也不高,功能也简单,领导有时候还会有要求(比如手头的这个dubbox就是领导指明的)。所以一般不会有太大的选择。

话题转回来,我这个项目的技术选型如下:
dubbo+zookeeper + mysql + spring boot + mybatis plus + swagger。
现在还差一个网关,zuul是用过的,但是查了好久资料都说zuul性能堪忧,soul倒是叫好一片,所以这个网关暂时待定。大概的筹划就是这样。

项目框架

下面是我初步定下的项目大的框架,只用了user和order做例子。简单说就是按照模块分。每个模块又分为三个项目:接口,实现,和调用。


image.png

注意这里在api中有个Dto。这个也是问了一些人,看了一些资料后才定下这样做的。
网上也有一种做法是所有的实体和dao做成公共引用。但是这样首先肯定是不合理的。毕竟比如api应该只是干干净净的接口,但是还要引用那些乱七八糟的?其次有个朋友说这样也正好违背了解耦,分模块的概念。但是有时候参数是实体对象的话,api模块和web模块要怎么接收呢?
之前我还灵机一动打算所有参数都map。。然后群里一提出来就被骂了,哈哈。反正是这样会出现魔法值,一点都不合适。
最终决定稍微麻烦点,再封装一个对外的Dto。首先这个也是符合表中数据私有不直接对外的。其次这样一层封装也可以使得数据更加有用(好多对前端没意义的字段可以直接不传了)。其实这种模式早就有,不过以前因为嫌麻烦所以从来都是实体直接对外。这次决定符合规范一点,entity是entity,dto是dto。

到这为止,所有项目的准备工作算是做完了。剩下的就是真正的按照接口文档把接口一个个实现了。肯定实现过程中会有改动。不过只要大方向没问题剩下的改动应该都不大。因为代码的实现也是一个长时间的过程。如果在项目中遇到什么值得记录的事情我会记下来的。本篇文章其实就是一个思路的整理和个人风格比较明显的记录。
如果本文稍微帮到你了记得点个喜欢点个关注,另外也祝大家工作顺顺利利!java技术交流群:130031711欢迎各位萌新大佬踊跃加入。群里好多学习资料呦~

上一篇 下一篇

猜你喜欢

热点阅读