人生苦短,转行程序员要趁早(下)

前言

最近有朋友咨询关于如何自学编程语言的问题,发现要回答这个问题,不是一俩句就可以回答清楚并减少当事人的困惑和迷茫。

笔者不知道提问者是问的学习方法还是学习路径,所以特此写一篇文章,斗胆表达一下我对自学编程的一点点看法,希望能帮助到想要学编程,转行学编程,正在学编程的朋友们,包括我自己。

常见问题

笔者也是由于兴趣所致,转行自学编程,很理解想学编程的小伙伴们的心情,其中包括不限于:

  • 我是非科班出身,零基础,能不能学编程?
  • 我是科班出身,但是在学校净玩了,没有专业技能,能不能学个编程?
  • 要不要报个培训班学习编程,听说机构很坑,但是也听说不少出来咸鱼翻身的,到底是报班学习,还是自学编程?
  • 要不要买书自学?如果要买,应该买什么书?
  • 不知道自己未来要干什么,尝试学个编程,听说就业薪资很高?

上面是罗列的这些常见问题,其实根源都是指向一个问题:希望学个专业技能,立足社会,为的就是养家糊口,买米下锅。

笔者其实很早就写过关于转行编程的博文,可以先移步看看:人生苦短,转行程序员要趁早(上)人生苦短,转行程序员要趁早(中),这俩篇文章罗嗦一堆其实是在表达,作为成年人一定知道自己真正具体想要什么,而不是单纯的想要更多的储蓄,因为这个想法太抽象了,比数学还要抽象。

因此,学编程之前,首先要明白,为什么要学编程,是真的对编程感兴趣,还是因为听说这个行业挣得多,所以想学编程。

这个问题其实和考研的问题一样,一个是想窥探更深层次的东西,探索人类知识的边界,一个是为了研究生毕业有个金闪闪的证,方便顺利就业。

俩者的行为表现都是一样的,但是背后的动机和认知是天壤之别。不可否认,带着纯利益性目的的做一件事无可厚非,但是笔者认为,这只是早期可以的动机,真正驱动一个人在某领域深耕一辈子的,一定不是单纯的利益驱使,能坚持到最后的都是顺其自然,而不是咬牙切齿。

十年认知

前阵子,笔者的身份证快要到期了,不禁感慨,时间已经过去十年了。现在回想,十年前的自己有想过十年后的自己在干什么吗?如果没有想过,那么现在的自己,有想过十年后自己在干什么吗?如果想过,那么现在的自己是自己当初想要的结果吗?

说实话,笔者当时真的懵懂无知,只知道随大流念书考试,熬过艰难的高中,走进自由自在的大学。注意,这些想法仅仅停留在此,没有更深层次想过读高中考大学的真正目的是什么,也就是没有想过将来想干什么,想成为什么样的人,包括拥有多少储蓄都没有想过。仅仅停留在让我赶紧能毕业,进一所大学就行了。走一步看一步。

上面这种视野的局限性,导致自己对于未来的认知只是停留在想考上大学,包括老师们口中常常念叨的:只要我们熬过高中,那么在大学就可以无拘无束了,任由自己放飞自我。作为教育长者的他们的言论,对于没有思辨思维的我来说,更加深了自己对于未来的认知局限性,这很可怕。

时间 or 金钱

感谢读者能看我废话罗嗦到此处,笔者不是碎碎念狂,笔者打下的每个文字都是用时间堆砌的。为了所谓的用户阅读流量,大可以贴一篇看似很有道理的学习路径塘塞,但是,作为关注笔者的朋友们,怎能如此不用心写下自己的一点真心感悟呢?

笔者之所以唠叨之多,也是因为本篇文章算作「人生苦短,转行程序员要趁早」的终结篇,所以多写点经得起时间考验的博文,即使五年,十年之后,它一样有价值,而不是一份垃圾快餐,满足一时快乐很容易。

每个人的时间精力有限,终点都是一样的,如何花式过完一生,是自己的事情,就像正在打字的我和正在阅读的你,都是在浪费生命,不是浪费在此就是浪费在其他地方。

因此浪费时间不是一件可怕的事情,因为即使不浪费时间,时间也会消逝。可怕的是,浪费时间在没有价值的事情上,也就是穷尽一生没有为自己或者身边的人创造价值,这才是生命中最可怕的一件事。

编程认知

编程的魅力在于,控制重复,创造美好。

笔者未学编程之前,在工作中遇到一个表格统计问题,表格中的每一列表格之间有数据关联性,但是这种数据关联性,只能通过人眼识别,不能自动完成,也就会增加误填的风险和数据校验的时间成本。笔者当时想找一些资料做一个级联操作,就像我们平时在填写收获地址时,第一个选择框选择某个省之后,第二个选择框里可以选择的一定是属于这个省的城市,这样就可以精准高效地统计数据,但是苦于自己没有技术能力实现这样简单的功能。

值得注意的是,在遇到那样痛苦有风险的数据统计操作的时候,笔者也是因有接触过编程,才有了想通过编程实现自动化办公的想法。笔者亲眼见过,那位数据统计员,机械地完成大量重复性的工作,不禁在想,如果我是老板,会花钱请个人肉机器人吗?

关键,我是老板的话,我知道下属的工作是人肉机器这事吗?

记得笔者看过一段亚马逊创始人贝索斯的采访,说当初刚创业的时候,天天像个机器人一样,熬夜打包图书,打得手指生疼。或许正是这位老板当初创业时,知道人肉机器人的效率底下,才有了后来超级庞大的自动化仓储物流体系。

编程之路

自学编程是一件很痛苦的事情,尤其对于完全零基础的人来说,笔者在自学编程这条路上,也曾中途放弃过 4 次。当时的自己,真的是对着枯燥的课本一点点肯概念和代码。

注意,笔者这里说的编程,是用现有的编程知识解决问题,而不是创造一种未知编程概念和知识,所以在编程这条路上,有放弃的想法很正常,一是学习的姿势不对,而不是单纯说自己不适合学编程。

所以可以肯定的说,不存在学不会的情况,如果网络游戏都能玩得很 6,电视剧中的各种人物角色关系都能理清,能一天沉浸在游戏和电视剧中的,都是可以学习编程的,并且不仅限于编程,学习任何一门专业技术都是可以的。

建立基本思维

到此读者应该清楚了解,笔者对于第一小节提到的常见问题的核心根源的观点和态度,以后不再赘述。

对于任何学习编程的朋友来说,首先要在头脑中建立一种思维:编程是工具,是手段,解决问题才是核心。

编程就是在解决计算机怎么实现人类遇到的问题,记录数据并处理数据,要人去记录和解决也可以,为什么要用机器解决呢?因为机器最听话,最能权威公正客观的完成任务。

这种思维概念的形成,有助于理解,为什么电脑、手机等智能设备为什么要有电,因为电信号的存储,就是在存储数据,就是在完成并替代本来人可以做的事情。

这里推荐书籍:编码:隐匿在计算机软硬件背后的语言

数据类型

对于某种高级编程语言的学习,首先最开始接触到必然是数据类型,比如 Java 中的数据类型分类:

很多完全零基础的初学者看到上面这些概念就头疼,也困惑为啥要有数据类型呢,学这么多数据类型干嘛呢,还搞这么多分类。

再来看看 Python 语言中的数据类型:

再来看看 C 语言中的数据类型:

所谓数据类型,字面意思就是数据的类型。笔者接触使用过 C 和 Java,Python 未接触过,但从上图可以粗略看出,后俩者的老祖宗都是源于前者,后俩者在前者的数据类型基础上扩展或者二次封装了更好用的数据类型,目的终究是为了人类更好的使用这些类型去存储和处理数据。

所以数据类型,是一门编程语言最基础核心的东西,需要掌握好它们分享适用的场景,可以存放什么数据。存放数据的目的,也是为了计算机能够针对相同类型的数据做计算处理,因此才引入了数据类型这概念。

条件循环

在所有高级语言中都会有条件控制 和循环语法,万变不离其宗的条件控制和循环,这是计算机能够智能化运行的基石,这些数学上基本概念在高二数学必修 3 的第一章节就有涉及:

笔者认为在高中考试中,遇到考察这种知识点试题就是在送分,不知道读者有没有同感。有了上述的数学基础,再回过头来看编程语言对上述数学概念的语言层面实现,什么 if else, while, do while,switch case 等都是一种语法规则,目的就是让计算机按照一种循环逻辑处理数据,因此,当学完控制循环的之后,就会发现数学真的是学科的妈妈。

语言特性

当上面的编程最最基本的概念语法掌握清楚之后,就可以进行某种语言的专有语法特性的学习了。如 C 语言的核心是指针,理解指针的概念,就是理解计算机怎么分配内存,也就是数据在内存里怎么存储,怎么处理。Java 正是见指针的学习曲线很高,也不好掌控,于是提出了自己的特有概念:引用,本质还是指针,而引入引用的目的,也是为了面向对象的概念做基础铺垫。因此,在学习 Java 语言的时候,理解面向对象思想的前提是理解引用是什么。

如果时间充裕,建议优先学习 C 语言,了解 C 语言的指针是什么,再学习 Java 或 Python 这些语言。推荐去 B 站 搜索郝斌老师的 C 语言自学教程。

网络

对于计算机网络这块,其实和编程语言本身关系不大,因为编程语言本身就是让计算机存储并处理数据,是不是和网络相关的数据,编程语言本身并不关心,但是作为互联网时代,通讯不可能像原始社会一样,出门全靠吼,而是需要更高效的方式传输数据,于是网络协议概念产生了,各种编程语言为了秀出自己的专长,于是实现了很多网络算法,目的就是为了程序员们更好地针对网络数据进行编程。

因此对于网络编程,重点在于对网络基本知识的理解,编程语言实现了网络领域的很多概念,因此再次强调,编程语言只是一种工具。

众所周知,学习网络一定要看那本经典的《TCP/IP 详解》,但是作为零基础的初学者,上来就看如何概念抽象性的书籍,完全就是像灭掉一个人的学习自信心,因此笔者推荐轻松入门读物《网络是怎样连接的》,看完之后,再时间充裕的情况下再看看《图解TCP/IP》。

注意:看了上面的网络基础知识,并不表示就可以完成网络开发,因为每种编程语言对于网络知识的实现是不一样的,所以需要有针对性的学习。对于 Java 语言来说,Socket 网络编程知识需要重点理解关注,对网络应用方面的实现需要学习 J2EE 知识,也就是 Servlet 相关规范,这部分内容也是学习 Java Web 知识的核心基础。

框架

笔者的技术栈仅限于 Java 语言,因此这里说的框架是指 Java 相关框架,其他编程语言的框架读者欢迎留言补充。Java 语言的著名框架莫过于 Spring ,理解框架的基础,在于理解动态代理,没有 Java 语言的动态代理技术,估计 Java 框架生态也不能发展的如此火热。

框架的学习,首先是了解框架是用来干什么的,存在即合理,框架不是因为流行所以流行,正是因为能够解决实际生产中的问题,所以才被市场接受和认可。理解框架诞生的目的之后,就需要快速掌握框架的使用方法,在有时间精力允许的情况下,深入理解框架的实现原理。

因此,对于初学者来说,学习框架的节奏就是:先抓主干脉络,后细节深入。

Java 框架推荐学习路径:Spring,SpringMvc,Hibernate,Jpa,Spring Jpa Data,Mybatis。

注意上述列出的是框架,Spring Boot 和 Spring Cloud 不属于原生框架,而是集合框架之上的一种平台了。因此,只有掌握了原生框架,才能掌握这些框架的平台是怎么用的,它们又是解决了什么问题。

数据结构与算法

数据结构与算法,估计是所有编程的核心,上面也多次提到, 编程语言的出现均为如何存储数据和处理数据服务的,因此编程语言本身不具备数据结构和算法知识,编程语言只是利用自身的特性实现了数据存储的结构和数据处理的计算流程。

数据结构与算法,是程序员必备的技能,因为不论是网络相关的知识,还是数学相关的知识,都是基于利用数据结构和算法知识,使用编程语言实现了这些抽象概念。

笔者认为,数据结构与算法的关系是,数据结构是对数据关系的结构化描述,算法是对这些有关系的数据进行结构化处理计算,并再形成结构后化关系数据的一种计算流程。

对于零基础的初学者,首先应该掌握的是编程语言本身,也就是会一种工具,再利用这种工具完成某种特殊的任务。

笔者推荐 B 站搜索尚硅谷图解算法,这个系列视频是使用 Java 语言,当然其他语言也是可以现实算法的,都是为了解决数据如何存储和处理的问题。

操作系统

对于编程语言学习者来说,首先要明白的是,我们通常编程开发环境都需要建立在某种操作系统之上,再操作系统环境上编写出来的程序,也最后交给操作系统来帮我们执行程序,因此有必要了解一下操作系统通用的知识,尤其是进程和线程的概念,因为操作系统就是对硬件CPU和内存进行统一调度处理,所以理解一些操作系统层面的知识,有助于编写出高效的程序,归根结底还是能写出优质的程序算法。

这部分知识,可以建立在上述知识点基础上进行深入了解。如果要推荐书籍,可以阅读《深入理解计算机系统》,注意的是,这本书名字起得很高大上,其实就是对计算系统做一个入门级介绍,不算是深入理解,由于英文原名叫:Computer Systems: A Programmer’s Perspective,所以一般简称为:CSAPP。

Java 自学路径

这里列举的学习路径只是说明需要重点学习的模块,并不需要严格按照这个路径学习,具体的学习路径可以按照文末给出的视频教程学习路径进行学习,在学习过程中,可以按照这个路径作为参考。

  1. 语言基础(OOD、OOP)

  2. 语言高级(常用API、集合、异常、多线程、IO、Socket)

  3. JDBC、MySQL
  4. JavaWeb(HTML、CSS、JavaScript、Jquery、Ajax、XML、Bootstrap、Tomcat、Servlet、Cookie、Session、Jsp、JSON、Maven、Git)
  5. Linux
  6. Oracle
  7. Spring
  8. SpringMVC
  9. Mybatis
  10. Spring Data JPA
  11. Redis
  12. Lucene、Elasticsearch
  13. Spring Boot
  14. SpringCloud
  15. JVM

在自学之前,建议学会 markdown 语法。有时间精力的可以搭建自己的 github 个人博客,没有时间精力的可以去博客园、简书、掘金等平台注册一个博客帐号。好记性不如烂笔头,这些准备工作,都是为了记录自己的学习笔记。

在学习过程中,遇到不懂的问题,要及时网上查资料或者咨询其他人,当然也可以向笔者交流,相互学习成长。

遇到一些实在难以理解的问题,先记录下来,然后继续向后学习,过一阵子再回头看之前不懂的问题就不会那么理解吃力了。

感谢读者们能耐心看完本文,附上2018年黑马57期教学视频,帮助你更好的学习和成长。关注微信公众号:woodwhales,在后台回复:资料,即可获取视频下载链接。

updated updated 2020-03-01 2020-03-01
本文结束感谢阅读

本文标题:人生苦短,转行程序员要趁早(下)

本文作者:木鲸鱼

微信公号:木鲸鱼 | woodwhales

原始链接:https://woodwhales.cn/2019/08/03/047/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%