亲身经历告诉你该如何自学编程

news2024/11/25 15:31:05

我2016年硕士毕业后,从一个纯机械学生开始转行做软件开发,其中少不了要自学编程,这其中经历的到现在看来还历历在目。

我曾经写过一些关于我转行做软件开发经历的文章,如果你感兴趣,可以点击这里的链接(我机械的,转行成功了)看一下,这里就不再赘述了。

在链接文章的最后,我写了一段话,很多朋友反馈特别有共鸣:

只有亲历过的人才知道,别听网上谁说转行很容易,那都是骗人的。

除非你能力出众到,面对一个全新的领域,别人一说你就懂。

隔行如隔山,但你是个天才。

否则,没有做好完全的心理准备,没有准备好的退路,没有足够的勇气,不建议贸然转行。

转行是这样,自学编程其实也是一样的,因为都是一个全新的领域,隔行如隔山,历来如此。

这里想谈谈一个问题:自学编程真的难吗,为什么这么难?


这件事其实因人而异,如果把编程难易度用分数来衡量。我见过一个朋友也是转行重新学习编程的,他貌似有点编程的天才体质,很多东西一学就会,一点就通,据他反馈编程的难度估计也就40分。

而我当初自学编程时,感觉难度大概有70分。

而很多人在自学编程时,难度甚至可以达到120分甚至更高,确实因人而异,体质变化量真的非常大。

我不讨论那些天才,以及觉得难度在70分以下的人的感受,只说一说以我的感觉,难度在 70 分以上的感受:难在哪?

第一,难在编程思维的锻炼

很多新手去学编程,可以打印一句 Hello World 就觉的编程好容易,可以把一些书上或课程中给的示例代码复制下来,跑通了也觉的编程好容易。

甚至现在 AI 非常牛,有一些想法让 AI 帮忙做一下编程,代码可以跑通也觉得编程很容易。

实则不然。

真正的编程绝不是以上的场景。真正的编程是你在面对一些真实问题时,可以习惯用编程思维解决问题,但是在日常生活中养成编程思维其实是有些困难的。

先说一个真实的例子。

我带过一个同学学习 python。他因为刚上班,总是弄不清自己的税前工资以及税后到手工资的关系,总觉的到手工资和自己预想的不一样,于是和我讨论之后,他觉得自己写一个程序用来计算自己的到手工资。

因为每个月交的五险一金的比例以及自己的补贴+基本工资都是知道的,他觉得可以根据这个来精确的计算出自己每月的工资。

因为现在的工资计算都是梯度扣税,为了完成这件“大事”,他还把梯度计税制、速算扣除数等概念搞得清清楚楚,然后写完代码之后和我讲了一遍,关键是我也听懂了(顺便也把计税规则了解了一下)。

随后他每个月便用自己写的那段 python 程序来计算自己当月到手工资情况,非常的准确。

上图是他完成的计算扣税的程序部分截图。

这是一个例子,学习编程要学以致用,这样学的才快。当然了,因为编程时他刚接触 python 没多久,出现了很多bug和他无法自己单独实现的情况,好几次是我和他一起解决的问题。

下图是运行他的程序后,打印出来的结果(以每月10000税前收入,共12个月为例):最后 Summary 部分给出了一年五险一金共缴纳了多少,税后到手工资多少等等信息。

这虽然是一个很简单的例子,但是编程完成后,他的成就感非常强。我只能说他的这种编程思维是有的,确实非常棒。

后来这位朋友说:“等 python 学扎实了,希望可以用它来开发一些更复杂的功能,来管理自己的收入支出等等”。

所以,如果你觉得难,你先回想一下,自己是否有过类似的经历,在学习编程过程中用所需的知识解决一些实际用到的问题,以此来锻炼自己的编程思维呢?

第二,难在编程基础的理解

当然你有了编程思维那是第一步。“我整天想着自己开发一个软件来解决我的一些问题,但是不会编写代码也是徒劳”。

想独自完成代码的编写,需要对编程的基础有非常深刻的理解才好。

不论你是学 python/C++/JAVA 还是其他任何语言,很多计算机基础的内容是想通的。

比如内存、数据结构、算法等等,这些可以认为是构建“编程世界”的积木,你只有把这些基础概念掌握透彻,才能用他们搭出非常复杂且精妙的软件程序出来。

我在机械硕士毕业那年,第一次接触编程是 C/C++ 语言。

C/C++语言我认为要比很多高级编程语言难学很多,为什么呢?

因为当我将 C++ 学到我自认非常熟练的程度后,后来工作中会大量用到 python时,很多 python 语法和基础一看就明白了,甚至可以说,没有专门去学过 python,用到了就百度一下。

到目前为止,用 python 开发过很多大型软件(AI编译器前端很多都是 python 代码,比如 TVM)。这都是当初花了大量的时间去学习 C++ 以及计算机体系结构和数据结构以及算法带来的好处。

这里说一下当初自学 C++ 是怎么学的。

我当时C++基础有些薄弱,就买了一个399的C++课程,一个百度资深工程师的录播课。

我每天上下班路上坚持看。

从家里到公司坐地铁刚好半小时,每天上下班看一个小时,坚持了 3 个月,将课程视频来回看了 6 遍,然后到公司一有闲暇时间就练习课程中的技术,3个月下来,C++就真的是很熟练了。

以至于后来的面试,我甚至可以和面试官探讨很多C++模板的底层实现。

一旦学会了C++,再去学python或者用 python 就真的非常容易。

总结下来就是:看不懂很正常,一遍不懂就看两遍,两遍不懂就看三遍,我当时看了六遍,以至于现在都能复述出很多课程中讲师对于一些概念的讲解。

如果你也能做到这一点,我相信你也可以做到对一门编程语言非常熟练。

当然,光看课是不行的,要在看课学习的过程中自己去实战,说白了要自己去写代码。

编程这个行业很奇怪,很多东西你再懂,但是不会写代码也没用,这也是为什么很多公司招人都要有笔试或者编程题的原因。

说句题外话:现在很多大学生或者初学者热衷于考计算机的一些认证证书,以此来强调自己的编程或者计算机水平有多高。

说句冒犯的话:以考证为目的我觉得这样意义不大,除了在考证过程中自己可以学习一些知识以外,如果没有将技能练到手,那些证书并不会对你有太大帮助。如果是评级、评职称那另当别论。

因为很多时候你见到一些真正的编程大佬,他们从来不会吹嘘自己一个有证的程序员,相反只会吹嘘自己开源的那些代码在 github 获得了多少星标。

所以,基础很重要,实战更重要,技能学到手才对呀。

剩下的就是在工作中不断地打磨自己对编程的理解,不断的精进自己的水平。

最后,再回答一下上面那个同学的问题。

编程学习入门确实很难,但说起来其实也没那么难 ——

学习加实践,再加一条坚持。

初学确实很多东西看起来都不懂,但是一点点啃下来之后,就会发现难点正在就一点点消失,这其中最怕的就是半途而废。


码字不易,点个赞呗。

我是一名 AI 攻城狮,如果你也想学习 AI ,欢迎来添加我的私人微信(ddcsggcs),可以咨询也可以围观朋友圈呀。

也欢迎你点击下方关注我的公众号,会有很多好玩的AI技术分享~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2195220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国庆期间的问题,如何在老家访问杭州办公室的网络呢

背景:国庆期间的问题,如何在老家访问杭州办公室的网络呢 实现方案:异地组网 实现语言:Java 环境:三个网络,一台拥有公网IP的服务器、一台杭州本地机房内服务器、你老家所在网络中的一台电脑(…

【Git】TortoiseGitPlink提示输入密码解决方法

问题 克隆仓库,TortoiseGitPlink提示输入密码 解法 1、打开TortoiseGit 下的puttygen工具 位置:C:\Program Files\TortoiseGit\bin\ 2、点击【Load】按钮,载入 C:\Users\Administrator\.ssh\ 文件夹下的id_rsa文件。 3、点击save private …

Python数据分析-远程办公与心理健康分析

一、研究背景 随着信息技术的飞速发展和全球化的推进,远程工作(Remote Work)成为越来越多企业和员工的选择。尤其是在2020年新冠疫情(COVID-19)爆发后,全球范围内的封锁措施使得远程工作模式迅速普及。根据…

Mysql数据库--JDBC编程

文章目录 1.JDBC编程基础2.驱动程序下载3.新建项目3.1导入java包3.2转换为库 4.开始创作4.1准备数据库4.2创建DataSource4.3和数据库建立连接4.4构造sql,准备发送到服务器4.5发送sql,执行sql4.6释放系统资源4.7自行输入的设置4.8插入数据完整源代码4.9查…

JavaEE之多线程进阶-面试问题

一.常见的锁策略 锁策略不是指某一个具体的锁,所有的锁都可以往这些锁策略中套 1.悲观锁与乐观锁 预测所冲突的概率是否高,悲观锁为预测锁冲突的概率较高,乐观锁为预测锁冲突的概率更低。 2.重量级锁和轻量级锁 从加锁的开销角度判断&am…

OJ在线评测系统 微服务 用分布式消息队列 RabbitMQ 解耦判题服务和题目服务 手搓交换机和队列 实现项目异步化

消息队列解耦 项目异步化 分布式消息队列 分布式消息队列是一种用于异步通信的系统,它允许不同的应用程序或服务之间传递消息。消息队列的核心理念是将消息存储在一个队列中,发送方可以将消息发送到队列,而接收方则可以在适当的时候从队列中…

Vue2电商平台(六)、注册登录,请求头配置token,token持久化存储;导航守卫(重点);组件内守卫、路由独享守卫

文章目录 一、注册1. 获取注册验证码2. 完成注册用户 二、登录1. 登录获取token2. Home首页携带token获取用户数据3. 持久化存储token4. 退出登录5. 导航守卫 (牛)6. 路由独享守卫beforeEnter7. 组件内守卫(用的很少) 一、注册 1. 获取注册验证码 本系…

基于SSM+小程序的线上教育商城管理系统(教育2)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 微信小程序线上教育商城有管理员,教师,学生三个角色。 1、管理员功能有个人中心,学生管理,教师管理,类型管理,课程…

diffusion model(1.1) 为什么前向传播和反向传播都遵循高斯分布?

DDPM的引用[53]为Deep Unsupervised Learning using Nonequilibrium Thermodynamics,它证明了当 β t \beta_t βt​ 较小时,前向传播和反向传播前向分布和后向分布拥有同样的分布形式。 所引论文的内容如下, 后者又引用了另一篇论文(Fell…

分层解耦-04.IOCDI-IOC详解

一.Bean的声明 springboot为了更好地标识web应用开发中bean对象到底归属于哪一层,在Component注解的基础上又衍生出了三个注解Controller、Service和Repository。分别应用于Controller层,Service层和Dao层。推荐使用衍生注解,当无法判断该be…

Java-数据结构-反射、枚举 |ू・ω・` )

目录 ❄️一、反射: 1、定义: 2、用途: 3、反射相关的类: 4、Class类: 1、Class类中相关的方法: 5、Class反射实例: 1、获得Class对象的三种方式: 2、反射的使用: 6、反…

网络基础擅长组建乐队

让我们荡起双桨 来说说网络吧 现有计算机要进行协作,网络的产生是必然的 局域网:计算机数量更多了, 通过交换机和路由器连接在一起 广域网:将远隔千里的计算机都连在一起 交换机路由器等设备就应运而生 计算机是人的工具,人要协…

layernorm笔记

文章目录 layer norm的解释二维三维 batchnorm和layernorm主要的区别为什么要在序列转录模型中使用layer norm? layer norm的解释 二维 红色为batchnorm,蓝色为layer norm batchnorm对每一个特征算均值和方差 layer norm对每一个批次算均值和方差 三…

窗口系统与图形绘制接口

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 当我们想要进行底层图形应用(GUI)开发时,往往需要用到窗口系统和图形库,这里简单介绍一下 视窗系统(window system)与通信协议 下面内容主要针对Unix-like操作系统 视窗系统是以使用视窗作为主要特征之一的图形用…

【含开题报告+文档+PPT+源码】基于SSM + Vue的养老院管理系统【包运行成功】

开题报告 随着社会的发展和经济的进步,人口老龄化问题逐渐凸显。统计数据显示,全球范围内的老龄人口比例正在逐年上升,养老需求也随之增长。养老院作为提供专业养老服务的机构,承担着照料老人、提供医疗保健和社交活动等责任。传…

DVWA Brute Force篇暴力破解 Low/Medium/Hight

这里就不再赘述环境搭建,就默认你已经做好环境搭建的准备了.接下来就步入正题(我的bp是汉化) 任务一,设置级别为low级别,创建好我们的字典文件 任务二 开启抓包,并且我们输入错误的账户密码 (当我知道账户名称为admin时…

Nginx06-静态资源部署

零、文章目录 Nginx06-静态资源部署 1、静态资源概述 静态资源:是在Web开发中不经常改变的文件,比如图片、CSS样式表、JavaScript脚本文件等。这些资源通常是预先编译好的,不需要服务器端的动态处理。动态资源:是在Web开发中需…

fiddler抓包19_模拟IP地址(如异地IP)

课程大纲 使用场景举例:北京模拟海南IP地址“182.118.99.12”发送请求。 ① 打开CustomRules.js文件:Fiddler快捷键“CtrlR”(或鼠标点击,菜单栏 - Rules“规则” - Customize Rules“自定义规则”)。 ② 添加代码,保存&#xff1…

SpringBoot在线教育系统:架构设计与技术选型

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…