Project Loo:我一生中最浪费时间、最精彩、最过度设计的项目
在我之前的公司 BreezoMeter,我们遇到了一个问题,但这不是软件架构问题、代码困境或文化问题。
问题是...... [提示史酷比音效 - DAM DAM DAM] - 浴室。
问题
当我们只有 8 个人的时候,我们的办公室还很棒,但随着时间的推移,我们的员工数量增加到 40 多人,但同一个办公室只能共用两个卫生间。
现在,我知道你在想什么,那些被宠坏的工程师可能每个人都希望有一个私人隔间;但我向你保证,事实并非如此,更糟糕的是,从我们的办公桌到浴室门没有直接的视线,所以我们无法知道它们什么时候是空的。
我们决定必须找到解决这一问题的方法,以便人们可以随时方便,或者至少在卫生间空置时得到通知。
并非每一项发明都需要改变世界;有时,它足以改变一个人的世界。——
Shahar Polak
解决方案
每隔几个月,我们都会举办“实验室日”——小型黑客马拉松,我们可以在其中尝试新技术、摆弄想法,并在日常工作中没有太多互动的团队中进行这些活动。
我和我的队友西蒙 (Simon) 考虑将这些摊位连接到内部网络,每个摊位都应该这样做。
我们知道时间至关重要;我们有两天的时间来制定计划,购买所需的所有设备,安装硬件,编写软件,并确保一切都按预期进行。
建筑
经过深思熟虑,我们决定使用 Google Firestore 的实时数据库来记录浴室门的状态。
我们创建了一个 Vue.js Web 应用程序来向用户显示门的状态并连接到 Firestore。
我们添加了 Cloud Functions,以便我们也可以将其与 Slack 集成。
最后,我们创建了工作者,以便用户能够订阅并在状态发生变化时收到通知。
我有没有提过我们只有两天时间来完成这件事?我知道,这很雄心勃勃。
流程
实验室日当天,经过一个周末的兴奋和期待,我们俩于 7:00 到达办公室。
我们决定采用带有微动开关的 Raspberry Pi 3,因为我们认为这是我们最好的选择。
微动开关是一个开/关夹,连接到 Raspberry Pi 3 并可以发送布尔信号。
西蒙拿起电钻开始钻孔,好把电线接到卫生间。虽然方法不太优雅,但总算成功了。
我们在 Raspberry Pi 上安装了Raspbian OS和 Python 3,然后开始编码。
我们必须构建一个小程序,每隔 X 秒对微动开关进行采样,一旦状态发生变化,就更新数据库。
我们遇到的第一个问题是误报。我们安装在门上的微动开关非常敏感,所以每隔几秒钟,即使有人只是碰了一下门,它就会发出信号。我们决定改变策略,只有在微动开关发出相同信号五次后才更新服务器。
Python 程序每秒都会检查微动开关的状态;一旦它检测到相同的信号 5 次并且状态与当前状态不同,它就会更新数据库的状态。
一个小的代码示例,只是为了解释 Raspberry Pi 部分,而没有太多繁琐的细节:
class Queue:
def __init__(self, limit):
self._limit = limit
self._items = []
def is_empty(self):
return self._items == []
def append(self, value):
should_remove_first = (self.size() >= self._limit) and not self.is_empty()
if should_remove_first:
self._items.pop(0)
self._items.append(value)
def size(self):
return len(self._items)
def all_same(self):
if self.is_empty():
return False
return all(elem == self._items[0] for elem in self._items)
@property
def items(self):
return self._items
def get_door_status():
# reads the data from the Raspberry pi micro-switch
def update_door_server_status(door_id, status):
# update firebase with the new status
def main():
status = False
q = Queue(5)
door_id = 1
while True:
time.sleep(1)
door_status = get_door_status()
q.append(door_status)
all_same = q.all_same()
if not all_same:
continue
if status == door_status:
continue
update_door_server_status(door_id, door_status)
status = door_status
现在我们有了更新数据库的代码,我们必须创建一个 Web 客户端,以便用户可以访问它。
我们决定使用Vue.js构建一个精简的应用程序,托管在Firebase Hosting上——你会问为什么?因为它是免费的。
我们努力说服设计师,让他相信设计卫生间的网页可能是他时间最值得利用的事情。设计出来的效果太棒了!
最终结果
这是最终结果:
我们甚至有一个根据状态而变化的图标,因此人们可以折叠浏览器选项卡并通过图标查看洗手间是否可用。
我们添加了一个按钮来订阅,这样当洗手间空置时就会立即收到通知。
结论
并非所有应用都旨在改变世界。这款应用专注于做一件事,并且做得很好,开发它的过程也充满乐趣。
所以在搭建了loo.cloud之后(是的,我们确实买了这个域名,但现在已经不再使用了),我们思考了这些问题。
它完美吗?远非如此!
它是否过度设计?比如说,对于手头的任务来说,多了 10 个层级。
它很棒吗?当然很棒。
构建有趣的东西是软件工程师这个职业乐趣的一部分。
文章来源:https://dev.to/polakshahar/project-loo-the-best-time-wasting-amazing-over-engineered-project-of-my-life-37m7