开发者回顾2003年政治立场分享网站SuperVote的设计构想
来源标题:SuperVote: 15 Year retrospective on an app for sharing political endorsements
一名开发者回顾了2003年构思的SuperVote网站,这是一个无党派在线政治社区,供选民和政治组织讨论投票议题。该网站仅停留在设计稿阶段,从未建成,原计划提供在线选民登记、投票站查询和论坛讨论等服务。开发者曾于2002至2008年持有supervote.com域名,后因未知原因放弃续费。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
2003年的时候iPhone还不存在,所以这个想法纯粹是一个桌面端的网站。除了这张截图之外,这个网站从未被真正开发出来,但在概念上它是一个包含不同板块的论坛站点。我找到一个名为supervote.txt的文件,里面有以下描述,显然正是上面这个原型图的依据:
无党派在线政治社区,选民和政治组织在这里汇聚,讨论当前的 ballot initiatives 和选举。 参与者可以在各种讨论论坛中发表意见。 选民服务包括: () 在线选民登记 () 投票站查询 () 针对所在选区/州新提案的邮件提醒 () 访问讨论版块 () 参与模拟投票 组织服务包括: () 发布对倡议/提案的官方立场 () 发布活动和事件公告 () 组织需按月/按年缴纳会员费才能加入。 个人参与者可免费加入。
我从2002年到2008年一直持有supervote.com这个域名,本意是要把这个网站做出来,但因为某个不明原因,我让所有权失效了。2012年,我联系了域名所有者,询问对方是否愿意出售,但一直没有收到回复。
版本控制方面,我一开始用Subversion,后来改用Git。当时GitHub还没有免费的私有仓库,所以我搭建了一台Git远程服务器,把仓库托管在一台Linode实例上。
Jira在2010年代初期是开发者中很流行的项目跟踪系统。Bugzilla被认为笨重难用,我之前也用过Redmine和Trac,但最熟悉的还是日常工作里用的Jira。我在它还能自托管的时候买了一份license。直到今天我还保留着这些Z shell别名:
alias start-jira='sudo /usr/local/jira/jira-5.2.10-standalone/bin/startup.sh' alias stop-jira='sudo /usr/local/jira/jira-5.2.10-standalone/bin/shutdown.sh'
到职业生涯的这个阶段,我已有大约10年的Java经验,所以选了Jetty来跑我的API。我在个人网站上用过Ruby on Rails,但Rails直到2016年的5.0版本才引入内置的API-only应用模式。我选择MySQL,是因为之前用过、而且上手容易。
我希望把某些操作排除在请求-响应循环之外(比如生成用户的定制选票),于是评估了几个消息队列,最终选定了RabbitMQ。它与Java后端的集成很直接,运维起来也相对简单。
为了这篇文章,我把源代码以只读归档的形式发布在了GitHub上。
SuperVote比较有挑战性的部分之一,是设计一个能够表达美国选举结构、并根据用户所在位置生成个性化选票的数据库。我围绕政府、选区、选举、选票和背书设计了一套关系数据模型。完整的数据库schema发布在GitHub上。
基础是一套政府的层级结构,包括国家、州、县、市以及其他市政单位,并支持独立市、跨多个县的市镇等例外情况(例如纽约市,它的五个行政区对应五个县)。选区则单独建模,用来表示国会、州议会和地方投票边界,这些边界会随时间变化。注册时,用户提供自己的地址和ZIP code,应用据此识别其所属的政府和选区,从而确定哪些选举和角逐与他们相关。
选举被建模为与政府关联的、带日期的活动,其中包含民选职位的角逐和ballot measures。职位与候选人分开建模,这样同一个职位可以在不同选举中由不同的人竞选;而ballot measures则代表需要投赞成或反对票的问题。每位用户的选票与一场选举关联,候选人和measure的个别选择分开存储。用户可以选择为自己的背书附上书面说明,并控制这些背书是否对他人可见。
一开始我用VoteSmart API根据ZIP+4 code识别立法选区,后来改用Sunlight Foundation的Sunlight Labs API,以及Freebase数据库的一个子集来把ZIP code映射到美国县。再后来我改用Cicero API来映射立法选区。
在这个项目之前,我一行Objective-C都没写过。我下载了语言指南和面向对象编程指南,打印出来,慢慢读:
回顾我的源代码,我依赖了几个第三方库来简化常见的开发任务。其中包括用于网络请求的AFNetworking和ASIHTTPRequest、用于JSON解析的SBJson,以及用于实现下拉刷新交互的EGOTableViewPullRefresh。我还用了一些工具来显示进度指示器、记录日志和上报崩溃。这些库中有很多后来已被废弃,或被iOS直接内置的功能所取代。
我知道PhoneGap(现在的Apache Cordova)可以作为同时构建Android和iOS应用的方案,但我主要专注于iOS,因为我有一台iPhone,而且没有可用于测试的Android设备。
为了这篇文章,我把源代码以只读归档的形式发布在了GitHub上。
这些截图展示了新用户的典型流程:
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。