最近工作回顾

2019-03-02 23:55|来源: 网路

最近工作压力比较大,手头有四个项目的事要做,其中三个我是owner,这三个当中:一个在开创阶段;一个在稳定开发阶段;另外一个在维护阶段。

压力主要来自于开创阶段的A和稳定开发阶段的B。

首先,最重要的是时间不够,又要开发,有要support,作为owner,什么乱七八糟的事情都要操心,每次一个新的release出去吧,又要担心有没有regression,有没有breakage,时不时还得应付被惹毛了的用户的challenge - 真是操了卖白粉的心。

A项目进展速度不够快,因为B项目上花的时间多了些。虽然我想尽办法把B项目slow down下来,还是免不了被吸进去无数宝贵的时间,这主要要感谢一位国外同事L - 因为大部分时间都要帮他擦屁股。我是owner,项目出了事人家是指着我的鼻子骂的,所以我得非常小心,可惜的是刚好碰上了这么个“管杀不管埋”的主。

第一次帮他背黑锅的时候,我们的prod出了问题,我在医院的人,直接被用户老板的老板的老板电话催,于是乎道歉 - 调研 - Fix - 打patch。发现是L同学引入的问题,我之后发了封信给所有相关人员,强调了质量的重要性,我比较nice,并没有点名指出。显然,这个并没有效果。

第二次发现问题,是我准备prod前做了一些基本的测试时发现他引入了三个问题,一一fix之后,我和他比较客气的指了出来,惊奇的是这哥们一点”不好意思“的感觉都没有。其实我能忍受代码里有bug,但是帮他fix的三个问题都是简单的手工测试一下就发现的 - 这家伙根本连最基本的本地测试都没做。

第三次的问题,影响到了他们自己team,忘了提一下,这哥们是另外一个team的,因为他们team需要用到我们的项目,他主要负责那一块,所以也contribute到我们项目来的以满足他们team的需要。结果他们自己的项目要release了,连续三天release失败,每天基本的流程就是:我早上过来 - 他老板发现release失败找我帮忙 - 我发现是这哥们引入的问题(again,原本可以本地很容易发现的)- 帮他fix并release我们的项目(非prod) - 他老板重新做release。 连续三天啊,哥,连续三天!!! 最好我毛了(浪费老子多少时间,而且因为毕竟是我的项目,多少要背点黑锅),他老板也毛了,发了封言辞激烈的信给他 - 根据后来的情况来看,貌似也没啥效果。

这里值得一提的是,这哥们最后又犯了个错误,于是我发信质问了他一下,刚好他老板也在其中,竟然开始challenge起我来,护犊子的心理可以理解,可那个憋屈啊! 虽然我保持比较克制的语气,客观的把事说明白,但感觉还是被欺负了,无奈把自己老板也加了进来,才挽回一点局势。

第四次是最近的一个release,已经为这位兄弟的change做了两个patch了,马上要做第三次patch,问题是让他revert的那个change,他私自加了点东西,again,又是明显没有测试过 - 这次,我的语气明显重了,虽然我不觉的会有什么好的效果,但表明自己对他的担心还是必要的,也别管nice不nice了。

我和他说过,他老板和他说过,我的老板也知道这事,我实在想不出来我还有什么好的办法,如果L同学是report给我的,我想我可以好好的教育一下,或者实在不行,直接调离这个项目。可惜不是,在可预期的将来,I have to live up with him。看到李宗伟一次又一次输给林丹的时候,我想到一句话:总有人要带着遗憾活下去。其实生活中,工作中,总会有这样那样的问题没法解决,then be it,总有人要带着问题做下去,我能做得就是尽量减少damage:

  • 首先,不要情绪化,要比较平静的对待这种问题。
  • 加强流程控制,比如最简单的,每次submit,必须要有自动化测试,或者手工测试的列表。
  • 对这位同学的change,review的时候要格外仔细小心。
  • 问题透明化 - 谁引起的问题,如果不是十万火急,让大家知道是他引起的,并由他来fix。

时间实在不够用,最近需要花大把时间在A项目上(老板盯着,客户盯着呢),希望L同学在B项目上能给我少捅点娄子。

压力很大的时候,难免有些紧张、慌乱,我喜欢读读这句话:Life is not about waiting for storm to pass, it is about learning to dance in the rain,这是adsk裁员时一位同事farewell信里学来的,很是喜欢。其实,这句话的意思就是说要学会从容的带着问题、带着压力做下去。

 


转自:http://www.cnblogs.com/baiyanhuang/p/3365819

相关问答

更多
  • 在单元格C3中尝试以下公式: =IFERROR(SUMIFS(B:B,A:A,"<"&A3,A:A,">="&A3-10)/COUNTIFS(A:A,"<"&A3,A:A,">="&A3-10),0) SUMIFS将获得秒为的所有值的总和: 小于A3(在这种情况下小于2) 大于或等于A3-10(即在这种情况下高于-8) 并且此总和除以使用相同标准找到的行数。 如果现在有错误(更具体地说,当COUNTIFS返回0时,你会得到COUNTIFS #DIV/0! )你只是得到0而不是错误。 Try the fol ...
  • 这部分... ((?!hede).)* ...被读作'匹配任意数量的符号, 每个符号都不是hede序列的开头'。 换句话说,您设置的规则应与匹配的子字符串中的每个字符匹配。 在sasha hede ,只有s , a , s , h , a和 (空白)字符与描述匹配。 但是, h符号不会(它开始一个hede序列),因此必须在这里停止匹配。 顺便说一句,它与第一个模式(绑定到字符串的结尾)相同:匹配在模式排除的第一个符号处停止。 如果不是这样的话,整个字符串就会匹配,而不仅仅是ede 。 This part. ...
  • 如果你只是为你的NSNumber使用stringValue ,你几乎无法控制格式。 相反,您应该确保根据需要转换为正确的原始数据类型和格式: kgLabel.text = [NSString stringWithFormat:@"%.0f kg", number.floatValue]; // --> "23 kg" kgLabel.text = [NSString stringWithFormat:@"%.2f kg", number.floatValue]; // --> "23.43 kg" Yo ...
  • 阅读以下代码,你会得到一些想法...... 我使用StringBuilder在每次使用StringBuilder.append(JButton.getText()。toString())单击它们时存储Button的值。 这是在JButtons的actionPerformed方法中完成的。 然后最后在完成按钮actionPerformed方法中,我已经将字符串构建器保存在数组中。 PS我知道你正在使用16个JButton我只是简单地使用了3个... import javax.swing.*; import j ...
  • 这是一种方式(这是一个可运行的演示): import Reactive.Banana import Reactive.Banana.Frameworks import Control.Monad import Control.Applicative -- Needed if you aren't on GHC 7.10. desc addDriver = do -- Refreshes the button state. Presumably fired by external IO. e ...
  • 使用robocopy,它有一个参数,可以满足您的需求。 /MAXAGE:n :: MAXimum file AGE - exclude files older than n days/date. Use robocopy, it has a parameter for exactly what you want. /MAXAGE:n :: MAXimum file AGE - exclude files older than n days/date.
  • 正如Igy所说,从来没有任何文档声明这是一个API调用。 这不可能 As stated by Igy, there was never documentation anywhere that stated this was an API call. This is not possible
  • 我发现这可以帮助我构建我的替代解决方案: http : //excess.org/article/2012/04/paranoid-django-templates/ I found this which can help me build my alternate solution: http://excess.org/article/2012/04/paranoid-django-templates/
  • 后续导入从sys.modules提取缓存的模块引用。 您需要导入才能将模块添加到当前命名空间/范围。 Got it! Okay I found what I was looking for. I just found it clunky to have to re-import code I already imported, especially when the file isn't a library or something, just split up code. found it here: h ...
  • 您需要在运行时包含它,这意味着您必须遵循命名文件的约定,或者您必须拥有每个文件所在位置的大量数组。 假设SomeClass.php包含一个名为SomeClass的类,那么当你这样做时 new RetrospectionClass($className); 你会先做 include_once '../FilesDir/'.$className.'.php' You need to just include it at runtime, which means you have to follow a conv ...