Project Loo:我一生中最浪费时间、最精彩、最过度设计的项目

2025-06-07

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
Enter fullscreen mode Exit fullscreen mode

现在我们有了更新数据库的代码,我们必须创建一个 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
PREV
使用 Python 的 Telebot
NEXT
hack.chat 网页聊天 hack.chat 安装 贡献 致谢 语法高亮介绍 #14