编程漫谈(二十):如何自学编程及Java、上手真实开发及转行程序员的建议
前路漫漫,吾将上下而求索!
最近有时在知乎上逛逛,发现很多人对自学编程及转行程序员有困惑。我是在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 项目阶段通关成功!
踏上征程
- 你已经能够做出一个基本的软件管理系统了,此时,你意气风发,将要向更广阔的软件开发征程出发!
- 必备网站: “Github” (当你想找某个组件实现时), “StackOverflow” (提问题);
- 学习 《深入理解计算机系统》 ;
- 学习 Java 并发:《Java并发编程实战》 ;
- 学习 Java 内存模型及JVM原理: 《深入理解Java虚拟机(第2版)》 ;
- 学习软件设计原则和思想,理解大型软件如何构建: “【转载】一些软件设计原则”
- 学习设计模式:《深入浅出设计模式(影印版)》 , 《设计模式》 ;
- 学习架构初步:《架构整洁之道》 ;
- 深入了解软件开发职业: “软件开发全景图”, “软件开发思考” ;
- ALLIN:是我在学习和开发生涯中所积累的各种东西,包括数据结构、算法、设计模式、单测、具体技术等。要运行这个项目,运行 Application.java 即可,然后在浏览器敲入 "http://localhost:8080/" ;项目地址:“ALLIN” ;
- 时常膜拜一下大神: 《Coders at Work》。
真实战场
- 你已经找到一份程序员工作,进入了真实战场;
- 做好分配给你的事情,做好接手的系统,同时,阅读各类技术书籍,让自己技术能力更加丰实;
- 广泛阅读各种编程相关书籍,这里有我读过的书,可以参考: “计算机专业及软件开发推荐书籍” ;
- 阅读源码,对你所用到的技术,探究其实现原理;
- 原理和设计思想是最最最精髓的东西。实用技术虽必不可少,却不可沉迷其中。切勿买椟还珠!
- 阅读 JDK 源码,阅读小型框架源码;
- 及早考一个教师资格证,给自己留条后路(我没有考虑到)。
一两年后
- 深入理解业务、从产品角度思考,能够让你有更宽阔的视野和更快的成长速度(我当时没意识到);
- 不要怼产品,不要怼测试,不要怼运维,不要怼来怼去怼到没朋友(血的教训);
- 做事要严谨,对人要宽容;两者不可偏废(我只做到了前者,后者做的不够好);
- 开始写技术博客;你会发现,三五年后,只有博客上记录的东西还能记得(有益经验);
- 制订技术研习计划,比如工作中用到的技术的原理,或者新技术,每周或每月写一篇技术博客(有计划但我没能坚持);
- 了解软件开发攻略:“软件开发的升级打怪攻略:从新手到高级工程师”
- 深入学习软件设计与开发:这是我关于软件设计与开发的思考:“软件设计要素初探”
- 当你要跳槽时,不要冲动;先多征求意见,明确意愿,找到下家后再辞职(我辞职时不知道这个套路)。
三年后
- 构建自己的技术体系结构,持续丰富这个体系结构(如今我才开始做这个事情,有些晚);
- 这是我最近构建的一个技术体系结构: “互联网应用服务端的常用技术思想与机制纲要” ;
- 努力寻找中大型项目和中大型系统实操的机遇,并提升自己的综合能力(我没有这个主动意识,才有此劝诫);
- 敲重点: 踏实做事,但不要埋头写代码!不要埋头写代码!不要埋头写代码!(我埋头做事,才有此劝诫);
- 试着去录制一些编程开发视频,拓展自己的技能树(我不知道还能这么玩)。
此去经年
- 你已经是初中级工程师了,悟空也从菩提祖师那里毕业了;
- 身边的每一个人都可能是你的导师,欣赏和学习每个人的长处;
- 拓展你的技能树,学会从一切可能的地方学习;
- 多交往,拓展自己的活动区域(我偶然参加了TMC演讲,还是有益的)。
编程漫谈(二十):如何自学编程及Java、上手真实开发及转行程序员的建议的更多相关文章
- Alink漫谈(二十) :卡方检验源码解析
Alink漫谈(二十) :卡方检验源码解析 目录 Alink漫谈(二十) :卡方检验源码解析 0x00 摘要 0x01 背景概念 1.1 假设检验 1.2 H0和H1是什么? 1.3 P值 (P-va ...
- Alink漫谈(二十二) :源码分析之聚类评估
Alink漫谈(二十二) :源码分析之聚类评估 目录 Alink漫谈(二十二) :源码分析之聚类评估 0x00 摘要 0x01 背景概念 1.1 什么是聚类 1.2 聚类分析的方法 1.3 聚类评估 ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- C#编程(二十二)----------继承的类型
继承的类型 在面向对象的编程中,有两种截然不同的集成类型:实现继承和接口继承 实现继承:表示一个类型派生于一个基类型,它拥有该基类型的所有成员字段和函数.在实现继承中,派生类型采用基类型的每个函数的实 ...
- android 学习随笔二十(多媒体编程 )
1.图片处理 加载大图片 图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 * 单色图:每个像素占用1/8个字节* 16色图:每个像素占用1/2个字节* 256色图:每个像素占用1个 ...
- C#编程(二十五)----------接口
接口 如果一个类派生自一个接口,声明这个类就会实现某些函数.并不是所有的面向对象的语言都支持接口. 例如,有一个接口:IDispoable,包含一个方法Dispose(),该方法又类实现,用于清理代码 ...
- 【原创】go语言学习(二十)并发编程
目录 并发和并行 Goroutine初探 Goroutine实战 Goroutine原理浅析 Channel介绍 Waitgroup介绍 Workerpool的实现 并发和并行 1.概念A. 并发:同 ...
- Java笔记(二十九)……网络编程
概述 网络模型 网络通讯的要素 ip地址:网络中设备的标识符 端口:用于标识同一台设备上不同的进程,有效端口:0~65535,其中0~1024是系统使用端口或者保留端口 TCP与UDP UDP特点: ...
- C#编程(二十九)----------泛型接口
泛型接口 定义 先来看一个简单的例子: public class Sharp {} public class Rectangle:Sharp {} 上面定义了两个简单的类,一个是图形类,一个是矩形类; ...
随机推荐
- 如何让文科生5分钟写上Python
序言 这篇文章是转型后发表的第一篇文章,有必要先聊一下我的写文计划. 串行文章和并行文章 我会按照发文顺序分为串行文章和并行文章.Python 语言本身的内容,我会按照入门.进阶.原理的顺序依次展开. ...
- oracle 导入导出表,库
Exp/Imp是oracle备份数据的两个命令行工具 1.本地数据库导入导出 1.导出 (运行---cmd中操作) exp 用户名/密码@数据库实例名file=本地存放路径 eg: exp jnjp/ ...
- Robot Framework接口自动化案例分享⑦——Jenkins持续集成
一.RobotFramework插件安装 1.Jenkins首页->系统管理->插件管理->可选插件-> 2.搜索robot,点击直接安装 二.任务参数配置 1.新建任务 Je ...
- go语言数据类型值--整型和浮点型
一.整型 1.整型的分类: 有符号整型: int8.int16.int32.int64 对应的无符号整型: uint8.uint16.uint32.uint64 uint就是我们熟知的byte类型,i ...
- 大数据-redis-redis启动出错
redis启动出错Creating Server TCP listening socket 127.0.0.1:6379: bind: No error 解决方法(1) 首先如果你是从官方redis官 ...
- PyQt(Python+Qt)学习随笔:desktop的frameGeometry、frameSize、availableGeometry,screenGeometry
frameGeometry:返回窗口相对于父窗口的几何形状的大小,包括窗口的框架,当窗口是顶级窗口时,返回的实际上是屏幕的大小: frameSize:返回窗口的几何形状的大小,包括窗口的框架,当窗口是 ...
- PHP代码审计分段讲解(14)
30题利用提交数组绕过逻辑 本篇博客是PHP代码审计分段讲解系列题解的最后一篇,对于我这个懒癌患者来说,很多事情知易行难,坚持下去,继续学习和提高自己. 源码如下: <?php $role = ...
- 极光实验室 第一次考核wp
第一道题: 上来就让我买flag,用御剑扫目录,发现了这道题有源码index.php.bak!直接下载. <meta charset='UTF-8'> <title>极光实验室 ...
- Day1 Scrum 冲刺博客
团队作业4--项目冲刺 第一篇博客 一. 各个成员在 Alpha 阶段认领的任务 蔡越,冷沐样:视觉元素设计与方块类Cell开发 周梓波,纪昂学:游戏功能逻辑开发,即抽象出主要元素对应的数据类型 廖业 ...
- vue基础题
一.对于MVVM的理解? MVVM 是 Model-View-ViewModel 的缩写. Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑. View 代表UI 组件,它负责 ...