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

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

一、软件工程概念

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

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

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

软件工程是应用计算机科学、数学、逻辑学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则、方法,以 提高质量、降低成本和改进算法。
其中:
计算机科学、数学用于构建模型与算法
工程科学用于制定规范、设计范型(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)

大家都在看

  • Pytorch及Yolov5环境配置及踩坑

    Pytorch及Yolov5环境配置及踩坑 yolo是计算机视觉方面用来进行目标检测的一个十分出名的开源框架,我搜不到官方的对此概括性的定义,但实际上也没什么必要,更重要的是会使用…

    Java 2023年6月7日
    0105
  • ucore操作系统学习(五) ucore lab5用户进程管理

    ucore在lab4中实现了进程/线程机制,能够创建并进行内核线程的调度。通过上下文的切换令线程分时的获得CPU,使得不同线程能够并发的运行。 在lab5中需要更进一步,实现我们平…

    Java 2023年6月8日
    060
  • eShopOnContainers 是一个基于微服务的.NET Core示例框架

    找到一个好的示例框架很难,但不是不可能。大多数是小型Todo风格的应用程序,通常基于SimpleCRUD。值得庆幸的是,Microsoft已经为eShopOnContainers创…

    Java 2023年6月7日
    076
  • maven-排查包冲突

    原因:A系统 引用B系统的功能,但是B系统有一个redis需要排除,在已经排除的情况下,还是无效,出现redis存在问题。 解决方法: 需要用到maven查询结构树 去排查 到底j…

    Java 2023年6月9日
    058
  • 程序员都遇到过哪些误解?

    程序员: 为计算机编写代码的人,按照现代企业研发部的岗位,分为:开发工程师,运维工程师,架构师,数据工程师,算法工程师等; 误解: 即事实是另外一种情况,而因为环境的复杂性或者消息…

    Java 2023年6月8日
    095
  • Filter 过滤器

    什么是Filter过滤器? 1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器2、F…

    Java 2023年6月15日
    088
  • Spring Cloud 配置application.yml与bootstrap.yml快速入门

    一、概述 _Spring Cloud Config_是 Spring 的客户端/服务器方法,用于跨多个应用程序和环境存储和提供分布式配置。 此配置存储理想地在 Git_版本控制下进…

    Java 2023年5月30日
    090
  • 搞定了!OAuth2使用验证码进行授权

    现在验证码登录已经成为很多应用的主流登录方式,但是对于 OAuth2授权来说,手机号验证码处理用户认证就非常繁琐,很多同学却不知道怎么接入。 认真研究胖哥 Spring Secur…

    Java 2023年6月8日
    078
  • ViewGroup 和 View 事件传递及处理小谈

    在自定义组件的时候少不了会去处理一些事件相关的东西,关于事件这块网上有很多文章,有说的对的也有说的不对的,我在理解的时候也有过一段时间的迷惑,现在把自己理解的东西写下来,给有相同疑…

    Java 2023年6月7日
    065
  • docker和docker compose安装使用、入门进阶案例

    一、前言 现在可谓是容器化的时代,云原生的袭来,导致 go的崛起,作为一名java开发,现在慌得一批。作为知识储备,小编也是一直学关于 docker的东西,还有一些持续继承 jen…

    Java 2023年6月15日
    071
  • 装饰模式、泛型、序列化重构Caffeine解决缓存不一致的问题

    一、前言 Caffeine是一个高性能的 Java 缓存库,底层数据存储采用ConcurrentHashMap 优点:因为Caffeine面向JDK8,在jdk8中Concurre…

    Java 2023年6月15日
    0108
  • Mycat windos版(详细步骤)

    第一步:mycat下载 先下载一个运行环境框架包。 下载地址: http://dl.mycat.org.cn/2.0/install-template/ 我下载的版本:(mycat…

    Java 2023年6月5日
    0118
  • quartz时间表达式Cron总结

    Cron表达式的介绍: cron的表达式是被用来配置CronTrigger实例的。 cron的表达式是字符串,实际上是有七个子表达式,描述个别细节的时间表。 这些子表达式是由空格分…

    Java 2023年6月5日
    088
  • spring高版本循环依赖报错问题

    java;gutter:true;2.6.0后关闭了循环引用,需要开启报错信息: org.springframework.beans.factory.UnsatisfiedDepe…

    Java 2023年6月9日
    0119
  • Java 17 新特性:switch的模式匹配(Preview)

    通过下面这个例子再回忆一下: Map data = new HashMap<>(); data.put("key1", "aaa&quot…

    Java 2023年6月9日
    074
  • C# 多线程详解 Part.01(UI 线程、子线程)

    什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。一个进程至少有一个主线程。 什么是线程? 线程是程序中的一个执行流,每个线程…

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