- 积分
- 12
- 注册时间
- 2008-7-11
- 仿真币
-
- 最后登录
- 1970-1-1
|
好久不见诸位,不知道寂寞高手和waynebuaa还在不在,一晃上次在同济和FreddyMusic老兄见面已经是五年前的事了,感叹时间过得飞快啊!
我在美国待了四年,没能找到去Wolfram实习的机会,我曾经到了第二轮面试,但是对方说他们需要的是C++的开发者而不是有经验的Mathematica用户,但是那个时候我对C++既不熟悉也不感兴趣,所以也就放弃了。因为我后来做了嵌入式系统,所以没有太多玩Mathematica的机会,只有在数据处理的时候才能用到。而且美国访问simwe似乎比较慢,所以就来的很少了。
美国这边几乎每所学校的机房都有Mathematica,但非常可惜的是大部分人都把它定义为高级的函数曲线绘图工具,不过也有少数人和我谈起Mathematica时满脸放光,“Mathematica is tremendously powerful!!!” 因为Mathematica这个名字暗示了它就是一款数学软件,这是很糟糕的市场定位,所以下一阶段Wolfram意欲把Mathematica整合到一个叫做Wolfram Language的系统中,并且强调在金融和系统构建领域的应用,从而摆脱数学软件的定位。
Mathematica的代码很难重用,因为软件本身的性能有限,而且代码写得规范很困难,所以它不是一个适合开发系统的语言。从上高中起到现在,我用Mathematica从4.0开始到现在也将近十年了,过去一段时间我也反思,Mathematica到底适合做什么,一个领悟到Mathematica潜能的人,要在什么地方才能施展自己的力量,同时Mathematica的局限又在哪里。
我大概总结一下:
1. 一个语言所支持的programming paradigms很多,不见得它什么都能做。比如写应用程序最好还是使用操作系统原生的开发语言和框架,OS X就用Objective-C+Cocoa,Windows就用VS+.Net。对于大规模的并发系统,Erlang是无二的选择,对于简单但对性能要求高的代码,自然需要用C,才能精细调节各种I/O,CPU和GPU之间的协调。
所以Mathematica,以及类似多paradigm的语言共同的问题就是,它越是看起来能做的事越多,你就越不知道该用它做什么。因为你熟悉它,所以本来应该用domain specific的语言来解决的问题,你是更倾向于用它解决。但是到头来你什么都做不了。
2. 那么Mathematica对一个人帮助最大的地方在哪里呢?就是它能够及时地告诉你一个操作对数据形状的影响,使你能够尽快地认识到你所拥有的数据形式,和你想要的数据形式之间的关系和变化方法。函数式编程提供了结构化的描述数据变化的方法,便利的绘图帮助我们快速直观地验证想法。这是其它任何一个语言或工具都无法达成的。
所以,我们看到了Mathematica在我们做事当中的角色:帮助我们快速了解数据,快速验证想法。其它一切编程工具,都是我们在输出,在搭建系统,写应用程序给别人用,但是Mathematica可以使写程序的人自己受益,它是我们心智的延伸。我们的目标不应该是用Mathematica替代其它工具,而是专门用Mathematica做其它工具无法代替的事。
基于上述考虑,我摸索出一套新的结构化的写Mathematica的风格,比如- ClearSystemCache[]
- WhetherContainsWhiteSpace=Length@StringCases[#,WhitespaceCharacter]>0&;
- SplitByCharacter = (Flatten /@ #) &@Partition[#, 2] &@SplitBy[#, WhetherContainsWhiteSpace] &;
- SplitPoint = Most /@ StringSplit[#, "|"] &;
- SplitNumbers = StringSplit /@ # &;
- SplitPointAndNumber = ({First@#, ToExpression@SplitNumbers@SplitPoint@Rest@#} & /@ #) &;
- FormTangents=({First@#,Map[Partition[#,2]&,#,{2}]&@Map[Partition[#,2]&,#,{2}]&@Last@#}&/@#)&;
- PrependLastTangent=Join[{Reverse@#,#}&@{First@First@#,Last@Last@#},#]&;
- PrependTangents={First@#,PrependLastTangent/@Last@#}&/@#&;
- Preprocessed =PrependTangents@FormTangents@SplitPointAndNumber@SplitByCharacter@Data
复制代码 当然你不必知道这段代码目的为何。重要的是看代码风格。把每个小的操作都用一个函数名代替,尽可能在函数名中就说明它在数据流中承担的工作,不要怕啰嗦,因为可以用复合函数@把它们连起来,再用一个更抽象的名字代替。这种风格最大限度发挥了Mathematica简洁明快的函数定义,也使得代码的结构非常清晰,便于日后port到其他语言。
过去几年我积攒了很多类似的经验,除了Mathematica本身,我也研究了如何让Objective-C和C的代码挖掘出适合Mathematica处理的数据。不久的将来我应该会像Freddy一样写本书吧。
我大概今年底或明年初就回国了,也许会有机会寻访诸位追求Mathematica的同道中人,如果能够发起一个Mathematica的用户小组,并且能够定期交流分享就太好了。我看到豆瓣和果壳都有Mathematica小组,但是水平都很弱。回去之后我会把我最近做的几个Mathematica大项目呈现给大家。 |
评分
-
1
查看全部评分
-
|