公司:知乎
知乎是一家中国大陆的问答网站,创立于2011年1月26日,产品形态与美国在线问答网站Quora类似。“知乎”在文言文中意为“知道吗”。2012年2月底,知乎使用“发现更大的世界”作为其宣传口号。截至2017年9月20日,知乎注册用户数超1亿,日活跃用户量达2600万,人均日访问时长1小时,月浏览量180亿。截至2016年5月,知乎累计产生了1000万个提问、3400万个回答和3500万个赞同。2021年至纽交所上市,在挖掘优质创作会员与投入自有内容的同时,随着多样性的社群文化增加,知乎越来越类似于reddit等同好论坛。
知乎由北京智者天下科技有限公司(法律性质为有限责任公司)所持有,其法律代表人是李大海。智者天下亦开发了包括Android、iOS平台的手机“知乎客户端”、“知乎群组”、“知乎日报”与“公益壹点通”四款手机应用程序。
知乎反作弊系统「悟空」架构演进
知乎采取了立体防御策略来应对问答社区的内容和行为作弊垃圾问题。他们通过策略反作弊、产品反作弊和模型反作弊等手段来解决问题。在事前阶段,他们加强风险教育、业务决策参与、监控报警和同步拦截。在事中阶段,他们针对不同嫌疑程度的行为与账号,进行不同层级的处理。在事后阶段,他们处理那些非常低频或影响较小的行为。通过人工审核和合理的模型算法来控制风险。
Fastlane实战(一):移动开发自动化之道
文章介绍了团队在移动开发过程中,使用Fastlane来解决ITC提包、Meta内容管理、签名、证书管理等繁琐任务的经验。起初,他们只是将Fastlane用于iOS团队内的证书同步和上传ITC的问题,但随后发现Fastlane在私有Pod发布、代码静态检查、UIAutomation测试等场景中也非常实用,并逐步推广到Android平台。Fastlane可以与Jenkins、Circle等CI系统良好集成,简化配置复杂度。文章简要介绍了Fastlane的特点,它是一套用Ruby语言编写的自动化工具集和框架,每个工具对应一个Ruby脚本,用于执行特定任务。
知乎安卓客户端启动优化 - Retrofit 代理
知乎 Android 客户端为提升用户体验,重点优化了启动速度。通过使用 Method Tracing 这一工具来跟踪启动过程中调用的方法和耗时,发现了导致启动变慢的问题。Method Tracing 是测量代码执行性能的常用方式之一,可以手动调用 startMethodTracing() 和 stopMethodTracing() 方法进行跟踪,并将结果保存在手机的 .trace 文件中。这一工具在性能优化中非常有用。
知乎客户端埋点流程、模型和平台技术
知乎介绍了客户端埋点的重要性和难点,以及埋点流程和迭代史。客户端埋点相较于Web端更难,修复问题需要等待下一个版本发布,对产品快速迭代产生负面影响。知乎的埋点流程包括多个角色,如产品经理、业务数据负责人、开发工程师和测试工程师。强调了埋点的能力、意愿和工具的重要性。为了快速推进埋点,数据平台组招聘了埋点设计人员。设计了"业务数据负责人"角色,负责业务数据仓库需求和埋点设计。在工具方面,知乎早期使用的小工具能力有限,用户体验不够好。将埋点测试整合到客户端发版流程中会降低测试工程师的效率。
知乎移动端性能测试实践
移动客户端的性能测试对于测试人员来说是一项复杂而重要的任务。然而,实施性能测试存在一些困难,例如环境配置、测试问题场景复现和结果分析。本文介绍了几款性能测试工具,但它们都存在一定的难度和依赖本地开发环境的问题。为了解决这些问题,设计了一个便捷、无门槛的性能测试工具,并介绍了工具的使用步骤、设计目标、问题发现、实现细节、自动化接入和扩展等方面。
知乎安卓端第三方库敏感代码扫描机制 - FindDanger
知乎重视用户隐私保护,推出敏感代码扫描机制FindDanger。该机制用于扫描第三方库是否存在获取用户隐私的风险行为。机制使用GitLab + Jenkins进行管理,工程师提交merge request后,会触发扫描任务并生成报告。报告链接发送到GitLab的merge request页面,工程师通过分析报告给出使用意见。目前FindDanger支持多项检测规则,根据危险级别判断风险程度。
知乎 Android 客户端组件化实践
知乎 Android 客户端最早采用单工程 MVC 架构,但随着业务规模扩大和开发人员增加,出现了代码耦合和协作问题。为了解决这些问题,他们进行了组件化重构。采用多工程多仓库方案,每个组件有独立的仓库,主工程通过 aar 依赖各个组件。架构包括主工程、业务组件、基础组件和基础 SDK,实现了职责清晰独立、拆解和组合的能力。组件化的第一步是解耦,包括处理公用代码和拆分基础业务逻辑成基础组件或独立的 SDK。同时,建立了一个 common 组件来统一存放小代码和资源。随着组件化的进行,common 组件应逐渐变小。对于共同使用的代码和资源片段,允许直接复制以避免影响其他业务。另外,对于需要在应用启动时初始化服务的需求,每个组件添加了 init() 方法,但仍需解决依赖顺序问题。
知乎 iOS 基于 CocoaPods 实现的二进制化方案
iOS客户端编译时间长,需要减少编译时间。解决方案是使用二进制依赖管理。具体流程包括同步主仓库、使用Platypus工具产生二进制。需要注意的是,pod需要白名单筛选,合并模拟器和真机编译产物,合并Swift代码文件夹。旧版Xcode编译的Swift二进制无法在新版Xcode使用。
知乎移动客户端组件管理平台
知乎在两年前调整了移动客户端的发布流程,采用固定的发版周期。为了提高效率和团队协作,他们开发了移动端组件管理平台Athena。Athena集成了Gitlab、Jenkins和Slack等工具,使团队可以在一个平台上查看所需的组件或应用资源,节省了切换工具和沟通成本。这个平台还帮助新员工快速上手工作,提供了权限控制和规范统一的工作流程。
Golang 单元测试框架 gocheck 使用介绍
gocheck是一个比较健全且简单的Golang单元测试框架,它在Golang官方的testing package基础上提供了丰富的功能和断言方法。使用gocheck可以验证程序的正确性,保持机器状态不变,并且测试独立性强。其中的Assert断言方法可以根据预期值检验接口返回值是否匹配,如果不匹配则记录错误。gocheck还提供了丰富的检查器方法,如全等校验等。
知乎反作弊垃圾文本识别
知乎是一个拥有超过2亿注册用户的社区平台,近期他们面临着对垃圾信息的治理挑战。他们通过升级名为"悟空"的策略引擎和引入深度学习识别垃圾文本的方法取得了不错的效果。他们发现当前站内的垃圾文本主要包括导流内容、品牌内容、诈骗内容和骚扰内容。为了高效检测这些垃圾文本,他们选择了使用CNN(卷积神经网络)作为算法,因为CNN在训练和预测速度上都快于RNN(循环神经网络)。这种CNN文本分类模型能够准确识别关键词,满足快速垃圾文本检测的需求。
知乎客户端线上性能数据分析系统实践
该文章介绍了一套用于查看客户端线上性能指标运行情况的数据分析系统。系统通过大数据技术对原始数据进行预处理清洗和计算,包括数据类型抽取、数据量采样、类型数据标识、去重、差异化数据处理、指标数据预计算、维度聚合和异常数据过滤等操作。系统架构包括客户端和web的数据收集、日志服务器、Kafka集群、Spark Streaming、Druid、Elasticsearch和可视化平台。该系统的目标是提升客户端质量,优化低效率代码,提升用户满意度和建立用户信任。
Druid 与知乎数据分析平台
知乎数据平台团队基于开源的Druid打造了自助式数据分析平台,支持统一的数据源管理、自助式报表配置、多维度多指标的组合分析、自助式仪表盘配置、开发平台接口和统一的数据权限管理。平台使用Druid作为数据存储解决方案,具备低延时的数据摄取和灵活的数据探索分析能力。Druid的架构包括DataSource和Segment等数据结构,以及Historical、Broker和Router等查询服务组件。Druid集群还有外部组件Deep Storage和Metastore Storage,用于存储Segment文件和元数据信息。在大查询量场景下,可以直接查询Druid作为主力查询引擎。
知乎 iOS App 启动时间测试实践
知乎iOS App的启动时间对用户体验至关重要。文章介绍了测试团队针对竞品启动时间的实践,并结合工程师的优化结果,介绍了持续监控和主动发现启动异常的测试方案。常见的启动时间测试方法有Xcode Developer Tool、客户端计算统计和录屏。其中,录屏测试方案需要解决开屏广告对启动时间判断的影响,在去除开屏广告后进行测试更具参考价值。为了保证测试数据的真实性,测试方案分为冷启动和暖启动两组场景。同时,使用开源工具xrecord进行录屏,并进行视频分析。
知乎 Android 客户端 CI/CD 方面的努力
知乎的Android团队通过组件化方案提升了工程师的研发效率。他们使用文件控制进行跨组件的CodeReview,并通过gitlab来浏览每个版本的改动。此外,他们还实现了联合打包的功能,能在多个组件提交代码时生成对应的测试包。这些措施有助于提高团队的协作效率和代码质量。
大数据平台的数据同步服务实践
知乎在大数据系统中建立了数据同步平台,选择了Sqoop作为数据同步工具。Sqoop具有并行计算能力、与Hive兼容,但数据源支持较少。DataX支持丰富的数据源和限速,但需额外的资源。考虑到资源利用和Hive适配,选择了Sqoop。平台化目标是构建通用的数据同步平台,简化任务接入、监控和报警、屏蔽MySQL DDL影响、可扩展新数据源。整体架构包括API Server、数据源中心、Scheduler和Worker。平台不要求用户理解底层原理。