




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
作为一个正在用C#和XML语言编程的技术文档工程师,我认为掌握计算机语言需要一些基本技能。毫无疑问,今天的计算机编程已经和以前大不相同,因此不管是正在学习新的编程语言来提高自己的程序员,还是正在钻研一两门已经有所了解的编程语言的程序员,以下这几点相信能够帮你翻越计算机编程这座山。第一,基本的逻辑技巧。最常见的基本逻辑形式和编程中的判定就是do-while和if-then-else。在这里,程序员需要考虑的是可能出现的哪几种可能的结果和出现这一结果时应该做什么。第二,自上而下的思维方法。总的来说,一个计算机系统是由不同的“子系统”组成的,因此程序员需要掌握一些设计技巧或者自上而下的思维方法,这样才能从整体上把握全局。我设计的模块或者子系统是不是让这个系统的性能得到最好的实现?就像经济学分为宏观经济学和微观经济学一样,编程也需要这样的思维。第三,面向对象语言的思维方法。可以说目前很多,甚至大多数语言都是面向对象的,这意味着你必须在继承性和多态性的框架下工作。通过选择正确的类、方法、属性等,恰当地利用计算机语言访问和继承,你就能提升程序性能。第四,关注细节。每一个计算机编程语言都有详细的引用和关键字类型规则,这些都必须掌握。在使用类或者方法的时候,必须正确使用代码和语法。第五,读编程手册。程序员常常和负责系统设计的架构师一起工作,因此必须在编程手册的指导下写代码。这是个有挑战性的工作,因为程序员必须一条条理解规范,写出的代码才能够遵照统一的参数,最终成功编译。第六,测试能力。大多数程序员仅仅把自己当成一个写代码的。好的程序员是一个软件公司的宝贵资产,他们能够测试写好的代码、保证不同的数据得到正确使用且代码无误。一些程序员认为测试的工作是由QA来做的,但有时候程序员能够将程序读得更深入,这样QA的测试工作就对整体程序的成功起到更关键的作用。第七,编写程序文档。和测试类似,很多程序员认为代码才是最关键的,但对一个公司来说,一个程序员能在代码旁添加恰当的注释以便后来的程序员参考,这一点很重要。新程序设计好以后,修改代码和模块的人能够看到之前都做了些什么。第八,好的商业意识。对程序员来说,将自己从代码中抽身出来,以整体的眼光看待问题有时很难。但这一点很重要。所有的编程最终都要服务于更大的目标,某种角度来说,程序是要走向用户和客户的。订阅一本关注所在行业的市场趋势杂志或者关注此类博客对程序员很有好处。第九,耐心。耐心并非技术技巧,但却能让程序员走的更远。写代码不容易,越是有耐心的程序员,越有可能获得成功。第十,坚持不懈。除了耐心,坚持不懈的能力和性格对程序员的成功也很重要。有时,在所有的bug和error都搞定之前,有很多很多的编译工作要做,请坚持到底,始终不懈地努力吧。高效编程的7个好习惯这七条都是我这个不怎么高效能编程的人悟到的. 不权威,不一定全对.1. 使用工具帮你找 Bug,而不是人工找.工具包括用单元测试,assert语句,代码测试容器. 人工指用 print 和 debugger 一行一行跟踪. 我们知道,编程中绝大部分时间是耗费在除 bug 上. 不同的人有不同的 debug 的方法. 我个人比较喜欢“极限编程(XP)” 学派的主义,也就是说,代码未动,测试先行.单元测试中的红棒绿棒(熟悉 JUnit 的读者知道我在说什么)一出现,哪里出了问题就一目了然. 单元测试的另外一个好处在于增加写程序的自信. 以前没用单元测试之前,每天晚上改代码改到很晚的时候脑子常常不灵活,把代码改错,然后第二天来还要重头弄. 有了单元测试之后每天晚上保证测试全部过掉,这样心理踏实,睡觉也香,早晨也不忙,吃饭也棒.一般的语言都有 assert,但是很少有人用. 其实 assert 是一个非常好的DEBUG 工具,C 的 assert 能够把哪一个文件哪一行出了错都告诉你. 不过我一般会自己写一个这样的 assert 宏:#define ASSERT(value,msg) if (!(value) fprinft(stderr,At file %s,line %d: n message: %sn,_FILE_,_LINE_,msg); exit(-1);这样的 ASSERT 可以带一个信息出来,比起原来只告诉你哪个文件哪一行更加有价值.第三个是用容器帮你找 Bug. 这一点以 C/C+ 程序最为突出,因为编译之后直接就是可执行代码,运行时的信息不像 Java 和 Python 这样有 VM 的语言容易得到. 这时候,我推荐 valgrind. 这个工具能够把 C/C+ 程序放到一个容器中执行,记下每一个内存访问. 被这样的容器 debug 一下,基本上指针指飞了 (Segmentation Fault) 的情况几乎就没有了. 想像一下是用 GDB 追踪非法指针和内存泄露方便,还是用容器告诉你哪一个指针非法,哪一个内存没释放方便 :)2. 选用自动化工具构建用 gcc 或者简单的 IDE 来编译和运行程序在编程初期是很快速的,可是越到后来,会越臃肿. 在编译的时候,不同的参数,不同的目标,在 IDE/gcc 里面每次都要设定. 而且一般的 IDE 也不能做到自动解决依赖等高级方法. 因此,最好的方法是用 Ant 或者 Makefile 管理项目. 这方面教程很多,而且我估计编程的个个都知道. 不管项目大小,注意频繁使用就是了.自动化测试也有很多工具,特别是 GUI 和命令行测试的自动化,工具链都很完整. 大公司里的程序员走这方面的流程都比较规范(我在西门子实习过),但是小一点的公司中,或者个人搞小项目的时候,就不一定想得起来了(大部分我见到的程序员就手工来测试). 手工测试看上去快,但是要是积累的次数多了就比较浪费时间了. 其实自动化测试工具的学习成本很低的,事半功倍.3. 买本小书做参考,而不是用 Google.这是大实话. 我大三开始学 Python 的时候,语言特性并不熟悉,手头也没有书,因此常常连取个随机数都要上 Google 查一下库. 我发现,不管网络多快,自己搜索技术多牛,还是没有手头一本书方便. 后来打印了一个7页的标准库的 cheatsheet,编程立即行云流水. 我在实习的时候也观察到,大部分时候程序员不可能记住一个框架所有的API,所以他们要不等 IDE 几秒钟做代码补全,要不一边翻文档一边做. 或许MSDN 这些本地文档系统比查书快吧,但是用 Google 和网络搜索绝对比书慢. 现在因为工作原因,常常要学一些新的语言,我做的第一件事情,就是把他的库接口的网页全部打印了下来.4. 用脚本语言开发原型人月神话的作者 Brooks 说: 准备把第一版扔掉,因为第一版必然要被扔掉. 这是大实话和真理. 既然第一版要被扔掉,咱们就让第一版扔掉得越早越好. 说白了就是,原型要快速的被开发.所谓的快速原型开发,大致有两个捷径,第一是只做核心的功能,输入输出都是构造好的简单的例子. 第二是只做最简单的情况,对于性能和健壮性什么的都不太考虑. 这两点,恰好是脚本语言最擅长的. 脚本语言擅长于用精简的几行构造出复杂的功能,并且语法很松散,潜在假设程序是正确的.即使在代码编写阶段,一些功能的实现,也是要先写个简单的,再慢慢打磨成复杂的. 脚本语言此时依然有用. 比如我在用 Java 的时候,常常不确定一个函数返回的对象究竟某个属性是什么样的值. 这时候我就会用 Java 的 bsh 脚本写一行打印,而不会写一个复杂的 out.println 再编译再运行再把那行删除掉. 当然,这几年很流行动态语言,原型和产品之间的差距已经变得很小了.5. 必要的时候,程序要使用清晰的,自我解释的文本文件作为日志输出.不知道各位调试程序的时候是不是和我一样,看到不确定的和要跟踪的变量就直接插入一行 print. 我以前一直这样做,但是频繁的插入这样的打印会使得屏幕的输出很乱,不知道哪行是什么意思. 一个更加好的办法是写一个日志函数,可以分也可以不分优先级,总之保证 Debug 的时候的输出以一种统一的,可管理的方式出现. 这样,在最后发布稳定版本的时候,只需要简单的几行命令就可以从代码中剔除所有的日志打印行.如果必然要输出日志,最好要分配一个单独的命令行参数,用来控制程序究竟输出不输出日志,输出哪些日志. 一开始看上去这个是费时费力,越到后来日志越多的时候,就体会到方便之处: 有时候你只想要某一类日志,可是其他的记录偏偏来捣乱. 多加一个参数可以使得程序更加灵活,根本不需要去修改代码或者条件编译就能得到不同级别的程序日志.日志和程序的输出结果一定要清晰且能自我解释,否则不如没有日志. 我切身经历是这样的: 几个月前,我一个程序跑了大约一天,最后输出了很大的日志和结果. 但是很不幸的是,结果里只有数字,没有任何说明. 我自己都忘了每一行是什么意思. 而且更加麻烦的是程序的输出藏在重重判断和循环之内,使得根本没有办法分析这一行输出对应的输入是什么. 于是,最终只能再次浪费一天的时间让程序再跑一次. 经过这次教训,我的程序日志和结果中插入了不少让人可读的内容. 这样,即使程序丢失了,结果还是能够被人解读的.更多的关于数据和程序结果要能自我解释的精彩论述,可参见 More Programming Pearls 第四章.6. 使用命令行小工具操控分析你的结果和代码,而不是用自己的眼睛和手.我发现,人有一个固有的习惯,就是喜欢自己去”人工”,而不喜欢用工具. 因为人工让人感觉工作更加刻苦,更加快,更加有控制感. 比如说吧,上面我说的测试,我就不只一次见到为了测一个交互式的命令行,一个程序员宁愿老是每次打相同的三个命令,而不愿意用一个简单的 expect. 再比如说,面对长长的日志文件,我见到很多人都是用文本编辑器直接打开,用鼠标滚轮一行一行的往下翻,而不是使用 grep. 包括看网页,很多人从来不用查找功能,而是一行一行的往下瞄. 包括打游戏也是,好的UI脚本(不是外挂)一大把,可是玩 WoW 的人很少用,都喜欢自己重复点鼠标.别看上面说的这些好像程序员没有,其实我们常常陷入这个误区. 举个简单的例子,一个 python 程序里面有十几个 print 函数,我们想把这些打印全部灭掉,一般人会打开文件慢慢瞄,稍微高级一点的用查找,找到了,用快捷键删掉整行. 其实最好的方法根本都不要编辑器,应该用 grep -v. 或者 sed,但是这样的方法极少会有人用的. 我也是强迫自己无穷多次之后,才渐渐的用这套快速的方法.7. 程序能跑就是万岁. 除非万不得已,尽量不要在性能上优化你的代码Knuth 名言: Premature optimization is the root of all evil. (提前优化是万恶之源). 一般我们写代码的时候,不知不觉的就会觉得,哎呀,这样写效率不高,我要构造一个数据结构啥啥. 随机访问一定要哈希表,排序一定上快排,查找一定要二分,强连通分量一定要用 Tarjan 算法,动规一定比穷举好等等,这些竞赛的时候极限情况下正确的论断其实在实际环境中并不重要,因为做编程的一开始关键是能跑,而不是跑得快. 往往这么以优化,程序很难 debug,倒是还要去翻算法导论和TAoCP 看人家的二分怎么写的等等.在程序能跑的情况下,优化也要特别小心. 我曾经有一个程序,大约有 90% 的运算是查表,只有 1% 的是乘法,另外是一些判断和把插到的结果插入到一个集合中. 我的查表是用的最土的 list.index. 按照正常的想法,应该把这个优化成哈希表. 而实际上我用 profile 工具一看,才知道,原来是插入到一个集合的操作费时间,因为每次都需要 extend,涉及到很多内存分配的操作. 我做过非常多的 profile 测试,没有一次不出乎我预料的. 程序运行时间总是在自己不认为浪费的地方被浪费掉. 因此,就算万不得已优化,也务必要先做一下 profiling. 我喜欢 python 的地方就在于,他的 profiling 只需要一行语句就完成了,而且结果具体干净. 其他的语言,至今没见到这么简单的 profiling 工具.致刚入门的程序员5点建议这是我为12月4日开始的“2008软件开发2.0技术大会”准备的讲稿。到了现场,我发现这个讲稿对现场近千人的技术高手不适合,只好临时讲了移动互联网的趋势。致刚入门的程序员五点建议每个IT企业,尤其是初创企业,非常苦恼:找不到好的程序员。现在大学、软件学院及各种培训机构,每年培养几十万的程序员,毕业的每个人都有同样困恼:找不到好的工作。问题出在哪里呢?其实,企业需要的是不是刚会写程序的人,需要来了就能干活的人,尤其能把活干好的人。而刚毕业的大学生多半刚学会如何写程序,的确很难企业需求。企业到底需要什么样的程序员,一个刚入门的程序员如何成为企业需要的高手呢?还有很多程序员问我,“我需要具备什么样的能力就可以去创业?”我一直在琢磨类似的问题。我自己写过十年程序,也在金山管理过一千多人的研发队伍,最近也在做天使投资,仔细总结了如下五点建议与所有程序员分享。建议一、只有真正喜欢才能写好程序喜欢写程序,做程序员就是上天堂;不喜欢写程序,做程序员就是下地狱。程序员需要整天趴在电脑前,经常没日没夜的,非常辛苦,而且工作来不得半点虚假,少写一个标点符号都不行。喜欢的人,日子过得非常开心,每写一行代码,都会有新的成就,尤其当自己的作品被广泛应用的时候,那种自豪感油然而起。不喜欢的人,坐在电脑前极端无聊,被进度压得喘不过气来,天天为找bug改bug生气。只有喜欢,只有热爱,才能把程序写好!我建议不喜欢写程序的人早点转行,不要勉强自己,免得误人误己。建议二、把程序当艺术品,象写诗一样来写代码现在很少有公司做 codeview (对写好的程序做代码级检查),于是很多人在进度的压力下潦草应付,只要测试通过就算搞定。表面上看,开发速度很快,进度有保障;但实际上,这样的程序连开发者自己都很难读懂,一旦有bug,很难调试,将来维护升级都非常困难。这样的代码多半只能重写,浪费自然严重。如果每个人写程序的时候当艺术品来写,写每行都认认真真、干干净净的,虽然速度略微慢了一点,但综合的开发成本会低很多。如何写象诗一样美的代码呢?方法也很简单。一、买几本经典的编程书,把书上所有例程全部重新写一遍,逐个比较和书上范例的差距,一步一步改善自己编程的风格和技巧。时间长了,自然就能写出象书上例程一样的代码,甚至可以比书上写得好。二、基础扎实后,多看看Linux 等系统级的源代码,看看高手是如何写的,就有感觉了。三、通读一下MSDN中所有的资料,这样,“读书破万卷,下笔如有神”。还有,一定要牢记软件工程的铁律:可能出错的地方一定会出错。每个变量都做初始化,引用每个参数都会做有效性检查,在可能出错的每个地方都会做边界条件检查,这样开发出来的程序一定会稳固很多,就是出错也会很容易修改。野路子出来的高手,一般开发速度很快,但做完后bug很多,经常需要很长时间修改。而真正的高手,追求的境界是 bugfree code(零缺陷代码)。建议三、必须写够十万行代码,不要心存侥幸程序员象木工一样,熟能生巧。程序员必须写足够代码量的程序,才会有感觉,这是一个苦力活,没有任何捷径可走。计算机是一门实践性的科学,没有动手能力做支撑,很难做出好的科研成果。我的一个学长是美国卡内基梅隆大学的博士,卡内基梅隆大学计算机系在全世界非常出名,他说每个博士生必须写十万行代码才能毕业,卡内基梅隆大学博士进任何一个大企业基本不用面试。而国内培养大部分的研究生、博士生,动手能力都偏弱。没有写过足够代码量的,想成为高手是不可能的,只能纸上谈兵!建议四、时刻保持好奇心计算机技术更新换代非常快,每年都有各种各样的新技术出现。在我过去的职业生涯中,仅编程语言,我就用过 basic, masm, pascal, c+, vba, Delphi, java 等。需要时刻保持好奇心,不断学习各种新的东西,才能在未来的几十年职业生涯中不落伍。你要理解为什么 iPhone 出来很多高手用iPhone,现在一天到晚惦记着换部 gPhone 玩玩。人的精力有效,高手往往工作压力也比较大,如何在有限的时间内掌握整个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版广东土地估价师协会职业培训服务合同
- 2025版数字媒体广告资源包租赁合同模板
- 二零二五年度信息技术培训与咨询服务协议
- 二零二五版房产收购项目合作续约合同样本
- 二零二五年度商业地产项目场地转租及投资回报协议
- 二零二五版建筑信息模型(BIM)技术应用合同意向书
- 2025版环保材料消费贷款担保合同
- 2025版城市综合体房地产评估报告合同
- 二零二五版德汉翻译及国际文化交流项目合同
- 二零二五家政洗衣店市场拓展合作协议
- GB/T 748-2005抗硫酸盐硅酸盐水泥
- GB 15763.1-2001建筑用安全玻璃防火玻璃
- 走好群众路线-做好群众工作(黄相怀)课件
- 民间文学(全套课件)
- 专升本00465心理卫生与心理辅导历年试题题库(考试必备)
- 既有重载铁路无缝线路改造及运维技术探索
- 2022年教师副高职称评答辩范文(七篇)
- 高压罗茨风机选型参数表
- 金融控股公司协同模式与实务分析
- 2021-2022年湖南省长沙市第一中学高一(上)入学考试物理试题(解析版)
- 轴类零件的设计ppt课件
评论
0/150
提交评论