前路漫漫,吾将上下而求索!

最近有时在知乎上逛逛,发现很多人对自学编程及转行程序员有困惑。我是在25岁读研时转程序员,正赶上好时候(中国云计算刚刚起步及移动互联网正红的阶段),同时又走了不少弯路,因此,基于自己的开发经历及思考认识(目前有八年 Java 开发经验),希望能够给后来者一些建议和参考。

本文主要面向编程初学者、大学生、初中级工程师(三年以下)。

为什么要学编程

  • 编程能够有力地锻炼人的逻辑思维能力,而逻辑思考是理性思考和决策的必要件,也是思考任何问题所不可或缺的基本思维能力;

  • 编程是一项集设计、发明、创造、表达于一体的很有乐趣很有挑战的职业,如果你乐于钻研事物原理、创造新事物,那就是你没错了!无论别人怎么看,我个人还是很喜欢编程的!

  • 做软件开发的薪水相对较高,因为有一定门槛,需要耐心、时间、理解字符、理解逻辑,很多人可能都没法忍受天天跟字符打交道,很难忍受调试程序的枯燥(程序报错可能仅仅是一个字符没写或写错了,看到眼瞎),很难忍受软件的复杂性(现代软件通常基于大量框架、库、中间件的聚合体,出了底层问题排查会很困难异常耗时);

  • 在知识经济时代,在信息化智能化越来越深入的时代,不懂编程,就像在现代文明社会里不识字一样。

何时学习编程

作为兴趣

只是对编程感兴趣,希望学会一门新技能。任何时候都不晚,哪怕 60 岁开始都没问题。

编程作为辅助技能

工作中用到,但非软件开发职业,编程只是作为辅助技能。比如科学家、数据分析师、产业编程等。年轻的时候加入为宜。

转行程序员

需要慎重考虑:

  • 互联网是一个适合弯道超车的行业, 也是对年轻人友好的行业;
  • 做程序员有年龄红利。年龄越早,享受越多的红利;越晚加入,红利越少;
  • 做程序员是一个可积累性不佳的职业。即使你有很丰富的经验,那些优秀应届生只要有扎实的专业基础,又善于学习和借用 Github 上的代码,善于学习新技术,是可以快速成长为后起之秀的;
  • 程序员职业,是以个人的牺牲换来了行业的快速发展,以个人的可积累性差换来了行业的强积累性;
  • 做程序员需要善于学习,这是最重要的能力之一;
  • 做程序员需要思维缜密周全,能够考虑各种错误和异常情况,考虑可扩展性及很多质量指标,不然,写出的程序可能会漏洞百出,或者难以修改和扩展;
  • 所谓的经验丰富,是指实操大型项目的经验,实操具有特殊性项目的经验,这种机遇非常难得;中小型项目开发不叫经验,因为谁都能经历。

如何自学编程

如果雷神都挡不住你要学习编程的决心和信念,那就开始吧!

学习编程语言

  • 学习编程语言,几乎不需要任何必要件,3-5 岁小孩都能学会,汝何以惧之?
  • 选择一门语言,比如 Java 或 Python ;
  • 找一本好的编程书籍,在豆瓣上搜下 Java 或 Python ,选评分最高或次高的即可;
  • 在寻找编程书籍时最好找两本,一本国内人写的,一个国外人写的;国内浅显,国外深入;
  • 我倾向于学习国外人写的技术书籍,能教会有益的思考方式;在看不懂的时候,再找本国内的看看;
  • 《C程序设计语言》 :即使你不打算学 C ,这本书也是讲述编程语言的经典之作;
  • 找一个相关的编程语言视频,边做边看;
  • 编程重在实践,不写代码是学不会的;
  • 如果你正好有位朋友做程序员,可不定期请教,有个师傅引领编程是很好的;
  • 学好英语,否则你能学到的编程知识永远是二手的甚至是 N 手的!
  • 学会使用 word, excel, ppt 等办公处理软件;
  • 这一阶段重点在学会编程的基本思想,能独立写出一个单词解析程序,就是通关成功!

编程初步进阶

  • 在学会一门编程语言之后,需要学习数据结构、算法、数据库、网络、操作系统 ;

  • 尤其要打好数据结构和算法基础,好比编程的武器装备加成(子弹和炮弹)。如果缺乏数据结构和算法基础,就好比拿着刀剑上战场,还没走两步,就被一发炮弹轰上了天 ;

  • 操作系统是基础课。要能运用操作系统提供的能力,写出更实用的程序,就不能不懂操作系统 ;

  • 数据库是存储和操作大量数据的技术,实际项目开发中必备的基本功 ;

  • 网络是互联网技术的基础,不可不知,至少要理解基本原理及协议 ;

  • 学习顺序:数据结构及算法 => 操作系统 => 数据库 => 网络 ;

  • 数据结构书籍: 《数据结构与算法分析》

  • 算法书籍: 《算法设计与分析基础》《算法(第4版)》《算法导论》(可挑战);

  • 编程书籍:《编程珠玑》(超经典,不可不看),《程序设计实践》 教会你如何正确思考和设计程序 ;

  • 网络书籍:《计算机网络》《TCP/IP详解 卷1:协议》 (进阶);

  • 算法刷题:当你具备一定的数据结构和算法基础,能够编写程序时,推荐到 “力扣网” 刷刷题,进行更深入的算法实践(有充足时间或挤出时间)。我到 2020 年才知道力扣的存在;

  • 当你能够比较灵活使用数据结构和算法,能够理解操作系统的原理并调用系统函数,设计比较规范的数据库表,代表编程初步进阶通关成功!

Web项目

  • 当你具备数据结构、算法基础和数据库设计的基础时,就可以开始尝试做 Web 项目了,正式踏入开发征程;

  • 基本技术栈:后端(SpringMVC, MyBatis) + 前端 ( Javascript , jQuery ) ,可以暂时先不管底层原理,先做起来;

  • 工程模板:这里有一个 Springboot 模板工程,含有一个真实项目商品交易快照项目的代码实例,你可以学习真实项目中软件是怎样子的,也可以在里面做更多的尝试和探索。要运行这个项目,运行 Application.java 即可,然后在浏览器敲入 "http://localhost:8080/" ;项目地址: “springboot-template”

  • 如何从 Github 拉取工程代码,见: “使用git和github托管个人项目”

  • 学习基本的 git 命令: git clone, git add , git commit , git push , git merge ;

  • 编程语言进阶,比如 “Effective java 中文版(第2版)”

  • 源码阅读: 此时,你应当开始学习阅读源码。可以先阅读一些简单的类,比如 JDK 容器。为什么要阅读源码及基本技巧,可参阅 “解锁优秀源代码的基本方法与技巧”

  • 程序调试:在开发项目时,程序调试必不可少,最简单的打断点、单步调试得学会。程序调试技能可参阅 “软件调试的基本技巧”

  • 单测编写:学习编写单测,让代码更加可靠,《单元测试之道Java版:使用JUnit 》

  • 程序风格:学习编写好的程序必不可少。面试找工作非常看重这一点。可参阅 《Java编程风格》《编写可读代码的艺术》, 《代码整洁之道》

  • 当你能够运用数据结构、算法、数据库做出一个简单的 CRUD 管理系统时,能够编写比较规范的代码时,Web 项目阶段通关成功!

踏上征程

真实战场

  • 你已经找到一份程序员工作,进入了真实战场;
  • 做好分配给你的事情,做好接手的系统,同时,阅读各类技术书籍,让自己技术能力更加丰实;
  • 广泛阅读各种编程相关书籍,这里有我读过的书,可以参考: “计算机专业及软件开发推荐书籍”
  • 阅读源码,对你所用到的技术,探究其实现原理;
  • 原理和设计思想是最最最精髓的东西。实用技术虽必不可少,却不可沉迷其中。切勿买椟还珠!
  • 阅读 JDK 源码,阅读小型框架源码;
  • 及早考一个教师资格证,给自己留条后路(我没有考虑到)。

一两年后

  • 深入理解业务、从产品角度思考,能够让你有更宽阔的视野和更快的成长速度(我当时没意识到);
  • 不要怼产品,不要怼测试,不要怼运维,不要怼来怼去怼到没朋友(血的教训);
  • 做事要严谨,对人要宽容;两者不可偏废(我只做到了前者,后者做的不够好);
  • 开始写技术博客;你会发现,三五年后,只有博客上记录的东西还能记得(有益经验);
  • 制订技术研习计划,比如工作中用到的技术的原理,或者新技术,每周或每月写一篇技术博客(有计划但我没能坚持);
  • 了解软件开发攻略:“软件开发的升级打怪攻略:从新手到高级工程师”
  • 深入学习软件设计与开发:这是我关于软件设计与开发的思考:“软件设计要素初探”
  • 当你要跳槽时,不要冲动;先多征求意见,明确意愿,找到下家后再辞职(我辞职时不知道这个套路)。

三年后

  • 构建自己的技术体系结构,持续丰富这个体系结构(如今我才开始做这个事情,有些晚);
  • 这是我最近构建的一个技术体系结构: “互联网应用服务端的常用技术思想与机制纲要”
  • 努力寻找中大型项目和中大型系统实操的机遇,并提升自己的综合能力(我没有这个主动意识,才有此劝诫);
  • 敲重点: 踏实做事,但不要埋头写代码!不要埋头写代码!不要埋头写代码!(我埋头做事,才有此劝诫);
  • 试着去录制一些编程开发视频,拓展自己的技能树(我不知道还能这么玩)。

此去经年

  • 你已经是初中级工程师了,悟空也从菩提祖师那里毕业了;
  • 身边的每一个人都可能是你的导师,欣赏和学习每个人的长处;
  • 拓展你的技能树,学会从一切可能的地方学习;
  • 多交往,拓展自己的活动区域(我偶然参加了TMC演讲,还是有益的)。

编程漫谈(二十):如何自学编程及Java、上手真实开发及转行程序员的建议的更多相关文章

  1. Alink漫谈(二十) :卡方检验源码解析

    Alink漫谈(二十) :卡方检验源码解析 目录 Alink漫谈(二十) :卡方检验源码解析 0x00 摘要 0x01 背景概念 1.1 假设检验 1.2 H0和H1是什么? 1.3 P值 (P-va ...

  2. Alink漫谈(二十二) :源码分析之聚类评估

    Alink漫谈(二十二) :源码分析之聚类评估 目录 Alink漫谈(二十二) :源码分析之聚类评估 0x00 摘要 0x01 背景概念 1.1 什么是聚类 1.2 聚类分析的方法 1.3 聚类评估 ...

  3. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  4. C#编程(二十二)----------继承的类型

    继承的类型 在面向对象的编程中,有两种截然不同的集成类型:实现继承和接口继承 实现继承:表示一个类型派生于一个基类型,它拥有该基类型的所有成员字段和函数.在实现继承中,派生类型采用基类型的每个函数的实 ...

  5. android 学习随笔二十(多媒体编程 )

    1.图片处理 加载大图片 图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 * 单色图:每个像素占用1/8个字节* 16色图:每个像素占用1/2个字节* 256色图:每个像素占用1个 ...

  6. C#编程(二十五)----------接口

    接口 如果一个类派生自一个接口,声明这个类就会实现某些函数.并不是所有的面向对象的语言都支持接口. 例如,有一个接口:IDispoable,包含一个方法Dispose(),该方法又类实现,用于清理代码 ...

  7. 【原创】go语言学习(二十)并发编程

    目录 并发和并行 Goroutine初探 Goroutine实战 Goroutine原理浅析 Channel介绍 Waitgroup介绍 Workerpool的实现 并发和并行 1.概念A. 并发:同 ...

  8. Java笔记(二十九)……网络编程

    概述 网络模型 网络通讯的要素 ip地址:网络中设备的标识符 端口:用于标识同一台设备上不同的进程,有效端口:0~65535,其中0~1024是系统使用端口或者保留端口 TCP与UDP UDP特点: ...

  9. C#编程(二十九)----------泛型接口

    泛型接口 定义 先来看一个简单的例子: public class Sharp {} public class Rectangle:Sharp {} 上面定义了两个简单的类,一个是图形类,一个是矩形类; ...

随机推荐

  1. JUC详解--【Foam番茄】

    1.什么是JUC java.util 工具包 业务:普通的线程代码 Thread Runnable 没有返回值,效率相比于 Callable 相对较低! 2.线程和进程 进程:一个程序,QQ.exe ...

  2. 「实验课选题详解」用C语言实现万年历

    题目要求 编程实现万年历,要求: 可根据用户输入或系统日期进行初始化,如果用户无输入则显示系统日期所在月份的月历,并突出显示当前日期: 可根据用户输入的日期查询,并显示查询结果所在月份的月历,突出显示 ...

  3. js中定时器调用函数时为什么会有引号

    之前在学习的时候并没有发现的细节,关于js中,定时器的问题 这里我们写两个延时器 setTimeout(func, 0); setTimeout("func()", 0);定时器中 ...

  4. 手撕HashMap

    前言: 平时工作的时候,用的最多的就是ArrayList和HashMap了,今天看了遍HashMap的源码,决定自己手写一遍HashMap. 一.创建MyHashMap接口       我们首先创建一 ...

  5. Nebula Flink Connector 的原理和实践

    摘要:本文所介绍 Nebula Graph 连接器 Nebula Flink Connector,采用类似 Flink 提供的 Flink Connector 形式,支持 Flink 读写分布式图数据 ...

  6. IDEA社区版(Community)和付费版(UItimate)的区别

    比对类型 Ultimate(终极版,付费) Community(社区版,免费) 语言支持 Java Java Groovy Groovy Kotlin Kotlin Scala(通过插件) Scala ...

  7. django项目初始化

    1.为了方便管理app,我们添加专门的apps文件夹来存放所有的app.结构如下 1.1设置完apps文件夹以后我们需要对配置文件做相应的更改 1.1.1.在seetings.py里添加django文 ...

  8. PyQt开发实战: 利用QToolBox开发的桌面工具箱

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 toolBox工具箱是一个容器部件,对应类为QToolBox,在其内有一列从上到下顺序排列 ...

  9. matplotlib 绘制多个图——两种方法

    import numpy as np import matplotlib.pyplot as plt #创建自变量数bai组du x= np.linspace(0,2*np.pi,500) #创建函数 ...

  10. Redis整合MySQL和MyCAT分库组件(来源是我的新书)

    MyCAT是一个开源的分布式数据库组件,在项目里,一般用这个组件实现针对数据库的分库分表功能,从而提升对数据表,尤其是大数据库表的访问性能.而且在实际项目里,MyCAT分库分表组件一般会和MySQL以 ...