123
返回列表 发新帖
楼主: puncsky
跳转到指定楼层
上一主题 下一主题
收起左侧

一同攻克系统设计与构架

   
🔗
 楼主| puncsky 2019-10-28 13:41:24 | 只看该作者
全局:
管理员插话:解析全乱了,我给楼主修改了一下

文章: 设计以人为本的国际化(i18n) 工程方案


回复

使用道具 举报

🔗
 楼主| puncsky 2019-10-28 13:44:30 | 只看该作者
全局:
现在我发帖都会被审核吗?
回复

使用道具 举报

🔗
 楼主| puncsky 2019-10-28 15:25:41 | 只看该作者
全局:
设计以人为本的国际化(i18n) 工程方案

需求分析如果问硅谷的公司跟中国最大的不同是什么,我想答案很可能正如吴军所言,硅谷公司的产品大多面向全球市场。陈志武说的好,创造财富能力有三个衡量维度:深度,即生产力,同样的时间提供更好产品或服务的能力;长度,即利用金融杠杆,跨越时间和空间交换价值的能力;广度,即市场大小,开创跨越地域的市场或者新行业的能力。而国际化,也就是产品和服务在语言和文化上的本地化,正是跨国公司征战全球市场的战略要地。
Internationalization 因为字母 i 后面跟了 18 个字母然后以 n 结尾,所以被称为 18n,我们这次设计的 i18n 工程方案主要是解决网站和移动 App 开发过程中的如下问题:
  • 语言
  • 时间与时区
  • 数字与货币
构架设计
语言逻辑和细节
语言的本质是把消息交付给受众的媒介,不同的语言就是不同的媒介,不同的媒介面向不同的受众。比如,我们要对用户显示文字:“你好,小丽!”,显示的过程就是查一下语言表,根据用户的语言,和当前需要的插值,比如姓名,显示相应的消息:
[td]
Message CodesLocalesTranslations
home.helloenHello, ${username}!
home.hellozh-CN你好, ${username}!
home.helloIW!${username}, שלום
不同语言在细节上略有不同,比如一个物品的单数和复数的形式;比如第三人称,在称呼上男性和女性的区别。
这些都是简单的查表无法应对的问题,需要更复杂的逻辑处理。在代码中你可以无脑地使用条件语句去处理这些特例。此外有一些国际化的框架会发明 DSL (domain specific language) 来专门应对这种情况。以 The project fluent 为例:

还有一个新手容易忽略的问题是行文的方向。中文和英文等常用语言是从左至右的,但是还有一些语言,是从右往左的,比如希伯来文和阿拉伯文。
行文方向的不同不仅仅会影响到文字本身,还会影响到输入的方式。中国人如果从右至左输入会觉得非常的奇怪;而我的一位犹太同事就觉得英文和犹太文混着输入轻而易举。
还有一种情况就是布局。整个 UI 的布局、视觉元素比如箭头的方向。都可能会根据语言的方向的不同而发生变化。你的 HTML 需要设置好相应的 dir 属性

如何确定用户的地域?
你可能会问,我们如何知道用户当前的语言设置呢?如果是浏览器的话。在用户请求网页的时候,会有一个 header Accept-Language 标注接受的语言。这些设置来自于用户的系统语言,以及浏览器的设置。移动 App 情况下,通常都会有获取 locale 变量或者常量的 API。还有一种方式是根据用户的IP 或者 GPS 信息知道用户的位置,然后显示相应的语言。如果是跨国公司,用户在注册的时候,通常会标注出用户注册时候的语言习惯、地理区域。
如果用户想要改换语言,网站的做法各有千秋,移动 App 会有相对固定的 API。网页有这样几种方法:
新手在做网站的时候容易忘记在 HTML 上标注 lang 标签。
翻译管理系统
当你注意到如上种种细节。小心翼翼的实现了文字语言的显示之后。你会发现,翻译库的建立和管理,也是一个麻烦的过程。
通常开发者并不会有多语言的功底。这时候就需要引入外部的翻译官或者是别人已经建立好的翻译库。而这里的难点在于,翻译官往往并不是技术人员。如果让他们直接改代码、或者直接跟开发人员沟通,会极大的增加翻译的成成本。所以在硅谷的公司,这种提供给翻译官使用的翻译管理系统 (translation management system),往往是有一个团队专门来做,或者直接采购现有的方案,比如说,闭源收费的 lokalise.co ,或者是开源的 Mozilla Pontoon。翻译管理系统可以统一管理翻译库、项目、审核、任务分配。
这样一来,开发的流程就会变成,首先设计师根据不同的语言和文化习惯,在设计的时候标志出需要注意的地方,比如这个按钮虽然在英文里很短,但是在俄文里面会非常长,要注意不要溢出。然后,开发者开发团队根据设计的需求实现具体的代码逻辑,并在翻译管理系统中提供消息码、上下文的背景、以及一个开发者熟悉的语言写成的例子。再然后,翻译官团队在管理系统中填上各种语言的翻译。最后,开发团队把翻译库拉回代码库中,发布到产品中。
其中,上下文的背景是容易被忽视而且不容易做好的地方。这个需要翻译的消息在UI界面的什么地方?用作什么用途,如果消息过短的话,还应该进一步的解释这个消息是什么意思。那么翻译官有了这个背景知识之后,就能够更加精准地加上其他语言的翻译。如果翻译官对想要表达的信息。无法透彻的理解。他们还需要拥有一个提供反馈的渠道,能够找到产品的设计和开发者询问问题。
这么多的语言和文字,通常都不是由一个翻译官来解决的,这通常需要很多个国家语言身份的人一起来为这个翻译库添砖加瓦。整个过程耗时耗力,所以翻译官通常是有专门的团队来负责的,比如外包给 smartling。
现在我们已经有了代码逻辑和翻译库。接下来的问题是:如何把翻译库的内容搬到产品中?
具体可以有很多不同的实现方式,最直接的就是,静态的做法,每次更新的时候。交一个 diff,然后在 merge 到代码当中。这样在构建的时候,就会有就已经有了相关的翻译资料在代码里面。
还有一种做法是动态地做。一方面,可以去远程的翻译库“拉取”内容,这种情况在网站流量大的时候,可能会有性能问题。但是好处是,翻译永远是最新的。另一方面,想要做优化的话,可以采取“推送”的方式,每次翻译库有新改动,触发一个 webhook 来把内容推到服务器上。
在我看来,维护翻译会比添加翻译更加的繁琐。我曾经看到一些很大的项目,因为更新翻译之后没能够及时的删除老的翻译,导致翻译库过于的庞大,整个项目变得乱七八糟。这个时候如果有一个好的工具,能够保证数据的一致性。会对清洁的代码,有非常大的帮助。
阿里巴巴的 Kiwi 国际化全流程解决方案就做了 linter 和 VS Code 插件来帮助你检查和抽取代码中的翻译。
时间和时区
谈完了语言,接下来是时间和时区问题。因为是全球化的公司,所以说有很多数据是来自于全球、显示给全球的用户的。举个例子。国际航班在设置开始时间结束时间的时候如何保证这个时间在全局是一致的,并且在不同的时区会相应的显示。这非常的重要。同样的情况还应用于一切跟时间有关的事件,比如预定酒店、预定餐馆、安排会议。
首先时间有这样几种典型的表现形式。
  • 自然语言,比如 07:23:01, 星期一 28, 十月 2019 CST AM/PM
  • Unix timestamp (Int 类型),比如 1572218668
  • Datetime. 注意 MySQL 存datetime 的时候会根据服务器时区转化成 UTC 然后存起来,读取的时候再转换回来。但是呢,服务器时区一般都是设置成 UTC 的。这种情况就是,存储不带时区,默认 UTC。
  • ISO Date,比如 2019-10-27T23:24:28+00:00,这是带时区信息的。
我对这些形式没有大的偏好,你如果有相关经验,欢迎留言讨论。
具体在显示的时候。有两个可能出现的转化,一个是,从服务器存储的时区转化成当地时区显示的形式;另外一个是,语言上会由机器代码转换成自然语言。后一步流行的做法是使用强大的处理时间和日期的库,比如 moment.js 和 dayjs。
数字与货币
不同国家区域对于数值的显示,其实是天差地别的。数值中间的逗号和点,在不同的国家,有不同的含义。
en")// => "1,000.1"(1000.1).toLocaleString("de")// => "1.000,1"(1000.1).toLocaleString("ru")// => "1 000,1"
阿拉伯数字并不是在所有区域都通用的,比如 Java 的 String.format 中 1、2、3这种数字在真正的阿拉伯语言里,使用的数字是١、٢、٣

价格方面,同样的货物,在不同的国家地区,是否要显示成当地货币的价值?货币的符号是什么?货币能够精确到哪一位?这些问题统统要先做好准备。
总结本文提到的国际化工具有,翻译管理系统,开源的 Mozilla Pontoon、闭源收费的 lokalise.co。代码上的一致性 阿里巴巴 Kiwi 国际化全流程解决方案。UI 显示上的 moment.js, day.js
如同一切软件系统的开发一样,国际化这件事情没有银弹,好的作品都是靠基本功一点一滴磨出来的。


回复

使用道具 举报

🔗
avenxyc 2019-10-29 04:25:58 | 只看该作者
全局:
非常感谢,很有帮助!
回复

使用道具 举报

🔗
instant_dev 2019-10-29 08:26:40 | 只看该作者
全局:
puncsky 发表于 2019-10-27 22:44
现在我发帖都会被审核吗?

建议楼主只发文章链接和大体 summary, 目前地里没法解析markdown

而且你发的内容过多,很容易触发审核关键字

或者楼主有兴趣的话,可以联系 Warald 在地里开个技术专栏,那样你就不会被审核,而且可以编辑帖子


回复

使用道具 举报

🔗
 楼主| puncsky 2019-10-31 04:44:45 | 只看该作者
全局:
instant_dev 发表于 2019-10-29 08:26
建议楼主只发文章链接和大体 summary, 目前地里没法解析markdown

而且你发的内容过多,很容易触发审核 ...

soga 感谢回复!让我先看看我能够写多少吧 :)
回复

使用道具 举报

🔗
 楼主| puncsky 2019-10-31 04:47:00 | 只看该作者
全局:
设计以人为本的国际化(i18n) 工程方案

敏感词太多贴不了,详情请见 github 的 repo https://github.com/puncsky/syste ... g-i18n-solutions.md



评分

参与人数 1大米 +3 收起 理由
instant_dev + 3 有空可以讲讲你们的区块链项目呀

查看全部评分

回复

使用道具 举报

🔗
instant_dev 2019-10-31 05:48:04 | 只看该作者
全局:
puncsky 发表于 2019-10-30 13:47
设计以人为本的国际化(i18n) 工程方案

敏感词太多贴不了,详情请见 github 的 re ...


有空可以讲讲你们的区块链项目呀
回复

使用道具 举报

🔗
 楼主| puncsky 2019-11-2 07:38:14 | 只看该作者
全局:
instant_dev 发表于 2019-10-31 05:48
有空可以讲讲你们的区块链项目呀

感谢支持,让我来试着写一下区块链的构架。。。写好了告诉你 :)
回复

使用道具 举报

🔗
 楼主| puncsky 2019-11-24 16:17:45 | 只看该作者
全局:
本帖最后由 puncsky 于 2019-11-24 16:21 编辑

谷歌的软件工程:软件开发

本文首发于硅谷io


业界公认,谷歌是一家工程能力超强的公司。它有哪些好的工程实践?我们可以在里面得到哪些启发?其中又有哪些地方是被人诟病的?这些内容比较细致我们慢慢讲,本篇主要是讲开发。


代码库

  • 截止15年有 20 亿行代码存在少量的 Monorepo 单一代码库中,绝大部分代码对所有人是可见的。谷歌鼓励工程师见到有问题就可以改,只要所有人审核通过,就能进库。
  • 几乎所有的开发都是在代码库的头部 (head) 进行的,而不是在分枝上,避免 merge 时候遇到问题,安全修复也更方便。
  • 每个改动都会触发测试,有错几分钟内就能通知作者和审查者。
  • 代码库的每个子树至少有两个所有人,其他开发者可以提交修改,但是所有人批准才能进库。

构建系统

  • 分布式构建系统 Blaze 让编译、链接、测试轻松快速。
  • 成百上千台机器。
  • 可靠性高,确定的依赖输入导致确定的结果输出,不会出现奇怪的不确定的抖动。
  • 快。一个构建结果缓存了,依赖它的构建会直接采用缓存,不必重新勾结。只会重新构建改动的部分。
  • 提交前自检 (pre-submit checks)。一些快速的测试可以在提交前先执行。

代码审查

  • 有代码审查工具
  • 所有改动必须有审查
  • 发现 bug 之后可以去之前的那个审查上指出问题,相关人员会被邮件通知到
  • 实验性质的代码不用强制审查,但是生产环境下的代码一定会被审查
  • 鼓励每个改动尽量小。百行以内是“小”,三百行以内是“中”,一千行以内是“大”,超过一千行是“超tm大”。

测试

  • 单元测试
  • 集成测试、回归测试
  • 提交前检查
  • 自动生成测试覆盖率
  • 部署之前做压力测试,并产生相应的关键指标,尤其是延迟、错误率随着负载的变化

Bug 追踪工具



Bugs, feature requests, customer issues, process 等等都记录起来,需要时常 triage 以确认优先级然后分配给相应的工程师。

编程语言
  • 限制有五个官方语言 C++, Java, Python, Go, JavaScript,以便代码重用和开发协作。每种语言有风格指南。
  • 工程师要经历代码可读性培训。
  • 当然某些场合的 DSL (Domain-specific language) 也不可避免。
  • 这些语言之间的数据交互主要是通过 protocol buffers。
  • 通用流程很重要,不同的语言,同样的工作流程

Debug 和分析工具

  • 服务器崩溃时,崩溃信息会自动记录下来。
  • 内存泄漏会附带上当前的 heap 对象。
  • 有大量的 web 工具帮你检测 RPC 的请求、改变设置、资源消耗等等。

发布

  • 大多数的发布工作是普通的工程师自己做的
  • 及时发布很重要,因为快速的发布节奏能够极大地激励工程师多干活、更快地得到反馈
  • 典型的发布过程:
    • 找最新的稳定 build ,做一个 release branch,可能再附带 cherry-pick 一些小改动
    • 跑测试与构建、打包
    • 发布到 staging 服务器上内部测试,这时候可以 shadow 一下线上的流量,看看有没有问题
    • 发布到 canary 上承接少量的流量公开测试
    • 逐渐发布给所有的用户

对发布的审查



用户可见的、或者是重大的发布必须有相关的法务、隐私、安全、可靠性、业务需求相关的审查批准,确保相关人员被通知到。有专门的工具来辅助这个流程。

尸检报告


有重大的 outage 事故发生之后,相关责任人必须写尸检报告,内容包括
  • 事件标题
  • 总结
  • 影响:发生了多久、影响了多少流量、损害了多少利润
  • 时间轴:记录时间的发生、诊断和消弭
  • root causes
  • 做的好的地方,做的不好的地方:有什么经验能够帮助他人在下一次更快更准地找到并解决问题?
  • 接下来的可行动作:有什么接下来可以做的事情能够避免将来类似的事情发生?
对事不对人,这里的关键是理解问题本身、以及将来如何避免类似问题。

重写代码


大量的软件每隔几年就会被重写一次。坏处是确实成本高,好处是
  • 保持敏捷。市场在变,软件的需求也一直在变,代码也需要随之变化以应对不时之需。
  • 降低复杂度。
  • 传承知识给新人,让他们有拥有感。
  • 提高工程师的移动性,促进跨领域创新。
  • 采用最新的技术栈和方法论。

我的评论



谷歌的单一代码库和强大的构建系统是小公司不可学的,毕竟小公司没有资源和能力让构建系统快到敏捷可用;保持小、简单、快速会让小公司跑得更顺畅,更加专注于核心业务逻辑。
构建系统通常是定制化的,你的知识无法迁移和衍生。强大的构建系统对新手甚至是有害的,因为提高了新手俯瞰全局的成本。
知识无法迁移和衍生也是完善的内部工具 (in-house tools) 的问题。我在职业生涯中会尽量避免使用不会开源的内部工具,比如 Uber 的 Schemaless,只针对特定的场景且没打开放出来算做大做强 ;而相反的, Linkedin 的 Kafka 则是一个有开放性和衍生性的知识的好产品。
在公开市场,这整个开发、测试、集成、发布的流程都有非常好的工具帮你来做,举个 JS 社区的例子:
[td]
流程工具
代码库Github, Gitlab, Bitbucket, gitolite
代码审查Github Pull Requests, Phabricator
提交前自检、测试与 Linthusky, ava, istanbul, eslint, prettier
Bug TrackingGithub Issues, Phabricator
测试与持续集成CircleCI, TravisCI, TeamCity
部署发布在线服务的 Heroku, Netifly, 发布移动 App 的 Fastlane, 发布库的 NPM


最后,我可能有一个洞见,不注重这些工程流程自动化的细节的公司,在工程上会损失巨大的竞争力。我甚至为了良好的工程实践自己配了一个 JS 全栈开发框架 OneFx。快节奏与慢节奏、高质量与低质量差别,通常是指数级别的,因为 —— 通常,快会让你更快更多,差会让你更差更少。


如果这篇文章对你有帮助,请在 github 上 follow 我
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表