方宜晴回去的这段日子曾祥宇既轻松又无聊,平时上班忙忙碌碌的还好点,一到周末竟然觉得有些寂寞。之前方宜晴在时,他有时还有点烦她老缠着他要逛街,现在方宜晴不在身边,大把的时间在手里,他反倒没心思干活了。
这天邱美娜把新发的版本更新到测试环境里,刚开始测了没多久就发现系统出错走不下去了。按照计划,内部版本经过两周两轮测试之后就要发布给客户,现在刚开始就出现问题,搞得质量经理高莹颖极为恼火,拉着张海涛召集整个项目组的人员立刻开会。
在这之前研发人员已经知道系统出问题的事,大家把代码翻看了一遍,最终定位到问题出在秦佳仪负责的一个软件模块里。开会的时候叶鹏作为技术经理报告了问题产生的原因,秦佳仪一脸平静地听完,然后说:“问题出在我负责的模块里,是我的工作没做好,我愿意承担责任。”
高莹颖冷笑道:“一句工作没做好就完了?就因为你的问题导致整个项目的发布时间要推迟三天,所有人都要停下来等你,这个责任你担得起吗?”
高莹颖为人刻薄,但工作严谨认真,自己的工作从不出错,因此对别人的要求也很严格。这次的问题的确是研发人员的失误导致的,面对她的严厉质问,所有在座的人都哑口无言。
沉默了一会,张海涛说:“事情既然已经发生了,只能按照发生了来处理。研发组尽快修正代码错误,重新发版本,争取把损失的时间尽量补回来。”高莹颖说:“说得轻巧,你又不是不清楚,这不是简单的改下代码的事情。所有的文档和审批流程都得重新走一遍,没有三天你做得完吗?”
她说的没错,按照公司的正常流程,软件发布之后测试完成要出测试报告、分析报告等好几份文档,即便测试没通过,这些文档也都是要出的,并且需要层层审批。新版本除了发布程序包,还要更新发布报告,测试计划等,又要层层审批。高莹颖出身外企,对流程的要求极为严格,这次的事故不可能因为要节省时间就在流程上放水。
张海涛的语气没有任何变化,还是那么平静:“新版本发布最多需要半天,文档的事情可以同步进行,大家辛苦一下加加班,我来督促各个审批环节的领导第一时间回复,应该可以节省一到两天时间。”
高莹颖似乎还不想就此罢休,问道:“那损失的时间怎么办?责任不追究了?”张海涛提高声音说:“那你想怎么办?”高莹颖看了秦佳仪一眼,说:“才来公司个把月的人,你就敢把这么重要的开发任务交给她做,领导要追问下来的话,你去解释。”张海涛说:“当然是我来解释,有责任我担着,本来就没打算让你负责。”
高莹颖被张海涛罕见的强硬态度噎住了,一时间想不出什么话来反击,只好一言不发,怒气冲冲地瞪着张海涛,会议室的气氛瞬间变得凝重起来。
秦佳仪突然说到:“这事跟张总没关系,都是我做事不认真才出了这么大的纰漏,我甘愿认罚。对不起大家了。”说完她站起身来对着大家深深地鞠了一躬,又一脸的平静坐回到座位上。
曾祥宇看过那段出问题的代码,其实是个很低级的错误,是他之前在处理那个模块的问题时发现有个内部使用的数字签名里包含了软件的版本号,他想着下次发布的时候版本号肯定要更新,这么小的改动很容易被忘掉,因此随手就把版本号从3.1.1改成了3.1.2,这样新版本发布的时候就可以少改一处代码。
没想到这个内部的版本号根本不需要随着新版本的升级而更新,反而一旦更新之后进行数字签名验证时,服务端和客户端的版本号不匹配导致签名失败,从而影响到后续的一系列操作都不能正常进行。
工作移交的时候因为疏忽,曾祥宇并没有对秦佳仪提起这个改动,而秦佳仪因为后续的开发工作没有牵扯到这块的代码改动,接手的时间又不长,也没有意识到曾祥宇的改动有问题。
曾祥宇深悔自己太过大意,以为代码全都读懂了,太过得意忘形,其实自己还有很多地方根本没有完全吃透。出了问题不仅影响到项目进度,就连秦佳仪也无辜受到了牵连。
例如,如果我们defc=(foo)p"hello"endc=3c=(3)并且不会打印“hello”。我知道它可以被self.c=3调用,但为什么呢?可以通过哪些其他方式调用它? 最佳答案 c=3(和c=(3),完全等同于它)总是被解释为局部变量赋值。你可能会说只有当方法c=没有在self上定义时,它才应该被解释为局部变量赋值,但是这有很多问题:至少MRI需要在解析时知道在给定范围内定义了哪些局部变量。但是,在解析时并不知道给定的方法是否已定义。所以ruby直到运行时才知道c=3是否定义了变量c或者调用了方法c=,这意味着它不会知
我试图定义一个带有方法的类,以及一个缺少这些方法的类,然后允许后一个类的对象从前一个类的实例“学习”这些方法。这是我的尝试(Ruby1.9.2)-当我尝试更改lambda绑定(bind)中“self”的值时,它中断了(在注释为“BREAKS!”的行处)。如果您能想出如何解决这个问题-我很想知道。classSkillattr_accessor:nameattr_accessor:techniquedefinitialize(name,&technique_proc)@name=name@technique=lambda(&proc)endendclassPersonattr_access
目录一、什么是Websocket二、WebSocket部分header介绍三、HTTPVSWebSocket四、什么时候使用WebSockets五、关于SockJS和STOMP一、什么是Websocket根据RFC6455标准,Websocket协议提供了一种标准化的方式在客户端和服务端之间通过TCP连接建立全双工、双向通信渠道。它是一种不同于HTTP的TCP协议,但是被设计为在HTTP基础上运行。Websocket交互始于HTTP请求,该请求会通过HTTPUpgrade请求头去升级请求,进而切换到Websocket协议。请求报文如下:GET/spring-websocket-portfoli
我使用Nokogiri如下:require'nokogiri'require'open-uri'#GetaNokogiri::HTML::Documentforthepagewe’reinterestedin...doc=Nokogiri::HTML(open('http://www.google.com/search?q=sparklemotion'))但是我不好,可能是由于公司的防火墙,我得到了错误:C:/Ruby193/lib/ruby/1.9.1/net/http.rb:762:in`initialize':getaddrinfo:Nosuchhostisknown.(Sock
我们如何访问那些与byebug保留名称冲突的变量名称?(byebug)varlocalh={"hierarchyId"=>"59f0b029e4b037ef11a055f7","level"=>2,...self=(byebug)我想访问变量“h”但键入h会显示“byebug的帮助对话框”(byebug)hbreak--Setsbreakpointsinthesourcecodecatch--Handlesexceptioncatchpointscondition--Setsconditionsonbreakpointscontinue--Runsuntilprogramends,hi
2022年伊始,默安科技联合数世咨询举办以“软件供应链安全的时与势”为主题的访谈活动,由数世咨询创始人李少鹏主持,邀请贝壳安全研发负责人李文鹏、北京邮电大学副教授张文博、默安科技副总裁沈锡镛三位行业大咖做客网安小酒馆,从产业、企业、学术的不同维度,共同探讨软件供应链安全建设的新思路,为业界呈现了一场开年网安盛宴。随着全球软件供应链安全事件频发,软件供应链安全逐渐成为业界关注焦点,也成为影响国家重要信息系统安全与关键信息基础设施安全的重要因素,以及网络安全保障体系和能力建设的重要环节。嘉宾们围绕软件供应链安全发展的主要驱动力、关基行业中的实施现状和落地难点、产学研成果转化、软件供应链安全的重要性
在Ruby中,创建一个新类时,我们会这样定义构造方法:classThingdefinitializedo_stuffendend但是,当实际创建对象的实例时,我们发现自己不是在实例上调用initialize,而是在类上调用new。既然如此,我们为什么不定义::new?classThingdefself.newdo_stuffendend::new在initalize没有定义的场景后面有什么东西吗?这两者完全不同吗?定义::new会起作用吗?或者只是definitialize比defself.new更短(不是)?我认为这种差异一定有充分的理由。 最佳答案
我一直在关注这篇文章以与工头一起设置puma:https://www.digitalocean.com/community/articles/how-to-set-up-zero-downtime-rails-deploys-using-puma-and-foremanpuma脚本在连接后告诉verify_active_connections!但它在rails4中不可用。注释掉方法调用将使脚本运行但我不确定这是否会泄漏资源.关于这个问题,我能看到的唯一文档是:https://github.com/socialcast/resque-ensure-connected/issues/3但是
我使用Rails已经4年多了,所以很明显我喜欢Rails并且喜欢按照Rails方式做事,但有时我会在不知不觉中陷入阴暗面。我最近学习了UncleBob的CleanCode。我在看第6章,有点困惑我们作为Rails开发人员是否违反了OO设计的最基本规则,即Demeter法则或封装?得墨忒耳法则指出,一个对象不应该知道另一个对象的内部结构,也不应该调用方法返回的对象的方法,因为当你这样做时,它表明一个对象对另一个对象了解太多。但我们经常从一个模型中调用另一个对象的方法。例如,当我们有像“订单属于用户”这样的关系时。然后很多时候我们最终会执行order.user.name或者为了防止它看起来
在Rails中,当我们使用Logger类时,我们总是在block中定义而不是String-Rails.logger.error{error.message}不是按照下面的方式-Rails.logger.error"error.message"背后的原因是什么? 最佳答案 查看此处的文档:ImpactofLogsonPerformanceAnotherpotentialpitfallisthatifyouhavemanycallstoLoggerlikethisinyourcode:logger.debug"Personattribu