㈠ 为什么有的程序员的代码结构混乱
程序员都有一颗工程师的心,所以当他们到一片新的场地想做的第一件事就是,将旧的一切推倒重来。是的,他们决不会满足于简单的增量劳动。
或许这种微妙的心理定位可以解释:为什么程序员进入新项目组后宁愿丢掉旧代码重新写,也不愿意修修补补。他们认为旧代码简直一团糟。
但是,事实上真是这样吗?你之所以认为旧代码一团糟,其实是由编程的一个基本定律决定的,那就是:写代码容易,读代码难。
为什么你觉得旧代码异常混乱?因为读代码更难。
这大概就是代码Reuse难以实现的原因。 这就是你组里的每个人都喜欢用不同的功能将分割的字符串转换成一个数组。比起猜测旧的功能是怎样实现的,重新写一个自己的功能要简单和有趣多了。
作为这个公理的推论,你可以问问身边的程序员他们正在奋战的代码怎么样?“简直是一塌糊涂!”他们肯定会这样说。“我简直想推倒重来!”
为什么认为代码这么糟糕呢?“额,看看这个功能,竟然有两页长!完全不知道这些东西为什么在这里!完全不知道这些API是干什么的。”他们会这样回答你。
漫画:读别人代码是一种怎样的体验?
曾经,Borland的创始人 Philippe Kahn当初就是向记者们吹嘘:Quattro Pro会比Microsoft Excel要好用得多,因为它是从头开始编写的,全部都是新的源代码!
但是,认为新代码比旧代码好简直就是荒谬。旧代码是已经运行过的,测试过的。无数的bug在被发现前都上线运行过,发现之后程序员们可能在花了好些日子才修复了这些bug。这种修复可能是一行代码,也可能是几个字符,无数的时间和精力都花在了这些bug修复上。
当你决定抛弃这些旧代码从零开始的时候,你也丢掉全部前任努力的结果。
新代码一定比旧代买好?NO,重写可能会带来更大的风险。
对技术领导者来说,重写项目的代码也是一个异常艰难的决定。因为从公司层面说,重现代码甚至会威胁产品的市场竞争力。一旦决定重写代码,那么与竞品相比,你可能落后了2~3年——在软件行业,这时间可够长的。
你理想中的新代码会带来产品功能的提升▼
但事实上,即便重写的新代码可以实现旧代码的所有功能和需求,但是为产品带来的市场竞争力只有边际提升。因为重写用的新技术、新语言、新框架并没有给产品带来质的飞跃。
更不用说在重写的漫长过程中可能会遇到一些意外情况,比如:
1、缺钱:资金链的断裂▼
2、缺人:核心程序员离职
最终导致效果不佳:达不到原产品应有的所有功能和需求,白白浪费了时间和金钱,也丢掉了市场竞争力。▼
所以重写代码意味着,你在把自己置身于非常危险的境地,可能几年后你也写不出比以前更好的代码。你只是花了一大笔钱把已经存在的代码又写了一遍。
当你觉得眼前的旧代码很烂时,该怎么办?
你觉得旧代码写的很烂,那又怎样呢?它们已经上线,已经在实际运行中经受住了考验。所以当你发现前任留下的代码乱七八糟的时候,不妨冷静下来,从以下三个方面入手理解代码、改善代码:
1、代码的结构有问题
如果一段网络代码突然弹出了自己的对话框,应该是UI代码需要被处理。这些问题可以被解决掉,你要一次次小心地移动代码,重构,改变接口。还需要一位细心的工程师立马仔细地检查这些改变是否有问题,从而不打扰到其他人。事实上,甚至比较大的结构变化也可以不扔掉代码来完成。
大牛程序员Joel Spolsky回忆说,曾经在某个项目中,他和他的团队花了好几个月重新架构在一点上:把代码动来动去、清理、创建有意义的基类,并创建了模块之间的完美接口。但是他们始终非常小心翼翼,并没有产生新的bug、也没有丢掉任何旧代码。
2、代码的效率不高
曾经,Netscape的渲染代码被传非常缓慢。但事实上,这只会影响该项目的一小部分,这部分是你可以优化甚至重写的。你完全不必重写全部代码。优化速度的1%工作量,会让你获得99%的爆炸性提高。
3、代码写得很丑
有些代码真的写的很丑,比如Joel曾参与一个项目,开始用下划线做开始的成员变量约定,但后来改用更标准的“M_”。所以一半的功能用“_”开始,一半用“M”开始,这看起来真的很丑陋。但这个问题5分钟就能解决,而不用从头开始写全部的代码。
最后,你要记住,从头开始再写一遍并不意味着你会写出比以前更好的代码。因为你没有参与到上一个版本的创建,所以你其实根本就不算有经验。一旦你准备推倒重写,你可能会再犯一遍版本一犯过的错,甚至会产生更多的新问题。
一个总结:
面对糟糕的旧代码,Keep Calm & Carry On !
在大型商业项目中,推倒重来是非常危险的行为。当然,如果你是在做实验,想到新算法可以随时重写。
㈡ 作为一个程序员需要学多少技能
作为一个程序员到底要学多少技能呢?我看了好多的资料大概的总结了几点:
1、学好"物理" 基础算法和数据结构。是计算机世界的基本定律,是程序问题的终极答案。
2、学好“化学” 各类系统和语言的关键性质,提供能写出优秀程序的原料。
3、学好“生物” 不同的技术构成不同的生态系统,不同的生态系统有不同的规则。程序符合生态系统环境,才能长成参天大树。
4、学好“历史” 技术从哪里来,要到哪里去。
5、学好“文学” 写明白文档,表达好逻辑,起得好名字,用得好隐喻。
6、学好“建筑” 钢铁,水泥,脚手架,防灾,抗压,无单点,架构是系统的核心。
7、学好“艺术” 写程序对得起自己的眼睛,做产品对得起用户。
8、学好“经济” 成本、收益和时间帮助你做编程时的主要决策。
责任就是程序员们的方向,经验就是资深程序员的资本。把及其复杂是的事情简单做,就是专家;把简单的事情重复做,就是行家;把重复的事情用心做,就是赢家。
㈢ 如何成为一个牛逼的程序员
如果要想成为一个厉害的程序员,涉及到的方面比较多。
首先要了解计算机的组成原理、结构体系,还要熟练掌握多种编程语言,以及常见的算法。
还需要熟悉各种软件知识:网络、图形图像、数据结构、编译原理等
同时熟悉相关的专业知识,这个得看所在行业了。如在电力行业的软件需要对电力调度、保护设备等了如指掌。
这些,需要投入大量的时间进行学习。需要毅力才可以实现,不是说说就行的。
㈣ 按时是什么意思用造句
'“按时”是指依照约定或规定的时间去做事情,与“准时”含义相同。.
1、你务必要按时到达那里。
2、你必须按时到达那里。
3、如果你不能按时到达,应该预先通知他们。
4、让我们替孩子们穿衣服吧,否则我们决不会按时到达。
5、达到你的潜力并不是按照计划在你的所要做的事情清单上按时地划掉每一项。
6、所以一定要按时做该做的事情。
7、他想要按时工作,所以他把需要做到的都写下来:起床、淋浴、更衣、准备早餐、吃饭、开车上班、停车和买咖啡——所有的这些都要在早晨9点之前完成。
8、按时参加会议和约会也是信守承诺,如果你在参加宴会时迟到了,要打个电话告知,不辜负自己的任务和责任。
9、在某些情况下,可能需要向构建构件应用紧急修补程序,以便能继续进行测试或保证按时投入生产环境。
10、我的父母甚至还为我支付了四年的房租,而我所要做的就是按时毕业而已。
11、我们明天能按时去那儿。
12、但是,我仍然在寻求更好的方法来运作项目,以及按时和在预算内交付可靠和可伸缩的应用程序。
13、当然你必须按时的加点肉,水果,面包;但是有了水和蔬菜你已经有了至少一半。
14、这条定律说的是一个任务将按时展开并且它看起来的复杂度取决于你为他预留的时间。
15、在业务领域,轻量级开发让您可以按时完工,积极响应客户,从而节省时间和金钱。
16、这些团队想要作出杰出的工作并开发高质量的软件,按时并按合约的规定来完成项目。
17、然而,程序员肯定总在回答同样空泛的问题,而人们也在问:为什么软件很少按时并在预算内交付。
18、拥有任务的详细步骤不仅有助于确保正确和按时地完成任务,而且还有助于让那些工作人员暂时替代其他人员。
19、虽然无力偿还的消费信贷已经备受关注了,但是,消费者并非唯一无法按时还贷的人群。
20、这让一切都发生了改变。鲍勃该接管该部门,那个部门能按时完成的项目不多。
21、你已经把一切计划安排妥当,也分派了小任务,整个项目应当可以顺利地按时完成。
22、但发卡商可通过新的或有良好信用记录的客户弥补丧失的收益,其中包括三分之一通常都按时还款的持卡人.
23、我们的主要聚焦点是使重要的代码按时完成。
24、许多人都说他们的学业被找工作影响,而21%的人发现他们一直在玩命以便能按时完成他们的工作。
25、首先,如果他们正在抄袭一家网站,他们就有见不得光的想法而且很可能你将因此不能得到按时发放的或全部的薪水。
㈤ 程序员为什么是吃青春饭,而不是像医生律师一样越老越值钱
程序员也是越老越吃香,问题是大多聘不起和工资吸引力不够了。中国程序没几年,很多工作10年后就有500万以上资产了,靠程序理财和偶尔接外快轻松年入50万以上,一些创业元老级更是手握亿元资产靠分红理财就能年入千万。所以很多企业工资对程序员没吸引力了,加上孩子需要陪伴之类,程序员选择退休。财富自由后每天在家陪孩子,偶尔做做外快,和对象秀恩爱享受生活,工作还有什么吸引力?顺便说一下,程序员财富自由不是中国个例。美国前几个月因为有一个上古程序,因为年轻的会的人太少发愁,有些老人去帮忙~都看不上人家的钱了。
程序员一般消费欲望也低。像明星,漏税9亿的还要赚钱,因为闹离婚手里剩几百万的就喊生活拮据的,因为消费欲望高。程序员大多出身理工科,消费欲望只比普通人高一些,不会名牌包,化妆品等买上一堆当摆设,互相攀比也没娱乐圈严重,所以不工作后收入完全能满足他们的消费欲望。
㈥ java应该注意什么,经常编码错误在哪
如果你用ide例如Eclipse来开发,如果你的代码不符合java语法和逻辑的话,它会提示你错误的。如果你的代码可以正常通过Ide的检测,那就只剩下运行时异常了,例如NullpointerException啊什么的。
㈦ 青蛙扒了皮还会跳,程序员呢
hacker 们天性上是反对独裁的. 任何一个给你命令的人就能给你一个独裁式的工作,并且可以给你一些笨的可以的理由, 停止你解决任何吸引着你的问题. 所以任何独裁式的行为都会被挑战, 以免会危害到你和其它的 hacker 们.
Hacker 们(有创造力的人也是一样)永远不该做一些无聊而单调并且愚蠢的反复性工作. 因为, 如果这样的事情发生的话, 这表示他们正在做一些不是他们该做的事-- 解决新的问题. 这样的浪费对任何人而言都是一种伤害. 无聊单调的工作不只是无趣而己, 而且是一种有害的物质.
要做为一位 hacker 要能尽可能的自动避免无聊, 对此你必须有相当的认知. 这不只是为了你自己而已, 也是为了所有的人(尤其是其它的 hacker).
(这有一些例外. 有时侯 hacker 们会去做一些被认为无聊或重复性的工作, 当做脑力的训练, 或是为了要学习得某种技能或某种你所没有的特殊经验. 不过这是一种选择, 任何人都不该被强迫面对无聊事. )
作为一个 hacker 是充满快乐的, 但这是一种因为努力得到成果所带来的快乐. 努力的成果则带来动机. 成功的运动家的动机则来自于, 使他们的身体不断进化,并把自己推向物理上的极限所带来的快乐. 类似的情形, 要成为 hacker, 你必须要能从解决问题, 精进技术, 和运用知识的过程中感受到一种悸动.
如果你不是天生就能感受到这种悸动的人, 那么, 为了要成为 hacker, 你必须使自己变成这样的人. 否则, 你会发现你的 hacking energy 就会像性, 金钱, 和社交活动一样, 因为分心而被消磨掉.
(你也必须为你的学习能力建立一种信念直到你完成你的工作 -- 即使你只处理一小部份, 而你也不知道你到底还要学些什么东西才有辨法解决你的问题, 但是你会努力学习, 准备充足, 以应付下一个问题.)
㈧ 一个程序员所要经历的步骤
程序员应具备的12种能力
毕业四年来,感觉自己也是从一名不合格的程序员一步步走过来的。回头反思一下,合格的程序员有很多标准和要求,下面是我总结的一个合格程序员应该具备的12种能力。中国软件行业的崛起,靠的是合格的程序员。任何华丽的管理制度都不能保证软件项目的成功交付,合格的程序员就是有力的保证,是项目成功的基础。写下这些,是为了给刚刚进入程序员这个职业的新同学们一点参考。我一直以为,当程序员是很辛苦的,如果不是真正的喜欢,很难坚持下去。如果真的不喜欢这个职业,也该尊重这个职业,尊重自己,赶紧改行。
1. 编程语言能力
不用多说,作为合格的程序员,精通一门语言是必须的。这种精通,不是说看了一本《24小时精通XXX》,抄了几个程序就能说精通的,要靠长时间的积累和浸淫。
2.编码能力
我曾经看多很多程序员写的代码,在同一个jsp或者java源文件里,出现了三种以上的对方法的命名方式,有下划线间隔的,有全大写的,有拼音首字母的。就像一个菜市场,杂乱无比,估计10天后,他自己都无法看的懂。遵守编码规范,是一个程序员最基本的要求,可悲的是,很多程序员根本没有意识到这个问题的严重性。随意堆砌网上搜来的代码,根本不管可读性和可维护性,只要能实现功能就行了,心想做完这个项目,就拍拍屁股走人了,缺少最基本的职责素养。我经常把代码必须成程序员的孩子,你就是是孩子他爹,孩子他妈,是有感情的。对你自己的孩子,你能不仔细呵护吗?你是称职的父母吗?这是我编写的一个Java编码规范,供大家参考,这里可以下载http://gurudk.javaeye.com/blog/111734
另外一个就是注释,要注意不是为了注释而注释。对类,以说明职责为主;对方法,以说明意图为主;对方法体,以说明实现思路为主。对于大段大段的代码,要分段,使用空行隔开,并使用行内注释进行说明。
思维的条理性,写代码之前,先简单计划一下,用自然语言把流程写下来,用于整理实现思路。不要看了需求或设计之后,马上就敲代码了,敲完代码马上就debug。花点时间思考,敲代码只是最后一个很简单的工作,不要把自己变成一个代码打字员,编写边想,写了删,删了写。安安静静把实现过程想清楚,在脑子里先实现一遍。再去敲代码,水到渠成。
3.面向对象思维能力
如今,多数编程语言都是面向对象的编程语言。而这些面向对象的编程语言的共同的精髓就是面向对象的思想。掌握这些比面向对象语言本身更重要,比如对继承,多态,重载的理解。对面向对象基本原则的理解,比如开闭原则,接口隔离原则,单一职责原则等。在此基础上,应该掌握常用的设计模式,比如工厂模式,策略模式,观察者模式,模板方法模式,命令模式等等。我面试过很多程序员,没有一个能说得上几句的。
4.利用工具能力
工欲善其事,必先利其器。有了趁手的家伙,工作效率可以提升数倍。你编程序,有没有选择一个很好的IDE,以前听说编程高手都用记事本写程序,我觉得那是一种自虐。就像以前看到的一篇文章,说一帮户外旅行爱好者,出去旅游,背了重重的旅行包,里面装着什么压缩饼干等快速食品。他们宁可就着矿泉水啃压缩饼干,也不肯去1里路都不到的快餐店,农家菜馆吃饭。工具是为目的服务的,好用,提高效率就行,形式无所谓。
另外一个常用的工具就是日记本,好听点可以称为知识管理工具,我用的是myBase,感觉非常好用,在之前,我的所有的片段内容都是记录的单独的文本文件里的,非常不好找,管理也很混乱。
经常上互联网,看到好多好的资料想保存下来,作为日后查看之用.一开始,我用的是firefox自带的书签,但是自己分类太累,多了之后不便于查找,很麻烦。后来用了得乐书签(del.icio.us)的firefox插件,非常方便,现在成为了我必备的一个工具。
还有一个最重要的工具就是搜索引擎了,我装了google forfirefox插件,感觉不错,还有英文翻译功能。按照我同事的说法,内事用,外事用google。很多技术资料都是英文的,用google搜索效率高一些。搜索引擎用好了,就等于打开了一扇通向知识宝库的门,使用搜索引擎,关键字选择很重要。
经常去浏览大牛的blog,逐个网站访问很麻烦,去看了又可能没有更新,可以借助于RSS订阅工具,我是用iGoogle桌面工具,每天早上花半个小时扫一下,大牛的最新文章尽收眼底了。
5. 英语能力
新的技术资料都是英文的,英语国家的IT技术走在我们前面至少10年(这是我自己估计的数字,可能正在缩小)。就连印度,一个连基础设施建设都不太完善的国家,因为其英语基础较好,其在软件外包领域的发展也非常迅猛,远远超过了我们。学英语,首先是有信心,其次就是花时间。多阅读英文资料,使用金山词霸,google的firefox插件等工具配合,贵在坚持。
6.学习能力
在IT也混饭吃不容易,整个环境进化的太快,你不学习,就等于落后了。学习要有针对性,别今天学ruby,明天学python,后天php的。首先要认清自己的目标,自己短期目标是什么,1年后,3年后,5年后的目标是什么。结合这些目标,确定自己的学习计划,人的精力毕竟是有限的。当然,多掌握几门编程语言也是好的,可以扩充自己的知识面,重要的是为自己的目标服务。
要想系统的学习一门技术或工具,看书是最好的方法。看完后,然后上网找相关资料,进行深入学习。学习要抓紧一切可以利用的时间,比如电脑启动要花1分多钟,旁边放一本书,可以看上几页了。公交车上,地铁上也可以看。
当然,不能只学习技术,要经常联系自己的软技能,比如沟通能力,表达能力。你可以把自己学到的东西,解释给自己的同事听,既加深了理解,又增进了同事之间的交流。学习的最高境界就是你能够把学到的东西解释给别人听,这才说明你理解了。在学习心理学上,称之为构成主义。
我学一样东西,总是先上网了解有没有相关书籍,如果想学,就买一本或者去图书馆找相关的书来读。我买的书,家里快放不下了(到目前位置,我买了1万多块的书)。我多半是把目录看完,了解这本书讲解的主要内容,然后需要的时候,我就可以立即补充它进入到我的知识结构。每个人可能都有自己的学习方法,意识到学习的重要,并能够根据需要补充自己的知识,这种能力更重要。
7.创造能力
普遍认为,东方人模仿能力很强,但创造能力差。我见过很多这样的程序员,经常说,“这个只能这么解决了,我想不出有什么别的方法。”可能他根本都没想过别的方法,或者懒得去想。对任何一个问题,找出两种以上的解决办法都是非常容易的,简单的google一下,可能就是数十种。悲哀的是,有些程序员经常止步于自己构建的狭小领地之内。对待客户也是这种态度,不是积极的帮助客户解决问题,而是推脱这只是唯一解决方案。
打破这一思维定势的首先的一个办法就是在面临一个问题时,首先想到的是“没有不可能”,或是“一切皆有可能”,前面那个是阿迪的广告语,后面是李宁的。只有这样去想,才能寻找解决问题的别的出路,即使最后我们试了很多种办法,还是只有着一种解决方案,但我们在这种寻找解决方案的过程中,常常会产生很多好的想法,这样才会使我们真正深刻思考一个问题。建议大家看一看《水平思考》这本书,他提供了一些进行创造性思考的方法和工具。
但我认为,坚持认为存在另一种解决方案的信念是第一位的,方法和工具都是其次。
8.文档能力
也许有人会质疑,程序员跟写文档有什么关系。大家开源软件也用过不少,看看Spring,hibernate,Struts等最流行的开源软件的文档就知道,他么的tutorial,他们的getstarted,他们的reference文档写的多么的易懂。其实写代码也相当于写文档,只不过用的是编程语言。同样,写文档,用自然语言,也相当于写程序,简单明了,清晰易懂,这样的“程序”谁看谁舒服。同样,对于想进阶到设计师或者需求分析员角色的程序员,文档能力更是非常重要。
word是一个最实用的工具,很多程序员,多级编号都不会用,索引目录也不知道如何生成,更别灵活应用样式了。很多排版都是所谓的dirty work。垃圾样式一大堆。其实,静下心来,稍微学习一下,就能写出一篇格式漂亮的文档。
9.抽象能力
抽象能力是认识事物从现象到本质的能力。如果你只是停留在“见山是山,见水是水”的层次,客户说什么,你就做什么,设计怎么做,你就怎么实现,从来不过问为什么,也不去想他是满足了用户哪些方面的需求呢。这样可能只解决了表面的问题,可能会引起返工。认识到本质,才能让你的程序具备更大的灵活性和可扩展性。在做企业应用软件开发中,抽象能力体现为对问题域的理解能力,对领域模型的抽象。合理的抽象也是代码重构的前提,每一次重构,都是向更好的抽象迈进了一步。
10.代码评审能力
代码评审和单元测试是保证代码质量的两种常用手段之一。代码评审能力,说明了你的审美标准,知道什么是好的,什么是不好的,什么是优雅的代码,什么是糟糕的代码,你才能让自己做的更好。
11.单元测试能力
没有单元测试的代码,只能说是半成品。因为没有什么能证明你的代码是可以运行的。测试驱动开发是一个非常好的敏捷过程的最佳实践。单元测试还可以作为回归测试,在修改代码时,起到警戒线标志的作用。是否具有单元测试的意识是区分程序员是否合格的重要标准。写不写单元测试是区分平庸程序员和优秀程序员的重要标杆。
12.DRY
DRY是一种原则,就是Don't RepeatYourself.出自《程序员修炼之道-从小工到专家》。这条原则可以用到很多地方,比如你经常要编译,打包,部署应用程序,供集成测试用。每次你都在重复你自己,写一个自动化脚本(比如用ant,批处理命令)来将这些工作自动化,以提高效率。
还有一个就是我们经常在不同的地方切换IP,如果每次手工做,也非常浪费时间,写一个bat命令可以解决,找一个小工具也可以解决。
编码时,对代码的复用也是在重复你自己,虽然拷贝过程很爽,但是维护一致性就要付出巨大的工作量,特别是将来维护的人不是你的时候,使用代码生成工具可以解决这个问题。类似的例子太多了,如果你发现你经常做一些重复的工作,就要警惕了,是否违背了这个原则,想一些办法将他们自动化。