为什么80%的码农都做不了架构师?>>>   

作者简介:

任旻,北京工业大学硕士, 2005年加入微软中国有限公司,2009年加入腾讯,现任高级工程师,曾负责开发“QQ概念版”、“Q+”、”QQ互联”、“iPad QQ”等产品。腾讯学院讲师,专利达人。一直从事互联网领域软件开发和生态系统建设等工作。


Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用。Swift 结合了 C 和 Objective-C 的优点并且不受C兼容性的限制。Swift 采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣。

首先我们考察一下Swift究竟是一个什么样的变成语言。在2014年苹果的WWDC(世界开发者大会)上,Swift首次亮相。苹果号称Swift有3大特性:

安全(SAFE)
现代(MODERN)
强大(POWER)


安全特性:变量和常量的类型安全

例如在下面的代码中,Swift用关键字let声明常量,关键字var声明变量。

在声明时可以指定常量和变量的类型,也可以不指定类型,而是直接赋值。Swift会通过所赋值的类型自动将定义变量的类型。

如果声明时不进行赋值,那么每个类型的变量都有自己的默认值。

例如Double类型的变量,默认值是0。这点与Objective-C、C++和C语言不同,不对变量赋值的话,那么变量的默认值是一个随机数。如果不注意这点,则很容易由此导致Bug的产生。使用Swift语言则可以避免这种情况发生,所以说Swift是类型安全的。

另一个安全特性是在流程控制方面。例如下面代码中switch语句有2个case语句。分别代表legCount为0和为1至13奇数的情况。然而显然除了这两种情况之外,legCount还可能是其他的值,比如:2或15等等。

Swift的语法规定,如果case语句不能覆盖所有可能的情况,则必须加default语句来处理其他情况。否则编译不能通过。

这样可以避免由于程序员疏忽,流程没有被switch-case经过处理,而引起的逻辑错误。

我们可以看到Swift中的安全特性确实有助于新手减少Bug和逻辑错误。但是类似于“变量声明时就有初始值”的特性在JavaScript,C#等多种现代语言中早已实现了。

在功能强大方面,有一个特性中是对字符串操作的简化,在下面的代码中,Swfit可以用(a)的形式,代替C语言中对字符串format操作。大大简化了代码,增加了程序的可读性。

无独有偶,在WWDC2015中,苹果在新版的Safari和WebKit中增加了一个针对JavaScript的新特性。这个特性可以使用${变量}的符号,代替传统的使用“+”对字符串进行拼接的操作。

在项目实践中,类似的字符串拼接应用较多的是日志操作。一般都已经封装成为组件了。所以,虽然这种语法可以简化代码,但对于工程的影响不大。


支持Unicode

例如下面的代码中可以直接使用苹果的emoji图标写程序。每一个小老鼠的图标可以作为一个字符(character)处理。

网上还有网友利用Swift的这个特性写了一个诺亚方舟的故事。

另一个强大的功能是For-in语句的增强。

比如在For-in语句中使用0…4表示循环时取[0,4]的闭区间内整数值。

还可以在For-in中使用“元组”遍历Dictionary。

另外用“n…m”的形式表示[n,m]闭区间的语法也可以应用在switch-case语句中:

以上就是苹果WWDC2014中对Swift功能强大方面的一些介绍。然而,从上面的例子可以看出,这些新特性更像是一些语法糖。语法糖在维基百科上的定义如下:

语法糖(Syntactic sugar),也译为糖衣语法,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

维基百科上除了有语法糖,还有“语法盐”和“语法糖精”2个概念。分别代表特别难用的语法,和看似很好用但实际有害的语法。 比如在Swift beta版中,在for-in语句中可以使用“n..m”语法,表示从n开始,循环m次。例如:

但是在正式版中,这种写法被取消了。因为“n..m”和“n…m”这两种写法太相似了,如果都保留就会引起混淆,降低程序的可读性,成为“语法盐”或者“语法糖精”了。

现在评价Swift中的新语法是语法糖还是语法盐还为时尚早,需要时间和市场的检验。


考察Swift中Modern的特性

首先是闭包。在下面的代码中,repeat函数可以接受一个闭包类型的task参数。在调用repeat函数时,传入的第二个参数是一个函数体,其中包含了一行打印语句。

那么什么是闭包呢?

闭包有以下3个特点:

  • 匿名函数(方法);
  • 可以被执行;
  • 可以被作为参数传递。

提到闭包,想必很多人都会想到JavaScript。我们就来对比一下JavaScript的闭包。

我们可以看到在上述代码中,sayAlert是闭包,也满足上述3个特点。

其实满足上述3个特点的语法还有很多,只是名字不一样而已。比如Java和C#中的Lamda表达式:

这是一段C#代码,delegate关键字用于定义一个函数签名。比如用del为名称,定义了一个参数int返回int的函数。接下来用Lamada表达式定义了函数体为“x =>x * x”表示返回参数x的平方。

此时myDelegate可以被调用和传递,因此就成为了一个闭包。

更广义的说,C中的“指向函数的指针”也满足上述的3个条件。

因此,闭包虽然是现代语言的特性,但是很多语言都支持,并不能算一个很新颖的特性。


泛型

在Swift中使用泛型很方便,语法和Java、C#、C++也很类似。

不过使用Objective-C的朋友也有福了,在即将发布的XCode7中,Objective-C也支持泛型了。

因此我们大可不必因为泛型而转向Swift。

Swift中还有一个特性是“nullable”的变量类型,也叫可选(Optional)变量。

这是一个很方便的特性。比如一个返回值为int的函数,可以通过返回nil来表示函数出错的情况。而不需要使用NSError,也不需要通过返回某些特殊int值来表示错误,比如“-1”或“-IntMax”。

不过类似的语法在10年前的C# 2.0中就出现了。

以上是微软官网MSDN上的示例代码。可以看到,双问号“??”操作符也是在C#中先出现的。

以上是苹果WWCD2014中介绍的Swfit 1.0的特性,在今年的WWDC2015中,苹果发布了Swift 2.0。其中增加了一个呼声特别高的特性:通过类似try-catch的语法支持Error处理。

通过示例代码可以看出,Swift支持使用多个catch语句捕获不同类型的Error,而且也支持使用finally语句。

不过这WWDC 2015大会上PPT中的代码与微软官方文档中的一段代码非常相似:

介绍了这么多Swift的特性,那么应该如何评价Swift语言呢?

从客观上讲,Swift中确实包含了“安全、现代、强大”的特性,但是这些特性在其他语言上早就有支持。因此这些特性与其他语言相比(包括Objective-C)并没有绝对优势。

对于一个编程语言,除了语言特性之外,还可以从以下3个方面进行比较:

  • 代码效率
  • 学习成本
  • 生态环境

其中代码效率又可以分为代码的“书写效率”、“编译效率”和“运行效率”。如果与 Objective-C比较,Swift在书写效率上完胜。

在编译效率上,由于Swift没有.h头文件和一些其他特性,因此比Objective-C在理论上要快。

但是从实际工程上来讲,我们内部的一个iOS项目,包含了几千个Objective-C的文件,完全编译一次需要30分钟左右。

对于这种情况来说,显然不能通过迁移到Swift来解决,而是需要重构。如果是小型项目,则编译时间相差就不大了。

对于Swift和Objective-C的运行效率,primateLab进行了一个对比测试。结果如下:

通过右侧的平均值对比可以看出:

  • 在CPU负荷较大的Mandelbrot的测试中,Swift取得了与C++相近的成绩。
  • 在GEMM测试中(侧重于大数据在有限内存中顺序读取操作),Swift与C++差距变大了。
  • 在FFT测试中(大数组随机读取),C++取得的成绩是Swift的近10倍。

因此可以看出,从运行效率上看,Swift不能完全胜任所有的场景。

综上所述:Swift在代码效率的3各方面,虽然有一定优势,但是还不能由此得出“我们应该转向Swift”的结论。

我们继续从第三个方面:学习成本上考察Swift。

Swift虽然属于类C(C-Family)的语言,在保留了大括号,if-else,do-while,swich-case-default 等语法元素之外,也创新了许多新语法。有些语法形式(比如枚举类型)变化较大。学习Swift语法可能比Objective-C容易一些,但是也不会是零门槛的。

此外使用Swift开发应用必须依赖Cocoa框架,对于之前没有接触Cocoa的程序员,这是一块很大的隐性成本。

这里引用JavaEye社区创始人Robin的一句话供大家参考:

对程序员来说,熟悉Swift语法也不过一天时间足够了。关键是要提供高级数据类型,简化Cocoa类库,否则用不用Swift都没区别。
Swift语言的学习成本并不像媒体上宣传得那么低。所以我们还需要从第四个方面——生态环境方面进行考察。

生态环境是一个比较抽象的概念。这里我们把生态环境简化为2个问题:

  • 是否有很多开源工程可以借鉴?
  • 有了问题是否能快速找到结论?

对于第一个问题,我们可以参考一下Github上开源项目的统计数据( http://githut.info ):

Swift虽然在“活跃代码库”数量上比较少,但是在“代码库平均分支”数量和“代码库平均关注者”这两个指标上都处于领先地位。由此可以看出,Swift有一群热情非常高的爱好者,尽管爱好者绝对数量可能不多,但是加速的趋势很大。后续的发展是非常值得期待的。

第二个问题“有了问题是否能快速找到结?”,我们可以参考一下 Stackflow 网站做的一个调查。其中最流行语言榜单中,与Github一样,JavaScript排名第一。而Swfit却没有入围。

但是在最受欢迎的语言榜单上,Swift排名第一。

再次证明程序员对Swift的热情很高。

综合上面的两个问题,可以看出Swift的热度很高,但是当前成熟度还不够高。我们接下来考察生态环境中另一个因素:框架。

我们与最流行的JavaScript对比一下。在Google上搜索“JavaScript framework”,可以看到排名靠前的搜索结果是关于JavaScript框架的对比、排名,以及如何选择框架的文章,对于一个具体框架的介绍排名在第五位。而且为大多数人熟知jQuery、Zepto已经不再搜索结果的第一页上了。

由此我们可以看出JavaScript的创新性、活跃度和生命力都非常高,不愧为最流行的语言。

与之相比,Swift就只能基于一种框架进行开发——Cocoa。Swift可以说是与平台强相关的,离开苹果平台,Swift恐怕没有用武之地。最近十几年我们看到微软、诺基亚的起起落落。因此在我们决定是否选择Swift的时候,我们对苹果的前景和信心也是一个重要的考量因素。

以上我们从语言特性、代码效率、学习成本和生态环境4各方面考察了Swift。除此以外,还有一些因素值得考虑。

第一个是调试工具。JavaScript作为一个前台语言为什么这么流行?一个重要因素是诸如像Google Chrome和FireFox等工具为JavaScript提供了相当完善、相当优秀的调试工具。

另外一个因素是跨平台开发。我们是否愿意把自己押宝在一个平台上,赌这一个平台的成败。Php和JavaScript是几乎没有平台的概念。但如果做移动端开发的话,显然还是要选择一个平台的。不过最近Facebook推出了一个框架:Reactive Native。虽然还不完善,但我们可以想象一下,如果我们能用JS开发iOS,那我们还会学Swift吗?

除了开发之外,在实际项目中还有许多工作要做。比如测试,比如对测试结果的分析,对上线后应用运行状况的分析。如果上线后很多用户出现程序闪退,如何知道闪退原因?定位问题?

在腾讯内部,有一个公用的crash定位模块。每个App都可以使用这个模块。这个模块可以帮助App定位和分析crash的数量、类别、原因等信息。 现在这个模块已经对外公布出来了,名为Bugly。腾讯之外的App也可以使用这个模块了。

以上我们对Swift做了多方面的分析和对比。现在可以回答我们在本文一开始提出的问题了。

1.我们是否应该开始学习Swift呢?

结论是肯定的。Swift中融合了许多现代语言中先进的特性。通过学习Swift可以了解现代语言的发展趋势。多掌握一门语言也有助于横向对比,更深刻的了解语言特性的本质,同时也是提高自己的眼界和学习能力的一个高效的手段。

2.我的项目是否应该迁移到Swift?

这个问题要具体情况具体分析。首先要看团队的能力。如果团队的学习能力很强,则可以考虑使用Swift。但是也不绝对,如果团队经验非常丰富,在iOS上面拥有五年以上的开发历史,那就要慎重一些了,因为这样会增加学习成本。如果团队很年轻,经验也不多则可以考虑使用Swift。

接下来还要考虑项目的构成。比如包含上千个C语言的文件,那么转换的成本就太高了。而且会严重影响应用的稳定性。如果是全新的项目,就可以考虑使用Swift了。

从上面的分析可以看出,一门语言对项目的影响并没有那么大,对于程序员职业发展的影响也没有那么大。

程序员可能有很多发展方向,在这些方向上除了关注语言,开发需求,改Bug,还有很多更重要的事情。在下图中我列举了程序员的一些发展方向和对应的关注点。

另外,无论我们做什么工作都需要的一些通用能力,比如学习能力,分析和解决问题的能力,创新能力,传承知识和培养人才的能力,沟通能力等等。


Swift是花拳绣腿吗?

Swift就好比是一套武功招式,它能否发挥巨大威力,不取决于招式本身,而取决于使用者内功。只有自己变强,才能将Swift的特性得到淋漓尽致的发挥,做出优秀的应用。

所以我们还是要关注自身的成长,在Swift的语言之外学习更多的东西。


腾讯Bugly简介

Bugly是腾讯内部产品质量监控平台的外发版本,其主要功能是App发布以后,对用户侧发生的Crash以及卡顿现象进行监控并上报,让开发同学可以第一时间了解到App的质量情况,及时机型修改。目前腾讯内部所有的产品,均在使用其进行线上产品的崩溃监控。

转载于:https://my.oschina.net/bugly/blog/536088

Swift是花拳绣腿吗?——谈谈开发语言与程序员的职业发展相关推荐

  1. 【绝对干货】Swift是花拳绣腿吗?从Swift谈开发语言与程序员的职业发展

    Swift是一种新的编程语言,用于编写 iOS 和 OS X 应用.Swift 结合了 C 和 Objective-C 的优点并且不受C兼容性的限制.Swift 采用安全的编程模式并添加了很多新特性, ...

  2. 软件开发工程师:程序员的职业规划就像软件工程

    软件开发工程师:程序员的职业规划就像软件工程 [url]http://www.accp-teem.com.cn/ArticleView/2007-8-1/Article_View_1224.Htm[/ ...

  3. 剖析Android移动开发程序员的职业发展之路

    剖析Android移动开发程序员的职业发展之路 做Android移动开发已经有三年时间,其中甘苦自知,对Android开发和对Android程序员的职业发展有一些自己的感悟,在这里愿与大家分享和讨论. ...

  4. Android移动开发程序员的职业发展之路

    写在前面: 又是一个阴雨的周末,也不知道是不是在江南待的太久的缘故,每逢阴雨的周末,兴奋的连懒觉都睡不了.看着窗外的细雨,回想起这一路走来的点点滴滴,些许感慨!光阴似箭,岁月蹉跎,未来的路在何方,明年 ...

  5. 【沙龙干货】Swift是花拳绣腿吗?开发语言与职业生涯如何选择?

    腾讯Bugly移动开发者沙龙 第二期:快速发展的Swift是否将淘汰Objective-C? [分享内容]Swift是花拳绣腿?–开发语言与职业生涯的选择 随着WWDC 2015的举行,Swift 2 ...

  6. apk开发语言!程序员如何自我学习和成长?成功入职阿里

    **新技术层出不穷,去年kotlin到如今Flutter,技术迭代,你是否会变得固步自封?**那么看本篇文章帮你解决问题,让你知道怎么样学习,学习那些技术点才能不被时代的迭代快速淘汰! 首先,先说一下 ...

  7. flutter开发语言,程序员工作2年月薪12K,聪明人已经收藏了!

    前言 想要成為一名優秀的Android開發,你需要一份完備的 知識體系,在這裏,讓我們一起成長為自己所想的那樣. 金九银十是大家的換工作潮,在這波浪潮裡沉浮的我經歷過快一個月的面試後,決定把這些遇到的 ...

  8. “六成应用开发不需要程序员”喜提热搜背后,RPA 会抢饭碗吗?

    整理 | 伍杏玲 出品 | 程序人生(ID:coder_life) 近日,一则"六成应用开发不需要程序员"喜提热搜,据 Gartner 数据显示,到 2024 年,全球约有 65% ...

  9. C语言/C++程序员大神打造纯C的电子时钟(加图形库+源码)

    C语言/C++程序员大神打造纯C的电子时钟,每天看时间再也不麻烦了 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进 ...

最新文章

  1. matlab整型和浮点的区别,技术帖 | 心理学MATLAB初学者教程--简单数据类型介绍(逻辑型数据,整型/浮点型数据,字符型)......
  2. WINCE5.0和WINCE6.0的内存与系统架构
  3. 使用Hibernate编写通用数据库操作代码
  4. flink 异步io使用
  5. SAP UI5 Resource bundle getText的实现逻辑
  6. 第二十二篇 玩转数据结构——构建动态数组
  7. 数字孪生技术如何实现复制世界?关键的关键是…
  8. swift 2.0 语法 循环
  9. 圣经是上帝所默示和启示的
  10. 服务超时 — 基本原理
  11. FDQuery 怎么能插入NULL参数
  12. System level Programming study(1)
  13. 通过反射获取类的完整结构(1)--属性方法
  14. 【学习框架】jeeSite 【maven项目】导入后转成web项目 【转载加原创】
  15. 常用 ASCII 码整理
  16. GPyTorch中的超参数
  17. zookeeper应用——集中配置管理系统的实现
  18. XML约束、如何在xml中引入dtd、dtd语法、ENTITY(实体)
  19. android 投屏与控制,android投屏pc及电脑adb控制手机
  20. 云原生开发平台的选择

热门文章

  1. 如何使用Easy-POI导入复杂表头的Excel报表(含源码级分析)
  2. Frps部署报错:cannot stat ‘frp_0.44.0_linux_amd64/frps‘: No such file or directory
  3. SAP CO生产订单的标准成本、计划成本、实际成本和目标成本
  4. docker实现nginx反向代理、负载均衡
  5. java web 题_javaWeb习题与答案
  6. 通过cv2.resize()来改变图片大小
  7. 【软件测试】测试人,我们35岁焦虑怎样破?
  8. oracle水仙花,希腊神话中的水仙花和回声
  9. LeCo-198. 打家劫舍
  10. GANs奇思妙想TOP10榜单