浅析软件开发的3个层次
早上在微博上看到郭安定老师的微博,我在微博上也改了下发了一条,萌生写这篇文章。
已故的中国社会学家费孝通认为文化应包含三个层次:第一个层次是生产、生活的工具,国家社会用什么样的器物、工具来生产、生活。比如中国人用筷子、西方人用刀叉、印度人用手抓,所用的器物不一样。这当然也包括国家打仗时用什么,用洋枪大炮、还是用大刀长矛?这是器物层次;第二是组织层次,按照费先生的定义,包括这个社会里面怎么把人组织起来,让单独的个人能够结合在一起、在一个社会里面共同生活以及他们之间怎样行动,他包含很多内容,比如政治组织、宗教组织、生产组织、国家机器等等;此外还包含一个价值观的层次,人怎么想,什么可以接受?什么不可以接受?什么好?什么不好?好坏之间,各个社会的价值观念、行为选择标准不一样。三个层次不可分割,是一个有机整体。
个人认为,目前一个成熟的面向企业应用的软件开发组织,如果想很好的完成一个系统,必须包含以下几项要素:1、项目管理;2、软件工程;3、合理的编程语言和框架。而一个IT人才要想在此行业有所发展,则需要反向发展,由编程语言学起,直到可以对一个大型项目进行项目管理。
一、编程语言和框架
经常听到这样的说法,学习编程担心最后都变成了编码工人,学习C#担心C# 只是能做个网站,不想一辈子编码,在简历中写精通.NET,熟练各种框架等等。编程语言和框架只是我们我们编程的基础,属于第一个层次的生产工具。
语言就是把我们的想法让计算机理解,让计算机按照我们的想法完成一些功能,具体功能如何实现还是需要我们告诉的,实际上还是我们的解决方案。可能就是我们所说的编程思想和业务领域的解决方案吧。另外一种语言是要解决很多领域的问题的,尤其是C#、C、C++这些语言,因为要解决很多问题,所以他的语法、类库可能会很多,而在开发你的某个系统的时候可能仅仅用到其中的很少一部分,另外可能不如一些专门的语言解决的好。
框架是为工程提供一些公用的功能或者模块,本身并没有简化应用的复杂性,反而是增加了应用的复杂性,只是大部分的复杂工作由系统完成了,留给开发人员的内容可能不复杂了。这些框架通常都是在解决了很多同类的问题之后提出的,并不是适合所有情况。我们要用某个框架的时候,我们的思路必须和她一致,受框架的约束,而在完成一些简单应用并且后期发生变化很小的时候没有必要使用框架,可能最简单的解决方案就是最好的。另外当项目中的功能比较复杂的时候,框架并不能帮上忙,有时候还会帮倒忙,因为框架提供的毕竟是最常用的通用的功能,不一定能够满足我们特定的要求。
语言是工具,在开发的时候应该选择一个好工具,但是最重要的是你要有解决问题的思路,你要能够灵活运行语言这个工具来表示的你的思想。框架能够提供在多数时候能提高效率,但是仍然要选择好框架,更重要的时候你要有组织项目的能力,这个能力应该是完成很多实际项目之后才能有的。如果只是停留于这一个层次,你就会纠结于.net /c#版本。举个例子,同样是使用.net下的web开发,有asp.net mvc,asp.net webform, nancyfx 等等,大部分的人还在纠结于用那个框架。
二、软件工程
在这里谈谈以面向对象为指导思想的软件工程。面向对的软件工程采用用例来捕获需求,采用OOA来进行系统分析,采用OOD来进行系统设计,采用面向对象的语言进行开发。OOA的过程中,要懂得使用分析模式,而OOD的过程中要懂的设计模式。在不断的项目经验积累中灵活的运用这些知识,最终达到运用自如的境界。在工作中见过不少人拿着面向对象的语言却是在使用着面向过程的编程,很多会使用c# 语言的同仁都在做着这样的事情。
三、项目管理
项目管理的好坏在很大程度上左右的项目的成功与否。没有很好的项目管理,会导致项目出现很多状况,下面举几个例子:
1、沟通不足:程序员的沟通能力普遍偏低。在自己老板和客户的双重压力下,很多必要的沟通都不能及时进行,以至于在项目进行中总是出现各种不愉快的事情。
2、责任不明确:当项目出现延期或其他状况时,应该由谁负责呢?这是个十分重要的问题。但项目管理没有做好的话,责任就变得模糊不清。例如测试问题,用户只期盼结果,但殊不知这个结果必须由他们仔细验收才行。在沟通不足的情况下,如果不能很好的要求用户配合测试,结果可想而知。程序员催着用户赶快测试,而用户却推脱没有时间的情况比比皆是。
3、进度难以控制:面对需求的不断变更,程序员的懒惰,技术难题甚至各种人员的离职,你是否已经做好了各种应对准备?如果没有很好的进度管理,这些都会使你手忙脚乱,痛苦不堪。最重要的是,最终无法达成交期,造成项目失败。
一名程序员只有从掌握编程语言做起,一步一个脚印才能做到项目经理这个位置。我的理解,经理以行政手段管理项目经理,项目经理以项目管理的手段管理项目(包括项目团队成员),分析师与架构师用软件工程的方法进行分析与设计,程序师用健壮优秀的语言并按照设计文档编写代码。这构成一个项目开发的层次关系。
- 听说GAN很高大上,其实就这么简单
- python3 解码base64遇到的问题与解决
- TensorFlow从0到1 - 16 - L2正则化对抗“过拟合”
- 使用虚拟环境,搭建python3+scrapy
- Matplotlib基础全攻略
- Python 小爬虫 - 爬取今日头条街拍美女图
- python3使用zookeeper和私钥解密及编码转化配置信息
- Python中os.path.dirname(__file__)的用法
- TensorFlow从0到1 - 18 - TensorFlow 1.3.0安装手记
- Python + Splinter 实现浏览器自动化操作入门指南
- 动态地理信息可视化——leaflet在线地图简介
- python中的递归函数
- 对抗思想与强化学习的碰撞-SeqGAN模型原理和代码解析
- 玩转数据地图系列之——地图上的迷你条形图
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Glide-图片加载框架全解(一)- 基本用法
- Python全栈(六)项目前导之1.Redis介绍及数据类型介绍
- 网络请求框架OkHttp3全解系列(一):OkHttp的基本使用
- 网络请求框架OkHttp3全解系列 - (二)OkHttp的工作流程分析
- 这次,我把Android事件分发机制翻了个遍
- 网络请求框架OkHttp3全解系列 - (三)拦截器详解1:重试重定向、桥、缓存(重点)
- Python全栈(七)Flask框架之4.Flask模板继承与案例练习
- 你想要的系列:网络请求框架OkHttp3全解系列 - (四)拦截器详解2:连接、请求服务(重点)
- 不会玩阴阳师的我带你一键下载《阴阳师:百闻牌》所有卡牌并调用百度OCR识别文字信息
- 微信小程序生命周期学习笔记-页面篇
- Python 字典 使用技巧
- 微信小程序生命周期学习笔记-组件
- C语言入门系列之2.数据类型、运算符和表达式
- 树莓派的cpu与gpu通信设计浅析
- Python全栈(七)Flask框架之5.视图高级--类视图和蓝图