4名程序员泰国维护赌博网站,月薪32万,结果很刑
刚刷到个新闻,说泰国抓了4个中国程序员,帮跨国赌博网站写程序和维护系统。旅游签证变学生身份掩护,结果还是被查出来。月薪5万美刀,加上奖金折合下来一个月30多万,确实比国内搬砖香太多。
作为程序员看这个事,我第一反应是真心感慨:技术本身无罪,怎么用才关键。写网站、做系统,本来就是我们日常的活儿,但一旦用在违法的地方,哪怕钱再多,也是在给自己挖坑。网友有的说“干两年财务自由”,但我觉得自由的前提是安全和合法,否则这叫提前把自己送进去。
从价值角度讲,技术人最大的价值不是赚快钱,而是持续积累技能和口碑。赌博平台的钱,就像是拿火在手里取暖,热得快,也烫得快。
总的来说,赚钱重要,但更重要的是要走正路。【备注:文末可领最新资料】
面试题:基于时间的键值存储
昨晚十一点多,我在公司楼下啃串儿,手机一震,小李问:东哥那个…基于时间的键值存储咋写?我一愣,这不就是给同一个 key,按时间戳存多份值,取的时候给我“≤查询时间”的最新那份嘛。嗯…脑子里过一遍思路先说人话版:同一把钥匙有一排快照,时间只会往前走,我们就得在这排快照里“靠右地”找到不超过查询时刻的那一个。对,就是二分,别线性扫,慢得很。
就是那个…容器用 dict,key 对应一条按时间升序的列表,列表里放 (ts, val)。写入时直接 append,读的时候用“右边界”二分(bisect_right),下标回退一格就是答案。为什么右边界?因为等于查询时间也得算命中,右边界会指向“第一个大于查询时间的位置”,往左一步正好。等等我先接个电话…好,继续说,时间戳如果乱序?要么外面保证递增,要么我们也能插入到正确位置,但插入会挪动元素,整体就不如约定“同 key 写入时间递增”高效;面试里一般默认递增,我这份代码也做了简单兜底。
from bisect import bisect_right
from collections import defaultdict
classTimeMap:
def__init__(self):
# key -> list of (timestamp, value),时间单调存放
self.store = defaultdict(list)
defset(self, key: str, value: str, timestamp: int) -> None:
arr = self.store[key]
# 常见题目保证同一 key 的写入 ts 递增;这里做个轻量兜底
ifnot arr or timestamp >= arr[-1][0]:
arr.append((timestamp, value))
else:
# 不递增也能用,但写入是 O(logN + N);面试可直接说明假设递增更优
i = bisect_right(arr, (timestamp, chr(0x10FFFF)))
arr.insert(i, (timestamp, value))
defget(self, key: str, timestamp: int) -> str:
arr = self.store.get(key)
ifnot arr:
return""
# 右边界:第一个 > (timestamp, +∞) 的位置
i = bisect_right(arr, (timestamp, chr(0x10FFFF))) - 1
return arr[i][1] if i >= 0else""
tm = TimeMap()
tm.set("feat", "v1", 1)
tm.set("feat", "v2", 3)
print(tm.get("feat", 2)) # v1
print(tm.get("feat", 3)) # v2
print(tm.get("feat", 0)) # ""
你们知道吧,读多写多的系统,最怕不稳。这里写入摊还 O(1)(递增时),查询 O(logN)。空间嘛,所有快照都要存,就是 O(total_versions)。坑点三个:第一,等于查询时间要命中,用右边界;第二,没有小于等于查询时间的版本要返回空串,别抛错;第三,同一时间戳多次 set,右边界会把它们视作“相同 ts 的一段”,我们插入顺序保证最后一条覆盖之前的,取值就是最新那个——挺符合直觉。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领