当萧天收到来自曹庆阳发来的消息的时候,也是有点懵的状态。
你说你怎么接的悬赏现在一直有问题啊!
不过,毕竟是大学一个宿舍里面的哥们,所以萧天也是回复了过去。
天天:叫我一声爸爸,爸爸帮你搞定。
曹庆阳:别闹,跟你说认真的,我先传给你,到时候给我搞定一下。这个我真的找不出来好像,不只是一点头绪没有,关键是有的地方是看不懂的的,看不懂那我只能放弃了,总不可能让我瞎猫碰着死老鼠吧?
天天:我现在有点忙,等着吧,等有空的时候我帮你看一下行吧?
曹庆阳:行,有你这句话,我就放心了。
天天:滚蛋吧你。
萧天躺在床上,享受着张雪带来的服务。
吃的小脸蛋通红的张雪看着萧天聊天都能够聊出笑容,不由得有些好奇,“谁啊?”
“一个朋友,你也知道,曹庆阳,他又接了一个悬赏,听说是五千块钱的,没解决掉。我估摸着他是在拿我当苦力使唤呢。”萧天说着,当然当苦力就是一句玩笑话。
“那你帮不帮他呢,五千块钱悬赏应该算是简单的任务了吧,萧老板你应该能轻松解决吧?”张雪想着这件事情,也是有点觉得挺有意思的。
“那当然,我是谁?这么一个小悬赏肯定能解决的,不过曹庆阳那家伙毕竟是初级程序员了,一般来说这种悬赏应该是小问题的,但是竟然还没有解决,看样子这个悬赏有点坑啊。”
萧天说起这个也是稍微的认真了点,那毕竟是他的新能力大触级别的嘛。
张雪对于这一切自然是不知道的,她大学学的又不是这些,学的是传媒专业的,只不过没有从事传媒专业这方面的工作而已。
“算了,不说这些了,我们先乐呵乐呵。”
萧天实际上对这件事情没有太过于放在心上,毕竟只是一个小小的事情罢了,在曹庆阳的眼中可能是无法解决的难题,但是现在在他的眼中,其实也可能就是那么回事。
区区小问题,不足以挂齿。
“嗯,对了萧老板,我想问你一个问题啊,你喜欢女孩多一点还是喜欢男孩多一点?”
张雪也是突然的问道,萧天听着这个问题,简直是莫名其妙啊。
这个问题怎么回答呢?
当然是女孩子了,他又不是男同,但是……
萧天突然之间明白了什么,声音有些磕磕巴巴的。
“……有……有了?”
张雪看着萧天那个表情,也是笑了笑,不过还是点了点头。
“嗯……这个月一直没来我就发现有问题了。已经快一个月了……”
不是吧?
这么快就有了?
萧天愣了愣,快一个月了,那不就是上个月做的吗……
这……
倒也没有什么大事情,主要是张雪大着肚子,她父母怎么解决呢?
萧天有些惆怅了。
他现在可没有打算结婚的念头啊,头有些疼。
孩子当然得要了,毕竟是他的精华结晶。
张雪看着萧天的表情,也是捂嘴笑了笑,“骗你的,你还当真了。”
萧天的表情一瞬间又是放松了下去,然后翻了翻白眼,“吓我一跳,不过为什么要问男孩女孩的问题啊?”
“这不是问问嘛……你又不带那个东西,现在天天都要来几次,迟早都要怀上。”张雪白了萧天一眼。
萧天也是思考了一下,说的不错,不带那个东西,又天天日夜笙歌,那的确是很快就要怀着。
不过……
怀着就怀着吧。
萧天倒是不怕,他养得起,就是怕张雪会被人说闲话。
毕竟他现在给不了名分之类的东西。
想到这里,萧天也是朝着张雪露出一抹歉意。
张雪也是了解,他知道这个男人的想法,毕竟已经在一起不算短了,她还是能够猜透身边这个男人的心思的。
她是有一点遗憾,但是这是早就预料到的结果,倒还不至于太难过。
当然现在的气氛不打扰萧天再来一次白日宣音。
……
当百万雄兵战死沙场,萧天也是空闲了下来,所以萧天也是准备直接花费一点时间帮曹庆阳给搞定。
打开文件,萧天看着这个代码,陷入了沉思,他陷入沉思的原因不是因为这个修复漏洞很难,相反,很简单,萧天半个多小时就给它修复好了。
他感觉到的只是修改bug和找bug那真的是两个情况。
不过有些人也肯定很疑惑,出现bug是必然出现的情况还是程序员水平有限导致的?
这个嘛……仁者见仁,智者见智。
就比如这个——
print(“hello, world.“)
你看,这个“程序”就是没有bug漏洞的……
实际上但凡有过一点正式开发经验的程序员,写个简单的hello world都能写出bug的恐怕不多见吧。
别说hello world了,一个简单的、不涉及“隐秘”机制的百行小程序,绝大多数资深程序员也可以直接写成0 bug。
因为这些实际上是对计算机的原理深度决定的,比如你对计算原理或者语言机制理解越深,对你来说“隐秘”的东西就越少,写出高质量代码的机率就越高。
而且,就像黑土平台里面的交流板块哪怕只是在上敲一篇一千个字的灌水文,有几个可以保证无语法错误、无错别字且标点符号使用正确呢?
尤其这还是在机器替你写字,使得“提笔忘字”“书写错误”之类错误无法存在的前提下:这样你都不能保证全对……
那么不仅大小写敏感、而且逻辑更为曲折复杂、容不得半点含糊的计算机程序呢?
因此,有bug漏洞那真的是无可避免。
当然还有一种情况,你的程序本身是无bug的;但支持环境比较坑……
这种正常来说不算程序bug,当然实践中,你可能没办法坐等os或者浏览器等厂商修改——所以结果就是你只好积极行动起来,在自己的程序里为别人的错误擦屁股……
这在业界被称为workaround: workaround - wikipedia。
正常来说,workaround是临时的,并且,如果不是诸如0day之类特别关键、刻不容缓的问题,搞workaround往往是出力不讨好的——因为它包含了丑陋,易错,含糊,难以理解;而且等os或者浏览器等的原始厂商修了它自己的bug,你原本好好运行的workaround往往反而会引起问题。
尤其是,有时候os或者浏览器厂商修复速度比较慢、致使某种workaround反倒成为“主流技术”;那么当“正统”修复方案和workaround冲突时,os或者浏览器厂商往往不得不将错就错,以免捣毁那些用了workaround的实现……
这类复杂情况暂不讨论,提它主要是为了说明,搞清楚bug的真正发生点是极为重要的。
修不到bug的根源、滥用workaround,度过的是眼前的难关,牺牲的却是整个项目的稳固性。
类似的,尽量把程序写的“大众化”一点,没有必要不碰新特性,也可以在很大程度上避免“遭遇官方bug”问题——如果你自己理解上再有点偏差,用新特性就和作死无异了。
不过……
有的人敲字灌水都错字连篇,但是有人手写几十上百万字的小说,随便截一段都差不多能进语文课本……
所以,人与人还是有极大差别的。
不能因为“linus也写bug”甚至“linus也写过低级bug”,就认为“我写个一百个整数里找最大值的简单程序出三十个bug也是正常的”——初学者搞出这事,正常。
至于专业人员嘛……出一个都不正常。
不仅如此。
既然“写长篇出bug正常,发条短信就那么十几个字,错一个都不应该”;那么我们把长篇拆开成若干章,一章只写三千字呢?再把一章拆开成若干段,一段只写数百个字呢?
这就是为何写程序要先做模块设计、然后再把模块按职责拆分成类、类按功能拆分成函数、最后还要求一个函数不要超过一屏(大约80行)的原因了。
经过拆分之后,一个一个函数填写实现、然后再一个一个函数做单元测试,测完再组合起来搞功能测试、集成测试……
这样写程序,当然还是无法杜绝bug出现;但出bug的机率就微乎其微了。
而且程序和长篇小说不同。
小说里的角色,尤其是主角和主要配角往往是贯穿始终的,这就使得小说章与章之间存在很多内部联系;稍微搞不好就会导致前后失去呼应,比如主角一会儿伤在左手一会儿伤在右臂、或者前面挖个坑然后设个伏笔后面却忘了用,等等。
但是在程序里面,不同模块甚至不同函数之间,应该是毫无瓜葛的,每一个都可以摘出来独立成库——有瓜葛就说明用了全局变量或者静态对象,或者通过参数或者约定等传递了过多的东西——这就叫“低耦合”。
做到了“低耦合”,你就可以把一个复杂的大程序当一组简单的短文甚至短信写。
这样自然就很难出错了。
当然了,有些情况下,程序逻辑非常复杂且无法拆分,也就是所谓“无法约分的复杂性”,这种代码就必须端起十二分小心来,当然即便如此,bug出现率仍然要远高于其他代码。
一般来说,要把程序拆成“不可约分”的一组最小单元来写。
这个“不可约分”就是术语说的“高内聚”:这段程序只做一件事,这件事已经没法拆的更简单了,只能把它们放在同一段代码里一举解决掉。
因此,写程序时,事先的“谋划”非常重要。
一个有经验的资深工程师,可以在动手前就把一个复杂的大项目拆成一堆几乎互不关联的小程序,然后逐一实现它们、实现完再把它们组合起来就行了。
显然,“谋划”好了,一个程序的难度降低若干个数量级都是可能的。
说实话,在绝大部分能见到的软件中,都是或多或少的有bug的……
只不过,第一开发可能没想到,第二测试没测到,第三用户没碰到,第四客服的反馈没收到,那么——这就是一个“成熟稳健”的产品。
你说你怎么接的悬赏现在一直有问题啊!
不过,毕竟是大学一个宿舍里面的哥们,所以萧天也是回复了过去。
天天:叫我一声爸爸,爸爸帮你搞定。
曹庆阳:别闹,跟你说认真的,我先传给你,到时候给我搞定一下。这个我真的找不出来好像,不只是一点头绪没有,关键是有的地方是看不懂的的,看不懂那我只能放弃了,总不可能让我瞎猫碰着死老鼠吧?
天天:我现在有点忙,等着吧,等有空的时候我帮你看一下行吧?
曹庆阳:行,有你这句话,我就放心了。
天天:滚蛋吧你。
萧天躺在床上,享受着张雪带来的服务。
吃的小脸蛋通红的张雪看着萧天聊天都能够聊出笑容,不由得有些好奇,“谁啊?”
“一个朋友,你也知道,曹庆阳,他又接了一个悬赏,听说是五千块钱的,没解决掉。我估摸着他是在拿我当苦力使唤呢。”萧天说着,当然当苦力就是一句玩笑话。
“那你帮不帮他呢,五千块钱悬赏应该算是简单的任务了吧,萧老板你应该能轻松解决吧?”张雪想着这件事情,也是有点觉得挺有意思的。
“那当然,我是谁?这么一个小悬赏肯定能解决的,不过曹庆阳那家伙毕竟是初级程序员了,一般来说这种悬赏应该是小问题的,但是竟然还没有解决,看样子这个悬赏有点坑啊。”
萧天说起这个也是稍微的认真了点,那毕竟是他的新能力大触级别的嘛。
张雪对于这一切自然是不知道的,她大学学的又不是这些,学的是传媒专业的,只不过没有从事传媒专业这方面的工作而已。
“算了,不说这些了,我们先乐呵乐呵。”
萧天实际上对这件事情没有太过于放在心上,毕竟只是一个小小的事情罢了,在曹庆阳的眼中可能是无法解决的难题,但是现在在他的眼中,其实也可能就是那么回事。
区区小问题,不足以挂齿。
“嗯,对了萧老板,我想问你一个问题啊,你喜欢女孩多一点还是喜欢男孩多一点?”
张雪也是突然的问道,萧天听着这个问题,简直是莫名其妙啊。
这个问题怎么回答呢?
当然是女孩子了,他又不是男同,但是……
萧天突然之间明白了什么,声音有些磕磕巴巴的。
“……有……有了?”
张雪看着萧天那个表情,也是笑了笑,不过还是点了点头。
“嗯……这个月一直没来我就发现有问题了。已经快一个月了……”
不是吧?
这么快就有了?
萧天愣了愣,快一个月了,那不就是上个月做的吗……
这……
倒也没有什么大事情,主要是张雪大着肚子,她父母怎么解决呢?
萧天有些惆怅了。
他现在可没有打算结婚的念头啊,头有些疼。
孩子当然得要了,毕竟是他的精华结晶。
张雪看着萧天的表情,也是捂嘴笑了笑,“骗你的,你还当真了。”
萧天的表情一瞬间又是放松了下去,然后翻了翻白眼,“吓我一跳,不过为什么要问男孩女孩的问题啊?”
“这不是问问嘛……你又不带那个东西,现在天天都要来几次,迟早都要怀上。”张雪白了萧天一眼。
萧天也是思考了一下,说的不错,不带那个东西,又天天日夜笙歌,那的确是很快就要怀着。
不过……
怀着就怀着吧。
萧天倒是不怕,他养得起,就是怕张雪会被人说闲话。
毕竟他现在给不了名分之类的东西。
想到这里,萧天也是朝着张雪露出一抹歉意。
张雪也是了解,他知道这个男人的想法,毕竟已经在一起不算短了,她还是能够猜透身边这个男人的心思的。
她是有一点遗憾,但是这是早就预料到的结果,倒还不至于太难过。
当然现在的气氛不打扰萧天再来一次白日宣音。
……
当百万雄兵战死沙场,萧天也是空闲了下来,所以萧天也是准备直接花费一点时间帮曹庆阳给搞定。
打开文件,萧天看着这个代码,陷入了沉思,他陷入沉思的原因不是因为这个修复漏洞很难,相反,很简单,萧天半个多小时就给它修复好了。
他感觉到的只是修改bug和找bug那真的是两个情况。
不过有些人也肯定很疑惑,出现bug是必然出现的情况还是程序员水平有限导致的?
这个嘛……仁者见仁,智者见智。
就比如这个——
print(“hello, world.“)
你看,这个“程序”就是没有bug漏洞的……
实际上但凡有过一点正式开发经验的程序员,写个简单的hello world都能写出bug的恐怕不多见吧。
别说hello world了,一个简单的、不涉及“隐秘”机制的百行小程序,绝大多数资深程序员也可以直接写成0 bug。
因为这些实际上是对计算机的原理深度决定的,比如你对计算原理或者语言机制理解越深,对你来说“隐秘”的东西就越少,写出高质量代码的机率就越高。
而且,就像黑土平台里面的交流板块哪怕只是在上敲一篇一千个字的灌水文,有几个可以保证无语法错误、无错别字且标点符号使用正确呢?
尤其这还是在机器替你写字,使得“提笔忘字”“书写错误”之类错误无法存在的前提下:这样你都不能保证全对……
那么不仅大小写敏感、而且逻辑更为曲折复杂、容不得半点含糊的计算机程序呢?
因此,有bug漏洞那真的是无可避免。
当然还有一种情况,你的程序本身是无bug的;但支持环境比较坑……
这种正常来说不算程序bug,当然实践中,你可能没办法坐等os或者浏览器等厂商修改——所以结果就是你只好积极行动起来,在自己的程序里为别人的错误擦屁股……
这在业界被称为workaround: workaround - wikipedia。
正常来说,workaround是临时的,并且,如果不是诸如0day之类特别关键、刻不容缓的问题,搞workaround往往是出力不讨好的——因为它包含了丑陋,易错,含糊,难以理解;而且等os或者浏览器等的原始厂商修了它自己的bug,你原本好好运行的workaround往往反而会引起问题。
尤其是,有时候os或者浏览器厂商修复速度比较慢、致使某种workaround反倒成为“主流技术”;那么当“正统”修复方案和workaround冲突时,os或者浏览器厂商往往不得不将错就错,以免捣毁那些用了workaround的实现……
这类复杂情况暂不讨论,提它主要是为了说明,搞清楚bug的真正发生点是极为重要的。
修不到bug的根源、滥用workaround,度过的是眼前的难关,牺牲的却是整个项目的稳固性。
类似的,尽量把程序写的“大众化”一点,没有必要不碰新特性,也可以在很大程度上避免“遭遇官方bug”问题——如果你自己理解上再有点偏差,用新特性就和作死无异了。
不过……
有的人敲字灌水都错字连篇,但是有人手写几十上百万字的小说,随便截一段都差不多能进语文课本……
所以,人与人还是有极大差别的。
不能因为“linus也写bug”甚至“linus也写过低级bug”,就认为“我写个一百个整数里找最大值的简单程序出三十个bug也是正常的”——初学者搞出这事,正常。
至于专业人员嘛……出一个都不正常。
不仅如此。
既然“写长篇出bug正常,发条短信就那么十几个字,错一个都不应该”;那么我们把长篇拆开成若干章,一章只写三千字呢?再把一章拆开成若干段,一段只写数百个字呢?
这就是为何写程序要先做模块设计、然后再把模块按职责拆分成类、类按功能拆分成函数、最后还要求一个函数不要超过一屏(大约80行)的原因了。
经过拆分之后,一个一个函数填写实现、然后再一个一个函数做单元测试,测完再组合起来搞功能测试、集成测试……
这样写程序,当然还是无法杜绝bug出现;但出bug的机率就微乎其微了。
而且程序和长篇小说不同。
小说里的角色,尤其是主角和主要配角往往是贯穿始终的,这就使得小说章与章之间存在很多内部联系;稍微搞不好就会导致前后失去呼应,比如主角一会儿伤在左手一会儿伤在右臂、或者前面挖个坑然后设个伏笔后面却忘了用,等等。
但是在程序里面,不同模块甚至不同函数之间,应该是毫无瓜葛的,每一个都可以摘出来独立成库——有瓜葛就说明用了全局变量或者静态对象,或者通过参数或者约定等传递了过多的东西——这就叫“低耦合”。
做到了“低耦合”,你就可以把一个复杂的大程序当一组简单的短文甚至短信写。
这样自然就很难出错了。
当然了,有些情况下,程序逻辑非常复杂且无法拆分,也就是所谓“无法约分的复杂性”,这种代码就必须端起十二分小心来,当然即便如此,bug出现率仍然要远高于其他代码。
一般来说,要把程序拆成“不可约分”的一组最小单元来写。
这个“不可约分”就是术语说的“高内聚”:这段程序只做一件事,这件事已经没法拆的更简单了,只能把它们放在同一段代码里一举解决掉。
因此,写程序时,事先的“谋划”非常重要。
一个有经验的资深工程师,可以在动手前就把一个复杂的大项目拆成一堆几乎互不关联的小程序,然后逐一实现它们、实现完再把它们组合起来就行了。
显然,“谋划”好了,一个程序的难度降低若干个数量级都是可能的。
说实话,在绝大部分能见到的软件中,都是或多或少的有bug的……
只不过,第一开发可能没想到,第二测试没测到,第三用户没碰到,第四客服的反馈没收到,那么——这就是一个“成熟稳健”的产品。