写点什么

软件入门之《编程指南》- 学习路径和经验随谈

作者:hongfei
  • 2022 年 3 月 18 日
  • 本文字数:3693 字

    阅读完需:约 12 分钟

软件入门之《编程指南》-学习路径和经验随谈

以一个几乎单一语言开发的老程序员的视角,谈谈初学者如何去组织自己的软件编程学习实践的路径。老鸟轻喷......

就我个人的经历来来说,回忆这十几年来编程的学习和实践过程,我自己认为有几个方面很需要同学们去注意。就让我一点一点的分享给大家,希望能让初学编程的你,少走一些弯路。



我是非计算机专业的。很多人可能会认为计算机和非计算机专业的学生在学习编程的过程有很大区别,其实不是这样。正如很多学生可能会认为是在课堂上学到的编程,其实不是这样。编程的语言能力和学习任何一门语言如英语一样,都是不太可能在课堂上完成质的提升的。


计算机和非计算机专业的学生最大的区别在于计算机专业出身的学生会有比较完整的编码学习过程,有了这样的历练,在编程的道路上就会比较清除地知道去学什么,知道每一门课程是干什么的;再加上大量的必须完成的作业、小项目,促使他们去做一些实际的编码练习。但是,除此之外,要想获得真正编码的能力,具备一个工程师的技能,真的全靠自学。在自学这一点上,是没有专业区别的。


所以今天我们就着重谈一谈自学编程,也就是课程学习之后的自我编程修养。首先应该谈的是如何去避免一些坑,这样就可能节约大把的时间。

一、我该选择什么样的编程语言

如果你有明确的方向,那么很好选择。没有最好的编程语言,只有最适合的编程语言。**如果你想做算法、机器学习方向,那么 python 也许是最好的选择。如果你想做后端开发,Java,PHP 和 Go 等都可以,如果想做前端开发,也许是 JavaScript 的天下。如果想做一些更底层的工作,比如嵌入式开发、物联网设备开发,那么就可以选 C。**当然这是建立在你有明确方向的基础上。其实作为初学者,对计算机体系都不了解,过多地去纠结性能,或者难易等因素反而白白浪费了时间。编程语言其实不需要那么多“发展”和“创新”。把一种编程语言上所有好的思想,好的事物,都理解,保留和传承下来,就已经很舒服了。太多太快的发展,其实是自虐而已。



我个人是学 C 语言入门的,我也推荐学 C 语言入门,当然 C 语言很难、很复杂,看起来并不适合入门。然而正是它们的难和复杂才能让你更好地理解计算机系统【计算机系统不是指操作系统】学习编程不是学习编程语言,而是学习一个计算机生态,即一个庞大的知识体系。只会编程语言而不理解整个计算机的体系,就像只会写字而写不出好文章。了解 C 语言和了解计算机系统是极为贴合的,向下可以帮助你更容易地理解操作系统、编译原理、计算机网络、计算机组成原理,为什么呢?因为较为底层的东西很多都是用 C 语言实现的,和系统的贴合度极高,很多教材源码甚至教程,在讲述这些知识的时候都是用 C 语言作为媒介。而向上,有了 C 语言作为基础,去理解面向对象的机制,也不会显得那么枯燥。花个小半年时间了解和实践 C 语言编程,之后你就会觉得看书、看资料可以轻松很多。

二、除了编程,为什么还要学习其他课程

首先说一句,相信你的专业给你安排的课程。这都是经过论证和实践后沉淀下来的帮助你终身成长的课程。很多人会有一个问题,我就是为了学习编程,为什么还要学习高数,线性代数和概率论?很好解释,做算法的同学,肯定知道为什么。我在英特尔工作期间,维护过一个适用于 ARM7 内核的,应用于 WCDMA 物理层计算的数学库,里面大量利用泰勒级数展开来进行指数计算,不但可以保证精度,而且大大减少了运算时间,从而保证了物理层按数据帧的时隙长度为单位处理终端函数的要求。试想,没有这些数学功底,这怎么可能实现呢?所以,我们要重视基础,并且善于运用基础科学解决应用性问题。


目前学校广泛流行的项目驱动式学习法,就是能够比较好的锻炼我们基础和编程技能的融合能力。真正做一个自己需求的项目。这样才能体会到自己不会的地方和痛点。学校上课学习是一种迭代的过程,项目驱动型自学是一种递归的过程。当然,项目驱动式学习有一个弊端,就是每次学习的知识都是项目所需要的,很零碎、不成体系,所以需要改良,即在采取项目驱动学习法的时候每天抽一段时间,慢慢的去完整地读一本书,或者一个相关问题的完整介绍,这样就很容易把一些知识成体系地串起来。这样一段时间下来,你就知道我们为什么要学那么多科目,学这些科目能干什么。


举个例子,物联网专业的学生想做一套智能家居的环境监控系统,简单的来说,包含环境温湿度的监测,家庭灯具的基本控制等。这就是一个项目。如果要完成它,你必须做好物联网平台选型,终端硬件选型,手机端/web 端技术选型,其实是有点复杂的。下面是我在《产品设计》课中给同学们的举例。我选定了 Apple 的 Homekit 平台,它直接提供了平台侧和手机端的 APP,而接下来所需要做的就是,熟悉 Homekit Accessory Protocol(HAP),这里就要用到你所学的 HTTP,SSL,TCP/IP Socket 编程,此外还需要了解 SHA512, DES,ED25519d 等加密算法,还要有一定 WiFi 通信协议的基础,才能完整的支撑 HAP。



有了对 HAP 的理解,你还需要让 HAP 协议栈能在一个嵌入式平台上运行起来,这个时候,你所学的嵌入式开发,传感器原理,电子线路就被安排进来了。为了能让 HAP 协议和硬件平台,传感器结合起来,你还需要比较好的掌握 C 语言或者 Python 语言,才能开发出能够运行的程序。看,这个项目是不是用到了你可能看起来非常多的离散的基础知识。除此之外,你还会充分锻炼你的工程管理能力,代码管理能力等等。最终,你也能小有收获的,看到你的项目成果。


三、有哪些好的习惯一开始就值得坚持

良好的习惯是成功的一般。对于未来可能从事编码工作的你,有哪些习惯在编码一开始就要坚持呢?我的几个经验是:


  1. 代码一定要规范。程序员初学者在规划代码结构的时候,需要面向对象的思维,培养良好的代码规范。

  2. 一定要阅读源码。别人高效的代码书写以及对整个架构的布局等,可以提高我们 debug 的能力。

  3. 优秀的软件是协作开发的结果。高效沟通,进行开放式的协作。信任他人,并让他人也信任你。尊重他人胜过尊重代码。以身作则,把你的追随者变成领导者。

  4. 分而治之。为分离的关注点开发单独的低耦合模块。进行单独的模块测试和集成测试。尽可能按照实际情况测试,同时也要测试到各种边界情况。

  5. 学会独立思考并解决问题。凡事在问别人之前,自己先搜索、思考一下。

  6. 走出舒适区,每天都要学习。把学到的东西分享出来。接触更多的编程语言、技术、文化,保持一颗好奇心。


每个人都想成为自己想成为的那个人,培养良好的习惯,保持自律,相信一定可以成功。

四、是否需要坚持做计划和记笔记

我认为不只是编程需要制定计划,其他任何的学习和工作都需要制定计划。我从刚开始工作时就开始定期给自己制定计划,这个习惯也一直坚持到了现在,受益匪浅。当然也不只是制定学习计划,还可以列一些自己需要做的其他的事情。比如下图就今年二月份我的主要工作计划和安排,利用 windows 10 日历完成。



**把需要进行的工作按照大致开始和完成日期存入日期表格,这样才能让你过得有条不紊。当然,很难完全按照计划去执行,不过制定相应的计划能让你清楚地知道自己应该干什么,以及什么工作还有待完成。**好好制定一个计划吧,因为你有大把的时间。


此外,笔记是必须要做的,并且记笔记是一个长期的过程。记笔记是定制化的,对你自己定制,你可以用自己最舒服的表达方式来描述一个问题,是自己写给自己看的东西,看了几遍之后就能非常迅速和容易地理解。之后遇到相同的问题可以快速地通过找笔记解决。


记笔记的习惯一定要坚持,等过个一年或者两年,这就是你巨大的财富,因为那是只有你才能看懂的东西。最近 4 年多,我在有道云笔记和 onenote 上积累了近 2GB 的内容,现在的笔记基本已经形成了体系,可以给大家展示其中的一部分,关于物联网硬件平台 Espressif ESP32 的学习笔记。


五、编程路径

我应该选择什么资料,看什么书?很多编程新手容易困惑的问题。网络上拥有我们一辈子都看不完的教程和资料,所以现在应该不会存在找不着视频教程、找不着书看的问题。而问题就是我们不知道看什么视频、看什么书。这个真的没有大的捷径,但是你的老师会是你的好的指引者。此外,以我的从业经历,我大致梳理了 C/C++和 python 方向的学习路径,供大家参考,你必须多实践,找到最适合自己的路。


  1. C/C++的入门和进阶个人精选路径

  2. 入门:

  3. C:北大计算概论,

  4. C++:清华 C++语言程序设计基础

  5. 进阶:《C Primer Plus》、《C 和指针》、《C 专家编程》;《C++ Primer》、《Effective C++》、《C++ 标准程序库》、《STL 源码剖析》、《深度探索 C++ 对象模型》、清华大学数据结构 C++版本

  6. Python

  7. 入门:Think Python、 Python 编程 从入门到实践


进阶:​ Python cookbook、Python Tricks、A Buffet of Awesome Python Features、Effective Python


方向与路径:▫️ Web 开发▫️ 数据分析▫️ 科学计算▫️ AI 机器学习▫️ AI 计算机视觉▫️ 网络爬虫▫️ DevOps 运维

六、最后说几句

最后,我想再啰嗦几句。学习是一场马拉松,而不是短跑,学会在学习中享受过程。一旦你决定学习,请 Always think before act(谋定而后动),多思考,多总结,找到适合自己的道路。多年的工作经验,我还想说一句,热爱生活,而不是工作,请饱含对生活的热情,Choose life, not workwork is important, but life is more. 你会惊喜的发现,热爱生活会让你进步更多。

发布于: 刚刚阅读数: 2
用户头像

hongfei

关注

分享*成长 2020.05.31 加入

一个曾经的程序调试员

评论

发布
暂无评论
软件入门之《编程指南》-学习路径和经验随谈_编程好习惯_hongfei_InfoQ写作平台