无论你在写软件的任何时候,优秀的抽象编程总是至关重要的,能横跨不同平台的抽象编程对我们这个小团队尤为宝贵。假如我们不得不分别在8个不同平台上从头开始构建产品,我们就不可能走到今天这么远。所以我们在库和体系架构方面投入了大量的精力,来确保我们只用造一次轮子就能在多个平台使用。 举个例子,我们在数据存储、内存数据结构以及跨平台通讯上广泛地使用 Protocol Buffers(译者注:谷歌开发的一种可扩展的结构化数据存储格式)。 这让我们能够便捷地完成很多事情,比如直接从MySQL读取Protocol Buffers③;在Python 网页服务器上修改数据;然后把它们发送给我们的 native clients(译者注:谷歌开发的一种可以让浏览器直接运行机器码的沙盒技术),这些native clients上使用的数种语言包括C++,Objective C,Java或者C#;甚至还可以把那些相同的数据结构下载到我们的Java编辑器。 此外,直播,所有这些操作都是通过自动生成的数据串行化代码完成的(data serialization code),有着强类型数据结构的它们同时运行在强类型的通讯渠道上。假如我们使用的特定语言专用的数据结构或者甚至是JSON,通过如此繁杂的步骤来处理数据不仅将会变得非常乏味,而且也会容易出错。 “只造一次,随处可用”的精神在其他许多场合也有体现。为了在桌面版、移动端上同步数据以及支持其离线使用,我们使用了相同的C++库。横跨所有设备的文档编辑器都运行在相同的Java库上——然后再针对各自平台进行优化,让用户体验变得更加流畅完美。我们的网页版,Mac和Windows桌面应用都是共用了同一套React的UI代码,使其在各自平台上都更接近于原生应用。④ 使用这些技术并不意味着一劳永逸地解决所有麻烦,但是它们确实大大减轻了工作量。 Take advantage of in-network referrals for hiring 人际网络 在我有幸共事过的团队中,Quip有着最聪明的那撮人。在开发方面,团队里的绝大部分人拥有至少6年的从业经验,甚至超过一半工程师的经验超过10年。 对于初创企业来说,掌握如此丰富的从业经验弥足珍贵:我们能靠一己之力去解决遇到的困难,我们相信每一个人都在做正确的东西。与有着更多初级工程师的团队相比,我们并不需要花太多的时间去培养新员工。 显然,我们同时也可以避免早期职业生涯已经犯过的错误,这样可以显著提高数倍A/B测试框架或者监视系统的效率。从业经验让我们在解决产品挑战方面更加游刃有余。 为了组建这样的团队,我们很好地利用了人际网络的引荐。许多Quip工程师在加入前就曾经共事过,这样就减少了招聘过程中的风险和麻烦。即使你的职业生涯刚起步,与你喜欢共事的朋友保持联系也是很重要的。来日方长,也许你能找到不错的机会重新在一起工作。 Invest heavily in tooling 在工具上花大力气 小魔王插播:Facebook早年和现在一直就在 internal tools 组里投入了特别厉害的工程师来开发内部的各种工具。比如我们的任务管理工具 task,代码审核和查看工具 phabricator,以及后来的各种基础设施、数据分析和统计工具,比如: Heystack,atv,Scribe,PTail。而即使现在名声大噪的 Kafka,之前也只是LinkedIn的一个内部基础设施项目。但是国内公司我经常发现工程师们对于做工具或者做内部设施没啥兴趣,只喜欢做看得见摸得着的界面或者功能,殊不知这些界面和功能都是PM和设计还有老板们说的算,技术含量也并不高。 工具链能让你的回报加倍。随着时间的积累,它们的益处也会越来越明显。在Quip,我们造了大量工具来帮助我们更快地进行开发:比如能够使用堆栈跟踪来收集统计错误的表盘;比如能用来调试错误和检查状态的工具;比如能分析代码和查出一般错误的git commit hooks;以及其他许多自动化脚本来执行各种枯燥乏味的任务。 我们实现了从性能指标到客户留存率的数据可视化,这样我们就能更清楚地了解目前的进展。我们为自己的售后部门和业务部门开发了内部专用的工具,这样他们就能帮助客户快速地处理任何问题。 (责任编辑:本港台直播) |