碎碎念

    算算时间,来百度三个多月了。一直想写点儿什么东西,但是太忙,没时间,也不知道写啥。

    一直到现在,在饭点儿开一个很没意思的会。

    我在旁边噼里啪啦敲键盘,不时抬头看下投影,不知道与会的其他同学会不会认为我是在做笔记。

    过去的几个月可能是我入职以来压力最大的几个月,压力很大。在一个很高强度的环境里不停地调整工作方法、工作方式。

    嗯……会开了一半,一会儿走一个,现在走了快一半了。

    刚才有个同学也撤了,突然大家都发现人不知不觉少了一半还多,气氛突然很僵。

    有个 PM 想在任务中心入口处增加一个红点,这就是传说中的红点产品经理?

    我也想去吃饭。    

跳槽记录

    今天终于非常不顺利的在百度入职了,早上出门下大雨,鞋子出门之后直接湿透,然后记错了入职地点,跑到科技园这边(应该是在百度大厦入职),然后发现打印好的身份证复印件忘带了,好不容易材料都交了之后来到科技园这边,又发现工卡没给我,骑着自行车回百度大厦拿工卡。过程很艰难,但是总算是入职了。

    这次换工作的经历也是波澜诡谲。刚开始的时候,考虑到我当时工作比较忙,没有认真准备面试,而且这次跳槽自我预期比较高,所以第一轮投了罗辑思维、美图、贝壳和百度四家公司想先尝试一下。

    面试罗辑思维的过程非常愉快,一面感觉主要考察代码方面的能力,面试官问了我一些简单的问题,其中问到一个简单算法该怎么考察,我看旁边有个白板,就直接在上面边写边把算法实现了;二面和三面聊的东西不多,问了一些工作经历,写了一点儿简单代码,然后就结束了。整个过程大概两个半小时。在离开的时候碰见了大学同学,也在那里工作。

    面试完罗辑思维的下午去面试的美图,美图的面试考察了很多概念性的东西,面试的很多问题都是在随便什么面试攻略上都会看到的题目,然而我完全没有准备,所以回答的不太好。其中二面的面试比较奇怪,面试官表现出了非常强烈的攻击性,基本上是一直在用一种怀疑的眼光面试我。最后面试也都给过了,但是没有发 offer。

    面试过了两天,罗辑思维 HR 给我打电话谈待遇的事情,待遇完全超出了我的预期。当时让我兴奋的不行,给家里打电话,给朋友发消息,找 ah 分享。

    在考虑了一天之后,我觉得罗辑思维还是不太符合我这次跳槽的要求,所以在考虑了很久之后,最终还是拒绝了这个 offer。

    之后面试了贝壳,贝壳面试非常顺利,先是面了两轮,面试完隔了几天又面试的第三轮和 HR 面。跟贝壳面试比较投机,沟通待遇的时候要的也不低,贝壳也同意了。但是 HR 说我的要求需要走特殊申请,希望在我全部面试结束之后再开始走这个流程。

    在面试完罗辑思维、美图和贝壳之后,我基本上确定了我的能力在市场上确实比我想象的要好一些,我这次的预期应该可以达到。

    然而接下来的面试就比较坎坷了。

    接下来面试的是百度,感觉面试百度的时候被虐的很厉害,但是在面试结束之后还是拿到了 offer。因为我这次跳槽是 BAT 优先,结果导致我面对 BAT 的时候总是有点儿过于紧张。虽然百度的 offer 拿到了,但是待遇谈的不是很理想。

    之后又面试了腾讯,腾讯的面试给我的感觉算是所有面试里面比较简单的一个。吸取了百度的教训,我在跟腾讯沟通的时候对待遇要求高一些。在面试腾讯的时候其实还是稍微有一些不满意的地方。第一、其中一些问题没回答好;第二、整个面试过程感觉不怎么正式;第三、工作内容我不太喜欢。特别是第三点,基本上在聊过之后,我就已经比较倾向百度了。

    腾讯之后又面试了微博,微博的面试很有意思,做了一套题目,然后感觉面试没有聊很多东西,就进入了谈待遇的环节。在问了我之前面试的结果和对待遇的要求之后,就直接跟我说这个岗位满足不了我的要求,就不耽误我的时间了。也算是干脆。

    腾讯最后还是没给 offer,感觉上好像在最后下决心的时候遇到了更好的候选人。

    在这些面试之后,我基本上确定了要去百度。当时我整理了一下面试心得,发现我把很多问题都想复杂了。其实大部分面试问题的思路依旧是基础理论知识的延伸。内存小了压缩,数据大了分治,有一大类问题在抽象之后会发现问的都是进程间通信。大部分问题都可以通过基础知识推出解决方案。奈何我面试的时候不够自信,总是怀疑是不是这些问题背后有什么黑科技,其实哪有那么多黑科技。

    在决定接了百度的 offer 之后,我发现手头还有最后一场滴滴的面试,想想离确认 offer 还有几天,就干脆去面试一下。面试滴滴是我在这次所有面试经历中相对满意的一场,面试的题目达到了一定的水准,我也都能够根据自己的理解给出一个解答。整个面试过程我还是很满意的。

    波折来自于 HR 环节,在跟 HR 沟通待遇的时候,滴滴不愿意给出比百度更高的待遇,而且跟 HR 的沟通不是很愉快,最后没达成协议就终止了面试。我回去也确认了百度的 offer。第二天,似乎是面试官对我评价还可以,HR 又打电话给我愿不愿意再考虑一下,说薪酬和工作内容还可以谈。但是当时我已经确认了百度的 offer,就拒绝了。

    关于这次跳槽想法还挺多的,首先是在技术层面上发现大部分问题都可以在抽象之后都可以从基础理论中找出解决答案,没有那么多黑科技;第二是发现一些比较有意思的现象,比如说很多公司其实没有能力对我定价,有几家公司给我的待遇是按照其他家给我的待遇比着来的;第三是发现有些公司的面试也没能力面试出我的真实水平,感觉这些公司的 offer 我甚至可以通过简历加上一些很基础的知识就拿下。第二点和第三点放在一起,突然就明白行业内为什么会有那么多混子并且越混越好。

    还有另一个需要注意的地方,有好几家公司的面试安排的特别慢,甚至有些在我简历投过去两三周之后才给反馈的。有的公司我投了多个岗位,连着一两周没有反馈,然后突然一天几个 HR 打电话约面试(不止一家)。这个需要在以后面试的时候特别留心。

办公自动化在日常工作中带来的一些限制

    突然产生的一些想法,感觉还是值得记录一下。

    现在一个企业中大部分工作都开始使用计算机取代,大部分员工工作的内容就是操作各种各样由技术编写的系统。通常我们认为这是一种进步,因为系统极大地提高了效率,并且在安全和防止员工腐败方面都有良好的效果。

    但是另一方面,系统相当于在数据和数据使用者之间增加了一层代理。在没有系统的年代,很多数据甚至就直接是数据使用者收集整理的,数据使用者对于数据非常敏感,通常能够通过数据一些细微地变动来获得一些非常规的信息。

    可是有了系统之后,数据使用者离数据的距离其实变远了,先不说不能像以前那样更加细致的接触和观察数据,哪怕是想生成一些独特的报表都会是很困难的一件事情。因为这需要技术支持,但是让技术定制一些内容从来就不是一件简单的事情。

    简单来说,就是办公自动化或者说系统对各种常规业务能够提供良好的支持,但是实际工作中有很多东西是非常规的,可能只有当事人明白,甚至当事人都不明白只是心里有些感觉。比如说考勤系统帮助管理人员更好的了解员工的出勤状态,但是出勤状态很多时候不等于工作状态。而如果管理人员与员工比较多的接触,对于员工工作状态的把握是考勤系统所不能比拟的。

   还有一点就是,系统固化了业务流程,增加了业务流程变动的难度,容易使一家企业的业务流程变得僵化。因为经常性的,调整业务容易,修改系统难。

   总结一下,办公自动化提高了办公效率,对于常规业务流程提供了良好的支持,但是同时限制了工作中各种非常规或者无法抽象的内容,也容易使企业的组织架构和业务流程变得僵化。

2017年终总结

    拖了好久,一直觉得应该想清楚了再写。

    再想2018年的夏天就快到了。

    大概在年初的时候,开始试着炒股,最后好像亏了两千块钱?记不太清了。

    之后了解到了数字货币,在四五月份的时候入场,一番操作之后好像又是亏了两千块钱?

    在六月份的时候忙了不到一个月,开发了一个很小的功能,结果应该是因为这个很小的功能,我的年中考核居然得了一个A,然而工资没涨多少。

    家里突然要买房,所有钱取出来加上借的一些都打过去,借的钱一直到十一月份才全还清。

    然后又重新把注意力放在股市,一番操作下来,到今天为止,又赔了两千块钱。

    中间几度想重新搞数字货币,但是后来慢慢意识到,虽然我什么东西都玩,但是投资风格其实偏保守。然后又几度想买空。一直到看到这么一段话:

    “比特币泡沫不过是疯狂投机的一个最新化身。历史上疯狂投机时不时地会冲击金融市场,如1637年的‘郁金香狂热’、2000年的互联网泡沫等。没人能预言投机风潮的持续时间长短和顶部在哪里。正如凯恩斯告诉我们的:‘市场非理性的时间可以长到让你破产。’因此,只有一件事能做了:坐在河边看,总有一天,比特币的尸体会从你面前漂过”。

    现在还在关注,但是如果没有什么特别的原因,暂时是不打算再玩了。

    年底的时候公司团建去柬埔寨玩,点亮了出国这个成就。

    还蛮怀念在柬埔寨那几天的。

    在十一月底,开始凤翼的开发。开发凤翼对我来说是17年最重要的一件事情,虽然过程槽点满满。

    我之前一直担心在凤凰呆久了会不会就没办法适应高强度的工作,结果我在一个多月时间内连续加班,工作强度远超之前开发E快帮。

    通过凤翼这个项目,我对技术、团队和自己的职业发展都有了很多思考和想法,以后有机会单独写成博客。

    年终考核我还是A,技术职级从初级升到中级,还得到了一次额外调薪,比我年中的时候涨得还要多,还拿到了公司的“优秀员工”,年终奖金我也挺满意。

    开发凤翼的过程波折很多,但是带来的回报也非常丰厚。

    去年技术上的提升其实也还行,收入上大概一年涨了50%,受到了很多冲击,主要是对很多事情的看法改变了。

    17年我的改变还是挺多的,但是很多改变又不方便宣之于口。

    就这样吧,2018年加油!

    

编写干净的代码

    在开发凤翼的过程中,我有一种自己代码写得很脏的感觉。这种感觉源自于代码中的重复逻辑,混乱的接口定义以及同事之间不同的编码规范等等。因此我写下这篇文章总结一些在开发中的反思和经验。

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

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

    有时候为了让代码写得更加精简,将会不可避免的使用一些稍微复杂或偏僻的语法和编码方式。比如说嵌套的三元表达式,或者使用递归处理一些转化输出。在之前我一直避免使用这些工具,因为担心会增加代码的维护难度,但是现在我的观念逐渐改变,关于这些改变后文会有阐述。

    (写到这里我有一个很有趣的想法,我将该文分成了若干个小的主题,在第一个主题的最后一句,我写到“这些改变后文会有阐述”,如果从代码的角度来考虑,这应该是一个不好的实践,因为增加了不同主题之间的耦合)

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

    在项目中经常出现的一个情况就是,虽然不知道这种东西具体有用,但是看起来好像有用,那就先保留吧。典型的,数据表中status描述的冗余的状态。

    这种无谓的谨慎会极大的增加代码维护的难度。想象一种接口对参数进行验证的场景,对参数的同一种逻辑验证分布在整个嵌套调用的若干个接口中,在代码编写的时候这甚至会被视为是写代码足够谨慎,增加了代码的健壮性,但是在后期维护的时候,一旦这个验证的逻辑出现变动,将会为后来者带来极大的困惑。在我参与维护的iams系统中,这个问题出现的非常频繁。

    很多冗余的麻烦在于,它并不是某个程序员本身注意就能避免的,这个问题需要在设计的阶段就应该关注,尽可能将接口之间的调用变的清晰,对于每一种不同的状态有足够清晰的描述。如果在设计阶段没有理清,在开发阶段想避免冗余会是一件很困难的事情。

    3. 小心设计,大胆重构

    从我工作到现在为止,我印象比较深刻的代码重构一共有三次:第一次是在香果开发薪资表功能时重构后端代码;第二次是在旺店通时重构E快帮的控制器,将 Controller 层和 Model 层分离;第三次是在凤翼中重构资源包模块。

    在这三次重构中,第一次并没有太大意义,因为我当时只知道我的代码是错的,但是并不知道什么是对的,重构之后代码只是换了一种错误的方式;第二次重构意义重大,在那次重构中我第一次理解了代码模块化的意义,也对MVC模式有了一个直观的概念,而且在项目后期,这次重构表现出了很大的价值,如果没有这次重构,很难想象E快帮最终能够开发完成;第三次重构是迫不得已,源自于早期设计的错误,基于原来的设计继续开发基本不可能,只能将相关模块重写。

    三次重构的共同点是都极大地增加了我的工作量,三次基本上都是加班加点才勉强完成。但是从结果来看,代码重构大部分情况下能够带来非常积极的结果。在这里我形成了一种完全基于实践得到的观点:代码的设计一定要足够小心,因为后期一旦暴露出设计上的问题,将会给开发人员带来非常大的工作量;在开发过程中,对于自己单独负责的模块,一旦发现原有的设计出现问题,就应该马上分析解决,如果有需要,可以立刻着手设计重构的方案,否则一团糟糕的代码和另一团糟糕的代码结合在一起,糟糕程度不是 a+a=2a,而是 a^2。

分享问题

    在学校搞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,一转眼都快四年了


<< 1 2 >>