阅读更多

1顶
0踩

研发管理

转载新闻 写好软件的诀窍

2013-05-07 09:54 by 副主编 WnouM 评论(4) 有9469人浏览
程序员身上的一个好笑的事情是,我们在毕生的职业生涯中都相信:我们的工作是告诉计算机如何去做。

真实情况

真实情况是,计算机能正确的按照命令去运行。无论你写的是“Hello World”,还是用无人飞机去杀死一个人。计算机都能精确的按照你的命令去做。

可我们的工作,我们的真正工作是:告诉程序员和我们自己:我们让计算机做什么了。现代的软件编程思想就是结构化的、清楚的描述计算机将要执行的任务。

事实上,计算机并不去阅读你在程序里写了什么,而人会。计算机把程序员写的代码编译成字节比特,真正会去看你写的是什么的只有人类。

写软件要像讲故事

如果你对你的工作和你写的代码的行为有了新的认识,你会马上很清楚的发现,编程工作更像讲故事。

想一想。你是如何知道一个人讲故事没人爱听的?这很简单,他老跑题,他老是纠结在不重要的细节上,他老是在故事场景中挑来跳去,等等。你立刻能知道故事被他讲烂了。

虽然在最后你能明白故事里发生了什么,你甚至能复述它,但你会喜欢这样的故事吗?你会有兴趣转述给别人或丰富故事内容吗?

相同的事情也发生在软件开发中。如果你的代码写的含糊不清,乱七八糟,没有人会愿意欣赏它。没有人会愿意看它第二次。并且你是第一个受它折磨的人。

诀窍

那么,现在你想要知道这个简单的秘诀,不是吗?下面就是:

代码里的干扰因素越少越好

注意,我不是在讨论明晰的代码vs隐晦的代码,不是在讨论约定优先,不是在讨论元数据编程有害或其它类似的东西。

写出好的软件的诀窍是代码里只写那些能让你的代码讲出的故事更有意义的内容。如果它能让你的代码更清楚,那就这样写它。如果这个东西对故事没有任何意义,那就扔了它。扔了它能让故事更好。如果代码耦合模块不清,就用元数据编程和约定。

例子

有一些经典的例子可以证明这一点。比如,描述一篇帖子和它的作者的关系。

class Post < ActiveRecord::Base
 belongs_to :author, class_name: 'User', foreign_key: :authored_by
end


看见了没?所有关于类名,外键的信息都是干扰。去掉它们。

class Post < ActiveRecord::Base
 belongs_to :user
end


第二版中没有好听的“作者”字眼,但却是更优的,因为它直奔主题,用最简短的语句告诉所有你想知道的。

另外一个例子,说一个类需要关联那些创建/修改它的信息的用户:

class Setting < ActiveRecord::Base
  belongs_to :creator
  belongs_to :editor

  attr_accessor :editing_user

  before_create :set_creator
  before_update :set_editor

private

  def set_creator
    self.creator = @editing_user
  end

  def set_editor
    self.editor = @editing_user
  end

end


干扰,所有的这些回调和attr_acessors都是干扰,都是垃圾信息,没有任何价值体现在你想完成的任务中。更简洁更好的方法是下面这样写:

class Setting < ActiveRecord::Base
  belongs_to :creator
  belongs_to :editor

  def editing_user=(user)
    if new_record?
      self.creator = user
    else
      self.editor = user
    end
  end
end


你可以看到它精炼的告诉了我们发生了什么。这段代码说,这个类有一个记录创建者,一个编辑者,我们用editing_user赋给它们值。没有回调干扰。没有几个private方法的无用信息。

一个更经典的例子,在controller里管理数据:

class PostsController < ApplicationController
  def create
    if params[:post][:text].present?
      if params[:post][:text] =~ /fuc k|cock|shi t/
        flash[:error] = "Be nice"
        @achtung = true
      end
    end

    if !@achtung
      @post = Post.new(params[:post])

      if @post.save
        flash[:success] = "Yoo hoo!"
        redirect_to :index
      else
        render :new
      end
    else
      redirect_to :index
    end
  end
end


所有的这些条件逻辑跟你的controller实际上没有任何关系。所有的这些逻辑判断并不属于controller层负责。当然,你可以这样做,而其能正常的运行,但这不是好的软件。

试试这样写:

class PostsController < ApplicationController
  def create
    @post = Post.new(params[:post])

    if @post.save
      flash[:success] = "Yoo hoo!"
      redirect_to :index
    else
      render :new
    end
  end
end

class Post < ActiveRecord::Base
  validate :bad_language_check

private

  def bad_language_check
    if text =~ /fuc k|shi t|cock/
      errors.add(:text, "has some pretty bad language")
    end
  end
end


现在你的controller能清楚的说明白发生了什么。你可以清楚的看明白当记录可以创建和不能创建时会发生什么。跟Post类一样,你可以清楚的理解它在过滤那些不干净的文字。而且校验器有自己单独的地方。它的实现方式不会影响Post本身。

结论

其实很简单。想写出好的软件吗?别再给机器写代码,从此后为人写代码。

就这么简单。

英文原文:The Trick To Good Software / 译:外刊IT评论
来自: 外刊IT评论
1
0
评论 共 4 条 请登录后发表评论
4 楼 dohkoos 2013-08-10 11:04
非常好的几个例子
3 楼 夜神月 2013-05-08 12:37
影响软件质量的因素主要还是看软件管理方面
2 楼 diggywang 2013-05-07 20:09
freezingsky 写道
我觉得前提是,完整而清晰的需求是一切软件的基础!再好的软件架构也顶不住层出不穷的奇怪需求。

这只是程序员的乌托邦,现实中不可能存在。否则也不会有那么多软件开发模型了,只要一个线性模型就行了。
1 楼 freezingsky 2013-05-07 13:40
我觉得前提是,完整而清晰的需求是一切软件的基础!再好的软件架构也顶不住层出不穷的奇怪需求。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 作为程序员写好软件的诀窍

    作为程序员写好软件的诀窍。程序员身上的一个好笑的事情是,我们在毕生的职业生涯中都相信:我们的工作是告诉计算机如何去做。真实情况  程序员身上的一个好笑的事情是,我们在毕生的职业生涯中都相信:我们的工作...

  • 软件架构设计说明书该怎么写?

    如果你无从下手,这里有个小窍门可以利用, 找一个出现率很高的业务,在该业务处理前尽可能多的记录一些可能与该业务相关的数据状态,待业务处理完成后,再次记录,并与之前的数据进行比较, 那些发生了变化的往往...

  • 软件测试工程师如何写好一个BUG报告?

    为什么是好的Bug报告? 如果您的错误报告是有效的,那么它得到修复的机会就会更高。因此,修复bug取决于您如何有效地报告它。报告错误只是一种技能,我将解释如何实现这一技能。 “编写问题报告(bug报告...一个好的软件

  • 怎样才能写好软件

    无论你写的是“Hello World”,还是用无人飞机去杀死一个人。计算机都能精确的按照你的命令去做。 可我们的工作,我们的真正工作是:告诉程序员和我们自己:我们让计算机做什么了。现代的软件编程思想就是结构化的...

  • 如何写好一个BUG报告?

    为什么是好的Bug报告? 如果您的错误报告是有效的,那么它得到修复的机会就会更高。因此,修复bug取决于您如何有效地报告它。报告错误只是一种技能,我将解释如何实现这一技能。 “编写问题报告(bug报告)的目的是...

  • 台达EH ES EV SV等系列PLC解密软件

    可以区分大小写,可以勾选不同的字符,这样解密速度就快多了,一般字母与数字组合的几小时搞定。 4、最近增加了直读功能,当然只能直读早期的老版本PLC,最新版本的只能穷举。 使用窍门:此次升级重点是支持485通讯...

  • 好的软件架构设计

    什么是软件架构 前言:软体设计师中有一些技术水平较高、经验较为丰富的人,他们需要承担软件系统的架构设计,也就是需要设计系统的元件如何划分、元件之间如何发生相互作用,以及系统中逻辑的、物理的、系统的...

  • 湖南软件工程自考本科总结

    湖南软件工程自考

  • mcu比较器技巧和诀窍_软件开发技巧和窍门

    mcu比较器技巧和诀窍 这些只是我想分享的职业生涯中的一些技巧和窍门。 此列表不包含银弹,也不假装是完整的或绝对的。 这只是一个列表,希望对某人有所帮助。 1)将编码推到最后 这一点也可以理解为编码前的思考...

  • 什么是软件测试工程师

    软件测试工程师(Software Testing Engineer)指理解产品的功能要求,并对其进行测试,检查软件有没有缺陷(Bug),测试软件是否具有稳定性(Robustness)、安全性、易操作性等性能,写出相应的测试规范和测试用例...

  • 写给程序员的软件测试指南:人人都可以开发无Bug代码

    一年之后,还是端午节,两位译者一起为不一样风格的软件测试译著《程序开发人员测试指南:构建高质量的软件》(后简称《程序开发人员测试指南》)写序,依旧充满诗意,享受着成功的喜悦,并郑重推荐本书...

  • 通过隐喻更充分地理解软件开发

    然而随着时间的推移,与那些不善于运用隐喻的人相比,人们普遍认为,那些使用隐喻来指明软件开发过程的人明显更能理解编程并能更快地写出更好的代码; 3、常见的软件隐喻 软件中的“书法”:编写代码 关于软件开发,...

  • 如何写出好的产品帮助文档?

    早前我也这么认为,究其原因,一则自己不喜欢也不擅长写文档,代码是给机器读的,只要语法和逻辑没问题,计算机就会听命执行,而文档是写给人看的,除了语法和逻辑,好文档还要照顾读者的心理;二则传统软件的客户对...

  • 软件架构设计

    什么是软件架构前言:软体设计师中有一些技术水平较高、经验较为丰富的人,他们需要承担软件系统的架构设计,也就是需要设计系统的元件如何划分、元件之间如何发生相互作用,以及系统中逻辑的、物理的、系统的重要...

  • 基于Qt开发的截图工具- 支持全屏截图, 支持自定义截图,支持捕获窗口截图,支持固定大小窗口截图,颜色拾取,图片编辑

    基于Qt开发的截图工具.zip 截图工具(QScreenShot) Qt编写的一款截图工具。 特点 - 支持全屏截图 - 支持自定义截图 - 支持捕获窗口截图 - 支持固定大小窗口截图 - 颜色拾取 - 图片编辑 - 图片上传到wordpress 环境 Qt6.2 QtCreate 8

  • 毕业设计&课设_ 校园活动管理系统,优化校园活动组织流程,涵盖多方面功能模块的便捷平台.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

  • 毕业设计基于ASP.NET技术的班级展示网站构建(源代码+论文).zip

    基于ASP.NET技术的班级展示网站构建资源,是一套针对教育机构或学生团体,旨在通过ASP.NET框架开发班级风采展示平台的指导资料或教程。此资源详细介绍了如何利用ASP.NET的强大功能,快速搭建一个功能完善、界面友好的在线班级展示平台。 该资源涵盖了从需求分析、数据库设计、前端页面制作到后端逻辑实现的全过程。通过实例演示,指导用户如何设置班级信息、学生风采展示、活动公告、图片上传与浏览等核心功能模块。同时,结合ASP.NET的MVC架构,实现了前后端分离,提高了代码的可维护性和可扩展性。 此外,该资源还提供了丰富的代码示例和注释,帮助开发者深入理解ASP.NET框架的工作原理,掌握如何运用其强大的数据库操作、用户认证与授权等特性。对于初学者来说,这是一份难得的入门教程;而对于有一定经验的开发者,则是一份提升技能的参考资料。 总之,基于ASP.NET技术的班级展示网站构建资源,是教育机构和学生团体实现班级风采在线展示的理想选择,也是开发者学习ASP.NET框架应用的宝贵资源。

  • 基于springboot的流浪动物管理系统源码数据库文档.zip

    基于springboot的流浪动物管理系统源码数据库文档.zip

Global site tag (gtag.js) - Google Analytics