`
envy2002
  • 浏览: 151676 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

软件开发过程中的思维方法

阅读更多

软件开发过程中的思维方法

 

软件开发绝对是个消耗脑力的过程,在这个过程中,是需要一些思维方法的。而这些思维方法是需要训练和总结的。

 

软件抽象来讲是在一定的输入情况下,产生一定的输出,这个“过滤器”就是我们的软件。

 

 

 

        豆浆机就是个“软件”,黄豆和水进去,豆浆出来,那么这个过滤器就是豆浆机。

 

        解码器也是,“二进制流”进去,正弦波出来。

 

       怎么把我们的软件设计好,这就涉及到软件开发思维了。我自己总结的有这么几个:划分,抽象(归纳),推演,概

 

率。

 

      1.划分就是找到你感兴趣的点从而形成一个大家公认的概念,这个划分是有具体要求的,干净,充满美感。比如”人“

 

这个概念,为什么单单人体定义成”人“的概念,而不把人和一把”椅子“定义成一个人呢?也许你要说:人一走动,人的身体

 

就会一起动,而椅子不会,所以人和椅子是两个不同的概念,要分开定义。但是人如果把椅子罩在脑袋上,学着一只蜗

 

牛背着一个壳一样,我们是否也能把人椅合体定义为”人“呢?这个划分就有些玄妙了。可见,”划分“是有一定依据的,这个

 

依据没有绝对的指标。是个概率事件。但是这个原则就是你获得的”概念“,尽量干净,利落,讲究美感。对应起软件开发过

 

程中的对象和函数来说,那就是一个臃肿的对象和一个近似万能的函数是不讨人喜欢的。

 

    2. 抽象和归纳是个很重要的方法。绝大部分的软件开发工作我们都涉及在此了。

 

     

 

请看上面这幅图,要你用程序写出这个图像。这是个4*18的方框,每个红点的位置不一样。如果有些小伙子不太善于

 

发现的话可能用两个for嵌套语句,然后if((i==1&&j==1)||(i==1&&j==4)||....)填充红色。这种方法就相当于点阵素描

 

了,一个个信息是抠出来的。但是我们如果把这个矩阵想象一维的,那么每个点的坐标就是i^2,即1,4,9,16,25,

 

36....这样,我们的程序就可以更加优异的写出来。但是等等,事实上,有这么巧合让我们归纳出这个数列函数来吗? 现实

 

是不一定的,如果我把第5个点左移一位,那么这个函数发生了变化,变的很不容易归纳,或者归纳的成本变高。

 

  3.概率。这个世界不是平坦的,也不是都是一个个实打实的函数可以描述的,行星的运动可以用万有引力,开普勒,拉普

 

拉斯方法描述。但是世界是随机的,认识到这个问题,我们用软件解决问题的思路会开阔一些。我们会采用近似解,而不是

 

精确解,我们会采用统计性能,而不会用单个性能来衡量。从web负载均衡到快速排序,都采用了随机的量化思想。

 

 4. 推演。推演更像个逻辑题,我们在软件系统中建立了某种体系,规则,所有的行为必须按照这个规则和体系。否则就会

 

矛盾。推演不是具体体现在编程过程中,是在满足变化中你需要注意的地方。一个女生要去商店买被子,告诉老板:老板,

 

我要一个又暖又轻又好看又便宜的被子。老板会立刻告诉她:木有!这样的过程总是会发生在我们开发过程中,客户老是希

 

你用大便给他造个满汉全席。你可以用你线性代数和动态规划的知识解这个不等式组,结果就是无解!埋头苦干的程序员总

 

是埋头苦干,想立刻赢得快感。开始做的好好的,越做越爽,但是收尾的时候,发现了大麻烦,无法从逻辑上合拢。然后

 

重新设计了一种方案,结果还是不行,搞来搞去,最后还想着我把这个问题搞定,我就是高手了。其实如果静下心来,仔细

 

用数学的方法来分析,推到一下,会发现这是个不可能的任务,事实上存在这样的问题吗?相当多的。当然这样的矛盾一般

 

是不容易出现的。比方说某人娶了他二舅的大爷的三姑的侄子的表兄的弟弟的母亲的外孙的三姨的哥哥的三叔的小姨子的儿


子的女儿,从而得出自己是自己的爸爸的荒谬结论一样。这个矛盾的过程很长,但是某个阶段都是无矛盾的,但是把这个环

 

给圆了,那是不可能的。

 

       一般来说,软件开发都是一个对上并且对下的过程。对上就是我们需要满足什么样的输出,对下,我们建立什么样的基

 

础上,有什么用的平台。先从整体上把握,我们会罗列出软件需要满足的条件。再从下层来分析,我们手头有哪些素材,能

 

有什么样的能力。我个人最反感的就是大家讨论项目,一上来就是谈怎么怎么实现,哥哥的。有的人连什么问题都不清楚,

 

这样入题是非常愚蠢的,大家的思维都没有限定,怎么发挥想象力,想象力也是在一定范围内约束的想象啊!开题之前,介

 

绍一下项目的前因后果,达成目标,对接系统的素材,能力等等这些其实都是十分重要的,这样大家的思维就会在一个比较

 

安全的范围内思考,而不会漫无边际。

 

理想和现实---软件的开放和封闭(安全和稳定的相对讨论)。软件是收外界的刺激的,能受外界刺激的种类越多,输

 

出种类也多,说明其开放性很高,复杂度也高。反之,软件封闭性很高,也越安全,也稳定。开始软件很小,不是很复杂,

 

很封闭,很安全,但随着需求增长,越来越开放,稳定性会下降,直到不可使用。有没有一种方法能使软件在日渐开放的

 

过程中能永生呢,答案是否定的。这就好比盖楼一样,为了盖50层的楼,我要10层脚手架支持,为了盖500层的楼,这

 

么,我需要50层脚手架,同理50层脚手架,也需要额外的10层脚手架固定支撑。一栋楼好比一个体系,为了这个体系不

 

倒,不矛盾,我需要额外支撑,当然软件需要第二栋楼,这栋楼也很高,也需要额外脚手架,虽然这些楼互不相交(矛盾,

 

抵触),但是脚手架会挤占这些体系之间的空隙,直到矛盾。也就意味系统的终结。可能这个比方很粗糙,但是理论学家

 

确实证明了,可以参考

哥德尔不完全性定理

大概意思就是世界不可能用一个规则来归纳,比如牛顿力学不能解释整个世界,需要量子力学,量子力学同样不可能完全解释世界,这两种力学体系可能存在冲突。其实我也不懂这个定理在说什么。

 

 

 

范例:

 

        什么是好的划分?

 

        在项目中,最先遇到的是直觉。直觉是可靠的吗,不一定。直觉是简单的吗?也许是简单的。首先,我们要把“直

 

觉”加工提炼。

 

         分解--》验证--》综合。

 

         现在举一个色彩组合的例子。

         

 

         这个例子和软件的构建过程十分类似,希望我能使你感觉到我是在讲软件开发,呵呵

 

         色彩有无限种,如果我们要输出“任意”一种色彩,一种一种去制造是绝对“耗时”的。那么正确答案就是“三原色”组、

 

合,按照不同的比例,浓度来调节,总是能合成我们需要的色彩。我们来分析这个过程,色彩的“分解”,然后我们“验证” ,

 

试验一下,发现可行,然后“综合”一下,编程,交出结果。“分解”的过程十分有趣,有没有不好的分解呢,当然有的,可能

 

你分解出来的“原色”,永远也合成不出一个任意需要的色彩,这就是差的分解。软件的需求是不断增加的,开始我们对问题

 

的把握由于case没有那么多,总是能用一种近似的方法来得到,比如,我们需要一种“暗紫”色,我们的直觉就是制造一个

 

”暗紫“,当我们再需要一种色彩的话,我们还是用直觉再给出一种色彩,当我们不断在被老板要求的时候,我们就可能想想

 

用组合色彩的办法了,如果需求的色彩不是很多,我们是能够用一种非”三原色“的”基础色“来调出来的,但是当需求变成

 

任意,就无能为力了。好的分解,如何得到呢,好像是智慧,这种智慧并不是经验,不管你有多少年的软件开发经验,这个

 

和”智慧“没有关系,经验只是一种熟练程度而已,你所拥有的经验别人总是能学到,或者总结出来。但是智慧不是,需要数

 

学,物理等方面的训练。

 

         好的分解都是有共同点的,这是一个力学的分解图,正交分解。这样我们求解”合力“就会变的非常机械化,程式化。

 

           

 

     这无疑是个很好的”分解“。那么好的分解的共同特点就是“维度的正交化”,正交化才能减少冗余,差的分解总是包含着

 

无穷无尽的”冗余“,对项目来说,开始还OK了,后来越来越垃圾,直到崩溃。自己扪心自问,你们的项目经理,系统工程


师,有没有”制造“出逻辑无比混乱的概念,风骚银荡的规则,和这些规则之外的例外情况?这些就是活生生的失败”分解“,

 

没有抓住问题的本质,或者看的不够深远。

 

         作为一个程序员我感到很悲哀。系统工程师设计完了,我就要马不停蹄的开始coding, 开始还好。但是随着项目的增

 

大,会有”打散“(原来就是指树的深度变浅这个概念,树的深度很深,现在为了使树的深度变浅,称之为”打散“,老子还以

 

为要把碗打烂呢!),等许多

 

莫名其妙的词汇和概念,为什么呢?装逼吗,天知道,只是这些概念十分幼稚,完全可以用一些大家都了解的数学概念来称

 

呼嘛!像“树”,“交集”,“并集”等等,我操,很多项目经理和系统工程师都从来不用一些通用语言的,总是自以为是的发

 

明。再然后我就要陷入无限的泥沼中。我会开始有如下的coding.

 

 

                             通常一般采用这个规则

                             {

 

 

                                   rule();

 

                               }

                           but if( case 1)

                               {

                                       rule()之外,有些小变化,rule1()

                                }

                                if( case 2)

 

                                {

 

                                         rule()之外,有些小变化,rule2()

 

                                 }

 

                                if( case 3)

 

                                {

 

                                         rule()1,rule2()之外,甚至还要rule3()

 

                                 }

            写到这里,你肯定要fuck了,一个好的规则应该是“简单,正交,充满美感”,如果你很多额外的代码是为了维持你

 

的规则继续生存下去,那就考虑一下这个设计是否合理,有没有必要重构,让其更加简单,直白。

 

            以后再写!

 

 

 

 

 

 

分享到:
评论

相关推荐

    软件开发过程方法研究

    ### 软件开发过程方法研究 #### 一、引言 随着信息技术的快速发展和制造业的不断进步,软件系统在现代工业生产中的地位越来越重要。先进的制造模式要求信息集成和功能集成贯穿于产品生命周期的每一个阶段,这不仅...

    软件开发过程中的文档

    在软件开发过程中,文档起着至关重要的作用。它是团队沟通的桥梁,确保项目的顺利进行,同时也是项目维护和传承的关键。本文将围绕“软件开发过程中的文档”这一主题,深入探讨其重要性、类型以及如何有效地编写和...

    软件开发过程,软件开发方法,软件开发工具

    使学生具备必需的软件工程的基础知识和基本技能,初步掌握开发中、小型应用程序的过程和方法,培养学生科学思维、综合运用所学知识解决实际问题的能力及一定的创新意识,为学生继续学习和提高职业技能打下基础

    软件开发人员逻辑思维测试及完美解答

    从给定的文件标题、描述、标签以及部分内容中,我们可以提炼出多个与软件开发人员逻辑思维测试相关的知识点,这些测试不仅考察了基本的数学逻辑能力,还涉及到了更复杂的策略规划和推理技巧。下面,我们将详细解析每...

    用科学的思维方法指导软件的设计开发

    本文将围绕“用科学的思维方法指导软件的设计开发”这一主题进行深入探讨,旨在帮助读者理解如何将科学思维方式融入到软件开发过程中。 #### 一、科学思维在软件开发中的重要性 科学思维是一种基于逻辑推理、实证...

    项目管理技术在软件开发过程中的若干问题探讨

    ### 项目管理技术在软件开发过程中的若干问题探讨 #### 一、项目管理技术概述 项目管理技术是指在规定的预算、时间和质量标准下,通过整合各种资源与人员,确保项目顺利完成的技术体系。它贯穿于项目的整个生命...

    敏捷软件开发.pdf

    它鼓励开发者快速交付价值,同时持续审视并提升软件开发过程本身。敏捷方法论不是一种固定的做法,而是一种适应变化、持续改进的态度和方法。通过这种方法论,团队能够更好地管理项目中的不确定性,从而提高软件开发...

    UML软件开发方法

    UML(统一建模语言)是一种在软件开发过程中广泛应用的标准化建模语言,它为软件开发团队提供了可视化描述、构造以及文档化软件系统的能力。UML不仅是一种图形化的表示工具,更是一种理解和表达复杂系统设计的有效...

    软件开发的哲学思考

    作者通过对软件开发过程中存在的问题进行分析,揭示了软件开发与人类思维、创造力之间的密切联系,并提出了关于如何改进软件开发过程的一些思考。 #### 二、软件开发的本质 软件开发是一种高度依赖于人类思维的...

    嵌入式软件开发学习路线思维导图

    嵌入式软件开发是一个复杂而广泛的领域,涵盖了操作系统、硬件、编程语言以及系统设计等多个方面。以下是一个初学者的学习路线图,旨在帮助你逐步掌握这一领域的核心知识。 首先,你需要熟悉Linux操作系统。Linux是...

    软件开发中的人员与过程.pptx

    在软件开发过程中,人员与过程起着至关重要的作用。软件不仅仅是程序代码的集合,它包含了程序、数据和相关文档的完整集合,是计算机系统的灵魂。软件工程这一概念的提出,是为了应对20世纪六七十年代出现的软件危机...

    计算思维和软件工程中的方法论意义

    面向方面软件开发(AOSD)则是关注点分离的另一个重要进展,它引入了“方面”这一概念,将跨越多个模块的横切关注点(如日志记录、事务管理)单独处理,从而避免了传统方法中“横切代码”污染主体逻辑的问题。...

    第二章-软件开发过程及其组织.mm

    第二章-软件开发过程及其组织.mm

    软件开发过程总结.ppt

    总的来说,软件开发过程是一个涉及多方面知识和技能的过程,它需要开发者理解软件的本质,掌握工程化的开发方法,同时关注用户需求,保证软件的质量和可持续性。软件工程作为应对软件危机的手段,不断发展和完善,以...

    敏捷软件开发与测试过程

    在敏捷开发过程中,测试同样扮演着至关重要的角色。敏捷测试的目标是在开发的每一个阶段都能够及时发现和解决问题,以确保最终产品的质量和可靠性。 - **持续集成**:通过自动化测试确保代码的质量。 - **测试驱动...

    软件开发中的11个系统思维定律

    在软件开发过程中,我们经常会遇到各种各样的挑战。为了解决这些问题,团队常常会制定出一系列的应对策略。然而,随着时间的推移,这些曾经有效的解决方案可能会逐渐成为新的问题源头。例如,在软件开发团队中,为了...

    面向过程的软件工程文档模板

    面向过程的软件工程是一种传统的软件开发方法,它侧重于通过有序的步骤来设计、实现和维护软件。在这一方法中,软件被看作是一系列可执行的步骤或过程,而不是一组独立的对象。以下是对"面向过程的软件工程文档模板...

Global site tag (gtag.js) - Google Analytics