我在工做中用过好几种编程语言,虽然它们都是图灵完备的,但物以类聚、人以群分,编程语言的社区各自都有很是鲜明的特点。突然意识到这些特色与排序算法给人的印象很有几分类似!下面请看我如何把牛皮吹得清新脱俗:前端
注 介绍的顺序不表明优劣。算法
Java社区给个人印象是中规中矩、以不变应万变。不管是写“Hello World”、仍是搭建一套淘宝系统,不管是高手、仍是菜鸟,最终的代码都逃不开那些条条框框。编程
以JDBC接口为例,作一次查询依次要得到 Connection
->Statement
->ResultSet
。不管你是查一行、带条件、带外部参数……不管哪一种场景都是固定的模式。Java社区在设计API的时候也许根本不考虑“二八法则”:不会为20%的、经常使用的功能(例如简单查询)额外提供一个更简便的接口。后端
这个现象因“约定大于配置”等获得了一些改善,但特征依旧鲜明。框架
这个特色与堆排序很是吻合:不管是已经接近排好序的数列、仍是彻底混乱的数列,堆排序的最好与最坏的效率统一是O(nlog2n),始终按照本身的节奏一步步排序,不会由于已经部分排好序而开后门。编程语言
Perl社区的特点与Java几乎是截然相反!它在处理字符串这一件事情上精益求精,而在其余事情上处理的匪夷所思。例如嵌套的数列(如 (1,2,(3,(4))))会自动被展开成一维数列 (1,2,3,4)。工具
这个特色与插入排序很像,在处理已经基本排好序的数列时,它几乎比全部其余的算法都快;但处理其余状况就不太理想。大数据
PHP是Perl针对Web场景的改良版,也完美地继承了Perl的特点,在Web开发领域几乎稳坐头把交椅。网站
PHP社区给个人印象是“快速原型”:不少网站的初版本、演示项目等都献给了PHP。你能够从零开始作、也能够给予Laravel等框架开发、还能够基于WordPress等系统作二次开发,PHP社区为你提供了丰富的工具来快速实现想法。命令行
PHP源自Perl并青出于蓝,就像希尔排序源自插入排序但效率获得提高,所以我把PHP类比成希尔排序。
Ruby社区给个人感受是创意无限!我最初接触Ruby并不像大多数人同样由于Rails,而是由于诸如Homebrew、Jekyll等由Ruby开发的命令行小工具。在不断深刻这个社区时,发现这个社区的成员各个都充满了创意,他们总能带给我眼前一亮的新鲜玩意儿。
用Ruby很讲究悟性,就像禅同样。这一点和快速排序很像,你想要理解快速排序,就须要理解“分治”的本质;而一旦理解了“分治”算法,就能够不局限于快排这一种算法,还能触类旁通把分治运用到各类场景。就像悟道了同样,不管最后是否在用Ruby编程,你心中之后有了一把衡量程序优雅的尺子。
前几天刚刚吐槽过JavaScript,今天又来感受真很差意思~JavaScript社区给个人印象就四个字——奇技淫巧!从++[[]][+[]]
到 Linux模拟器,从前端到后端,从PC到手机……JavaScript处处宣誓本身无所不能、无孔不入!
归并排序的经历也很相似,一开始由于耗空间并不特别吃香;到了大数据、MapReduce等场景它几乎成了惟一的选择,归并思想上天入地无所不能!和JavaScript借助V8引擎崛起几乎是一个模子里刻出来的。
Clojure社区、或者说整个Lisp社区,乍一眼看把括号括到死的气势、清新脱俗地前缀表达式,就能让你体会到它不是你所熟知的事物。就像第一次遇到线性代数同样:全部的数字与加减乘除符号所有认识,但这句表达式是什么意思就彻底不明白。
Lisp就像打破排序算法时间下界的线性时间排序算法同样不按常理出牌,基数排序跳出了比较+交换的排序思惟框架,出其不意地把效率提升了一个数量级;Lisp抛弃了语法,容许使用宏把语言改形成须要的/喜欢的形式,在Common Lisp中甚至词法均可以DIY,这种剑走偏锋让Lisp具有了非凡的生产力。
Clojure是集Lisp和JVM大成者,包含了 Lisp 的简洁、也融入了 JVM 的实用。Clojure 的库重复的轮子并很少,但每一个轮子都能把它应该作的事情作到极致!例如Leiningen,一个工具就包含了Java的Maven、Ruby的Gem、Python的pip等全部功能。Leiningen 的 uberjar 指令输出的是真正的 Uberjar:把全部依赖的 class 文件打包进同一个 jar 包,而不是像有些构建工具取巧把依赖的第三方 jar 包塞到 lib 目录下。