朱赟的技术管理课_25_24_编程语言漫谈
你好,我是朱茵。
今天我分享的主题是编程语言。
漫谈编程语言是一个已经被谈到耳朵发烫的话题。
很多工程师都聊过,似乎无论怎么写,要么落入老生常谈的俗套,要么就是一堆理论上正确。
但是对学习和理解编程语言并无多大益处的内容。
我跟迟老师说,这篇可说的内容太多,反而不知道从何说起。
迟老师建议我任思维流动,想到哪儿写到哪儿。
比如,你可以点评一下自己最擅长的语言特性,比如新人学编程,如何做到触类旁通,最后一通百通。
回想一下这两个思路,我似乎都用过了。
以前写过点评,ruby和java的文章,也写过自己的编程之路。
今天说点,平时不说的内容可能不讨喜,但至少可以提供一些思考。
我在莱斯大学读硕士期间,课题就是编程语言和编译器设计,翻看当时用到的教科书和论文,需要我学习和掌握的内容。
大概都是这样的。
一一些关于图灵机和状态机的计算理论。
二、类型和类型系统、类型系统的证明和推断。
三、函数中的递归迭代及其实现原理。
四、关于lambda的演算和模型。
五、命令式程序语言、函数式程序语言、逻辑式程序语言以及面向对象程序语言的本质区别。
六、语法器词、法器、编译器、解释器的原理及实现。
所以很多人刚开始接触编程语言,第一反应是怎么用,好不好用。
而我看到一门语言第一反应是,这门语言是怎么实现的?类型系统是什么?计算能力的边界在哪等等。
最早接触的几种语言,比如CO、 kammo、 schema、 python、 java等,都被我拿着手术刀解剖过。
那个时候我想到最多的成语是庖丁解牛和冻若观火。
我的硕士毕业设计是用ocheo去实现一个机器人仿真和控制的语言,有点像MATLAB里的机械模拟库。
研究的目的说白了就是不断用零一这样的离散数学和语言去逼近物理世界中很常见的连续函数,而挑战的就是有限的计算资源和时间。
后来到了博士阶段,课题变成了生物信息学。
那个时候常常要做的是生物学中的大数据处理和建模。
由于业界许多数据科学相关的库都是python实现的,于是我使用到了大量的python编程。
不过在处理海量数据的时候,python的性能就成为一个很大的瓶颈。
经常遇到的情况是一个脚本或者一个函数库,其复杂度在一个临界点后是指数增长的稍微大一点的数据量,动不动就要跑几天,或者干脆跑不出来。
于是我又开始学习并使用一种叫做sison的语言。
这种语言在语法方面算是python和c的混合体,其编译器可以将c son代码转换为c并编译成性能很好的可执行代码。
那时候除了建模需要的数据清洗和数据模型的训练,另一个挑战就是写出高性能的代码。
博士毕业后,我没有选择留在学术界,而是进入互联网公司工作。
Square和airb NB都是以ruby和java为主要编程语言的公司。
这个时候,语言上面临的挑战已经不再是其计算能力或者性能,而是如何在工程中用适当的语言搭建出一个方便协作性能过得去、可读性好、模块化好、可重用易扩展的代码库。
很多时候,工程师们争论的问题不再是对与错是与否的问题,而是每个人的观点应用到相关的场景中的时候,带来的优劣比较。
也就是说是不是把合适的技术用到了正确的场景中。
平衡是我们在这个阶段要着重考虑的这种平衡有时候是时间复杂度,有时候是空间复杂度。
最近几年,我主要使用ruby和java编程,这两门语言的优缺点就不在这里说了。
网上有许多类似的观点,关于java,后面我会写一篇java开发中的常见问题。
下面我会来简单聊聊自己对软件工程和编程语言的一些看法。
有的是点评别人的观点,有的是我自己你的观点分享给你,希望可以给你带来一些启发。
一、初学者不要纠结先学哪种语言,这种时间花的很不值得,还不如随便挑一个语言,跳进去游几圈试试。
对于工程师来说,学习第一门编程语言只是万里长征的第一步,只要你还在这个领域,就不可能只学一种语言,只会一种语言的工程师,根本不能称之为工程师。
二、如果你不能用一种编程语言的基本特性,写出好代码,那换成另一种语言也无济于事。
你会写出同样差的代码。
比如你的java代码写的很糟糕,那么换成go ruby,你的代码也会一样糟糕,甚至更差。
所以基本掌握了一门语言的功能和语法特性之后,要去做实践和练习,能写生产代码了。
再回过头来去看编程语言的本质,了解这门编程语言的设计原理、能力、边界和高级功能,这样有助于你更快更好的掌握其他编程语言。
三、很多人觉得不要用脚本语言入门,我觉得不一定,尤其现在就着人工智能浪潮,搞机器学习的人,用python入门就很好。
另外,脚本语言在面试中绝对占优势。
平时工作中,我对ruby、 python c加加和java的熟练程度差不多。
但是面试中使用ruby或者python答题写代码的时间,估计是那两者的一半。
如果让我推荐一门脚本语言,那就是python关于python的历史和语言特性,可以参考池老师之前写过的。
人生苦短,我用python.译文四,后端工程师要熟练掌握一门前端语言,前端工程师也要熟练掌握一门后端语言,倒不是为了提倡全栈或多个能力储备,而是两者的编程思维模式很不一样。
知己知彼,在架构设计和解决具体问题时,才会更有精确的判断。
另外,现在大前端的概念也比较流行,也就是大前端工程师能够同时掌握外部编程语言。
Ios和android的编程语言,原生技术和外部的配合会越来越紧密。
五、circle是一门非常非常重要,并且应该熟练掌握的语言。
我在这里用了两个非常因为很多工程师有些过于轻视circle了,并为此付出了惨重的代价。
如果你平时的编程工作涉及到业务功能,而不是纯粹的技术架构,一定会使用到数据库。
Circle就是数据的语言。
通过它你可以和数据建立连接和沟沟通。
如果你的数据访问模式写的很差,轻则代码性能一塌糊涂,重则引发bug.而涉及数据的问题,bug等级都比较高,后果可能很严重。
关于circle可以参考我之前的专栏文章,每个工程师都应该了解的数据库知识。
六、无论使用什么语言工程师,都应该能够基于这种语言搭建测试框架,写好测试代码和写业务代码一样重要,甚至更重要。
工作后你会发现,可能有时候我们只花五分钟写了一个程序,而为其写一个差不多能够覆盖所有功能路径的测试用例集,只花了一个小时。
关于测试可以参考我之前的专栏文章,每个工程师都应该了解的AB测试七最后的也是最重要的是在任何时候都要用并发的分布式的思维去看待你的程序。
因为竞争条件或者并发中的不确定因素导致的bug,仅仅理解语言的基本特性根本不能解释。
每种语言都有自己的并发编程模式,学习,每一种语言都应该去深入了解它的并发模式。
在这个多核的时代,不懂并发的程序员不可能是个好工程式。
今天我以漫谈的形式和你聊了聊上学和工作过程中学习和使用编程语言的经历。
然后我讨论了一些对软件工程和编程语言的看法,算是经验之谈。
希望对想要学习或正在使用编程语言的你有所帮助。
编程员,你看它是山,它就是山,你看它是水,它就是水。
你可以把它当做一门简单的编程语言,有语法,有特性,也有优缺点。
但这样的语言也可以复杂到去实现和解释各种计算模型和理论一门编程员到底能做什么?完全和工程师怎么去用,在什么场景中用息息相关,最后留个讨论题。
什么是真正的全栈工程师?他们需要掌握更多的编程语言吗?期待你的回复,我们下期再见。