2023/11/3整理知乎
C语言必背代码
https://zhuanlan.zhihu.com/p/555944918
Github使用指南
https://www.zhihu.com/question/21669554/answer/790851463
自学问题
https://www.zhihu.com/question/628134205/answer/3271607097
指针的学习
https://www.zhihu.com/question/432288840/answer/1791510455
编写C语言程序时必须有#include<stdio.h>这一行吗?为什么有时候不需要?
https://www.zhihu.com/question/21287371/answer/2819849667
自学建议
参加计算机类竞赛!!!参加ACM、蓝桥杯、Kaggle、阿里天池、百度之星大赛等
补全学校计算机教育缺失的课程,学习Linux、shell脚本、vim、版本控制git、远程服务器访问(SSH)、Docker,这些学校不会教你,但是却是程序员开发必备!
学好计算机网络、操作系统、数据结构与算法和计算机组成原理四门计算机核心课程
做计算机类的项目,创业项目也好,实验室项目、github项目也罢,尽可能折腾,积累项目和实战经验,为将来找工作打好项目基础,还能锻炼实践能力。
很多学校就是孤立的学了一堆 操作系统、计组、体系结构、编译原理、C、汇编,但是很少有同学能把这些课程连起来形成CS体系,这方面 CMU 的神书神课《CSAPP》又要提下了,幸好我们学校开设了《系统级编程》,教材就是这本书,其它没有开设这门课的学校建议学弟学妹们自学。
我个人觉得大概这样设置CS课程更为合理: 大一上:C/C++程序设计、高数1(初等微积分)、离散数学 大一下:数字逻辑、数据结构、汇编语言、面向对象编程(Java/C++)、高数2 、线性代数 大二上:软件工程、数据库、Java/Python Web开发、组成原理 大二下:操作系统、计算机网络、系统级编程(CSAPP) 大三:软件测试、软件安全、课程设计、密码学、图形学等选修方向 大四:实践、毕设、实习 另外,还有最大的问题就是OS、网络、数据库等CS核心课程上成了文科!缺乏一些动手实践Lab,大部分都是写实验报告,就是不写代码。
上课顺序
初学看视频
提高看经典书 + 源码
提高编码能力靠多写
多做国外硬核的Lab
看大量C语言和系统底层方面的书籍,比如《CSAPP》、《汇编语言》《程序员自我修养》、《C和指针》、《深入理解C指针》等,才勉强说对于内存、指针这些彻底搞懂了。
二。《程序员自我修养》+ 《Unix环境编程》
三。数据结构与算法
《算法第四版》、《算法导论》、《剑指offer》
刷完基本面试找工作笔试面试都不怕了。
找工作的话,还需要刷大量的题,至少200道leetcode吧
四、组成原理与体系结构
《计算机组成与设计:软硬件接口》、《编码》、《CSAPP》
五。操作系统操作系统我推荐 看书 + 做lab的方式,比如 MIT6.828 xv6书可以看《现代操作系统》,如果你想学个os,可以看《操作系统真象还原》我当时应该是看了不少网课,然后自己跟着教程”抄了“一个 mini os。学习操作系统一定不要去死看书,最好跟着那种有配套实验完成一个os的课程或者书。
六、计算机网络
推荐《计算机网络自顶向下》、《TCP/IP详解》
七、编译原理
直接看龙书就好了,想写脚本可以看看《自制脚本语言》
推荐大家花在「基础 : 领域知识 : 技能」 接近 7 : 2 : 1。
如果让你重新开始学计算机,你的学习路线会怎么选择?
首先学好计组,同时也能够学习C语言并能深刻理解指针以及访存等操作。这里推荐一本yale patt的《Introduction to computing system》,中文译本为《计算机系统概论》。这本书包含计组、C/C++和常见的算法数据结构等内容,从底层门级电路到组合时序逻辑电路,再到微体系结构(多周期控制通路能够很好地理解state machine)、体系结构详细讲述了计算机系统的底层。另外搭配CSAPP《深入理解计算机系统》即可以无缝衔接,完美地弥补了计组部分的欠缺(这一部分用y86讲流水书上并没有讲清楚,且用cisc风格的isa来讲如果单看书的话对于初学者来说是不利的)。同时书中还包括之前所学的二进制相关的内容,浮点IEEE754,Cache,虚拟内存,编译链接,网络编程和系统编程等导论性质计算机系统的内容(对这些内容有大致的了解之后可以再进一步针对具体方向进行学习)。实际上CSAPP计组部分可以不看,想要学扎实,为os做好铺垫可以再看Patterson的两本书《计算机组成与设计硬件:软件接口》和《计算机系统结构:量化研究方法》,对IC方向感兴趣可以选看姚永斌的《超标量处理器设计》。推荐计组和体系结构相关的两门课,UCB的CS61C和CS152。CSAPP可以搭配课程CMU15213以及配套实验。认真学完并掌握以上几本书之后可以获得扎实的计算机系统和基本的PL以及算法数据结构的基础了。进一步学习os,可以看OSTEP《操作系统导论》,这本书建议看英文原版,中文版内容和图片有删减且翻译不够准确。在学习的过程中理论需结合实践,可以搭配作者remzi的CS537视频来食用,并通过阅读xv6源代码来实践,进一步可以做一下MIT的6.S081实验来为xv6添加新的功能。做该实验需要riscv的基本知识,想必大家已经能通过前面的阅读掌握了。如果还沉浸在其中,可以再去b站上观看蒋炎岩老师的操作系统课程。趁热打铁,看一下APUE《UNIX环境高级编程》学习一下系统编程。学完计算机系统基础的内容之后,可以刷力扣实践算法理论,建议理论实践同步进行,保证hot100以及剑指offer刷熟练(面试会要求有基本的算法数据结构基础,如果实在撕不出来,也得有自己的思路)。计算机网络建议看《计算机网络:自顶向下方法》学习一下常见的网络协议和网络层次结构,然后再学习UNP《UNIX网络编程》,掌握基本的网络编程知识,这时候可以实践理论写一个webserver(这个项目将技术栈整合到一起,是前面理论学习的试金石),这时候可以在做项目的同时学习http协议,醍醐灌顶!推荐课程斯坦福的CS144。数据库可以搭配帆船书《数据库系统概念》,对DB方向感兴趣想深入,推荐CMU15445这门课程。有了计算机系统的基础之后,想必会能够更好地理解数据库的底层(如Buffer pool),另外SQL可以在力扣上实践。PL方面的比如cpp,我认为语言不是限制我们技术栈成长的关键因素,最重要的是扎实的计算机基础。cpp可以不用专门去买几本书来通篇学习,现在可以通过gpt针对某个具体的问题来进行学习,比如常见的cpp11语法糖等,如果底层一点内存模型或者虚函数表这些也还是需要看《深入探索C++对象模型》强烈推荐!其次时间充裕建议阅读《STL源码剖析》以及《effective c++》培养良好的编程习惯,这样写起来才不会底虚。如果打算在这个方向上发展,建议学习google的cpp编程规范。一句话总结一下这个部分,实践永远比看书来的更快。建议把设计模式都掌握一下。补充一下学习方法,首先工具是非常重要的,可以提升日常的效率进而提高整体的效率,比如熟练使用linux常用命令,vim,shell脚本,gdb等,针对这一部分可以学习MIT的6.NULL课程。其次一定要带着问题学习,盲目地去从头到尾阅读会浪费很多时间!我也总结了一些我常用的工具的笔记还有我春招面试总结的非常详细的面经,如有错误还请指出,见谅。
《计算机是怎样跑起来的》这本书相对比较基础,描述计算机各个方面。从单片机电路开始,汇编,结构化程序,数据结构于算法,面向对象,数据库,TCP/IP原理,加密解密,XML,软件工程统统有清晰描述,易于理解。在知识的整体理解基础上再阅读文档,学习编程会事半功倍。所以而推荐本书。
随着年龄的增长,快速学习的能力肯定会下降,即便是那些顶级学者和技术大神也是如此。所以人的成长必须要有积累,快速学习能力的下降要靠对问题的理解深度和思维的广度来弥补。