编程 || 解决问题
这是系列文章第一篇。
我有近10年的工作经历。刚毕业的头两年,是在工控领域做自动化工程师,用PLC编程。之后,兴趣使然,做了软件工程师,用Java编程。曾在互联网公司担任过技术专家,管理过技术团队。随后又在创业公司做过架构师、技术总监等职位。
不能说经验太丰富,但多少也可以提供一些视角,供大家参考。
关键词一:解决问题
很多零基础学编程的文章,都列出了“劝退清单”,要入门就得学这些:数据结构、算法、Java、Spring、MySQL、缓存、消息队列、数仓、分布式,极其各个细项,一大堆东西。别说零基础,十年基础看得也要慌。我认为如果一个人不出于解决实际问题,而整日看一些概念的技术书,是一个非常不人道的做法。
当然,当代程序员不得不看,因为厂里招人就是这个要求。一旦内卷,那大家都没法好好生活。这是现状,没有办法,我们也许只能接受,但是我希望的,在你接受现状的时候,你也要眼里有光。编程到底是一个应用性很强的学科,它的目的在于“解决问题”!自己念三遍吧。
如果你看完这篇文章,甚至于我假使写了无数篇文章后,只想让你记住的四个字,那么就是“解决问题”。
比方你大学前端后端人工智能统统都学了,靠年轻之力记住了非常多的细节,你面试通过了,随后你做的是后端工程师。那么,基本上你可以忘掉所有前端知识,只要记得那是在展示,即可。这是在做什么?是在基于抽象层级地学习。我们总说要搞明白抽象层级,基于接口编程,迁移到学习中,也是一样的。你要相信你的接口,相信自己不用去深入跨领域的每一个细节,相信不用去搞明白底层的每一个细节,也能解决你的实际问题。
有个理论叫SOC——Separation Of Concern,关注点分离。运用到编程中,一个具体场景就是不要让子程序的变量超过7个,为什么,因为人的短期记忆,就是只能处理7±2的概念数,一旦超过,你会极不舒适,你不舒适老板无所谓,但如果出了差错你就完了。刚入行的时候经常看到有人写几百行的方法,写完之后我看他人也不大好了,你要问他这是在写啥,教教我,他脾气也会变得很不好,这也就算了,他还想显得自己挺懂,这就很难相处。
另外,我是一个平常心看待中间件的人,认为这也是另一种业务开发,不过它们的业务是某个中间件罢了。我们可以“去心中神”,不是做了某个底层领域就一定很厉害。事实上,每个领域的专家都厉害,每个领域的菜鸟都不厉害。我更喜欢这样的工程师,知道世上新出了某些技术,随后使用好这些技术,解决了某些实际的业务问题。至于要多么地深入这个工具的底层,就取决于场景是否需要。我们都知道不断有新技术出现和淘汰,但又万变不离其宗。
我自己来到创业公司后还有个感悟,中间件团队一定不是中小厂的必备,甚至在资源有限的情况下,往中间件多投入一分都是错误的选择。因为你投入小了不会有成效,投入多了没这个资源。那怎么办,缓存,队列,都要用啊?答案很简单,买。现在各种云服务非常多,他们提供的服务也远比一些二线互联网公司自建的中间件团队要稳定。在当代,如果仍在坚持自建IDC机房,那很可能都过不了等保审计。比如这个问题——你如何容灾备份。
说了以上这些,就是希望你重视“解决问题”,解决问题是需要有“场景”的,而非闭门造车的。这是我们的第一个“关键词”。
关键词二:完整理解。
我们已经知道了要学什么,是有一个限定范围的。但是我们依然需要具备对问题的“完整理解”。
也许你会问,那这不是矛盾了吗?刚才还说要有限定的学习和理解,怎么现在又要“完整理解”了,这不就是啥都要学吗?
不是的,打个比方,公司的CEO知道基层员工在做啥吗?大概率是不知道的,但是影响他管理好这个公司吗,不影响的。
我给出的编程领域的“完整理解”,是需要你知道这一点——编程所做的一切,都是关于信息及对信息的处理。
拿一个公司技术团队的标配来说,包含前端工程师、后端工程师、算法工程师、测试工程师。这些岗位,拿到的是同一批“信息”,但是大家对这些“信息”的“处理”不同。前端负责信息的展示,后端负责信息的逻辑,算法负责信息的洞察,测试负责检查大家的工作。
再从中间件的角度去看信息的处理。大厂有专岗负责中间件。常见如,应用服务器、数据库、缓存、消息队列、数仓等等,还有很多。同样,它们拿到的也是同一批“信息”。应用服务器负责计算,数据库负责存储,缓存负责热点数据的加速,消息队列负责缓冲,数仓负责分析。其中一些中间件的功能会有交集,但是他们擅长的领域不同,比如大学篮球队队长和我都会打篮球,队长和我也可能都会编程,但篮球比赛就是得他去打,编程的事就得我去做。
如果你还是有些迷茫,很正常。因为现在说的还是太抽象了。我给你的完整理解的具体行动是这样的:
找到所有常用的技术中间件,列一个清单,随后通读他们的介绍,找到这几个问题的答案——他们叫什么,应用场景是什么,即可。
如果是从零开始,列这么个清单就有点难,那么我抛砖引玉,来给你这么一个清单。
技术名 | 场景 | 使用频率 |
---|---|---|
域名 | 网站名 | 低 |
IP | 主机标识 | 低 |
DNS | 域名和IP的映射 | 低 |
负载均衡 | 将请求分流 | 低 |
路由器 | 外网与内网的中转站 | 低 |
交换机 | 内网与内网的中转站 | 低 |
服务器 | 一台电脑 | 低 |
数据库 | 专门放数据的工具 | 高 |
业务应用程序 | 专门计算的工具 | 中 |
缓存服务器 | 专门放热点数据的工具 | 中 |
消息队列 | 先把数据丢进去,排队等着处理的工具 | 中 |
文件存储 | 存文件的工具 | 中 |
搜索引擎 | 类似数据库,但是能支持模糊搜索的工具 | 中 |
配置中心 | 专门放配置信息的工具 | 中 |
邮件服务 | 发邮件的工具 | 中 |
短信服务 | 发短信的工具 | 中 |
Jenkins | 帮你串命令自动化发布的工具 | 中 |
Java | 你的编程语言 | 高 |
以上,是一些通俗的写法。如果需要非常准确的定义,教科书里有一大把。但我自己的学习过程中,往往是通过教科书中的大量理解,随后总结成这么一句简单的话。尽管不一定准确,但很实用。并且,你也不要用我的总结作为你的总结,如果你能总结的更好,为什么不呢?
这里,我想到了一个《三傻大闹宝莱坞》的场景,非常的生动,建议大家有空可以看一下。
再来看一眼表里的内容。你能看到,其中大部分都是中频,甚至对于这些中频的技术,都可以通过封装的方式屏蔽其中的复杂度,对你来说只需要无脑调用即可。那么,剩下的,就是如何学会那两个高频,Java和数据库。问题是不是简化了不少。
关键词三:哲学三问
你从哪儿来?现在在哪里?要到哪儿去?
我觉得我们务必要搞明白这些,这样才会有行动的动力。拿我自己来说,我曾经是一名科幻爱好者,最喜欢的小说是《三体》,喜欢的电影有《星球大战》、《星际迷航》等。既喜欢里面的科幻元素,也喜欢里面关乎勇气和探索的故事。我自己也曾写过一些故事,感动了自己,也感动了一些我强行投喂的朋友。
在写程序前,我是一个非常喜欢写故事的人,写程序后,终日在恐惧和不安中学习,满眼所及,永远是学不完的知识。而学技术的过程也不再能体会到乐趣,只有焦虑,时刻担心被职场淘汰。这些焦虑下的学习,不见得提升了我的价值,反而让我倍感疲惫,忘了初心。如果你一生大部分的时间都是焦虑的,那么你一生就是不成功的。
所以,现在的我相信人是最终的意义,我们所做的一切,都是为了让自己过的开心。而我们的价值,也不是能解多少面试题,而是能处理多少的实际问题。从人出发,满足人的需求,将这些需求层层细化,就成了你手里的业务问题。这也是获取财富的逻辑。
人生苦短,愿我们现在和以后,都能开开心心地工作和学习。