谈谈设计对软件工程目标实现的影响

本文从个人经验出发,谈谈设计对软件工程目标实现的影响。

一、软件工程概念

首先明确下”软件工程的概念”。

看下原文(注意,原文也有一些问题,但总体没有大毛病):

既然有分歧,我只能选择自己认可的部分,即<

软件工程是应用计算机科学、数学、逻辑学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则、方法,以 提高质量、降低成本和改进算法。
其中:
计算机科学、数学用于构建模型与算法
工程科学用于制定规范、设计范型(paradigm)、评估成本及确定权衡
管理科学用于计划、资源、质量、成本等管理

二、关联的软件设计概念

从”软件工程”的定义看,涉及的内容非常之多。

本文限于篇幅,没有能力也没有必要阐述那么多,所以主要从技术管理者的角度,阐述如何利用计算机的设计技术参与达成软件工程的目标:

  • 高质量完成项目
  • 减低开发和维护成本

设计相关的内容非常之多,无法一一罗列,所以只列出以下内容

其中”算法”专业性太强,需要耗费的篇幅也太多,所以本文略过。

1.软件架构

软件架构描述的对象是直接构成系统的抽象组件,各个组件之间的连接则明确和相对细致地描述组件之间的通讯。

2.设计原则

在进行软件系统设计时所要遵循的一些经验准则,应用该准则的目的通常是为了避免某些经常出现的设计缺陷。

3.设计模式

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性

三、设计如何影响工程管理目标的实现

作为软件管理者(例如CTO,高级工程师)通常情况下在项目中主要做以下工作:

实际做项目的时候,因为客户、项目特性、团队特性等因素,无法或者也没有必要做那么细致的设计,所以管理者更多工作是:

在管理的时候,主要工作:

一个项目正常情况下,只要规范和设计做好,通常技术上就不会有太大问题,技术管理者的主要工作也算基本完成。

在一些更大型的项目/组织中,作为技术负责人,甚至都不参与编码工作,因为设计工作和管理工作已经足够繁重。

技术主管在履行技术管理主要职责的过程中,所需要利用的知识和比较多,但本文只讨论三点:设计原则、软件架构、设计模式。

下面我们来简单讨论掌握和合理以上三点的重要性。

1.设计原则

某种程度上,是一个作业指南,类似开发规范、编码规范,但主要从技术的角度出发。它是一个指导性的文案,所有的设计必须遵守这些原则,再展开。

这些原则都较好理解,原则都是针对人的局限性而定制的。

例如单一原则,它要求一个接口或者一个函数或者是一个类应该尽量简单,因为如果复杂了那么可能会出现如下问题:

2.软件架构

它是一个系统草图,起到指导性作用。我们常常提到方向、指导、领袖、明灯,这是因为指明一个方向和目标是非常重要的。

没有正确定义工作/努力目标,那么后续的工作就会出现许多问题。所谓南辕北辙反映的就是没有正确指导的问题。

所以软件架构起到一个”指路”的作用,指出了各个软件功能/部件之间的构成方式–毕竟一般的软件都有许多的功能。

这之后,我们才会考虑概要设计、详细设计的问题。所以它非常重要。

不同的软件架构,对人员、硬件、项目周期、软件质量会又不同的影响。这个环节中,设计人员的工作就是结合实际选择合适的软件架构。

例如,一个大型工厂的设备管理系统,用于登记、维修、巡检、采购、报废、和监控等等。

一般情况下,我们会采用复合架构。总体上采用b/s(一般客户会这么要求),非监控部分采用简单的分层即可,而监控的采用管道+事件/消息+分层。

因为这个需求中,最大的问题就是硬件监控数据网络通信的高并发和即时性,而不是人类活动的高并发和即时性。

要不要试试微服务?

那么我们这里有没有大量实例了?不需要,最多部署几个实例或者主机即可,最多做一些负载均衡。

有没有频繁变更,频繁重新部署,大量部署的情况?作为核心问题,采集没有频繁变化的必要,也没有必要频繁重新部署。

如果一定要强上,那么会面临以下问题:

有人会说,需求没有太多变化不是正好可以不要那么多维护成本了吗?

那应该是因为没有考虑人员成本的问题。 例如如果我不做微服务框架,那么可能会以不需要掌握这个框架的程序员为主,这样是不是可以节约支出?

又有人说,我人员素质提高,效率就提升了,提升了效率就提高了单位产出。

问题是,无论怎么样还是要比采用非微服务的耗费更多的支出。还有从企业角度出发,为什么不想着节约支出,这些节约的支出用于提升团队的收益不是更好?

此外,就算这个项目多了不算很多的支出, 但是从企业,组织的角度出发,难道所有的项目都需要cloud开发吗?组织总是有做不完的大项目(能够有很高回报的)吗?

事实上,从整个行业角度看, 绝大部分的项目都低并发(tps(值得重复利用,每年产生数据在几千万到一亿内)。

大部分的项目都不是那么赚钱,需要严格控制成本

大部分公司也不是一直都有很赚钱的项目。

所以对于大部分小微公司/组织而言,控制成本就非常重要了。控制成本的最主要办法是控制人员薪资、同时提升工程效率。

这种情况下,这些公司/组织就没有必要所有的人员都是高素质(高成本)。自然对人员没有那么多的要求,就结合实际给他们安排相对简单又可以做的工作,而他们的工作又能够保证达成项目目标。

从客户的角度出发,更加复杂的软件架构,会导致他们的支出:更多的硬件资源支出、更多问题可能导致的成本、更长的工期等等。

所以选择核实的架构是很重要的,它会影响技术上的实现、项目目标达成、成本。

3.设计模式

设计模式是一个描述对象关系的套路,这些套路要么能够实现技术目标,要么是能够提升编码效率,降低维护成本,从而达成管理目标。设计模式是在具体设计和编码阶段所需要关注的。

例如单例模式主要是实现技术目标–强制一个实例,以保证对特定资源的控制。

例如转换器模式(适配器模式)可以节约开发时间,减少支出成本的管理目标。这是通过利用已有的功能的基础上达成。当然您要是不在乎,重新开发一个也可以。

四、小结

软件开发根本上和建大楼是一个道理,需要考虑项目目标(安全、适用等等)、能够赚钱。

所以,了解有关设计概念/技术,并合理地应用到项目中,是很重要的。

作为者是技术主管或者设计人员,需要把节约开支,提升效率的想法贯彻到每个项目中,这是他们的本职工作。

作为技术主管必须有管理思想,必须严谨对待自己的工作。如果他们不这么做,那么就是失职,毕竟企业是盈利机构。

作为普通的程序员,也必须理解这些概念,如此才能更好地理解团队目标,理解设计意图,贯彻设计意图。

至于非盈利项目和个人项目则是另外一回事,想怎么折腾就怎么折腾,例如用微服务实现企业的考勤需求,用b/s方式实现复杂的图形设计。

Original: https://www.cnblogs.com/lzfhope/p/16295930.html
Author: 正在战斗中
Title: 谈谈设计对软件工程目标实现的影响

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590565/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 产品经理必懂得技术那点事儿——读书笔记

    产品经理 必懂得技术那点事儿 1.产品思维与技术思维 1.1.产品经理为什么要懂技术 当产品经理与工程师就某一个具体问题进行讨论时,双方站在各自角度就问题进行分析和讨论,固有知识结…

    Java 2023年6月16日
    080
  • spring data jpa简单使用—-逐渐完善

    第一步: 导入依赖 org.springframework.boot spring-boot-starter-data-jpa第二步:  配置文件   spring: #数据库 d…

    Java 2023年6月5日
    0102
  • spring mybatis1

    getBeanPostProcessors()就是所有的后置处理器,就是拦截器,就是责任链模式。spring和mybatis的桥梁在于 MybatisAutoConfigurati…

    Java 2023年5月30日
    096
  • 分布式学习基础知识

    新文章 分布式学习基础知识 网络通讯,网络是分布式的基础,对分布式的理解建立在对网络的理解上,包括: OSI模型的7层 TCP/IP,DNS,NAT HTTP,SPDY/HTTP2…

    Java 2023年6月7日
    082
  • Java 常用类总结(SE基础)

    本篇博客对java常用类相关知识进行了归纳总结,比较详细,适用于学习和复习。 字符串相关的类 1.1 String String是一个 final类,代表不可变的字符序列。不可被继…

    Java 2023年6月7日
    096
  • JUC入门

    参考 1.什么是JUC 1.JUC简介 JUC就是java.util.concurrent工具包的简称,这是一个处理线程的工具包,JDK1.5开始出现的。 2.进程和线程 进程:资…

    Java 2023年6月15日
    081
  • Jedis操作set&Sortedset和Jedis连接池

    集合类型 set:不允许重复元素 sadd smembers:获取所有元素 @Test public void MyTest04() { Jedis jedis = new Jed…

    Java 2023年6月6日
    072
  • java实现单链表的创建、增、删、改、查

    文章目录 单链表的创建、增、删、改、查 * 1、增加一个节点 2、删除一个节点 3、修改某一个节点 5、遍历单链表 单链表的创建、增、删、改、查 双向链表的增删改查:https:/…

    Java 2023年6月13日
    098
  • nginx 代理https后,应用redirect https变成http

    nginx配置https,tomcat正常http接受nginx转发。nginx 代理https后,(java代码redirect地址)应用redirect https变成http…

    Java 2023年5月30日
    076
  • SpringBoot+WebSocket实时监控异常

    写在前面 此异常非彼异常,标题所说的异常是业务上的异常。 最近做了一个需求,消防的设备巡检,如果巡检发现异常,通过手机端提交,后台的实时监控页面实时获取到该设备的信息及位置,然后安…

    Java 2023年6月16日
    079
  • 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之动态表单(五)

    基于Vue和Quasar的前端SPA项目实战之动态表单(五) 回顾 通过上一篇文章基于Vue和Quasar的前端SPA项目实战之序列号(四)的介绍,我们已经完成了元数据中序列号的增…

    Java 2023年6月6日
    0100
  • 一. 为什么要用SpringMVC框架

    以前是怎么做项目的 ? CoreServlet,起到一个中心处理器作用。所有的请求到服务器,服务器给CoreServlet,在里面处理所有表的增删改查,跳转也在里面做。 以前做部门…

    Java 2023年6月16日
    091
  • (转)localStorage使用总结 localStorage sessionStorage

    转:https://www.cnblogs.com/st-leslie/p/5617130.html 一、什么是localStorage、sessionStorage 在HTML5…

    Java 2023年5月30日
    082
  • JavaIO编程——文件常用操作

    创建文件操作 在JavaIO编程中,有以下三种创建文件的方式,分别是: new File(String pathname)//根据路径构建一个File对象 new File(Fil…

    Java 2023年6月8日
    087
  • 分布式session的解决方法

    一、背景 上篇博客,使用微博社交登录谷粒商城后,将用户信息保存在session中,此时进入到谷粒商城的任何页面都需要能够取到用户信息, 谷粒商城首页(gulimall.com/in…

    Java 2023年5月30日
    085
  • 架构安全性设计、部分示例及原理分析

    HTTP 协议是一种无状态的传输协议,每一个请求都是完全独立的,所以一般web开发都会采用cookie-session机制让服务器有办法能够区分出发送请求的用户是谁,在服务器中会维…

    Java 2023年6月7日
    067
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球