前言
最近 AI 的火爆程度不需要我多说了,刚刚结束的两会,多位部长的讲话都提到了 AI。其中教育部部长怀进鹏院士提到:「要把人工智能技术深入到教育教学和管理全过程」。
海淀妈妈们的焦虑又增加了……
作为鸡娃群中稀有的程序员爸爸,被多次问到了孩子是否应该学编程?怎么学编程?AI 发展这么快,还有没有必要学编程……等等相关的问题。说实话,这也是我一直思考的问题。
我是非计算机专业出身,比较幸运,入行时赶上了移动互联网发展初期。从小厂到大厂(BAT、TMD 我待过 3 家半),从前端到全栈,从技术到管理。可以说我比较完整的经历了行业、职业、个人的发展周期。今天我就结合个人的阅历和经验,试着深聊一下这个问题。
编程跟 AI 的关系
我们首先要纠正一个误解,其实编程跟 AI 没关系,或者说没有大家想象的关系那么大。
有些人一提到 AI,就会想到是高科技,需要懂计算机,需要懂编程。然后就会有天然的畏惧心理,潜意识里不敢甚至是很排斥碰它。
这大可不必。我们现在谈论的 AI,特指 AI 工具的使用。目前已经做到了人人都可用,未来只会更加的方便易用。计算机、编程这些只是实现它的方法。就像你会开车,并不需要你会造车一样。
学编程,相当于学造车。学 AI 工具,相当于学开车。这两个需要分开来讨论,我们今天主要说说「编程」。
文章会分成几个部分:
- 编程该不该学。综合职业发展给出笔者自己的判断;
- 编程学什么。主要聊一下技术会不会过时的问题;
- 编程怎么学。通过笔者亲身经历,给出学习编程的建议;
- 编程带来的好处。给出笔者总结的一些显性和隐性的好处。
编程该不该学
我的答案是,强烈建议学,我们从两方面来看。
如果你的孩子,未来从事计算机、软件开发甚至硬件开发方面的工作,毫无疑问越早学习编程越好。这些行业起码在可预见的未来 20~30 年内,还是妥妥的高薪行业。有多高薪?以现在的物价,不夸张的说,如果努力超过了平均水平,工作 7 年内达到年薪百万是很有可能的。
如果你的孩子,未来不从事计算机相关的工作。那么编程的意义就在于提升孩子的综合素质。很多人可能以为编程就像数学一样,是一门抽象的「无用」的学问。实际上编程是一门工程学科,是具体的,是细节的,是实践的,是需要上手的。只要是工程,就会涉及到拆分、设计、实施、协作、管理等多方面的工作,这对于孩子综合素质的锻炼是非常有帮助的。编程是最适合在中小学阶段落地「项目式教育」的方法,这个后文会展开讲。
其实这些能力属于软性的「高阶能力」,在初入职场的时候,几乎用不到。但是随着职业发展,岗位提升,这些能力和素质会越来越重要。相应的,这就属于长期投资了,短期能看到的效益不那么明显。所以还是要考虑投入产出比的。
如果以上两点你都不感冒,那这编程,不学也罢。未来服务业(没有看不起服务业的意思)肯定是有大量就业岗位的,如何与人相处的能力才是关键。所以,大家还是结合孩子自身情况来选择吧。
编程学什么
有的家长问我:
- 听说 IT 技术更新的都很快,等毕业了技术都过时了;
- AI 发展的这么快,现在让孩子学,等 20 年后过时了,那不学了个寂寞;
- 听说现在学校教的和毕业之后用的,完全脱节,上大学就是为了混一个文凭吗;
- …………
这个问题我试着用「军队作战」来类比下,看看能不能说明白。
编程 vs. 军队作战
我们先把编程里的一些概念类比一下:
- 编程语言:可以理解成军事训练体系,比如中国体系、美国体系、俄罗斯体系。相应的语言有 C、Java、Python。它们都有一套完整的军衔制度、武器标准、行军规范、传令规范、训练规范等,它是一套标准和规则。只要你学会了这套标准,给你个武器,你就会用,给你个战术,你就会使。书同文,车同轨,一笔写不出来两个王字;
- 代码:可以理解为军工基础原料或零件。比如钢板、螺丝、塑料、火药等,可以加工组合成各种武器装备。就像不同军工体系下的零件标准是不一样的,不同编程语言下的代码规则也是不一样的,但是零件的种类基本上都是一样的;
- 包/库(package):可以理解为各种装备,比如枪、刀、头盔、防弹衣、夜视仪等。它是利用代码实现的,能够解决一个个小问题的工具,具有标准化的特点。符合标准的包,可以很好的配合使用。比如枪和弹匣,只要是同一个标准,我可以随时升级和更换弹夹或者枪;
- 框架(frame):可以理解为套装,一套完整的,由不同功能的装备组合起来的可以直接作战的套装。比如夜战套装、丛林战套装、巷战套装、雪地战套装等。它一定是为了某种特定场景而设计的,在这个场景下可以更好、更快、更方便的解决问题;
- 架构设计:相当于排兵布阵。步兵、炮兵、装甲、后勤部队各需要多少,都布置到哪。哪里敌人可能主攻,兵力部署多少才能顶住。机动部队需要多少,要布置几道防线。架构设计一旦定下来了,预算、资源什么的也就差不多定下来了;
- 项目管理:相当于战场指挥。如何保证不同兵种同时到达目的地。某块阵地比预想的要难啃,怎么调配资源支援。兄弟部队的战况如何了,炮兵营什么时候轮到支援我们。今天晚上要不要急行军等等;
变 vs. 不变
大家体会一下,上面的这些要素,哪些是更新特别快的,哪些是比较稳定的?
没错,包/库和框架,是更新迭代最快的。不断有更好的装备出来,不断有新的场景需要应对。相对的,编程语言、架构设计、项目管理,这些能力变化的没有那么快。我们常说的,技术迭代快,多指的是包/库和框架层面。
移动互联网发展早期的时候,前端框架如雨后春笋般,出的又快又多。毫不夸张地说,半年不学习,你就听不懂大家在聊什么;1 年不学习,你就开始看不懂代码;2 年不学习,你就直接被淘汰了……
最近几年要好一些了,已经过了飞速发展期。但是相对于其它行业来说,IT 行业技术更新迭代的速度,还是要高很多的,甚至高几倍。
所以,我们肯定要重点学习那些不变的东西。那么问题来了,怎么学呢?报班就行了吗?这么多编程班,怎么选呢?家长除了出钱,还能做什么?
下面我们就来聊聊编程怎么学。
编程怎么学
现在市面上的少儿编程班琳琅满目。从 3 岁到 18 岁,看起来有特别完整的体系。而且还能通过参加各种竞赛,丰富简历。我的孩子还小,暂时还没有报班,我也没细研究过。但是编程要学 10+ 年这个事情,我还是很存疑的。
因为我是非计算机科班出身,编程几乎靠自学(大学有 C 语言课,很基础),所以先把我学习编程的经历写出来,供大家借鉴。
我的职业经历
虽然我不是学计算机的,但是我自己比较喜欢编程,平时会写一些游戏外挂,解决那些无聊的点点点的任务。所以编程这块,还算是有一些经验。因为干互联网赚钱多,尤其是程序员,毕业后,幸运的得到了一个实习机会,努力的把握住了,然后就一直干到了现在。下面我分阶段说一下我的职业生涯。(嫌太长可以跳过这段,直接看结论)
- 入职前:刚入职的时候,我自学过一些主流的语言,Java、JS、VB 等。学一门语言,其实挺快的,2 个礼拜就能基本掌握一门语言的语法和基础知识了。但是仅仅是会写个「Hello World」那种,什么库、框架的,完全没概念;
- 第 1 个月:学会了第一个框架(jQuery),老兵带着,只交给我一些小功能。或者他把主要逻辑写完,剩下的细节我来补充;
- 第 2 个月:可以独立开发、维护、修改一个完整的功能。还是老兵安排任务;
- 第 3 个月:一起来的另一个实习生被淘汰。我开始觉得之前写的代码「太垃圾」,于是开始重构(重写)。但是项目的交付排期里面,是不会给你留重构的时间的。好在当时是小团队,而且我还年轻,每天都要写到后半夜。当时真的是凭着热情和兴趣,能力提升的飞快;
- 第 6 个月:代码被我重构了 3、4 次(每次重构都会有明显的成长),框架使用的非常熟练了,基本常识也差不多补齐了。这时候,见识到新框架了,很兴奋地学,然后在新项目里开始用;
- 第 1~3 年:来到了互联网第二梯队的公司,在这里开了一次眼界,大公司的开发方式要比小公司正规和标准的多。岗位和职责分的也更清晰,开始需要和产品经理、设计师、运营沟通,开始有了协作的经历。同时,还带了 2 个外包一起做项目;
- 第 3~5 年:来到了顶级大厂。眼界和见识直接拉满,见识到了行业内最佳实践是什么样。这 2 年经历了特别多的项目,其中不乏大规模的复杂项目,基本上每天都要干到半夜,还是大小周。同时技术能力、工程能力、项目管理能力飞速增长,还完成了管理者的过渡,最多的时候同时带 5 个项目;
- 第 5~7 年:来到了其它大厂,主要偏向于架构设计,其它能力吃老本(够用)。这期间明显跨团队的沟通和协作增多了,最极端的时候,集中了 4 个团队 15 个人攻坚一个项目。这时候我开始系统的学习管理、商业、财务、市场、调研甚至是创业方面的知识和技能;
后面的经历就不写了,已经跟编程关系不大了。这里配上某大厂产品岗位各职级能力模型图,大家体会一下。
先做再学
前面提到过,学习一门编程语言,其实不难,2 个礼拜就可以了,后面的才是关键。结合我的个人经历,我总结了以下几点:
- 编程不是学会一门语言就完事了,这是基础,只是开始;
- 编程不是会的语言越多越厉害。关键是实践,是做项目,是碰到任何问题都能解决;
- 没有人能教给你所有问题的解决方法,去查、去问、去试;
- 库和框架是学不完的。当你足够熟练,足够有经验,足够有见识后,就该「升维」了;
- 要学最佳实践,把见识拉满。见识越高,成长越快。
所以,学习编程的关键,是要做项目。做足够多的项目,跟多人合作一起做项目。说编程是一门经验学科,是有一定道理的。
有人会觉得,这些都是对于成人说的吧,对于一个孩子是不是太复杂了。其实一点也不复杂,而且请不要小瞧我们的孩子,他们只是之前没有做过,不代表他们做不到。其实这是世界范围内有名的一种教学方法 —— 项目式教学,我们来了解下。
编程带来的好处
我们都有一个共识,学校里教的都是一些抽象出来的,简单问题的解法。而商业社会中,我们碰到的问题,往往是具体的,复杂的。这也是为什么我们想给孩子提供综合性的素质教育的原因。
项目式教育
有一种素质教育方式叫,项目式教育。我摘一段查到的定义:
项目式教育,是一种教学方法,它通过创设具体的项目情境,引导学生通过组建项目团队,采取实地调研、交流研讨等方式实现项目目标,从而培养学生的实践能力、团队合作能力和创新思维。
……
项目制教育可以帮助学生将理论知识与实际应用相结合,提高学生的实践能力和创新思维。在职业教育中,项目制教育可以让学生通过实际操作,掌握专业技能。在基础教育中,项目制教育可以通过创设真实的问题情境,激发学生的学习兴趣和主动性。
总的来说,项目制教育是一种以学生为中心,注重实践、创新和问题解决的教学方法,它有助于提高学生的综合素养和能力。
我本人是很认可这种教育方式的,我相信它能够真正的提高孩子的综合素质,并且认为:
编程,是实践项目式教育最高效、成本最低的方式。
为什么这么说呢?我们想象一下,假如现在给你一个项目,让你建一栋房子。就说那些材料,砖、水泥、钢筋,那些工具挖掘机、打桩机、翻斗车、搅拌车,还有需要雇的工人,得多少钱?盖一栋房子得多长时间?下雨刮风会不会影响施工?
咱不说盖房子这么大的项目,就算是让你 3D 打印个东西出来,你也得找打印机,上网买原料吧。
但是编程呢?产品就是软件。材料就是代码,工具直接在 GitHub 上下载,在家里随时随地开始,随时随地结束,沟通还可以用线上会议,开发完了直接往群里一丢就能邀请人体验。
这么一对比是不是就理解编程项目的高效和低成本了。高效和低成本就意味着可以大量完成项目,大量的练习。
通过完成一个项目,能够锻炼到孩子的学习能力、沟通能力、分析能力、执行力,甚至是管理能力。这些能力都是需要在实践中反复练习才能够快速提升的。是需要体感的,光靠看书是学不来的。编程,恰恰可以让孩子以最低成本,最快周期完成项目。这意味着在相同的时间和成本制约下,编程可以更高频的锻炼孩子的上述能力。
无他,唯手熟尔~~
更好的理解世界
必须说明一个现象,目前 IT 行业,还是国外的信息和工具比较丰富,所以编程至少能锻炼你英语的阅读能力。
更深一层,学习编程可以让你对一些客观规律和抽象概念认识的更深刻:
- 微服务。让你亲身体验合久必分,分久必合;
- 计算机结构。让你知道所有处理信息的东西都能抽象成 4 部分:输入,存储,处理,输出;
- 函数、向量、集合、矩阵。让抽象的数学概念变的具体,理解的更深刻;
- 算法优化。让你明白什么是用空间换时间;
- 架构设计。让你明白什么叫耦合,什么叫解耦;
- 面向对象。让你学会怎么定义人,怎么管理人;
- 函数式编程。让你明白什么是副作用,什么是无依赖;
- ……
这些感悟,一定是从实践中来。靠书本和老师教,是永远也学不会的,有点只可意会不可言传的味道。所以这块也不好客观描述,就点到为止吧。
总结
这篇主要聊了编程相关的思考,AI 打算另起一篇,而且不太好写。最后我来给文章做一下总结。
- 首先,编程要学,但是要有重点;
- 然后,最重要的。学编程,一定要做项目,多做项目,跟多人合作做项目;
- 最后,编程是实践项目式教育最合适的方式之一。
所以,如果你给孩子报的编程班,只教编程语言,而不带着孩子具体做东西,那就是耍流氓了。理想中的编程教育,应该是先带着孩子独立完成简单的作品,然后逐渐增加难度和复杂度,然后过渡到团队合作完成作品,反复地练,完成的作品(项目)越多越好。
这篇文章是我现阶段思考的一个成果,相信再过段时间,我还会有更多的思考和体会,到时候一定会再更新。对于孩子的教育,我是认真的。最后,留一段最近看到的比较喜欢的一段话,跟本文关系不大。
孩子一定要亲自带!
人这辈子最大的成功,其实就是在于对下一代的培养上。
像后面我们要说的人家曹操生的一大群优秀儿子,司马懿对两个接班人堪称处处用心的教育,都是自己很牛,儿子同样很牛的代表。
孩子想要出息,和你自己的付出时间与心血是分不开的。
你如果很牛,不仅要花钱给孩子匹配最好的教育,你还要让孩子有足够多的时间去参观与感受你是如何这么牛的。
像气概,性格,眼光等等很多隐性的财富,都是父母给的。
尤其是爹!
咋给的?
你要天天跟他吃晚饭,跟他谈心观察他的心理动态和朋友关系,带他去你的公司参观你的工作,跟他谈论他的兴趣、人生与未来···
都是言传身教,拿时间与心血堆出来的。
没有任何捷径!
你千万不要把孩子扔给保姆或者扔给老人们然后一心扑在赚钱和升职上了,我们最宝贵的财富是孩子,别的都是假的。
——渤海小吏,《第四十五战,灵帝驾崩山雨来》