当前位置: 首页 > news >正文

程序中的得与失

  俗话说,舍得,有舍便有得,程序或许和世间万物一个样,讲究阴阳平衡。或许您写程序过程中,得到一颗歪脖树,却放弃了一大片大森林,能正确的取舍矛盾体双方的关系,或许是您扎实功底的体现,当然这必须需要一种日积月累的过程。下面我就说一些程序的矛盾体,起一个抛砖引玉的作用。

一、时间与空间

  程序中存储空间与时间,自古就是天敌一枚,自古就是有我没他,有他没我的局面。这对天敌关系处理,令无数英雄竞折腰。

  弄清楚他们之间关系,让我们从空间与时间观点,从辩证唯物主义思想来分析程序。

  我们知道一个程序分为几个层次,每个层次分为几个部分,部分之间有什么关系,每个部分都有什么特点。这是从空间的角度来划分程序;一个程序的表现在不断变化,结构在不断演变,有生老病死,这是从时间角度来考察程序。

  从空间来考虑程序,需要做好其架构,规划好其交互接口,要想好究竟是模块插拔还是总线组装,搞清楚用配置文件还是数据库。所谓用空间换时间,一个合理的空间结构,需要尽量降低时间点上的热度,包括开发上的时间热点和程序运行时的时间热点。

从时间角度考虑,就要想好程序的生命周期,程序各个部分给谁来开发,用什么开发,在什么时间点交付;程序如何部署,如何启动,如何更新,如何销毁,如何停止,如何删除;历史版本如何处理,未来的版本如何处理。一个合理的时间结构,需要仔细提供整体的开发和运行效率。

程序,正与上文提到的一样,我都习惯先从空间上划分一下,再从时间上观察一下。我想知道一个事物的组成结构,我想了解一个事物的历史渊源,现在以及将来。可惜,时而迷雾漫天,时而一叶障目,时而迷走方向,时而回环往复。

    程序中,我们经常看到了降低一个程序时间复杂度,往往是牺牲存储空间为代价,反之亦然,降低相应存储,往往就提升时间复杂度。

  说了这么多,总而言之一句话,往往是程序换空间,还是空间换时间。

二、(开发)效率与(开发)规范

  如上面一样,在加强开发规范的前提下,往往做出的牺牲是什么啊,是以降低开发效率做出牺牲。

  例如你加代码注释工程中,自己完成代码速度大大降低。但是,随着工作年份增加,我发现这是都么肤浅的认识,由于你没有好的代码规范,你的代码维护时间往往比当初开发时间  多上了好几倍了。由此可见,令人可喜,这对所谓的天敌,更多的是走向合作的步伐。 良好的开发规范反而能够促进开发效率的提高。

例如, 

 1.    写程序前打个草稿可以在心里,最好在纸上:目的要从整体上考虑程序的实现。 如果公司采用建模的方式,有建模工具(rose ,visio )那是最好不过的了。

2.   注意休息,不要浪费自已的休息时间,用去了自已的时间不但会写出的代码因为注意力不集中而会常常出现代码的质量有问题,逻辑常出错

3.   要善于收集相关的专业开发上的资料,以便以后能更快更好的解决问题目。提倡公司能提供内部知识勾通的工具(如知识论坛,内部即时聊天器);提倡公司内部有技术资料的共享库,提高解决问题的能力.    

4.   提高对所写的模块的相关全局把握能力,在写程序中要最好先详细设计后再发布.  

5.    要学会与他人沟通如非工程师,学会沟通的不同方式,提高沟通的效率。

  貌似这些支离破碎,婆婆妈妈的繁枝缛节行为会降低开发效率,实际上,这些动作是提高你工作效率有力保证。

三、功能与效率

  功能与效率更像印证了第一点了,功能越多,你程序效率貌似越低。不是吗,你写了一个简单计算器与一个复杂的计算器,运算复杂度是几何倍数增加的。

  由于我是android开发的,往往看到高手喜欢挑战,尤其在手机上实现精巧的算法,这样能带来更强的征服感。例如,有人曾在手机上实现了布隆过滤器(一个庞大精巧的类哈希表,多用于在服务器端如垃圾邮件查找),其内存消耗和计算复杂度都远远高于普通的HashMap,且实现并不容易。结果App发布之后,效率大大降低,cpu计算增多,耗能从而提高了。出现用户抱怨耗电量大,并且经常出现Bug,最后还是老老实实换成了HashMap。

  这正如一句古话:鱼,我所欲也,熊掌,亦我所欲也,二者不可得兼,舍鱼而取熊掌者也。

  以上的一些矛盾体,既能对立,也能合作。归根结底,就是为了做好好的程序服务的,只能真正做好的程序中的取舍,这样才能做好好的程序

相关文章:

  • nodejs中下载文件回调问题
  • 你所不知的SEO高级策略技巧
  • 利用枚举类型实现统计
  • Educational Codeforces Round 9
  • 游戏坦克大战 说明(待续。。。)
  • json.dumps loads 终于区分出来了
  • js自己初探究
  • 从Sql server 2008获取表字段属性信息,注释信息
  • 定制UITabBar显示样式
  • C实现的静态顺序表
  • 053(三十二)
  • cacti (不可以利用yum安装cacti的配置)
  • 判断一个字符串是否为另外一个字符串旋转之后的字符串。
  • Library ‘/system/lib/libhoudini.so’ not found
  • CentOS里设置JAVA_HOME
  • hexo+github搭建个人博客
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • CSS 专业技巧
  • echarts的各种常用效果展示
  • extract-text-webpack-plugin用法
  • input的行数自动增减
  • Java Agent 学习笔记
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Redis的resp协议
  • Service Worker
  • springMvc学习笔记(2)
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 阿里云Kubernetes容器服务上体验Knative
  • 观察者模式实现非直接耦合
  • 三分钟教你同步 Visual Studio Code 设置
  • 容器镜像
  • # 达梦数据库知识点
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (4)(4.6) Triducer
  • (42)STM32——LCD显示屏实验笔记
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二十四)Flask之flask-session组件
  • (分布式缓存)Redis持久化
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)EOS中账户、钱包和密钥的关系
  • (转)socket Aio demo
  • (转)项目管理杂谈-我所期望的新人
  • (转载)OpenStack Hacker养成指南
  • .form文件_一篇文章学会文件上传
  • .Mobi域名介绍
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET处理HTTP请求
  • .net通用权限框架B/S (三)--MODEL层(2)