编程,还要入坑嘛?

编程,还要入坑嘛?

背景

由于自己的职业属性,每逢高考结束,经常有亲朋好友来询问我「到底要不要选计算机专业,成为一名程序员」。对待这样的问题,我有时候也不知道该如何回答,毕竟人各有异,没法统一而论。可如果问题换一个切入点,比如「要不要学习计算机编程知识?」,这个我觉得毫无疑问是需要的。一方面大学里大部分专业都会学习C语言,另一方面从个人观点上也觉得编程是大学生不可或缺的技能之一。所以,我想写一篇文章来阐述一下我对于非计算机专业学习编程的一些想法,后面还会结合我自己的一些经验分享一下到底该如何开始学习。

基础概念

那么首先,我们来看一些基础概念。什么是「编程(Programming)」,或者说程序设计?根据维基百科中的解释

编程是给出解决特定问题程序的过程。

那什么是「程序」?

是指一组指示电子计算机或其他具有消息处理能力设备每一步动作的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。 — 维基百科

那什么又是「程序设计语言(编程语言)」?

是一种被标准化的交流技巧,用来向计算机发出指令。一种能够让程序员准确地定义计算机所需要使用数据的计算机语言,并精确地定义在不同情况下所应当采取的行动。 — 维基百科

这样,大概就明白了编程的前半句话,那后半句的「特定问题」到底是指的什么?

  • 数学计算(比如给定一个复杂的函数,去进行绘制图像)
  • 业务需求(比如全国铁路的调度软件,智能门锁的软件等等)
  • 个人需求(比如通过API打造一个私人微博,又比如通过自动化的方式解决生活中重复的事情)
  • 各种各样的点子,问题等等
    所以结合起来看,即程序是指程序员通过标准化的计算机语言,编写的一组指令,运行在可以处理这些指令的设备上(包括单不限于电脑,手机,单片机等等),目地是解决特定的需求,点子或者问题的工具(能力)

为什么要学习编程

我个人觉得,做任何一件事情最重要的是兴趣,有了兴趣也就不用解释为什么要做了。所以开始之前可以问问自己有没有兴趣。可世间的事情,也不完全因为兴趣使然,可能也会是偶然(PS:所以多拓宽自己的眼界,并且勇于尝试,这样才能为偶然创造可能的概率)。以下,我仅从我有限的认知中来聊一聊非技术岗为什么要学习编程。

社会角度

从社会来看,随着移动互联网的井喷发展,我们的日常生活早已经被各种网络服务(导航,外卖,语音识别)和各种App所占据。而在这些数字化生活提供的便利背后,以及市场经济供求关系可以明白,自然少不了大批的程序员从0到1去实现,维护和迭代它们。和PC互联网时代不同,现在的移动互联网人口基数特别大,根据2021年CNNIC发布的第47次《中国互联网络发展状况统计报告》显示,我国有9.89亿互联网用户。似乎这几年,我也感受到周围的圈子中涌现了很多其他行业转行为程序员的人。

另外随着国家的互联网+战略的推行,越来越多的传统行业,企事业单位都在进行互联网数字化转型,从最初的电子化文档,到现在的流程电子化,自动化,背后的推动力除了是基础设施的完善,还有一部分也是编程市场的不断成熟。或许在未来,入职的新员工都懂一点编程知识,会让公司/单位转型的更加快。并且学习编程知识,也能让自己在这个电子化的社会中,获得比别人更广的视野。

最后是看不见但却不能忽视的社会推动力。从移动互联网伊始,社会中就一直存在着各种的移动端编程开发的培训。到前几年,各大公众号都在推荐利用Python去简化工作提高效率。再到近几年,少儿编程依旧是不少家长培养孩子的首选技能(顺带吐槽一下某少儿编程公司,电话销售给我打电话推荐K12的少儿编程课,我问她是学什么程序设计语言呢?她就支支吾吾回答不上来,最后自己不好意思就掐了电话+_+)。这些都说明着社会对于编程的认知和诉求都在不断的提高,同时编程也在拓宽自己的适用范围,拿现在流行的词来说就是「出圈」。就即使抛开市场需求的角度不谈,更加现实点来看,程序员的工资较同等年限其他工种还是要高一些的。当然,福报996(ICU),人傻钱多死的早都是后话了。

个人角度

就个人的角度而言,一方面能提高自己的个人能力,提高个人的竞争力,另一方面编程的思想可以用来优化生活或者说「Life Hacks」。

编程其实是一件非常需要耐心和动手能力的一件事,很多时候都需要潜心的去发现问题并着手解决问题。当然在这背后也有很多乐趣,首当其冲的当然是那种容易获得的满足感。而且我也发现解决问题的复杂度和解决完成之后的喜悦感成正比

「发现问题-定位问题-寻找方案-确定方案-解决问题-舒服斯基」 的这个增强回路,会一直存在于编程的任何阶段,无论是刚学习编程的菜鸟还是有很长工作经验的大虾,都能得到那种成就感。

说起编程思维,可能比较抽象。允许我简化的来表述一下我的看法,当然以下也不是绝对必须:

  • 数理逻辑的思维能力:离散数学,模拟电路的逻辑门等
  • 多角度的辩证思维能力:整体/局部观,二元对立非黑即白,或者运用自己的智慧找到黑和白之间的灰
  • 深入理解计算机的逻辑:硬件逻辑(内存,CPU,硬盘各自发挥的逻辑作用等),软件逻辑(条件判断,循环,分支等)以及操作系统逻辑(FIFO,堆,栈,指针等)

有了一定的编程思维和计算机基础之后,再来进行编程,或许可以更快上手,更容易走的更远。并且由于计算机搭建起来的世界有着类似的逻辑性,用编程思维去审视现在的互联网产品,相信我你会看到和之前不尽相同的一款产品。

计算机在做重复的工作上有着先天的优势,所以可以利用编程思维将复杂,繁重,重复的事情交给机器来处理,释放我们的精力和时间,去做更加有意义的事情,优化生活。比如,自动化签到,打卡,抢购,图片批量压缩,通过API完成自动的流程,构建自己的智能家居逻辑等等。编程思维也体现在手机端的各个角落,比如iOS14带来的桌面组建,完全可以通过技术手段实现更加酷炫的效果,又或者通过Tasker,Shortcuts实现的自动化流程。又比如最近冒出来的很多No Code平台,实际上也是将编程的思维简化,并协助用户实现个人需求的一种方式。

在了解一点编程思维并且有编程能力的话,也会让自己在这个社会中变得更加独立,不会被资本家卡住喉咙。你可以搭建属于个人的独立的播客,播客或者应用程序,这些独立的场所由于数据和服务都在自己可控范围内,那就可以表达自己想表达的,不会被条条框框的阻拦。当然至关重要的是这些东西都是属于你呢,是不会无缘无故的「被删除」或者「被消失」。让它们变成一块属于自己的自留地,想做什么完全取决于你(当然中国互联网不是法外之地,黄毒赌就别整了)。利用技术手段,你也有了更多的选择权,去通过Google,Youtube,Spotify,Telegram等,见识到到更加缤纷美丽的世界。

当然除了我上面说的这些因素之外还有很多其他的原因。例如个人行业竞争焦虑,性格的倾向,兴趣的强烈导向等等,这里我就不过多的去展开说了,毕竟每个人所面临的问题不同,答案自然就不相同。

怎么开始

准备工作

关于如何开始的问题,不同的人有不同的想法和路径,并不能完全照搬,以下是从我个人的角度出发,仅供参考。

在开始之前,可以选择一门便于理解,语法结构不复杂,并且扩展库丰富的语言。我个人比较推荐Python3,它就比较好能满足上面的两点。首先语法比较简单,看代码的障碍会小很多。另外一个比较重要的点,就是Python语言库丰富,在学会了之后去解决不同的问题,就能采用不同的库。比如说机器学习(Tensorflow),图像识别(Pillow),数据分析(Numpy),Web搭建(Django,Flask)等等都非常强大。

确定好了语言之后,就可以围绕这个语言选择一些常用的开发者工具,好的工具能减轻开发的难度,增加开发效率。开发语言离不开的就是开发环境和文本编辑器,环境的问题在搜索引擎都能搜到大量的文章,而对于后者根据每个人的喜好不同,就会有不同的选择。这里我就简化一点的说,喜欢大一统的可以选择Pycharm IDE,动手能力强一点的考虑通用型的VS Code。举个不恰当的栗子,使用前者,就有点像系统相机自带的滤镜,随便拍就能出效果。而后者就有点像单反相机的机身,提供了基础的功能,想要拍什么搭配什么的镜头,什么样的参数,完全取决于你怎么用。

下来一个现在没那么重要但以后很重要的事情就是,进行代码的管理。在学习阶段,用代码管理工具的主要目地,其实就是看到自己思考的过程,让它们有迹可循,也可回溯。简单点来说,它就是一个版本控制的工具,可以查询或者还原到某个你修改的代码。关于版本控制的一些内容,我也写过几篇文章( 如何做代码管理(一)--代码管理工具介绍及使用  如何做代码管理(二)--Git提交流程 )。不妨等你有对这个工具有了了解之后,可以再去读读看。有了代码控制,你就在本地有了代码的版本历史,倘若你想说走就走,那么就需要有一个云端的代码托管服务。国际上比较有名的是Github,国内比较常用的是Gitee,两者的操作都基本相当,可以根据你自身的情况进行选择。

当然在上面两个基础之外,还需要学会利用科学的方式给自己营造一个良好的网络环境。因为利用好优秀的搜索引擎,就是成功的一半了,当然我指的不是百度搜索。良好的网络,也能让你流畅地访问官方的文档,潇洒地闲逛程序员复制粘贴池SOF,还能在困惑的时候看看Youtube视频放放松。我一直认为畅通无阻的网络环境是生活的必需品,毕竟谁不喜欢自由和清新的空气。有的朋友经常给我说贵,可事实上较之奶茶和火锅,不知便宜到哪里去了。一顿饭钱换一年自由,怎么能算贵呢?点击这里,即刻接入国际互联网。

开始行动

开始当然是需要把Python的环境安装好,不过在类Linux的系统之下,Python默认是集成在了系统里。想要验证是否存在Python环境,可以打开终端,输入python -V查看系统的Python版本。

安装Python环境,可以参考廖雪峰的Python教程,跟着里面说的一步步操作下来,环境就应该会安装好的。如果中途遇到了一些问题,还可以参考文章下的评论区,或许就能找到有类似问题的朋友,看看他们怎么解决的。

接着就可以去学习并练习Python的语法了。官方的教程当然是最好的,而且还有中文版。同样的,廖雪峰的Python入门教程也十分的不错。我以前也写了一篇简单入门的Python的文章,也可以大概浏览一下。

当基础语法学习的差不多了,就可以尝试去做一些小练习,或许廖雪峰教程中那个课后作业相对初学者来说还是有一定难度的。可以去看看这里提供的100道题目及答案。当然你也可以用Python解决一些具体的小问题,比方说,自动获取某个天气网站的天气数据,定期的下载某个喜欢的人的微博头像等等。在动手的过程中,肯定会遇到问题,耐心的定位问题,细心的搜索问题的解决方案并尝试解决它们吧。

做练习之外的时间,我也推荐去这个Python100天的Repo学习学习,按照它的天数去来规划学习和理解。不要贪多,慢慢走可能会走的比较远。

What’s Next

在经过了上面的这些练习之后,相信语法和基础的逻辑大体上不再会有大的问题。下一步就是进入较为枯燥的阶段了,当然任何的学习过程都免不了这个过程。大部分的学习曲线都如同上台阶一样,一层一层的往上爬。当然也有例外,比如Vim(大法好)和Emacs:
图片来源:主流文本编辑器学习曲线 - https://coolshell.cn/articles/3125.html

所以,在平台期的时候,就是需要不断刻意地去练习编程,并且多去想想 「怎么做」「怎么做更好」。前者可以持续的给自己找一些复杂的需求去动手解决,做之前可以现在脑中或者脑图中梳理一下可能存在的环节,将一个需求尽可能划分为多个有关联的小问题,化繁为简。当然,如果你不知道有什么需求,那也可以在Github上搜索一些小的项目,先去想想自己会如何实现,再来看看对方是怎么实现的。

这也就顺带引出来了后面的「怎么做的更好」的问题。在阅读别人代码,理解消化对方代码的过程中,就是一种让自己变得更好的途径。因为和阅读文章提高写作水平一样,阅读的代码多了之后,也能提升自己的编程思维。其次就是在日常生活中,多留点意,看看现实世界到底是怎么完成抽象思维的,如何从整体和细化的角度去看待一个你非常熟悉的事物,这些都对于写代码有一定的帮助。最后是需要给自己培养足够浓厚的兴趣,让自己能渡过这段瓶颈期。因为兴趣而擅长,又因为擅长而感兴趣,这应该是一个良性循环。

当然,如果想在编程大道上有更多的发挥。还是需要更深一步的去学习,包括但不限于:

  • 计算机的组成原理相关:操作系统,离散数学,线性代数,计算机组成原理等
  • 计算机软硬件相关:计算机网络原理,编译原理,算法结构等
  • 常用的编程设计模式:工厂模式,单例模式,观察者模式,装饰器模式等
  • 等等

这个过程中需要利用好搜索引擎,Youtube和国内外优秀的大学公开课。多看多思考,多输出沉淀,无论是在笔记还是在个人Blog/Wiki中都可以。除此之外,你可以给开源社区贡献自己的力量。不但可以将自己做的一些项目开放源代码分享出去,还可以在阅读别人代码的时候,去提PR优化他们的代码。

Endding

写了这么多,可能也没有说太明白到底要不要学习编程。这个问题因个体而异,没法一概而论,也不是非黑即白。并且学习的路径也非常的多,并不一定需要按照我说的这样去一条路走到黑,用自己的智慧找出适合自己的就可以了。

但倘若你决定要学习编程了的话,还是得多付出一些精力和努力,才能达到一个较好的水准。不知道现在再说「世上无难事,只怕有心人」会不会有点老土,可我还是觉得只要传递出来精神内核是符合时代的,那么这些文字就都不会过时。

所以,大家一起加油。