项目也可以学习到很多东西

今天分享关于最近做的一个小项目学习一些感悟。

1.小项目也能学习到非常多的知识

最近做的是一个数据整理的一个项目,后台系统需要一些统计的数据,如果从原有的系统中查询,会大大影响到其他端的性能,而且相对于手机端去直接用户,后台系统面对的是公司人员和运营人员,用户量少,但是查询的数据确不少,需要做大量的计算,而这大量的计算就耗掉服务器的性能。为了保证线上手机和前端的性能,数据库做了优化工作,建立的索引也是根据用户来建立。后台系统搜索的条件特别多,没有建立的索引的情况下,在大量的数据中查询数据,还包括大量的计算,这就造成性能的影响,那么就需要哪空间换时间,并且后台系统要求的实时性并不高,那么就可以将关心的数据抽取出来,放到新的数据库中,然后在新的数据库中进行聚合,得到后台系统需要的数据,这里可以看关于数据仓库的概念。那么我做的这个项目就是将数据从原数据库中抽取数据到新数据库中,任务很简单。

但是,这个小项目却让我学习到很多知识:

1.数据库格式的问题,开发人员创建的数据库的字段都不做统一,因为公司用了两种数据库,mysql和mongodb,从这两个数据库中抽取数据,由于我使用的mysql当数据存储,在创建表字段时,就遇到特别多的麻烦,字段长度不同一,很多数据都没有做强制性规范,mysql和mongodb数据不同一,不过这不统一也正常,但是程序中又有了规范,如果按照程序中做,但是数据库中有大量不规范的数据字段。

2.做好数据容错处理,很多数据时增量抽取,即抽取前一天的数据,但是突然发现前两天的数据有一点问题,那么该如何做,需要在程序中启动另一个监听线程,该监听线程是每十分钟会读取数据库中的一个字段,该字段是否为true,为true则将这几天的数据删除,重新抽取。

3.因为跑的数据有先后顺序,例如需要先抽取用户的信息,然后对用户信息进行统计,如果用户的信息出现错误,那么后续的统计都会有问题。这里我设计了一个任务处理的小框架。在这个其中需要做到任务的顺序可配置,前一个任务没执行完,后续任务不能执行,一个队列中的任务可并行执行,不同优先级的任务串行执行。在实现这个逻辑,学习到了java中队列,树形结构,学习了多线程的知识,为了程序设计优美,学习了单例模式,观察者模式(EventBus),为了能够极大简化代码,使用注解,学习guava包,common-lang包中类,并且在该项目中添加了异常后发送邮件功能。

这是这个 很小的项目,我在其中学习很了特别多的知识。很多时候,在抱怨每天都在做增删改查的工作,感觉每天都做的是体力活,完全不费脑力的工作,其实不然,想要将工作做好,需要花费特别多的经历。写接口做的就是增删改查的工作,但是其中的能够操作的空间极大,使用SpringBoot做项目,是否在项目中添加了拦截工作,对请求过来做一些基础工作如日志打印,对异常是否有做统一的处理工作,后续的是否有做单元测试,对于接口是否有做压测,要将一个功能或者是一个项目做好,是需要非常多的精力的,所以小项目,如果我们肯花心思去做,发现会有特别多的事情要做,而且在这个小项目中可以学习到非常多的东西。

2.敢于实践,将想法都化成代码

将自己思想都化作代码,但是能够做到完全将思想化作代码是非常困难的。

很多时候,我们看别人分享,我们也记住了其中如何操作的,例如redis作为缓存,遇到缓存雪崩,缓存穿透等问题都能够说出个一二三来,但很少去亲手去实践。遇到这样的场景真的很少,比如我,开发了两年,公司的数据都很少,并发也不高,一个小的redis的集群,完全支持了线上访问,也不会遇到缓存穿透导致的查询速度慢的情况。如果没有真正遇到,动手解决过该问题,并不能很好的去理解该问题是什么一个情况,即使别人分享的很透彻,那也是他真正去解决过,形成了自己的经验。而我们看了,也是只住了有这么一个问题。而看到该问题,需要去将问题重现,并按照他人分享的方式去解决,这样才能是自己真正学到收了。

业务上没有碰到这样的问题,那该怎么办呢,那么就去模拟,自己东西写程序,然后利用工具模拟大量的请求,实现高并发的情况,观察在高并发的情况下,redis和数据库的情况,然后在根据该情况解决该问题,最后再来验证该问题。当自己做完这些的时候,才能真正的说自己做过在高并发的情况下,解决reidis缓存的一些问题。

再比如分库分表,网上有非常多的文章来介绍其思路。但是线上数据在并不大的情况下是不需要分库分表的,那么仅仅是看了文章,并没有深入的去了解,一个表面映像,如果是到了下一个公司,突然问分库分表的问题,虽然能够简单的说一下思路,但是真的讲操作的时候,很可能就错误百出。并且当已经是线上程序了,需要做分库分表工作时,需要该如何处理呢,线上程序停下来维护,将数据搬移到新的数据库中?是否有更好的方式呢,是否可以进行双写的操作,即数据的插入不仅写入旧数据库中,也写入分库分表中,然后将数据的更新删除操作发送到消息中间件中,当旧数据库中的数据都搬移到数据库中,然后将程序的数据库切换成分库分表数据库,消费消息中间件的消息,最后写一个程序进行数据的比对。这一系列的操作过程,只有在实际操作中能够得到检验,也只有在实践中才能将别人的知识化成自己的知识。

总结:编程是一个需要花精力做的事情,不要抱怨每天干的仅仅是增删改查的工作,小的项目也可以变成一个内容很丰富的项目,在小项目中也可以学习到非常多的知识。

原文地址:https://www.cnblogs.com/skyice/p/9665567.html

时间: 2024-08-30 11:02:26

项目也可以学习到很多东西的相关文章

用别人的钱和时间进行学习(可以学到很多东西,创业成功多了把握,而且缓解财务压力),善于利用已有资源,别着急,只要不断工作、不断学习然后保持耐心即可

我还是个小孩的时候,曾经在堂兄的礼品店干过. 那些漫长炎热的夏天实在是太无聊了,所以我甚至都没开口让他给我工钱. 不过有一天我突然想到了一个好点子.我可以跑到山里面,到当地果园摘一些无花果,然后卖给游客. 我把这个计划告诉了堂兄. “这是个糟糕的想法,”他听了直摇头:“每个人都会问你的果是从哪儿来的.然后你就成小偷了.” 这是我的第一个商业点子——不过它还没有来得及开始就夭折了. 很多人相信成功的创业注定需要冒险. 要么你是个守着柠檬汁小摊的 8 岁小孩,要么就是没有合适的东西. 就像 Remi

一辈子作为一个程序员,在中国要放下很多东西

最近看了一篇微信文章<程序员的恐惧>,感觉在中国如果要做一辈子的程序开发,可不是一件容易的事情,需要放下很多东西,需要顶得住来自各方面的压力. 生活如此维艰,总是需要很多的经历才会完善人生,而如果只是一直做开发,程序员的世界相对单一,在中国这个人情的社会里,这样的存在会随着年龄的增长与这个社会格格不入的! 以下是转载原文<程序员的恐惧> 国内的架构师到了三十岁以后很多就往理论上跑,而国外的架构师在往上发展的同时保持下面的编程体验,所以国内多水王,而国外则多大师.---江南白衣 软件

程序员如何学习新的东西

程序员如何学习新的东西 在竞争中获得胜利的最好方法,就是避开竞争,避开竞争的最好方法就是先下手为强 写代码已经有几年了,在这几年中写了不少的代码,学习了不少的技术,也算是有一定的认知了. 其实还是那句话,万变不离其中,学习要得方法与渠道. 如何获取新技术关键词 其实学习一门技术,首先是知道这们技术,如果你只是靠公司项目中来学习技术,你永远都是落后于被动的.所以学习技术第一点,就是如何知道当今有啥新技术出现: 作为初出茅庐不就得我来说,我总结起来,有以下几个途径: 1.公司在的项目关键词,公司中一

学会了 C 语言真的可以开发出很多东西吗?

马里奥碰到花朵就变身. 什么是马里奥?一个装着 16 × 32 个小色块的长方形,其中一些色块填着颜色,另一些没有.什么是花?一个 16 × 16 的正方形.什么是「变身」?把马里奥这个方块里面代表衣服的褐色变成红色,代表背带裤的红色变成白色.什么是褐色?暂且说它是 0x887000 这个数字.什么是「碰到」?马里奥的长方形与花朵的正方形有所重叠.什么是「重叠」?假设马里奥的这个方块占据屏幕(什么是屏幕?一个能装下 256 × 240 个小色块的矩形)中 X 方向 101 到 116.Y 方向

学会了 C 语言真的可以开发出很多东西吗

原帖地址:知乎 一个人在知乎上问了这么一个问题,然后 涛吴 有了下面的回答. 马里奥碰到花朵就变身. 什么是马里奥?一个装着 16 × 32 个小色块的长方形,其中一些色块填着颜色,另一些没有.什么是花?一个 16 × 16 的正方形.什么是「变身」?把马里奥这个方块里面代表衣服的褐色变成红色,代表背带裤的红色变成白色.什么是褐色?暂且说它是 0x887000 这个数字.什么是「碰到」?马里奥的长方形与花朵的正方形有所重叠.什么是「重叠」?假设马里奥的这个方块占据屏幕(什么是屏幕?一个能装下 2

Android开源项目SlidingMenu本学习笔记(两)

我们已经出台SlidingMenu使用:Android开源项目SlidingMenu本学习笔记(一个),接下来再深入学习下.依据滑出项的Menu切换到相应的页面 文件夹结构: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGVuZzB6aGFvdGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > 点击Bluetooth能够切换到对应的

C语言零基础项目驱动式学习第一天

引言: 智能手机(Smart Phone)是一种运算能力及功能比传统手机更强的手机.目前的操作系统基本上有以下几种: 1. Symbian Os 众所周知塞班隶属于NOKIA,Symbian开发之初的目标是保证在较低资源的设备上能长时间的运行,这导致了塞班的应用程序开发有着较为陡峭的学习路线,开发成本高,但是程序的运行的效率很高> 2.Android 开源, 联盟,Android凝聚了几乎遍布全球的力量,这是Android形象及声音能够被传到全球移动互联网市场每一个角落的根本原因.不过, 1).

手机科普(软硬件简介——android)看了会懂很多东西的!

主要销售组成部分 手机和电脑一样,都需要不同的零部件拼装而成,只不过手机零部件相比于电脑零部件来说更精密,手机必备的零部件包括:CPU.RAM.ROM.GPU.屏幕.摄像头.电池容量.手机网络制式.天线芯片 等,下面我们分开解析不同部件的不同功能.CPU相当手机的大脑及心脏,核心的运算能力.强劲的CPU可以为手机带来更高的运算能力. RAM相当手机的搬运工,也叫做运行内存简称运存同电脑上所使用的内存条.RAM越大,手机运行速度更快,多任务机制更流畅. ROM相当于手机的原则储存仓库.用于安装系统

Android开源项目SlidingMenu的学习笔记(二)

在前面已经介绍了SlidingMenu的用法:Android开源项目SlidingMenu的学习笔记(一),接下来再深入学习下,根据滑出项的Menu切换到对应的页面 目录结构: 点击Bluetooth可以切换到相应的界面 关键代码 MainActivity.java package com.dzt.slidingmenudemo; import android.app.Fragment; import android.app.FragmentManager; import android.app