有干货、更有故事,微信搜索【 编程指北】关注这个不同的程序员,等你来撩~
知乎上有个提问:程序员
你的编程能力从何时开发日新月异?
以为挺有意思的,因此顺手回答了下,同时也发到个人博客上来,这篇文章纯碎是记流水帐,也没什么干货。算法
你们就当看个故事~编程
啃完一本本书,作完一个个 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.82四、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、写下一行行代码以后。
附上大学期间买的一些书,毕业的时候大部分都卖了,由于实在不便携带:
这是带去图书馆自习室的书(常占位置)
这是毕业整理的书:
买这些书花了我很多钱,你们都知道计算机这些书一本就是五六10、七八十起步。大学四年光买书就花了几千块。不过我一直认为这也是我花的最值的一笔投资。
固然了,我还有本身整理的电子书库,毫不是在网上那种打包下载的,而是本身须要学到某个方向知识的时候,须要看了,去网上挨个找的,最后汇总而成。这部分我是会不断把它完善的,当成本身的小电子书库,很少,但贵在精。
最后真心想说一句,滴水穿石非一日之功,学习计算机仍是须要沉下心来好好啃书、看源码、写“轮子”。
逐渐构建起属于本身的计算机知识体系,而后选择一个专业方向不断专研。
欢迎各位去知乎看原文,顺便帮我点个赞呀,拜谢!
文章持续更新,全文首发自个人我的公众号,能够微信搜一搜「 编程指北 」第一时间阅读