前言

其实在写这类博客时,我往往不知道该怎么下笔。我相信有很多学计算机或软件专业的人和我一样,都有过迷茫的一段时期。在这段期间,不知道自己该干什么,也不知道自己未来的职业规划。就问一个最简单的问题,你是想学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++)。

学习经历感悟——基础 > 语言相关推荐

  1. 字节青训营Go语言学习第一天--基础语言+实战案例

    文章目录 走进Go语言基础语言 2.2基础语言-变量 2.3基础语法- if else 2.4基础语法-循环 基础语法-switch 基础语法-数组 基础语法-切片 基础语法-map 基础语法-ran ...

  2. 计算机基础语言学习线路图

    计算机基础语言学习线路图 HTML HTML教程 HTML简介 HTML编辑器 HTML基础 HTML元素 HTML属性 HTML标题 HTML段落 HTML样式 HTML格式化 HTML引用元素 H ...

  3. 阿德莱德大学语言班成绩为C,2020年阿德莱德大学语言班学习经历分享

    阿德雷德大学语言班学习经历分享介绍: 大家好,我是来自阿德雷德大学语言中心的学生,现在正在阿德雷德大学就读本科课程.下面我给大家详细讲解下阿德雷德大学语言班的情况: 阿德雷德大学的语言课程由阿德雷德大 ...

  4. 小智学长嵌入式入门学习路线_1 C语言基础

    原课程链接: 嵌入式开发系统学习路线 从基础到项目 精品教程 单片机工程师必备课程 物联网开发 c语言 2022追更 前言 在学习过程中,老师提到了一个很重要的思想:主要从学习嵌入式的角度学习各项技能 ...

  5. GEE(Google Earth Engine) 最基础代码学习笔记二 —— JavaScript 语言

    GEE(Google Earth Engine) 学习笔记二 Javascript 语言 1. 注释 print('Hello World!'); 如果要注释,则在代码前面加//,比如: // pri ...

  6. 怎么学python-结合学习经历,谈一谈如何学习Python

    结合自己的学习经历,谈一谈如何学习Python吧. 入门阶段 Python其实语言本身已经很接近自然语言了,所以入门其实并不麻烦.如果你是从未接触过编程的萌新,给你推荐一门Udacity CS101, ...

  7. Java快速入门学习笔记2 | Java语言中的基本类型

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  8. 怎么自学python-结合学习经历,谈一谈如何学习Python

    结合自己的学习经历,谈一谈如何学习Python吧. 入门阶段 Python其实语言本身已经很接近自然语言了,所以入门其实并不麻烦.如果你是从未接触过编程的萌新,给你推荐一门Udacity CS101, ...

  9. Direct3D11学习经历分享

    今天突然看到CSDN博客不显示网易相册的图片了,大家如果敢兴趣的话到我的网易博客阅读哈.地址: http://politician2012.blog.163.com/blog/static/20784 ...

  10. 计算机学生要学的基础知识,中小学生应注重学习计算机的基础知识

    "知识爆炸"和"知识老化"这两大问题,不断困扰着现代教育,人们解决这一问题的良方之一,就是加强学生对基础知识的学习.近年来在中国兴起的中小学生学习计算机热,也同 ...

最新文章

  1. Ubuntu系统执行shell 脚本的方法
  2. c++ Lambda
  3. gitlab的日常使用
  4. 搭建简易Linux局网服务器
  5. 复习笔记2018.8.3
  6. Java常量设计与常量池
  7. SpringNote01.基于SpringMVC-Hibernate的Blog系统
  8. Information Extraction
  9. 学校题库管理系统需求分析
  10. window上vs2017 opencv图片路径问题(附3种加载路径方法)
  11. 为MacBook制作一个随身携带的windows系统
  12. 计算机常用英语1600,中考英语必备1600个词汇PDF.pdf
  13. 柴夥說算法(4)--再說樹
  14. Access根据出生日期计算年龄_小技巧 | 在SPSS中根据出生日期计算年龄
  15. php相册管理系统实验总结,【美优 php 单用户相册管理系统怎么用】美优 php 单用户相册管理系统好不好_使用技巧-ZOL软件百科...
  16. 浮萍自动清理机器人——第一次下水201606
  17. 2020-07-06
  18. 桌面云服务器联想,联想云桌面系统助力四川大学搭建智慧课堂
  19. Express jade
  20. Vue指令(续)、小黑记事本案例

热门文章

  1. 记录一篇w10下最新tensorflow2.3的安装包括anaconda,cuda,cudnn安装,配置环境
  2. 在Windows平台上使用Git和pathogen管理gVim插件
  3. kotlin Android通过GPS定位/网络定位获取当前经纬度及位置信息
  4. (java中的super)不会飞还能叫Superman吗
  5. 手把手教你快应用接入微信H5网页支付
  6. php eot 无法,php EOT
  7. 叶俊获“约翰·格雷博士中国行”最佳贡献奖
  8. Apostrophe not preceded by \
  9. 【数学问题2】空间惯量 The Spatial Inertia
  10. 华为荣耀畅享7的计算机在哪,华为畅享7有什么新功能_华为畅享7有哪些新功能-太平洋IT百科...