2016总结

2016年总的来说是越来越努力的一年,付出的努力也基本上得到了回报。

工作

带领小团队完成了2015年的2个软件项目,2016年小团队承担了5个软件研发项目,而且工作主要集中到了下半年,实在是不堪重负,部分项目只能草草交差了事,不过也有亮点,个人完成了3个项目的架构设计,其中1个是在同事前期开发的基础上重构出来的,组织了团队的日常交流,涉及面向对象设计和机器学习算法等,团队成员得到了成长,到年底基本上不再负责具体的项目。如果明年还继续这个工作,一定要保证每个项目2~3人的配置,以免粗制滥造。

学习

业余时间在coursera刷完了《学会学习》、《机器学习》、《算法一》,这些课程都相当好,尤其是《学会学习》值得向每一个想要学习的人推荐。借助boolan网复习了一轮《设计模式》,有大量的编程经验后再回头学体会比较深刻。

出于自己及育儿需求,集中阅读了比较多的学习理论与心理学方面的书籍,包括《玩耍精神》、《刻意练习》、《学习之道》、《精进》、《自控力》、《如何高效学习》等。但是还需要慢慢消化吸收,充实自己的治学体系。

另外还值得一提的书有《父母效能手册》、《人类简史》、《调试九法》、《程序员修炼之道》。

订阅了李笑来的得到专栏《通往财富自由之路》,虽然说教味比较浓,但是确实有很多可取之处。

Python语言学了一个皮毛,能够应付一些算法问题。

投资

对投资已经单独写了总结,不再赘述,需要补充一点就是看投资方面的书,几乎是一本万利的事情,主要有《指数基金投资指南》、《个人理财》、《低风险投资之路》等,几乎每本都带来了直接的收益。

健身

年中计划用悦跑圈记录跑步100公里,结果只记录了约90公里,当然如果加上未记录的部分,是超过了100公里,年初体检时发现轻度脂肪肝,所以立志少吃多运动,基本上都做到了,目前130多减重到120多。

娱乐

2016年豆瓣标记观看影视作品57部(实际上可能只有50部左右),其中电影院观看了14部,考虑到时间宝贵,以后挑片子只能更加谨慎。去了张家界和拉萨旅游,去拉萨是计划外。

家庭

和家人的沟通越来越顺畅,除了聊天还开辟了写文章交流思想的新方式。着急小朋友虽然各项能力发育程度不一,但在妈妈和外婆的照顾下茁壮成长,独立人格值得珍惜,只是在沟通交流方面需要更多的耐心和担待,辛苦妈妈了,我也要尽更多的责任。

其他

一个小惊喜,拿到了公司辩论赛的最佳辩手,尽管在台上我一如既往的竞争到手抖。

2017重大计划

  1. 换工作,这需要一些充电工作,通过纳米学位学会Android开发,业余开发1~2个App发布到市场,用java语言刷完leetcode算法题,适当学习Java语言满足Android开发和刷题的需求;
  2. 伴随换工作的还有住房问题需要解决;
  3. 继续深入学习投资,主要教材《聪明的投资者》、《手把手教你读财报》,以家庭基金形式运作投资,每月底发布净值和投资小结,减少归并投资账户。
  4. 继续完善自己的治学体系,重点学习批判性思维,主要教材:《Beyond Fellings》、《学会提问》。
  5. 每天一篇blog,每天github提交代码。
  6. 长跑200公里,累计300公里,基于HIT、NEAT等理念在时间紧张时设法保持运动,维持体重,争取不感冒。

互联网获取信息的三种方式:漫游、订阅、检索

前几个星期,我把手机上几乎所有App的通知都关掉了,然后在接下来一个星期里,使用各种App时,它们不断提醒我要打开通知,不要错过重要的信息。我没理它们,也似乎没错过什么重要信息。在这个所谓的信息时代,我们每天收到的信息可能比古代的皇帝还要多,但真正需要的有多少非常值得怀疑,你以为你在信息的海洋遨游,其实只不过是被人收割你的注意力和所谓无聊的时间。互联网是相当强大的一个工具,想要很好的使用这个工具则需要自身的强大,否则很容易成为工具的奴隶。本文将辨析互联网获取信息的三种方式:漫游、订阅、检索。

1 漫游

这里的漫游一定程度上指的就是不带有明确目的在互联网上瞎逛。这种方式是互联网对信息获取方式的最大的颠覆,也是最大的一把双刃剑。超链接出现后,信息间联系方便而无限扩展,传统的信息组织方式大多是线性、树性的,而互联网的信息组织形式是网状的,它带来了很多好处:

  1. 网状能够模拟一切复杂的结构,所以提供了更真实的表现信息结构的可能性,比如维基百科比传统的百科全书在结构上的优势;
  2. 信息内部与外部的界限更加模糊,“参考文献”更易获取,在互联网上做一个专题比传统媒体要容易得多;
  3. 提供了无限的遇到惊喜的可能性,在漫游的过程中,可能发现以前自己不了解的东西,产生思想的碰撞火花,破除信息孤岛和自己的认知屏障。

但是这种方式的缺陷也是很明显的:

  1. 被太多的垃圾信息占据了过多的时间,很多制造信息的人居心叵测,各种标题党无时无刻不再窥窃你的注意力;
  2. 获取的信息非常零散,不成体系,互联网信息依然以免费为主,相比书籍信息质量依然相对低下;
  3. 漫游这种方式很容易伴随浮躁情绪,带来所谓的信息过载,以励志文章代替立志,以了解代替理解,以知道代替知识。

要想让漫游这种方式发挥好的作用,最需要的是自身的强大,包括价值观与批判性思维等,才能不断在信息海洋中吸收养分,否则就会被淹没。

2 订阅

订阅这种方式是互联网之前的传统媒体与人交互的主要方式,但随着互联网的发展,也成为互联网上获取信息的方式之一。大多数信息提供者希望用户能够订阅,建立长期关系,这样才能获得利益,它的形式可能是关注、推送等。比如,微信的公众号乃至朋友圈是对信息漫游的一次复古和反动,微信公众号文章甚至连分享的超链接都故意是不稳定的,试图打造自己的小生态。订阅有很多变种,最前卫的一种是机器学习带来的推荐机制,本质上是基于个体兴趣的一种订阅,无论订阅是复古还是前卫,它都有它的优势:

  1. 订阅是一种筛选机制,能集中注意力关注自己真正关心的人和事,或者通过关注靠谱的人帮助自己过滤信息;
  2. 订阅很容易加入付费机制,建立高质量的知识服务,在高速迭代的同时保存信息的高质量。

但是订阅也带来了风险:

  1. 圈子化,不论是主动筛选还是机器筛选,最后听到看到的都是自己愿意看到听到的,把自己喜欢的理解为全世界的真相是有很大风险的;
  2. 看似主动订阅的背后有着很大的被动,人们倾向于维护自己的选择,当了一个人的粉丝可能回去粉饰他的错误,如果投入了金钱,则会更加坚定最初的选择。

3 检索

检索是学术研究必备素养,我觉得也是一个现代人活在互联网时代的必备素养,搜索引擎是互联网上超链接之后最伟大的发明。通过检索,一个获取信息的人才能真正把互联网当成一个工具:

  1. 方便的检索使得掌握孤立知识变得价值很低,比如一些电视知识竞赛中类似于“中国的铁轨有多宽?”的问题,因此介入一个新的领域变得很容易;
  2. 检索具有强烈的目的性,信息为我所用有了一个好的起点,不会再有在网上逛了两小时却记不起自己看了什么的现象出现;
  3. 检索常常能能立即解决问题,只要你不是遇到问题的第一个倒霉蛋。

检索能发挥作用,除了提高检索的基本技能外,最重要的还是自身治学水平的提高,否则也会陷入以检索代替思考的误区,满足于互联网这个外脑带给自己信息,自己不能综合运用,提出创意。

4 综合

为了厘清概念提出了三种方式,真实的场景往往是三者的结合,比如在新浪微博关注了某程序员(订阅),他提到了某种新的编程语言很有意思,还给出了一个链接,于是随手点开看看(漫游),发现真的不错,于是Google搜索到语言官网等很多信息(检索),集中学习了1小时。但也可能是,在新浪微博关注了某程序员(订阅),他转发了某个搞笑视频,于是随手点开看看(漫游),结果看了一个有一个,一个小时候后不知道自己在干啥。

这些获取信息的方式都有它的优势,关键是使用时应当“有意识”,让自己的脑子时刻提醒自己的状态,即使是最自由的漫游状态,也应当设定一定的时间限制,否则无数的注意力黑洞会让你的时间死得不明不白。

互联网是一个强大的工具,甚至会对弱者实施碾压,如果不持续提升自己的判断、分析能力,只会被不断的收割注意力,不断的被洗脑,觉得世界上充满了很有道理的话,但依然过不好这一生。

《锻炼的真相》笔记

地平线系列:关于锻炼的真相 Horizon: The Truth About Exercise (2012)

  1. 运动所能消耗的热量其实并不多,减肥光靠运动不行,关键还要少吃。
  2. 血脂最大的危害还不是皮下脂肪,而是积聚在内脏的脂肪。
  3. 运动除了消耗热量,还能带来其他好处,比如运动过再吃东西会提高某些脂肪代谢相关酶的活性,血脂含量会低不少。
  4. 运动对不同的人产生的作用是不一样的,某些作用是基因决定的。
  5. HIT,即短时间高强度的运动(可以短至每周三分钟,每次二十秒)可以大幅度改善很多人的血糖代谢能力,预防糖尿病,和改善供氧能力。
  6. 改善NEAT,即非运动代谢,可以让我们更健康,其关键点就是不要久坐,绝对不要超过一个小时,应该不时的站起来动一动,走一走。
  7. 总的来说,锻炼会逐步迈入个性化时代,每个人都要找到适合自己的方法,千万不要因为讨厌去健身房或专门花大块时间锻炼就放弃了锻炼,像HIT和NEAT都是无需特别的大块时间的科学的锻炼方法。

《调试九法》:调试是个技术活

一般当工程师把一个东西称为艺术甚至玄学的时候,说明这个东西难度很大,没有太多规律可以遵循,调试就属于此列。几乎每个程序员都有被bug搞到死去活来的经验,有时候颠来倒去,问题似乎解决了,但也不知道为什么,就把它当作不可解释的玄学现象,最烦人的一种bug是偶尔出现难以复现的,学名海森堡bug。

不过毕竟软件还是属于科学技术的范畴,调试也应当是门技术活。《调试九法》是一本少见的讲调试技术的书,九个普遍性的原则不仅适用于软硬件开发维护,甚至还能运用到日常生活,为了找到这本书我也是费了点神,幸好图灵社区还有正版的电子书卖。

说实话,作者举的很多例子偏硬件,所以理解起来有点隔膜,但是九个原则确实很实用,在我以前的开发调试经历中可能也不自觉的总结过一些,但是看了本书,还是有拿到武功心法的感觉。看过之后,下面再把九个原则遍历一下,加深理解。

1 理解系统

这是最重要的一条原则,要分析bug,自然要理解系统是如何运作的,这就需要学习掌握一些基本原理,对具体的类库、工具、技术都需要认真的去读相关文档。我最近几年才养成了认真读官方文档的习惯,搜索引擎的发达,使得我们养成了面向google编程的习惯,面对问题,总是想一蹴而就的解决,结果往往是走了很多弯路,因为舍不得花时间看路标。本书还特别强调“逐字逐句”读手册,简直是对浮躁的人当头棒喝。不理解系统就开始调试和不理解原理就写代码是一脉相承的,俗称“面向巧合编程”。

2 制造失败

这条原则讲的是复现bug的重要性与方法,一个bug,肯定是在某个特定的条件下发生的,抽丝剥茧找到这个特定的条件,就成功了一半。以我的硬件维护经验来看,发现bug的人如果能详细的记录整个过程是非常有帮助的。有很多bug出现的条件比较苛刻,所以程序员的口头禅之一就是“在我这里没问题啊”。针对这类bug,首先最好能找到模拟方法,比如加快软件运行交互的速度,进行压力测试等,其次就是在软件内部能有详细合理的bug记录机制,便于从内部找到复现的条件。

3 不要想,而要看

这一条强调的是观测的重要性,面对现实比胡思乱想重要。语言影响思考,所以遇到bug的口头禅应该是“我看看“而不是”我猜可能是因为“。我们应该想尽办法去看清楚出bug的细节,所以成熟的程序中都应该有用于调试的基础设施,个人经验至少日志是必不可少的,初级程序员习惯于完全靠打断点调试,问题是断点本身会改变程序执行的流程(尤其是多线程的情况下)。当然,猜测依然是有用的,可以帮我们缩小观察的范围,或者至少拟定一个观察的优先级,这样经验就能发挥作用,但是不管怎样,经验不能替代观测。

4 分而治之

二分查找法可以把查找的时间复杂度从线性变成对数,不仅是程序中的查找算法,也是调试时的方法论,一个系统有了这个意识后,关键是如何划分系统,又回到了原则1。至少在打断点调试时,要找到出bug的位置,也是可以用二分法的,或者插入日志记录时也可以应用这个原则。另外,书中还提到了bug间相互影响的现象,我觉得甚至又bug跷跷板的现象,解决之道是一个都不要放过。调试bug时发现代码质量实在太差,重构一下有时候也是有必要的,否则浮沙之上筑不了高台啊,甚至经过有效的重构,bug很自然的就发现并消除了。

5 一次只改一个地方

这条原则类似实验科学中的对照原则,一次只考察一个变量,比对正常情况和异常情况,一定不能忽略任何一个测试条件的差异。上一条说bug一个都不放过,但也得一条条过,重构的时候也要注意不要对不懂的代码乱改一气,很多代码的危险性在于牵一发而动全身,我觉得这也是修复bug时的最大风险,往往是消除一个bug同时增加几个bug,还是回到原则1,要理解系统。不过有时候,理解前人的代码谈何容易,这也启示我们写代码时要多积德,不要以为代码就是给编译器看的,而应该是给以后维护我们代码的人看的。

6 保持审计跟踪

这条原则讲的是记录的重要性与方法,我想这就像医生问诊一样,需要问合适的问题,给出具体的有效答案。我的个人经验是一旦开始调试bug,可能整个人就彻底陷进去出不来,通过记录的方式可以把自己从思维的泥潭中抽身出来,不断修正调试bug的计划与方法。对一些专用系统软件,需要培训软件的使用者如何用有效的语言来记录出现bug的情况,如果没有记录,那么调试的人就需要用适当的问题帮助使用者唤醒记忆。此外,我觉得半夜调不出的bug需要睡一觉,让发散思维自动起作用,一般早上就解决了。

7 检查插头

这条原则大概说的是所谓”低级失误“了,类似我妈跟我说电脑音箱不响了,我首先得问电源开了没这种。又比如把main函数写成mian函数,有一次我打断点调试就是不进断点,后来发现是因为有两段代码比较类似,我断点打错地方了。根据场景和经验,问问自己是否犯了该场景下常见的低级失误,往往针对能立竿见影的解决很多问题,就像很多电器设备说明书的故障FAQ中,也会强调检查插头。可以说,低级失误低级的是难度,而不是频度。

8 获得全新观点

这条原则说的是求助和交流,这里面很重要的是通过他人的观点来破除自己的思维定势,所以最好是只给别人详细描述现象,不要说自己的猜测,以免污染别人的判断。对程序员而言,这时候面向google编程的力量是惊人的,可能九成的问题都不需要你真正的再去提问,而是找到合适的搜索词去搜索即可,对中国程序员而言,用英文搜索是必须的技能,当然搜到东西后真正理解也是非常重要的,不能见到药就吃。如果遇到的问题google真的搜不出来,证明你层次稍微高了点,这时候可以上stackoverflow之类的社区提问。

9 如果你不修复bug,它将依然存在

这条原则说的是不要心存侥幸,不要因为bug只是闪现了一下就采取鸵鸟策略,该来的总会来,不是不报,时候未到。当然实际情况可能很复杂,软件工程本来就是时间、成本和质量的妥协体,但即使放过某些bug,也要分析出这样可能造成的后果,建立充分的防护机制,因此在很多软件认证体系中,都会有软件安全等级标准。这里还涉及bug复现和举一反三的问题,需要确认真正找到了bug的原因提供了有效的修复手段,并排查所有类似的问题。比如修复了一个内存泄露问题,就要修复所有导致这类泄露的代码。

附记:如何写出适合调试的代码

从调试的原则反观,对软件构建本身也很有帮助,毕竟调试只是查漏补缺的,最好还是写出来的代码少一些bug,为了调试的时候方便多预留一些手段。这里也简要总结一下个人经验,可能需要不断完善。

  1. 程序中应该提供日志机制,在程序的debug版便于输出调试信息,即使在release版,也要记录软件发生问题(如C#中抛出异常)时的详细情况;
  2. 要写出适合人类阅读的代码,否则后续维护的人看都看不懂,要如何调试?怎么写《代码大全》中说得最详细了,我觉得除了各种习惯写法之外将心比心也是很重要的;
  3. 使用各种类库或工具时,尽量弄懂原理,仔细的阅读官方文档,比如有些类库会详细说明如何防止内存泄露,如何应对多线程情况,看清楚再用,就会少种下祸根,至少不用等到调试的时候再无头苍蝇一样猜测原因;
  4. 写便于测试的代码,这样在调试时,容易剥离问题,或者使用二分法,这方面TDD编程实践讲得比较充分,我个人也需要加强。

如何序列化泛型List为xaml

Xaml实际上是一种加强版的Xml,Xaml最初是为了描述WPF控件而设计的,但其实具有一定的通用性,用Xaml序列化对象,可以自动维护对象间的引用关系,大大减轻工作量。

1. WPF控件中泛型List的序列化

Xaml序列化对象最直接的应用是保存和加载WPF界面与控件。考虑类似以下的自定义控件类,它包含了一个泛型列表属性。

public class WpfObject : Label
{
  public WpfObject()
  {
    Children = new List<string> { "hello", "wpf" };
  }
  public List<string> Children { get; set; }
}

WPF控件的序列化方法如下:

WpfObject w1 = new WpfObject { Content = "Hello, wpf" };
string xaml = System.Windows.Markup.XamlWriter.Save(w1);
File.WriteAllText("label.xaml", xaml);
WpfObject w2 = (WpfObject)System.Windows.Markup.XamlReader.Load(File.OpenRead("label.xaml"));

由于XamlWriter类的不完善,不支持泛型列表的序列化,上述代码将抛出异常:

无法序列化泛型类型“System.Collections.Generic.List`1[System.String]”
Cannot serialize a generic type “System.Collections.Generic.List`1[System.String]”

所以需要包装泛型列表属性,使其能序列化,最简单的方法是使用派生类,代码如下:

public class Children : List<string>{}
public class WpfObject : Label
{
    public WpfObject()
    {
        Children = new Children { "hello", "wpf" };
    }
    public Children Children { get; set; }
}

使用前述同样的序列化代码即可。

2. 普通对象中泛型List的序列化

自.Net4.0后,微软在System.Xaml.XamlServices命名空间重新设计了Xaml序列化,使其更好的支持一般的对象,不过比较讽刺的是,这个命名空间的序列化却不能很好的支持WPF控件,所以依然只能用本文第1部分的方法去hack。

考虑以下类型:

public class CommonObject
{
    public List<string> Children { get; set; }

    public CommonObject()
    {
        Children = new List<string> { "hello", "common" };
    }
}

它的序列化很简单直接,代码如下:

CommonObject p1 = new CommonObject();
string xaml = System.Xaml.XamlServices.Save(p1);
File.WriteAllText("parent.xaml", xaml);
CommonObject p2 = (CommonObject)System.Xaml.XamlServices.Load(File.OpenRead("parent.xaml"));

分解的力量

如何完成一件复杂的事情?可以把它分解成很多相对简单的步骤,然后一步步去完成。这个道理再简单不过了,但想要通过简单的道理过好这一生,则需要对道理反复的践行与思考,以下就是我这几年的一点人生经验。

为什么要分解?

管理复杂性

复杂的事情需要分解去做的最直观的原因就是管理复杂性,一个再聪明的人,他或她的大脑能同时把握的细节也是有限的,从脑神经科学的角度来说,大脑的工作记忆插槽是及其有限的,将复杂的事情分解、打包,可以大大降低思考的难度。如果一件事情需要100个步骤才能完成,在仔细分解前,大脑看到的简直是一团迷雾,看不到事情的边际,拖延丧气的负面情绪随之而来,对从事知识型工作的人简直是噩梦。

将事情分解为100个步骤后,它的复杂度没变,但是借助各类工具,大脑可以不必一次性载入100个步骤去思考,而是可以只载入某几个步骤,也可以对一些步骤打包命名,大脑存储的将是一些助记符。一件复杂的事情,从一团迷雾变成了可以在不同尺度去观测的结构,可能从大的视角看,有10步,仔细看每个步骤,又可以分为10步。

管理复杂性的典型用例就是软件行业,子程序、对象、模块等,无一不是发明出来用于管理软件复杂性的,如果你是上帝,大概可以一个软件一个大杂烩式的一次性开发完,但我等凡人只能通过各种机制来分解复杂的模型,大脑每次面对不同层次的抽象,都只处理较少的信息。

激励机制

最懂得分解事情的人是游戏设计师,不论愤怒的小鸟这类休闲类游戏,还是复杂的RPG游戏,都会不停地设定小的激励目标,如果一款游戏通关要几天,而且没有任何中间目标需要达成,大概是没人愿意玩的。

现实生活与玩游戏唯一不同的是,阶段性目标需要你自己去设定。比如,要写一篇毕业论文,有些学校只考察最后的答辩,有些可能会加上开题审查和中期审查,但是分解的尺度还是太大,不足以激励我们懒惰的大脑去干活,所以拖延写作简直是一定的。反之,如果你定好小目标,今天写3000字或者查阅10篇文章,然后奖励自己看一集《海贼王》,懒惰的大脑就会被激活。神奇之处在于,大脑可以指挥大脑欺骗大脑,看着眼前的胡萝卜一直走下去。

实际上,对一个做事情本身有一定激情的人来说,如果你用一个清单工具去设定自己的阶段性目标,在完成一个阶段后就去画一个勾,都不需要其他任何奖励,就会有类似玩游戏的快感。如果做的事情没有激情或者不是发自内心的渴望,那么阶段性奖励一下自己喜欢的则是有益的。

第一步效应

做事情时,进入状态难是阻碍我们开始做事情的最大障碍之一,开始做事前,可能觉得这里难受哪里不爽,一旦开始了,进入状态了,更多的则是做事情本身带来的快乐,状态极好时,会进入“心流”状态。所以能够坐下来干两小时活的关键可能在于最初两分钟。

一般来说,大脑一看到复杂的事情就习惯性烦躁,那么当我们把事情分解得够细时,大脑直接面对的是一件简单事情,心情自然好很多,而结果就是一旦开始,可能根本停不下来,对待拖延症的秘诀之一就是你好死赖活先要开始去做,不论做得怎么样。

如何吃完一碗饭?先要开始吃第一口。如何跑够十公里?先要开始跑第一公里。通过分解使我们面对可以接受的第一步,然后大脑又可以欺骗大脑一直干下去了。

如何分解?

分解到能够开始工作

不同的事情,自然根据它的特点有不同的分解方法,同样的事情,对不同的人也需要不同的分解方法,对一般人而言,打电话可能都不值得算一个步骤,但对有打电话恐惧的人而言,可能需要先打好腹稿,然后拨号,然后交谈,至少也得三步。打腹稿的时候不用考虑后续的事情,拨号是一个机械动作,交谈则是对腹稿的发挥,而且自然会有两个人语言上的循环反馈。

分解的详细程度,取决于不同的事情和不同的人,首先以能够开展工作为目标,只要还觉得难受或者茫然,就需要继续分解。所谓“天下大事,必作于细”也不妨从这个角度去理解。

在各个领域,分解问题的能力都是需要不断锤炼的基本技能,比如在软件行业,在需求分析时需要分解工作估算时间,架构设计时需要划分模块。但不管任何领域,分解到能够开始工作是一个不完美但足够实用的策略。

时间尺度

拨开复杂事情的迷雾往往是一个困难的事情,一个需要一年完成的项目,真的能分解到每周都要做什么?几乎不可能,尤其是这个项目有一定的创新性时,这种困难有时会导致我们对分解与计划的失望,干脆走一步算一步。

折衷考虑一下,需要注意分解时的时间尺度,离当下越近,分解出来应当是越具体详细的事情,强调可操作性,越接近死线,分解出来应当是越概要的目标,强调战略性。

在做计划时,可以先以日为单位,逐渐变到以周、月为单位,日内的计划可以用清单的形式,或者只是在脑子里列个清单即可。

分解的迭代

少有人能在第一时间把一件事情彻底分解清楚,但是又不能一直想着怎么分解导致事情无法开张,所以分解的迭代是必不可少的,计划与总结是相辅相成的,通过总结反馈,才能不断修正分解,制定新的计划。

结合时间尺度来看,随着时间的推移,那些以大尺度分解的事情,会在迭代中逐渐细化,到最后,事情就做完了。

为了完成一件复杂的事情,需要做分解的工作,也需要做具体的小步骤,这二者不是简单的先后关系,而是反复迭代关系,所以在做事情时,需要在宏观和微观两个角度反复切换,不能陷入细节忘了自己的最终目的是什么,也不能一直举棋不定。

clips语言优秀资源列表

在机器学习技术大热的当下,专家系统可能是一种有些“过时”的技术,但依然有它的适用场景,clips语言是C语言开发的开源专家系统语言,我在项目开发中学习使用了该语言,以下是我搜集整理的一些clips语言相关的优秀资源。在备忘之余希望能对其他人有所帮助。后续将不定期更新。

基本资源

  • 新版官网
  • 旧版官网:可能需要科学上网才能访问。
  • 文档列表:User’s Guide浅显易懂,非常值得一读,需要深入了解可以看看Basic Programming Guide与Advanced Programming Guide。
  • 教材中文版:教材由clips开发者撰写,包括专家系统的基础知识与设计实现,以及具体的clips语言的语法与使用。电子版下载地址
  • stackoverflow:clips开发者的有在stackoverflow回答问题。

函数库

工具

.Net封装

clips适合嵌入到软件中执行规则推理,使用C#开发界面,则需要将clips封装到.Net。封装的思路主要为PInvoke或C++/CLI。

  • CLIPS .NET:clips官方开发了一个.Net Wrapper,而且包含了Winform和WPF各四个示例,封装方法为C++/CLI,接口较少,不支持自定义函数。
  • CLIPSNet (SourceForge):使用PInvoke技术封装,使得风格不像面向对象语言,更新到2015年。
  • CLIPSNet (github):我维护的一个.Net Wrapper,封装方法为C++/CLI,更新clips和.Net Framework到最新版,接口较多,支持自定义函数。

Python语言入门

这是一个简单介绍Python的Slide,鼓励团队成员学习Python,用于数据分析等。

Hello world!

朝闻道,夕死可矣。

2013总结

2013年躲掉了公司的个人总结,颇为庆幸。除去繁文缛节,写写总结还是有好处的,所以随便谈谈自己的2013。

回顾

工作

前段时间看《More Joel on Software》,知道了内部程序员的概念,突然明白了自己的定位——“三成的内部程序员”,虽然这一年可能有七成时间在做程序员的工作,但这种状态毕竟是临时性的。这一年可能是编程进步最大的一年,但也更加意识到作为一个内部程序员与业界的差距有多大,确定自己要想在若干年后投入IT界,以技术吃饭基本上很困难。在担心项目进度的过程中,急躁和拖延症并行,把自己的性格缺陷发挥得淋漓尽致。 程序员之外的工作,做得不太理想也不太开心,除了上司难伺候的因素外,个人不喜跟人打交道,不善于指使人干活是主要原因,如果把这些当一门学问来可能好接受一些。事实上,跟理解力强、执行力强的人打交道是比较轻松的,但问题在于更多的人理解力执行力不太好,但团队合作又需要他们。

住房

2013年的首尾都在烦心住房问题,从年初的被轻易忽悠到年尾的主动出击,虽然不知道自己的努力对最后的结果有多大作用,但好歹也是一次自我争取,在这种环境下,矜持是没有出路的,还是那句话,最关心你的人永远是你自己。拿到房子的时候和老婆都大失所望,但转而激起改造之心,忙忙碌碌中,一个小家一天天像个样子了。这小小的幸福来得不容易,只能怪自己选择了一条hard通关模式。所有的家庭计划,只能围绕着房子来,这被耽误的一年,我在心里记了一笔。处理这件事情,偏离了个人擅长的领域,几乎暴露了自己所有的缺陷,或者说和这个现实不适应的地方,急躁、不必要的完美主义、缺少承担。 在综合分析之后,基本确认了未来几年的工作地点,一旦确定,就要坚定的执行下去,怀着肖申克的救赎式的毅力。

购物

尽管网购也有不方便的地方,但几乎成了唯一选择,淘宝、亚马逊、京东、国美在线还是比 较给力的。买东西越来越注重外观,相信不重视外观的产品,其内在也值得怀疑。比较喜欢日式的风格。如无必要,勿增实体。今年买过的最神奇的东西,貌似是3M除锈润滑剂。 ###电影 今年大概看了60部电影,推荐《东京家族》和《Before Midnight》,第一部是山田洋次向小津安二郎的《东京物语》致敬之作,第二部是奇葩话痨爱情电影《Before Sunrise》和《Before Sunset》系列的第三部。

阅读

不包括一些临时查阅的技术书籍,今年大概读了三十本书,其中电子书居多。除了方便携带外,好像读完的心理压力也小一些。今年买了一百多块钱的正版电子书,亚马逊、豆瓣阅读、多看阅读、图灵都有花钱。 推荐《暗时间》,刘未鹏这本不是新书了,但今年才看,除了书本身不错外,也是一个好的书目,介绍了不少认知学、心理学等方面的好书,比如《别做正常的傻瓜》非常有意思。

网站/服务

推荐知乎,学到不少知识,最实用居然是购物推荐之类的…… 推荐GoAgent。 推荐多看阅读,书的排版质量不错,可惜的是书目还是少了点。

展望

工作

完成好手头的项目,精进.Net开发。 以做学问的态度学习与他人的协同,提高自己的涵养,少担心,多实作。

锻炼身体

多年来第一次三千米测试未通过,警钟敲响了。以后每周跑步若干次,周末和老婆打打羽毛球。

生小孩

这个主要得靠老婆,但我得开始学习各种相关知识了。除孕产育儿知识外,还要预习教育学知识。

旅游

尽量探索所生活的城市,过年带父母好好逛逛。

理财

改变之前完全不理财的状态,清点手头资产形成财务状况报告,办信用卡,制定消费与投资计划并实行。