Andreia Gaita[1] 在 OSCON 开源大会上发表了一个题为跨平台开发者的自白[2]的演讲。她长期从事于开源工作,并且为Mono[3] 工程(LCTT 译注:一个致力于开创 .NET 在 Linux 上使用的开源工程)做着贡献,主要以 C#/C++ 开发。Andreia 任职于 GitHub,她的工作是专注构建 Visual Studio 的 GitHub 扩展管理器。

我在她发表演讲前就迫不及待的想要问她一些关于跨平台开发的事,问问她作为一名跨平台开发者在这 16 年之中学习到了什么。

在你开发跨平台代码中,你使用过的最简单的和最难的代码语言是什么?

我很少讨论某种语言的好坏,更多是讨论是那些语言有哪些库和工具。语言的编译器、解释器以及构建系统决定了用它们做跨平台开发的难易程度(或者它们是否可能做跨平台开发),可用的 UI 库和对本地系统的访问能力决定了与该操作系统集成的紧密程度。按照我的观点,我认为 C# 最适合完成跨平台开发工作。这种语言自身包括了允许快速的本地调用和精确的内存映射的功能,如果你希望你的代码能够与系统和本地函数库进行交互就需要这些功能。而当我需要非常特殊的系统功能时,我就会切换到 C 或者 C++。

你使用的跨平台开发工具或者抽象层有哪些?

我的大部分跨平台工作都是为其它需要开发跨平台应用的人开发工具、库和绑定binding,一般是用 MONO/C# 和 C/C++。在抽象的层面我用的不多,更多是在 glib 库和友元friends方面。大多数时候,我用 Mono 去完成各种跨平台应用的,包括 UI,或者偶然在游戏开发中用到 Unity3D 的部分。我经常使用 Electron(LCTT 译注:Atom 编辑器的兄弟项目,可以用 Electron 开发桌面应用)。

你接触过哪些构建系统?它们之间的区别是由于语言还是平台的不同?

我试着选择适合我使用的语言的构建系统。那样,就会很少遇到让我头疼的问题(希望如此)。它需要支持平台和体系结构间的选择、构建输出结果位置可以智能些(多个并行构建),以及易配置性等。大多数时候,我的项目会结合使用 C/C++ 和 C#,我要从同一源代码同时构建不同的配置环境(调试、发布、Windows、OSX、Linux、Android、iOS 等等),这通常需要为每个构建的输出结果选择带有不同参数的不同编译器。构建系统可以帮我做到这一切而不用让我(太)费心。我时常尝试着用不同的构建系统,看看有些什么新的变化,但是最终,我还是回到了使用 makefile 的情况,并结合使用 shell 和批处理脚本或 Perl 脚本来完成工作(因为如果我希望用户来构建我的软件,我还是最好选择一种到处都可以用的命令行脚本语言)。

你怎样平衡在这种使用统一的用户界面下提供原生的外观和体验的需求呢?

跨平台的用户界面的实现很困难。在过去几年中我已经使用了一些跨平台 GUI,并且我认为这些事情上并没有最优解。基本上有两种选择。你可以选择一个跨平台工具去做一个并不是完全适合你所有支持的平台的 UI,但是代码库比较小,维护成本比较低。或者你可以选择去开发针对平台的 UI,那样看起来更原生,集成的也更好,但是需要更大的代码库和更高的维护成本。这种决定完全取决于 APP 的类型、它有多少功能、你有多少资源,以及你要把它运行在多少平台上?

最后,我认为用户比较接受这种“一个 UI 打通关”了,就比如 Electron 框架。我有个 Chromium + C + C# 的框架侧项目,有一天我希望可以用 C# 构建 Electron 型的 app,这样的话我就可以做到两全其美了。

构建/打包系统的依赖性对你有影响吗 ?

我依赖的使用方面很保守,我被崩溃的 ABI(LCTT 译注:应用程序二进制接口)、冲突的符号、以及丢失的包等问题困扰了太多次。我决定我要针对的操作系统版本,并选择最低的公有部分来使问题最小化。通常这就意味着有五种不同的 Xcode 和 OSX 框架库,要在同样的机器上相应安装五种不同的 Visual Studio 版本,多种 clang(LCTT 译注:C语言、C++、Object-C、C++ 语言的轻量级编译器)和 gcc 版本,一系列的运行着各种发行版的虚拟机。如果我不能确定我要使用的操作系统的包的状态,我有时就会静态连接库,有时会子模块化依赖以确保它们一直可用。大多时候,我会避免这些很棘手的问题,除非我非常需要使用他们。

你使用持续集成(CI)、代码审查以及相关的工具吗?

基本每天都用。这是保持高效的唯一方式。我在一个项目中做的第一件事情是配置跨平台构建脚本,保证每件事尽可能自动化完成。当你面向多平台开发的时候,持续集成是至关重要的。没有人能在一个机器上构建各种平台的不同组合,并且一旦你的构建过程没有包含所有的平台,你就不会注意到你搞砸的事情。在一个共享式的多平台代码库中,不同的人拥有不同的平台和功能,所以保证质量的唯一的方法是跨团队代码审查结合持续集成和其他分析工具。这不同于其他的软件项目,如果不使用相关的工具就会面临失败。

你依赖于自动构建测试,或者倾向于在每个平台上构建并且进行本地测试吗?

对于不包括 UI 的工具和库,我通常使用自动构建测试。如果有 UI,两种方法我都会用到——针对已有的 GUI 工具的可靠的、可脚本化的 UI 自动化少到几乎没有,所以我要么我去针对我要跨我所支持的平台创建 UI 自动化工具,要么手动进行测试。如果一个项目使用了定制的 UI 库(比如说一个类似 Unity3D 的 OpenGL UI),开发可编程的自动化工具并自动化大多数工作就相当容易。不过,没有什么东西会像人一样双击就测试出问题。

如果你要做跨平台开发,你喜欢用跨编辑器的构建系统,比如在 Windows 上使用 Visual Studio,在 Linux 上使用 Qt Creator,在 Mac 上使用 XCode 吗?还是你更趋向于使用 Eclipse 这样的可以在所有平台上使用的单一平台?

我喜欢使用跨编辑器的构建系统。我更喜欢在不同的IDE上保存项目文件(这样可以使增加 IDE 变得更容易),通过使用构建脚本让 IDE 在它们支持的平台上去构建。对于一个开发者来说编辑器是最重要的工具,学习它们是需要花费时间和精力的,而它们是不可相互替代的。我有我自己喜欢的编辑器和工具,每个人也可以使用他们最喜爱的工具。

在跨平台开发的时候,你更喜欢使用什么样的编辑器、开发环境和 IDE 呢?

跨平台开发者被限制在只能选择可以在多数平台上工作的所共有的不多选择之一。我爱用 Visual Studio,但是我不能依赖它完成除 Windows 平台之外的工作(你可能不想让 Windows 成为你的主要的交叉编译平台),所以我不会使用它作为我的主要 IDE。即使可以,跨平台开发者的核心技能也是尽可能的了解和使用大量的平台。这就意味着必须很熟悉它们——使用该平台上的编辑器和库,了解这种操作系统及其适用场景、运行方式以及它的局限性等。做这些事情就需要头脑清醒(我的捷径是加强记忆),我必须依赖跨平台的编辑器。所以我使用 Emacs 和 Sublime。

你之前和现在最喜欢的跨平台项目是什么?

我一直很喜欢 Mono,并且得心应手,其它的项目大部分都是以某种方式围绕着它进行的。Gluezilla 是我在多年前开发的一个 Mozilla 绑定binding,可以把 C# 开发的应用嵌入到 Web 浏览器页面中,并且看起来很有特色。我开发过一个 Winform 应用,它是在 linux 上开发的,它可以在 Windows 上运行在一个 Mozilla 浏览器页面里嵌入的 GTK 视图中。CppSharp 项目(以前叫做 Cxxi,更早时叫做 CppInterop)是一个我开始为 C++ 库生成 C# 绑定binding的项目,这样就可以在 C# 中调用、创建实例、子类化 C++ 类。这样,它在运行的时候就能够检测到所使用的平台,以及用来创建本地运行库的是什么编译器,并为它生成正确的 C# 绑定binding。这多么有趣啊。

你怎样看跨平台开发的未来趋势呢?

我们构建本地应用程序的方式已经改变了,我感觉在各种桌面操作系统的明显差异在慢慢变得模糊;所以构建跨平台的应用程序将会更加容易,而且对系统的集成也不需要完全本地化。不好的是,这可能意味着应用程序易用性更糟,并且在发挥操作系统特性方面所能做的更少。库、工具以及运行环境的跨平台开发是一种我们知道怎样做的更好,但是跨平台应用程序的开发仍然需要我们的努力。


via: https://opensource.com/business/16/5/oscon-interview-andreia-gaita

作者:Marcus D. Hanwell [4] 译者:vim-kakali[5] 校对:wxy[6]

本文由 LCTT[7] 原创翻译,Linux中国[8] 荣誉推出


[1]: https://twitter.com/sh4na
[2]: http://conferences.oreilly.com/oscon/open-source-us/public/schedule/detail/48702
[3]: http://www.mono-project.com/
[4]: https://opensource.com/users/mhanwell
[5]: https://github.com/vim-kakali
[6]: https://github.com/wxy
[7]: https://github.com/LCTT/TranslateProject
[8]: https://linux.cn/

推荐文章

点击标题或输入文章 ID 直达该文章

262 我是如何从 Web 开发转向移动开发的?

1070 一大波有用的 bash 别名和函数

1100 为什么一些古老的编程语言不会消亡?

将文章分享给朋友是对我们最好的赞赏!

内容转载自公众号

Linux中国
了解更多

一位跨平台开发者的自白相关推荐

  1. 炸鸡鸭背后的真相 —— 一位良心发现者的自白[转]--希望提起大家的注意力

    炸鸡鸭背后的真相 -- 一位良心发现者的自白 学习传统文化一年多了,今年四月,偶然回家乡一趟,闻到满大街油炸食品的香味,想起两年前我做炸鸡鸭生意时的一段生涯,真的是不堪回首,因此把一些永生难忘的经历写 ...

  2. 一个独立开发者的自白:我如何在一年赚得60万美元(IOS儿童教育软件)

    一个独立开发者的自白:我如何在一年赚得60万美元 发表于6小时前| 1787次阅读| 来源L'Escapadou博客| 7 条评论| 作者L'Escapadou 推广盈利移动开发移动应用开发经验iOS ...

  3. 开发者的自白_普通开发者的自白

    开发者的自白 I've always been an average developer. Not bad, but nothing extraordinary. I worked at some r ...

  4. Visual Studio 2022这些重大更新,影响每一位.NET开发者!

    难得五一长假,蹲家里盘点了一下这2年.NET的发展,可谓日新月异,重现辉煌,各种重磅更新接踵而至: 1 .NET Core3.1各种最受欢迎.性能排行等榜单霸榜,3个月增加100w的关注者: 2 .N ...

  5. 这位.NET开发者曾说:“GitHub 存在的意义,是帮助开发人员”,但还是要离职了...

    Nat Friedman 曾说:"GitHub 存在的意义,是帮助开发人员." 今天,GitHub 首席执行官 Nat Friedman 宣布即将于本月 15 日卸任,转而成为名誉 ...

  6. PPDE迎新 | 欢迎18位AI开发者加入飞桨开发者技术专家计划!

    PPDE计划是飞桨开发者技术专家的荣誉认证体系,无论是热爱编程开发的资深程序员.大型技术社区的引领者,还是顶级开源软件的Committer.新兴科技公司创始人或CTO,这些开发者技术专家将通过线上线下 ...

  7. 聚百川之源,欢迎28位AI开发者加入飞桨开发者技术专家计划!

    PPDE计划是飞桨开发者技术专家的荣誉认证体系,无论是热爱编程开发的资深程序员.大型技术社区的引领者,还是顶级开源软件的Committer.新兴科技公司创始人或CTO,这些开发者技术专家将通过线上线下 ...

  8. 一位iOS开发者的进阶之旅

    背景 这篇文章来源于v2ex上的一个帖子:"iOS开发有什么国人写的比较好的书籍推荐?"(原文链接).这里汇总的基本都是lujie2012的回答,另外我还附带了一些他与别人的讨论内 ...

  9. 一位前端开发者的计算机视觉学习之路——专访《Chrome扩展及应用开发》作者李喆

    李喆从2011年开始接触Chrome扩展程序开发并发布了多款扩展程序,同年10月,他收到了新浪微博前端高级工程师职位的offer,次年4月火狐邀请他参与火狐浏览器扩展开发的工作.现在,李喆是吉林大学电 ...

最新文章

  1. 大多数人都不知道,人类基因组正在衰败
  2. 【RocketMQ工作原理】消息的消费
  3. Win7 防火墙添加端口
  4. 后台开发实用书籍--后台开发:核心技术与应用实践
  5. Python函数的定义和使用
  6. html底部自动加载下一页,js页面滚动到底部时自动加载下一页数据
  7. c#erp项目源码 mysql_Jsp+Ssm+Mysql实现图书馆预约占座管理系统项目源码(可带论文文档)...
  8. iOS UIWebView加载网页、文件、HTML
  9. win7下搭建PHP mysql_简单介绍win7下搭建apache+php+mysql开发环境
  10. json文件内容+csv保存文件[Python]
  11. C++ Qt 压缩与解压缩代码演示
  12. FTP搜索引擎开发文档前言部分
  13. 原型设计工具——axure认识与使用
  14. 非银行支付机构网络支付业务管理办法
  15. 相见恨晚,真的很喜欢Udacity
  16. B站手机APP缓存视频(m4s)转换为mp4格式
  17. NVIDIA vulkan driver的安装和Jetson平台上vulkan sdk的制作
  18. 尚硅谷Redis6从入门到精通
  19. opencv.js 4点透视变换
  20. 黑苹果常见问题博文及网页部分集锦

热门文章

  1. Jmeter录制app脚本
  2. [MySQL]关于amd.dll后门病毒入侵3306端口的临时解决方案
  3. 【转】10个让人受益的管理原理
  4. 谈通过测试与失败测试
  5. NDK/JNI01--NDK下载配置
  6. 在 k8s 以外的分布式环境中使用 Dapr
  7. 极简实用的Asp.NetCore模块化框架决定免费开源了
  8. 2021.NET Conf China上的GraphQL
  9. 为什么 ASP.NET Core WebAPI 继承 ControllerBase 而不是 Controller ?
  10. .NET程序崩溃了怎么抓 Dump ? 我总结了三种方案