编写干净易维护的代码(一)

    在开发凤翼的时候,我有一种非常强烈的感觉,就是我的代码写得非常“脏”。为了解决这个问题,我买了《代码整洁之道》这本书。这本书到底怎么样我还不知道,但是书名对我太有吸引力了。

    在开始读这本书之前,我尝试总结一下我从工作中收获的一些编写干净易维护的代码的经验。

    1. 短的代码本身就意味着容易维护

    在以前写代码的时候,我比较偏爱写简单易读的代码。什么叫简单易读的代码呢?比如说我不爱使用三元表达式,因为我觉得在一行代码里嵌套太多的逻辑会影响代码的可读性;比如说我几乎在实际工作中禁用掉了递归,虽然我觉得我的递归写得比大部分人要更加熟练,但是我认为递归代码对于代码的可维护性是毁灭性的,因为我很难想象一个没有经过专门训练的人能够快速理解一段递归代码的逻辑;比如说我对于很多设计模式有一种怀疑的态度,因为我觉得大部分程序员无法理解设计模式。

    这样的观念带来的一个问题就是我会把代码写的很长,有时候代码里充斥着的各种 if else 语句看得我头晕,有些仅仅为了避免在同一行代码里嵌套太多逻辑而声明的变量看着就很刺眼。一直到最近,我开始意识到,只要把代码写得够短,其维护难度就会直接降低。

    在编程中,我们通常推荐实现接口级别的“高内聚,低耦合”,而精简的代码本身就实现了一种语句级别的“高内聚,低耦合”。对于一个设计优美的接口来说,阅读代码的人应该只关注接口的输入和输出,而不应该关注接口的具体实现。一行足够精炼的代码能够减少程序员在阅读这行代码时对上下文的依赖,也避免了程序员过多地去关注代码的细节。

    2. 易读 != 易维护

    在以前我一直认为容易维护的代码应该是容易阅读的,这是个非常自然的逻辑,如果一段代码连阅读都非常困难,又怎么能说是易维护的呢?

    但是现在我对这个观点开始有一种怀疑的态度,现在我认为容易维护的代码首先应该是容易修改的,其次才是容易阅读的。想想当你使用一个框架时被框架内的层层调用折腾得晕头转向的痛苦和你使用框架后能够在根本不了解很多功能实现细节的情况下完成一个项目开发的幸福,大概就能理解这两者之间的差异了。

    3. 移除所有的冗余,只有清晰的有价值的内容应该保留

    这里的冗余包含的内容很多,冗余的文件、冗余的代码、冗余的注释、冗余的实现、冗余的数据表、冗余的字段甚至冗余的功能、冗余的设计和冗余的人。

    其中有些东西我们不能控制,我们直说我们能控制的那部分,即开发工作中的冗余。

    在项目中经常出现的一个情况就是,虽然我不知道这种东西具体有用,但是看起来好像有用,那就先保留吧。典型的,想象一下数据表中 status 这个字段描述的状态有多少根本没用。

    写了一个小时,感觉有点儿精疲力尽,就不往下写了,其实对于冗余的态度就是尽可能早地移除,如果不知道一个东西有没有用那就是没有用。所有存在的内容都应该有其明确的价值和目的。

分享问题

    在学校搞ACM的时候我就是一个偏爱单挑的选手,那时候我们三人组队,通常都是一人一个方向,但是我不是,我打全能,我几乎学习了每一个方向并作为主力选手在比赛。

    在当时,我认为这是因为我的队友不能努力,所以只能自己上,但是现在项目中又出现了这种情况,不可能每次我的队友都那么菜,所以我有了一些不一样的想法。

    在早期,队友遇到问题的时候,如果时间紧迫并且队友不能解决,我通常会直接拿过来自己干掉。因为我足够聪明爆发力也够强,通常我都能解决眼前的危机。我一直为此多少有些抱怨,因为我的队友不够强力,所以什么事情都要我自己上。

    但是实际上,在我把问题拿过来自己解决的时候,我同时也剥夺了队友成长的机会,我在一个非常早的阶段就否定了他们的价值。虽然短期来看,我通过自己的学习能力和爆发力取得了还算可以的成绩,但是可以想像,当我们和别的队伍的竞争达到一定强度之后,如果对手队伍中每个人的能力都与我相仿,我们几乎很难有赢的机会。如果我放手让队友去做,就算是短期内会有一些损失,但是学习是一个加速的过程,迟早他们会在自己的主力方向上达到并超越我所能达到的水准。

    在团队合作中,我一直认为自己是个非常慷慨的队友,我愿意去做很多自己分外的工作,也乐于和队友分享自己的成果,但是我唯一没有分享出去的就是问题和责任。甚至于我经常去解决和承担本来属于他们的问题和责任。往好了想,这是我勇于担当;往坏了想,我其实剥夺了他们成长的机会。毕竟,人总是要在困难和挫折中成长。

   从这个角度看,我保证了团队的下限,但是也限制了团队的上限。

    

晚安

    讲真明天事情还是挺多的。

    加完班到家十一点,六号快要离开北京了,我去跟他聊了会儿天。聊完天打了两把星际,卡了好久的自由之翼终于通关了,然后我买了后面的战役包,玩了两把虫群之心。算算时间两点了,泡了个面。吃面的时候就想找个电影看,刚好看到腾讯视频推荐《缝纫机乐队》,电影很好看,里面的歌尤其好听,看完电影,又听了半个小时的歌。多美好一个夜晚,不写篇博客记录一下可惜了。

    现在早上四点半,晚安。

泡面和咖啡简直就是照亮这个午后的一束光

    如题。

封鬼之邪恶的源头2.5单刷攻略

   这应该算是第一张我单通的RPG地图了,虽然是天堂难度,90s刷兵。

    我选择的英雄是小小。

    开局先去做送信任务,做一两次之后就直接去刷螃蟹。螃蟹可以一直刷,发育速度要比在练功房快一些,中间刷兵了就去防守一下。需要注意螃蟹不一定每次只能送一个。我试了下,一次送多个给的奖励也会变多。

    等到螃蟹刷差不多了,杀敌数也有了,可以直接取买铁剑、国王冠、吸血爪,都直接升到顶级。我一般还会去合一下光源之枪,在主基地右上角的商店里。然后去打娜迦,刷攻击之石跟防御之石。攻击之石用来合专署武器,防御之石合月之护甲。光源之枪跟月之护甲不是必须合,不过我比较喜欢,因为不用花费什么资源。

    合完专署武器可以直接去打宝石升级混沌之剑和传印之剑。传印之剑就是商店中说的指天剑。这时候可以去刷小黑,掉死灵剑,在商店里买幽魂剑、火灵剑,三把剑可以合成胜利之剑。我一般这时候会去刷一下绝望套装,在地图下方最右边的商店里。

    中间一直刷木头,可以买书升级。五百级之后去地图右边的村民处领任务刷菊花猪,可以拿到大鼓,升级为震天神鼓。下面就是刷属性刷等级刷木头。

    刷死骑会掉一个暗黑之盾,但是死骑特别难打,我一般都是先打大树掉大地之石,大地之石可以跟胜利之剑合成大地之剑,大地之剑跟传印之剑(指天剑)合成封鬼之剑。这时候可以去把四层死灵的boss给清了,掉出的装备合成天灾骨钟。再去刷红龙、青龙,刷够木材在商店里买大地之铲。

    后面一直刷属性,等四个boss掉的装备凑齐之后,合成封鬼侠士之剑。

    最后打兽王的装备是封鬼之剑、红龙印记、青龙、大地之铲、封鬼侠士之剑、天灾骨钟。

    在练功房刷属性不要停,有钱最后全部买主属性。打兽王的时候,可以用红龙抗,红龙的属性是英雄的三倍。不过我用小小比较肉,有没有红龙感觉都扛得住。兽王两条命,在第二条命复活的时候会放剑刃风暴,注意不要硬吃伤害。慢慢把兽王两条命磨完,就可以去打基地,基地摧毁之后游戏通关。

    大概思路就是尽快发育,攒属性。其中过度装备不一定非要攻略中写的那几套,能过度的装备很多。

hdu3397终于A掉了

    看了下提交记录,我第一次提交的时间是2013-08-03 05:17:00,当时觉得这道题也不难,比较直白的线段树延迟标记+区间合并,然而我当时就是写不对,提交了好多遍,一直都是 wrong answer。

    之后,这道题一直是我的一块心病,没事儿就去看看提交的代码,想想哪里出错了,结果就在刚才,我发现了代码里的bug,返回值写错了。修改之后AC!

    AC时间是2017-03-03 17:14:23,一转眼都快四年了


2016年总结

    博客上线之后一直什么都不写总感觉怪怪的。

    2017年了,不写一份关于2016年的总结也感觉怪怪的。

    我决定把这两个问题一起解决了。


    今年发生了很多事情。

    感情方面,跟梅梅分手了,重新开始单身生活。

    收入方面,跳槽了,工资涨了不少,但是没有任何积蓄。还差十万块钱我就存够十万块钱了。

    工作方面,跳槽了。现在在凤凰网工作。新工作不加班,社会主义万岁!

    学习方面,技术上提升了不少,不过总感觉是起点太低的原因。

    读书方面,我一直想调节自己读书的节奏,比较理想的是看一本专业书,同时看一本或者两本其他自己比较感兴趣的书。简直就是个笑话。

    体重方面,又胖了。

    形象方面,保持稳定。

    生活方面,整体还是越来越健康的。老爸老妈退休了,小外甥出生。


   大概就是这样吧。

<< 1 >>