`
tibaloga
  • 浏览: 879021 次
文章分类
社区版块
存档分类
最新评论

效颦篇:编程本质论

 
阅读更多

效颦篇:编程本质论<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

猛禽[Mental Studio](个人专栏)

http://mental.mentsu.com

先有leezy_2000兄的大作《编程本质论》,接着是johnnyxia兄的《也谈编程本质》,在CSDN上引发了一场关于编程本质问题的热烈讨论。当时我也在QQ上和FrameSniper兄就这个问题聊了几句,当时就想写这么一篇效颦文章来凑个热闹,只是因为没想到那篇BCBX的文章写了这么久,加上过了个年,于是耽搁了,现在过了两三个月了,再来旧话重提,恐有马后炮的嫌疑。

“效颦”的典故出自《庄子·天运》,曰:故西施病心而颦其里,其里之丑人见之而美之,归亦捧心而颦其里。其里之富人见之,坚闭门而不出;贫人见之,挈妻子而去之走。彼知颦美而不知颦之所以美。

正如我对FS兄所说的观点:虽然我们在软件业摸爬滚打了这么些年头,但软件的本质对于我们来说,与盲人面前的大象没有区别。每个人看到的都是其中很小的一个方面,所有说出来的看法都是片面的,我也不例外。然而每个人将自已从不同角度得到的看法说出来,也许就能让我们对软件的本质有更全面的了解。这就是我为什么明知是在“效颦”而仍要为之的原因之一(另一个原因当然是因为我也是“不知颦之所以美”)。

在研究“编程本质”前,当然首先要研究一下什么是“本质”,金山词霸对“本质”一词的解释有三个:

1、 事物中常在的不变的形体

2、 事物的根本性质

3、 哲学名词。某类事物区别于其它事物的基本特质

首先,软件应该说是没有什么具体的形体的,至于哲学,太高深了,非我辈所能妄言,所以我想研究的是:什么是“编程的根本性质”?

然后再来看看“编程”是一个什么概念?顾名思义,所谓“编程”就是编写程序,就是Coding,然而这只是一个狭义的概念。按照program一词的正式解释是:设计、编写、测试程序。也就是Development,即“开发”。

现在可以明确所谓“编程本质”就是“软件开发的根本性质”。

leezy_2000兄认为编程有四大要素:问题、概念、逻辑和技巧,并且认为其本质为:概念和逻辑。

johnnyxia兄则认为编程的本质是Thinking in Programming Language

此外在两篇文章的评论中还有很多其它的观点,有些还非常的独特,比如itpunk兄的:“编程的本质就是出卖劳动力换取一日三餐。”(窃以为“出卖劳动力”不太准确,所有的工作都是如此,不独编程,换成“出卖代码”会更好些),这里不一一列举(BTW:我认为看CSDN上的文章,最好把所有评论看完,因为这对文章最好的补充)。

我的观点是,他们说的都是正确的,但这不能算是“软件开发的根本性质”。

先来看leezy_2000兄的观点:首先这种划分四大要素的分法就非常的主观,因为每个人从不同的角度来看,都可能有不同的分法。比如三个要素:问题,解题思路(借用toomore兄的说法)及实现----个人更倾向于这种看法。或者还有人能分出五个要素来。既然它不是不变的,又谈何“根本性质”?

另外,所谓“要素”即“必要的元素”,意味着它们中的任何一项都是不可或缺的,如果硬要说其中包含着所谓的“本质”,那么所有的部分都是同等重要的,这个“本质”必须包含所有的要素,何故厚此薄彼?

leezy_2000兄强调概念和逻辑是基于软件的质量属性:健壮性、可重用性、易扩充性、容错性(其实这就是健壮性)而言的。而事实上软件的质量属性远不止这几个,按《软件需求》第11章中的说法可以分成两类:对用户最重要的属性和对开发者最重要的属性。而这两类分别包括:有效性,高效性,灵活性,完整性,互操作性,可靠性,健壮性,可用性(以上为用户方面),可维护性,可移植性,可重用性,可测试性(以上为开发者方面)。而且就这些属性来说,很多也是互相制约的,只能是根据实际情况取舍,并非如leezy_2000兄所言的,只要对“逻辑进行提炼和精化”就能达到。

至于软件可以用硬件替代,不过是证明软件中包含逻辑,并不能证明逻辑就是软件的本质,而且还恰恰证否了这一点:套用前面的哲学说法来说,它们就不能算是软件“区别于其它事务的基本特质”了。

不可否认现在重视工具与技巧有些过度,沉迷于技术细节固然不是一种好的做法,在这一点上,我很支持leezy_2000兄对林锐的书的看法,正如《老子·五十七章》所说:“人多技巧,奇物滋起”。但我还是支持cppTrier兄的观点:不可矫枉过正(虽然leezy_2000兄在文中提到这不是他的目的,但事实上他的文章却得到这样的效果),相当部分的初学者其实都很盲目,很容易从一个极端走向另一个极端。技巧仍然是一个必不可少的要素。而且从某种角度上说,即使是像模式之类的也是一种技巧。

johnnyxia兄和cppTrier兄的观点比较一致,也很有道理,而且从狭义上说,Thinking in Programming Language就是Coding的本质(考虑到概念的完整性,这个Programming Language其实还应该包括Platform,在具体开发时,即使同样是用C++语言,面对WindowsLinux下不同的API,这个Thinking多少也是有些不同的),所有Coding的过程都有这个“根本性质”,因为Coding一定是在一个确定的平台下用一种确定的开发语言来进行,“语言磨砺了我们思维的方式,也决定了我们思考的范围。”大师就是大师。

然而对于“软件开发”来说,这个“本质”还是不够根本。拿现在异军突起的MDA来说,MDA提出了PIMPlatform Independent Model)和PSM(Platform Specific Model)的概念,将设计过程分为两个阶段。Thinking in Programming Language只是PSM阶段的工作,至于PIM阶段,则是一个更高层次的抽象。所以说Tinking in Programming Language也不能说是“软件开发的根本性质”。

不过我非常赞成CodingDesign的观点,MDAPSM即证明了这一点,设计PSM的过程其实就是对Coding的改进,在PSM的代码自动生成技术实现后,PSM就成为软件的实现阶段了。Coding也是软件开发的重要组成部分,鄙视Coding的所谓项目经理才是最应该被鄙视的。

那么什么才是“软件开发的根本性质”?我来说说我的看法吧(奏乐),软件开发的根本性质就是:通过Coding解决问题!(怎么都晕倒了?)

废话,这的确是一句废话。因为这是谁都知道的事。

然而这也是一句实话,真理有时候就是这么朴素。

首先,有软件就有Code,即使是MDA被完美地实现了,PSM可以直接生成代码了,也还可以认为PSM是一种图形化的Code,就如同工业上PLC所用的编程语言----梯形图,就是一种典型的图形化Code

其次,软件的目的就是解决问题,不能解决问题的软件根本就是废物。

前面说过,我们都是在盲人摸象,然而摸不出象并不表示象就不存在。对于软件开发的问题,在具体的观点上,各人有各人的看法,但仍然还是存在普遍真理的,这就是邓公的经典论断“不管黑猫白猫,抓得到老鼠就是好猫”,不论是什么软件理论或技术,只要是对解决问题有益的,就是好东东。

所以不论是概念逻辑分析,还是Thinking in Programming Language,只要有助于你的软件开发工作,那你就应该采纳。从解决问题的角度上说,所以用于解决问题的方法都可以看作技巧,不论是Coding的技巧,还是设计模式,OOUML……对于解决不同的问题,它们肯定会有不同的侧重,没有哪个是绝对的重要,还是应该以一种平等的观点来看待这些要素的。过于强调其中的某些方面实在有误导之嫌,必然导致别人陷入像pbzjh兄那样的困境。正如toomore兄所言:手中有了一把榔头,看什么都是钉子,这样的人还是很多,片面地强调某些方面则必然导致他们放下这把榔头,拿起的不过是另一把榔头。所以我认为还是应该强调它们的重要性是同等的,要根据实际情况处理,如toomore兄所说(BTWtoomore兄的例子都很经典啊):“我记得中央体育台的中国象棋节目的张强大师有一次讲到,高手下棋从来是根据具体的局面情况来制订策略,而许多低手下棋总喜欢把棋走成某几种固定的形状而不顾具体局势如何。”

基于解决问题这一个目的,对于软件公司的招聘要求也就好理解了,因为他们要的是能够为他们解决具体问题的人,而不是一些只会空谈的人。我们做技术的常常容易犯自以为是的毛病(我也一样),总认为那些开公司的什么都不懂,其实不懂的恰恰是我们,因为经营公司与开发软件是完全不同的两回事。作为公司来说,特别是目前国内的这些小软件公司,最重要的是以最快的速度开发出为用户解决问题的软件,不管你有多么强的逻辑分析能力,如果没有实用的技巧,它是不可能等你去慢慢学习的。至于大公司,如微软之类,它有足够的资源去培养人才,所以它对技巧并不重视。打个简单比方:一个普通的镖局招人,肯定是要有一定外家功夫的人,至于像段誉未学六脉神剑时那样,即使他有很强的内功,镖局也不会要的,因为不能打;但对于大的武林门派来说,要收门徒的话,却一般会挑选有潜质的人,而不在乎他能不能打。(BTW:就像从来没有哪个镖局能发展成为知名武林门派一样,我感觉国内现有的软件公司也不太可能在有限的时间里发展成为国际知名软件公司)

如果一定要在软件开发的过程中找一个重点的话,我认为是“问题”。只有在正确地定义了问题以后,后面的解决思路和实现才有意义,如果是对一个问题作了错误的定义,即使后面提出了正确的解决思路和实现,那也是对错误问题的解决。这也许就是为什么Karl.E.Weigers凭一本不到200页的薄薄小书《软件需求》而获JOLT大奖的原因。

我本来就是个狂妄的人,所以也就没有什么假装谦虚的客套话,大家有板砖就尽管扔过来吧。^_^

[Mental Studio]猛禽

2004-2-15

分享到:
评论

相关推荐

    DOS下的中文README制作软件CTXT2EXE

    最早的中文TXT2EXE类软件,开发人名刘灯,当时时年15岁。其后的效颦者多如牛毛。 只支持BIG5码。

    protobuf-3.15.7-cp38-cp38-macosx_10_9_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于STM32微控制器的简单超声波液位控制器

    基于STM32微控制器的简单超声波液位控制器

    widgetsnbextension-4.0.1.tar.gz

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    pyzmq-18.0.2-cp35-cp35m-manylinux1_i686.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    名字➕身份证二要素.py

    名字➕身份证二要素.py

    源代码-NameCMS七风格单页米表程序源码 v1.31.zip

    源代码-NameCMS七风格单页米表程序源码 v1.31.zip

    小程序版基于python深度学习训练香蕉成熟度识别-含图片数据集.zip

    本代码是基于python pytorch环境安装的。 下载本代码后,有个环境安装的requirement.txt文本,环境需要自行配置。 或可直接参考下面博文进行环境安装。 https://blog.csdn.net/no_work/article/details/139707566 代码不会运行的也可按上面这个博客来运行。 安装好环境之后, 代码需要依次运行 01数据集文本生成制作.py 02深度学习模型训练.py 和03pyqt_ui界面.py 数据集介绍,下载本资源后,界面如下: 数据集文件夹存放了本次识别的各个类别图片。 本代码对数据集进行了预处理,包括通过在较短边增加灰边,使得图片变为正方形(如果图片原本就是正方形则不会增加灰边),和旋转角度,来扩增增强数据集, 运行01数据集文本制作.py文件,会就读取数据集下每个类别文件中的图片路径和对应的标签 运行02深度学习模型训练.py就会将txt文本中记录的训练集和验证集进行读取训练,训练好后会保存模型在本地 训练完成之后会有log日志保存本地,里面记录了每个epoch的验证集损失值和准确率。 运行03flask_服务端.py就可

    protobuf-3.10.0-cp37-cp37m-win_amd64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    pyzmq-18.1.1-cp35-cp35m-manylinux1_i686.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    protobuf-3.19.2-cp38-cp38-macosx_10_9_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    简历精美模板酷黑炫彩.zip

    在求职的征途上,一份出色的简历是你通往梦想职位的敲门砖。我们精心准备了一系列面试求职简历模板,旨在帮助你以最佳形象站在潜在雇主面前。这些简历模板不仅设计精美,而且注重内容的清晰呈现,使招聘经理一目了然地看到你的能力和经验。 我们的模板集合了多种风格与布局,无论你是应届毕业生、职场跳槽者还是行业专家,都能在这里找到适合你职业形象的简历设计。每一个模板都经过精心设计,确保你的简历在众多求职者中脱颖而出,同时保持足够的专业度和可读性。 不仅如此,我们的简历模板易于编辑,你可以根据具体职位需求快速调整内容,展现你的个人优势和职业成就。使用这些模板,将大大提高你的面试机会,并帮助你更好地表达自己的价值和潜力。 别让传统且缺乏创意的简历阻碍你迈向成功的道路。立即下载这些精美的简历模板,让你的求职之路更加顺畅,向心仪的工作迈进吧!记住,一个良好的开始是成功的一半,而一份精致的简历,正是你成功的起点。

    简历模板简洁风简历模板简洁风个人简洁简历模板 (个人简历模板文档).zip

    在竞争激烈的职场中,一份专业且引人注目的简历是你通往梦想工作的黄金钥匙。我们特别为你呈现精选的面试求职简历模板,每一款都设计独特、格式清晰,帮助你在众多候选人中脱颖而出。 这些简历模板采用多种风格与布局,无论是创新、传统还是现代简约,都能满足不同行业与职位的需求。它们不只拥有吸引人的外表,更重要的是其实用性强,使得招聘经理能一眼捕捉到你的核心竞争力与职业亮点。 模板的易编辑性让你能快速个性化地调整内容,针对性地展现你的才华和经验。使用这些模板,你将更容易获得面试机会,并有效地向雇主展示你的潜力和价值。 不要让平凡无奇的简历阻挡你的职场前进之路。立即下载这些令人眼前一亮的简历模板,开启你的职场新旅程。记住,美好的第一印象是成功的开始,而一份精心制作的简历,就是你赢得梦想工作的第一块敲门砖。

    protobuf-3.15.5-cp36-cp36m-manylinux1_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于SpringMVC和Vue校园订餐系统(移动端+PC端+server端源码+SQL脚本+环境安装部署运行讲解)

    服务宗旨:有任何问题私信我 适合人群:工作中项目需要、模板框架实战学习、大学毕业设计参考、找工作项目实战积累等等

    06-11-科文22软件1-mybatis动态sql.wmv

    06-11-科文22软件1-mybatis动态sql.wmv

    Xilinx FPGA应用开发(第2版)源码.doc

    **学习Verilog的作用包括硬件设计与建模、提高设计效率与方便验证、数字电路与FPGA开发、提升职业竞争力等**。具体如下: 1. **硬件设计与建模** - **多层次建模**:Verilog能够对从开关级到算法级的不同抽象层次进行建模,使得设计师可以在不同的层次上描述和设计复杂的数字系统Θic-1Θ。 - **语法简洁高效**:Verilog继承了C语言的多种操作符和结构,相比其他硬件描述语言如VHDL,其语法更为简洁,容易上手Θic-1Θ。 2. **提高设计效率** - **简化代码编写**:Verilog的语法简单,代码易于编写和理解,这有助于减少编程错误并加快开发过程Θic-1Θ。 - **快速原型验证**:通过Verilog仿真器,设计师可以迅速验证数字模型的正确性,从而确保设计的合理性和可行性Θic-1Θ。 3. **数字电路与FPGA开发** - **数字电路设计**:Verilog是用于数字电路设计的主要语言之一,能够帮助设计师实现各种复杂的数字电路功能,例如计数器和时序电路Θic-1ΘΘic-4Θ。 - **FPGA应用*

    源代码-MiniAccess Editor_Access SQL脚本编写器.zip

    源代码-MiniAccess Editor_Access SQL脚本编写器.zip

    时尚个性四页简洁干练简历模板精美个人简历模板.zip

    在竞争激烈的职场中,一份专业且引人注目的简历是你通往梦想工作的黄金钥匙。我们特别为你呈现精选的面试求职简历模板,每一款都设计独特、格式清晰,帮助你在众多候选人中脱颖而出。 这些简历模板采用多种风格与布局,无论是创新、传统还是现代简约,都能满足不同行业与职位的需求。它们不只拥有吸引人的外表,更重要的是其实用性强,使得招聘经理能一眼捕捉到你的核心竞争力与职业亮点。 模板的易编辑性让你能快速个性化地调整内容,针对性地展现你的才华和经验。使用这些模板,你将更容易获得面试机会,并有效地向雇主展示你的潜力和价值。 不要让平凡无奇的简历阻挡你的职场前进之路。立即下载这些令人眼前一亮的简历模板,开启你的职场新旅程。记住,美好的第一印象是成功的开始,而一份精心制作的简历,就是你赢得梦想工作的第一块敲门砖。

    C++面向对象程序设计教程课程设计-学生信息/成绩管理系统-代码部分

    能够实现如下功能:(与博主的报告所论述内容相对应) 1、建立学生信息数据,包括学号、姓名、性别、三科成绩、出生时间、年龄(必须计算得到)。 2、使用继承的方法构造至少3个类,(即学生类—虚基类,一年级学生和二年级学生类—派生类)使用相应的对象放置10个学生信息。 3、编写同名display()成员函数,用来输出数组的内容。 4、按不同类别输出学生信息,比如按性别。(可选功能) 5、抽取并计算学生的平均成绩。 6、按照至少一科成绩进行排序。 7、检索(查找)指定信息。(如按姓名检索、按年龄检索) 8、显示成绩分布的柱状图。

Global site tag (gtag.js) - Google Analytics