在一次招聘人员的审批过程中,和分管领导的意见有些分歧,领导问了我一句——
“这个人有没有软件开发的思维?”
这对我来说是个触发点,有必要来思考自己从事多年的这项工作,到底需要什么样的思维。
2018年,软件危机和软件工程被提出来整整50年。
我是软件工程专业的,大学没有好好学习、理解它的真谛;希望在工作中弥补这个遗憾。
软件开发的历史
软件开发届的第一个程序员是谁?
阿达·洛芙莱斯(Ada Lovelace)
生于哪个年代?英国人。
十七世纪初。
性别是什么?
女。
美国国防部将耗费巨资,研发出高级程序语言命名为Ada语言纪念她。
奥古斯塔·阿达·金,勒芙蕾丝伯爵夫人(Augusta Ada King, Countess of Lovelace
1950年代,软件伴随着第一台电子计算机的问世诞生了,开始出现以写软件谋生的人。
1960年代美国大学里开始出现授予计算机专业的学位,教人们写软件。
1960年代中期软件开始作为一种产品被广泛使用,出现了“软件作坊”专职应别人的需求写软件。
1960年代中期软件的数量急剧膨胀,软件需求日趋复杂,维护的难度越来越大,开发成本令人吃惊地高,而失败的软件开发项目却屡见不鲜。“软件危机”((software crisis))就这样开始了
概括来说,软件危机包含两方面问题:一、如何开发软件,以满足不断增长,日趋复杂的需求;二、如何维护数量不断膨胀的软件产品。
软件危机一天都没有消除。
1968年秋季,NATO(北约)的科技委员会召集了近50名一流的编程人员、计算机科学家和工业界巨头,讨论和制定摆脱“软件危机”的对策。在那次会议上第一次提出了软件工程(software engineering)这个概念。
软件工程包括两方面内容:软件开发技术和软件项目管理。软件开发技术包括软件开发方法学、软件工具和软件工程环境。软件项目管理包括软件度量、项目估算、进度控制、人员组织、配置管理、项目计划等。
思维如何影响我们,例子:
一家大公司引进了一条肥皂生产线。这条生产线能将肥皂从原材料的加入直到包装装箱自动完成。 但是销售部门反映有的肥皂盒是空的,经理要求工程师们解决这个问题。于是成立一个以几名博士为核心、十几名研究生为骨干的团队。在耗费数十万后,工程师们在生产线上一套X光机和高分辨率监视器,当机器对X光图像进行识别后,一条机械臂会自动将空盒从生产线上拿走。 另外一家乡镇企业也遇到了同样的情况,管理生产线的小工找来一台电风扇,摆在生产线旁。装肥皂的盒子逐一在风扇前通过,只要有空盒子便会被吹离生产线,掉在箩筐里。 从拣空肥皂盒看,博士后和民工的区别 ,博士后研究技术有时连民工都不如!
当提起“软件开发”
大家会想到什么?
会提出什么问题?
做软件开发哪些因素最重要,是记忆力,还是思维逻辑,还是英文还是其他的?
要开发软件数学是不是必须好?软件开发与数学有什么关系?
应聘软件开发的工作,一般会问什么逻辑思维的问题?
我是学软件开发的但是逻辑思维特别差,我应该怎么办?
软件开发是一门科学,软件开发是一项工程
软件开发需要科学思维;需要工程思维。
今天我们主要探讨的是科学思维。
从“思维”两个字中,我们也可以领悟到一些东西,“思”即是思考,比较容易理解,关键在“维”字,“维”其实是角度的意思。
独立思考-》头脑风暴,发散思维-》收敛思维
1、“面向过程”(Procedure Oriented)思维
就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。它是面向功能的,其结构分析和结构设计技术是围绕着实现处理功能来构造系统的,而在系统维护、软件升级的过程中,用户的需求变化往往是针对系统功能的,所以,采用这种技术设计的系统是不稳定的,其可修改性和重用性都比较差的。
侧重点是流程,拆解,他是一种最最基本的思维方法。比如早上上班这个事情。
1)起床2)洗簌3)穿衣)4)乘车5)打卡,在软件开发中可以用函数的方法对表达出每个步骤,然后有序的串起来。
2、面向对象思维是从现实世界中客观存在的事物(即对象)出发来构造软件系统,侧重以事物为中心去思考,是把事物对象化。
具体的思维方法有抽象,封装,继承,多态。
在软件系统开发的过程中,结构分析和结构设计技术具有很多优点,但是也存在着许多难以克服的缺点。因为结构分析和结构设计技术是围绕着实现处理功能来构造系统的,而在系统维护、软件升级的过程中,用户的需求变化往往是针对系统功能的,所以,采用这种技术设计的系统是不稳定的,其可修改性和重用性都非常差。在这种情况下,面向对象的程序分析和设计技术产生了,它尽可能地模拟人类习惯的思维方式,使开发软件的方法和过程尽可能地接近人类认识世界、解决问题的方法与过程。采用面向对象的程序分析和设计技术开发的软件系统,稳定性、可重用性和可维护性都很好。
3、建模思维
用模型描述系统的因果关系或相互关系的过程都属于建模。建模就是一个实际系统模型化的过程。
现实的事物是变得越来越复杂了,太复杂了(我们无法掌握所有细节)也往往就很难直接理解和把握它了,于是我们就先建立它的模型,然后研究模型以代替直接研究事物本身,
所以这个模型也就不能太失真了,否则研究结果也就跟现实相距甚远了。我们也经常能见到各种模型,如城市模型,汽车模型,轮船模型等等,这些模型都是一些实物模型,
比较好理解,也比较好建立,我们姑且把它归为物理模型。还有一类模型就是逻辑模型或是抽象模型,
比如模拟一个城市的行政系统等,我们所说的领域建模也是建立一种逻辑模型,即对企业某一功能系统建立模型。
① 分析和设计实际系统。②预测或预报实际系统某些状态的未来发展趋势。③对系统实行最优控制。对于同一个实际系统,人们可以根据不同的用途和目的建立不同的模型。所建模型只是实际系统原型的简化,因此既不可能也没必要把实际系统的所有细节都列举出来。实际建模时,必须在模型的简化与分析结果的准确性之间作出适当的折中,这是建模遵循的一条原则。
4、框架思维
软件开发是一种知识活动,因此知识的聚集和积累是至关重要的。框架能够采用一种结构化的方式对某个特定的业务领域进行描述,也就是将这个领域相关的技术以代码、文档、模型等方式固化下来。
整体观要强,从多角度多层面把握系统的框架,所以说发散性思维的培养是非常重要的。
5、懒人思维
软件的目标,就是某些工作自动化,从而让某些人可以更懒。重复的事情一定不要自己手工重复完成,侧重于自动化。
思考如何把这些原来需要很麻烦的事情,自动化执行。
彩蛋
一个岔口分别通向诚实国和说谎国。来了两个人,已知一个是诚实国的,一个是说谎国的,诚实国永远说实话,说谎国永远说谎话(你不知道他们具体是来自哪国的),你现在要去说谎国,但不知道走哪条路,需要问这两个人,请问应该怎么问?
恩格斯说过“一个民族要想站在科学的最高峰,就一刻也不能没有理论思维的指导”,这句话对于我们的软件开发也是同样适应的,与君共勉。