Computer Engineering
解决方案
Technical Solutions:
设计
Category of Software Design
1. About Software Design
软件设计是一个创建软件工件规格说明的过程,目的是使用一组原始组件并对其进行约束以实现目标。软件设计可能指的是“概念化、构造、实现、调试和最终修改复杂系统所涉及的所有活动”,或者“在程式化的软件工程过程中,遵循需求规格说明并在编程之前进行的系列活动”。
软件设计通常包括解决问题和规划软件解决方案。这包括低级的组件和算法设计以及高级的架构设计。
1.1. Overview
软件设计是对一组或多组问题的设想和定义软件解决方案的过程。软件需求分析(SRA)是软件设计的一个主要组成部分。SRA 是列出软件工程中使用的规格说明的软件开发过程的一部分。如果软件是“半自动化的”或以用户为中心的,软件设计可能涉及用户体验设计,产生一个故事板来帮助确定那些规格。如果软件是完全自动化的(意味着没有用户或用户界面),软件设计可能像流程图或描述计划事件序列的文本一样简单。也有一些半标准的方法,如统一建模语言和基本建模概念。在任何一种情况下,计划的一些文档通常是设计的产物。此外,软件设计可能是独立于平台的,也可能是特定于平台的,这取决于实现具体设计的技术。
软件分析和设计之间的主要区别是,软件分析的输出由要解决的更小的问题组成。此外,不应该在不同的团队成员或组之间设计非常不同的分析。相反,设计关注的是功能,因此针对同一问题的多种设计可能并且将会存在。根据环境的不同,设计常常会有所不同,无论它是根据可靠的框架创建的,还是使用合适的设计模式实现的。设计的例子包括操作系统、网页、移动设备,甚至新的云计算范例。
软件设计既是一个过程,也是一个模型。
- 设计过程是一系列的步骤,使设计者能够描述软件构建的所有方面。创意技能、过去的经验、对“好”软件的理解,以及对质量的全面承诺,都是成功设计的关键因素。然而,需要注意的是,设计过程并不总是一个简单的过程;
- 设计模型可以与建筑师设计房屋的计划相比较。它首先代表了要建造的东西的整体(例如,房子的三维渲染)。慢慢地,这个东西被完善,为构建每个细节提供指导(例如,管道铺设)。同样,为软件创建的设计模型提供了计算机软件的各种不同视图。
1.2. 组件、算法设计与架构设计
算法、组件与架构--由低层到高层,暗示了看待问题的粒度大小是不同的,但从设计的本质上看并无不同:无论哪个层级的设计,其实都是由更底层模块进行支持和保障的,也同时要与外部模块按照约定进行协作。
在面向对象的设计中,一个架构可以被拆分成多个组件,一个组件又是由算法和数据构成的,因此设计视角必然也是软件架构的视角。
软件架构是指软件系统的基本结构以及创建这些结构和系统的规则。每个结构包括软件元素、它们之间的关系以及元素和关系的属性。软件系统的体系结构是一个比喻,类似于建筑物的体系结构。它作为系统和开发项目的蓝图,列出了需要由设计团队执行的任务。
软件架构是就基础结构做出选择,这些选择一旦实现就需要付出高昂的代价来更改。软件架构的选择包括软件设计中可能出现的特定结构选项。此外,为了满足可靠性的需要,可以选择多个冗余的、独立生成的程序副本,并在交叉检查结果的同时在独立的硬件上运行这些副本。
记录软件架构有助于涉众之间的沟通,捕获关于高层设计的早期决策,并允许在项目之间重用设计组件。
- — Software Architecture
1.3. Design Considerations
在设计一个软件时要考虑很多方面。每个考虑事项的重要性应该反映软件创建要满足的目标和期望。这些考量因素包括:
Compatibility 兼容性--该软件能够操作与其他产品的互操作性设计的另一个产品。例如,一个软件可能向后兼容它自己的旧版本。
Extensibility 可扩展性--新功能可以添加到软件中,而无需对底层架构进行重大更改。考虑系统未来追加新功能是否方便,便宜。
Modularity 模块化--最终的软件由定义良好的、独立的组件组成,从而带来更好的可维护性。然后,这些组件可以被独立地实现和测试,然后再被集成成所需的软件系统。这允许软件开发项目中的工作分工。
Fault-Tolerance 容错--软件能够抵抗并从组件故障中恢复。
Maintainability 可维护性--对bug修复或功能修改是否容易完成的度量。高可维护性是模块化和可扩展性的产物。
Reliability 可靠性(软件耐久性)--软件能够在规定的条件下,在规定的时间内执行所需的功能。
Reusability 可重用性--在其他项目中使用现有软件的某些或全部方面的能力,几乎不需要修改。
obustness 健壮性--软件能够在压力下操作或容忍不可预测或无效输入。例如,它可以设计为具有低内存条件的弹性。
Security 安全性--该软件能够承受和抵抗敌对行为和影响。
Usability 可用性--软件用户界面必须对其目标用户/受众可用。必须为参数选择默认值,以便它们是大多数用户的良好选择。
Performance 性能--软件在用户可以接受的时间范围内执行任务,并且不需要太多的内存。
Portability 可移植性--软件应该可以在许多不同的条件和环境中使用。
Scalability 可伸缩性--该软件能够很好地适应不断增长的数据或增加的功能或用户数量。
2. Topics
- API 设计原则
- BranchByAbstraction
- Business_Process_Model_and_Notation
- CategoryDesignPattern
- Communication Protocol
- Dependency_Inversion_Principle
- Domain-driven Design(DDD)
- Don't repeat yourself
- Entity-Relationship Model
- High_Cohesion_and_Loose_Coupling
- 幂等设计
- Petri Net
- Prototype
- Representational State Transfer
- 面向对象的 S.O.L.I.D 原则
- Separation_of_Concerns
- 技术债务
- UML
- Unix 哲学
- c4model
- 做好软件系统设计的5个步骤 by BlueDavy
- 产品原型设计工具
- Workflow Patterns
开发
软件开发中应用的工具、类库等经验技巧
系统
Platform/OS/Database/...
工具
Free Softwares:
- Bitvise - SSH client and server for Windows
- Classin
- DCMTK
- Eclipse
- Evernote
- Fabric:基于 SSH 协议的 Python 工具
- GDCM
- GNU Toolchain
- Gatling - a load testing tool
- Gerrit
- GitLab
- Glances
- Gradle
- GraphViz
- Homebrew
- ImageMagick
- IntelliJ_IDEA
- PyInvoke
- IxChariot:网络性能(吞吐量及延迟)测试工具
- JDK_Tools_and_Utilities
- Apache JMeter
- LabelMe
- Maven
- Netdata
- Nexus_Repository_Manager
- Nginx
- Notepad2
- Notion
- Online_Document_Tools
- OpenSSH
- OpenSSL
- OpenVPN
- Pandoc
- PhantomJS, webkit内核的无界面浏览器
- Postman
- 项目管理软件
- PyCharm
- Rclone
- SCM
- SDKMAN
- SaltStack
- 屏幕录制软件
- SonarQube
- Sublime Text 3
- Subversion
- TestDisk
- ThinkingRock
- List of Unix-like Utilities
- Vim
- VirtualBox
- WordPress: 个人信息发布平台
- X11_for_Windows_and_Mac
- YApi
- Zoom
- cURL
- instant_messaging
- Jenkins: 持续集成服务
- jstack - Threads Trace in JVM
- lftp
- Locust - a scalable load testing framework written in Python
- MoinMoin: 一个基于文件系统的Wiki服务
- mycli
- 产品原型设计工具
- ssh client wrapper for automatic login
- tinc
- tmux
- wget
- yEd
- yum
- Zabbix: 一个监控服务