我的自学开发之路

我的自学开发之路

你也可以做到

最近有不少朋友来问我一个老财是怎么学开发的,正好借此机会回顾一下自己详细的自学路线,把我每个阶段看过的书和其他心得都一点点记录下来。文中很多链接可能都需要翻墙,除了新书之外,大部分在z-lib上都能找到电子书。

开始之前,先请阅读一下我自己翻译的The Key To Accelerating Your Coding Skills,之后强调两个事情:

一是计算机这个东西,全靠自学,哪怕你听视频,听老师讲,向别人求助,没有自己实践操作、踩坑、对着BUG冥思苦想然后成功DEBUG,依然不可能学得会。最重要的就是遇到问题之后能够通过错误提示、翻墙搜索、查阅资料文档、看源码、合理提问等方式自行解决问题的能力。其次是有基础的逻辑思维。至于数学和英语,反而在学习阶段没什么用。

二是计算机这个东西知识虽多,但知识迁移效应非常强,几乎没有用不到的知识,学了一个就可以触类旁通很多东西;神奇的是虽然知识多,但基本上全是思维方式和过程性知识,并不需要背诵。另外建议大家学计算机一定要贯彻费曼学习法,光看书没有,做题也没用,一定要输出,要多写程序,满足自己实际遇到的困难和需求,多记录想法和感悟。我建议自学过程中就像我一样,买个VPS从头钻研起,买域名,做配置,搭建一个属于自己的网站,随时可以验证自己的想法,非常有用。

另外还要单独对财务同志们强调一句,计算机比CPA有用太多。如果你不同意这句话,那么说明你还没有对财务、CPA这些东西祛魅,下边的东西就不要看了,还是回头看CPA书卷证书更适合你。无论难度和广度,CPA那点知识内容相比计算机就是沧海一粟。

01 黑暗中的摸索

那还是刚工作三四年的时候,大家还在用Python2.X,当时自己对计算机没有特别的了解,也打算学Python,不过当时Python 3 已经发布了,就找点东西准备自学Python 3。

但在学的过程中,我遇到现在我在小红书上刷到的很多新手问题,比如引用什么时候可变什么时候不可变,还有就是面向对象始终觉得无法理解,学了一段时间发现除了做几个小题目,依旧“不懂计算机”,连一个小应用都写不出来,只局限于看到过的东西,并没有可以随心所欲的解决问题。

那时候我就下定决心,并做了个我至今都认为对我个人非常重要的决定:从头开始学计算机。

02 计算机原理

刚开始到底该怎么学,其实我也是在知乎上到处搜索如何自学。最后发现并没有什么捷径,计算机系的四大名著:计算机原理、操作系统、计算机网络、数据结构与算法 都是绕不过去的。所以就先从计算机原理入手。

2.1 数字电路和计算机原理

这个阶段主攻《计算机系统要素》这本书
TheElementsOfComputingSystems.webp

这本书的官方网站是 https://www.nand2tetris.org ,github上也有相关的资源页面,里边使用到的HDL仿真器等程序都可以在那里下载。此书现在已经没有新书,电子版可以在z-lib上找到

这本书我一直看完前五章,并且把课后项目都做了,在组成ALU还有之后的一些项目中,确实冥思苦想也无法想出来,只能看答案。这个很正常,在自学过程中经常会遇到一些根本想不出来的问题,只能硬着头皮继续啃。

我记得一直到第六章,要用高级语言写一个汇编器的时候,实在超过了能力,就算是看答案也很累。就足够了。因为要写软件,这部分的基础知识已经可以了。毕竟不打算要了解编译原理。

这个阶段如下书推荐:

  1. 编码:隐匿在计算机软硬件背后的语言 原书第2版,最近刚出第二版
  2. 汇编语言,当知识看,很好的书
  3. 计算机是怎样跑起来的
  4. 程序是怎样跑起来的,书内容非常好,译者是我老婆的朋友
  5. 计算机程序的构造和解释,大名鼎鼎的SICP,觉得Lisp太难,有Python版本,当知识阅读
  6. 计算机科学导论

2.2 CSAPP第三版

这本书就是传说中的深入理解计算机系统(原书第3版),盛名在外,网上资源也很多。

这书来自于计算机系非常厉害的CMU(卡耐基-梅隆大学)的CSAPP课程,也是很多国内计算机系的大一必修课,比如上海交大的计算机系本科生一年级计算机原理课程就是根据此书改编,当年网上还能搜到此门课的课件。

该课程官方网址为https://csapp.cs.cmu.edu/,相关资源非常多,就不再一一列出了,比如B站就有2015 CMU 15-213 CSAPP 深入理解计算机系统 课程

这本书我当时从头开始,一字不漏地看,习题一个不落的做,遇到不会的,也把答案拿出来仔细看然后吃透,当然有些实在理解不了的,也只能跳过。里边的Lab因为还是有点难度没有做。翻翻我的博客就能翻到N年前我自己啃CSAPP的过程。

我可以确定的说,这本书你如果能啃下来,就算以后不敲代码,也已经脱胎换骨,面前的这台机器(甚至手机)对你来说已经不再神秘的像一个黑箱。如果你是泛财务专业的(比如财务管理、会计学、审计学之类),100%你内心已经开始鄙视财务专业,不信你就啃完试试。

CSAPP是用C语言作为编著语言,为了啃书当然要学C语言了。

2.3 C语言程序设计 现代方法

C语言个人认为最佳的就是这本书,这本书的所有章节和所有习题,依然是要一个不落地全部做。学C语言的目的并不是将来为了直接拿C写应用,而是更好的了解底层,同时了解一个很重要的东西:指针。懂了指针会把不先学底层直接上高级语言遇到的很多问题一扫而空。

在学C语言的阶段,其实就可以搞起来VPS了,也可在虚拟机上装CentOS等Linux操作系统并在Linux环境中学习,因为CSAPP里有些比如并发的代码,在windows下的环境并不能很好的执行。

这一阶段看的书:

  1. C语言程序设计 现代方法 第2版·修订版
  2. Linux C编程一站式学习,实体书已经绝版,我当年是自己打印出来看的
  3. C和指针
  4. C 陷阱与缺陷
  5. C标准库,中文版新书已绝版
  6. Linux命令行大全
  7. 鸟哥的Linux私房菜 基础学习篇 第四版 Linux教程

在学完计算机原理之后,还有操作系统-计算机网络-数据结构和算法三大块内容。实际上这三块内容不需要分先后,操作系统和计算机网络对开发来说主要是了解知识,数据结构和算法则是实打实的要掌握。

以下还是按顺序写,但实际上我此刻是开始学习Java语言(为了Web开发)并通过Java语言学习数据结构和算法,同时看操作系统和计算机网络的知识。你可以选择你将来打算主攻的方向,学习那个语言的数据结构和算法。

03 操作系统

在了解了底层之后,操作系统是绕不开的坎。通过前边学习可以知道,对于打算编写应用的我们,大部分时间实际都是在和操作系统打交道,比如磁盘读写,接受键盘输入等等。Windows和Linux的机制也有很大区别。将来我们是通过在不同系统上编译的解释器,虚拟机来执行代码,从而保证代码在不同操作系统上都可以运行,但了解一些系统级的知识,对于实际写程序还是很有帮助的。

这里的书除了之前的Linux之外,要看你之后打算做什么。我因为是打算搞Web开发,所以看的是偏Linux的书。操作系统的书都是比较复杂和难懂的,主要是为了搞清楚概念,以及实际的尝试编写一些多进程和多线程的代码。如果打算将来写Windows应用,那就是另外一条路线了。下边两本书我是互相搭配着一起看完的。

  1. 操作系统导论
  2. 现代操作系统

04 计算机网络

计算机网络对于我们写软件的来说,主要还是了解原理。将来Web开发的时候无数次的还会遇到网络。我这方面看的书比较少:

1.计算机网络:自顶向下方法(原书第8版),这书我看的时候好像还是第6版,主要看概念和搞懂基本原理

05 数据结构

我在这个阶段主要目标是两点:一要学会Java语言,二要学会常见的数据结构和算法。

Java真的是一入门深似海,我脑子里回想了一下,似乎我买的最多的书就是Java的了,毕竟是我的本命语言。我把书分为三类,按我个人的理解,这三类层次从低到高:

语言入门和语言特性类:

  1. Java语言程序设计 基础篇 原书第12版,梁勇的书,写的很好,是很多外国计算机系的教材,甚至可以找英文版来看
  2. Java核心技术 卷I + II (原书第12版),没什么好说的,每个Java开发者都有的书,标准库内容也是经常要翻翻看的。我那时候还是Java8年代的该书第10版
  3. On Java 中文版套装,实际上是作者另外一本鼎鼎有名,但还停留在Java 8时代的Java编程思想 第四版的更新,所以就不用买老书了
  4. Java实战,属于著名的XX in Action系列,这一系列当年因为翻译慢,很多我都从z-lib上找的英文版自己打印出来看的

数据结构和算法类:

  1. 数据结构与抽象 Java语言描述,实体新书已经绝版,链接为z-lib电子书,非常好的一本书,也是我对着不知道敲了多少遍代码的书,这么多年了我都还记得封面上一个一个的小彩色方形图标
  2. 算法 第四版,这个也不用多介绍了,必备之书,当年和上边一本我天天抱着看
  3. 大话数据结构,如果对数据结构入门比较难,这书可以辅助理解

程序设计理念:

  1. 设计模式,薄薄一本,卖你七八十块,打开一看和天书差不多。等几年之后你初步悟到其中奥妙的时候,才明白为什么计算机叫做抽象的艺术。
  2. 图解设计模式,设计模式用的C++语言,这本就是Java了,如果你不想自己悟出来设计模式里那些东西怎么在Java里实现,看这本就行了。
  3. Effective Java中文版(原书第3版),又是薄薄一本,计算机的书,越薄越难懂
  4. 深入理解Java虚拟机:JVM高级特性与最佳实践 ,当知识了解一下,相当于你学开车的时候也去了解一下汽车原理,总没有坏处
  5. Java并发编程的艺术 第2版,并发编程由于平时用的少,外加难度确实挺高,也放在这里,有志向的朋友可以尝试攻克一下并发编程
  6. 实战Java高并发程序设计 第3版,当年看的还是第二版

06 Java Web 开发

Java我都会了,加个Web应该也是轻而易举吧。实际上又是另外一片天地,Web开发的东西实在太多。

Java Web从上古企业开发讲到现在的话内容实在太多,但对于学习,要学的是Java Web的基础也就是JSP,然后就可以学习Spring框架了。听着很容易?一个Spring框架可能就够学一辈子的。

能学到这里,我相信自己探索解决问题的能力也有了,也不再推荐非常具体的书了,除了一些公认的好书,也可以淘宝几块钱买个培训机构的前端后端课来学。这里书我就不一一列出来了。

前端

  1. HTML
  2. CSS,在某种程度上是魔法
  3. 纯CSS/HTML框架,比如BootStrap,Foundation,用框架可以减少浏览器的兼容问题
  4. JavaScript,必须要会的,不过由于知识迁移的作用,现在学一门新语言没有太大障碍,甚至可以做到直接对着文档开干。“高程五”是必备的,我那时候还是看的“高程三”入的门
  5. 前端框架:Vue React,不打算搞前后端分离可以先不看。
  6. 配合前端框架的样式UI,比如Ant-design, Material-UI
  7. 前端工程化,这个又是一个巨大的分支:node.js,webpack等等,如果不是专业搞前端,可以先了解一下。
  8. 结合后端框架渲染使用的模板标签语言,比如Thymeleaf。

HTML+CSS基本上不用买书,有完整的MDN Web开发文档可以参考。

后端

  1. HTTP协议
  2. Java Web基础知识,JSP页面,渲染,如何通过Tomcat服务器的配置
  3. Spring框架,这个东西就使劲钻研吧,每次有需求可能都会发现里边的新天地。我个人学的时候还是Spring Boot刚出来的时候,Spring自己版本应该还是3-4过渡的时候,我个人主要用的是Spring Web,Thymeleaf,Spring Security,Spring Data JPA+Redis+MongoDB,Validation这些。像后来5版追加的那些Reactive特性和微服务也没有时间研究了,不过搞搞普通Web开发也足够了。
  4. 数据库。这又是一个很大的专题,写Web说实在就是一直和数据库打交道。只为了使用的话需要学会SQL,至于实际使用的数据库,我个人推荐PostgreSQL。对于数据库,力所能及的话,还是可以研读一下数据库系统概念(本科教学版·原书第7版)这本书,然后可以找找PostgreSQL入门相关的东西看一下。
  5. ORM,对于Java来说就是Hibernate,这个东西就算不是为了Spring用也值得学,天天看小红书上求教如何写SQL,我只能说有的时候不写SQL也许更好。
  6. 服务器配置。写好的网站怎么放到网上为大家提供服务,要怎么配置(就像你现在看的我的博客),这里边又是一堆问题,包括Linux操作系统的使用、域名解析、nginx反向代理软件,静态文件、具体服务器配置,HTTPS证书等等。

07 再来一门通用的动态语言吧

没错,就是Python(或者你也可以选择其他的),没有其他原因,主要就是通用,开发快,尤其适合给财务同事开发点处理Excel的小脚本,还可以通过pyinstalller打包成可执行文件。

如果你完成了上边的内容,Python基本上都不用学,了解一下语法就可以直接开干。而且Python也有一个功能非常完备的Web框架-Django,前边学的知识统统可以迁移,只要理解一下Django的结构就可以,比如中间件是不是就是类似JavaWeb自定义filter呢。就算用Django作为自己的主力开发其实也是很不错的选择。顺便提一句当年勇,我用Django之后发现使用很方便,不像Java要写那么多八股文,于是自己翻译了一本《Django 2 By Examle》,这书现在已经出到了《Django 5 By Example》,但其中大部分内容都没有变化。

当然Python的痛还是执行速度。不过我至今给同事们写各种东西其实足够了。大家也可以考虑主力用Python-Django,不过需要的Web开发知识也是一点都不会少的。

08 辅助资料和计算机文化

计算机的辅助资料,其实只要有心,整个互联网到处都是资源,这里推荐一个很有意思的网站 https://exercism.io/,它的很多题目并不是像教科书上一样除了练习就是练习,会带有很多知识,比如让你知道生活中常见的某个编码的逻辑,某些东西的分类标准等等,比单纯做数据结构和算法有意思的多。另外现在人工智能也很火,大家现在学,也可以考虑把数学学起来了,反正我是没精力了。

至于计算机文化,就算不从事软件开发行业,也可以读一下,毕竟从计算机诞生以来,平时听到最多的可能都是关于互联网行业的新闻。我个人基本上把比较有名的都看过了:

  1. 代码大全2
  2. 人月神话
  3. 黑客与画家
  4. 程序员的数学
  5. 计算机简史
  6. 暗时间
  7. 编程珠玑
  8. 程序员修炼之道 从小工到专家

关于Web开发的路线,已经去世的前阿里大佬陈皓在极客时间有一个讲座,里边提到了零基础入门的路线。他的想法和我当时想学开发时候的想法一样:互联网时代,至少要会做Web吧。

他的讲座69讲开始讲了他推荐的入门路线,各位也可以参考,下载地址是:极客时间-左耳听风。链接是我自己的百度网盘,如果链接失效,可以留言我来更新。

09 后记

其实还有很多书不能一一列出,像React,Spring都买过不少书,甚至在Spring 5 in Action刚出的时候,自己下了英文版打印出来啃完。2023年搬家的时候,我扔掉了整整两个半大箱子的计算机书(很多是盗版或者自己打印,不是太心疼),当时扔的时候我也有点惊讶,竟然看过这么多书,当时还拍了照片留念:
books.jpg

写到这里,突然回想起2017年的往事。那年11月,我自己写的合同台账管理系统在公司内部正式运用,成本合约部、工程部和财务部的合同管理、发票付款请求和实际付款金额在同一个平台上信息共享,成本合约部和工程部也都抛弃了excel版的合同台账,公司为了这个系统还专门买了个VPS搞了域名架在公网上。

后来这系统在我离开公司之后,一直到2021年公司被卖掉都还在使用。那是我写的第一个被实际运用的Web应用,有完整的用户注册、登录、修改密码,权限管理、下载excel的功能,代码今天看起来很幼稚,但至今我还存在自己的网盘里。

时至今日,我依然觉得冥冥之中像受到感召似的决定学习计算机,终于有机会一窥计算机女神裙底的奥秘,是除了人生几件大事之外的又一大幸事。

LICENSED UNDER CC BY-NC-SA 4.0
Comment