迪拜创业公司使用 Ruby on Rails:哪些场景依然合理,哪些场景已经不再合适
迪拜创业公司使用 Ruby on Rails 依然合理的场景、阿联酋的招聘现实,以及创始人何时应该另作选择。
阅读文章网络应用程序是贵司业务运转所依赖的软件,通过浏览器使用:一个客户门户、一套员工预约系统、一个内部审批工具、一个把多个来源的数据汇总到一个界面的仪表盘。迪拜网络应用程序开发从一个与网站项目不同的问题出发。网站问的是访客应该阅读什么、接下来该做什么。网络应用程序问的是某个特定角色的特定人员需要完成什么,以及他们完成之后数据会发生什么变化。
本页说明我们如何处理这类建设:需求、角色和权限、界面背后的数据模型、系统对接、测试、部署,以及上线后由谁来照看这个应用程序。如需了解包括 WordPress 和无头架构在内的平台整体比较,请见我们的网站开发页面。如果贵司确实需要推送通知、离线使用或设备摄像头,原生应用程序可能比基于浏览器的方案更合适,详见我们的移动应用程序开发页面。
坦诚为先
我们宁愿回绝一个不需要定制软件的项目,也不愿建成一个没人想要、却成为维护负担的系统。
成熟的预约平台、客服工具、CRM 系统和项目管理软件已经覆盖了大量常见需求。如果贵司的工作流程接近标准做法,配置其中一个通常比从零建设更快、风险更小。
如果贵司真正想要的是一组能由团队自行发布和编辑的页面,那属于网站项目,而不是网络应用程序,应该看我们的WordPress 开发或网站开发页面。
定制软件上线后需要一个明确的负责人:能回答支持问题、批准改动,并决定什么时候需要更新的人。没有这个人,再好的应用程序也会很快走下坡路。
当以上任何一种情况成立时,我们会在第一次沟通中就如实说明,而不是先提出建设方案。一个真正适合贵司实际情况的较短项目,比一个不适合的较长项目对贵司更有利。
需求梳理
网络应用程序项目超时超预算,最常见的单一原因是某个需求在开发开始之后才被发现,而不是在此之前。迪拜网络应用程序开发从结构化的访谈开始,参与者是真正每天使用这套系统的人,而不只是委托建设的经理,因为这两类人对同一个流程的描述往往并不一致。
我们把需求记录为绑定到具体角色的用户故事:这个具体的人需要做什么,操作前后分别看到什么,以及出错时应该发生什么,比如重复提交或缺失字段。用这种方式写下的需求,日后可以直接对照建成的界面进行测试,而一份笼统的功能清单做不到这一点。
访问权限
我们在上线后被要求修复的网络应用程序问题,几乎都能追溯到从未被正确设计过的角色和权限。
一位客户不应该看到另一位客户的预约信息。一名初级员工不应该看到只留给管理层的数据。每个界面和每个字段都需要一个明确的答案,说明谁可以查看它,而不是想当然地认为登录环节已经足够。
查看和编辑是不同的权限,应该分开建模。一个常见且代价高昂的错误,是因为建设一个只读视图更麻烦,就干脆给某个角色开放了编辑权限。
许多业务流程需要第二个人来审批某项操作,比如超过一定幅度的折扣或一笔退款。这需要被设计进工作流程本身,并留下谁在什么时候审批了什么的审计记录。
把这一点做错,不只是不方便,而是一个真实的安全和数据保护问题。被广泛引用、专门列出最关键网络应用程序安全风险的参考清单OWASP Top 10,把访问控制被破坏,也就是用户能够超出预期权限进行操作,列为开发团队应该从一开始就设计防范,而不是事后修补的风险之一。
数据
在设计任何界面之前,我们会先梳理这个应用程序实际保存哪些数据:一条记录长什么样,各条记录之间如何关联,以及无论用户在界面上做什么,哪些事情必须始终成立。举例来说,一个预约系统必须强制执行一条规则,两个人不能被同时确认进同一个时间段,而这条规则必须写在数据层,而不只是依赖恰好大多数时候能防住问题的那个界面。
我们还会规划哪些数据会随时间变化,哪些数据永远不应该改变。一张发票一旦开出,即便后续订单发生变化,也不应该悄悄跟着更新;相比之下,一个预约的空位状态则必须在显示它的每个界面上立即更新。为系统的每个部分分别判断属于哪一种,是一项数据建模工作,而不是设计工作。
系统对接
大多数网络应用程序都不是孤立建设的。它们必须与贵司已经在运行的系统互通。
| 对接类型 | 通常能做到什么 | 解决不了什么 |
|---|---|---|
| 支付网关 | 接收银行卡或钱包支付,并把成功或失败的结果反馈给应用程序 | 与财务的对账、退款政策和有争议的支付处理,仍需要一套明确流程 |
| CRM 对接 | 把新线索或客户记录发送到贵司销售团队已经在使用的系统中 | 重复数据的匹配规则,以及哪个系统是主记录,仍需要单独制定规则 |
| WhatsApp 消息对接 | 向客户手机发送确认或更新通知 | 它只是一个通知渠道,而不是事件的记录本身,应用程序仍需要自行存储数据 |
| 日历或排期工具 | 让预约在员工已经会查看的日历中可见 | 如果双方都可能改动,双向同步需要仔细处理冲突 |
| 财务或 ERP 系统 | 把发票或订单数据传递给财务用于对账 | 系统之间的字段映射很少完全一致,必须明确商定 |
一个对接的名称只能大致告诉贵司它能做什么,却说明不了它悄悄做不到什么。我们为每一个建议的对接都列出这两方面,让这些缺口成为贵司团队有意识做出的决定,而不是日后才发现的意外。
迪拜网络应用程序开发中的预约系统、门户或内部工具,通常都能归入少数几种可辨认的类型,即便每个项目的细节各不相同。预约或排期类应用程序,管理的是一种随时间变化的有限资源,一个房间、一个时段、一位技术人员,其核心任务是在向所有同时查看的人展示真实空位状态的同时,防止重复预约。门户为一群特定的人,客户或合作伙伴,提供他们自己记录的私密视图:订单、文件、支持工单、账户余额,且不暴露任何其他人的信息。仪表盘把多个来源的数据汇总到一个界面,评判标准几乎完全在于数字是否可信、是否最新,而不在于界面好不好看。内部工具替代的是员工原本使用的电子表格或手动流程,衡量其成功与否的主要标准,就是大家是否真的在用它,而不是悄悄回去用旧方法。
在迪拜网络应用程序开发的早期就明确属于哪一种类型很有帮助,因为每一种都有已知的失败点。预约系统往往在边界情况上出问题:两个人同时尝试预约同一个时段的那一刻会发生什么,一个关联资源变得不可用时预约会怎样。门户往往在访问控制上出问题,展示或允许访问本该属于别人的内容。仪表盘往往在可信度上出问题,当屏幕上的数字与源系统对不上,却没人注意到,直到一个决定已经基于它做出。内部工具往往在采用率上出问题,本应使用它的人觉得旧电子表格更顺手,便悄悄继续在新系统之外使用旧方法。
测试
一个外观略有瑕疵的网站,只是个观感问题。一个行为略有偏差的网络应用程序,却可能弄丢某人的预约、对客户重复收费,或暴露不该暴露的数据。
每个用户角色都会针对它应该拥有权限的每个界面和操作进行测试,同样重要的是,也要测试确认它无法访问不该访问的内容。
关键流程会用贴近真实的数据从头到尾运行一遍,而不只是孤立测试单个界面,因为问题往往只有在多个步骤串联起来时才会显现。
支付失败、表单填写到一半连接中断、双击导致的重复提交:这些情况都会被有意安排测试,因为它们在真实使用中一定会发生,无论是否测试过。
安全测试遵循同样的原则:既要确认应该发生的事情能够发生,更要主动寻找不应该发生的事情。OWASP Top 10 被开发团队广泛用作这方面的起点清单,涵盖访问控制被破坏、注入漏洞和安全配置错误等风险,任何处理真实客户数据的应用程序上线前,我们都会以它作为基准进行测试。
正式上线
迪拜网络应用程序开发会走到系统必须从测试环境转向真实使用的那一刻,这一步比典型的网站上线风险更高,因为从第一天起通常就涉及真实数据和真实用户,而不是逐步引入。
我们会刻意规划这次切换:哪些现有数据需要被迁移进来,旧流程和新系统是否需要在短期内并行运行,以及如何准确告知员工何时切换。如果选定的上线日期没有考虑到贵司业务自身的繁忙时段,比如零售商在一场大促前几天上线新的订单工具,就会带来与软件本身无关的额外风险。
上线之后
定制软件不会自己运转。迪拜网络应用程序开发必须包含一个诚实的答案:上线之后由谁来照看这套系统。
即便是经过充分测试的应用程序,一旦真实用户带着真实数据每天使用,也会暴露一些小问题。需要有人能被找到来修复它们,多快能修复值得提前商定,而不是在压力之下才临时决定。
网络应用程序所依赖的库和框架会随时间推出各自的安全更新,应用这些更新是一项持续性的责任,而不是上线时完成一次就结束的任务。
使用模式往往会揭示某个工作流程需要小的调整,或者某个没人用的功能可以被简化。我们的网站数据分析服务对这类跟踪有更详细的说明,而这一点只有在系统有了真实用户之后才能被观察到。
网站的长期维护详见我们的网站维护页面;一个网络应用程序的维护需求通常更复杂,因为软件中的错误可能影响到一项真实的业务流程,而不只是页面的外观,这一点会针对每个项目单独确定范围。
常见建设类型
一个预约或排期类应用程序从外表看很简单,一个日历加一个确认按钮,但它的正确性完全取决于能否在真实的、同时发生的使用场景下站得住脚的规则。
每个显示某个时段为空的界面,都必须反映真实的当前状态,包括几秒钟前刚被别人预约走的情况,一旦不止一人能同时预约,这个问题就比听起来更难解决。
一次预约往往不只取决于一个时间段:一个特定房间、一位特定员工、一件设备。系统必须核对每一个关联资源的可用性,而不只是核对日历上的那一条记录。
改期和取消需要和最初预约同样严谨的处理,包括取消后被释放出的资源会发生什么,以及是否有人、以及谁会收到通知。
迪拜网络应用程序开发在这类系统中通常会把明确的取消和缺席政策直接建进工作流程本身,因为这正是手动流程在业务量增加后最容易失控的地方,重复预约和未确认的缺席会因此变得无从追踪。
常见建设类型
一个门户的全部价值都建立在信任之上:使用它的人需要相信自己看到的是准确的,也需要相信自己看不到的内容确实是私密的。
一个门户通常需要支持同一个客户账户下的多位使用者,比如同一家公司的两位同事,各自拥有自己的登录信息,但共享对该账户记录的可见范围。
门户中显示的订单状态或文件审批进度,必须反映源系统中真实的当前状态,而不是上次有人碰巧查看时留下的缓存数字。
一个设计良好的门户能减少常规咨询,比如通过邮件询问订单状态,但当门户确实无法回答某个问题时,仍需要有一条明显可见的途径能联系到真人。
常见建设类型
迪拜网络应用程序开发中的仪表盘,最终会被一件事评判:屏幕上显示的数字是否与其来源系统中的数字一致。一个设计精美、却显示着过期一天的数字,或者用与财务不同的规则计算出来的仪表盘,会在几周内被悄悄弃用,所有人又回去用自己的电子表格。
在建设任何图表之前,我们会先商定好每个数字究竟来自哪里、多久刷新一次,以及某个源系统暂时无法访问时会发生什么。一个悄无声息地出错、却把过期数字当作最新数据展示的仪表盘,比一个清楚显示自己刷新失败的仪表盘更糟糕。
常见建设类型
一个内部工具最难的部分很少是软件本身。真正难的是让团队真正用它,而不是继续用他们已经信任的电子表格。
每天使用这个工具的人,应该在上线前很早就看到能实际操作的界面,他们的异议也应该被认真对待,因为一个没有他们参与建设的工具,往往会漏掉那些让旧电子表格依然显得更顺手的小细节。
如果往新工具里录入数据比它取代的电子表格更费时,无论背后的报表功能多强大,采用率都会受影响。
让电子表格和新工具无限期并行运行,往往意味着电子表格悄悄继续充当真正的记录。一个明确并已告知大家的切换日期,可以避免这种情况。
技术选型
不存在一套放之四海而皆准的正确技术栈。迪拜网络应用程序开发是根据项目的形态来选择技术,而不是反过来。
| 考量因素 | 为什么重要 |
|---|---|
| 数据实时变化的程度 | 一个数字持续更新的仪表盘,所需的方案和一个数据每天只变化几次的工具完全不同 |
| 日后由谁来维护代码 | 一个被广泛使用、文档齐全的框架,日后交接给另一位开发者会比一个小众选择更容易,即便这个小众选择在技术上更精巧 |
| 并发用户数量 | 一个供五名内部员工使用的工具,与一个同时向数千名客户开放的门户,需求截然不同 |
| 需要对接什么系统 | 一些平台和代码库对常见的阿联酋支付网关和 CRM 有成熟、经过充分测试的连接器;其他则需要从零开始定制对接 |
| 应用程序需要使用多久 | 一个短期使用的内部工具,可以合理选择更快、更轻量的建设方式,而一个预期运行多年、面向客户的系统则不然 |
我们会在需求梳理阶段用平实的语言解释选择某个技术栈背后的原因,包括这对日后谁能维护这个应用程序意味着什么,而不是把技术决定当作已经定案、不容讨论的事情呈现出来。
成本
两个听起来相似的项目,一旦细节被明确下来,成本可能天差地别,而原因通常是可以预见的。
每一个拥有不同权限、不同界面的角色都会带来真实的工作量,因为每种组合都需要单独设计、建设和测试,而不能想当然地认为它会自动跟随其他角色。
应用程序对接的每一个外部系统,都会带来各自的配置、测试成本,以及对方系统未经通知就改变行为的持续风险。
贵司业务实际运作方式所特有的规则,比如某种特定的审批链条或带例外情况的定价计算,正确建设所需的时间会比同一功能的通用版本更长。
每一个迪拜网络应用程序开发项目,都会在需求被完整记录之后,依据实际需求给出一份固定的书面报价,而不是在角色、数据和系统对接尚未被真正理解之前,就给出一个粗略的数字。这能保护贵司,避免范围蔓延在建设过程中变成计划外的额外成本。
常见失误
最常见的失误,是从一个粗略的想法而不是有据可查的需求开始开发,这在一开始感觉更快,但一旦界面需要根据一个当初没有被正确记录下来的需求返工,几乎总会在整体上花费更多时间。紧随其后的常见问题,是在早期没有充分设计权限,等真实用户和真实数据已经进入系统之后,才试图补上完整的访问控制,这比从第一个界面开始就正确设计要危险得多。
第三个反复出现的问题,是把测试当成上线前才做一次的事情,而不是贯穿整个建设过程。在单个工作流程中及早发现的问题,修复起来花不了多少时间;同一个问题如果是在其他几个功能已经在它之上建成之后才被发现,修复起来就要慢得多。
精选案例

网页应用 · 票务 · 阿联酋
由 Phars Film 运营的阿联酋连锁影院。所有场次、优惠和支付集中在一处,顾客用手机即可完成。
starcinemas.ae
平台 · 汽车租赁 · 阿联酋
汽车租赁平台,供应商发布车队,租车者比较并预订,承载真实流量。
oneclickdrive.com
移动应用 · 活动 · 阿联酋
阿联酋会议平台,为参会者和主办方取代纸质议程和邮件往来。
meecon.ae双语支持
一个双语网站主要关乎内容和排版。一个双语网络应用程序还必须在表单、数据录入和生成的输出中处理阿拉伯语,这是一个不同且更难的问题。
表单需要能正确接受阿拉伯语输入,包括从右到左的文本字段,有些记录确实需要同时保存阿拉伯语和英语两个版本,比如生成文件上客户的姓名。
从网络应用程序发送的发票、确认信和 WhatsApp 消息,需要能正确显示的阿拉伯语内容,而不是一个为英文设计、事后硬塞进阿拉伯语的模板。
有些记录确实同时包含两种语言,比如一张支持工单,客户用阿拉伯语提问,员工用英语回复,界面必须在同一个对话串中正确显示两个方向的文字。
把阿拉伯语当作后期附加内容而不是从一开始就有的需求来处理的迪拜网络应用程序开发,一旦真实的双语数据开始在系统中流动,往往需要大幅返工。及早做出这个决定,远比在表单、数据库字段和生成文件都已经完全按英文建成之后再补救要简单得多。
所有权
为贵司的网络应用程序建设的代码、数据库和任何定制基础设施都归贵司所有,这是我们在所有网站服务中一贯遵循的原则。源代码会在上线时交接,并附带说明系统结构的文档,这样如果贵司未来需要另一位开发者接手,也能顺利进行。
这一点对网络应用程序来说比对普通网站更重要,因为网络应用程序往往编码了真实的业务逻辑,定价规则、审批链条、计算方式,代表着贵司业务中真正独有的工作成果。失去这份代码的访问权,或者接手一份没有任何文档的代码,比失去一组内容页面的访问权严重得多。
协作方式
迪拜网络应用程序开发在贵司一方提前做出一小部分关键决定的情况下,会推进得最快。
与每天使用这套系统的人相处的时间,而不只是委托建设的那个人,这样需求才能真实反映工作实际是怎么进行的。
一位能够批准需求、审定界面的人,让迪拜网络应用程序开发不会因为要等一个委员会就每个细节达成一致而停滞。
新系统需要对接的任何系统的凭证或文档,应尽早提供,而不是在建设进行到一半时才被发现是一个阻碍。
按这种方式进行的迪拜网络应用程序开发,需求被写下来,角色被有意设计,测试贯穿每个阶段而不是留到最后,最终会做出贵司团队真正信任的软件,而这才是项目完成后唯一真正重要的衡量标准。一个没人信任的系统,会被悄悄绕开,直到最终彻底停用,无论底层代码有多强大。信任是在真实使用的最初几周里赢得的,这正是上线阶段和早期支持期与建设本身同样重要的原因,也是为什么我们会在这段时间保持密切参与,而不是系统一上线就消失不见。
成长空间
迪拜网络应用程序开发的第一个版本很少需要解决未来所有可能的场景,但也不应该关上一家成长中的企业很可能想要打开的那些门。
字段和关系的设计要考虑到明显的近期新增需求,比如第二个门店或第二种产品类型,这样一个真正可能发生的变化就不会迫使底层结构被推倒重建。
权限系统的建设要能支持日后新增、更细分的角色,而不是让每个用户共享同样宽泛的权限,只因为当初从未规划过进一步细分。
一种结构,允许日后连接新的外部系统时,无需重新设计现有对接的运作方式,因为一个网络应用程序在其使用周期里,对接的系统清单往往会不断增长。
这是一种真正的平衡,而不是给第一个版本过度建设开绿灯。试图从第一天就预见每一个未来可能功能的迪拜网络应用程序开发,通常上线时间更长,花费也超过企业在那个阶段实际需要的水平。更有用的原则,是避免做出日后修改成本很高的决定,同时让第一个版本本身的范围只限于当下真正需要的内容。实际操作中,这意味着在数据模型和权限结构上及早投入真正的思考,因为这两者日后修改的代价确实很高,而让各个界面和工作流程保持足够简单,等真实用户开始反馈之后再调整。
迪拜网络应用程序的第一个版本,范围往往比客户最初设想的要窄,专注于把核心工作流程做扎实,而不是铺开一堆做得很浅的功能。举例来说,先把预约流程做好,等有了真实的使用数据之后,再在第二阶段加入一个会员忠诚计划,往往比两者同时半成品上线效果更好。以这种方式推进的迪拜网络应用程序开发,还能让贵司从真实用户那里获得证据,了解哪些计划中的功能在核心系统上线后确实重要,而不是事先猜测一份完整的功能清单。
按阶段推进项目,也改变了固定报价在实际操作中的运作方式。我们不会一次性为一个庞大、不确定的范围定价,而是先为第一个版本精确定价,等上一个阶段上线并总结出经验之后,再为每个后续阶段确定范围。以这种方式定价的迪拜网络应用程序开发,往往比在任何人真正使用系统之前就商定的一份庞大报价,更贴近实际会被用到的内容。
合规
一旦一个网络应用程序开始存储姓名、联系方式或交易记录等个人信息,如何处理这些数据就成为一项真实的责任,而不只是一个技术细节。
存储的每个字段都应该有一个与实际业务需求相关的明确理由,而不是因为某个表单模板恰好包含了它。
本页前面提到的基于角色的访问控制,直接适用于这里:客户个人信息应该只对真正因工作需要而必须访问它的角色可见。
客户的数据是否以及如何应要求被移除,以及出于合法的业务或财务原因必须保留哪些内容,值得在系统保存真实记录之前就决定并记录下来。
谁在什么时候查看或修改了一条记录,对最敏感的数据尤其重要。从一开始就建好一份基本的审计日志,比等到日后有人追问某条记录发生了什么才补上要好。
我们不是律师事务所,具体的合规义务取决于贵司所在的行业以及贵司持有数据的性质,因此这不属于法律意见。如果贵司的网络应用程序处理敏感的个人或财务数据,我们建议在上线前与合格的顾问核实贵司的具体义务,我们会据此设计系统,以支持该建议所要求的任何访问和删除控制。这一点对一个小型内部工具和一个面向客户的门户同样适用,因为一个保存员工或供应商记录的内部系统,仍然在处理个人数据,即便界面从未被公司以外的任何人看到。
工作方式
迪拜网络应用程序开发在完成需求梳理之后,会经历与我们网站开发工作大体相同的阶段,只是针对软件而不是页面做了调整:需求说明、固定提案、建设、审核、交付与优化。对于网络应用程序来说,审核阶段会发生不止一次,因为要真正测试一个工作流程,意味着向贵司展示它实际运行起来的样子,而不只是口头描述它已经完成。
我们会保留一份公开可见的清单,列出已经建成的内容、正在测试的内容和仍待完成的内容,这样进度无论好坏都不会让人意外。哪怕只是一份简短的每周更新,也能防止一个较长的网络应用程序项目在启动和上线之间变成一个黑箱,并让贵司有机会在一个被误解的需求还只是个小改动时就发现它,而不是等到需要推倒重建。这对软件来说比对普通网站更重要,因为一个在网络应用程序中较晚才被发现的、被误解的工作流程,往往牵连好几个相互关联的界面,而不只是一个页面。
博客文章
直接解答
网站主要供访客阅读。网络应用程序则用来完成某件事:提交预约、审批订单、查看实时仪表盘、在登录后管理记录。这个区别几乎影响了它从规划、建设、测试到维护的方方面面。
通常不需要。网络应用程序可以在任何设备的任何浏览器中运行,无需提交应用商店审核,这非常适合内部工具和大多数客户门户。当贵司确实需要推送通知、离线使用或摄像头等设备功能时,专属应用程序才更值得投入,我们的移动应用程序开发页面对此有详细比较。
那通常是更好的选择。即便这意味着我们接到的项目会变小,我们仍会如实这样说。只有当贵司的工作流程确实不适合任何现有工具,或者把几个现有工具连接在一起所产生的手动工作量比用一个系统更大时,定制开发才值得投入。
这必须在开发开始之前,而不是之后就商定好。可选方案包括贵司自己的内部开发者、与我们签订的维护安排,或者向另一个团队做有据可查的交接。没有人负责的应用程序是我们在需求梳理阶段就会指出的风险,而不是悄悄放过的问题。
每个用户角色都会针对它应该和不应该访问的每个界面进行测试,关键工作流程会在切实可行的情况下用接近真实的数据量端到端地运行,而像支付失败或连接中断这类已知的边界情况,会被有意安排测试,而不是等真实用户遇到才发现。
每个项目在我们了解角色、数据、系统对接以及任何定制逻辑之后,都会依据贵司的需求说明给出一份固定的书面报价。主要的成本因素通常是不同工作流程的数量,以及该应用程序需要对接的外部系统数量。
资料来源
书面固定价格
已收到,我们正在为您撰写报价。
工作时间内您将在 45 分钟内收到。请查收确认邮件。