图:石头哥课程大作业 Demo
在正式文章开始之前, 送大家一本个人收藏的算法笔记,对于算法薄弱或者想要提高数据结构算法基本功的同学都十分受用:
另外,这两份基础总结也挺不错,分享给大家,点链接领取:码农必备 计算机基础知识总结.pdf 和 操作系统总结.pdf
背景
熟悉石头的朋友知道,我本科就读于某985(CSU,专 “教如何打 CS” 的大学,也称“长沙左家垅男子高等职业技术学院”),然后硕士保送到某 Top2(THU,也叫“北京五道口职业技术学校”)。
我的专业就是软件工程,算是科班出身,在“上学”这件事情上,我自认为不算特别牛,但对自己也还算相对满意(主要是周围太多牛人了,得学会知足常乐 )。
我出生农村,正所谓「穷人家的孩子早当家」,自知不是特别聪明,但也还算勤奋努力,从高中起到读完研究生,都没花家里钱,基本靠各种奖学金维持,硕士毕业时还有一笔不小的存款。毕业 2 年半后,靠自己勤奋努力在北京买了个小窝,从此当上了房奴。
硕士毕业之后,石头也一直从事编码相关工作,从大一开始接触计算机,至今也有 10+年头。计算机相关专业有一个明显的好处,就是你在大学所学的相关专业知识和你就业联系得很紧密。所以,在学校的时候,专业课就一定要好好学习和理解。
其实,这也没关系,从看到这篇文章的时候开始,就积极准备,弥补相应的专业知识即可。
要知道,一方面,很大一波人经历了残酷的高考后,进入大学就显得比较松散了,而此时只要你绷紧“积极主动学习”这颗弦,就已经战胜了不少人。
另一个方面,虽然科班出身有一定优势,(至少之前有接触过有一些概念),但如果不经常在某个环境中熏陶,也比较难深入掌握某个知识点的(现在比如让你回想大学学的专业课你还记得多少?)。事实上,有很多大牛其实也并不是科班出身的。
下面,我将从以下这几个方面,谈谈自己的理解:
如何入门、提高兴趣?
首先,“编程”的门槛相对较低,你看外面的培训机构早就从成年人延伸到越来越多的中小学生,甚至“少儿编程”了。既然“少儿”都学,难道你还不能学么?
但整体来讲学习“编程”,特别是到后面进阶(例如数据结构和算法),是相对比较枯燥的。所以就要想办法来提高自己的兴趣,或者说通过一步步学习来获得“成就感”反向刺激自己主动多学习。
关于入门的编程语言,我觉得不要太局限,不要太限制自己非得用某个语言入门,可以根据自己的实际情况来选择。不过整体来讲,如果之前完全是小白,我推荐比如用 Python 等先对编程语言有个大体的了解。
掌握了一门编程语言后,其他语言都是触类旁通的,无外乎就是“顺序、选择、循环”,不同编程语言的具体语法不一样而已。然后对于常规的面向过程的 C 语言,或者面向对象的 Java 等也建议都了解和学习一下。
记得我当初上大学的时候接触的第一门编程语言就是“VB”,我想学校安排的课程先后顺序还是很有道理的。用 VB,在 VisualStudio 上简单用鼠标拖一拖就能出来一个有用户界面、可交互的像模像样的“软件”,这对于上面提到的用“成就感”来激励自己主动多学习还是很有效果的。
比如当初课程大作业就是写一个计算器,通过短时间的入门学习,就能写一个这样的计算器软件出来,确实还是颇有成就感。这其实就跟现在的少儿编程一个道理,用一些可视化的编程平台让小朋友通过简单的拖拽,加上少部分逻辑就能出一个非常“炫丽”的效果,就跟玩游戏一样,这当然能激发足够的兴趣。
再比如刚开始入门就选择 C 语言或者汇编,这对于提高兴趣、想获得“成就感”来起到激励作用就大打折扣了。我记得当初课程学习 C 语言时,最后作业都只有在黑屏控制台下,虽然也能完成差不多的功能,但从“可观赏性”来讲就差太多了。
小结一下,入门编程,就是先学一门比较好上手的编程语言,通过尝试写一些有用户界面(比如 HTML+JS)的小项目、小 Demo 来激励自己。
积累专业知识,重视基础
有了一两门编程语言作为基础后,这个环节就是真正体现编程水平的时候,也是最能和其他人拉开差距的部分。
有哪些专业知识呢?就以我本科 CSU 大学给安排的课程来挨个阐述。我还特意去翻了下我之前的成绩单,有各个学期的各个课程安排。
可视化程序设计基础:其实就是上面提到的 VB,通过可视化的效果来正向反馈自己学习。其实,也可以通过比如用 HTML+JS 来体验一下,对“编程”有个直观感受作为入门也不错。C/C++程序设计基础:C/C++ 还是非常基础的,建议入门编程之后都掌握一下。离散数学:离散数学对锻炼逻辑思维等还是有很大的帮助。印象中当初老师直接在课上跟我们玩了一个“数十八罗汉” 游戏,就利用了离散数学里面的思想让老师能够保证赢。数据结构:这个不言而喻,后文详述。算法分析和设计:这个不言而喻,后文详述。汇编语言程序设计:这门课程有利于让大家理解自己写的代码是怎样被计算机认识,底层是如何运转的。推荐学习,书籍可推荐王爽的《汇编语言》。操作系统:随便列几个话题,看看其中的分量。进程、线程、死锁,内存管理、进程调度、任务调度等等,是不是现在工作中也离不开。推荐参考书籍如:《深入理解计算机系统》、《操作系统导论》。计算机网络:TCP/IP,路由,网络 7 层/ 4 层协议,HTTP,DNS 等等。推荐参考书籍:《计算机网络-自顶向下方法》、《TCP/IP详解》等。数据库系统:ACID,做开发也绕不开的话题。推荐书籍:《数据库系统概念》、《高性能MySQL》等。编译原理:跟上面的汇编一样,有利于了解程序背后是如何运转。这门课也比较难,印象中是我当初所有专业课中,本人考试得分最低的一门, 。词法分析、语法分析、语义分析,中间代码生成优化等等。建议一般人有个大概了解。推荐书籍《编译原理》。以上是我挑选的部分专业课程,其中相关书籍的推荐仅供参考。其他的课程还有诸如:计算机图形学、软件测试、软件体系结构、设计模式、软件度量和应用等。
上面的书籍,经典的还是推荐大家购买实体书籍仔细研读,网络上也能搜索到电子版,这里就不传播盗版资源了,需要的同学可以找我(+【codershitou】),供私下学习交流使用。
这里给大家分享我收集到的觉得质量还不错的程序员必知的硬核基础知识,看完能让你对计算机有一个基础的了解和入门,内容基本上涵盖了计算机所有基础知识,从 CPU 到内存、讲解什么是二进制、磁盘、压缩算法、操作系统、汇编等知识。
操作系统总结 pdf 内容涉及 认识操作系统、进程和线程、内存管理、文件管理、I/O、死锁 以及常见的 操作系统面试题等。
另外,计算机网络的话,推荐朋友小林写的图解网络,该图解网络系列大获好评,把计算机网络重要的知识点都安排了一遍,而且还写的非常易懂。
从中可看出,正如我前面所说计算机相关的专业基础知识和就业联系得很紧密。如果是在校生,就一定不要浪费时间、抓住这些专业课程的学习机会。不然毕业后从事了编程这个行业,也还是会回到这些基础知识上,正所谓“欠下的债,迟早都是要还的”。
况且,学校的课程学得好,还能帮助获得奖学金、保研、找工作等等,一举多得,何乐而不为呢?
就拿我来说,自认为不是特别聪明,但我足够努力呀。因我出生在农村,接触电脑比较晚,但在大学的时候相对比较勤奋,学好专业课程,各种奖学金拿得手软(得交学费呀,软件工程专业的学费可不便宜呢),最后又成功保研清华。当然,考得好就不一定等于专业课程学得好,但学得好总是对自己有好处的。
其中,上面提到的“’数据结构和算法”这个确实是我认为的重中之重,就算在精力有限的情况下,其他可以放松些,但也不要放过这个话题。从我之前写的《有了这份程序员面试指南,你离大厂Offer还远吗?》 这篇文章中也可以看到,数据结构和算法一直是各大公司面试考察的重点。
好在现在网络资源很发达,网上有各种不错的课程可以学习。这里我推荐,清华大学学堂在线的在线课程《数据结构》,分为基础和高级上下两门课程。这门课程是国家精品课程,由邓俊辉老师讲授,在学校时,我上过邓老师的几门课程,真的很赞,他在讲授“数据结构”和“计算几何”方面拥有20多年的经验,课堂用的 PPT 和动画效果也特别赞。最关键的是,这课程可直接免费白piao,不香吗?
邓老师深受清华校内外的学生喜爱,自己亲身体验过,被实力圈粉。他在讲授《数据结构》和《计算几何》方面拥有20多年的经验,课堂用的 PPT 和 动画效果也特别赞、特别赞、特别赞(还能额外学到人文知识!)。
有很多人说数据结构和算法没用?那只是他觉得没用而已,或者他的工作当中没用而已。我一直有个观念就是,程序员这个群体本身也是符合金字塔模型的,不一定非得每个人都是编程高手,找到适合自己的,自己待着最舒服的位置就是棒棒哒。
我在之前的这篇文章也阐述了对待基础知识的看法——《从一道面试题谈谈一线大厂码农应该具备的基本能力》,因为在日常有些场景下,“复制粘贴”工程师貌似也够用了,遇到问题有更高水平的人来帮你解决就行,大家都一样的话,怎么体现高手水平呢?
不过从用人单位角度想,当然是更希望招聘更加优秀的选手,怎样体现优秀呢?候选人基数太大,怎么筛选,其实也就“高考”一样嘛,通过“考试”择优录取而已。
有时候感觉大部分程序员都被大量的需求压迫着,被产品经理催促着,仓促地码着繁琐的业务代码,不断的改着 Bug 又引入新的 Bug。业务代码重要么,当然重要(代码就是服务于具体业务的),但同时也还是希望我们不要抛弃一些基础的东西,多培养一下我们的编程素养。
我们在用编程语言,利用各种工具来实现我们想要达到的目的的时候,能做到“知其然,知其所以然”岂不更好?更何况很多时候要解决的问题,恰恰是需要上面提到的专业基础知识的积累。
积攒项目经验
前面提到的入门也好,基础知识也好,其实最终是为“项目”、为“产品”服务的。在校生或者刚入门没有“项目”,没有“产品”怎么办,那就自己制造机会。
为什么要做项目呢,因为一个完整的项目是可以比较系统的,是一个可以把理论付诸实践的机会,从某种程度上讲,做一个或大或小的项目,也能起到跟前文所说的正向激励的作用。
例如我在本科期间,就做了几个小项目,现在列举两个典型供大家参考。
例如,学完 Java 编程、数据库等课程后,是不是也可以自己来搞个小聊天工具呢?再比如,学了 Java Web 开发,是不是可以搞个类似的图书管理系统、校园 SNS 之类(当初人人网很 啊)的玩玩?
下面就来看看我上学期间搞的两个小项目吧,供参考。
ICHAT聊天系统
这个就能对自己的学习有一个阶段性、系统性的总结,在当初看来确实还是蛮有成就感的。其实做一个,各种场合都能用,比如课程 A 的大作业可以用,稍微改吧改吧,课程 B 的也能接着用,一举多得。用心做,不仅自己知识点 get 到了,各个课程作业又能得高分。
这个系统主要是仿照QQ聊天软件,其功能模块包括:私聊、群聊、语音聊天、视频聊天,用到的主要技术点:C/S 体系结构,Oracle数据库、socket、多线程、swing等等。
积攒项目经验-视频聊天(石头)
当初做完了语音、视频聊天,还是很让人眼前一亮的。当然这种小项目当初我们是几个小伙伴一起合作完成的,一般课程作业是需要在规定的时间内完成的,就可以找几个小伙伴一起学习、互相促进和成长。
你当然也可以独立完成,如果也想找小伙伴一起,也可以加入”程序猿石头”的读者交流群,找志同道合的小伙伴一起“刷项目”,共同成长、共同进步。
积攒项目经验-传送文件
看截图,是不是还像模像样的。用这个小项目来入门练手,还真是个不错的选择。有足够的挑战,同时也有足够的趣味性和成就感。
基于中国移动飞信的校园资讯网
这个项目是基于WEB网络的校园资讯网,项目分析了飞信协议(其实就是利用网络资源改写一个web飞信),利用飞信功能可以进行个人日程提醒、订阅天气、好友生日提醒、课程提醒等等;(时光荏苒,飞信?用过的说明你也“老”了)
主要技术给用户。
登录飞信-官方飞信客户端被 T 出
这个小项目也是源于生活。当初当了个小班长,每期末都要统计成绩,计算综合测评等,想想,何不写个爬虫来爬呢。有时候,程序猿的“懒”就是为了提高效率。
爬虫-爬取课表和成绩
类似的小项目可以达到阶段性总结的目的,同时自己的积累和总结也是自己的一笔财富,且无形之中可以让自己将来也获益。
个小团队,参与了大学生创新性实验项目,获得了国家 2 万元的项目研究资助,还发了小论文(虽然现在看来很水),后期在简历中也有加分。比如在我大三的时候,就获得了腾讯的实习机会,参与了真正的商业产品的开发。再后来,前面的积累又帮助我全奖保研到清华读研(清华录取外校的学硕名额是相当少的)。
勤思考、多总结
这个其实不必多说。不管那个行当,做到 “勤思考、多总结” 百利无一害。我在《10 年 bloger 告诉你要不要写博客,又该如何优雅地写博客?》 这篇文章中也提到了,我其实当初最初玩 blog,更多的就是抱着学习总结的态度。
例如,下图是我在读本科和硕士期间相关课程的学习材料,包括老师课件,课程作业和学习笔记和复习资料等,这种平日积累总结很有效,对于临近期末考试也能做到不慌不乱,还是很有作用的。
本科+硕士,课程课件等资料,可+codershitou目前我正在梳理相关的内容,后续我将逐步整理其中的精华内容,分享给大家。
哪怕正式工作之后,写周报、月报等也都是阶段性的总结,再比如晋升答辩等等都是需要你日常的思考积累和总结的。反正将来都会用得着,何不现在就开始锻炼呢。
在日常学习和工作之中,我们看到一个问题的时候,要学会思考背后的道理,比如在接到某个需求的时候,思考这个需求最终是要解决具体什么问题,有没有更好的解决方案?在阅读某段代码,思考原作者为什么要这么设计?
就比如看到这段代码,你能否多思考一下其中的奥秘?
上述代码中,比较两个字符串是否相等,按道理,其实中间某位不相等就可以直接返回了,但为啥要遍历完了再返回,这么做的目的是什么?在问了为什么之后,你可能就会知道,原来这么做是为了防止计时攻击。完整文章可参考本人写的这篇文章——《这 10 行比较字符串相等的代码给我整懵了,不信你也来看看》。
总结
整体来讲,针对“入门进阶编程”这个话题,我谈了谈自己的理解,重点还是要重视基础,通过小项目正向激励自己多主动学习,然后做到勤思考,多总结。
最后,欢迎大家关注程序猿石头,会定期分享一些技术干货、职场经验等,如果大家对阿里或者其他大厂感兴趣,也可以找我内推,我可以帮忙提供简历 review 等,再次欢迎大家和我积极交流讨论,大家一起学习、共同进步。
觉得本号分享的文章有价值,记得添加星标哦。周更很累,不要白 piao,需要来点正反馈,安排个 “一键三连”(点赞、在看、分享)如何? 这将是我持续输出优质文章的最强动力。
推 荐 阅 读
快快加入我们——“阿里云-ECS/神龙计算平台” 招人啦 面试官:会玩牌吧?给我讲讲洗牌算法和它的应用场景吧!
互联网大厂内推求职的正确姿势?
程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader。用不同的视角分享高质量技术文章,以