「掘金者说」对开发来讲,业务重要还是技术重要?

您好,我是掘金者说,最近有点累主要是没有休息好,直接请年假一天在家睡了一天一夜补眠。然后,假期回老家挖笋顺便和姚总监再聊工作上的事情。上回写的是业务功能的对账,现在来讲下在做业务功能“门面”,系统平台的登录后的首页展示,几乎都是报表、统计、圆饼图、柱状图。采用微服务前后端分离,后端spring cloud,前端使用vue+element ui+echart,前后端都是一个人进行弄。原型图改了第一版,后来又改了一版本,功能又确认了…里面不弄不知道,细碎的东西可真多。前端页面绘制,后端接口编写,数据库语句编写,单元调试…

什么是业务

通俗的讲,业务就是需要处理的各种事务,但是通常偏向指客户实际作业涉及的事务,业务最终的目的是完成工作所做的所有事务。

业务和技术的关系

软件是用来解决现实世界中的业务给人们的工作带来便利的。技术是为了解决业务的问题,只有在实现业务给人们带来便利的前提下,技术的存在才有意义。所以,多数时候是业务决定技术,业务统领技术。没有技术,业务就无法被虚拟化,生产效率就很难有效提升,业务和技术具有相互促进、相互依赖、相互共存的关系。我们都看过周星驰的电影《喜剧之王》有一句台词这么说的:其实,我是一个演员。作为我们来说:其实,我是一个程序员。 一个道理。我们回到开发者身上来看,写业务代码多一些,还是所谓的技术代码多一些,没有高低之分,只有个人取向和组织分工的不同。

业务和因解决业务而衍生的

很多开发者会用不同的眼光来看待业务和技术,比如把增删改查(CRUD)看作是无意义的业务代码(其实,可以使用代码生成器,来实现前端+后端+数据库脚本生成,具体可以参考pig4cloud,把实现 MQ 或 Redis 这样的框架看作是有技术含量的事情。实际上,所谓的业务代码和技术代码只是距离远近,业务代码距离业务更近,技术代码离业务稍远,他们最终都是指向业务实现的。每一层技术实现都是服务于上一层的需求为业务。现实中,业务在被我们虚拟化的过程中,会在技术实现角度引发分层,产生组件模块化。这样让开发者觉得技术实现越来越业务没有技术含金量?面试的时候被问道多线程、高可用、高并发、高性能、某实现原理和机制、遇到难点和解决方法思路等等,导致概括能力和实战运用退化,这个需要平时多训练和琢磨。 当我们越是接近用户业务,会发现里面的细节越多,繁琐度越高,越不容易做的好,越容易遐思而被否定,让人觉得自己的劳动没有价值。遐思性越强,变化几率越高,来来回回频繁的修改代码,正所谓:牵一发,动全身。让人觉得自己的掌控能力低,实现的代码可迁移性越差,个人的劳动成果被能力复用的概率越低。

好了,这些话不是我想多说的,我摊牌了,具体想看直接知乎对开发来讲,业务重要还是技术重要 。现在,讲述一个首页“门面”代码实现记录。

数据统计补全机制

Java核心逻辑,数据统计根据按时/天/周/月/年补全某一段时间的数据。情况是这样的,数据库查询的数据统计,使用sql语句查询group by create_time之后有部分时间的数据没有,希望通过补充0提供给前端展示。

按年补全数据-具体逻辑

	/**
	 * 按年补全数据-具体逻辑
	 *
	 * @param oldList
	 * @param start
	 * @param end
	 * @return
	 */
	public static List<Map<String, String>> addYearForNullMap(List<Map<String, String>> oldList, String start, String end) {
		int n = getYearSub(start, end) + 1;
		ArrayList<Map<String, String>> newList = new ArrayList<>();
		int num = oldList.size();
		int temp = 0;
		Date startDate = DateUtil.parse(start, "yyyy");
		Date endDate = DateUtil.parse(end, "yyyy");
		Date tmpDate = null;
		if (startDate == null || endDate == null) {
			return newList;
		}
		for (int i = 0; i < n; i++) {
			if (temp < num) {
				String orderTime = ObjectUtil.toString(oldList.get(temp).get("orderTime"));
				tmpDate = DateUtil.parse(orderTime, "yyyy");
				//如果开始日期小于当前记录日期则增加空白数据
				if (startDate.compareTo(tmpDate) < 0) {
					Map<String, String> result = getNewStatisticResultMap(start);
					newList.add(result);
				}
				if (startDate.compareTo(tmpDate) == 0) {
					//原数据加入
					newList.add(oldList.get(temp));
					temp++;
				}
			} else if (temp >= num && startDate.compareTo(endDate) <= 0) {
				//加入空数据直到结束时间
				Map<String, String> result = getNewStatisticResultMap(start);
				newList.add(result);
			}
			//开始时间向前加一年
			startDate = addDateOneYear(startDate);
			start = DateUtil.format(startDate, "yyyy");
		}
		return newList;
	}

按日补全数据-具体逻辑

	/**
	 * 按日补全数据-具体逻辑
	 *
	 * @param oldList
	 * @param start
	 * @param end
	 * @return
	 */
	public static List<Map<String, String>> addDayForNullMap(List<Map<String, String>> oldList, String start, String end) {
		long n = getDaySub(start, end) + 1;
		ArrayList<Map<String, String>> newList = new ArrayList<>();
		int num = oldList.size();
		int temp = 0;
		Date startDate = DateUtil.parse(start, "yyyy-MM-dd");
		Date endDate = DateUtil.parse(end, "yyyy-MM-dd");
		Date tmpDate = null;
		if (startDate == null || endDate == null) {
			return newList;
		}
		for (int i = 0; i < n; i++) {
			if (temp < num) {
				tmpDate = stringToDate(ObjectUtil.toString(oldList.get(temp).get("orderTime")), "yyyy-MM-dd");
				//如果开始日期小于当前记录日期则增加空白数据
				if (startDate.compareTo(tmpDate) < 0) {
					Map<String, String> result = getNewStatisticResultMap(start);
					newList.add(result);
				}
				if (startDate.compareTo(tmpDate) == 0) {
					//原数据加入
					newList.add(oldList.get(temp));
					temp++;
				}
			} else if (temp >= num && startDate.compareTo(endDate) <= 0) {
				//加入空数据直到结束时间
				Map<String, String> result = getNewStatisticResultMap(start);
				newList.add(result);
			}
			//开始时间向前加一天
			startDate = addDateOneDay(startDate);
			start = DateUtil.format(startDate, "yyyy-MM-dd");
		}
		return newList;
	}

或者

	/**
	 * 按日补全数据-具体逻辑
	 *
	 * @param oldList
	 * @param start
	 * @param end
	 * @return
	 */
	public static List<StatisticResult> addDayForNull(List<StatisticResult> oldList, String start, String end) {
		long n = getDaySub(start, end) + 1;
		ArrayList<StatisticResult> newList = new ArrayList<>();
		int num = oldList.size();
		int temp = 0;
		Date startDate = DateUtil.parse(start, "yyyy-MM-dd");
		Date endDate = DateUtil.parse(end, "yyyy-MM-dd");
		Date tmpDate = null;
		if (startDate == null || endDate == null) {
			return newList;
		}
		StatisticResult dog = null;
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		for (int i = 0; i < n; i++) {
			if (temp < num) {
				tmpDate = DateUtil.parse(ObjectUtil.toString(oldList.get(temp).getTime()), "yyyy-MM-dd");
				//如果开始日期小于当前记录日期则增加空白数据
				if (startDate.compareTo(tmpDate) < 0) {
					StatisticResult result = getNewStatisticResult(start);
					newList.add(result);
				}
				if (startDate.compareTo(tmpDate) == 0) {
					//原数据加入
					newList.add(oldList.get(temp));
					temp++;
				}
			} else if (temp >= num && startDate.compareTo(endDate) <= 0) {
				//加入空数据直到结束时间
				StatisticResult result = getNewStatisticResult(start);
				newList.add(result);
			}
			//开始时间向前加一天
			startDate = addDateOneDay(startDate);
			start = DateUtil.format(startDate, "yyyy-MM-dd");
		}
		return newList;
	}

根据开始与结束日期获取相减得到的天数

	/**
	 * 根据开始与结束日期获取相减得到的天数
	 *
	 * @param beginDateStr
	 * @param endDateStr
	 * @return
	 */
	public static long getDaySub(String beginDateStr, String endDateStr) {
		long day = 0;
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		Date beginDate;
		Date endDate;
		try {
			beginDate = format.parse(beginDateStr);
			endDate = format.parse(endDateStr);
			day = (endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return day;
	}

根据开始与结束日期获取相减得到的年数

	/**
	 * 根据开始与结束日期获取相减得到的年数
	 *
	 * @param beginDateStr
	 * @param endDateStr
	 * @return
	 */
	public static int getYearSub(String beginDateStr, String endDateStr) {
		int year = 0;
		SimpleDateFormat format = new SimpleDateFormat("yyyy");
		Date beginDate, endDate;
		try {
			beginDate = format.parse(beginDateStr);
			endDate = format.parse(endDateStr);
			Calendar calendarBegin = new GregorianCalendar();
			Calendar calendarEnd = new GregorianCalendar();
			calendarBegin.setTime(beginDate);
			calendarEnd.setTime(endDate);
			int yearBegin = calendarBegin.get(Calendar.YEAR);
			int yearEnd = calendarEnd.get(Calendar.YEAR);
			year = (yearEnd - yearBegin) ;
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return year;
	}

单元测试

        @Test
	public void addMonthsForNull() {
		List<StatisticResult> oldList = new ArrayList<>();
		StatisticResult st1 = new StatisticResult();
		StatisticResult st2 = new StatisticResult();
		st1.setAction("55");
		st1.setTime("2020-01-02");

		st2.setAction("66");
		st2.setTime("2020-01-03");

		oldList.add(st1);
		oldList.add(st2);

		String start = "2020-01-01";
		String end = "2020-01-05";

		TheFirstStatisticsUtil tt = new TheFirstStatisticsUtil();

		List<StatisticResult> list = tt.addDayForNull(oldList, start, end);

		for (StatisticResult sr : list) {
			System.out.println(sr.toString());
		}

	}

效果展示

StatisticResult(time=2020-01-01, action=0)
StatisticResult(time=2020-01-02, action=55)
StatisticResult(time=2020-01-03, action=66)
StatisticResult(time=2020-01-04, action=0)
StatisticResult(time=2020-01-05, action=0)

下一篇,介绍前端vue编写的技巧方式,现在就写到这吧。

发布了89 篇原创文章 · 获赞 25 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/u010638673/article/details/105465736
今日推荐