导航:首页 > 程序命令 > 压垮程序员的bug

压垮程序员的bug

发布时间:2025-08-05 16:11:22

‘壹’ 程序员是不是到了一定的年龄就退休了

员的工作比较累,一般到了40岁就选择离开了工作的岗位
1.自主创业
这种人大多数是在工作中到了一定的岗位,有了一定的资本,综合能力提升到一定的水平,对自己有比较足的信心。如果单纯是因为自己工作不开心,对老板不满而愤然离职创业的,这种基本成功概率为零。创业比起做管理岗要求更高,除了沟通能力,还有商务能力,团队管理,人脉资源等等,都是创业者必备的技能。每个创业者都要有九头六臂老处理日常大大小小的琐碎事,还要有极强的承压能力,下个月的员工工资都发不出来了,今晚依然能倒头就睡,否则创业未成,自己就先被压垮了。

创业难度很大,风险很高,但总会有“勇士”前赴后继。

2.做管理

做管理,估计是大部分程序员的选择。原因很简单,“大龄”程序员有着多年的开发项目经验,这些实战经验能一些岗位起到很重要的作用。比如:CTO,项目经理、产品经理。

有着丰富的开发经验,能让你在日常工作开展中更好地跟年轻程序员沟通。 技术出身往往有更好的逻辑思维,更懂得用程序员“能听懂的”方式去跟他们沟通,这一点是非技术科班出身的管理者所缺少的技能。程序员大多不善于交际,做管理岗更多的是管人管事,跟人打交道,而不是跟机器打交道,对你的语言表达、沟通能力是一个很大的考验。 管理也是需要许多知识的,不是光有技术资本就能管得了人理得了事的,所以从单纯写程序转到管理,还是要继续提升自己其他方面的能力,否则在工作上也是寸步难行。

3.继续写程序

选择继续单纯地写程序的,除了热爱,估计就是尴尬地别无他选了。大龄程序员在国内企业基本没要,有N多有拼劲能加班、要求又低、还没有家庭负担的小年轻在等着呢,谁愿意要你来写程序?如果想继续抱着键盘安安静静地写程序,估计要在某个技术方向深度学习。比如做游戏就一直做游戏,做网络就一直做网络,其它方向的工作基本不在考虑范围内,这样才能在一个方向上积累下来;否则各个领域都会一点皮毛,但又没有精通的,企业几乎不需要这种人。

程序员找出路还是要尽量提前进行职业规划和准备,千万不要说什么:“走一步,算一步”的话。在这个一睁眼就是竞争的时代,你可以放松休息,但别人会继续前进,不会等你。

我们相信人人都可以成为一个开发大神,现在开始,找个师兄,带你入门,学习的路上不再迷茫。初学者转行到互联网行业的聚集地。”

‘贰’ 程序员该如何缓解压力呢

当今,程序员这份工作看起来既能挣钱又有保障,但是这种职业一整天面对着电脑,精神耗费大。这对程序员的精神健康会产生很大的影响。程序员这份工作本身就有一定的压力,那么程序员该如何缓解压力呢?

保持良好的心态

将不快以适当模式发泄出来,以减轻心理压力。要敢于把自己不愉快的事向知心朋友或亲人诉说。当极其忧伤时哭泣、读诗词、写日记、看电影、听音乐都是常见的宣泄模式。节奏欢快的音乐能振奋人的情绪。

增强自信心,做情绪的主人

人在正常状态下是可以透过意志努力来消除不愉快情绪,并保持乐观心情的。一是有意识地获取成功的体验;二是不在乎别人对自己如何评价;三是善于发现自己的长处。知识是自信的源泉。要学会容忍,培养坚忍的毅力。用积极进取精神取代消极思想意识。把事情看透,心胸开阔,情绪就能保持稳定。

快速的放松运动

闭上你的眼睛,记住你的感受,慢慢地吸一口气。在吸气的过程中,你会发现你的腹部在胸部扩张之前就会鼓起。尽可能呼吸得更长更慢——可能开始的时候会稍快一些,但是渐渐地慢下来。当你呼气时,也是腹部先于胸部收缩。

缓解工作氛围

每天面对电脑上的一堆代码,单调枯燥,建议办公桌上放置两盆绿植,绿萝,吸毒草,或者自己更喜欢的其他盆景。这样可以缓解单一的工作氛围,增添几分生机。

培养兴趣爱好

培育兴趣爱好,可以给压力寻找一个释放口,营养生物学家肖恩—塔尔伯特表示,业余爱好和消遣活动能让人以一种健康的方式释放压力,能够让人在忙碌而倍感压力的的工作之余留下念想。比如,男程序员可以尝试下班后去健身房健身,女程序员可以去瑜伽屋练瑜伽。

善待自己

善待好自己的'身体,身体是一切的成本,不对它负责就对一切不负责,吃好喝好,保持良好的生活作息时间。不要对自己太苛刻,任何事情都没有尽善尽美,包括你自己,放低标准的同时也能放松心情,减少压力。

积极主动的管理压力

将降低压力当作人生目标是一个很有价值的目标。你受压力的影响越小,那么你的效率就越高。

注意饮食和运动

整天坐在办公桌前非常不利于身体健康。应激反应产生的紧张感会积蓄在体内,随着时间的推移从而会彻底压垮你。饮食和运动绝对是编程和压力这个方程式的正解。多做运动,尽量少喝咖啡,少吃含糖零食。

‘叁’ Erlang游戏程序员换语言转行,都有哪些建议

1、对于优秀的程序员来说,不存在转语言一说。不管什么语言,设计思想都是一样的。不管是java、Go、Python,还是C、C++、PHP,它的一些基础语法(for循环、条件判断、数组操作)都是大同小异的。如果项目中需要用别的语言,不要怕!更不要提前花时间就研究,跟着项目需求走就行。当然如果你想好好掌握该语言,那工作之余多看看相关技术文档好好研究一下就行。语言只是一个工具,拿来即用才是我辈程序员的终极修为!

4、创业比起做管理岗要求更高,除了沟通能力,还有商务能力,团队管理,人脉资源等等,都是创业者必备的技能。每个创业者都要有九头六臂老处理日常大大小小的琐碎事,还要有极强的承压能力,下个月的员工工资都发不出来了,今晚依然能倒头就睡,否则创业未成,自己就先被压垮了。创业难度很大,风险很高,但总会有“勇士”前赴后继。

‘肆’ 晚上9点到11点你在干啥,难怪活不好

不得不熬的夜尽量科学地熬,不是自杀是自救。但明明可以不熬的夜瞎熬,不是修仙是作死。

生活中我们经常会遇到这样的情况:九点钟,洗漱完毕,敷好面膜躺在床上,拿起手机习惯性地逛会儿淘宝。结果逛完淘宝刷微博,刷完微博追idol新剧。

“今晚能睡八个小时…我去只有五个小时了…不闹了再玩最后两个小时…睡一个小时也比通宵强…睡个鬼啊,天亮了,再玩一下直接起床吧”。

“连睡意都战胜不了,还能战胜什么”成为当代很多人晚睡的口号。



晚九点到十一点,入眠最佳

2015年《全球睡眠报告》称,中国人平均上床睡觉时间为00:32。 然而根据现有部分时间生物学家和医学家的研究,晚上九点到十一点,是人体入眠的最佳时期。

“早起富三代,熬夜毁一生”。调查研究显示,尽管都能睡够8小时,但是晚上十点钟入睡和零点之后入睡,睡眠的效果是截然不同的。

很多人,每天睡得也不少,但是越睡越虚,这和人体生物节律和自然节律有关。

2017年诺贝尔生理学获奖者杰弗理·霍尔等通过关于昼夜节律的研究,告诉我们一个价值740万人民币的简单道理: 白天工作、晚上休息,跟上地球的节奏才能愉快地玩耍。

中国人讲究“天人合一”,实际上,从单细胞生物到人类都具有生物节律。人白天工作学习,晚上睡觉休息,就是以昼夜为周期的生物节律。

晚上10点到11点,人体处于生物节律的低潮。9点到10点睡觉,与生物节律相吻合。

如果超过24点,生物节律会处于一个相对的高潮,给入睡造成一定困难。因此,最佳入睡时间是22点左右。

而当我们因贪玩错过正常睡觉时间,入睡就会变得困难。这是由于我们打破了生活习惯,也打破了生物节律,使睡眠的节律也遭到破坏。

想睡睡不着,干脆就通宵。很多人熬夜都是这样产生的,过了睡觉的时间,结果越熬越兴奋,一鼓作气干脆就high到底了。

第二天,微笑中透露着一丝疲惫,暗暗发誓今天十一点之前一定要准时睡觉,结果又是微博、游戏、狼人杀。

“晚上不睡,早上不起”,长期在不是生物节律低潮时入睡,会导致失眠情况的产生。

拥有正确睡眠时间的时候不懂珍惜,错过了却追悔莫及。当你辗转反侧,彻夜难眠时真的就应了华妃娘娘的那句经典台词,“你试过从天黑等到天亮的滋味吗”。



科普谣言:人体排毒表

熬夜的人很多,睡眠就成了困扰大家的普遍问题。于是,各种不靠谱的伪科普纷纷上线。

其中流传最广的是:“晚上九点钟以后,是人体排毒的最佳时间”?

近年来,有关“人体排毒时间表”的新闻在网络上大行其道。大爷大妈、大哥大姐,谁没转发过一条关于排毒的朋友圈,都不好意思说自己混养生圈。

然而,这其实是谣言!是谣言!是谣言!重要的事情说三遍。

人体有生物钟是真的,但排毒时间表确实不存在。之所以会有这种谣言,其实是因为睡眠的两个重要作用。

首先睡眠影响着人体的免疫功能。 免疫学家贝里·达比教授在美国佛罗里达大学里对睡眠、催眠与人体免疫力作了一系列研究。

通过对28名试验人员进行自我催眠试验后,研究小组发现受试人员血液中的T淋巴细胞和B淋巴细胞均有明显上升,而这两种细胞是影响人体免疫力的主要因素。

正是因为睡眠对提高人体免疫力所产生的重要作用,才有了所谓的每晚九点到十一点是人体淋巴的排毒过程的说法。事实上,淋巴细胞一直在工作,九点到十一点并不特殊。

其次,睡眠有利于维持人体内环境的协调。 “晚上十点至凌晨两点,是人体内细胞坏死与新生最活跃的时间,此时不睡足,细胞新陈代谢就会受到影响,人就会加速衰老”。

肤质变差,痘痘横生是因为熬夜导致内分泌的失调,而不是几点到几点没排毒。



养生道理都懂,就是睡不好

晚上九点过后,月挂西头,这是属于夜猫子们的showtime。

直播平台的知名游戏博主“孤王”,开始了一天中最忙碌的时刻。晚上九点正是粉丝活跃度进入高峰的关键时间点,国服最强辅助光环加持,即刻吸引粉丝无数。

自媒体行业工作者“小雯”,正在为即将推送的文章进行最后的校对和排版。打理自己的公众号,24小时连轴转都嫌时间不够用,和粉丝互动至深夜两三点更是司空见惯。

知名互联网企业的程序员“阿哲”在公司茶水间给自己泡了一杯浓浓的咖啡,看着中关村灯火通明的办公楼,他觉得自己像一颗星星,照亮夜空;也觉得自己是一根蜡烛,燃烧生命。

最终,“孤王”因过劳,二十出头生命就画上了句号;“小雯”内分泌失调,带着一脸痘痘到处求医问药;“阿哲”拿了数十万年终奖之后,第一件事是问哪个地方植发技术好。

在这种背景下,一个适合当下青年人的特殊词汇应运而生:“养生朋克”。 这个网络新词其实是大家对于现在不健康生活方式的调侃。

啤酒泡枸杞,可乐放党参,涂着眼霜熬着夜,来着姨妈吃红枣雪糕。一边作天作地,一边保健养生,倔强且精致地活着就是“养生朋克”。

别闹了,各位老铁,怕死就直说。

晚上九点到十一点,注意以下几点,才是最好的养生。

第一,九点之后少吃点并不影响你做精致的猪猪女孩。 吃太饱会使你的消化系统加班工作,腹部的饱涨会刺激神经,不舒服的感觉会使你难以入睡。

当然太饿也不行,睡前喝点牛奶吃点饼干可以助眠。

第二,浓茶,咖啡,酒什么的睡前就别喝了。

茶叶中含的芳香油、咖啡因和茶碱都具有兴奋提神的作用,影响正常入睡,甚至可能导致失眠。茶碱还有利尿作用,睡前饮茶容易使人被尿憋醒,从而影响睡眠的连续性。

咖啡的作用和茶大致相同。

很多失眠的人会借酒助眠,但其实酒精会让我们夜里睡不安稳,导致第二天起床头痛。

第三,请不要总在睡觉前才想起来今天没有锻炼身体,即使想锻炼,也应适度。

睡前适当的运动可以缓解人白天积累的紧张,并使身心放松而增进睡眠质量。但是临睡前的过量运动,会令大脑兴奋,不利于睡眠。

睡不好会导致肥胖的新闻大街小巷都是,所以如果睡前锻炼是想瘦,那咱还是早点洗洗睡吧。

第四,放下手机,立地成佛。

每晚九点到十一点,很多人其实已经躺下了,只可惜却是为了用手机继续狂欢。

经常熬夜刷手机,导致眼角膜穿孔差点失明的新闻绝不是危言耸听。

睡前躺在床上玩手机,是年轻人最爱的娱乐休闲方式之一 | 视觉中国

当然,想要根治过度依赖手机症,只有一个办法:让手机单独一个屋睡,它都这么大了,也到和大人分开睡的年纪了。



得了晚睡的病,没有晚起的命

有人熬夜为了浪,有人熬夜为了活。 “珍爱生命,远离熬夜”的道理谁都懂,但是生活中总有那些不得不熬的夜,和不得不熬夜的人。

北上广深的夜是被无数加班者熬白的,求职时面对接不接受加班这种问题很难给出否定的答案,你不做总有人做。同样的,你不想熬的夜也总有人要替你熬。

白衣天使过劳猝死,快递小哥因差评痛哭,铁路工作人员夜色中检查铁道落得一身职业病。

有时候他们不仅仅是为了一口饭,还为了一口气。负重前行,不过是为社会提供一些方便。

辞职两个字太轻,承担不起生活的重担;熬夜两个字又太重,压垮了生命的质量。 对职场沉浮的同志们来说,这简直是人生的一大bug。

客观条件改不了,我们只能适当发挥主观能动性了。

首先要稳住,心态不能炸。

理想的睡眠时间是会随白天心情的变化而变化的。面对加班的压力,有的人适应能力较强,可以保持相对乐观的心态;有的人则感觉人生灰暗,看不到尽头。

处于一种忧虑的心情中自然是需要更长的时间来恢复疲劳,所以有时候我们会发现有些人每天都很丧,每天都睡不醒。

其次,我们要科学地看待睡眠。

看到熬夜至死的新闻,不得不熬夜的同学自然觉得怕怕的。 但是事实上,偶尔的熬夜对人体的伤害是可控的。 睡觉是一种很自然的“加油”现象,是随时可能变化的。

生活在不断变化的现代社会,要让自己的精神和生理状态永远保持固定的水准,几乎是不可能的。

在这种情形之下,如果还是一味以睡眠时数衡量自己睡眠的话,会增加自己的焦虑,甚至导致失眠。

不得不熬的夜尽量科学地熬,不是自杀是自救。但是明明可以不熬的夜瞎熬,不是修仙是作死。

前一晚不管你是因拖延症被迫加班,还是迷恋网络放飞自我,最终导致的结果只有一个,第二天睡眠不足,虚弱的肉体将装不下你报效祖国的雄心。

打着爱你的旗号陪你熬夜的人都是害你,他们让你变胖变丑变迟钝,让你从一颗倔强的螺丝钉变成软绵绵的社会蛀虫。

正值青春的年纪,过着无聊的生活,像一条没有梦想的咸鱼一样熬着夜,负责任的说,和那些不得不熬夜的人比,你LOW爆了。

参考文献:

[1] 于兰., 贾占玲., 于兰, and 贾占玲. 睡眠与睡眠障碍 (2006). Web.

[2] 肖莹., and 肖莹. 睡眠障碍. 第1版 ed. 北京: 中国医药科技出版社, 2013. Print. 古今名医临证实录丛书.

[3] 张晓舟. 学会睡眠 : 消除睡眠不适的烦恼 (1996). Web.

[4] 张鲁原. 睡眠健康指南  (2005). Web.

[5] 钱诗金. 生命密码 : 睡眠决定生机 (2006). Web.

[6] 叶轻舟. 你知道的都是错的 : 睡眠是养生的第一大补 = Everything You Know Is Wrong. 第1版 ed. 哈尔滨: 哈尔滨出版社, 2009. Print.

[7] 三九养生堂.晚上九点后千万别做这些事.三九养生堂

[8] 新华网.警惕!晚上九点后七件事千万不要做.人民网

[9]  金羊网.12岁女孩网吧熬夜超两昼夜猝死.网易新闻

[10]  一笑倾城已淡抹.“最强辅助”孤王猝死,你还敢熬夜吗.东方网

‘伍’ 绋嫔簭锻樿鍏鍙歌緸阃钖庢劅鍙: 瀹朵腑涓婃湁钥, 涓嬫湁灏, 閮戒笉鏁㈣窡钥佸﹩璇

绋嫔簭锻樻槸楂樿柂镄勪唬钖嶈瘝锛屾湀鍏ヨ繃涓囨槸甯告侊纴骞磋柂鍑犲崄涓囩殑姣旀瘆镄嗘槸锛岀敋镊充笉涔忎竴浜涘ぇ鐗涙嬁镌锏句竾骞磋柂锛岄殢镌浜掕仈缃戞椂浠g殑蹇阃熷彂灞曪纴绋嫔簭锻樻垚浜嗕竴鍧楃倷镓嫔彲鐑镄勯欓ソ楗斤纴涓嶅皯浜烘姇鍏ヨ繖涓琛屼笟锛屼紒锲句粠涓鍒嗗缑涓𨱒缇癸纴鍑′簨镄嗘湁渚嫔栵纴琛ㄩ溃鐪嬩技鍏夐矞锛岃儗钖庡嵈链夎稿氱殑镞犲堬纴杩戞棩鍦ㄧ▼搴忓憳璁哄潧锛屼竴钖岖▼搴忓憳琚鍏鍙歌佸憳浜嗭纴蹇冮吀涔嬩綑鍙戝笘镒熸叏鐢熸椿锛屾潵鐪嬬湅浠栨庝箞璇寸殑銆

34宀佽浼桦寲浜嗭纴涓婃湁钥侊纴涓嬫湁灏忕殑骞寸邯锛屼笉鏁㈣窡钥佸﹩璇达纴镞╀笂涓璧峰嚭闂锛岃繘鍦伴搧钖庯纴鍑烘潵钖冧釜镞╅キ锛屽洖瀹跺埛绠铡嗐傝偗瀹氭湁浜鸿烦鍑烘潵璇达纴杩欎釜骞寸邯杩樻姇绠铡嗭纴娣风殑澶宸浜嗐傛病阌欙纴鎴戝氨鏄涓猯ooser锛屽彧鑳介潬镊宸便傜濊嚜宸卞ソ杩愶紒

鐭鐭鍑犲崄瀛楃殑璐存枃阃忛湶镌钖勭嶈𡒄杈涳纴镊宸辨槸瀹堕噷镄勯《姊佹煴锛屽け铡讳简宸ヤ綔镒忓懗镌娌℃湁缁忔祹鏀跺叆锛屼负浜嗗跺涵杩桦缑阃夋嫨鎸浣滆捣𨱒ワ纴杩戜袱骞翠笉灏戠戞妧铡傞夋嫨瑁佸憳锛屽竞闱涓婃剤𨱒ユ剤瓒嬩簬鐞嗘у寲锛屽湪璐存枃镄勪笅鏂癸纴镵氶泦浜嗕笉灏戝洿瑙傝咃纴瀵规わ纴涓嶅皯缃戝弸瀵规よ璁虹悍绾凤纴閮ㄥ垎缃戝弸濡傛よ瘎浠烽亾锛氩攭锛屾垜涔熷緢澶辫触锛屽ソ铹﹁槛銆备笉杩囷纴链変釜闂棰桡纴浣犺佸﹩闅鹃亾涓岖湅浣犻摱琛屽崱钖楋纻鎴戝幓骞32搴旇ユ槸链変简锛屼篃鎶旷亩铡嗭纴杩樿繃浜嗕袱涓锛屼絾姣旇缉鍕夊己链轰细锛屾斁寮冧简銆

杩樻湁濂崇绣鍙嬭村嚭𨱌栧绩镄勪竴骞曪细濡傛灉鎴戣佸叕琚瑁佷简锛屾垜甯屾湜鑳借窡浠栦竴璧锋潬銆傛墍浠ュ憡璇夊ス锛屽か濡诲叡钖岀粡铡嗛庨洦锛屾劅𨱍呬细镟存繁銆备笉瑕佸け铡诲笇链涘拰鍕囨皵锛屽姞娌癸紒锷犳补锛佷笉绠″ソ镄勫潖镄勮缮鏄搴旇ヨ窡钥佸﹩鍒嗕韩锛屾瘯绔熺粰镊宸辫繃搴︾殑铡嫔姏浼氭妸镊宸卞帇鍨镄勚备汉鐢熶笉濡傛剰鍗佹湁鍏涔濓纴链𨱒ヤ细濂界殑锛屽姞娌瑰惂锛佹病链夎繃涓嶅幓镄勫潕锛36宀侊纴鎴戝幓骞存崲浜3娆″伐浣滐纴姣忔¢兘鏄璁ょ湡镐荤粨锛屾媺阍╋纴鐚庤仒涓涓涓涓镵屼綅灏濊瘯锛屽叏闱犺嚜宸憋纴娌℃湁浜哄埆浜哄彲浠ユ寚链涖

链夊悓涓虹▼搴忓憳涔熻茶堪浜嗗绩閰哥殑缁忓巻锛氭垜浠婂勾46宀侊纴渚濈劧杩桦湪鎶旷亩铡嗭纴涓瀹朵竴瀹剁殑闱㈣瘯銆备粖澶╂槸鎴戞垒宸ヤ綔镄勭4涓链堬纴镞犳埧镞犺溅镞犺捶娆炬棤瀛樻俱傛瑺淇$敤鍗10涓囷纴浣嗘垜鐩镐俊鎴戜细镓惧埌涓嶉敊镄勫伐浣溿傛墍浠ヤ俊蹇冨崄瓒筹纴𨱌傛椂镄勫汹闅炬病浠涔堢殑銆

35宀佹妧链缁忕悊锛岃烦妲借繃4娆★纴姣忔¢兘鏄镡熶汉鍐呮帹锛屼粖骞翠竴链堜唤纰板阀鐪嫔埌涓涓婊℃剰镄勮亴浣嶏纴𨱍冲嚟绠铡呜瘯璇旷湅锛屼簬鏄𨰾跨潃绠铡嗗幓锛岄溃璇曢氲繃锛屽悓镞惰柂姘存定浜嗕笁鎴愩傛暍𨱍呰嚜宸变篃涓嶈兘钥佹槸闱犵啛浜哄晩銆

璇勮哄尯镒埚彂镄勬縺鐑堬纴澶у氭暟缃戝弸鍕夊姳缁х画钖戝墠锛屼汉涓鐢熶腑瑕佺粡铡呜歌稿氩氱殑鍧庡澐锛岀粡铡呜繃钖庣粓浼氲佸僵铏癸纴褰撶劧涔熸湁璇稿氭満浼氾纴鍏抽敭鐪嬭嚜宸卞备綍铡绘妸鎻★紒

‘陆’ 代码重构的概述

重构(),通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。也许有人会问,为什么不在项目开始时多花些时间把设计做好,而要以后花时间来重构呢?要知道一个完美得可以预见未来任何变化的设计,或一个灵活得可以容纳任何扩展的设计是不存在的。系统设计人员对即将着手的项目往往只能从大方向予以把控,而无法知道每个细枝末节,其次永远不变的就是变化,提出需求的用户往往要在软件成型后,才开始品头论足,系统设计人员毕竟不是先知先觉的神仙,功能的变化导致设计的调整再所难免。所以测试为先,持续重构作为良好开发习惯被越来越多的人所采纳,测试和重构像黄河的护堤,成为保证软件质量的法宝。 在不改变系统功能的情况下,改变系统的实现方式。为什么要这么做?投入精力不用来满足客户关心的需求,而是仅仅改变了软件的实现方式,这是否是在浪费客户的投资呢?
重构的重要性要从软件的生命周期说起。软件不同与普通的产品,他是一种智力产品,没有具体的物理形态。一个软件不可能发生物理损耗,界面上的按钮永远不会因为按动次数太多而发生接触不良。那么为什么一个软件制造出来以后,却不能永远使用下去呢?
对软件的生命造成威胁的因素只有一个:需求的变更。一个软件总是为解决某种特定的需求而产生,时代在发展,客户的业务也在发生变化。有的需求相对稳定一些,有的需求变化的比较剧烈,还有的需求已经消失了,或者转化成了别的需求。在这种情况下,软件必须相应的改变。
考虑到成本和时间等因素,当然不是所有的需求变化都要在软件系统中实现。但是总的说来,软件要适应需求的变化,以保持自己的生命力。
这就产生了一种糟糕的现象:软件产品最初制造出来,是经过精心的设计,具有良好架构的。但是随着时间的发展、需求的变化,必须不断的修改原有的功能、追加新的功能,还免不了有一些缺陷需要修改。为了实现变更,不可避免的要违反最初的设计构架。经过一段时间以后,软件的架构就千疮百孔了。bug越来越多,越来越难维护,新的需求越来越难实现,软件的构架对新的需求渐渐的失去支持能力,而是成为一种制约。最后新需求的开发成本会超过开发一个新的软件的成本,这就是这个软件系统的生命走到尽头的时候。
重构就能够最大限度的避免这样一种现象。系统发展到一定阶段后,使用重构的方式,不改变系统的外部功能,只对内部的结构进行重新的整理。通过重构,不断的调整系统的结构,使系统对于需求的变更始终具有较强的适应能力。
通过重构可以达到以下的目标:
·持续纠偏和改进软件设计
重构和设计是相辅相成的,它和设计彼此互补。有了重构,你仍然必须做预先的设计,但是不必是最优的设计,只需要一个合理的解决方案就够了,如果没有重构、程序设计会逐渐腐败变质,愈来愈像断线的风筝,脱缰的野马无法控制。重构其实就是整理代码,让所有带着发散倾向的代码回归本位。
·
Martin Flower在《重构》中有一句经典的话:任何一个傻瓜都能写出计算机可以理解的程序,只有写出人类容易理解的程序才是优秀的程序员。对此,笔者感触很深,有些程序员总是能够快速编写出可运行的代码,但代码中晦涩的命名使人晕眩得需要紧握坐椅扶手,试想一个新兵到来接手这样的代码他会不会想当逃兵呢?
软件的生命周期往往需要多批程序员来维护,我们往往忽略了这些后来人。为了使代码容易被他人理解,需要在实现软件功能时做许多额外的事件,如清晰的排版布局,简明扼要的注释,其中命名也是一个重要的方面。一个很好的办法就是采用暗喻命名,即以对象实现的功能的依据,用形象化或拟人化的手法进行命名,一个很好的态度就是将每个代码元素像新生儿一样命名,也许笔者有点命名偏执狂的倾向,如能荣此雅号,将深以此为幸。
对于那些让人充满迷茫感甚至误导性的命名,需要果决地、大刀阔斧地整容,永远不要手下留情!
·帮助发现隐藏的代码缺陷
孔子说过:温故而知新。重构代码时逼迫你加深理解原先所写的代码。笔者常有写下程序后,却发生对自己的程序逻辑不甚理解的情景,曾为此惊悚过,后来发现这种症状居然是许多程序员常患的感冒。当你也发生这样的情形时,通过重构代码可以加深对原设计的理解,发现其中的问题和隐患,构建出更好的代码。
·从长远来看,有助于提高编程效率
当你发现解决一个问题变得异常复杂时,往往不是问题本身造成的,而是你用错了方法,拙劣的设计往往导致臃肿的编码。
改善设计、提高可读性、减少缺陷都是为了稳住阵脚。良好的设计是成功的一半,停下来通过重构改进设计,或许会在当前减缓速度,但它带来的后发优势却是不可低估的。 新官上任三把火,开始一个全新??、脚不停蹄、加班加点,一支声势浩大的千军万码夹裹着程序员激情和扣击键盘的鸣金奋力前行,势如破竹,攻城掠地,直指黄龙府。
开发经理是这支浩浩汤汤代码队伍的统帅,他负责这支队伍的命运,当齐桓公站在山顶上看到管仲训练的队伍整齐划一地前进时,他感叹说我有这样一支军队哪里还怕没有胜利呢?。但很遗憾,你手中的这支队伍原本只是散兵游勇,在前进中招兵买马,不断壮大,所以队伍变形在所难免。当开发经理发觉队伍变形时,也许就是克制住攻克前方山头的诱惑,停下脚步整顿队伍的时候了。
Kent Beck提出了代码坏味道的说法,和我们所提出的队伍变形是同样的意思,队伍变形的信号是什么呢?以下列述的代码症状就是队伍变形的强烈信号:
·代码中存在重复的代码
中国有118 家整车生产企业,数量几乎等于美、日、欧所有汽车厂家数之和,但是全国的年产量却不及一个外国大汽车公司的产量。重复建设只会导致效率的低效和资源的浪费。
程序代码更是不能搞重复建设,如果同一个类中有相同的代码块,请把它提炼成类的一个独立方法,如果不同类中具有相同的代码,请把它提炼成一个新类,永远不要重复代码。
·过大的类和过长的方法
过大的类往往是类抽象不合理的结果,类抽象不合理将降低了代码的复用率。方法是类王国中的诸侯国,诸侯国太大势必动摇中央集权。过长的方法由于包含的逻辑过于复杂,错误机率将直线上升,而可读性则直线下降,类的健壮性很容易被打破。当看到一个过长的方法时,需要想办法将其划分为多个小方法,以便于分而治之。
·牵一毛而需要动全身的修改
当你发现修改一个小功能,或增加一个小功能时,就引发一次代码地震,也许是你的设计抽象度不够理想,功能代码太过分散所引起的。
·类之间需要过多的通讯
A类需要调用B类的过多方法访问B的内部数据,在关系上这两个类显得有点狎昵,可能这两个类本应该在一起,而不应该分家。
·过度耦合的信息链
计算机是这样一门科学,它相信可以通过添加一个中间层解决任何问题,所以往往中间层会被过多地追加到程序中。如果你在代码中看到需要获取一个信息,需要一个类的方法调用另一个类的方法,层层挂接,就象输油管一样节节相连。这往往是因为衔接层太多造成的,需要查看就否有可移除的中间层,或是否可以提供更直接的调用方法。
·各立山头干革命
如果你发现有两个类或两个方法虽然命名不同但却拥有相似或相同的功能,你会发现往往是因为开发团队协调不够造成的。笔者曾经写了一个颇好用的字符串处理类,但因为没有及时通告团队其他人员,后来发现项目中居然有三个字符串处理类。革命资源是珍贵的,我们不应各立山头干革命。
·不完美的设计
在笔者刚完成的一个比对报警项目中,曾安排阿朱开发报警模块,即通过Socket向指定的短信平台、语音平台及客户端报警器插件发送报警报文信息,阿朱出色地完成了这项任务。后来用户又提出了实时比对的需求,即要求第三方系统以报文形式向比对报警系统发送请求,比对报警系统接收并响应这个请求。这又需要用到Socket报文通讯,由于原来的设计没有将报文通讯模块独立出来,所以无法复用阿朱开发的代码。后来我及时调整了这个设计,新增了一个报文收发模块,使系统所有的对外通讯都复用这个模块,系统的整体设计也显得更加合理。
每个系统都或多或少存在不完美的设计,刚开始可能注意不到,到后来才会慢慢凸显出来,此时唯有勇于更改才是最好的出路。
·缺少必要的注释
虽然许多软件工程的书籍常提醒程序员需要防止过多注释,但这个担心好象并没有什么必要。往往程序员更感兴趣的是功能实现而非代码注释,因为前者更能带来成就感,所以代码注释往往不是过多而是过少,过于简单。人的记忆曲线下降的坡度是陡得吓人的,当过了一段时间后再回头补注释时,很容易发生提笔忘字,愈言且止的情形。
曾在网上看到过微软的代码注释,其详尽程度让人叹为观止,也从中体悟到了微软成功的一个经验。 学习一种可以大幅提高生产力的新技术时,你总是难以察觉其不适用的场合。通常你在一个特定场景中学习它,这个场景往往是个项目。这种情况下你很难看出什么会造成这种新技术成效不彰或甚至形成危害。十年前,对象技术(object tech.)的情况也是如此。那时如果有人问我“何时不要使用对象”,我很难回答。并非我认为对象十全十美、没有局限性 — 我最反对这种盲目态度,而是尽管我知道它的好处,但确实不知道其局限性在哪儿。
现在,重构的处境也是如此。我们知道重构的好处,我们知道重构可以给我们的工作带来垂手可得的改变。但是我们还没有获得足够的经验,我们还看不到它的局限性。
这一小节比我希望的要短。暂且如此吧。随着更多人学会重构技巧,我们也将对??你应该尝试一下重构,获得它所提供的利益,但在此同时,你也应该时时监控其过程,注意寻找重构可能引入的问题。请让我们知道你所遭遇的问题。随着对重构的了解日益增多,我们将找出更多解决办法,并清楚知道哪些问题是真正难以解决的。
·数据库(Databases)
“重构”经常出问题的一个领域就是数据库。绝大多数商用程序都与它们背后的database schema(数据库表格结构)紧密耦合(coupled)在一起,这也是database schema如此难以修改的原因之一。另一个原因是数据迁移(migration)。就算你非常小心地将系统分层(layered),将database schema和对象模型(object model)间的依赖降至最低,但database schema的改变还是让你不得不迁移所有数据,这可能是件漫长而烦琐的工作。
在“非对象数据库”(nonobject databases)中,解决这个问题的办法之一就是:在对象模型(object model)和数据库模型(database model)之间插入一个分隔层(separate layer),这就可以隔离两个模型各自的变化。升级某一模型时无需同时升级另一模型,只需升级上述的分隔层即可。这样的分隔层会增加系统复杂度,但可以给你很大的灵活度。如果你同时拥有多个数据库,或如果数据库模型较为复杂使你难以控制,那么即使不进行重构,这分隔层也是很重要的。
你无需一开始就插入分隔层,可以在发现对象模型变得不稳定时再产生它。这样你就可以为你的改变找到最好的杠杆效应。
对开发者而言,对象数据库既有帮助也有妨碍。某些面向对象数据库提供不同版本的对象之间的自动迁移功能,这减少了数据迁移时的工作量,但还是会损失一定时间。如果各数据库之间的数据迁移并非自动进行,你就必须自行完成迁移工作,这个工作量可是很大的。这种情况下你必须更加留神classes内的数据结构变化。你仍然可以放心将classes的行为转移过去,但转移值域(field)时就必须格外小心。数据尚未被转移前你就得先运用访问函数(accessors)造成“数据已经转移”的假象。一旦你确定知道“数据应该在何处”时,就可以一次性地将数据迁移过去。这时惟一需要修改的只有访问函数(accessors),这也降低了错误风险。
·修改接口(Changing Interfaces)
关于对象,另一件重要事情是:它们允许你分开修改软件模块的实现(implementation)和接口(interface)。你可以安全地修改某对象内部而不影响他人,但对于接口要特别谨慎 — 如果接口被修改了,任何事情都有可能发生。
一直对重构带来困扰的一件事就是:许多重构手法的确会修改接口。像Rename Method(273)这么简单的重构手法所做的一切就是修改接口。这对极为珍贵的封装概念会带来什么影响呢?
如果某个函数的所有调用动作都在你的控制之下,那么即使修改函数名称也不会有任何问题。哪怕面对一个public函数,只要能取得并修改其所有调用者,你也可以安心地将这个函数易名。只有当需要修改的接口系被那些“找不到,即使找到也不能修改”的代码使用时,接口的修改才会成为问题。如果情况真是如此,我就会说:这个接口是个“已发布接口”(published interface)— 比公开接口(public interface)更进一步。接口一旦发行,你就再也无法仅仅修改调用者而能够安全地修改接口了。你需要一个略为复杂的程序。
这个想法改变了我们的问题。如今的问题是:该如何面对那些必须修改“已发布接口”的重构手法?
简言之,如果重构手法改变了已发布接口(published interface),你必须同时维护新旧两个接口,直到你的所有用户都有时间对这个变化做出反应。幸运的是这不太困难。你通常都有办法把事情组织好,让旧接口继续工作。请尽量这么做:让旧接口调用新接口。当你要修改某个函数名称时,请留下旧函数,让它调用新函数。千万不要拷贝函数实现码,那会让你陷入“重复代码”(plicated code)的泥淖中难以自拔。你还应该使用Java提供的 deprecation(反对)设施,将旧接口标记为 deprecated。这么一来你的调用者就会注意到它了。
这个过程的一个好例子就是Java容器类(collection classes)。Java 2的新容器取代了原先一些容器。当Java 2容器发布时,JavaSoft花了很大力气来为开发者提供一条顺利迁徙之路。
“保留旧接口”的办法通常可行,但很烦人。起码在一段时间里你必须建造(build)并维护一些额外的函数。它们会使接口变得复杂,使接口难以使用。还好我们有另一个选择:不要发布(publish)接口。当然我不是说要完全禁止,因为很明显你必得发布一些接口。如果你正在建造供外部使用的APIs,像Sun所做的那样,肯定你必得发布接口。我之所以说尽量不要发布,是因为我常常看到一些开发团队公开了太多接口。我曾经看到一支三人团队这么工作:每个人都向另外两人公开发布接口。这使他们不得不经常来回维护接口,而其实他们原本可以直接进入程序库,径行修改自己管理的那一部分,那会轻松许多。过度强调“代码拥有权”的团队常常会犯这种错误。发布接口很有用,但也有代价。所以除非真有必要,别发布接口。这可能意味需要改变你的代码拥有权观念,让每个人都可以修改别人的代码,以运应接口的改动。以搭档(成对)编程(Pair Programming)完成这一切通常是个好主意。
不要过早发布(published)接口。请修改你的代码拥有权政策,使重构更顺畅。
Java之中还有一个特别关于“修改接口”的问题:在throws子句中增加一个异常。这并不是对签名式(signature)的修改,所以你无法以delegation(委托手法)隐藏它。但如果用户代码不作出相应修改,编译器不会让它通过。这个问题很难解决。你可以为这个函数选择一个新名tion(可控式异常)转换成一个unchecked exception(不可控异常)。你也可以抛出一个unchecked异常,不过这样你就会失去检验能力。如果你那么做,你可以警告调用者:这个unchecked异常日后会变成一个checked异常。这样他们就有时间在自己的代码中加上对此异常的处理。出于这个原因,我总是喜欢为整个package定义一个superclass异常(就像java.sql的SQLException),并确保所有public函数只在自己的throws子句中声明这个异常。这样我就可以随心所欲地定义subclass异常,不会影响调用者,因为调用者永远只知道那个更具一般性的superclass异常。
·难以通过重构手法完成的设计改动
通过重构,可以排除所有设计错误吗?是否存在某些核心设计决策,无法以重构手法修改?在这个领域里,我们的统计数据尚不完整。当然某些情况下我们可以很有效地重构,这常常令我们倍感惊讶,但的确也有难以重构的地方。比如说在一个项目中,我们很难(但还是有可能)将“无安全需求(no security requirements)情况下构造起来的系统”重构为“安全性良好的(good security)系统”。
这种情况下我的办法就是“先想象重构的情况”。考虑候选设计方案时,我会问自己:将某个设计重构为另一个设计的难度有多大?如果看上去很简单,我就不必太担心选择是否得当,于是我就会选最简单的设计,哪怕它不能覆盖所有潜在需求也没关系。但如果预先看不到简单的重构办法,我就会在设计上投入更多力气。不过我发现,这种情况很少出现。
·何时不该重构?
有时候你根本不应该重构 — 例如当你应该重新编写所有代码的时候。有时候既有代码实在太混乱,重构它还不如从新写一个来得简单。作出这种决定很困难,我承认我也没有什么好准则可以判断何时应该放弃重构。
重写(而非重构)的一个清楚讯号就是:现有代码根本不能正常运作。你可能只是试着做点测试,然后就发现代码中满是错误,根本无法稳定运作。记住,重构之前,代码必须起码能够在大部分情况下正常运作。
一个折衷办法就是:将“大块头软件”重构为“封装良好的小型组件”。然后你就可以逐一对组件作出“重构或重建”的决定。这是一个颇具希望的办法,但我还没有足够数据,所以也无法写出优秀的指导原则。对于一个重要的古老系统,这肯定会是一个很好的方向。
另外,如果项目已近最后期限,你也应该避免重构。在此时机,从重构过程赢得的生产力只有在最后期限过后才能体现出来,而那个时候已经时不我予。Ward Cunningham对此有一个很好的看法。他把未完成的重构工作形容为“债务”。很多公司都需要借债来使自己更有效地运转。但是借债就得付利息,过于复杂的代码所造成的“维护和扩展的额外开销”就是利息。你可以承受一定程度的利息,但如果利息太高你就会被压垮。把债务管理好是很重要的,你应该随时通过重构来偿还一部分债务。
如果项目已经非常接近最后期限,你不应该再分心于重构,因为已经没有时间了。不过多个项目经验显示:重构的确能够提高生产力。如果最后你没有足够时间,通常就表示你其实早该进行重构。 “重构”肩负一项特别任务:它和设计彼此互补。初学编程的时候,我埋头就写程序,浑浑噩噩地进行开发。然而很快我便发现,“事先设计”(upfront design)可以助我节省回头工的高昂成本。于是我很快加强这种“预先设计”风格。许多人都把设计看作软件开发的关键环节,而把编程(programming)看作只是机械式的低级劳动。他们认为设计就像画工程图而编码就像施工。但是你要知道,软件和真实器械有着很大的差异。软件的可塑性更强,而且完全是思想产品。正如Alistair Cockburn所说:‘有了设计,我可以思考更快,但是其中充满小漏洞。’
有一种观点认为:重构可以成为“预先设计”的替代品。这意思是你根本不必做任何设计,只管按照最初想法开始编码,让代码有效运作,然后再将它重构成型。事实上这种办法真的可行。我的确看过有人这么做,最后获得设计良好的软件。极限编程(Extreme Programming)【Beck, XP】 的支持者极力提倡这种办法。
尽管如上所言,只运用重构也能收到效果,但这并不是最有效的途径。是的,即使极限编程(Extreme Programming)爱好者也会进行预先设计。他们会使用CRC卡或类似的东西来检验各种不同想法,然后才得到第一个可被接受的解决方案,然后才能开始编码,然后才能重构。关键在于:重构改变了“预先设计”的角色。如果没有重构,你就必须保证“预先设计”正确无误,这个压力太大了。这意味如果将来需要对原始设计做任何修改,代价都将非常高昂。因此你需要把更多时间和精力放在预先设计上,以避免日后修改。
如果你选择重构,问题的重点就转变了。你仍然做预先设计,但是不必一定找出正确的解决方案。此刻的你只需要得到一个足够合理的解决方案就够了。你很肯定地知道,在实现这个初始解决方案的时候,你对问题的理解也会逐渐加深,你可能会察觉最佳解决方案和你当初设想的有些不同。只要有重构这项武器在手,就不成问题,因为重构让日后的修改成本不再高昂。
这种转变导致一个重要结果:软件设计朝向简化前进了一大步。过去未曾运用重构时,我总是力求得到灵活的解决方案。任何一个需求都让我提心吊胆地猜疑:在系统寿命期间,这个需求会导致怎样的变化?由于变更设计的代价非常高昂,所以我希望建造一个足够灵活、足够强固的解决方案,希望它能承受我所能预见的所有需求变化。问题在于:要建造一个灵活的解决方案,所需的成本难以估算。灵活的解决方案比简单的解决方案复杂许多,所以最终得到的软件通常也会更难维护 — 虽然它在我预先设想的??方向上,你也必须理解如何修改设计。如果变化只出现在一两个地方,那不算大问题。然而变化其实可能出现在系统各处。如果在所有可能的变化出现地点都建立起灵活性,整个系统的复杂度和维护难度都会大大提高。当然,如果最后发现所有这些灵活性都毫无必要,这才是最大的失败。你知道,这其中肯定有些灵活性的确派不上用场,但你却无法预测到底是哪些派不上用场。为了获得自己想要的灵活性,你不得不加入比实际需要更多的灵活性。
有了重构,你就可以通过一条不同的途径来应付变化带来的风险。你仍旧需要思考潜在的变化,仍旧需要考虑灵活的解决方案。但是你不必再逐一实现这些解决方案,而是应该问问自己:‘把一个简单的解决方案重构成这个灵活的方案有多大难度?’如果答案是“相当容易”(大多数时候都如此),那么你就只需实现目前的简单方案就行了。
重构可以带来更简单的设计,同时又不损失灵活性,这也降低了设计过程的难度,减轻了设计压力。一旦对重构带来的简单性有更多感受,你甚至可以不必再预先思考前述所谓的灵活方案 — 一旦需要它,你总有足够的信心去重构。是的,当下只管建造可运行的最简化系统,至于灵活而复杂的设计,唔,多数时候你都不会需要它。
劳而无获— Ron Jeffries
Chrysler Comprehensive Compensation(克莱斯勒综合薪资系统)的支付过程太慢了。虽然我们的开发还没结束,这个问题却已经开始困扰我们,因为它已经拖累了测试速度。
Kent Beck、Martin Fowler和我决定解决这个问题。等待大伙儿会合的时间里,凭着我对这个系统的全盘了解,我开始推测:到底是什么让系统变慢了?我想到数种可能,然后和伙伴们谈了几种可能的修改方案。最后,关于“如何让这个系统运行更快”,我们提出了一些真正的好点子。
然后,我们拿Kent的量测工具度量了系统性能。我一开始所想的可能性竟然全都不是问题肇因。我们发现:系统把一半时间用来创建“日期”实体(instance)。更有趣的是,所有这些实体都有相同的值。
于是我们观察日期的创建逻辑,发现有机会将它优化。日期原本是由字符串转换而生,即使无外部输入也是如此。之所以使用字符串转换方式,完全是为了方便键盘输入。好,也许我们可以将它优化。
于是我们观察日期怎样被这个程序运用。我们发现,很多日期对象都被用来产生“日期区间”实体(instance)。“日期区间”是个对象,由一个起始日期和一个结束日期组成。仔细追踪下去,我们发现绝大多数日期区间是空的!
处理日期区间时我们遵循这样一个规则:如果结束日期在起始日期之前,这个日期区间就该是空的。这是一条很好的规则,完全符合这个class的需要。采用此一规则后不久,我们意识到,创建一个“起始日期在结束日期之后”的日期区间,仍然不算是清晰的代码,于是我们把这个行为提炼到一个factory method(译注:一个着名的设计模式,见《Design Patterns》),由它专门创建“空的日期区间”。
我们做了上述修改,使代码更加清晰,却意外得到了一个惊喜。我们创建一个固定不变的“空日期区间”对象,并让上述调整后的factory method每次都返回该对象,而不再每次都创建新对象。这一修改把系统速度提升了几乎一倍,足以让测试速度达到可接受程度。这只花了我们大约五分钟。
我和团队成员(Kent和Martin谢绝参加)认真推测过:我们了若指掌的这个程序中可能有什么错误?我们甚至凭空做了些改进设计,却没有先对系统的真实情况进行量测。
我们完全错了。除了一场很有趣的交谈,我们什么好事都没做。
教训:哪怕你完全了解系统,也请实际量测它的性能,不要臆测。臆测会让你学到一些东西,但十有八九你是错的。

‘柒’ 武汉一程序员压力太大,在餐厅崩溃痛哭,现在年轻人压力有多大

现在的年轻人虽然看起来表面风光,但其实背后都成长了非常大的压力。他们每天要面临公司老板给自己的工作压力,在回到家以后,他们要看着其他的同学比自己发展的更好,自己会给自己压力。在面对自己父母的时候,他们同样也有了家庭。

现在社会上的竞争压力是非常大的,因为每一个年轻人都有自己的强项和弱项,每个岗位都有各种各样的人才,想要成为最成功的那一个人是非常困难的,所以每个年轻人都在和自己较劲自己给自己压力,再加上其他方面的压力会让这些年轻人喘不过气。

阅读全文

与压垮程序员的bug相关的资料

热点内容
公司的服务器如何访问外网 浏览:634
广西文档透明加密地址 浏览:823
轻量云服务器平台 浏览:30
顺德资料加密报价 浏览:402
androidaac格式 浏览:114
怎么使用代理服务器地址 浏览:312
算法精准化推送案例 浏览:235
哪来的那么多35以上的程序员 浏览:682
结束后台进程的命令 浏览:516
大话维护后怎么快速进去服务器 浏览:726
python第三方包错误 浏览:218
单片机彩灯控制 浏览:503
app专属流量怎么开启 浏览:639
单片机与电机驱动连接 浏览:277
女生适合当程序员吗 浏览:493
louvain算法 浏览:177
命令怎么搭配 浏览:848
python全栈题 浏览:638
南邮汇编语言与编译原理课本 浏览:915
网易java面试 浏览:176