关于java:我的编程能力从什么时候开始突飞猛进的

1次阅读

共计 5147 个字符,预计需要花费 13 分钟才能阅读完成。

有干货、更有故事,微信搜寻【编程指北】关注这个不一样的程序员,等你来撩~

知乎上有个发问:

你的编程能力从什么时候开发突飞猛进?

感觉挺有意思的,所以棘手答复了下,同时也发到我的博客上来,这篇文章纯碎是记流水账,也没什么干货

大家就当看个故事~

注释

啃完一本本书,做完一个个 lab,没有突飞猛进,一切都是质变最终累积成量变。

然而有那样一些工夫节点,你会显著感觉到本人的编程能力的确有进步不少,可能编码实现更多的想法,承受新常识的速度也会放慢,我想这是不是就是零散的知识点逐步连成线、组成面呢?

不过诚实说,就编程能力上的确没有“突飞猛进”的感觉。

咱们都是一般的剧本,不可能像张无忌一样因跌落悬崖,意外获得《九阳神功》,从此突飞猛进、开挂,走向人生巅峰。

只有靠一直的看书、coding、学习优良开源我的项目,构建本人的计算机常识体系,并且在特定的畛域一直专研,这样能力成为一个优良的工程师。

上面聊聊我本人的编程学习之路吧。

迷茫的大一

我在大学之前齐全没有编程教训,高考后,填的业余前几个也是清一色的传统工科,被软件工程录取纯碎是意外。

过后甚至很放心齐全没有编程根底的我,上大学会不会跟不上,还因为思考过复读,当初想想也是天真。

大一开学,第一门编程语言就是学的 C 语言,怎么说呢,老师讲的,书上写的我都能看懂,然而让我写一个大的程序,我就摸不到头脑。不知从何下手,学了半学期,也只能写写课后习题,算算水仙花数什么的。

而且过后对计算机不足零碎意识,即使我记住了指针就是变量地址,也很难了解它到底有啥用。甚至分不太清数组和指针的区别,以至于会呈现对函数局部变量取地址返回这样当初看来很低级的谬误。

大一上考完 C 语言后,我便在心里默默念想,这辈子再也不写 C 了,但没想到的是,起初这成了我最爱的一门语言。

大一下,开始学习数据结构与算法、数字逻辑这些计算机外围课了。

此外,还学了一门过后我看来十分牛逼的语言:Java。

为啥说我过后感觉它牛逼呢?

因为刚经验过 C 语言的残害,发现 Java 有丰盛的类库,各种不便的工具类。

再也没有指针了,变成了对象援用,几乎是新大陆。

所以我学得很认真,还记得过后看过马士兵的 Java Se 教程,不过当初马老师曾经进去单干了哈哈哈。

本人也用 Java 写了不少好玩的货色,比方联机五子棋、HTTP Server 等等。

这让我第一次感触到编程这么乏味,俗话说趣味是最好的老师,Java 也算是帮我解锁了对于编程的趣味。

在学 Java 的时候喜爱在网上搜材料,但总感觉各种博客上的常识过于零散,为了“精通”Java,我在知乎搜寻各种书单,先后看了《Java 编程思维》《Java 核心技术卷》《Java 并发编程》好几本书,盲目 Java 根底还算能够,不过当初曾经快两年没写了,至于起因前面会提到。

就这样来到了大一寒假,在家切实没事干,过后感觉开发 APP 好牛逼,于是开始自学了安卓,并写了点 APP 玩,比方天气、贪吃蛇,当初他们还躺在我的 Github 上。

不过学了一段时间,本人就感觉不太喜爱客户端开发,仿佛写 APP 那点成就感被消磨耗尽了。

于是大二开学就开始学 Java Web,从 Servlet 到 SSH、SpringBoot,基本上都过了一遍,甚至还买了本当初看来很脑残的书《Java Web 整合开发 - 王者归来》,就是上面图中那本:

起初,越来越感觉这条路就是在学各种框架,尽管学到了货色,然而总感觉不太对劲。

同时,大一寒假有大四学长学姐在学校广场摆摊卖书,我也买了些,其中有一本就是被称为计算机专业神书的 CSAPP。

疯狂尝试的大二

大二时,在上一些无聊的课时,我总把这本书带着,每节课可能会翻个几页,那时候看到外面的汇编、内存治理、存储器档次我是真的云里雾里,因为还没学操作系统,C 语言也学得很差。

所以断断续续的看了几章,说不上学到了什么,但让我对这种干燥的基础知识第一次产生了趣味,有一种想彻底搞懂它们的想法。

起初在知乎大佬的指引下,为了看懂这本书,去看了王爽那本《汇编语言》,也在上图。

重学了 C 语言(次要是指针和内存),因为曾经学了汇编,指针对我再也不是问题了,同时看完了《C 和指针》、《C 专家编程》、《C 陷阱与缺点》,对 C 语言应用得也更加的纯熟。

大二那段时间,学院里忽然刮起全员学机器学习的风尚,尽管不至于全副,然而真的是很多人都在学,明明 16 年大一时客户端安卓开发还挺火的,到了 17 年各种机器学习、神经网络就席卷而来。

不能不感叹,IT 行业突飞猛进呀,不学习就可能被淘汰。

当然了,我也不例外的退出了,先后看了些吴恩达的视频、西瓜书。

跟着做了手写数字辨认这种入门必做的我的项目,然而起初总感觉对机器学习、深度学习提不起趣味,起因之一就是我感觉无奈齐全把握每一步,理解每一步背地的原理,再加上本人数学也学得不太好,这让我学得很没底气。

于是机器学习之路也止于大二。

大二是学习内容最丰盛的工夫,过后室友用 Python 写了抢课脚本,感觉很好玩。

而后本人又跑去学 Python,学爬虫。

写了一堆爬虫,什么爬豆瓣电影、知乎答复、抢课脚本,玩了一段时间也没太大趣味了。

工夫来到了大二下,依照课程安顿,开始上操作系统了。

于是我又在知乎搜寻「操作系统怎么学」,不得不说知乎上各位前辈大佬的答复对我的指引作用极其的大。

顺着一堆答复,我发现原来还能跟着他人写一个 mini OS,这对我吸引力太大了。

于是我买了一本《操作系统真象还原》,这本书真的十分认真,把写 OS 须要用到的前置理论知识、Intel 手册、汇编、内联汇编全都给你讲清了。

我一路跟着书写,写到了汇编开机打印出我的名字,再到起初进入 C 语言写内核各个模块,写到内存治理我就中断了,没有持续写下去,这也算个遗憾吧。

这本八百多页的书,我花了两个月工夫啃了五百多页,一下课就跑去图书馆,在我的虚拟机中跑 qemu,那时候就沉迷在相似下图这种界面:

过后我真的对这个出神了,为了写 mini os 我还去看了 Linux0.11 的局部代码,看了哈工大李治军老师的 OS 公开课,起因就是哈工大 OS 实验课是用的 Linux 0.11 来魔改。

还很奇葩的把我 QQ 签名改成了 jmp 0x7c00

(PS: 这句汇编就是跳转到 0x7c00 地址,BIOS 开始疏导操作系统

于是就这样,我越来越喜爱偏底层一点的货色,所以决定走 Linux C/C++ 路线,然而当初看来的确太年老了,Linux C/C++ 在鹅厂好多也是用来写业务滴。。。

大二下在知乎、牛客网搜寻学习路线,我大略分明了须要看些什么书(搜寻 敲黑板,肯定要学会被动搜寻各种信息。

专一的大三

于是在大三左右开始了十分规范的 Linux C/C++ 学习之路:

前前后后看了《C++ Primer》、《APUE》、《UNP》、《深度摸索 C ++ 对象模型》、《STL 源码分析》、《C++ 设计与演变》、《Linux 内核设计与实现》、《Linux 内核齐全正文》、《effecitve C++》、《effective modern C++》、《程序员自我涵养》、《Linux 高性能服务端编程》、《Linux 多线程服务端编程》(知乎陈硕大佬写的)……

顺便还看了点 Muduo 源码,本人模拟着基于 Epoll 写一个 Reactor 模型的 Web 动态服务器,跟着知乎 Milo 大佬写 Json 库,总之,这段期间是写了一些小”轮子“的。

(PS:知乎上有敌人问我是如何看完这么多书的,其实在之前的文章中就写了,看书我会有抉择的挑章节看,不会从头看到尾的,而且大三开始课就少了,我根本就在刷这些书,其实工夫还蛮多的?毕竟我也没加入什么社团、学生会之类,也没女朋友。。。

那时候会每天记录看书的进度,感觉特地有劲:

书看得越多,其实你越能找到本人的方向,大三上我就给本人学习定位:

深刻 C ++ 语言(多线程)+ 存储(学习 Redis、leveldb)+ 网络编程(学习 muduo,各种网络编程模型)+ 学习分布式(MIT 6.824、ddia、google 三大论文等)

基本上是沿着下面几个方向去开展学习的,有的看书,有的论文,也有的看博客看源码。

总之,知识面在大三一直裁减,本人开始关注学习 C10K、C100K 这样的后盾服务器开发高性能、高并发的解决办法。

当然了,还有些到当初还没开始,比方 leveldb 的源码、6.824 的 lab,可能是变懒了 ……

也可能是学习变得不那么纯碎面向技术了,变成面向工作、面向赚钱了哈哈哈。

值得一提的是,大三上咱们学院有门 System Programing 的课,教材就是应用的 CSAPP,因而我之前大二草草看完的书,得以再次打开,这一次我把附带的是个试验也挨着挨着做了,播种良多,有位运算各种奇技淫巧,有 Bomb lab 刺激的打怪通关、也晓得了 buffer overflow attack…. 还有实现根本的内存治理等等。

印象最深的便是做 bomb lab,一个个 phase 的通过真的很让人兴奋,我简直是熬夜连着把这几个 phase 过掉的,当然头发也没少掉。

过后还在简书写了个万字长文记录:

再到起初,我拿到了微信实习 offer,而后顺利转正。

在我大三下拿到实习 offer 后,开始做一些国外计算机课程 lab,一方面有钱赚,而且还不低,靠这个我在大三下就实现了经济独立,另一方面这些 lab 有些很有意思,对进步根底和编程能力很有帮忙。

在这里列举一些我做过的感觉有意思的 lab(之前有篇文章写过):

第一个是文件系统

这个玩意挺有意思的,就是要让你本人去设计一个文件系统,比方文件、数据块、目录等等,而且你要提供创立、读写、删除、随机读、随机写等等接口,而后通过 Linux 的 VFS(虚构文件系统)机制挂载到 Linux 内核中,而后就能够用零碎调用 open、read、write 这些来在你的文件系统上进行读写。VFS 是 Linux 一个机制,它规定了 IO 接口,而后你去实现这些接口,你就能够挂载在下面。通过这个货色我深刻的学习和理解了文件系统,报酬也是十分值的。

第二个是 SVC

就是版本管理系统,相似 SVN 和 GIT 的,然而绝对 GIT 做了很多简化,外围的就是创立分支、分支合并、回滚、commit 这些,通过这个我又去具体理解了 GIT 的实现原理,并且本人写了一个简略版本的 GIT,受益匪浅,也赚到了几千大洋。

第三个是操作系统的锁实现

这个就是让你基于硬件的原子指令 xchg、cmpxchg 这些实现一个锁,这个须要内联汇编、汇编等常识,几乎是硬核!!!做完这个也解开了我对锁实现的一些纳闷。

Web Proxy

这个就更有意思了,要求用 C++ 写一个代理服务器,相似 Nginx 的代理性能,当然,相比 Nginx 弱鸡很多,

然而麻雀虽小,五张俱全,而且老外最有意思的是要求代理服务器对一些图片和 HTML 恶作剧,就是代理服务器随机的在原始服务器,返回的响应里 插入一些图片和文字,因为那天是愚人节。。。不得不说老外还是很乏味的。

还有模仿实现 TCP 牢靠传输的

这个就更硬核了,人家老外老师就是给力,间接做了一个网站,这个网站你能够通过 TCP 连贯下来,而后你须要运行几个节点,相互发消息,他们之间的音讯都会通过老师的网站,所以通过网站上是能够管制丢包率的,也能管制节点的拓扑构造,要求就是让你基于这种不牢靠的信道,做出牢靠数据传输!这几乎就是翻版 TCP 嘛,超时重传、ACK、滑动窗口啥的都给我上!就是像上面图中一样,圆圈就示意你可达的范畴,不同节点造成各种网络拓扑,能够调节网络 丢包率 Loss chance。

当然也有很多写算法的,数据结构实现的,图搜寻的,也有做机器学习、深度学习的,反正各个方向都有。

做这些 lab 真的实实在在的进步了我的编程实际能力,也算是测验了后期看那么多书还是有成果滴。

所以写了这么多,再点次题吧,我认为本人编程能力突飞猛进就是在看完一本本大黑书、做完一个个 lab、写下一行行代码之后。

附录

附上大学期间买的一些书,毕业的时候大部分都卖了,因为切实不便携带:

这是带去图书馆自习室的书(常占地位)

这是毕业整顿的书:

买这些书花了我不少钱,大家都晓得计算机这些书一本就是五六十、七八十起步。大学四年光买书就花了几千块。不过我始终认为这也是我花的最值的一笔投资。

当然了,我还有本人整顿的电子书库,绝不是在网上那种打包下载的,而是本人须要学到某个方向常识的时候,须要看了,去网上挨个找的,最初汇总而成。这部分我是会一直把它欠缺的,当成本人的小电子书库,不多,但贵在精。

最初真心想说一句,滴水穿石非一日之功,学习计算机还是须要沉下心来好好啃书、看源码、写“轮子”。

逐步构建起属于本人的计算机常识体系,而后抉择一个业余方向一直专研。

欢送各位去知乎看原文,顺便帮我点个赞呀,拜谢!

你的编程能力从什么时候开始突飞猛进?

文章继续更新,全文首发自我的集体公众号,能够微信搜一搜「编程指北」第一工夫浏览

正文完
 0