标签 Blogger 下的文章

Hello,Common Lisp

Paul Graham不愧被誉为Lisp的超级推手,他的煽动力真的是很强悍。这不才刚刚看完一遍他编写的《黑客与画家》后,我就决定将Common Lisp作为今年计划学习的那门新语言,而且从现在就开始。

去年曾囫囵吞枣般的学习过Haskell,一门通用且庞大的纯函数式编程语言。在惊叹于Haskell如此与众不同且功能强大的同时,也为Haskell Monad那魔鬼般的蹩脚语法所苦恼,而Monad的引入就是为了隔离副作用,并让你可以利用些过程式命令式语言解决问题的范式。

原以为Common Lisp也是一门函数式编程语言,应该与Haskell很像,但在看了《ANSI Common Lisp》一书后的前几章后我才发现其实不是那么回事儿。Common Lisp设计初衷其实是一门支持多范式的通用语言。除了语法上更接近于函数式编程范式外,你完全可以用Common Lisp写出具有过程式特点的代码(而且看起来也很容易)。另外Common Lisp Object System(CLOS)还给你提供了OO范式的选择。与Haskell相比,对于我这个C程序员来讲,Common Lisp带来思维跳跃似乎更小些,更有利于后续的学习和使用。

与Haskell的强类型和静态类型(即使你不显式指出类型,Haskell也会根据一些上下文的clue推导出类型,如果它发现类有不匹配,那么编译期间就会报错)不同,Common Lisp是动态类型和弱类型的,当然你也可以显式声明类型,但这么做也仅有利于编译器对代码的速度优化,并不能阻止什么。如:
> (declaim (type fixnum count))
> NIL
> (format t count)
*** – EVAL: variable COUNT has no value
> (setf count "hello lisp")
> "hello lisp"
> (format t count)
> hello lisp
> NIL

看到了吧,即使我们显式声明了count为fixnum类型,我们依然可以用字符串为其赋值。

Lisp语法十分简单:万物皆在括号内,无论代码还是数据。Lisp一直因括号泛滥而被诟病,不过对于我来说还好,也许是因为在C语言中也没少使用括号的缘故吧。另外现在的编辑器都支持高亮括号匹配,这样只要你细心些,写代码时基本不会出现因括号不匹配导致的一些问题。

编程语言影响思维习惯,但思维的转变不是一蹴而就的,也就是说用惯了C、Python等语言后,再去学习类似Common Lisp这类语言的确有些困难。遇到某问题时,或多或少还会首先以过程式的思维去考虑。另外Common Lisp也确实不是一门“小语言”,和Haskell一样,Common Lisp也很庞大,这也使得这些语言的学习曲线陡增。
  
之前一直认为Lisp也是一门解释性的语言,类似Python采用解析器的方式执行,性能不会很快。后来经了解后才得知诸多编译器(如CLisp)都是将源代码编译为某种格式的字节中间码,这样不仅性能得到了提升,可移植性还得到了兼顾。当然Lisp性能与C比起来还是要差出至少一个数量级的。Common Lisp的编译器我装了两个:CLisp和SBCL,目前来看似乎后者的开发更活跃一些。我个人则更多地使用CLisp。

这里必须得承认的是Lisp语言的应用还是比较小众的,甚至很多程序员都没有听说过有Lisp这门语言的存在。在实际商业开发中更是很少见到用Lisp实现的系统,这方面Haskell也有着同样的”感受“。不过近几年Lisp各种方言大有回升之势,Lisper们需要是耐心和时间。如果要想了解如何利用Common Lisp进行一些实际系统的开发,那么你就不能放过Peter Seibel于2005年编写的《Practical Common Lisp》一书。后来出版的《Real World Haskell》想必也是学习Peter Seibel试图为Haskell开发者们找到一条实际应用之道吧。

但有关Common Lisp的入门书,我还是觉得Paul Graham的《Ansi Common Lisp》更适合,另外在这之前可以先拜读一下Paul Graham的文章"The Roots of Lisp",这将对Lisp的学习大有裨益。

既然本文的主题为Hello,Common Lisp,那最后还是按学习新语言的惯例,在这里向大家展示一下用Common Lisp是如何编写Hello World的吧:

;; HelloWorld.lisp

(defun hello-world ()
  (format t "hello, world!"))

(hello-world)

小试番茄工作法

番茄工作法Pomodoro Technique),你可能没有听说过,呵呵,它年纪也不小了,官方说它是在1980s时发明的一种时间管理方法,只不过它最近又被一些人“挖掘”了出来,并被大力推广了一番。特别是在软件开发圈子里,被包装后的番茄工作法披上了光鲜的外衣,拥有了不少粉丝(我还算不上粉丝,充其量算是个试用者 ^_^)。

不过和历史上诸多的时间管理方法一样,番茄工作法不是银弹,它无法将你彻底地从每天纷繁芜杂的工作中解脱出来,甚至于:
- 它不能告诉你今天应该去做哪些事情;
- 它不能告诉你如何排定事情的优先级;
- 它不能告诉你如何应对各种外界打扰;
      
那这种方法的优点到底何在呢?别急,下面一一道来。

简单!首当其冲的就是简单!番茄工作法的全部核心内容只有下面几句话(也是该方法的标准执行步骤):

* 选择一个待完成的任务
* 将番茄时间设为25分钟
* 专注工作,直到番茄时钟响起,然后在纸上画一个x
* 短暂休息一下(5分钟就行)
* 每4个番茄时段多休息一会儿

怎么样?看起来是不是与我们平时的工作方法没有太大区别呢?我们平时工作时也是一个任务接着一个任务的去做啊。没错!这种方法看起来似曾相识。不过细致挖掘后,你会发现这里每一步的描述中都没有废话。

- 选择一个待完成的任务
番茄工作法在这里没有给出如何进行任务选择的详细说明,我想这是因为在许多时间管理理论和方法中都针对这方面做了细致入微的讲解,如经典的四象限法等。再深入考量一下,你会发现番茄工作法执行前是需要你做一些准备工作的:你需要枚举出待办事项、识别出优先级别、将规模较大的Task拆分为small tasks,然后制定至少一天的番茄计划,设定每个番茄时间段(Promodora)对应的task。只有当你准备好这些,番茄工作法才能让你的工作更有效率。这里也可以理解成番茄工作法的开放性,可以让你与其他高效时间管理理论、任务分解方法充分结合,让效力倍增。

- 将番茄时间设为25分钟
从字面义来看,这就是一个定时器。没错,实际执行过程中,你的确需要一个定时器,物理的也好,软件实现的也好。可以支持自由设定番茄工作时间段,具备报时提醒功能。至于25分钟,我想这是发明者给出的一个经验值,你可以在初期按照25分钟设定,后续根据自己的需要自行调节。Google Chrome有一个名为ChromoDoro的番茄计时器插件很不错,我一直在用。有定时器和没有定时器,工作起来有啥分别呢?实践证明,在定时器下工作,你的潜意识中会涌出一种紧迫感,潜移默化的加强你提高完成效率的意识。

- 专注工作,直到番茄时钟响起,然后在纸上画一个x
别看这句不长,但我认为这句才是番茄工作法的精华。首先不得不提到的就是“专注”二字,这也是我理解的番茄工作法的第二个优点。专注,意味着迈向高效。长期使用番茄法可以大幅提高你的专注力,也间接的提升了你的效率。这个说起来容易,做起来难。不信你可以试试。其他外部干扰不说,你是否能在一个番茄时间段(25分钟)内专注于处理某件事情呢?你是否会走神(外面突然阴云密布,又要下雨了?)、是否会分心(昨晚巴萨赢没,梅西
进球了吗?真想打开 Browser看看结果)。哈哈,实践证明,在使用番茄初期,这些都会发生,起码在我身上就不断地发生过。为啥还要在完成时在纸上画个X,我理解这是个信心强化的小技巧,强调“完成”,提高完成的信心,久而久之,这种成功反馈会给你带来充足的自信。

- 短暂休息一下(5分钟就行)
工作也讲究节奏,适当的节奏会让你觉得游刃有余。反之,如果长时间专注,反倒会过损脑力,降低效率。另外适当的休息也避免了一些职业疾病发生的可能性。

- 每4个番茄时段多休息一会儿
我的理解,和上一条差不多。不过这里除了休息之外,还可以对之前的工作进行总结和反思。另外长时间专注于某一个项或一类工作后,也许要时间重新积蓄一些热情了。

总而言之,番茄法更强调的是执行过程的专注以及工作节奏的把握,再结合适当的反馈技巧,可以让你的效率有提高,至于提高幅度因人而异了。

在试用番茄法的过程中,我也总结了一些经验技巧,供大家参考揣摩:
- 根据个人实际情况,合理设置自己一个工作日内的番茄时间段,尽量将重要的工作放在头脑高效的时段,比如上午8:30~11:00,下午15:00到17:00等。不一定所有工作都要纳入番茄时间段里,找到适合自己的工作节奏。
- 做好准备工作,明确各个番茄时间内对应的任务,最好将任务简单写到纸质便签/日记本中,便于实施画X,强化反馈。
- 每4个番茄时段内的task的上下文差别不要太大,尽量减少task间的切换成本(进入某个task的工作状态是需要时间的)。
- 在番茄时间段内task没完成咋办? 这个估计经常发生,似乎只好在下一个番茄时间段里继续做了。其他task顺延。必要情况下加班完成。一旦出现这种情况,就需要你加强task划分能力,尽量做好task完成时间的预估,不断提升精确估计能力。
-打扰是不可避免的。电话、邮件都可能打断你的工作。如果必要,可在你的番茄时间段中预留出一些处理打断的时间,比如25+5,预留5分钟。当然我们应该尽可能避免这种打扰,可用一些广为流传的技巧:比如在允许的范围内适当将mail接收的间隔延长;高挂“免战牌”,显式告知他人你已经“out of services”了;不启动即时通信工具,或设置即时通信工具的状态为外出或极其繁忙状态等等。

再强调一点,番茄法不是孤立的,可以与其他时间管理方法(如GTD)结合使用。

以上是个人小试番茄法之后的一些体会,图灵出版了《番茄工作法图解:简单易行的时间管理方法》,是著名的Pragmatic Bookshelf系列,不过我还没有读过, 可能也不打算读,有些东西自己体会和感悟的更深刻,不是吗^_^。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats