一、问题

最近不少同事离职,公司氛围不太好。我一直在思考几个问题:

为什么离职?

网上传的很火的马云语录曰:员工的离职原因林林总总,只有两点最真实:

  • 钱,没给到位;
  • 心,委屈了。

这些归根到底就一条:干得不爽。
以上两点原因确实可以概括大部分的离职,然而,在职场中还有其他原因的离职,丝毫不罕见:

阅读全文 »

在OC中NSClassFromString这个方法非常实用,基于这个方法可以实现动态生成对象,十分灵活。

1
2
3
//此方法声明在NSObjCRuntime.h
//显然是利用ObjC的runtime机制实现的
Class __nullable NSClassFromString(NSString *aClassName);

然而在Swift中却没有这样的方法(废话,Swift的runtime和ObjC完全不一样嘛),如果Swift也通过ObjC那样的runtime机制来实现,效率就会有明显的折扣了。
不过Swift实在太强大,可以利于语言本身的技巧,可以做到类似的事情:

1
2
3
let className: String = "SampleViewController"
let classes: Dictionary<String, ()->UIViewController> = [className : { return SampleViewController() }]
let viewController = classes[className]!()

利用Swift中的泛型机制、闭包语法,把NSClassFromString问题转化成了Dictionary的依据key查Value问题,非常巧妙地实现了通过String生成对象的机制。
略显麻烦的是,需要支持这个机制的类,都要先把对应的闭包写到Dictionary中。同时要注意,classes[className]返回的是一个optional类型,所以需要!解包,然后通过()调用闭包。

在工作中我开发过的APP都采用了相同的构架,这个构架非常简单易用,在团队写作中带来了诸多便利,我决定写出来分享。

  • 数据和界面分离,在宏观层面上也遵从了MVC的思想
  • 提高代码的可维护性和重用性
  • 在多个App之间低成本快速共享业务
  • 多个App项目组的开发人员横向流动需要快速上手新App的代码

这个简单的构架主要思想是观察者模式,因为不能开源公司产品代码,所以我采用Swift重写构架核心,尽管Swift实现与Objective-C实现存在差异,不过核心思想是相通的,很容易就可以用Objective-C重写一个轮子出来😊😊😊

阅读全文 »

春节越发的乏味,这几年感慨越来越深:既没有团聚的喜悦,也没有假日的休闲。时下的春节很像一锅乱炖的大杂烩,嘈杂,散发各类奇怪的味道,就是没有食物纯粹的本味,令人恶心。

心里有个声音在喊:明年我不想回家过春节了,我就想一个人静静的呆着。
可是我没有说出来,只是留在心里。

我向往的假期,就是静静的随心生活,用最平淡、最普通,最简单的的方式生活。

简单的饭菜,一本书,一杯茶。可以静静的随心做点想做的小事,足矣。

银行卡校验算法(ISO/IEC 7812)蛮简单,轻松撸完。然后又用Swift函数式编程的方法优化了之前的实现,更加喜欢Swift了。

Luhn算法通过函数式编程的Swift实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private func LuhnAlgorithm(digits:String) ->String {

let checksum = digits.characters
.reverse()
.flatMap{ Int(String($0)) }
.enumerate()
.reduce(0) {
let indexIsOdd = $1.0 % 2 == 1
guard indexIsOdd else { return $0 + ($1.1 == 9 ? 9 : $1.1 * 2 % 9) }
return $0 + $1.1
} % 10

return checksum == 0 ? String(checksum) : String(10 - checksum)
}

这个简短的函数已经展示了函数式编程的魅力——实在是太精炼了!
通过函数式编程实现,几乎比原来过程式编程的实现方式减少了一半以上的代码行数,非常精炼,没有任何冗余代码。
上面代码中的flatMap()其实就是map()方法,只不过是Swift里面的一种特殊实现。

同样的,通过函数式编程实现中国大陆身份证号码校验算法,也异常精炼:

1
2
3
4
5
6
7
8
9
10
private func computeCheckSum(idCardNo:String) ->String {

let R:[Int] = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
let checksumMap:[String] = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"]
let sum = R.enumerate().reduce(0) {
return $0 + Int(String(idCardNo[$1.0]))! * $1.1
}

return checksumMap[sum % 11]
}

我接触函数式编程比较晚,第一次接触到map()reduce()filter()这样的高级函数是在工作后学习Python时才了解到的,Swift这种新语言必然少不了这些高级函数,可谓是不知道比Objective-C高到哪里去了,所有的OC程序员都应该学习一个。

大量函数式代码会使算法变得越发的晦涩难读,其实上面的算法不了解的人肯定会觉得晦涩,我之所以觉得精炼美妙,是因为我已经先用过程式的代码实现了一遍,已经理解了算法细节。所以函数式编程用在合适的地方就好,不要滥用。

本质上说,函数式编程过程式编程是两种完全不同的思维方式,后者更符合人类思维方式一些。以后可以在写完过程式的代码,再思考下用函数式该怎么表达,就当是思维体操了。

完整代码在这里:

[1] 银行卡校验算法(ISO/IEC 7812)

[2] 中国大陆身份证校验算法

这个星期繁忙工作中抽空把Swift语法又学一遍。之所以说“又学一遍”,是因为其实在Swift刚面世时,就有去学习过。但是由于实际工作中基本上不用,时间一长就生疏了。如此已经反复了几遍,实在汗颜。

于是我决定直接用Swift写东西练手,杜绝低效重复学习,浪费时间。

本周进展

把Swift语法看了一遍,又用Swift写了身份证号码的校验算法。几点感受:

  • 即使目前Swift已经开发到了2.2版本,可是基本API依旧非常不完善,使用起来很不方便
  • 由于需要考虑到多人协作、公共库维护等问题,Swift目前依旧不适合用到公司项目中,只能用在个人项目或者学习练手
  • 从OC过渡到Swift初期,写出来的Swift代码有浓烈OC风格,强迫症会感觉非常难受

下周计划

继续用Swift把银行卡校验算法写一遍。熟悉Swift最好的办法就是实际用起来,这样就不会生疏和忘记。

2016年立下几个计划,年底的时候回顾看看完成多少。生活一定要有目标,否则就是盲目没有方向的。

  • 开始在github上写开源项目
  • 把Swift熟悉到可以做app的程度
  • 恢复坚持写blog的习惯
  • 健身,跑步、自行车、游泳恢复起来,争取把肚子上的赘肉减掉
  • 读书,并写读书笔记

拖了几年,总算把blog从WordPress迁移到hexo了。
看自己写下的几百篇post,感慨时间好快,几年就过去了。
这次迁移只保留少数文字,其他的从头开始…

恢复码字。

公司有个员工离职了,考勤截止之前他在内网写下了一篇文章。读完全文,有共鸣,有感动,更多的是钦佩和祝福,祝他在未来的生命路途中一帆风顺。
实在不忍如此好文雪藏,全文转出分享。

阅读全文 »

半个月前读友小搞给我推荐了高尔泰的《寻找家园》,我第一时间便去找来阅读,半个月过去了,今天终于彻底读完。翻看阅读过程中的记录,不管是用钢笔记在本子上只言片语的感想,还是键盘敲在文档里零零碎碎的片断体会,竟然都是我所作过笔记最多的一本书。

一句话评书:真实,带着锋利的真实,让我感到一种独特的深刻。

阅读全文 »