前言
受邀在C站的专家圈社群里进行分享,以下是本次分享的全文。
自我介绍
我叫郑皓桦,是一名全栈工程师。csdn名字是攻城狮白玉。
因为本人的专业经验和经历都没有群里各位专家的丰富。今天就由自身经历出发,为大家带来一个开放性的问题来与大家讨论。今天想与各位专家讨论的是——《程序员的成长之路——道和术的思考》。
在开始之前,我想定义几个名词,一个是码农,一个是程序员。码农就是敲代码的人。程序员就是会思考的码农。本次讨论借用道家的两个概念,道和术。道用于解决原理问题,是方法论,术用于是解决技术问题,是方法。
成长之路
我本人是在大学才开始接触编程,从一开始的c语言,单片机,嵌入式,再到后来物联网的服务端开发,单体web服务开发,微服务开发,再到公司saas平台开发。中间还参与公司项目架构设计,在工作过程中涉猎部分云原生相关知识的。这个过程其实是在不断的学习各种技术,也就是积累术的过程。
这么多年的学习,我发现,越往上层走(这里的上层是指计算机服务应用的分层),技术更新迭代更快,需要保持自己的学习能力,还要保持好奇心,才能去接受新鲜的事物。
慢慢我发现,这些新鲜事物,归根结底,都是服务于人,服务于计算机,为了人们的降本增效而提出来的工具。既然是工具,那就是咱们拿来用的。工具是中性的,没有好坏之分,有的只是兵器称不称手。这些是为术。也就是工具。除此之外,而我们还要具有工具思维。就像《遥远的救世主》里,丁元英对道和术的论述所说:“有道无术,术尚可求也。有术无道,止于术”。
术与工具
术是方法,讲究因时因地因人因事而变,是能够被反复学习从而提高的事物和本领。因此术便是指合适的工具。改革初期,邓小平爷爷提出的,不管黑猫白猫,能抓老鼠的就是好猫。正是体现了术的因时因地因人因事而变。
之前看到有人为了编程语言的好坏争得面红耳赤,我就在旁边笑笑不说话。什么前端js很low的哇,还是后端java高端一点。python就是玩具,没办法拿来做大项目,还是java稳定,等等等等。都是以己之长,攻人之短。并没有一种很客观的认识。
还有一些程序员也因此被编程语言给束缚住了。觉得就得是一门语言来实现所有的场景。或者是被框架束缚住了,学习了分布式框架之后,觉得spring cloud体系的最好的,原来的单体应用就跟low。诸如此类。这些都是自己建在自己脑海中的一堵墙,把自己给束缚住了。没有把自己当作工具人来看待。工具人工具人,就是使用工具的人,而不是被工具绑架的人。
但他们忘记了,每个工具被发明出来是为了解决特定问题的。忘了工具被发明出来的初心。
作为程序员,大家或多或少都会经历一些重复性工作的场景,那在这个时候,是否会有想到用工具来解决自己重复性工作呢?例如,找一些现有的工具来提升自己的效率。或者是通过书写一些脚本来减轻自己一些重复性的工作。在我上大学时,期末考试学校的教务系统出成绩,都是无法主动收到通知的,只能每天自己去看。大一的时候,傻乎乎地每隔几天上去教务系统查。后面懂编程之后,自己写了个python脚本每天定时去爬教务系统数据,每当数据有更新的时候便通过自己的公众号主动推信息到自己的微信上。从此成为了班上第一个知道成绩出来的同学。
道与思维
论述完术和工具的关系,咱们透过现象看本质,工具的背后都有共同之处,这背后的共通之处便是道。道是一定要被参悟才能提高的事物和境界,具有抽象性、规律性和相对稳定性。在这里,我认为道便是一种工具思维。
比如编程语言,他们都符合计算机原理,都可以用来实现算法和数据结构,都可以套进去各种编程架构。无论是c/c++,golang,python,java,本质上都是通过一种人能够懂得的语法去描述能够让机器理解并执行你所想行为的语言。在完成一件事,例如说做服务器后端。这四者都可以实现,只是实现的难易程度不一样。用途也不一样。c/c++,绝大多数在线游戏公司的服务器都是用的c/c++来实现的,因为c/c++实现的服务实时性是其他语言所无法比拟的。当然现在也有些公司在慢慢往golang转,因为golang是谷歌设计天生用于高并发的服务器语言。但是这里并不是指游戏的完整后端都是C/C++,因为一个完成的后端服务,其实除了实时游戏,还有游戏社交这一部分的东西,游戏社交的后端服务,你要用java也行,python也行。其实都是工具而已。
同样的再举一个例子,例如领域驱动设计DDD,有相当一部分程序员会觉得,DDD就是一种装逼的做法,使用DDD除了提高代码复杂度并没有什么作用,还有一些的观点就是,DDD并不成熟,没有成熟的框架,是一种很虚的设计模式。
但是DDD(Domain Driven Design)其实是一种设计思维方式,它所要解决的问题,是传统软件设计方法中产生的沟通歧义导致的问题。
领域驱动设计(DDD)是教我们如何做好软件的,同时也是教我们如何更好地使用面向对象技术的。也正因为DDD是一种设计思维方式,也就是道,所以它提供的是一整套软件设计及落地的方法论,没有所谓的“标准”可言。这也是为啥会没有相关定型的一个软件框架出来,因为每个人对于DDD的实践落地时的思考不一样,写代码的时候的分块也不一样。只要符合DDD的设计理念即可。每个人落地时的具体做法,就是术的体现。即每个人对于道的理解不同,表现出来的术也不一样。同时,DDD的方法论要求我们在落地时,要遵守其规范进行追踪和code review。从而使得团队更好的协作,构建的系统更加的强壮。
后记
道是思想,是思维方式,是方法论。在编程的世界里,是算法,是架构,是设计模式。道指导着术,术是道的载体,是方法论具体的落地方法。最开始的时候,我提到越学习的时候,越发现技术更新迭代的很快,需要自己不断地去学习。这是因为术是具体的方法,会因时因地因人因事而变。而实际上背后的设计模式等等,却是不那么容易过时。
因此在编程的过程中,在面对一个需求的时候,我们应该把更多的时间花在设计上面,去思考这个需求怎么做才好。方便后续扩展,高可用。而不是一上来就吭哧吭哧的就下手写代码。有人会说,这不是架构师该考虑的事情么?但我觉得多思考总归没有坏处。至少你在思考的时候就不是码农了,而是程序员。
以上只是小生的拙见,起抛砖引玉之用。还请各位专家批评指正。
写在后面
如果觉得有用的话,麻烦一键三连支持一下攻城狮白玉,并把本文分享给更多的小伙伴。你的简单支持,我的无限创作动力