编程入门01——为什么学编程,什么是编程?

一篇编程入门教程,使用 Python,尝试贴近实践。

我要先声明,这篇教程是给非科班出身的人写的,并非是给想靠编程吃饭的人准备的。这篇教程的目的是让读者能够在在日常的生产生活实践中应用编程这一趁手和相对通用的工具,而不是为了找编程相关工作、接单或系统性地学习编程。因此,我不保证内容的系统性,我给出的所有陈述都仅代表个人观点,不可全信。同时,我不会吝啬于在代码编写和运行中依赖 AI 来完成任务。

我要先声明:

  1. 我会以实用主义的角度去把我的货色都尽可能地掏出来(编程就是工具,对工具采取实用主义的态度可以说是门当户对),因此对于各种概念啥的,我会用我熟悉的通俗易懂的,但可能片面的方式去讲出来,而且不会涉及到一些相对复杂且并非必须的概念,如闭包,装饰器等。但是 Python 的面向对象和协议的部分估计还是会提一下的,但主要是为了理解 Python 自己的工作方式。异步编程和多线程编程我尽量不涉及,它应当是可以完全绕开的。
  2. 我会尽量围绕实践,围绕特定的主题去组织内容,以保证让枯燥的概念都能有感性经验支撑,但恐怕我还是得先从编程的基础概念和 python 的一些基础知识出发(就像学日语必须先学 50 音图一样,绕不开),我只能尽量保证让这一部分也尽量形象易懂。
  3. 我自己也不是 Python “高手”,我使用 Python 是因为 Python 基本上是最适合入门,而且适用领域最广的语言。我的方法论和写出来的代码不一定合 Python 的哲学。

我大概会遵循这样的路径:

  1. 学编程的意义
  2. 关于编程的基础认知
  3. 关于 Python 的基础认知
  4. Python 的基础(尽量贴近实践地)
    1. 变量,函数,程序流,异常
    2. 如何利用 AI 进行学习和查错
    3. 常用内置类型
    4. 面向对象,属性,协议
  5. 各种示例(覆盖常用标准库,以及日常生活中常用的场景):
    • 文件读写(文件 IO)
    • 文本解析(CSV,日期解析,正则表达式)
    • 目录操作(pathlib)
    • 爬虫(html,树结构,包的安装,beautifulsoup4,css 选择器,json)
    • 简单 Web 开发(flask,http)
    • 简单 GUI(tkinter)
    • 仅托盘应用(pystray)
    • 自动化操作(pyAutoGUI)
    • 微信集成(以微信为中介互操作,TODO 需研究可行性)
    • OCR
    • 基于 AI 的应用(LangChain)
      • LLM 的原理,以及用途
      • 基于 LLM 的自然语言文本解析
      • ChatBot(带记忆功能的对话功能)
      • RAG(和 PDF 对话,个人知识库)
      • Agent(让 LLM 知晓和操作外界)
      • LangFlow(使用工作流来配置 LLM 应用)
      • 尝试开发个人生活助手(目前没有具体的点子……)

上面的东西全都要学会吗?并非如此,想象游戏中的技能树,你必须把最基础的几个技能点亮,而在这之后,所有技能树都会为你开放,你根据自己的“游戏倾向”去选择发展哪些技能树即可。

学编程有何意义?

编程并非是生活的必需品,我不会敲代码,仍旧可以把电脑、手机玩出花来。但学习编程对我们仍旧有一定意义:

  1. 替代重复劳动:在工作中,生活中,常常会遇到一些需求需要你反复进行相同的操作;而许多操作是可以通过编程去方便地完成的,比如:
    1. 重命名一个文件夹下的所有文件
    2. 自动填写表单或者 Excel
    3. 自动操作鼠标、键盘完成操作
    4. 批量下载网页上的内容、图像
    5. 聊天机器人
  2. 让工具适应你:如 Krita,PS 等绘画软件,以及 Blender 等建模软件,大多允许你自己去开发插件去增强它的功能,学会编程,你能够让工具适应你的需求
  3. 实现“工作流”:使用编程能够进行一连串的操作:
    1. Krita 中画完画后,点一个按钮自动上传到 Pixiv
    2. 截图后自动保存到特定文件夹
    3. 定时任务,每到准点就执行特定的程序,如推送系统通知,推送微信通知
    4. 自动翻译同人本
  4. 集成 AI:使用编程,你能够直接和大模型进行交互,而不需要利用各种厂商和个人提供的客户端,你可以:
    1. 实现 Agent:让 AI 去帮助你完成上面的操作
    2. 实现 RAG:和本地的视频,PDF 进行对话
    3. 实现个人生活助手:让 AI 帮助分析你的待办清单完成情况,关注你的减肥情况(当然,你得做记录),分析你的画画情况,安排新的待办事项,定时跟你聊几句;而且随着你的使用,AI 会越来越适应你的需要

当然,上面许多需求也是不使用编程能够做到,或者使用编程反而更麻烦的,但编程是最为灵活的,即使需要花费更多心血去学习。

再说,要让 AI 成为自己的生活助理,靠厂商们提供的应用恐怕会比较难做到,而且他们开发相关应用更多的是提供给企业。目前好像还没有看到提供给个人使用的 AI 生活助理,即使有,你愿意用吗?把自己的隐私信息全部暴露出去?

什么是编程?

程序,就是一连串的命令,交给计算机去执行,要求计算机按一定的顺序去做这样那样的事情,最终完成人们需要完成的任务

编程,就是编写这一连串命令的过程。这一连串的命令组合起来,就是所谓的程序,而编程就是编写特定的程序来完成特定的任务。而这里的命令,就是所谓的代码。所以说,编程就是编写代码(所组成的程序)去让计算机去满足人的需求

代码通常由普通的文本组成。普通的文本,指的是像 txt 那样的文本,Word 那样有各种复杂样式的文本称为富文本程序员习惯于处理普通文本而非富文本,因为富文本通常需要特定的软件,如 Word 才能进行打开,而程序员喜欢通用性。实际上,有像 Markdown 和 HTML 这样的标记语言,它们致力于使用普通文本来提供富文本的功能,但这里不表。

代码需要遵循一定的格式,称为语法,只有语法正确的代码,计算机才能读懂。就像人类说话、写字也要遵循特定的语法,才能正确传达意思。但不同的是,计算机比人类更“笨”。人类说话或写作时,即使某些语法有错误,其他人可能仍然能够理解。而程序的代码即使错了一个标点符号,计算机也会“抓瞎”,无法理解。这也就是说,编程语言的语法是刻意设计的,精确的,无歧义的,学习一门编程语言,第一步就是学习它的语法。

不同的编程语言,就像不同的自然语言一样,有着不同但又相似的语法。但区别在于,编程语言有“底层”和“高层”之分:

  • 越底层的编程语言,其“命令”越接近计算机的实际运行方式,比如:
    • add1 eax:将寄存器 eax 的值加一
    • *p++:解指针 p,将其值加一
  • 越高层的编程语言,其“命令”更接近自然语言和人类的思维方式,比如:
    • for index, file in enumerate(directory): file.move(index + file.name),为当前文件夹下的所有文件重命名,给名字前头加上一个序号。
    • select order_id from order where content like '%鞋%',查询最近 12 个月内关于’鞋’的订单的编号(注意到这里的结构就像英语一样相对容易理解)

注意到,底层的编程语言,会强迫知晓一些计算机内部工作的机制,包括寄存器,指针,内存等;而高层的编程语言则并非如此,大部分时候你只需要知晓关于你的业务相关的东西即可,如“订单”,“文件”,“文件夹”,“用户”,“网页内容”。这两者那个更容易学习?不言自明——对前者,你被迫要从计算机的角度去思考,而对后者,你能够从你要解决的问题的角度去思考

但必须要避免一个误区:底层不代表低级,高层也不代表高级,这里的底层和高层,只是适用范围的区别——越贴近硬件,通常就需要越使用底层的编程语言,而越贴近个人生产生活实践,就通常要越使用高层的编程语言。也有那么几个语言既能兼顾底层又能兼顾高层,但代价是复杂难学,写起来要考虑太多东西。

编程领域上没有银弹(即万灵药),总是得就事论事,见招拆招,具体问题具体分析