唐磊的个人博客

1024程序猿节,聊聊石头学了哪些课,屯了哪些书?

关于作者:程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader。欢迎关注,交流和指导!

本文首发于微信公众号,原文链接,转载请全文保留。后台回复关键字 “1024” 获取程序员大厂面试指南。

背景

今天 1024 程序猿节,首先祝大家节日快乐~

熟悉石头的朋友知道,我本科就读于某985(CSU,专 “教如何打 CS” 的大学,也称“长沙左家垅男子高等职业技术学院”),然后硕士保送到某 Top2(THU,也叫“北京五道口职业技术学校”)。

硕士毕业之后,石头也一直从事编码相关工作,从大一开始接触计算机,至今也有 10+年头。计算机相关专业有一个明显的好处,就是你在大学所学的相关专业知识和你就业联系得很紧密。所以,在学校的时候,专业课就一定要好好学习和理解。

如果不是计算机相关专业呢?前两天我一个公众号的读者朋友就比较焦虑,找我沟通说目前在某厂实习,因为不是科班出身,明显感觉和周围同期入职的科班实习生要差一些。

其实,这也没关系,从看到这篇文章的时候开始,就积极准备,弥补相应的专业知识即可。

积累专业知识,重视基础

专业基础知识其实才是重中之重,也是最能拉开程序猿之间差距的地方。在阿里社招面试的过程中也是非常看重基础的,过去项目不牛 X 没关系,基础知识一定得杂实。

石头在参与社招面试过程中,领导也特别交代,除了一般的沟通交流外一定要看基础,基础好,解决问题时有逻辑、有条理,简单的代码题目能写个八九不离十,基本上一面二面也就过了。

那么,到底有哪些专业知识呢?就以我本科 CSU 大学给安排的课程来挨个阐述。我还特意去翻了下我之前的成绩单,有各个学期的各个课程安排。

  • 可视化程序设计基础:其实就是上面提到的 VB,通过可视化的效果来正向反馈自己学习。其实,也可以通过比如用 HTML+JS 来体验一下,对“编程”有个直观感受作为入门也不错。
  • C/C++程序设计基础:C/C++ 还是非常基础的,建议入门编程之后都掌握一下。
  • 离散数学:离散数学对锻炼逻辑思维等还是有很大的帮助。印象中当初老师直接在课上跟我们玩了一个“数十八罗汉” 游戏,就利用了离散数学里面的思想让老师能够保证赢。
  • 数据结构:这个不言而喻,后文详述。
  • 算法分析和设计:这个不言而喻,后文详述。
  • 汇编语言程序设计:这门课程有利于让大家理解自己写的代码是怎样被计算机认识,底层是如何运转的。推荐学习,书籍可推荐王爽的《汇编语言》。
  • 操作系统:随便列几个话题,看看其中的分量。进程、线程、死锁,内存管理、进程调度、任务调度等等,是不是现在工作中也离不开。推荐参考书籍如:《深入理解计算机系统》、《操作系统导论》。
  • 计算机网络:TCP/IP,路由,网络 7 层/ 4 层协议,HTTP,DNS 等等。推荐参考书籍:《计算机网络-自顶向下方法》、《TCP/IP详解》等。
  • 数据库系统:ACID,做开发也绕不开的话题。推荐书籍:《数据库系统概念》、《高性能MySQL》等。
  • 编译原理:跟上面的汇编一样,有利于了解程序背后是如何运转。这门课也比较难,印象中是我当初所有专业课中,本人考试得分最低的一门,😂。词法分析、语法分析、语义分析,中间代码生成优化等等。建议一般人有个大概了解。推荐书籍《编译原理》。

以上是我挑选的部分专业课程,其中相关书籍的推荐仅供参考。其他的课程还有诸如:计算机图形学、软件测试、软件体系结构、设计模式、软件度量和应用等。

从中可看出,正如我前面所说计算机相关的专业基础知识和就业联系得很紧密。如果是在校生,就一定不要浪费时间、抓住这些专业课程的学习机会。不然毕业后从事了编程这个行业,也还是会回到这些基础知识上,正所谓“欠下的债,迟早都是要还的”。

况且,学校的课程学得好,还能帮助获得奖学金、保研、找工作等等,一举多得,何乐而不为呢?

就拿我来说,自认为不是特别聪明,但我足够努力呀。因我出生在农村,接触电脑比较晚,但在大学的时候相对比较勤奋,学好专业课程,各种奖学金拿得手软(得交学费呀,软件工程专业的学费可不便宜呢),最后又成功保研清华。当然,考得好就不一定等于专业课程学得好,但学得好总是对自己有好处的。

其中,上面提到的“数据结构和算法”这个确实是我认为的重中之重,就算在精力有限的情况下,其他可以放松些,但也不要放过这个话题。从我之前写的《有了这份程序员面试指南,你离大厂Offer还远吗?》 这篇文章中也可以看到,数据结构和算法一直是各大公司面试考察的重点。

好在现在网络资源很发达,网上有各种不错的课程可以学习。这里我推荐,清华大学学堂在线的在线课程《数据结构》,分为基础和高级上下两门课程。这门课程是国家精品课程,由邓俊辉老师讲授,在学校时,我上过邓老师的几门课程,真的很赞,他在讲授“数据结构”和“计算几何”方面拥有20多年的经验,课堂用的 PPT 和动画效果也特别赞。最关键的是,这课程可直接免费白piao,不香吗?

有很多人说数据结构和算法没用?那只是他觉得没用而已,或者他的工作当中没用而已。我一直有个观念就是,程序员这个群体本身也是符合金字塔模型的,不一定非得每个人都是编程高手,找到适合自己的,自己待着最舒服的位置就是棒棒哒。

我在之前的这篇文章也阐述了对待基础知识的看法——《从一道面试题谈谈一线大厂码农应该具备的基本能力》,因为在日常有些场景下,“复制粘贴”工程师貌似也够用了,遇到问题有更高水平的人来帮你解决就行,大家都一样的话,怎么体现高手水平呢?

不过从用人单位角度想,当然是更希望招聘更加优秀的选手,怎样体现优秀呢?候选人基数太大,怎么筛选,其实也就“高考”一样嘛,通过“考试”择优录取而已。

有时候感觉大部分程序员都被大量的需求压迫着,被产品经理催促着,仓促地码着繁琐的业务代码,不断的改着 Bug 又引入新的 Bug。业务代码重要么,当然重要(代码就是服务于具体业务的),但同时也还是希望我们不要抛弃一些基础的东西,多培养一下我们的编程素养。

我们在用编程语言,利用各种工具来实现我们想要达到的目的的时候,能做到“知其然,知其所以然”岂不更好?更何况很多时候要解决的问题,恰恰是需要上面提到的专业基础知识的积累。

勤思考、多总结

这个其实不必多说。不管那个行当,做到 “勤思考、多总结” 百利无一害。我在《10 年 bloger 告诉你要不要写博客,又该如何优雅地写博客?》 这篇文章中也提到了,我其实当初最初玩 blog,更多的就是抱着学习总结的态度。

例如,下图是我在读本科和硕士期间相关课程的学习材料,包括老师课件,课程作业和学习笔记和复习资料等,这种平日积累总结很有效,对于临近期末考试也能做到不慌不乱,还是很有作用的。

image-20201030232833953

目前我正在梳理相关的内容,后续我将逐步整理其中的精华内容,分享给大家。

哪怕正式工作之后,写周报、月报等也都是阶段性的总结,再比如晋升答辩等等都是需要你日常的思考积累和总结的。反正将来都会用得着,何不现在就开始锻炼呢。

在日常学习和工作之中,我们看到一个问题的时候,要学会思考背后的道理,比如在接到某个需求的时候,思考这个需求最终是要解决具体什么问题,有没有更好的解决方案?在阅读某段代码,思考原作者为什么要这么设计?

就比如看到这段代码,你能否多思考一下其中的奥秘?

public static boolean isEqual(byte[] digesta, byte[] digestb) {
if (digesta == digestb) return true;
if (digesta == null || digestb == null) {
return false;
}
if (digesta.length != digestb.length) {
return false;
}

int result = 0;
for (int i = 0; i < digesta.length; i++) {
result |= digesta[i] ^ digestb[i];
}
return result == 0;
}

上述代码中,比较两个字符串是否相等,按道理,其实中间某位不相等就可以直接返回了,但为啥要遍历完了再返回,这么做的目的是什么?在问了为什么之后,你可能就会知道,原来这么做是为了防止计时攻击。完整文章可参考本人写的这篇文章——《这 10 行比较字符串相等的代码给我整懵了,不信你也来看看》

小福利

最后,送大家一点小福利。(感觉是个公众号号主,不发个当当优惠券都不好意思了。

我把上面石头提到的书整理一下,列到下面,感兴趣的同学可以购买,可以多方对比下价格,目前当当每满 100 减 50,最后我这边有个专属优惠可再省 40 元(160 买 400),只要结算时输入优惠券码【2YDRTV】即可。营销套路,书价格自然提升了,不过整体还是有一定优惠的,当然你也可以到其他地方购买, 咱们的宗旨是哪里便宜买哪里即可。

这里是推荐的部分书单:

  • 程序员的自我修养—链接、装载与库/作者:俞甲子,石凡,潘爱民 著
  • 编程之美——微软技术面试心得(勤练算法功底强,求职入职心不慌)/ 作者:《编程之美》小组
  • 计算机程序设计艺术 卷1 基本算法(第3版)/ 作者:[美] 高德纳(Donald E. Knuth)
  • 计算机程序的构造和解释(原书第2版)典藏版 / 作者:[美]哈罗德·阿贝尔森 (Harold Abelson) 等
  • UNIX环境高级编程 第3版 / 作者:[美]W. 理查德·史蒂文斯(W. Richard Stevens)史蒂芬·A.
  • 高性能MySQL(第3版)/ 作者:(美)施瓦茨,(美)扎伊采夫,(美)特卡琴科
  • 程序员必读经典(算法导论+深入理解计算机系统)/ (美)科尔曼 (美)兰德尔?E.布莱恩特(Randal E.Bryant)
  • 弹性计算:无处不在的算力(全彩)/ 作者:阿里云基础产品委员会
  • STL源码剖析 / 作者:侯捷 著
  • 设计模式之禅(第2版)/ 作者:秦小波 著

啊,挑了半天好像最终只能选 10 本,下图是石头家书架躺着吃灰的部分书籍,也提供给大家参考。还有部分书用来垫显示器等等了,就不拍了。你也可以留言告诉大家,你的书还用来垫啥了?

以下是【博文视点】(左图)和【机械工业出版社华章公司】(右图)挑选比较经典的 CS 相关书籍,也一并提供给大家参考,趁活动价屯几本也未尝不可。

imgimg

经典书籍(点击放大扫码识别)

总结

整体来讲,针对“入门进阶编程”这个话题,我谈了谈自己的理解,重点还是要重视基础,通过小项目正向激励自己多主动学习,然后做到勤思考,多总结。

觉得本号分享的文章有价值,记得添加星标哦。周更很累,不要白 piao,需要来点正反馈,安排个 “一键三连”(点赞、在看、分享)如何?😝 这将是我持续输出优质文章的最强动力。

关于作者:程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader,欢迎关注,交流和指导!

欢迎扫码加入互联网大厂内推群 & 技术交流群,一起学习、共同进步。后台回复关键字 “0” 送阿里技术大礼包。

tanglei wechat
欢迎扫码加入互联网大厂内推群 & 技术交流群,一起学习、共同进步