人都是会改变的,也许前一段时间还酷爱萌妹,过一段时间就喜欢御姐了。而且,会对自己之前的选择感到不可理喻,“我以前怎么会是那个样子!”
编程语言
对于编程方面的事情,很能符合上面的感受。从纯C的单片机流,到Windows+C#,中间穿插着JAVA,到现在的Linux,Python和Lisp。我的思维发生了相当大的改变。大神们可以轻轻的嘬了一口咖啡,淡淡的告诉你,“其实用什么语言根本不重要”。大神说的当然是对的,人家说的是见多识广,随手能写编译器的大神们的。对于我们这些弱菜来说,编程语言能够相当程度上影响你的思考方式和编程方法,附带着的还有开发工具,类库和平台。
之前,我python学了五遍,每次都会很激动地下一个python,装好,看着教程写几个循环,感觉自己好聪明,又学会了!不过因为平时用的不多,还没关电脑呢就忘记了。
三个月前又看了一篇说Python碉堡的文章,我再一次决定去学习这只萌娘,只是这次换了方式,先不看教程,而是把之前用C#实现的一个算法用python改写。遇到了问题再去请教各类教程。一千行的代码改下来,我才闻到了python萌娘的体香。所以,实践出真知啊。
编程是很讲究手感的,尤其是思考复杂具体问题的时候,哪有时间判断到底是该obj.Length还是len(obj) ? 而人的肌肉记忆容量是有限制的,敲代码敲到行云流水需要大量的实践。所以有人可能会见过多种语言,但工作语言可能也就那两三款,不然身体吃不消啊。
当我用了三个月python之后,重新打开VS敲我之前无比熟悉的C#,才发现怎么这语言这么多槽点,变量还需要声明类型,居然没有slice,定义个函数还要一大堆形参类型,解析个json还要用as做类型转换,苦不堪言。我抱着脑袋,盯着屏幕,这难道就是曾经我朝思暮想的C#萌妹么?
C#萌娘:在著名的微软公司接受精英教育、11岁时便跳级进入大学学习、倍受人们关注的少女。也被称为“IT界的最强幼女”。
(C#萌娘那高冷的眼神特别像我去高大上的微软面试时,把我虐成狗的可爱的面试官,汪!)
(也许有人会说,C#有酷炫的Linq 而python只有弱爆了的列表推导,你听过python的asq这个库么?)
静态类型就像女老板,而动态类型就像小学妹。总觉得软萌的小学妹,没有代码提示,智能感知,编译期类型检查,容易让人犯错误。小学妹动作慢吞吞,一点都不雷厉风行,问题是,作为一个男人,你真的需要那么快吗?实际上,目前针对动态语言的开发工具,已经很大程度上解决这类问题了。最重要的是程序员这个一家之主,能够认真细心,不犯错误,否则,就算能给一个执行超强严格检查的语言,你还是会FQ出去上干坏事。
更重要的是,有了Python,Github就有的可玩。谷歌今天最新开源的机器学习计算引擎tensorflow就为你打开了大门。开源世界太精彩了,你想到的一切一切,都能找到远在世界另一边的大神写的优秀代码,每天说出的“碉堡了”的数量会翻番。
我之前用C#写了估计两万行代码,后来仔细一琢磨,如果用python,或者用动态类型的思维方式,那么代码能压缩到5千行,而且看着清爽多了。敲很多次键盘又不是一件光荣的事情,为啥我用pip而不用easy_install呢? 因为pip更短。
人生苦短,我用python!
界面 or 文本
我之前是UI流,技术栈几乎是以UI技术为主线的,从MFC, WinForm到WPF,再到Unity3D。做出来的东西,虽然自我感觉良好,但经常被吐槽用户体验不好。我一般会这么反驳:“靠,我又不是专业做界面的,能用就好了嘛”。
学了python之后,我发现我终于能方便地在linux上编程了!九块九买了一台阿里云的最低配,ssh上去,每天ls,mkdir, cp,mv,git搞得飞起,才发现linux真的很好用!多简单啊! 在这两个月,我每天都会发出无数次“碉堡了”的赞叹。哇,ipython怎么这么牛!用pandas这种语法骚到爆的数据分析工具,一句话就能画出一张统计分析图! 用flask这么容易就能做一个web服务!
再接着,我学习了linux风格的开源开发栈,慢慢的习惯了短小精干的变量命名,对做界面的兴趣慢慢减弱,而更感兴趣于纯粹的配置文件和“文本流”(vi 一个配置文件,斜杠正则搜索关键字,比在界面上找选项不知快了多少!) 实现任务队列,写个crontab就可以了,想装一个软件或者类库,pip一下就好了,生活惬意的不要不要的,熟练了vim的ddp, yaw, :wq后,我把VS,npp, pycharm,甚至word,都装上了vim插件。
不谈内功,只论键法。那么,文本流要比界面流快速强大地多,文本是可重用可自定义可测试的,界面除了直观之外,没有其他特别的好处。语言的表现能力极其强大,你试着用界面配置一个正则表达式试试看?
最关键的是,敲着命令行的感觉,真的很cool!
高大全 or 单纯可依赖
我从VC6.0,经过VS2005和中间的各个版本,到现在的VS2015。最明显的感受,并不是功能变强,而是安装包越来越大,安装后将近10GB空间没有了,我也搞不清到底是什么占了这么多空间,难道VS安装包内置了岛国高清电影? .Net类库也越来越大,微软恨不得把所有东西都给塞进去,可是绝大多数东西,我们都不需要啊!有多少人需要工作流设计器?
相比之下,Linux的安装包则小了很多,一个类库小则几十KB,大的也就几兆,没有必要一股脑把一堆用不着的东西都装上去,需要的时候装一下不就可以了?这也是linux的哲学,一次只做一件事,并且把它做到最好。lxml,urllib, grep, awk, vi, top….
编程我们讲求高内聚,低耦合,我觉得类库和工具也是一样。尽量让类库之间减少依赖,让所有的类库都引用公共基类库是一种笨蛋行为,你看似构造了一个漂亮的树型依赖图,结果大家谁也离不开谁,臭不可当的一大坨。自己倒是爽了,可是让别人怎么重用你的类库?给别人代码的时候,还得拖家带口一大堆?纯粹给人找麻烦。
造轮子乃是程序员最喜欢的事情,以前我很有造轮子的习惯现在慢慢的改正过来了。对于没有什么技术含量的事情,何必去造轮子?有这些时间,还不如去学习基础理论或者研究牛逼的源代码。而对于有难度的事情,比如自己实现一个正则表达式引擎,倒是很值得实践的。
明明有现成的绘图语言,偏偏还要用C#去实现绘图和布点,这就是浪费时间(参考我的上一篇博文)。有那些和人争论的功夫,自己早就能用最合适的语言最快速的开发出一个功能出来。
好想重装系统,再也不装VS。
面向对象 or 函数式
先声明一点,两者都很好,两者融合也能工作的很好,无非是更偏向哪一端的风格问题。面向对象很严谨,是静态语言的天下。函数式语言绝大多数都是动态语言。
面向对象虽定义了完整的约束和结构,但客观上也限制了类库的灵活性,让类库只能在本身的数据结构上工作。另外,创建对象的成本是很高的,对性能要求很高的场合,生成一个对象要花费不少计算机资源,重载函数更是性能杀手。这也就是为什么,高性能的函数库一点都不OO。
函数式更加纯粹,它把问题都看成过程(函数),更符合数学的抽象性。少了”对象定义“的束缚,函数式语言可以玩的非常溜。
类库解耦的好处很多,当然有人会问,没有公共的数据结构,不同的模块之间怎么通信?写一个交互的中间件不就可以了么?或者,使用公共的数据结构,字符串,JSON或者XML。在学习了Lisp,尤其是读了《计算机程序的构造与解释》之后,更是颠覆了自己的三观,为什么Lisp如此强大,一个重要的原因是它的数据结构和代码都是一种东西:S-表达式。大神说:写100个针对同一个数据结构的算法,远远好于10个针对10种数据结构的算法。
没事去搞搞SICP的习题吧,挺好玩的。
接口约束 or 测试约束
肯定有人会问,动态语言,类库间高度解耦,而且还是函数式风格,那么,怎么去定义约束?
在C#或者JAVA中,我们通过基类和接口来约束对象和程序员的行为。这很好,但你依然不能避免被队友坑掉,还是不能保证他在重载函数中做了什么脑残的事情。接口约束最蛋疼的事情,莫过于发现还需要添加一个新的成员,就不得不在所有实现该接口的类中添加成员,这种事情我们屡见不鲜了吧?最后,还得写一大堆单元测试,来保证行为一致。
反而,测试约束给了另外一种不错的约束形式,不关心内部是如何动态实现的,只关心对外的测试能否通过,这样就一举解决了动态语言不够”硬“的问题,不使用硬接口的好处很多,此处就不再赘述了。
懒得写单元测试?呵呵。
灵活简单不偏激
现如今,我们希望一切都简单简单更简单,能用三行实现的代码,就不用五行实现。空出来时间,多学点知识,多出去度假吃好吃的。不给自己和别人挖坑。
看了《编程语言实现模式》后,以后再也不去争论什么语言是最好的语言了。什么语言都有最适合它的地方。数据分析有R,数学计算有matlab,企业级开发有C#和JAVA,web开发有PHP。虽然现在主要用python, 但并不妨碍我C#比很多人玩的溜。哪天受不了Python性能不好,就用C重写一遍嘛;如果新需求,通用语言用起来不够爽,那我们就造一种语言来描述嘛。
觉得语言和平台间的交互很复杂吗?那是因为你的系统设计的不够好,而且目前解决交互的技术一抓一大把。追求一把锤子解决所有问题的思维是不好的。现在云计算和高性能计算大行其道,即使同一个模块都会被分拆到不同的服务器上实现并行计算。分割要比集中好很多。灵活地选择技术方案,稳定干净的代码,面向服务,测试约束而非接口约束,简单可依赖。原来编程世界非常的精彩。
不YY了,说句实话,三个月下来,变化还是有的,赶紧干活吧。