真的不懂,测试无能还让开发背锅,开发既开发又测试,那要测试干嘛,要么就把测试的钱给开发,开发开保证测试,服了
刚看到个贴子,说测试没测出来的 bug,结果开发要背锅。 这事在程序员圈子里真不稀奇,需求模糊、测试不足,最后总会归到“开发的问题”。
我觉得关键在于,测试和开发是配合关系,不是上下级。开发写代码像造房子,测试就是验房师。验房没发现问题,难道房子本身就没瑕疵吗?不能这么简单粗暴。网友有的说干脆取消测试,钱全给开发,我觉得也不现实。写代码和找漏洞,本来就是两种思维方式,缺一不可。
不过话说回来,背锅这事职场上很普遍。锅往下甩、责任往上推,谁都想置身事外。但从程序员的角度看,与其抱怨,不如在流程里留好证据:写清代码注释,提交记录详细,问题定位明确。这样就算要背锅,也能有理有据。
总的来说,开发和测试要互相尊重,别互相甩锅。团队协作才是最优解,毕竟软件上线出 bug,客户可不会管是谁的错。【备注:文末可领最新资料】
面试题:表达式求值
昨天晚上十一点多,在公司楼下吹风,手机里有人问我“(1+2)*3-4/2 这个怎么自己写代码算?”我当时还困得不行,但脑子里第一反应就是——别慌,规则就那几个:数字、运算符、括号,按优先级来。就是那个…怎么说呢…我们不造火箭,能跑对常见表达式就够。
你们知道吧,正常人算式子也是两步:先把乘除、括号处理掉,再加减。代码里也一样,用“两栈法”,一个放数字,一个放运算符。遇到数字就压数栈,遇到运算符就看优先级,能算就先算,不能算再压栈。遇到 ( 就先搁着,遇到 ) 就把括号里的都结清。这个流程很朴素,但稳定。
还有个小插曲——一元负号。比如 -3+5 开头那个 - 不是减法,是给数字带符号。判断方法也不难:当前是 -,且前一个是开头、左括号或别的运算符,那它就是一元负号,我们临时把它当成把下一个数取反的小操作。
defeval_expr(s: str) -> float:
# 去空白
s = s.replace(' ', '')
nums, ops = [], []
defprec(op):
return2if op in ('*', '/') else1
defapply():
b = nums.pop()
a = nums.pop()
op = ops.pop()
if op == '+': nums.append(a + b)
elif op == '-': nums.append(a - b)
elif op == '*': nums.append(a * b)
elif op == '/':
if b == 0: raise ZeroDivisionError('division by zero')
nums.append(a / b)
i, n = 0, len(s)
prev = None# 上一个token类型: 'num','op','(',' )', None(开头)
while i < n:
ch = s[i]
if ch.isdigit() or ch == '.': # 读数字(含小数)
j = i
while j < n and (s[j].isdigit() or s[j] == '.'):
j += 1
nums.append(float(s[i:j]))
prev = 'num'
i = j
continue
if ch in'+-*/()':
# 处理一元负号:当 '-' 出现在开头/左括号/其他运算符后
if ch == '-'and (prev in (None, 'op', '(')):
# 读取后面的数字或括号表达式:这里转化为 0 - x
# 更简单:直接压入0,再当作二元减法
nums.append(0.0)
ch = '-'
if ch == '(':
ops.append(ch)
prev = '('
elif ch == ')':
while ops and ops[-1] != '(':
apply()
ifnot ops: raise ValueError('mismatched parentheses')
ops.pop() # 弹出 '('
prev = ')'
elif ch in'+-*/':
# 清算比我优先级高或相等的
while ops and ops[-1] in'+-*/'and prec(ops[-1]) >= prec(ch):
apply()
ops.append(ch)
prev = 'op'
i += 1
continue
raise ValueError(f'bad char: {ch!r}')
while ops:
if ops[-1] == '(':
raise ValueError('mismatched parentheses')
apply()
return nums[-1] if nums else0.0
我刚才在地铁上随手测了下,eval_expr("(1+2)*3-4/2") 会给 7.0,eval_expr("-2*(3+4.5)") 会是 -15.0,看着还行。有人问精度问题?浮点嘛,会有一点点尾巴,金融那种就别这么玩,换 Decimal。
有两个地方老出事:一是括号不配对,别忘了最后清算时检查;二是连点小数,比如 1..2,上面代码会报错,正常的。还有除零,直接抛异常,别默默给个无穷,那调试会疯。
扫描一遍字符串,每个元素最多入栈出栈一次,时间 O(n),空间栈的高度也就 O(n)。挺省心的。好了不说了,我到站了,回头谁要支持幂次 ^ 或函数 max(…),在优先级表上加一行就能接上。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领