人生元编程

metadata

昨天和今天收到了近两百个多看电子书邀请码,我需要编个小程序整理一下格式,去重合并,明天发布到macshuo.com网站上,有需要电子书的读者,您最好手疾眼快了,明天的MacTalk,不见不散。 另外,有读者反映杭州内存快溢出了,暴雨,积水最深处达60公分,希望杭州的读者出行注意安全。

今天这篇有点长,耐心读完会有收获。

如果你是个诗人,那你的人生就是一场风花雪月的事;如果你是个演员,除了学好《演员的自我修养之外》,你的人生就是一场接一场的剧本;如果你是个侠客,对不起,现代没有侠客,你会被抓起来进行休假式治疗;如果你是个程序员,好吧,你的人生将由一行行飘逸的代码和捉摸不定的bug组成,所谓编程人生,就是你的一生已经与编程密不可分,为代码欢笑,为bug忧伤。

那一年你初入江湖,你不懂什么是汇编什么是语言,你搞不懂Lisp和Smalltalk的区别,为什么C++比C多了两个加号就成了对象,2000年以后那么多人都在用Java,现在却说Objective-C是最贵的语言,这特么又是为毛?

你对着大海说,我要学尽天下武功!大海对你说,你算术不太好~~~

孩纸,世界上的编程语言成百上千,常用的也有数十种,光学会这些语言你的时间就得用微积分计算,学完以后估计手抖的都敲不动键盘了,哪还有时间创造奇迹?更别说除了语言你还得掌握前端后端UI体验,这个数据库那个操作系统balabala……

你在知道了这些真相以后,依然痴心不改,抹干眼泪冲到编程兵器排行榜「TIOBE Index」面前,挑选了前十名开始勤学苦练。你在满天星斗的夜色中编写C程序,在清晨的微光中调试算法,上午你敲打键盘输出日志,中午吃完五右四分之一口米饭之后就匆匆离开,因为你要去看看系统为什么崩溃……你学会了五种语言、三种操作系统和四种数据库,你写了一个MIS两个OA三个App,你觉得你开始了编程人生,其实是你的人生被编程了,你被代码驱动和驱赶,你变得疲惫不堪。

这次你在清晨的寒风里对着高山说,这特么是为什么?高山对你说,因为你不懂元编程!


好吧,扯了这么多其实是想和大家谈谈元编程的事儿。元编程?估计小白一听又懵了,啥是元编程呢?与云计算、大数据不同,元编程并不是一个抽象的概念和名词,这里面代表了很多务实的技术,相伴而行的概念还有元数据。

元在英文里就是meta,元编程就是meta programming,元数据就是meta data。元编程就是能够操作代码的代码,元数据就是能够描述数据的数据。

听完这样一个介绍,大家是否更加晕菜了呢?如果回答是肯定的,那么效果达到了。

在接着介绍元编程之前,我们先看一下代码的世界。如果把代码比作一座小镇,那么其中的类、函数、方法、变量、代码块、宏,就是小镇上安居乐业的居民,他们相互协作,相互依赖,一起建设着有XX特色的美好家园。

在能够支持元编程的语言世界里,你可以和这些居民打招呼,还可以进行内省(introspection),获取其自身的一些信息和行为,甚至你能够为这些居民动态增加一些能力和行为,或者在这些居民奔跑的时候改变他们的行为,或者创建一些新的居民。这样的语言有Ruby、Python等。

在不支持元编程的语言世界里,大家分为两个状态,编译时和运行时,一旦编译器完成了自己的工作,这些方法和函数就看不见了,他们成为内存中的幽灵,你只能通过固定的方式使用他们,而无法获取他们自身的信息。当然,即使是这样的语言,为了增加编程的灵活性,也通过各种方式来提升元编程的能力,比如Java和C#笨手笨脚的使用反射方式,C++则通过模板方式,但古老的C就无能为力了,因为他没有元编程能力。

现在我们就知道了,编程语言虽然各有侧重,但是语言和语言之间的能力和特点区别还是很大的,不管你现在使用的是什么语言,我都建议你们去学一门具备原生的元编程能力的语言,比如Ruby、Python、Lisp、Objective-C等。

我第一次接触元编程和元数据还是在一家外企,那家外企的名字和火箭有关,他们有很多年纪一大把的老程序员,据说是制定corba标准的牛人,他们在这个火箭公司开发了一套分布式的软件平台,名字不能提,因为老外的版权意识太强袅。我一位前同事移民国外,只是在自己的开源项目引用了一点平台文档,结果一纸法院传票追杀到异国他乡,而且直接导致这个同事的上司被辞退。「好吧,上司不是我,不过我当时确实想过,如果我引用了他们的代码,也许会见到真的杀手吧。」

这套平台的持久化、权限和业务逻辑引擎都采用了元编程和元数据的方式实现,实现语言是Python,当时看到那些优雅的代码,我再次感受到编程的魔力,原来代码还可以这样写!我在那个外企的两点收获,第一是平台和元编程,第二是版权意识。后来当我有机会主导从头构建一个软件开发平台的时候,我吸取了这些思想和经验,基于元编程的思路构建了平台组件数据字典,你可以编写少量代码或不编写代码就生成各种业务应用,这就是操作代码的代码,描述数据的数据。

这时候就有童靴问了,你啰哩啰嗦扯了这么多元编程,干嘛标题叫做人生元编程?

因为无论是编程还是人生,都特么是相通的,想清楚了这一点,你就会觉得百无聊赖,因为万事万物要么是熊样要么是鸟样,都脱不出那个框框。具备元编程的语言就具备更强大的操控自己的能力,可以自省,可以反射,可以动态改变和控制自己;具备人生元编程能力的人,同样有自省能力,随时检查和控制自身的情绪和行为,思考自己的想法,改变大脑的动机。

举个简单的例子,当你的理智告诉自己9点就必须开始看书学习的时候,你的大脑会对你说,「亲,可以再看会电视呦,你看沙发都这么舒服……」

缺乏元编程能力的回答是「那……就再看会」,具备元编程能力的回答是「滚!」

扯淡完毕,大家感受一下……


文章内容来自微信公众账号:MacTalk
· 微信号:sagacity-mac
· 回复 m 可以查阅所有历史文章和Mac Tips
· Web站点:macshuo.com

如果您希望持续看到MacTalk,可以点击{阅读原文}对作者进行小额赞助,最近遭遇多起大额捐助,再次感谢,其实来杯咖啡就行,想捐助美刀的,去macshuo.com看看PayPal

31 thoughts on “人生元编程

  1. 博主你好,我今天是第一次听说元编程的概念,马上去“喂鸡”一下,发现对“元编程就是能够操作代码的代码,元数据就是能够描述数据的数据。”这一段还不是很理解?这样来说,汇编能算作元编程吗?–强大的机器码呢,算是吗?

  2. 大神 看来已经到了另外一个层次
    依稀觉得你说的是对的 但是不得其们而入
    感觉境界这个东西 感觉不像方法论 是一种只能意会 不能言传的东西
    不知道大神可否给我们这些懵懂的程序员指条明路

  3. include

    template
    class _int
    {
    public:
    static const int vlaue = T;
    /* data */
    };

    typedef _int _2;

    int main(int argc, char const *argv[])
    {
    std::cout << _2::vlaue << std::endl;
    return 0;
    }

  4. 最近又看了一遍李笑来的《把时间当作朋友》。lz说的跟此书中的观点不谋而合。引用书中一句话:“你的大脑并不是你,你的大脑是(属于)‘你的’大脑‘。
    尽管你用它思考,好像它在指导你的行为,但是,你要明白你不应该隶属于你的大脑,而应该是你拥有你的大脑,并且应该是你可以控制你的大脑。”

  5. 第一次接触到“元”的概念是‘元语言’,后来读哥德尔和他的定理的时候和元数学见面不少。。。
    //终于明白码模mm为什么要学Python了。。。有眼光~

发表评论