刚实习那会,二哥差点被辞退!
共 2874字,需浏览 6分钟
·
2021-07-27 09:21
大家好,我是二哥呀!
奇怪啊,最近好多同学来问我,“二哥,伪大一,新手小白,我该怎么提高编程能力呢?”
我只想说,假期不好好玩,净想着学习啊!
其实很多初学者在学习编程的时候都会遇到困难,我也不例外,我想原因可能是一开始根本没搞明白学编程到底是学什么吧。
说实话,真的是,我上大一的时候是调剂到计算机网络专业的,懵逼得很。
话说,这年头还有人被调剂到计算机专业?
只能说,我们学校当年(13 年前)太没有远见卓识了,竟然把计算机专业当做是备选项,这等好事竟然被我碰上了。
其实,我上大学那会,不管录取的是哪个专业,都是懵逼的,如果录取的是机械自动化,也是懵逼的,那会知道个啥呀。
视野完全没打开,觉悟更是没有。
从小到大的学习,都是在学习课本上知识(没讲过计算机)。上课前稍微预习下,上课的时候就听老师讲,下课就做做作业,然后是复习考试。
如果上课的时候不专业听讲,其他全部抓瞎,作业不会做,考试也一样。
然而,十多年的编程经验告诉我,编程不是知识,只看只听根本就学不会。只靠上课的时候听老师念 PPT,或者上网课看视频教程,就只能是上完课就忘,真正自己动手敲代码的时候,完全没有思路。
为什么会这样?
我们得搞清楚,计算机科学是知识。
比如说 CPU,全名叫中央处理器(Central Processing Unit),是计算机最重要的核心组件,计算机的所有“计算”都由 CPU 来完成。
CPU 的内部由成万上亿个晶体管构成,从功能上划分的话,CPU 可以分为寄存器、控制器、运算器和时钟,各个部分通过电流进行连接。
寄存器用来暂存指令和数据; 控制器负责把内存上的指令和数据读入寄存器,并根据指令的执行结果来控制计算机; 运算器负责对寄存器中的数据进行计算; 时钟用来发出时钟信号,时钟信号的频率越高,CPU 的运算速度就越快,因为在一个时钟周期内,CPU 只能完成一个基本的动作,所以很长一段时间内,我们评断一台计算机性能好坏看的就是 CPU 的主频高低。
你看,这是知识。
编程是知识吗?我认为是手艺活,唯手熟尔。
看是看不会的,必须得练。
这里讲点怪不好意思讲的话,我上大学那会,确实没怎么学,整天就抱着笔记本电脑打游戏,极品飞车、忍者神龟、NBA 2006、三国群英传等等单机游戏,是我的最爱,因为不需要拼手速,我这个游戏黑洞还可以应付。
以至于参加工作那会,慌的一笔,一开始总怕因为能力不服被劝退了。
刚进公司实习那会,就经历了三次笔试摸底,第三次考完后,领导直接找我谈话了,说我题没作对几道,当时吓得我,晚上一个人躲在被窝里偷偷抹眼泪。
心想这次真完蛋了,万一被辞退,回到学校,简直丢人!
第二天,领导和领导的领导,当着我(战战兢兢)的面,拿着试卷,谈论我的去留问题。说实话,经过一夜的折磨,我已经不抱任何希望了。
看到最后一题,领导的领导说,“老潘(我领导),你看,小王这道题的答案在背面啊,你怎么没注意看?”
“哦,我看看,我以为他没答呢。”领导说。
“嗯,这道题答对了,你回座位上吧,可以留下。”大概 20 秒后,领导说了这句话,并看了我一眼,示意我离开。
卧槽,20 秒的时间,我感觉特别煎熬,仿佛命运的咽喉被摁住了一般。
就这样,我灰溜溜地回到了座位上,心里一万只草泥马在崩腾。那个画面至今印象深刻,终生难为。
后来,我就下了狠心,各种抄代码,先让自己成为一个能完成任务的人再说其他的。这事我之前也给大家提到过,真的是抄了大量的代码,短时间内成长特别快。
我这算是走的极端,就是完全抛开读书学习,当时互联网上的资源还比较匮乏,不像现在有 B 站、有慕课、网易云课堂等等,所以视频教程也没有。
动手练习的好处就是,攒了一大堆的小车轮,工作的时候,直接从自己的代码库里把轮子搬出来改改就可以了,基本上没有遇到过解决不了的问题。即便是有,钻到源码里一看,问题就找到了。
练习一定要循序渐进,一开始不要啃太难的项目。
就从 Hello World 开始,然后是条件分支,循环语句,然后是字符串操作啊,集合框架的使用(涉及到排序、查找等基础算法)啊;可以尝试做个科学计算器,会用到堆这个数据结构。
之后再练习网络编程啊、Socket 通信啊,做个但客户端和服务端的聊天室。
然后是 NIO、BIO、AIO,写个文件操作的工具类啊;把聊天室的内容存到文件里呀;
再找个 Netty 框架方面的项目练手下,如果你没有研究过 Netty,那就算不上是一名合格的 Java 工程师。会了 Netty,就可以实现自己的 HTTP 服务器、FTP 服务器、RPC 服务器等等;很爽的;
接着是并发编程,并发编程是 Java 中的难点,因为它涉及到操作系统、内存、CPU 等计算机专业比较核心的内容,比较考验一个程序员的内功。
练习并发编程最好的方式,就是聊天室升级到多对多的模式。
之后,就可以到 GitHub 上把 vhr、mall 这样的练手项目拉下来练习了,学会如何使用 Spring、SpringMVC、MyBatis、Spring Boot 等开发框架,这期间,会涉及到 Swagger、Logback、MongoDB、ElasticSearch、Websocket 等等,学会了这些,你已经是一个成熟的 CURD Boy 了!
坚持做大量的练习,可以用代码行数来评估,少说的话,一年也得写个 50000 行吧,有毅力的话可以挑战 6 万行、7 万行等。
我说的这个代码行数,千万不要以为是写一万行 Hello World 啊,这样理解的话,那可真的是没救了。
要写有效的代码,这是增强自己本领的,可不是拿来充绩效的。
实践出真知,练习出大牛。
当然了,只练不读经典书的话,也会有一些问题的,比如说基础不扎实,一些计算机科学的理论知识容易被忽略,那么后期一定要补上。
我现在就是在补,读很多经典的书,比如说 CSAPP,这里面也有很多例子要敲。
说到这,顺带再给你推荐一些练手项目吧,可以 fork 下改一改,即便是看一看源码,也能提高代码能力的。
Blade:基于 Java8 + Netty4 创造的轻量级、高性能、简洁优雅的 Web 框架:
https://github.com/lets-blade/blade
datastructure:用 Java 实现的数据结构以及算法练习。
https://github.com/buptdavid/datastructure
NettyRPC:基于Netty构建的RPC系统,消息网络传输支持目前主流的编码解码器。
https://github.com/tang-jie/NettyRPC
静下心来,别浮躁,不管你起点再低,只要自己肯下劲,学编程是最容易改变命运的一个手艺活了。
嗯,比搬砖强😜