如何避免进退唯谷
来源:互联网 发布:js创建对象的几种方式 编辑:程序博客网 时间:2024/06/05 07:44
设计多数情况是选优,也就是说,大多数时候,在工作中,与学习和考试时不同,不是找不到解决的办法,而是可以选择的方法和方案太多。
所以,有人说,设计就是选优。
我们编程时候,选优如果纯靠经验,是很累人的,所以,这里,我总结一些基本原则,以示备忘:
1。 可调试和可测试,永远排在第一和第二。
在完成一个工作的过程中,甚至工作没有开始前,心中面的困难,压得你喘不过气来的时候,也就是说,你要重新审视一下你的策略 :
到底是什么让你觉得你心中没有底?
而真正的答案,往往是你没有想过在完成编码后,如何调试和验证。
特别是,当前的任务,是以往没有从事过,或是上次做过,但觉得过于复杂,以至于头痛的程度。
特别是统计性的工作,需要通过大量数据进行处理,而你现在没有这些数据,甚至需求指向的,是本次新加入的数据。
这种对面空虚的感觉是很糟糕的,足以使一个坚强的人失去前进的信心。
这时,不要冒进,重新审视眼前的几个方案,问自己,哪个方案,更容易验证,调试与测试,哪一个方案,可以把复杂的工作,分解成小的步骤,并且每一步都可以依赖工具,提前验证,甚至手工做出假数据,并且看到结果。
2。准备,再准备。
准备什么呢?主要是文档。把当前需求相关的信息,进行详细的整理。
因为,一旦开工,你往往处于高度紧张的状态,不要相信你在工作中的状态会好到哪去,平常简单的问题,当你开始连续工作时,当前面对数十个问题时,你解决每个问题的能力,被大大稀释了,所以,准备工作,至关重要。特别是文档。
同样,当你干不下去时,也要回头看文档。
3。 强制打断自己的工作。不断地。控制节奏,张弛有度。
在电脑上装个软件,我装了个眼睛护士,每小时,强制休息一下,虽然看起来进度受到影响,但减去少犯的错误,还是上算得多。对身体也好。有人说为什么你不能打断程序员。当然有理,但长远来看,每小时停10分钟是合理的。如果一个工作,超过这个时长,你应当先在纸上画好再编程。
4. 第一“遍”最重要
这里的“遍”是编译器程序的一个概念。编译器是最重要的人机交互程序。是把接所人类能懂的、仿自然语言的、半机器语言,转成纯机器语言,的一种程序。
编译器相当复杂,众所周知,一般的编译器程序,有前端和后端,编译器的前端,面对的是人类,为了把人类的主观意识去除,并且告知人类哪些地方写得它不懂,
有人发明的一个概念,或者说方法,就是“遍”。
意思是说,象过筛子:虽然,我们想要得到的是最细的沙子,但如果一开始就用最细的筛子去筛沙子,筛子眼就被堵住了。
所以,先用大眼的,把大石头去除,然后用中号的,再用小号的。
GCC的前端好象就是三遍。
不过,我放在这里写这个事情,的确有自己的看法。编译器之所以引入“遍”,的确是由于它有一定的特殊性,一方面,它面对的是人,如果在很底层发现了错误,它很可能不清楚如何把这个错误以人类可以理解的话告知人类。这是一个根本点。
另外,编译器它所处理的生存环境是相当恶劣的。因为往往第一版编译器出现时,操作系统还指望等编译器出来改进呢。内存小得可怜,而如果被编译的代码,有糟糕的错误,前端一开始就把内存用光了,所以,编译器的程序,不得不层层防御。用于VC6的人,都知道,它不允许一行超过1K。而VC6所带的编译器,相对于更早的编译器,生存环境要好得多了。
说得有些跑题了。我说这么多,就是为了表达一个意思:遍是好东西,但如果你用到了,永远要记住,第一遍是最重要的!!!因为我们不是在写编译器,更不差内存。
许许多多程序员,在解析输入信息时,txt,excel,等等,根本不太乎,反正想着,后面的处理过程,会解决的。
可是,第一遍的粗放,只会给你带来无尽的灾难!
比如,前段时间,我接的一个程序中,为了从excel中直接把数据导入数据库,原作者把所有的字段就char[]作为数据类型,又没有做足够的有效性检查,给后期的维护带来的很大的负而影响。
因为,等你发现数据有错误时,时间已过去很久了,难道你还要找到用户,请他更正吗?数据的兼容性,足以使一个大的项目轻易崩溃:因为项目经理最后发现,维护数据占用的人力,越来越多,无法收敛——那就等着完蛋吧。
所以,虽然,第一条,我说的是,任务要分解。不过有个条件,就是每一步的输出,都是可以独立调试验证测试的。因为,这是下一步的输入,在一个“遍”里能解决的,一定要在当前步聚解决。比如,导入excel 数据,那么,就一定要确保用户的输入是完全正确的,不正确,就要提示用户修正,坚定不移地要求用户成为我们体系的一部分,不要导入数据库以后再由后续的“遍"来解决。用字符串表示整型,再加上没有检查,用户就可以非数字的信息写在那一列,这些信息,因为没有检查,就可以进入数据库。
总之,每一“遍”要有明确的功能定义,和输入输出规则,然后才能称之为“遍”。否则,那必是灾难的开始,扯皮的开始。如果不能定义,我个人的看法是,永远也不要引入遍的概念:或者可以说:一遍就解决问题。
- 如何避免进退唯谷
- 如何避免并发冲突!
- 如何避免买到黑手机
- 如何避免下拉框被摭
- 如何避免被狗狗咬伤
- 如何避免面试失败
- 如何避免面试失败
- 如何避免遗漏bug
- 如何避免遗漏bug
- 如何避免遗漏bug
- 如何避免遗漏bug
- 如何避免 feature creep
- 如何避免僵死进程。
- 海归如何避免水土不服?
- 如何避免jsf ViewExpiredException
- 如何避免重复提交
- 如何避免Exception
- 如何避免愚见
- 微信机器人:小蜗牛有道翻译小助手——Django + SAE + 微信公众帐号自动回复开放接口
- java synchronized详解
- setup中设置8259A
- Jetspeed2 将文件数据初始化到数据库的实现方法
- Spring 文件上传
- 如何避免进退唯谷
- 黑马学习笔记——public void Delete<T>(List<T> EntityList) where T : class, new() 的用法
- 颜色篇
- ogg 双向复制和ddl复制
- Delphi异常处理与调试
- 可重入和不可重入
- 面试题44:扑克牌的顺子
- lighttpd + ruby 迁移 nginx 日志(nginx 提供cgi支持)
- java学习2