ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从C语言到大数据:我的编程学习进阶之路与实战心得

从C语言到大数据:我的编程学习进阶之路与实战心得

我的编程学习之路

说实话,写这个话题的时候我犹豫了很久。网上讲编程学习的文章太多了,从“21天精通C语言”到“三个月转行上岸大厂”,要么过于神话,要么贩卖焦虑。我自己磕磕绊绊走了不少弯路,也踩过很多新手必踩的坑,从最早接触C语言时连printf的引号都能打错成中文符号,到后来能独立写MapReduce程序、用OpenCV做图像处理、调通PLC串口通信——谈不上多厉害,但至少形成了一套比较完整的学习方法。这篇文章就把我的真实经历和教训整理出来,希望对正在编程门口张望或者刚起步的朋友有用。不管你是自学Python入门,还是在学校啃C语言基础题,又或者正被异步编程和函数式概念搞得头疼,这篇文章应该都能给你一些参考。

1. 为什么要学编程,以及怎么定起点

1.1 想清楚学编程的目的,比选语言更重要

我见过太多人一上来就问“Python还是Java哪个好”“C++是不是太难了”,然后花了两周时间反复纠结,最后连一行代码都没写。我自己最开始也是这样,把各个论坛的入门帖子翻了个遍,收藏了十几个学习网站,结果一个月过去还停留在“Hello World”。后来我意识到一个很朴素的道理:编程首先是一门工具学科,你要用它解决问题,才能坚持学下去。

可以做一个小实验:拿出一张纸,写出三个你希望程序帮你自动搞定的事情。比如批量重命名一个文件夹里的几百张图片、自动整理Excel表格里重复的数据、写一个简单的抢答器逻辑在PLC上跑起来。这些问题不需要多高级,但必须是你现实中真实遇到的。有了明确的目标,你自然就知道该学什么语言、该看哪部分文档,而不是永远停留在“学完基础语法然后呢”的迷茫状态。

我的建议很简单:想写数据分析脚本和人工智能应用,就从Python开始;想做嵌入式、底层系统,老老实实啃C语言;对工业自动化感兴趣,直接上手PLC梯形图和触摸屏组态,顺便把ST语言学了。语言的纠结点根本不值得你浪费一周时间去纠结,因为编程的核心——逻辑拆解、算法设计、调试排错——在所有语言里都是通用的。

1.2 新手选语言时容易被忽略的几个维度

我后来给不少新人做过咨询,发现大家选语言时经常只看“好不好学”和“就业面广不广”,但真正需要关注的维度其实是这几个:

  • 社区成熟度:遇到报错搜不到解决方案是最打击学习热情的事。Python、C语言、JavaScript这些问题基本搜得到,冷门语言(比如早期的Go或者某些专用脚本)出了问题可能要在英文论坛泡好几天。
  • 反馈速度:对新手而言,编译型语言改一行代码要重新编译,跑起来还要半天,学习节奏很容易被打断。脚本语言和带交互式环境的语言就比较友好,写一行执行一行,马上看到结果。这也是我推荐Python当入门语言的原因之一。
  • 学习曲线是否平滑:有些语言语法设计得很优雅(比如Python),一开始不会被指针、内存分配这些底层概念劝退;而C语言虽然经典,但指针和内存管理很容易让新手在第三周就放弃。但这不代表C语言不该学,而是说你要有心理准备,知道困难是正常的。

我自己最终的路径是这样的:先用一个暑假把Python语法过了一遍,做了几个小脚本解决上课时整理笔记的麻烦;然后回炉系统学了C语言,用浙大那个经典的C语言练习题库刷了大概三百道题,把指针、结构体、链表这些硬骨头啃下来;之后才去接触了C++的面向对象特性。这条路径不算快,但每一步都走得比较扎实,后面学什么新东西都有底气。

2. 从语法到思维:入门阶段最该重视的两件事

2.1 C语言基础训练:刷题不是目的,建立计算思维才是

很多人对“刷题”有偏见,觉得是应试教育后遗症。但我不这么看,尤其是对C语言入门阶段的学生来说,系统性的基础训练几乎是不可替代的。我当年刷浙大的C语言题目时,印象最深的一道题是“完全数”——输出1000以内所有真因子之和等于它本身的数。听起来很简单对不对?但你真动手写就会发现,循环嵌套的顺序、因子判断的边界条件、还有输出格式的细节,任何一个地方想当然都会得不出正确结果。这种题的价值不在于“你写出了正确答案”,而在于你经历了“想当然 → 报错 → 逐步调试 → 理解为什么”的完整过程。

那时候我给自己定了一个规矩:不管题目多简单,绝不在网上直接搜答案。万一卡住了就画流程图,把每一步想清楚再写代码。大概刷了一百道基础题之后,我发现自己变了一个人——以前看问题直觉往往是模糊的、笼统的,现在看到一个问题会下意识地拆解成“输入是什么、输出是什么、中间要做哪几步、有没有特殊情况”。这个变化其实比会写多少种语法都重要,因为它意味着你开始拥有“计算思维”了。

还有一个体会想分享给纠结“要不要学C语言”的朋友:虽然Python可以让你很快做出东西,但C语言让你理解计算机到底是怎么工作的。指针不是魔鬼,它就是内存地址的门牌号;数组名为什么能当指针用,理解了内存布局以后自然就明白了。学完C再回头看Python的某些“魔法”,比如列表切片、字典底层实现,你会看得更透彻一些。

2.2 数据结构与算法:编程的地基工程

如果语法是砖块,那数据结构和算法就是房子怎么搭起来的结构图。第一次学链表的时候我也觉得“这玩意有什么用”,直到我去实习时用C写了一个简易的内存缓存模块,才真正体会到数组和链表的差距——数据量一上去,随随便便在数组中间插入一个元素,后面所有元素都得挪窝,性能瞬间就崩了。

学习数据结构的建议是:不要只盯着书看,一定要自己用C语言实现一遍。动态数组、单链表、双链表、栈、队列、二叉树,每一个都亲手写一遍增删改查。我当时给自己定了个目标,每天实现一个数据结构,写完了就丢进自己的“玩具库”里。这个阶段很枯燥,但后面的回报超乎你的想象:理解递归快得多了(树的遍历就是天然的递归结构),理解MapReduce的shuffle过程也顺理成章了——它本质上就是把分布在各机器上的键值对按照key重新组织,这不就是哈希分桶的思路吗?

算法方面,我建议新手别一上来就扑向动态规划和图论,先把最实用的几个吃透:排序(冒泡、快排、归并)、二分查找、双指针、哈希表、DFS/BFS。尤其是分治思想,从快速排序到归并排序再到MapReduce的“分而治之”,一脉相承。理解了这一层,你再看大数据框架会豁然开朗。

3. 跳出单一语言:为什么要主动接触“难啃的”技术

3.1 从单机到分布式:MapReduce和HDFS为什么值得学

很多人听到“大数据”就觉得离自己很远,觉得那是数据工程师的事。但作为一个编程学习者,我强烈建议你在某个阶段主动去接触一下MapReduce这种分布式计算模型,不用深入很复杂的调优,理解它的设计思想就足够受益了。

MapReduce的核心就两步:Map(映射)和Reduce(归约)。打个生活化的比方——你组织了一次全年级的数学考试,要统计总分。Map阶段就是每个班的老师分别把自己班学生的成绩做个初步汇总(比如算出自己班的平均分),Redist阶段就是你作为年级负责人把各个班的平均分再汇总成全年级的平均分。注意,每个班的计算是并行的、互不干扰的,这就是分布式计算最基本的思想。HDFS(分布式文件系统)的思路更简单粗暴:把一个大文件切成很多小块,分别存在不同的机器上,同时多做几份副本防止某台机器挂了数据丢失。这个设计今天看来朴素,但它是整个大数据生态的地基。

我当时跟着教程自己搭了一个三节点的伪分布式Hadoop环境,跑了一个简单的WordCount程序。第一次看到几十兆的文本被拆分成无数小任务分布式处理时,那种震撼至今难忘。编程的魅力不就在于——从一段简单的代码中,长出远超你个人计算能力的东西。

3.2 异步编程、并发与并行:现代编程的必修课

等你写过的程序从“顺序执行”进化到“需要同时处理很多事”的时候,异步编程这个槛就绕不过去了。我在学Python异步编程时,花了很长时间才真正理解事件循环(Event Loop)的机制。举个形象的类比:你在一家小饭馆当服务员,传统的同步模式是——你接待完A桌客人点菜、等他们吃完、收拾完桌子,才去接待B桌;而异步模式是——你给A桌下单后,马上转头去问B桌要点什么,全场的客人都照顾到了。这就是async/await的魔力:让一个线程在等待I/O(网络请求、文件读写、数据库查询)的时候,去处理别的任务,而不是傻等着。

对比一下同步和异步的代码写法会非常直观。下面是一个简单的Python例子,抓取三个网页的标题:

# 同步写法:一个接一个,总耗时约为三个请求时间之和 import requests def fetch_title(url): resp = requests.get(url) return f"{url}: {resp.text[:30]}" urls = ["https://a.com", "https://b.com", "https://c.com"] for u in urls: print(fetch_title(u))
# 异步写法:三个请求几乎同时发出,总耗时约等于最慢的那个 import asyncio import aiohttp async def fetch_title(session, url): async with session.get(url) as resp: text = await resp.text() return f"{url}: {text[:30]}" async def main(): urls = ["https://a.com", "https://b.com", "https://c.com"] async with aiohttp.ClientSession() as session: tasks = [fetch_title(session, u) for u in urls] results = await asyncio.gather(*tasks) for r in results: print(r) asyncio.run(main())

很多初学者看异步代码觉得“这什么鬼,为什么要这么绕”,其实你只需要抓住一句话:await的意思是“我在这里让出控制权,等数据回来了叫我”,线程不需要阻塞等待I/O完成。理解了这一点,再去看Node.js、Go的goroutine、Java的CompletableFuture,都只是不同语言对同一问题的不同解法。这个抽象层次一旦打通,你读任何语言的并发代码都不会再发怵。

4. 软硬结合与工程视角:工业控制领域的编程启蒙

4.1 PLC、触摸屏与ST语言:当代码开始控制物理世界

纯软件写久了,多少会觉得有些虚幻——一行print输出“Hello World”,和车间里一台机器因为你的代码做出动作,是完全不同的体验。我有段时间被实验室派去帮忙做一个小型的自动化改造项目,才正儿八经接触PLC编程,用的是一台西门子S7-1200。

PLC编程和PC编程最大的差异在于它是在“循环扫描”的模型里思考问题。CPU从第一行程序开始,不停地从头到尾扫描,每个扫描周期都在刷新输入输出。这意味着你在写逻辑时,要习惯用“保持有效”的思维方式,而不是“事件驱动”的方式。

一个很经典的入门例子是“8人抢答器”:桌子上有8个按钮,谁先按下,对应的灯就亮起来,同时锁住其他人的按钮。用梯形图来实现,核心逻辑并不复杂:

  • 八个输入按钮分别对应八个输出灯;
  • 用中间继电器保存“是否已经有人抢答”的状态;
  • 一旦有人按下且系统未被锁定,就点亮对应的灯,同时把锁定位置位;
  • 主持人的复位按钮把所有状态清零。

我第一次把程序下载到真实的PLC里,用手按下按钮的那一刻,看着灯亮起来、其他按钮全部失效,有一种“代码终于长出手脚”的奇妙感觉。后来我还用触摸屏组态软件给它加了一个可视化界面,在屏幕上显示当前抢答者编号,实现了简单的“人机交互”。这个经历让我明白,编程的终极价值在于解决真实世界的具体问题,而不是写一堆孤芳自赏的抽象代码。

触摸屏编程的学习曲线其实比想象中平缓。市面上的组态软件大同小异,核心就是“变量绑定”和“界面事件”——你把触摸屏上的一个按钮控件和PLC里的一个输入继电器绑定,把文本控件和某个数据寄存器绑定,运行的时候触摸屏就变成了操作台。难的不是技术,是理解工业现场“扫描周期、掉电保持、通信协议”这些场景约束。

4.2 嵌入式入门:从单片机到CNC的跨界联想

接触完PLC之后,我又顺藤摸瓜玩了一阵子单片机。STC8G系列是国产里资料比较全、适合入门的一款。用它跑一个LED流水灯,或者驱动一个OLED屏显示传感器读数,整个过程和写网页完全是两种体验——你需要关心时钟、定时器、中断、寄存器配置。比如定时器初始化,你就要算好单片机的工作频率和分频系数,让定时中断的周期精确到你要的毫秒级。

举个例子,STC8G用一个定时器做1ms的精确延时,那么定时器初值的计算方式大概是这样的:

  • 假设主频是24MHz,定时器工作在1T模式,那么计数频率就是24MHz,一个计数周期是 1/24,000,000 ≈ 41.67ns;
  • 要得到1ms定时,需要计数的次数是 24,000,000 / 1000 = 24000次;
  • 如果定时器是16位(最大计数65535),那初值就是 65536 - 24000 = 41536。

代码里通常这么写:

TMOD = 0x00; // 定时器0,模式0(16位自动重载) TH0 = (65536 - 24000) / 256; TL0 = (65536 - 24000) % 256;

段代码看着很简单,但背后涉及“主频、分频、计数初值”这一串概念,如果搞不懂它们之间的关系,程序就是跑不出你想要的时间精度。这和在Windows上print一个时间戳完全是两个次元的细腻。学到后来你会发现,CNC数控编程里那些G代码指令(比如G01直线插补)和我写的嵌入式逻辑本质上是一种东西——都是给机器下指令,只不过抽象层级和硬件接口不同而已。编程学到后面最有趣的一点就是:所有领域都在用相似的思想解决不同尺度的问题。

5. 新工具时代的编程学习方式:AI编程助手用还是不用

5.1 AI编程工具的本质:从“搜索引擎”到“结对编程员”

近几年AI编程工具发展得非常快,从GitHub Copilot到Cursor再到OpenAI的Codex。很多人问我:既然AI都能写代码了,还有必要自己学编程吗?我的观点很明确:正因为AI能写代码,你才更有必要学编程,否则你连它写的代码审查不了、改不动。AI编程更像是“结对编程员”的角色,而不是替代品。

举个例子,你用Cursor写一个文件批量重命名的小工具。你只需要用自然语言描述需求,AI就能给出一个差不多的Python脚本。但紧接着你发现这个脚本不处理子文件夹里的文件,于是你补充要求;然后你又发现它重命名后会覆盖同名文件,你再次要求它加上冲突检测。这个过程中,真正有价值的能力是准确描述问题、理解代码逻辑、判断AI给的方案是否安全。如果完全不懂编程,你甚至不知道问什么、也不知道AI给出的代码里有没有坑。

我自己实际使用中体会到的最佳实践是:让AI写框架,自己改细节。比如让AI生成一个下载网页资源的异步爬虫骨架,然后自己接手处理异常、加日志、做限速。这样既提高了效率,又能在关键环节保持对代码的控制力。你要是反过来——所有代码都让AI写,自己只管装环境、点运行——那你学到的只有提示词,而不是编程。

5.2 提示词工程:与AI高效沟通的一门手艺

既然AI编程很重要,那怎么和AI高效沟通就成了一门新技能,圈内叫“提示词工程”。我自己总结了几个实战中用得上的经验:

  • 上下文要给足:不要只说“帮我写一个排序算法”,而是说“帮我写一个C语言函数,输入一个整数数组和数组长度,用快速排序就地升序排序,并注释每一行逻辑”。AI对模糊需求的响应质量天差地别。
  • 学会追问和纠错:AI第一次给的方案很可能不是最优的,你要敢于提要求:“能不能不用递归,改成迭代实现?”“这个函数对空数组会崩溃,帮我加一个边界条件的判断。”每一次纠正都在训练你把需求想得更清楚。
  • 让AI解释代码:这是我最推荐的用法。拿到AI写的代码,直接说“逐行解释这段代码在做什么”,然后自己边看边思考哪里是通用的设计、哪里是针对这个场景的特殊处理。

实际一个真实的例子,我让AI生成过一个利用OpenCV做运动检测的小程序。它几秒钟就给出了调用背景差分法的代码,但参数(比如阈值的选取)它给的是50,实际在光线变化的场景下噪声特别大。我花了半小时研究它的代码逻辑,手动调整阈值到合适的范围,再加入了一个简单的“只在检测到面积大于1000像素的运动区域时才报警”的条件。你看,AI省掉了我查文档和写骨架的时间,但真正保证程序能用的,还是我对图像处理基本概念(阈值、轮廓、形态学操作)的理解。工具越强,使用者的判断力越值钱。

5.3 考级与学习记录:GESP认证和“输出倒逼输入”

现在很多编程学习者会选择参加一些认证来检验自己的水平,比如2026年3月的GESP C++三级认证。我对考级的态度比较中立:证书本身没什么用,但备考过程是一个很好的系统梳理。GESP三级涉及的知识点大致涵盖C++基础语法、函数、数组、字符串处理、简单的排序查找等,备考时你需要把散落的知识点串成体系,这个“串起来”的过程本身就是很有价值的收尾动作。

我还强烈推荐一个学习方法:写学习记录。不用多高大上,坚持把自己的代码笔记整理成文档,形式可以很简陋——我今天用C语言解决了什么问题、卡在哪个报错上、最终怎么解决的。别小看这个习惯,它本质上是费曼学习法的变体:把自己学过的东西讲给别人听,讲不清楚的地方就是你还没掌握的地方。我自己的博客就是从一篇“小玉买文具编程题”的解题思路开始写起来的,到现在回头看,那篇低级得不行,但它是我的第一块“输出倒逼输入”的基石。

6. 面向工程问题的编程实战:从练习到项目的关键一跃

6.1 玩具项目与真实项目的差距在哪里

很多自学编程的人卡在同一个地方:跟着教程写了无数小练习,但独立做一个“真正的项目”,大脑就一片空白。我分析下来,差距主要集中在三个方面:

  • 问题定义能力:教程把问题定义好了,你只需要实现;真实项目里,客户(或者你自己)只说“我要批量处理这些文件”,具体规则要靠你追问、澄清、归纳成可执行的逻辑。
  • 容错能力:练习题的输入永远是干净、规范的;真实世界里,用户可能传入空文件、乱码文件名、非法参数。我在写一个MATLAB有限元求解的辅助脚本时,就被“网格数据文件里有几行空行”折磨了整整半天。
  • 工程化习惯:真实项目需要你考虑代码组织、复用、测试、注释。练习可以一坨文件写到头,真实项目必须有清晰的结构。

那怎么跨过这道坎呢?我的建议是“做仿真实项目”。不要从零做一个超大系统,而是找一个你每天都在做的重复性任务,给自动化了。比如我当年觉得整理课程资料很烦,就写了一个Python脚本:按文件夹文件名自动归档(图片归到images、PDF归到docs、压缩包归到archives),并用日志记录每次移动的结果。这个脚本应用了文件操作、正则表达式匹配、路径拼接处理、日志模块这些基础技能,但如果写得不仔细,文件名带中文或者空格就会出问题——这就是真实项目和练习题的本质区别。

6.2 一题多解的思维训练:以魔方还原和完全数为例

编程水平的分水岭,往往不是“能不能写出来”,而是“能用几种方式写出来”。我很早就养成了一个习惯:一道题至少用两种方式实现。比如“完全数”这道题,第一次我用暴力枚举因子做的;后来学了优化技巧(只需要遍历到平方根),代码从O(n²)优化到O(n√n);再后来我用Python的列表推导式把它压缩成了一行。每次优化都是一次对问题本质的重审,比单纯刷题效率高得多。

一个更有趣的例子是“魔方还原”。很多人以为这是个很难的项目,其实一个简单版本的思路不难:用穷举搜索(BFS)寻找最短路程。但如果你用C++实现了BFS,你会发现状态空间太大,普通魔方要搜索的节点数爆炸,于是你被迫去学双向BFS、模式数据库、群论这些高级工具。这个过程就是被“工程需求”倒逼着成长。不要怕一开始的方案很蠢,只要你在持续优化它,你就一直在进步。

6.3 编程学习中的常见问题与排查实录

这里我把多年实操中最常遇到的、也是很多初学者被劝退的问题整理成了一张速查表,都是血泪教训:

问题现象常见原因排查/解决思路
程序运行崩溃,报段错误指针越界、空指针解引用、数组越界用调试器(gdb)查看core dump,检查所有指针使用前的判空
中文路径导致文件找不到代码里写死了相对路径,或编码不一致用os.path.join处理路径,统一使用UTF-8编码
编译通过但运行结果不对逻辑错误,常见于循环边界、条件是否含等号分阶段打印中间变量值,用最小测试用例定位到具体函数
Python异步程序不生效缺少await或者用了同步I/O库检查是否存在阻塞调用,确保所有耗时操作都用了异步版本
PLC程序下载失败通信参数(波特率、站号)配置错误核对通信设置,尝试降低波特率排除干扰
AI生成的代码无法运行缺少依赖库版本匹配、API接口更新先看AI给的注释里的版本声明,再检查本地环境,必要时手动安装指定版本

我想特别聊聊调试这件事。调试不是“找错误”,而是“收集证据”。每次看到报错,先问自己三个问题:这个错误发生在哪个阶段(编译、运行、逻辑计算)?这个错误涉及的数据变量有哪些?什么输入条件下会触发它?带着这些线索去写最小复现案例,往往比你盯着代码干瞪眼有效得多。我自己早期调试时有个坏习惯,喜欢凭感觉乱改代码,结果经常是这个问题解决了新问题又冒出来。后来痛定思痛,强制自己“一次只改一个变量,运行一次,观察一次”,效率反而上来了。

7. 给初学者的四个“如果早知道就好了”的建议

7.1 不要囤资料,要建“自己的代码库”

我见过太多人花大把时间收集教程、保存网址、买课程,结果一个都没看完。我自己也走过这个弯路——网盘里躺了几十个G的编程视频课。后来想明白一个道理:资料的囤积感会骗你的大脑,让你产生“我已经在学了”的错觉。真正的学习只有一种——打开编辑器,手碰键盘,输出字符。

我的建议是,与其囤十个培训班的大全套,不如就选定一套教程(不管是书还是视频课),跟着它完完整整走一遍,然后用一个月时间把里面的代码全部亲自敲一遍,最后总结成自己的“代码库”合集。你可以用Git管理它,不用管commit规范,只要坚持写就行。这个库会变成你的机会:后面工作或做项目时,想快速复用某个功能,直接翻自己的库,比从零Google快得多。

7.2 学会接受“不会”——难题拆解法

编程路上最打击人的不是“难”,而是“不会”。我也曾对着一段入门级的函数式编程代码看了一下午,直到第二天早上才恍然大悟:“哦,原来闭包是这么一回事!” 现在我明白了,水平再高的人也会遇到不会的问题,对待难点的正确姿势不是焦虑,而是把难题拆小。

比如让我去学“用MATLAB做有限元求解”,一听就头大。但我把它拆成几个子问题:解析网格数据的文件格式、构建单元刚度矩阵、组装全局矩阵、求解线性方程组、可视化结果。每一个子问题单独拿出来都不算太难,逐个击破,整个项目也就推进下去了。以后再遇到陌生领域(CAPL编程也好、Go Web开发也好),我都用这个方法,先告诉自己“这不是一个巨大不可战胜的怪物,只是一堆小问题拼起来的拼图”,心理压力瞬间小了很多。

7.3 马上开始,用“够用就好”的标准约束完美主义

编程初学者十有八九有完美主义倾向,总想把基础学得很扎实再动手做项目。但实际上,做项目的过程中学基础才是最扎实的——遇到问题去查、查完去用、用完就变成你自己的了。我见过一个同学,学Python三个月,一直在看语法、看教程,始终没动手写过一个超过十行的脚本。直到某天他需要处理一个几百行的CSV数据文件,才被迫装了个pandas,边查边写,两天就搞定了一个曾经会觉得“我还不会”的功能。从那以后他的学习速度突飞猛进。

因此我想对新手说最朴素的一句话:请允许自己写出很烂的代码,然后继续写下去。烂代码不是耻辱,它只是你通往好代码的路上踩过的坑。每当你发现自己一年前的代码写得垃圾,恭喜你,说明你一年来成长了。拥抱那种对旧代码“惨不忍睹”的感觉,那是一个程序员最真实的成长标签。

8. 最后的一点个人体会

编程学习是一场长跑,不是冲刺。支撑你跑完全程的从来不是某个高大上的目标,而是每天解决一个小问题之后那种踏实的成就感。我的编程学习之路到现在仍在继续,从C语言、Python,到大数据、嵌入式,再到工业自动化,每一段都给我留下了不同的思维方式,也让我越来越笃信一句话:编程不是魔法,它是一步一步把复杂问题变成简单指令的能力。

如果你也正在路上,或者即将出发,我给你最大的建议:别想那么多,写下你的第一行代码,哪怕它的作用只是输出一句“hello world”。然后从一个最简单、最真实的小问题出发,开始你的旅程。你会爱上这种感觉的——当代码运行起来的瞬间,整个世界都在向你眨眼。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进