本周,终于进入编码之道的最核心的理念与价值观,那就是:
编码有术,术中有道
如果你想成为一个优秀的程序员,我写的这篇文章是你值得参考与借鉴的。
这是编码之道的系列文章,这是第四篇,其它文章为:
- 编码之道(一):程序员的"圣经"
- 编码之道(二):软件的价值
- 编码之道(三):编码的困境,失衡的价值
从道德经说起
我最喜欢的两本书,一本就是道德经,一本就是论语。
道德经的有一句话是:
道生一,一生二,二生三,三生万物
这句话想必基本是个中国人就熟知,它的意思大家也基本都了解,万物都是由道衍生而来的。
这句话简直可以作为这个世界的至圣之真理,几乎可以在任何一个领域应用而绝不唐突。当然,在我的编程行业,这个也是理所当然适应的。
对这句话我的理解是:
我们是与万物直接关联的,生活工作中,使用接触的一切一切都属于万物这个范围。万物是复杂且种类繁多的,那是不是我们就不知所措了?
不是,因为按照道德经所说,万物虽然多且复杂,但归根究底,它是由道衍生而来的,道是纯粹的,简单的,单一的东西。
如果我们学会了道,那万物自然不在话下。
那编程是不是也是这么一回事?
编程的道与术
大家有没有想过,同样在我们编程过程中,也类似的存在各种技术,种类繁多,且更新频繁。
对技术人员的一个最大挑战就是:
新技术,新语言,新框架层出不穷,稍不留意,就可能落后了。
所以很多技术人员随着年龄的增长,越发觉得自己学不动了,跟不上这种变动与频率。这也是我们行业只喜欢使用年轻人的原因,年轻人接触新技术,新语言更快,更没有负担。
举例来说:
我在刚毕业时,后端流行的SSH的框架,那时候会SSH就相当于会编程。SSH是Spring,Strtuts以及Hibernate三个技术。
后面等我一段时间没接触后端之后,再回来发现它被Spring给统一了,被Spring Boot给占领了。
但只要稍加分析就会发现,不管是过往的SSH还是Spring Boot,都其实还是MVC模型的实现而已。
类似的经验太多了,这些年从我在各端的编程的经历来说,这种技术变更频繁,但背后的理念思想却仍旧未改变的现象太多了。
我慢慢意识到了,在编程这个领域,原来与道德经说的是一样的,是存在道与术的。
如果我们做为一个程序员,只沉浸在具体的术中,那我们永远跟不上变化,因为术的变化太快了。
但如果我们理解了道,那就能轻松的跟上技术的变化。这些年,我不断的使用新技术去做新的领域的东西,从未感觉到任何艰难之处,也是这个原因。
编程的术
好,我们得好好分析下,什么是编程的术?
举例说来,一个公司准备一个新的项目或产品,在技术第一步要做的肯定是技术选型。
假设选型结论如下:
后端
使用Spring Boot的单体服务形式,数据库使用Mysql,框架使用Spring data jpa。这应该是一个常见的搭配。
前端
使用React技术,考虑到TypeScript更适合团队合作,选用TypeScript而非JavaScript做为编码语言。
移动端
考虑到此项目对性能要求并不太高,为减少成本,使用React Native跨平台开发技术。
这个应该是每个程序员都非常熟悉的一个过程,事实上所谓架构师的工作,可能很大一部分就是在选型,搭配不同的技术而已。
上面这个结论中,出现了各种语言,框架,技术等,它们全都属于术的范围。
什么是术?以下这些全是术:
- 具体的编程语言
- 各种语言的生态,包括类库以及框架等
- 一些辅助编程的工具,如代码生成等
而事实上,大多数程序员的工作,就是在使用编码的术而已,不同的无非是在用哪个语言,哪个框架不同而已。而所谓对程序员是好是坏的评估,基本也建立在一个程序员是否对特定语言或特定框架熟知或使用年限。
而大多数所谓的面试,也就是通过不断的询问特定语言或技术框架的一些知识点来考察程序员,这实在是一个极大的错误。
编程的道
一个简单的问题是:
一个程序员,是不是使用Spring Boot最久,对其各种特性掌握与使用的越多,他就能越写好代码?
当然不是,我们都知道不是,对吧。
我们有时候会发现一个程序员有潜力,但他接触的语言或技术并不多,但我们能判断他是个优秀的程序员,并且能很快的掌握新的技术或语言。
那这背后,究竟是什么原因?
原因就是:
理解与掌握编码的道远重要于编码的术
术这种东西,其实可能并未有我们想像的那么重要,一个程序员,如果能用React写出高质量的代码,理所当然的他一定能用Vue也写出高质量的代码,就算他从未使用过Vue。而与之相对应的是,一个程序员如果用Vue写不好代码,不管他多熟悉React,他也一定用React写不出好的代码。
就如同我上面所说的,不管是SSH,还是Spring Boot,都其实可能是对MVC思想的一种实现而已,那显而易见的,MVC思想这种看不见,摸不着,也不是具体的语言或框架的东西,是不是更重要?
那与之类似的东西,我把它们称为道。
以下这些,都属于编码之道:
- 编码的思想,如MVC思想,分层思想,领域驱动思想等
- 编码的方法论,如敏捷软件开发的方法论
- 面向对象的三大特性与五大基本原则
- 一些常见的架构风格与架构模式:如分层,六边型,CORS,事件驱动等
- 设计模式
- 代码简洁之道
- 重构
- 测试驱动(TDD)等
上面这些东西,没有任何一个是具体的语言或具体的技术。
但是,只要你稍微细想下,基本上没有一种具体的术不是来源于道。
比如,我以面向对象的语言为说明
面向对象的语言有三大基本特性与五大基本原则,我怀疑很多程序员不一定知道。
三大特性
- 封装
- 继承
- 多态
五大原则
- 单一职责原则
- 开闭原则
- 里氏替换原则
- 接口隔离原则
- 依赖倒转原则
基本上,我们行业,应用级来说,全被面向对象的编程语言占领,后端的Java,移动端的Swift,OC或Kotlin,前端的TypeScript,全是面向对象的语言。
我这些年,上面这些语言全用过,它们无一例外的符合面向对象的三大特性与五大原则。
所以,当我能用Java编写代码,并尽量以五大原则为标准来编码代码时,同样的,我在用TypeScript,我也会遵守这些。而这些是决定了代码好坏的关键。
至于是这些代码到底是用Java来写的,还是用TypeScript来写的,又有何差别,不同面向对象语言的差别无非就是在,定义一个函数,是fun还是function等语法规则上的不同。
变化的术,及永恒的道
我希望我写的这些能对你有帮助或借鉴,让你开始思考如何才能成为一个优秀的程序员。
掌握具体的语言或框架当然是很重要的,但它绝不是决定性的,决定你能否成为一个优秀的程序员的关键仍然在于:你对编码的道有没有概念,理解与掌握。
下一篇,继续讲编码之道:编码之道(五):变化的术,及永恒的道。再进一步阐述对编码之道与编码之术的理解与思考。