那时,天下人的口音、言语,都是一样。他们往东边迁移的时候,在示拿地遇见一片平原,就住在那里。他们彼此商量说:“来吧!我们要作砖,把砖梢头了。”他们就拿砖当石头,又拿石漆当灰泥。他们说:“来吧!我们要建造一座城和一座塔,塔顶通天,为要传扬我们的名,免得我们分散在全地上。”耶和华降临,要看看世人所建造的城和塔。
耶和华说:“看哪!他们成为一样的人民,都是一样的言语,如今既作起这事来,以后他们所要作的事,就没有不成就的了。我们下去,在那里变乱他们的口音,使他们的言语彼此不通。”于是,耶和华使他们从那里分散在全地上;他们就停工不造那城了。因为耶和华在那里变乱天下人的言语,使众人分散在全地上,所以那城名叫巴别(就是“变乱”的意思)。
这是《圣经·旧约·创世记》第十一章的故事——巴别塔和变乱口音。我引用这个故事,是想说:“言语和沟通是成就事情的一大障碍”。非但建造通天塔如是,对于软件开发,也是一样的道理。
我拿巴别塔譬喻软件开发,看起来有点风马牛不相及,实则其致一也,古今同也。
扯淡完毕,来聊聊当你所用技术有了新发展后可能会发生的事儿吧。
C++11是一门全新的语言?
看我博客的朋友们都知道,我最熟悉的语言是C++,这一点我在“程序员这样优化简历,一投制胜”一文中也提及过。然而,十来年了,我一直都在用C++98……想起来真是汗颜,C++03我都不了解……更别说C++11了……那天我女儿听说了这件事,就用冰棍里面的棍棍编了把扇子送给我遮脸,这事儿就不再提了。
我决定学习C++11还是因为我的第一本书《Qt on Android核心编程》的一个非常认真非常严谨的读者(致谢致谢致谢),他给我来信,说我这本书有一大半的篇幅在讲Qt基础,讲得非常好,比市面上的Qt书都好,但有一个缺点:就是没有讲C++11在Qt里的应用。
我看了信很是汗颜,那是2014年了吧,我居然只是听说而从未去了解过C++11到底是几个意思。当时我也不好意思说我不懂,只说改版时会加进去。然而到现在也没改版……我也很少用Qt了,也没改版的动力了……
不过呢,我还是下了决心了解了一下C++11,决心引入到在做的产品里。然后呢,还准备录一个《C++11 in Qt》的视频课程,要给自己个理由去学习新技术,还要把新技术用起来,不然知道、了解等于扯淡——虽然我现在扯淡惯了,还是会不好意思的。
我这篇文章其实是来扯淡的,C++11只是个引子,所以不会针对C++11相对C++98或C++03的改变来细谈,想了解的Google吧(度娘也行——当然作为程序猿你可能是拒绝度娘的)。
C++11里引入了初始化列表、统一的初始化模式、Range-based for loop、线程、自动类型推断(auto和decltype)、lambda表达式等等新特性,组合使用它们,可以让你的代码神鬼难读,你可能觉得这是C++标准委员会和Bjarne Stroustrup故意搞的巴别,特意来变乱程序员的语言的。My God,终于和文章开始的“巴别塔和变乱口音”联系上了吧,别说我不着边际了,现在我要擦干眼泪来show代码了:
auto it = m_msgHandlers.find(strCommand); if (it != m_msgHandlers.end()) { for_each(it->second->begin(), it->second->end(), [&message](MessageHandler*&handler){ handler->handleMessage(message); }); }
你觉得上面这段代码好读吗?我是觉得不太好读,我的几个同事看了这段代码第一反应也是不理解——这都什么玩意儿啊这!不过如果你用过Scala的函数式编程,就会感到很亲切。
还有一段代码:
class XXX { public: struct UIViewZCompare { bool operator()(UIView* a, UIView* b) const { return a->zOrder() < b->zOrder(); } }; ... protected: std::multiset<UIView *, UIViewZCompare> m_views; }; ... void XXX::doPaint() { ... for (auto v : m_views){ v->paint(m_canvas); } ... }
也挺难读的吧?
这就是我今天要说的问题:当你想要使用某项技术的新特性时,将会面临“to be or not to be”的问题。
用还是不用?
Ok,到这里才算进入正题。
我上高中的时候,物理老师讲课特别有意思,大家都很爱听他的课。原因是一堂课45分钟,他用30分钟议论时政或者讲故事,然后10分钟麻溜儿地把课讲完,提前5分钟下课!
遗憾的是这样有意思的老师不多,而且也常常会遭到不明就里的家长的投诉……这位我最喜欢的老师就因为被家长投诉到校长那里而有一段时间改变了讲课风格,努力把10分钟能讲完的内容拉长到60分钟。
啊呀,又扯远了,不过正题儿说起来也快,几句话就完了。我的建议是:让我们排除万难,使用同一种语言。
作为程序员,技术演进必然要跟进,跟进得太慢了你都不好意思和别人说话,人家都用auto代替诸如“std::map<std::string, std::list>::iterator”这种又长又难记又难敲的类型了,你还不知道auto是干嘛的,会脸红的吧……
有人说我用了别人看不懂怎么办?别担心,他们看不懂会因为不好意思而去学的。这样也算是帮助别人进步,助人为乐啊。你只要管理好自己,改变自己,就可能影响别人。
甘地曾说:“在这个世界上,你必须成为你想看到的改变。”如果我们不在日常之中实践我们想要的改变,到头来就是被组织和环境改变、异化而无法改变组织和环境。
除此之外,你还可以更进一步,通过在团队里布道,主动带别人玩儿,比如吃饭时聊,比如组织分享会,比如说服你的上级使用新技术……只要你决定去做,总是有各种方法来实现你的目的。想做事儿的人找方法,不想做事儿的人找借口,就是这么个道理。