学习经历感悟——基础 > 语言

前言

其实在写这类博客时,我往往不知道怎么下笔。我相信有很多学计算机或软件专业的人和我一样,都有过迷茫的一段时期。在这段期间,不知道自己该干什么,也不知道自己未来的职业规划。就问一个最简单的问题,你是想学C/C++还是Java?(因为这两个语言学的人比较多,所以举了这个例子)有的人可能面对这个问题的时候会不知所措了,我觉得这是一个正常的情况,因为我曾经也不知道该如何回答这个问题。而且,对于语言重要,还是基础(或者说是知识面)重要,在不同的时期,我的答案也是不一样的。在这里我想分享一下自己的学习经历,希望对大家有所帮助。

 

计算机语言就是计算机的全部?

我本科专业选的就是计算机科学与技术。我所接触的第一门计算机语言是C语言,其实这取决于学校的教学计划,我有个同学也是计算机专业的,但他们开的第一门课是C++。其实C/C++对于初学者而言,学习难度和学习的知识是不一样的。大一刚开始学习C的时候很吃力,因为有很多概念我都没办法理解。而且当时也只是为了过这门课而学的,心中根本不存在学习路线或职业规划。

当时对于语言,其实我不是很上心,因为大学还有其他课要上,忙着过4、6级啊,或者参加什么校内活动。大一下学期,我们就开了数据结构这门课,当时学的也是不咋样。我觉得不是老师教的不好,而是老师没有告诉我们为什么要学这门课。其实很多老师都不会告诉学生为什么要学他所教的课,每堂课只是按照教案计划上完,学生也是为了学而学,不知道自己学这个是为了什么。我相信很多人和我有过类似的感觉,特别是你在接触一个全新的知识领域时。所以,现在很多情况下,我最先思考的是,我学习它的作用是什么?我能将它应用到什么地方?这样真的能有效缩短自己的迷茫的时间。

大二的时候,我们又学习了Java,这里我就不细讲学习的过程了。反正在大学前2年的时间里,我没有花很多心思在学习语言上。虽然书都读过了,代码也敲过了,但还是有很多细节没有掌握。其实当时对语言的认知也是比较模糊的,只是知道编程需要学习计算机语言而已对特定语言的优势,以及学习该语言的规划和职业道路都没有一点清晰的认识没有认真的学语言,但当时在我的认知里,语言就是计算机的全部(因为其他的知识还没有学)。

 

基础知识 > 语言

大三刚开始,我就决定要考研了。我感觉这是我对本科基础专业课有新的理解开始。我当时的目标院校是西安交通大学,我百度了他们初试考查的专业课(计算机组成原理、数据结构和操作系统)。在确定了专业课后,我就开始阅读相关书籍。计组和数据结构在大三之前就学过了,需要从头学习的是操作系统。回顾本科学过的专业课,可以说最基本的四门是计算机组成原理、计算机网络、数据结构和操作系统。在我考研复习的时候,我有条理地看这些书,发现很多原先不懂或者迷惑的问题都迎刃而解了。

先说说学习计算机组成原理对我帮助,在学完计组后,再去看C语言的时候,对里面的内存的理解就不一样了。还有就是,学习了计组里的指令后,看每行C代码时都会想,这个指令的执行顺序是不是先这样,再这样,最终得到的结果。结合严蔚敏数据结构里动态存储管理,才知道可用空间的数据结构是怎样的,以及可利用空间表中的结点结构中的lline、tag、size、flink的作用是什么。

由于我复习相关专业课书籍,所以我开始思考原来不会思考的问题,也对问题有了新的理解。再说一个内存管理的分页存储管理问题,这个知识点是计组和操作系统都会涉及的内容,可两者的侧重点不一样(计组偏硬件,而操作系统注重设计思想)。这样将知识的不同侧重点放在一起学习,真的能让你对该问题有更深的理解。

在学习操作系统的时候也有类似的感觉,因为操作系统中会介绍很多数据结构,例如,内存管理中的页表结构,文件系统中的目录结构以及索引表结构等。当你看到这些表结构时,你都能从数据结构所学习过的知识中找到关联点。这里举一个我印象比较深的例子,就是在文件管理中的隐式连接分配,它的实现思想就是数据结构中的静态链表。我在复习3门专业课时,看的时间越长,越容易发现各个知识的交互。当我发现了某一知识的关联后,再回过头来看相应的知识,这一过程让我对原来的知识有了新的认识(有可能原来的想法是错的,或者是对某一知识了解的不够全面)。在这一段时间的学习中,我感觉基础知识比语言更重要。在后来的学习中,我经常能从新的知识中发现一些设计思想是四门基础课中学习过的。


关注实现原理

再回过头来说说语言的事,我认真开始学语言是研究生开学前的几个月。因为一战和二战都没考上交大,所以二战复试选择了调剂,最后也顺利上岸了。复试结束的那段期间,我的时间很充足(学习C++的同时还把驾照拿到手了)。当时没有学习Java的原因是因为我选择调剂的很多院校复试上机要求的语言都是C/C++。所以在复试结束后,我想继续学习C++。还有几个其他的原因,一方面是本科学C++的同学相对较多,和他们交流过后,对C++的岗位了解比较多。另一方面是我的本科毕业设计是在Linux平台下研究网络通信问题。以上原因导致我选择继续学习C++。我学习C++的方法和很多人一样,买几本书,然后在网上找找免费的教学视频。虽然这样能学到东西,但是感觉还是不够满足,心里总是感觉没有底。

研究生开学后,教研室分配项目,给我分了一个Java的项目。为了完成项目,我开始学习Java相关的知识。其实以前学Java的时候,也只是学习语法知识,很少在一个项目中用到所学的东西。在完成教研室分配的项目时,感觉Java完成功能模块是真的很方便,开发速度也很快,特别是有个学长带着我做项目,整个框架以及逻辑流程都很清晰。了解了框架后,我又自己上手做了一些功能,总的来说,只要逻辑是清晰且正确的,很快就能完成相应的功能。就算自己没法独立完成,网上也可以找到有人分享类似的代码。这和学习C++给我带来的感觉是完全不一样的,因为学习Java后,做项目很快,这给我带来了一种成就感。整个研一上学期,我的学习任务主要是学校安排的课程,项目任务是教研室分配的项目。

在这段学习期间,相对于一些概念性的知识,我更喜欢看一些语言实现方面的书籍。我想每个人都有类似的经历,概念性的知识学完后,会很想去实现它。或者自己的能力有限,但也想知道它是怎么实现的。那段时间,我看了Hadoop的分布式文件系统HDFS,其中有一个知识点就是,存储数据的服务器要和主服务器保持心跳,这样主服务器才能时刻了解数据服务器的状态。看到这样的描述后,我就开始思考它们怎样建立连接,以及心跳包的数据结构是什么?(若对相关知识有兴趣,可以看《Hadoop》,或者在网上查阅相关资料)

 

秋招反思

虽然有成就感,但有时也会觉得自己所做的工作根本不值一提(新手上手半个月可能就会了)。因为我不需要了解一些底层的细节,只需要关注应用层开发就可以了。今年秋招,学长的经历给了我一个警示。我这个学长做过的项目挺多的,PHP、Java和Android都做过,项目经历很丰富,但是秋招到处碰壁。原因就是面试过程中,面试官在问了项目经验后就开始着重问底层原理了。而我学长虽然做了很多东西,但是他对底层原理和实现不了解,导致在很多公司的一面就倒下了。而且,在听了其他学长的面试经历后会发现,越大的公司,项目问的越少,原理问的越多。

因为我之前的学习经历让我的基础还算可以,所以我比较困惑的是怎样规划我的学习路线,以及确定自己的职业规划(这里确定说的有点早了,其实是想要有个大方向)由于学校的课程安排,所以概念性的知识一直都在学习,无论是分布式还是大数据相关的知识,多多少少都有涉及所以我当时想选择一个语言认认真真的学,毕竟人的精力是有限的,不可能做到方方面面都精通这里多说一点,秋招最重要的是基础知识(4门基础课+数据库+软件工程),然后是扩展知识(例:大数据,数据挖掘,各种算法以及基础框架)。只有在笔试环节和一、二面会涉及到写代码,但手写代码很重要,因为有的面试官要是觉得应聘者写代码能力不行会将其直接挂掉。

 

决定学习路线

因为我对C++了解的比较多,还有就是学习完分布式和云计算这门课后,我对相关方向比较感兴趣,所以我现在主要学习的语言是C++。Java也学,但不会深究它,完成的工作大多是应用层的开发。其实两种语言都是各自的优势,Java在互联网市场的需求大,框架既多又好(像Spring Boot,Spring Cloud都很火),不管是大公司还是小公司都有用武之地。而C/C++的需求量就相对较少,如果想进互联网公司,基本都是大公司(小公司的需求量就更少了)。但C/C++有个独特的优势就是嵌入式和通信方向,所以中兴、华为和海康威视对C/C++程序员的需求相对而言较大。C++另外一个优势就是做服务器端的开发和底层开发,像天猫文件系统TFS阿里巴巴的OceanBase(分布式数据库,以上两个系统是开源的)都是用C++开发的。还有Google著名的GFS、BigTable和MapReduce(分别对应Hadoop开源实现的HDFS、HBase和MapReduce)也都是用C++开发的。

下面列出C++语言的优势以及方向,是想给那些在学习C++的人一个方向。因为我曾经也迷茫过,也无所事事过好几天,就是在思考自己将来该干什么。其实语言只是工具,计算机组成原理、计算机网络、数据结构数据库和操作系统也很重要,特别是学的越多,看问题的点就多了。不管学C++,还是学Java,底层原理和实现都要了解。考研那段时间对于专业课的学习,让我的基础能够好一点。我深感其中的好处,特别是我在看一些分布式相关的书籍时会感觉比较轻松。关于C++的书籍,我推荐以下几本,《C++ Primer Plus》、《C++编程思想》、《Effective C++》、《STL源码剖析》和《C++ template》。下面我会列出知乎上的内容,回答的是C++能做什么,内容删减过一些。

 

C++能做什么?

作者:爱乐年华
链接:https://www.zhihu.com/question/304959838/answer/613278773

各大互联网公司的基础架构部门,全公司通用组件和统一服务基础平台。如缓存、计费、消息队列等服务。

各大互联网公司算法部门,用于算法的工程实现,典型的如广告系统、推荐引擎。

各大互联网公司的云服务核心系统。

各大互联网公司和游戏公司的游戏开发。

一些互联网公司的社交引擎(在人人网、开心网没落之后工程师们组团分散到各个互联网产品中做社交引擎,从而带动起来的一个C++细分市场)

华为和中兴的终端、路由器、交换机、云存储、2012实验室几乎所有部门所有产品(有很大一部分是纯C的,不是C++)。

腾讯几乎所有部门产品。百度核心产品部门,如搜索引擎、贴吧。

基于Ceph、zfs等开源文件系统做二次定制开发的云存储公司,或者公司内的存储服务部门,通常属于基础架构部。

联想、IBM、曙光、浪潮、戴尔、红帽、vmware、华为、华三的绝大部分系统级研发部门(有些是纯C的如linux内核和驱动,不是C++)。银行核心交易系统(很多是基于大机的)。

图像处理(如人脸识别)各种地图产品音视频协议无人机物联网自动驾驶区块链智能家居安卓底层开发(非APP)视频监控公司的存储服务产品(含为视频监控服务的云提供商)存储备份软件。

一部分原先是纯C,后来升级到的支持c++的嵌入式系统,如一些单片机厂商,如一些传统行业的嵌入式(纯C>C++)。

你可能感兴趣的:(学习,生活和感悟,C++,学习经历)