atitit.提升软件开发的效率and 质量的那些强大概念and方法总结

1. 主流编程中三个最糟糕的问题 1

1.1. 从理解问题后到实现的时间很长 1

1.2. 理解和维护代码 
2

1.3. 学习曲线高 
2

1.4. 扩展性烂 2

1. Coc 2

2. Dsl 2

3. DSM 3

4. 4gl 3

5. 产生式编程(Generative Programming,GP) 3

5.1. 为重用而开发以及使用重用的开发 3

6. 在模型驱动开发(MDD)介绍MDA 4

7. ·  元编程 4

8. 意图编程 4

9. ·  AOP 5

10. ·  泛型编程 5

11. FP 5

12. 面向语言编程LOP(Language Oriented Programming)
5

13. 代码生成 VS 模型解释
6

14. 参考 6

1. 主流编程中三个最糟糕的问题

1.1. 从理解问题后到实现的时间很长

在明白问题和解决方案后,将解决方案编码到计算机中将会花费很长的时间。这是因为可以使用非常丰富的自然语言表达问题,但我们只能通过通用的编程语言与计算机交流。而现在的编程语言只有几十种,而自然语言表达可以有千万上万种,因此这种转换的成本是比较大的。

在主流编程中,大部分时间都是在“编程”上,这实 际上是在用编程层次的抽象术语来表达自然语言的概念,而这是很困难的,没多少创造性,或多或少也是一种时间的浪费。举个例子,今天大量的开发时间花费在面 向对象的设计(OOD)上,在程序员表达类、继承、关联等方面这确实是一种还算有创造性的过程,但是使用Language Oriented Programming,OOD根本就不需要。

(个人观点:这个我还不是很了解,我想底层还是需要的吧,有待进一步了解)

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

1.2. 理解和维护代码

在通用语言的程序中,很多高度概括的视角、蓝图都 丢失了,这不利于我们对产品理解。解决这个问题的传统方法是写注释或用其它形式的文档来记录设计信息和模型信息,但这证明了这是一种脆弱的解决方案,因为 它需要编写这些辅助文档的成本、以及文档和代码带来的不同步麻烦等问题;理想情况下,代码应该是自我描述的,我应该只阅读代码本身来理解代码,而不是什么 注释和外部的文档。

1.3. 学习曲线高

OOP很少能够直接表述领域概念,它们必须引入额 外的枝节(如一个类的运行时行为)来完成到领域概念的映射。理解这些领域、学习这些类库不是一项简单的任务,我们需要用大量的指南和文档来解决这个问题, 但是学习这些将花费大量时间;当一个类库变得复杂的时候,它也变得更难以学习,程序员将因此失去学习它的动机。即使掌握了领域问题和技术的这种复杂映射之 后,依然还会很容易的误用类库,因为开发环境(像编译器和编辑器)不能帮助你正确的使用类库。

1.4. 扩展性烂

当需要进行一些语言扩展时,我们只能等待语言的设计者去更新它;如果需要我的IDE有一些额外的强大功能,只能等待供应商来添加新特性;就是这些依赖限制了我们完全的自由;当然,程序员也可以写自己的编译器和IDE,但这样将会花费大量的时间和努力,并且并不一定能成功。

1. Coc

2. Dsl

3. DSM

4. 4gl

5. 产生式编程(Generative Programming,GP)

因为我们平时写程序一个非常大的苦恼就是领域知识已经深深的隐藏在代码中,而任何一个领域知识的变动对程序来说就是无休止的改动和调试。而产生式编程却可以做到以代码的形式清晰的表现领域模型。

是一种软件工程泛型(paradigm),基础是对系统族建模。就是说,给一个特定的需求说明书(specification),就可以根据要求制作出一个高度定制、优化的中间产品或者最终产品。这需要使用基本的、可重用实现组件通过配制知识的方式实现。

在软件中,向自动化制作软件的方向转变需要经历两个步骤:

1. 把焦点从开发一个系统转移到开发一个系统族上来:开发出正确的共性组件

2. 使实现组件的装配自动化:使用产生器达到自动化

  我感觉它可以作为产品线工程的一种软件工程方法,产生式编程就是设计实现组件,使之适应于通用产品线结构,同时对配置知识建模,强调如何把抽象的需求转变成特定的组件群,并且使用产生器实现配置知识,通过这些工作来解决前面说的高复杂性、高效率和高质量等问题。

GP的目标集中于系统族,而不是一种一个的系统(one-of-a-kind system),它不是从头构造一个单独的系统族成员,而是基于一个通用的产生式领域模型。模型由三部分组成:

1. 指定系统族成员(问题空间 problem space)

2. 组装出每一个成员的实现组件(解空间 solution space)

3. 在问题空间和解空间之间的配置知识映射关系(配置知识)

5.1. 为重用而开发以及使用重用的开发

产生式编程是生成的,如:AOP(AspectJ),DSL(Drools)

产生式编程是组合的,

1.产生式是自底向上,而声明式是自定向下。即产生式编程用的思路是组合概念(用小粒度的概念组合生成大粒度的概念),

而声明式编程是解析概念,用统一的概念来理解,把不同差异性交由具体程序解析。

2.声明式编程的编辑器生成的是xml文件,将由框架程序解析;而产生式生成程序代码,不做解析运行。

3.由于1,导致元数据模型不一样,产生式是相对细粒度的,而声明式是粗粒度的(不能直接比较大小,定义的是无差异性的概念)。如Ant,jbpm都是很大的概念。

6. 在模型驱动开发(MDD)介绍MDA

7. ·  元编程

编写元程序的语言称之为元语言。被操纵的程序的语言称之为目标语言。一门编程语言同时也是自身的元语言的能力称之为反射或者自反。

反射是促进元编程的一种很有价值的语言特性。把编程语言自身作为一级数据类型(如LISPForthRebol)也很有用。支持泛型编程的语言也使用元编程能力。

元编程通常通过两种方式实现。一种是通过应用程序编程接口(APIs)将运行时引擎的内部信息暴露于编程代码。另一种是动态执行包含编程命令的字符串表达式。因此,“程序能够编写程序”。虽然两种方式都能用于同一种语言,但大多数语言趋向于偏向其中一种。

最常见的元编程工具是编译器,它可以将程序员使用高级语言编写的相对短小的程序转换为等价的汇编语言或者机器语言程序。这是最基础的编程工具,在大多数情况下,直接编写机器语言程序是不太现实的。

在程序中嵌入直接处理程序数据的解释器即可实现这一目的。现在已经有一些用于常用高级语言的实现,例如RemObject为Object Pascal编写的Pascal Script

另一个很常用的元编程例子是lexyacc,这两个工具用来生成词法分析器语法分析器。Yacc通常用作编译器的编译器,生成能够将高级语言转换为机器语言的工具。

8. 意图编程

财务人员看见电子表格软件的时候眼睛发亮,我想当程序员看见可用的意图编程工具的时候也会发亮的。

意图编程的提出者也是“所见即所得”文档编辑的发明人。

他说“目前,编程正好和开采钻石过程相反,在开采钻石时你挖出大量的泥土,而找出一点点昂贵的钻石。可编程时,你从一个有价值的真正意图开始, 随后却把这种意图埋在泥土中”。

喷气发动机的例子。他说,拿涡轮叶片来说,它们必须做得 非常精确。即使由很细心的熟练工人加工叶片,仍然不可能达到你要求的精度,而必须另造一台机器来加工叶片。其中会有人干预这个过程吗?当然,制造、维修和 调整机器必须由人来完成。机器也会出错,机器一旦出错会很显著,你能马上发现,并改正它。程序编码也是如此。不需要人去接触编码。否则程序易于出错。人能 制造这种机器。..

9. ·  AOP

Aspect Oriented

10. ·  泛型编程

泛型编程最初诞生于C++中,由Alexander Stepanov[2]和David Musser[3]创立。目的是为了实现C++的STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数T。比如qsort泛化之后就变成了:

11. FP

12. 面向语言编程LOP(Language Oriented Programming)

LOP放弃了传统的基于文本的语言,用创造新的语言来代替类库,可以和编辑器所整合,并且每个程序员都可以创造自己的语言

按照Dmitriev先生的观点,通用语言的问题在于:它们描述领域模型的能力太差。在完成概念性的领域建模之后,开发者们还必须经过一个漫长的编码过程,才能把模型描述为机器可理解的程序,反过来要理解这些代码所描述的领域模型也是同样困难。而DSL虽然能够很好地描述领域模型、解决领域问题,但这种语言又太少了,而且大多数开发者必须苦苦等待少数大厂商为他们提供适用的DSL。很大程度上,这种“语言的失位”造成了软件开发的低效。

  Dmitriev先生提出的解决方案就是LOP:借助工具的帮助,允许开发者创建自己的DSL。这样的DSL当然能够最贴切地描述领域问题,从而大大提高开发效率。而且,这样的“自定义DSL”也不必是文本形式的,它可以直接保存为树状结构(或别的结构),并直接以图象的形式展现。

LOP的切入点就是允许我们可以创建、重用、修改语言和环境。要理解LOP 是什么,可以从下图的主流编程和LOP方法过程进行一下比较,它使得编程阶段已经不是瓶颈了,而转移到了“创建”这一步,作者开发可一个通用的平台 (the Meta Programming System)来设计DSL,它允许程序员像现在编写程序一样非常容易的就可以定义自己的语言;这个平台将完全支持LOP,给程序员为程序的每一部分选择 使用最合适的语言的自由,而不是将他们绑在某个固定的通用编程语言之上。

LOP将不只是编写程序,还包括创建用来编写程序的语言

13. 代码生成 VS 模型解释

我们可以解释模型直接运行在领域框架之上,也可以把模型通过代码生成技术转换成代码之后编译运行在框架之上。这两种方式都有利弊,可以搭配使用,在OpenExpessApp中将采用这两种方法,类库通过代码生成,UI等元模型通过框架解释执行。由于代码生成是MDD中很重要的一项技术,所以本篇我将介绍一下代码生成相关的知识。

14. 参考

MDSF:产生式编程(Generative Programming)方法介绍 - 周 金根 - 博客园

MDSF:面向语言编程LOP(Language Oriented Programming)方法介绍 - 周 金根 - 博客园

MDSF:LOP-使用MPS来做个计算器的示例 - 周 金根 - 博客园

MDSF:代码生成 VS 模型解释 - 周 金根 - 博客园

atitit.提升软件开发的效率and 质量的那些强大概念and方法总结的更多相关文章

  1. Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725

    Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓  O725 1. DSL主要分为三类:外部DSL.内部DSL,以及语言工作台. 1 2. DSL ...

  2. atitit.提升软件开发效率大的总结O5

    atitit.提升软件开发效率大的总结O5 #---平台化.组件化 1 #--cbb公用模块的建设 1 #---内部最佳流程方法跟实践的总结 2 #---内部知识体系的建设 2 #---问题Qa库的建 ...

  3. atitit.提升软件开发的生产力关健点-------大型开发工具最关健

    atitit.提升软件开发的生产力关健点-------大型开发工具最关健 1. 可以创作出更好的工具遍历自己 1 2. 大型工具包括哪些方面 2 2.1. ide 2 2.2. dsl 2 2.3.  ...

  4. 每一个人都懂得敏捷开发 (软件project), 为何产品开发的效率与质量还是这么的烂?

    敏捷开发(软件project)是 "设计" 出来的.不是 "学" 来的-- 很多人都一直在质疑敏捷开发能否提高效率与质量? 更有不少人以嘲讽.不屑的口吻看待软件 ...

  5. Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net

    Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net 1. 提升单例有能力的1 2. 减少工作数量2 2.1. 减少距 ...

  6. Atitit.提升软件稳定性---基于数据库实现的持久化 循环队列 环形队列

    Atitit.提升软件稳定性---基于数据库实现的持久化  循环队列 环形队列 1. 前言::选型(马) 1 2. 实现java.util.queue接口 1 3. 当前指针的2个实现方式 1 1.1 ...

  7. 软件开发的生产力vs质量

    在<人月神话>里看到引用的一篇论文,<没有银弹:软件工程的本质性与附属性工作>(英语:No Silver Bullet-Essence and Accidents of Sof ...

  8. 软件开发:速度 vs 质量

    程序开发项目进行过程中,通常会冒出这样的困惑:应该选择速度,还是选择质量?很多程序猿都会有偷懒的思维,觉得把一些摸不清头绪.不知道怎么写的代码片段去掉,可以节省很多时间,更早完成项目计划. 其实过去几 ...

  9. Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结

    Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结 1. 管道抽象 1 2. 层次结构抽象(json,xml etc) 1 3. 异步抽象promise 1 4. Ide ...

随机推荐

  1. UISearchBar

    UISearchBar——方便用户搜索信息 在移动应用程序的世界里,用户对信息获取的速度要求非常高!iOS用户希望他们需要的信息能够迅速地,直观地展现在他们面前 因为UITableView的上下滚动能 ...

  2. hdu4738 Caocao's Bridges

    http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:曹操赤壁之战大败,于是卷土重来.为了避免水上作战,他在长江上建立了一些岛屿,这样他的士兵就可以在 ...

  3. LINK : fatal error LNK1104: 无法打开文件“gtestd.lib”

    解决办法: 复制编译出来的gtestd.lib文件到D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib目录下 我这里用的是vs2015 ...

  4. 云计算和大数据时代网络技术揭秘(十二)自定义网络SDN

    软件定义网络——SDN SDN是网络技术热点,即软件定义网络,OpenFlow是实现SDN思想的一个框架标准, open是指公开.开放,具体为控制平面的规则由各个通信厂家自定义变为公开的技术标准, f ...

  5. C++通过模板实现多态

    #include <iostream> using namespace std; template<typename T> class Phone { public: void ...

  6. 校验两次密码一致的js代码

    function checkpasswd(){ var passwd = document.getElementByIdx_x_x_xx_x('passwd').value; var repasswd ...

  7. Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享

    Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com ...

  8. Setting SVN Repository Using TortoiseSVN + Dropbox in 5 Minutes

    SVN is a very common version control system in software development. However configuring SVN server ...

  9. JavaScript知识架构学习路径(一)- 变量篇

    [摘要]本文是专为JavaScript入门者而总结的,总体上将JavaScript的基础部分分成了九大块,分别是变量.运算符.数组.流程控制结构.字符串函数.函数基础.DOM操作基础.文档对象模型DO ...

  10. 新公司入职第一天遇到的 关于 CSS 单行溢出文本显示省略号...的问题

    上班第一天 前端岗位,因为公司这个项目是标准开发 所以没法用框架在打架页面,好吧 我手写 各种div 各种css样式 好不忧伤,好吧 不废话了 进入正题. 想在导航栏中的 客户信息 功能点 实现溢出用 ...