乔治于2021年11月19日 Java Ruby Lua Swift Clojure Scala Golang Javascript Shell Kotlin C Python 编程语言

计算机专业科班,工作10+年,一直没有停止过编程。从事的工作兜兜转转,刚好就碰到了好多编程语言,下面说说我和这些编程语言的缘分。

缘分

Java

Java是工作之前做的项目用的语言,学习和实践都需要用到的。他也是我工作之后的主要语言。第一份工作去了搜狐,当时的面试官后来评价说当时的面试表现比有些毕业几年的人都好。(不是自吹,可能刚好蒙对了命题范围,我当然也有百度笔试不过的经历)。

Java是我唯一不停的跟踪其发展,尝试新功能,保持刻意学习的语言。

Lua

Lua就比较巧儿,决定用之前还没写过一行Lua代码。当时面临的场景是有个业务涉及到一些规则频繁的变动,实现的时候是用后端Java服务来做的,所以更新就会稍微麻烦一点。当时使用的反向代理是nginx,一直想说写个nginx插件把这个事情做了。这样规则计算和流量型的nginx集合起来,还能提高机器资源利用率。后来就发现了Lua和nginx结合比较开发友好,比C语言省事多了。

想清楚之后就可以学习Lua,真的是从Reading The Fucking Manual开始的,然后看了几本电子书,边看边写的。最后写出来的是一个Lua+MongoDB操作的规则计算引擎,每天服务1+亿人。

只可惜,后来想想这种越是灵活的东西,越是对用户不友好,学习成本高,面向一般人员的UI不好做,只能给程序员使用了。

Javascript

Javascript我想Web开发的人很早的时候就接触了。 说几个古老的技术大概就理解了:ASP,JSP,jQuery,Ajax等。直到后来前后端分离之后,Javascript已然是最火热的语言之一了。大体上就是这些年后端造的轮子都会用Javascript再造一遍的意思。

Ruby

Ruby是被迫学习的。面临的情况是团队不得已要优化,结果就是人走了,项目还得运行迭代。 刚开始看着源代码头大,然后就是看官网的语言设计原则,找了4,5本书快速看一遍,逐渐适应了另一种风格的语言,然后就逐渐的看明白了并且开始写bug了。

一段时间被Ruby惊艳到了,觉得Ruby大概是CRUD工程师很好的选择,对于创业公司来讲,撸一个MVP是分分钟的事情。只可惜人才供给少,一般公司不敢入Ruby的坑吧。

Golang

Golang是公司买了一个系统,这个系统就是Golang写的。我要负责接收这个系统。听说过『Google出品,必属精品』的话,那就能想到Golang的新闻或者文章很多,还有很多拿他和Java做对比。这个项目不仅仅是一个业务系统,还涉及到算法。就这样我就开始从听过过Golang的人,到开始维护Golang版本的维特比,DFS与剪枝等算法。

Clojure

Clojure语言是用Storm流式计算系统的时候碰到的。当时Storm非常热门,但是其核心代码是用Clojure写的。有些行为不理解的时候,最真实的答案就再源代码里面。所以就必须去理解,去调试,去验证。Clojure只能是远观,因为没有写部署到生产环境的Clojure代码。写Clojure代码,大概有一种手动构建抽象语法树的意思(AST)。

Scala

JVM生态中的函数式编程,出来的很早,加上当时Twitter公司的很多开源项目就用Scala写的,当时所在的公司里面也有项目在用。也仅仅是浏览过几本书。

Shell

工作大部分时间都是面向服务端的而且需要自己运维机器,所有命令行工具就必须要掌握。编写统计脚本,写过服务启动、停止的脚本,写过监控的脚本,自动化运维脚步,日志回滚脚步。服务CPU负载,内存,磁盘,网络等状态查看等等。有很多问题用shell或者命令行脚本快速验证一下非常便捷。

Swift/Object-C

也是团队优化项目不优化的情况下,开始维护iOS的APP。维护的过程中做一些必要的学习。

Kotlin

机缘巧合,不得不开始写Android的APP了。刚开始用Java,团队里面的主力Android开发,也是一个好学的人。把Java代码逐步的都翻译为Kotlin了,也就依葫芦画瓢的开始学习Kotlin了。Java和Kotlin是两种思路,时不时的交错,写出来的代码两边都不像。就这样也算是半个主力,短时间内撸出来一个APP。

C

C语言除了学校里学过之后,工作中基本上和C打交道都是因为nginx。曾经和同事一起调试一个二分算法边界处理不严谨带来的偶发(数据相关)死循环的问题,连续debug了nginx好几天。

Python

Python大部分情况下是shell脚本搞不定了,就用Python来写写。谈不上会写Python,也没有经历过大型生产环境的项目。只能像是放本字典在身边,用的时候翻字典,开卷考试那种。

如何学习

从语言到工程应用,学习的过程基本上就是围绕着系统的生命周期来的。

语言与代码

见过的编程语言多了之后,学习的过程大概就不会重点放在语法的部分,而是着重要了解语言的设计思路,语言的特性。把这个理解透彻了,后面会事半功倍的。一上来就着急开始写代码,不停的遇到拦路虎,这时候就不停的搜索以解决问题。这就变成了所谓的『面向搜索引擎』的编程。等你静下心来回头看,每个问题的解决办法都透露着语言的哲学。 这个阶段我一般是找3+本书,都快速浏览一遍,然后把符合自己胃口的书再精读一下。对于有经验的程序员,我是相信『21天学会编程』的。

模块化

大点的项目都是多人协作共同开发,然后代码的组织方式就很重要。有时候觉得语言很简单,但是项目代码确很庞大。所以要对语言写成的文件,命名空间,类/函数,代码块,作用域等特别关注一下,这些东西是模块化中最基本的东西。

中间件

每个语言大概都有几个应用广泛的中间件,比如Java的Spring, Ruby的Rails等等。这也是要重点关注的地方,大部分项目都离不开这些中间件。

数据库

计算机程序是算法+数据组成的,也就是code+data。只要涉及数据,大概率是要用到数据库。语言生态对数据库的支持也很重要。Ruby生态的ActiveRecord所应用的Association Model对简单应用开发效率是非常大的提升。

依赖管理

大项目都需要有依赖管理,工具就要有个必要的了解。尤其是碰到依赖冲突,多版本,找不到的资源的情况下。 开源的语境下,这也是想快速应用开源的代码要掌握的工具。

构建工具

构建工具大部分开发者不需要关注,把源代码打包成可以在服务器或者应用容器内跑起来的程序,每个语言都提供对应的编译器。这里想强调的是持续构建,就是程序员只需要提交代码,后面的构建都不需要太多参与,解放程序员。

部署工具

把打包好的程序放到服务器上并且跑起来,这是部署工具要解决的问题。这部分可以是『人工智能』的手动用scp,ftp之类的工具放上去或者下载下来,然后用命令行来启动,小小作坊大概就是这样的了。再面对的机器数,应用数,应用类型,运维不同的情况下需要一个稳定的可扩展的工具帮助团队做部署。

运维

这部分设计监控,报警,修复,扩容,缩容,测试,性能,安全等等方面的东西。 程序是跑到计算机中的,所以对他赖以生存的环境是非常有必要了解的。也就是对操作系统,网络,数据库原理,安全加密,协议,标准,内存,CPU,磁盘等等方面都要有一定的了解,学无止境。

总结

常有争论,谁是世界上最好的编程语言?我的答案是没有最好,只有最适合。也就是那句话:抛开场景谈功能都是耍流氓。每个语言都有其最佳应用场景,单纯的对比语言,首先就是评判标准都不统一,不一致,得出的结论也就没啥实际意义。

还有一类问题,是我要不要学习某某语言?反过来看这可能不是你决定的,是事情决定的。当然你要是对某某语言特别有兴趣,那就自己学就好了。如果语言只是吃饭讨生活的工具,那就遇到什么样子的问题,准备最合适解决该问题的工具吧。

最后,也经常听到有人说我不会某某语言,解决不了某某问题。 这就是问题还不够要命,职责还不够明确。职场上要不想办法解决了,要不就换一个坑位吧。作为程序员,以我不会某某语言为由,在我看来大概也不可能是一个优秀的工程师了,持续学习很重要。