软件开发的思维模式

提高生产效率的思维模式与僵尸敏捷开发 同时,我们应该避免僵尸敏捷开发的陷阱,保持敏捷方法论的灵活性和效益。通过这样的任务管理系统,团队成员可以更好地跟踪任务的进度和完成情况,提高团队的协作效率。持续的用户参与:与用户和利益相关者保持密切的沟通和合作,及时获取反馈和需求变更,确保产品与用户期望保持一致。团队协作是软件开发中不可或缺的一环,优化团队协作可以提高整体效率。高效的例会:限制例会的时间和范围,确保每次例会都有明确的议题和目标,避免无谓的讨论和浪费时间。明确的迭代计划:确保团队在每个迭代开始时有明确的计划和目标,明确要完成的任务和交付物。 阅读详情

对于软件开发,有两种思维模式:

  1. 命令式
  2. 说明式

命令式的思维模式是这样:按照每个步骤描述要做的工作和任务,先做什么,后做什么,顺序是不能颠倒的;

说明式的思维模式是,描述一个物体或者概念,它有什么特性,和其他物体有什么关系。


对于编程语言,实际上是命令式与说明式思维混合在一起的。

比如,我们熟悉的C语言,其中,说明式的语句包括:

  1. 函数定义与声明
  2. 变量(全局、局部、静态)的定义与说明
  3. struct定义
  4. enum定义
  5. typedef定义
  6. 分支语句(if-else, switch),循环语句,都属于说明性的部分
  7. 等
而表达式及其组成的语句,则是命令式的,它们描述了一个任务按照什么样的顺序逐步执行;

C++和java语言中class的定义,则是非常强大的说明性语句。

但是,这些语言中说明的成分还是太少太弱了,而且有一个非常显著的特点:你不能扩展自己的说明性语法。 

为什么我这么看中说明性语法呢?
我们考虑一个应用程序,比如一个计算器(带有GUI界面那种),这个程序中大部分内容是可以说明的:
  1. GUI界面描述
  2. 事件处理方式
只有加减乘除计算部分,需要命令式描述方法,计算出用户希望的结果。然后将数据送到窗口的控件上进行显示。

显然,窗口及控件的创建、将按钮的click事件关联到一个回调上这些功能,如果用xml一类的描述性语言编写,更加简单和清晰。

一个软件中,总是存在相当部分的对象和数据,是基本不变化的,而另外一些数据,则是要求被处理的。 比如,一个字处理软件,它的GUI,菜单,事件等,在软件启动后,基本不会发生变化;而用户键入的文字,则是经常性的变化。

也就是说,软件由两部分组成,一部分是程序的框架,是不变化或者仅有少数变化的;另外一部分则是程序的处理数据,有程序的输入、输出和中间数据组成。

打个比方来说哦,程序的框架就是生产线,被处理的数据就是生产线上的产品。

不过,在我们开发软件时,这两者经常被混合讨论的,这使得软件开发的难度高而效率低。

如果程序的框架,能够被简单的描述出来,而不需要开发者花费大量的力气去定义和创建,那么,程序的开发难度将大幅降低,而效率的大幅提高。

这是我这么看中说明性语言的原因。


关注软件运行时状态
软件在运行时,有一系列各种各样的对象组成,对象直接相互引用和关联。当软件处于空闲状态时,这些对象什么也不做;当软件在处理数据时,数据在不同的对象之间被分割、转换、传递、复制、组合,最终形成需要的数据,并以某种方式输出出来。

为了构建这样一个运行时系统,软件开发者(对于OO开发者)需要在合适的时间,创建合适的对象,并和其他对象关联起来。 这里面,“合适”与“其他对象”  是两个概念,是非常模糊,有时甚至是不可到达的。

正是由于创建合适的对象如此的困难,以至于设计模式中专门列出一个“创建模式”,来描述创建合适对象要使用的各种方法。合适的时间通常和效率、性能相关,解决起来并不是很复杂。

"其他对象“这个范围是非常难以界定的,对于不同的要求,一个对象需要知道不同种类的对象。为此,我们发明接口技术。 接口技术对这个问题很重要,但是,接口有时候也是相互依赖的,而且,接口的修改,对于它的实现类和使用它的类来说,无疑是灾难。


而对于被处理的数据,情况则更加复杂。被处理的数据,可能存在一个复杂的逻辑关系,需要开发者为其单独建模,这样,被处理数据的模型有可能比被处理数据更加复杂;另外,被处理数据,实际上涉及与磁盘、网络等介质交换,这就涉及数据的解析与保存。

因此,从这个角度来说,如果我们能够描述出软件运行时的数据构成,然后让编译器自动构建出这种运行时内存的话,开发的效率和稳定性将极大的提高。

数据网络
通用的数据结构,主要由线性表、树、图以及字典表(struct和class可以看作经过优化的字典,他们都是通过名称访问的)。对象间的相互引用关系,建立了一个及其复杂的网络。 这个复杂网络中的数据,它们的值是相互映射,并保持同步的。

除了一些非常简单的应用外,大多数有实际价值的应用软件,都会建立这样一个数据网络。 对于一些较为复杂的应用软件,被处理的数据会形成临时性的数据网络。

无论是那种网络,由于引入了OO编程思想,开发者极力对外隐藏不必要的数据,因此,以OO编程思想指导的软件,其数据网络由若干小网络连接而成,每个小网络可以看作一个小层次。

GUI的数据网络
很多GUI都可以通过xml语言来描述。从这方面来说,GUI界面是非常典型的树结构。
但是GUI应用程序却远没有这么简单。

单个GUI窗口的数据网络
单个GUI窗口是一个标准的树结构。但是,GUI窗口需要和用户交互,因此,它有很多隐藏的网络。

以窗口/控件ID或者名称为key的字典网络
GUI系统为了让其他模块能够访问窗口上的控件,会提供ID或者name。这些 ID或者name就会形成一个字典数据结构,提供外部访问使用。例如,在HTML的DOM模型中,可以通过getElementById,取得标签对象。

输入和输出数据网络
一个Login窗口,必然要提供username和password两个数据到外部,让其他模块处理。它有可能需要其他模块提供已经保存过的username和password数据来进行预填。
对于窗口系统中的绝大多数对话框来说,输入和/或者输出数据是不可避免的,当然也有例外,如About对话框,完全不需要额外的输入和输出。

有的时候,数据可能来自多个方面。

如一个文件选择对话框,它要求输入的数据包括:标题、文件扩展名过滤表等;而输出则包括选择的文件名。除此之外,它从系统的磁盘上读取目录和文件信息,显示给用户。

输入和输出网络和GUI的树型网络有密切关系:
输入的数据,将映射到GUI树中,某个控件的属性;而输出的网络,则是从GUI树中采集到对应的数据。

这涉及到数据网络直接的相互映射问题。

GUI树的节点之间还存在额外的网络链接:
例如,一个播放器控制面板中,就存在密切的联系:
  1. 开始按钮按下后,停止按钮变为可用,反之亦然;
  2. 在播放进度上选择不同进度,播放的实际就会变化;
  3. 等等。
在通常的编程中,我们通常会通过一些变量,如播放状态变量、当前进度变量等,保存现有状态,然后在按钮或者是进度条的事件中,直接改变相关这些变量的值的同时,改变相关控件的属性。
如果仔细观察,在这些公认的设计思路中,存在一个隐含的数据网络,它包含状态变量、当前进度变量,而且,播放、停止按钮的enable属性,是和状态变量对应的;播放进度条的位置属性和显示播放时间的标签的文本属性,是和当前进度变量对应的。

从上面的总结来看,无论代码多么复杂,它总是由若干存在映射关系的对象网络组成的。这些网络,主体上都是树形网络(或者可以看作xml的DOM结构)。

xml的DOM结构是混合树与字典(节点的属性表)的结构。

因此,我们将窗口的逻辑关系,抽象为若干DOM树的映射关系。

DOM树之间的映射研究

对于xml,可以通过xpath进行节点的选择。 我们可以利用xpath来对DOM树进行节点间的映射。

一对一的映射关系
DOM树A的节点和DOM树B的节点进行一对一的映射。

例如,播放器控制面板的例子。
控制器面板UI的xml示意(简化版本)

<window>
    <button name="play"/>
    <button name="stop"/>
    <progress name="progress"/>
   <label name="current_time"/>
</window>
对应的状态控制的xml表述是
<controller>
   <variable name="play_state" type="enum">
       <option value="playing"/>
      <option value="stoped"/>
   </variable>
   <variable name="curtime" type="time"/>
  <variable name="progress" type="percent"/>
</controller>
play_state将绑定到play/stop button上;curtime将绑定到current_time label上,progress将绑定到progress控件上。
描述语法,可以
binding player_controller(window : DOM, ctl: DOM)
{
    window://button[@name='play']/@enable = expr(ctl://variable[@name='play_state'] != playing);
    window://button[@name='stop']/@enable = expr(ctl://variable[@name='play_state'] != stoped);
    window://progress/@postion == ctl://progress;
    window://current_time/@text = ctl://curtime;
}



这是利用类似C++代码表示的伪码。其中 "="表示将右边的值绑定到左边; "=="表示左右两边互相绑定。与C++语言中的赋值和比较是不一样的含义。


这是一种外部映射机制。它的特点是,不需要接触两个DOM的内部构成,就可以改变其内容。还有一种较为直观的方法,即利用xlst,将controller的内容嵌入到window的DOM中
<window >
    <import-dom name="ctl"/>
    <button name="play" enable="{expr(ctl://variable[@name='play_state'] != playing}"/>
    <button name="stop" enable="{expr(ctl://variable[@name='play_state'] != stoped)}"/>
    <progress name="progress" postion="{ctl://progress}"/>
   <label name="current_time" text="{ctl://curtime}"/>
</window>
"{" "}" 分别表示的是绑定机制


列表数据的映射
通常会有很多列表数据,需要填充。比如,下面是一个书店描述的xml
<bookstore>

<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="WEB">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

<book category="WEB">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

</bookstore>

将该数据映射到一个listview控件中。listview由4列组成,首先,我们使用xslt的映射方式
<listview>
   <import-dom name="book"/>
    <foreach select="book://book"/>
      <row>
         <column>
             <image src="{getimage('book:@category}"/>
         </column>
         <column>
              <label text="{'book:title'}"/>
        </column>
       <column>
             <label text="{connect(book:author)"}/>
       </column>
      <column>
                <label text="{book:year}"/>
      </column>
      <column>
                <label text="{book:price}"/>
     </column>
     </row>
   </foreach>
</listview>

还有另外一种方式,再不需要改变listview的定义内容的情况下,通过外部改变其结构
bind listview(row_templ : DOMTemplate, book:DOM)
{
      foreach(book://book,  {
           DOM row = form_template(row_templ);
           row:colum[0]/image/@src = getimage(book:@category);
           row:column[1]/label/@text = book:title;
           row:column[2]/label/@text = connect(book:author);
           row:column[3]/label/@text = book:year;
           row:column[4]/label/@text = book:price;
          listview.append(row);
     })
}

推荐使用这种不直接生成的方法,它的耦合性更小。

映射时的数据转换
在映射时,可以进行数据转换。如上例中,book的category可以映射为对应的图片文件。author部分,可以将多个节点的值链接起来,组成一个数值。

对于映射而来的数据,是无法进行双向转换的。除非定义双向映射函数。

C++对象的DOM化
上面的一切基础,都是将数据想象为一个DOM为基础的。但是,C++对象和DOM之间的区别还是非常大的。

为了解决这个问题,我们创建一个C++类的meta对象,这个meta对象,将数据描述为一个DOM结构。

比如,对于一个Display类,进行描述
class Display
{
public:
     int width;
     int height;
     int depth;
};
描述它的DOM化结构
Node display_node(
     "display" //node name,
     attribute("width", OFFSET(Display, width), INT, 800,range(1,2000)),
     attribute("height", OFFSET(Display,height), INT, 600,range(1,2000)),
    attribute("depth", OFFSET(Display,depth), INT, 16, emu(8,16,24,32)))
);

Node类描述一个Node节点,Node节点包括属性和可能存在的子节点。
  • "display" 是节点的名称
  • attribute会创建属性:
    • "width"是属性名称
    • OFFSET(Display,width) 是一个宏,它创建一个属性访问的对象,在这里,我们通过width成员相对与Display的偏移来访问
    • INT 表示属性的基本类型位integer
    • 800 表示默认值
    • range(1,2000) 是对width值的一个约束,也就是说,该属性取值必须在1到2000之间
这个DOM的结构,可以通过xpath来访问。

DOM化的结构有很多有用的功能,如,完成代码的序列化。我们可以轻易的将Display对象序列化为xml对象。




奥运五环思维模式:IT问题解决的系统化方法 奥运五环标志是由国际奥委会前主席皮埃尔·德·顾拜旦所提出,其最初的设计理念在于五个环代表了五大洲的团结,其中每一个环的颜色分别代表了当时奥运赛场上各国选手所穿戴的服饰颜色。五环标志不仅是奥林匹克精神的象征,也代表了人类和谐共处、公平竞争的愿景。奥运五环思维模型是一种将问题分解为五个关键领域的创新思考模式。这五个领域分别为:目标设定、资源优化、效率提升、质量控制和团队合作。该模型鼓励从多个角度分析问题,从而达到全面深入理解的目的,并且促进解决方案的创造与实施。 阅读详情

相关推荐

fsQCA实战:从数据校准到结果解读的完整流程(附R代码示例)

本文提供了一份完整的模糊集定性比较分析(fsQCA)实战指南,详细阐述了从数据校准、必要条件分析、真值表构建到布尔最小化与结果解读的全流程。通过R语言代码示例,帮助研究者掌握如何将理论转化为可操作的分析步骤,并产出稳健的中间解,以揭示导致结果的复杂条件组合。

d6e7f8g9h的博客 1169

分享15个我总结的思维模型,程序员必读,受用终身

人们在围绕软件开发的讨论中,几乎不可避免会随口引用一两条原则。你可能听过人们说:“这行不通,因为‘X法则’!”。或者“你不知道‘Y原则’吗?”你是哪种类型的软件开发人员?有许多规律和原则可以引用,其中大部分都基于真理。然而,盲目地使用像上面这样的绝对陈述来应用它们肯定会导致自负和失败。本文列举了一些可以应用于软件开发的最流行的规律和原则。对于每条定律,我们将快速讨论其主要内容,然后探讨如何将其应用于软件开发(也许何时不应该)。

m0_71327177的博客 1729

基于NE555的触摸延时开关电路设计与实现

本文详细介绍了基于NE555芯片的触摸延时开关电路设计与实现方法。通过分析NE555的单稳态工作模式,结合定时电阻、电解电容等关键元件选型,提供了一套完整的电路搭建方案。文章还包含抗干扰设计、调试技巧及常见故障处理,帮助电子爱好者快速掌握触摸延时灯的制作要点。

weixin_29268267的博客 788

软件化思维

平面几何、解析几何的目的是计算,代数是计算,建立微积分的目的是计算。 计算机的发明,将数学计算变得简单。一切都可以用计算机进行计算,这就是“计算”思维。省略了人工的微分方程的简化和推导,你可以直接进行数字计算,而不用化简微分方程,或者,让计算机帮助你化简微分方程。 但是,这远远不够,图灵机的目的是让计算可以按事先规定的逻辑顺序执行下去,直到停机,或一直执行下去。这就是程序。程序由可执...

228

qPCR定量方法在肠道微生物特定种属定量应用

大家都知道肠道中有上千种细菌,肠道微生物可参与人体代谢,促进营养物质的消化吸收,肠道微生态均衡关系到身体健康,肠道微生态失衡可能会导致疾病产生。此外有文献指出肠道微生物可能与人体免疫及炎性反应等有关。目前也越来越多人关注到疾病与肠道微生物的关系,也做了很多研究及实验,一般高通量结果得到的是每个物种在样本中的相对百分含量,而不同微生物的绝对含量其实也对疾病有很重要的影响。在此分享几篇有采用qPCR方法研究疾病与肠道微生物关系的文章。 早在2013年Kim-Anne Lê1、Yan Li等人发表文章Alter

tinygene的博客 2143

ADS RFpro 射频阻抗仿真步骤

导入器件后,在库里面选取器件的对应模型,如图所示我们选取10pf 系统自带的村田模型。选取网络上的器件,拖入到下面component Models。导入成功后,截取需要仿真的区域(不截取仿真时间会非常长),可以生成对应如下原理图,通过原理图继续调整仿真。图上找到需要仿真链路上的网络,右键设置为信号。的叠层信息,按照PCB板厂提供信息填写完整。选择仿真的频率范围和频点数,生成如下图的RFPro仿真界。,然后再把GND也添加到下面。按图设置截取需要仿真的部分。添加成功后 网络就有了,15 双击run开始仿真。

m0_72954480的博客 3215

7种测试人的优秀思维!你都具备了吗?

愿你成为一名优秀的软件测试人

kami_ochin_akane的博客 1738

AutoJs调用DeepSeek大模型接口实战教程 AutoJs接入DeepSeek、 DeepSeek API调用 、 手机脚本接入大模型

通过这篇文章,我们用 AutoJs 成功接入了 DeepSeek Chat API。使用发送请求在 Header 里正确携带 API Key从里拿到最终返回结果这样一来,你就可以在 AutoJs 里实现一个智能助手脚本,甚至做更复杂的 AI 自动化工具。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 467

软件工程-软件开发的工程思维

软件工程之美 目录软件工程之美前言一、什么是软件工程?定义出现的背景软件工程核心知识与项目管理的区别软件工程的目标为什么需要软件工程如何做好软件工程:原则工程思维软件开发生命周期模型敏捷开发大厂都在用的敏捷方法下一步附1:书籍推荐附2:敏捷宣言遵循的原则 前言 极客时间《软件工程之美 - 宝玉》及 《知行合一:实现价值驱动的敏捷和精益开发》学习总结。 软件项目的开发其实是一个工程,整个开发过程是可以有效组织起来的;对于开发过程的各个阶段,已经有很多解决问题的最佳实践及方法来帮助我们高效完成任务;还可以借助

AaronZZH 的博客 4077

RK3399外设驱动之MIPI

RK3399外设驱动之MIPI 文章目录RK3399外设驱动之MIPIMIPI命令解析入口代码mipi显示配置实例rk3399mipi驱动rk mipi驱动注册过程rk32_mipi_dsi.c解析 内核版本 Linux4.4 平台 rk3399 作者 nineyole MIPI命令解析入口代码 MIPI的入口代码如下:kernel\drivers\video\rockchip\screen\lcd_mipi.c static int __init rk_mipi_screen_in

学无止境 2227

Spark Sql 连接mysql

转载请务必注明原创地址为:http://dongkelun.com/2018/03/21/sparkMysql/ 1、基本概念和用法(摘自spark官方文档中文版) Spark SQL 还有一个能够使用 JDBC 从其他数据库读取数据的数据源。当使用 JDBC 访问其它数据库时,应该首选 JdbcRDD。这是因为结果是以数据框(DataFrame)返回的,且这样 Spark SQL操作轻松或便......

主要分享大数据相关的知识,如Spark、Hudi 1万+

优秀软件工程师的工作思维

产品思维、技术思维和工程思维并非孤立存在,而是相互关联、相互促进的。产品思维为技术思维和工程思维提供了方向和目标;技术思维是产品实现的基础和保障;工程思维则通过流程管理和质量控制确保产品顺利交付。三者之间形成了一个闭环的反馈机制,共同推动产品的不断优化和迭代。作为一名优秀的软件工程师,应不断提升自己的综合能力,将产品思维、技术思维和工程思维融会贯通于实际工作中。只有这样,才能在激烈的市场竞争中脱颖而出,为公司创造更大的价值。

沛哥儿的专栏 1833

【C#程序员入门AI】必知的一些知识

2026年C#调用AI,核心就4个概念+3种方式4个概念:大模型(大脑)、嵌入(数字密码)、向量(载体)、Agent(超级助理)3种方式:云端API(快)、本地模型(隐私)、混合部署(最佳)不用怕复杂,跟着这个思路走,你就能从“AI小白”变成“C# AI开发能手”,把AI集成到你的.NET项目里,提升效率、创造价值!

人工智能AI技术 409

深入探讨<分析与综合>软件开发方法,理解和构建复杂系统的核心思维模式

深入探讨<分析与综合>软件开发方法,理解和构建复杂系统的核心思维模式。

lza_csdn2019的博客 1111

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

2017WOT全球软件开发技术峰会:面向数据的思维模式和R语言编程

跨界知识聚会系列文章,“知识是用来分享和传承的”,各种会议、论坛、沙龙都是分享知识的绝佳场所。我也有幸作为演讲嘉宾参加了一些国内的大型会议,向大家展示我所做的一些成果。从听众到演讲感觉是不一样的,把知识分享出来,你才能收获更多。 关于作者 张丹, 程序员R,Nodejs,Java weibo:@Conan_Z blog:http://bl...

fens的博客 418

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

转入OO思维模式 sunlazy(原作)

从以前ASP或者VB转来的程序员,肯定对于OO思维不太熟悉,做起项目来OO思想也是雷声大雨点小,心里上没有真正的适应过程。现在我就借花献佛,希望能对你有所帮助。      采用OO软体开发方法的过程中﹐许多人自然而然偏重于技术层面﹐例如﹐使用OO分解(object-oriented decomposition) 来进行模组化﹐运用继承功能来建立类别体系(class hierarchy) 等等。

cswcafe的专栏 1122

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

测试开发的思维模式:如何让你的测试更加全面有效

在软件开发过程中,测试是非常重要的一环。然而,有效的测试并不仅仅是执行一些预定的步骤,它需要一种特定的思维方式和策略。在本文中,我们将探讨如何通过采用适当的思维模式,让你的测试更加全面和有效。

主要分享测试的学习资源,帮助快速了解测试行业,帮助想转行、进阶、小白成长为高级测试工程师。 384

各行各业的思维模式

你为何总是焦虑,每天总是疲于应付干不完的工作?我觉得你是缺乏对自己本行业的深刻认知,成功不知为何成功,失败不知为何失败本文将尝试带领大家踏寻一下各个行业的底层思维模式ps:希望大家多留言,我们共同完成这篇文章文本格式# 一级行业## 二级行业### 思维模式标题### 描述### 提出时间,谁,有效性# IT 领域##软件开发### 安迪比尔定律### 行...

iCloudEnd的博客 536

掌握AI在软件开发中的应用:方法比工具更重要

必须清醒认识AI的能力边界。它们在文本处理和信息处理方面表现惊艳,但也存在明显局限——会产生幻觉、缺乏真正理解、没有实时知识。不过值得庆幸的是,像ChatGPT的联网功能和Cursor这类代码IDE,以及支持调用外部系统的MCP(模型上下文协议),正在针对性解决这些固有缺陷,为AI打开了解现实世界的窗口。

m0_65595995的博客 607

软件开发中的抓大放小vs极致细节思维

而反观支付宝替换Oracle数据库的事,他们处理的是金融相关的数据,也就是和钱相关的数据,比如给你少算一分钱,这不是一分钱的问题,而是信任的问题,一旦出问题公司可能就黄了,所以他们出问题的成本是非常高的。首先,我作为研发,大部分情况下的决策都是“不做”,因为做了会显著增加我的工作量,软件开发过程中也存在二八定律,80%的功能只占开发时间的20%,而剩余20%的功能需要额外投入80%工作量。这仿佛是个无解的哲学问题,下面我给出我对这个问题的答案,仅仅是一份我自己的观点,大家也可以在评论区探讨下。

xindoo 8180

转入OO思维模式

   从以前ASP或者VB转来的程序员,肯定对于OO思维不太熟悉,做起项目来OO思想也是雷声大雨点小,心里上没有真正的适应过程。现在我就借花献佛,希望能对你有所帮助。      采用OO软体开发方法的过程中﹐许多人自然而然偏重于技术层面﹐例如﹐使用OO分解(object-oriented decomposition) 来进行模组化﹐运用继承功能来建立类别体系(class hierarchy

麦田专栏 1135

软件开发教会了我什么?

软件开发中的很多思维模式是可以用来指导生活的,接触软件开发也有些年了。有两个思想对我的影响是比较大的,或者说这两个思想,在生活中思考的比较多。一个是分而治之,一个是迭代。谈谈这两个思想教会了我什么! 分而治之简单来说就是将一个复杂的大问题分解为多个小问题,然后将小问题一一解决,最后再将小问题的结果组合起来,大的问题自然就解决了。这种思想我们每天都在用,模块化设计就是典型的分而治之的具体实现。梦想...

Hello_JavaScript的博客 398

为什么软件开发周期总是预估的2~3倍?

1、软件开发的思维模式不能像数学一样简单的计算,软件开发过程没有公式可以套,不是按照一定的步骤就能得到想要的结果。4、项目负责人任务分配的时间不合理。有的任务分配时间过长,浪费了时间,有的任务分配时间过短,不够时间去完成。现实和理想总是有区别的,在软件开发过程中总会出现一些没有预想到的问题,而这就会使开发周期比预估的长。5、预估开发周期的时候没有考虑到一些特殊情况,比如遇到法定节假日放假等。3、需求理解有差异,用户表达的和程序员理解的不一样,出现偏差。2、开发环境与过程会极大的影响进度。

m0_58449239的博客 94

[ZT] 面向对象:转入OO思维模式

从以前ASP或者VB转来的程序员,肯定对于OO思维不太熟悉,做起项目来OO思想也是雷声大雨点小,心里上没有真正的适应过程。现在我就借花献佛,希望能对你有所帮助。 采用OO软体开发方法的过程中﹐许多人自然而然偏重于技术层面﹐例如﹐使用OO分解(object-oriented decomposition) 来进行模组化﹐运用继承功能来建立类别体系(class hierarchy) 等等。不过﹐偏好于技

nonocast 1198

从工作的维度思考快思考慢思考

快思考与慢思考两种不同的思维模式 快思考的运行是无意识且快速的,不怎么费脑力,没有感觉,完全处于自主控制状态,主要根据我们得记忆、经验、潜意识对问题快速判断。 慢思考将注意力转移到需要费脑力的大脑活动上来,例如复杂的运算,通常与行为、选择和专注等主观体验相关联。 面对一个问题时,我们的脑海中最先出现的想法来自于快思考,它在熟悉情境中采取的模式是精确的,所作出的短期预测是准确的,遇到挑战时做出的第一反应也是迅速且基本恰当的。然而,它存在成见,在很多特定的情况下,这一系统易犯系统性错误。 面对难题时

龙瑜的博客 1177

掘金者说-第4期-个人的经验

第一季-思想篇 第1期 个人性格 第2期 求知欲 第3期 人和领导力对拓展性的影响 第4期 个人的经验 第5期 可劲学开源佩格 第6期 反障碍 第7期 双活工程师 第8期 为圆满的人生作准备 第9期 时间管理 第10期 创作中 第11期 创作中 第12期 创作中   Hi,大家好!我是Lucky。   今天的掘金者说和你分享的这篇文章是:关于个人的经验。 先学一个单词:...

掘金者说 323
上一篇: ubuntu 12.04 64位设置兼容32位的实现
下一篇: webkit内核源代码导读1:前言及webcore最基本的类
漂流的代码
博客等级 码龄23年 188粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值