一、编程语言特点
有人说 “数据结构 + 算法 = 程序”,那么按照这个逻辑,一门编程语言就是:“运行环境 + 编译/链接 + 语法 + 类库 + 框架 = 编程语言”(当然这是露出在外的冰山一角)。每门编程语言都有深层次的理论,包括编译、解释、执行一系列过程中的基础知识。
拿Python来说,基础类型对应的是C语言实现的一个Struct, 带来的好处是在Collections(集合)中可以为每一个元素设置不同的类型,同时坏处是,同一种类型的Collections中就显得类型信息变得冗余,导致在大数据量的执行过程在空间和时间上变得没有效率,所以Numpy库就出现了。Python作为“胶水”型语言,可以把追求执行效率的实现让给其他语言来做,当然CPython GIL问题也常被诟病(编程语言执行环境选择多线程还是单线程,并如何解决优化执行效率而引发的相关问题【多线程下的锁,单线程下的排队等待】,可以对比JavaScript在单线程执行中引入的Event Loop)。
编程语言设计及实现方式就决定了它本身的优势和弱点。编译执行的效率、智能化(比如:JVM会根据方法的执行的次数来优化编译。提一下,LLVM框架在各大编译器中都有应用和借鉴);并发多线程/进程(随CPU多核心的出现,充分挖掘利用变得重要)、IO操作、跨平台、类库支持等,成为工程化技术应用的选择、比对的标准。比如Java,虽然语法不那么时尚,模块化底层的支持还老拖延(Java 9 中支持,应用还待类库大面积支持),因为累积将近30年的优秀开源库及解决方案,依然是当前技术应用的热门语言之一。
下面谈谈掌握多种编程语言的现实需要:
1、应用场景的需要
分层与解耦、协议与平台无关性、跨平台RPC框架、伴随分布式架构(ESB、SOA、Microservices、Service Mesh)大面积应用,异构融合互通。现在掌握多种编程语言,在应用场景中快速实现新的需求,就变的很有竞争力。当然深层次了解编程语言的实现和执行,有助于代码优化及性能Bug问题的解决。但很多实际应用场景中还没有达到开源框架或类库的设计瓶颈,没有急迫需要去重写或优化开源框架和类库的实现。问题多出在业务逻辑的实现和优化上面。业务逻辑的分解和细化也涉及到产品部门对需求的理解和经验的应用上,我们会在另一篇文章中谈到。
2、编程范式和模型的延续性
POP(面向过程)、OOP(面向对象)、FP(面向函数)的范式思想都是有几十年的高龄了,Java8中才出现lambda这种高阶函数的样式。编程范式在很长的时间内并没有多少变化,编程语言实现编程范式的策略也不尽相同,有的是毅然决然地贯彻一种范式(比如:Haskell、Lisp 等),有的是温和融合方式(比如:Scala、go),有的是渐进方式(比如 :Java)。这里多说一句,Java的发展有其历史包袱,可还记得其泛型的实现也有些苟且。
编程模型在各种语言中也各有特色,这就是它们在相同的处理操作上不同的表现形式,这也是应对不同场景需求的灵活性所在。如果你把范式当做接口或父(基)类, 而各种语言的具体功能(模型)实现就可以理解实现的多态了。模式化的认知思维是人类的特点,这有助于我们归纳总结(也是大数据分析及AI学习的基础思维)。
二、掌握编程语言的方法论
如何掌握多门编程语言?我们分为四个方面去引导,对于非开源性的语言这里就不举例(.net 体系通过.net core开源实现跨平台功能【注:以前只有跨语言功能】,但.net CLR的具体实现而言,在自家Windows平台上具有执行效率的优势,加上一体化的Visual Studio IDE 环境,对入门相当友好,但对一些比较深入的问题探究就具有黑盒效应。所以这里就不多加讨论)。
1、从架构实现的角度,选型、应用中掌握。
2、从DevOps的角度,CI/DI的编译、部署、维护中掌握
3、从性能优化解决BUG的角度,深入原理中掌握
4、从业务逻辑开发中,深入掌握
下面就详细按个人经验去展开谈谈这四个角度。
1、架构实现(整体和选型)的角度
先谈整体架构的角度,脱离实际应用谈架构大多是体现知识面和对原理了解、及经验的积累。花点时间来了解架构发展历程,通用划分方式是:传统架构(单一混合型)、分层架构、分布式架构、超大型分布式架构(主架构下混合其它架构形式)。这样的划分并非是表示越往后越先进,只是从适应发展(规模、用户数量)的角度来看问题。工业设计中有个叫设计余量的东西,留的过多则表明潜能浪费,也就是说,使用价值没有最大化。过度设计也是目前普遍存在的问题(开源项目随取随用,并没有恰如其分的使用或部分使用,往往是紧随潮流的选择)。
这里提一下两个模式:中心模式和分布式模式(一致性的CAP / FLP / BASE理论,PAXOS及变种/ RAFT / ZAB等协议),通常是采用两者结合的方式达到效率平衡(选举中心节点、协调各工作节点)。也有决然的分布式应用,比如区块链,效率始终是个瓶颈,算力攻击也发生过。
这里不主讲架构本身,所以回到选型上,来确定那种框架和中间件能帮助自己实现整体应用架构。了解和对比选型对象,理解其设计理念、架构,以及其所使用的编程语言带来的优势。同时也是自己学习了解选定框架和中间件编程语言的契机。
2、DevOps的角度
Amazon(亚马逊) 最早提出 You build it,You own it ! 现在流行的DevOps概念时尚起来也花了不少时间,随着Docker这种轻容器的兴起,提高了整体运行环境的迁移性,Microservices(微服务)、Serviceless(无服务、云服务商提供可伸缩调用的函数封装、在线IDE) 、Envless (运行环境无关)也使得维护的成本减少,非资深开发人员维护自己写的服务和代码也变得可行、并且正在流行。
在一切变得自动化之前,“如何设置的问题” 还会深入到基础和核心的部分,所以在运维上会牵涉到脚本、系统功能的使用,也就会有了解和熟悉的需要。
3、适应性和性能优化的角度
目前来看一切都很美好,但棘手的问题也随之而来,屏蔽一切复杂之后,傻瓜式编程总是缺少能力去解决适应性和性能优化的问题。软件思想在应对不断的变化中发展,对事物的抽象,总会归结到模式上,流行框架能大规模的应用也就对应着要使用模式来适应多种变化(从生活中来,到生活中去的鲜活例子)。
框架具体应用中可能要用效率来换取灵活性。做好具体案例的适用、优化好性能也是日常工作,对框架实现语言的了解和掌握也就是应有之义了。
4、从业务逻辑开发的角度
这是主要的掌握语言的方式,熟悉语法、深入理解数据结构和算法实现;熟悉编译、执行环境,参与测试流程;解决疑难杂症;学习设计模式和架构,都是大家熟悉的过程。
三、总结
在熟悉一门编程语言后,范式和模型的经验能够迁移不同的语言上。从一个熟悉环境到一个陌生的环境,总会有不适应,这都是自我意识设置的局限,其实没有什么是学不会的!