想想入行已经1年有余,天天出了拿需求写代码,完成一个个功能外,自己对整个软件的开发如何诞生,如何设计却了解的很有限。这些天一直在思考着一款软件在让我编码之前都做了什么?一款软件到我这样的程序员开始功能代码的编写之前都是由谁完成的?都是怎么设计的?都是怎么规划的?

我觉得是时候思考这个问题了,我不是什么牛人,相反我和大多数人一样是一个大学啥都没有学过的超级菜鸟,只是顶个计算机系毕业的头衔混混沌沌的加入了程序员的行列。如果一直这么编写功能下去,我想以后再也走不出代码民工的范畴,其实这也没有什么,关键是思想上已经不可能再有什么进展了,无疑是人生的悲哀。思想被禁锢在一个狭小的范围内,永远不能指点江山。我追求思想上的开放和整体的感知,我觉得这是每个热爱生活的人都该具备的基本素质,具体到软件开发,我觉得每个人都应该把软件架构师等顶级职位当成自己的量化目标。因为当你实现这个目标的时候,意味着你的思想高度也已经达到了思考生活,享受生活的地步了。

讲了一些自己的想法,说说我最近的感触吧。(设计主线和代码主线)

一款软件从需求调研,到概要设计,再到详细设计,再到可以形成文档,紧接着编程,测试,发布。以前在软件工程上学到这些条条框框都扔给了老师。现在重新找回来,发现其实树上说的和现实中的差别并不大。我们很多时候的软件都是这样设计出来的。我就以这个作为一个设计主线说说吧。

需求调研: 说白了,这个就是向软件的使用者罗列一些处理功能需求。其实这个就是问和答的问题。有的时候我们想到我们的软件需要什么功能,然后写出来,参考别人的类似软件放到自己这里来。这个阶段决定了你的软件具备什么样的功能和软件的特色和定位。一款软件有个清晰的定位很重要。(PS:软件不该是万能的,功能的明确才会让你的软件有特色)。

概要设计:这就是整合用户的需求,列出一个列表来。把整个软件具有的功能划分一个个功能区域和模块。(PS:这里不是程序逻辑模块, 仅仅是功能模块)。这个完成了,基本软件90%的功能就确定了下来。一个概要设计主要完成的其实就是让你明确加深对软件功能的熟悉,更加明确软件的方向。让你接下来的详细设计变的更符合逻辑更通用。(PS:这个概要设计在一些公司应该被什么策划部门列为最详尽的文档吧,其实我想对开发者来说这就是一份功能性文档)。

详细设计:在我的想法里,这个详细设计是应该由一个项目组的项目经理来主导完成,整个项目成员参与进来的过程。这里是整个软件开发的关键所在。因为这里要完成整个软件的功能的细分,功能模块和逻辑模块的结合。(PS:我所说的逻辑模块是相对于代码来说,由各个逻辑模块联合完成某个功能模块的需求,也可以是一个逻辑模块对应了一个功能模块,如果非要划分,我想把它划分为:一对多的关系。一个功能模块对应了一个或者多个逻辑模块)。在详细设计里我觉得要做到以下几点:

1、用户的角度来看:结合一项功能如何展现给用户,用户如何操作,将这些场景一个个和概要设计里的功能对应起来。说到代码里这就对应一个函数块或者一个模块的功能

2、分析概要设计里的关键元素,我记得有术语,不过我忘了。我就叫他关键的对象吧。然后抽象出对象的属性。设计出基本的数据结构。(PS:说到代码里我觉得enum,

struct,class, define, const等主要的你能够感知到的对象(再次PS:什么是你能感知到的,说白了就是你能很快想到的,玄吧,比如说人这个对象:身高,年龄等这个就是

可感知,比如,一个通知类,这种就是非可感知,因为这个是你虚构的)在这个时间确定的)

3、基本的元素有了,元素要完成的功能有了,这个时候就可以设计整个功能的活动图了,用功能为一条精神指引,用元素作为支撑点,一步步的搭建起来一个活动图。(PS:

这个是我觉得画活动图的最高境界),两个元素,或者功能无法直接产生联系的时候,那就开始发挥你的想象吧,这就像一条公路的修建,遇水架桥,遇山开山。(PS: 程序

中的一些“现实中不存在的对象类”我个人觉得就是这么产生的)

4、当你能够把整个软件的功能以这样一种形式跑通的时候,我觉得整个软件的逻辑模块基本上就定型了,接下来的类图,数据流图,接口的设计应该在前面都思考过,这个

时候只是整理出来而已了。把这些东西搞好,这个软件的骨架应该就算完成。

5、以上基本上还没有牵扯到代码,下面的就是我所说的代码主线的主要部分。这个时候,项目经理开始用编译器或者什么神器之类的工具搭建软件的基础框架。不需要写什

么详细的类啥的,只是把工程的类型,编译选项,要使用的库,以及主要使用的技术等糅合起来,让一个软件的代码基础都显示出来(PS:我不想说这类似人体的骨架,我

想把他比喻成人体的表皮他们是把骨架和血肉组合起来变成了一个活人,你说呢,不要踹我)

6、我想到了这个阶段就是我现在从事的代码编写阶段了,大家各司其职。项目经理应该在小组成员开始之前把基本的数据结构等相关代码编写完毕,每个人需要通用的代码

编写完毕。紧接着我想就是想我这样的程序员开始登场了。写,写,写...

7、基本就是测试,修改BUG了,就不详述..

综上:其实我把一个软件的需求分析,概要设计,详细设计的前1和2两点划分为软件中的纯设计主线,详细设计的3,4有设计的影子也有代码的影子,属于设计和代码的结合部分,而详细设计第四点以后的部分就被我划分为代码主线的部分了,这时候代码是整个软件项目的主导。前面设计是主导。

其实我只是说了一个软件设计的大概流程,只是最近的一些感想。具体的实施在这个过程中有很多需要细化的地方。

有的时候我们在看书,看很多关于软件设计的书,但却忘了停下来思考,停下来结合实际反思。书有的时候仅仅是给了我们一种思考的方式,或者说给了我们一种扩展视野的方式。尤其是软件工程和软件设计类的书,大都泛泛而谈。所以结合实际形成一套自己设计软件的方式才是最重要的,工作1年有余,我感受到自己这方面必须要加强了,代码的功底时间长了机器人都能熟悉,只有思想需要时刻的磨练着。

如何设计一款软件的一些感想相关推荐

  1. 为统一规划思想、知识、事情而设计的笔记软件

    每个人使用过很多方式规划自己的思想.事情.从以前的台历.笔记本.便签.随身小本子,到各种日历.日程.笔记.清单软件.我也这样很多年,但总是感觉不很方便,缺了些什么.记录.查阅不便,整理规划难,积累利用 ...

  2. Google首席软件工程师Joshua Bloch谈如何设计一款优秀的API【附PPT】

    要:API设计看似简单,其实里面的学问还不少,在整个设计流程中,一不小心就会陷入各种陷阱之中,给你带来后患无穷的危害.Joshua Bloch是Google的首席Java架构师,他在一篇PPT里向大家 ...

  3. 计算机控制字如何使用,字由怎么用?一款软件管理1594种字体 很多设计大神都在用...

    对于设计人员来说,电脑中经常要安装各种字体.普通的网友一般是在网上找一些自己喜欢的字体来安装,而很多设计师都在用一些比较专业的字体管理软件,一款软件可以管理上千种字体,简直太方便了.今天"第 ...

  4. UI想设计得好,这几款软件少不了

    设计是把一种设想通过合理的规划.周密的计划.通过各种方式表达出来的过程.人类通过劳动改造世界,创造文明,创造物质财富和精神财富,而最基础.最主要的创造活动是造物.设计也分为好多种类,有平面设计.标志设 ...

  5. Google首席软件工程师Joshua Bloch谈如何设计一款优秀的API【转载】

    Google首席软件工程师Joshua Bloch谈如何设计一款优秀的API 摘要:API设计看似简单,其实里面的学问还不少,在整个设计流程中,一不小心就会陷入各种陷阱之中,给你带来后患无穷的危害.J ...

  6. 日常图片设计,用这几款软件就够了

    已经从事设计行业三年多了,虽然自己并不是主要的设计人员,但是在绘图上面还是需要掌握一些绘图技巧的,所以在软件方面还是有所涉猎.下面就是我们小组团队常用的四款软件,简单介绍分享给大家觉得有用的话可以去试 ...

  7. 论述一款软件的界面设计与设计重点是什么?

    智能手机普及以后,相信许多人都知道手机APP是什么了,然而一款让人过目不忘的软件,离不开精心的设计,界面设计是人与机器之间传递和交换信息的媒介,近年来,随着信息技术与计算机技术的迅速发展,市场上出现了 ...

  8. 设计行业必备6款软件

    自从从事设计行业后,我才意识到选择一款合适的工具有多重要,不然很容易因为工具缺少相应功能拉低效率.里胡哨的短视频也得需要咱这设计审美的检阅才能发送,几乎是覆盖了生活的方方面面,作为一名已经从业四年的设 ...

  9. 用Qt设计一款单词本软件,采用SQLite数据库

    运行结果 运行逻辑 开发背景 源代码 运行结果 运行逻辑 程序启动后,显示单词本界面作为主窗口,同时从SQLite数据库中读取数据显示成列表. 用户可以点击几个按钮打开几个子窗口,进行增删查改等操作. ...

最新文章

  1. linux ping策略打开_Linux禁止ping以及开启ping的方法
  2. Java设计模式中的六大设计原则
  3. MIT 研究员开发不会泄露数据的安全平台
  4. dedecms后台怎么添加发布软件?织梦后台软件内容管理
  5. spring事务的传播机制新解
  6. nodejs从服务器返回静态文件,nodejs静态资源服务器
  7. 最近做了个数据采集的工具
  8. python vars()_Python vars()
  9. php里ezpdo orm框架初探
  10. HFSS - GSM 900 单频PIFA天线的设计与仿真
  11. 网页压缩--gzip和deflate的区别
  12. 人脸识别技术开发解决方案,人脸识别智慧工地应用开发
  13. tar命令中参数 cvf,xvf,cvzf,zxvf的区别
  14. python为自己龟蜗速更新的小说生成词云
  15. 抖音直播汽车资讯资质怎么认证报白,抖音怎么直播二手车
  16. 时间复杂度以及空间复杂度(大O的渐进表示法)
  17. 交通违章 处罚[转]
  18. 如何零基础入门UI设计?
  19. 3.7V转3.3V,5V转3.3V可选择:升降压芯片,降压芯片和LDO
  20. Android开发之模拟器

热门文章

  1. nodejs 环境变量配置
  2. 1361:对角线的数量
  3. Filter过滤器和动态代理处理机制和案例(Filter过滤器和动态代理结合)
  4. 【数据库系统】数据库系统概论====第十四章 大数据管理
  5. 程序员生存定律[七] 表达背后的力量
  6. Java方法中的局部类和匿名类
  7. LUA 编辑器 易语言版 源码
  8. c语言中int*p p的含义,int (*p)(int *int);p表示什么含意啊
  9. spring boot 工作原理
  10. React Fiber 机制