翻看大牛的技术博客,常常会发现充斥着大量不认识的名词(分布式,嵌入式等等等)

为了更好应对本科阶段的学习,现对知识点进行一次系统的整理。

考虑到目前能力有限,我不会在某知识点上花费太多精力,做到浅尝即止就可。

前言

关于大学cs应该学习的内容和应该培养的能力,我查阅了不少资料,最后在知乎找到了答案。

知乎提问: 请问关于软件工程专业本科学生大学四年的过程?

本文将以提问中高赞答案给出的思路为纲要进行整理。

正文

掌握一门精通的语言

C/C++ 、Java、 Scala(Scala大法好!)、node.js、python 等等等 最起码精通一门,包括语言的实现,API的实现,内置一些算法的原理、语言的特性、语言的暗坑 。

计算机编程语言特性汇总

Java
  • 市场需求量目前最大
  • 用途广泛,基本可以解决一切需求,但效率貌似不高
  • 不招程序猿喜爱
Python
  • 易学,可读性强,上手难度低,具备智能性(很多细节已经帮用户处理好,例如不用处理内存等)
  • 动态编译,解释型语言
  • 生态优秀,大量现成的成熟轮子,成长迅速
  • 执行速度慢
  • Python2与Python3不兼容
C++
  • 被广泛视为最出色的大规模应用构建语言
  • 易入门难精通
  • 新特性较多
  • 效率非常高
C#
  • 有人说好学易用,但有人说学习曲线陡峭
  • 不可跨平台,基本微软自用
  • 效率高,编译器智能,出项目快
JavaScript
  • 前端程序猿必学,很好集成了 HTML/CSS
  • 不仅可以写网站页面,还可以写PC客户端软件
其它

如Ruby,PHP,Go,Scala,目前在国内非主流语言,

其在某一领域可能优于主流语言,但自身或多或少存在问题。

语言的实现

此处占坑,从百度结果来看,需要学习计算机结构原理。

API

电脑需要调用手机里面的信息,这时候你会拿一根数据线将电脑手机连接起来,电脑和手机上连接数据线的接口就是传说中的API接口

这是一个浅显易懂的比喻。

API,英文全称Application Programming Interface,翻译为“应用程序编程接口”。是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。——百度百科

这是百科给出的定义。

API 是如何工作的 这里浅显易懂的解释了API。

而关于如何实现等技术细节,了解后发现超出目前能力范围。

算法的原理、语言的特性、语言的暗坑

算法原理已有充分了解,而后二者已经于第一部分介绍。

能够精通以下一门内容的原理,并能实践,熟悉其他内容

数据结构、算法、数学建模、计算机网络、数据库原理、操作系统原理、计算机硬件原理、嵌入式系统、计算机图形学,设计模式,编译原理,unix\linux系统,分布式原理。研究生内容就太多了:神经网络,人工智能,网格计算,3D等等等

数据结构及算法

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关

看了下百科给出的常用的数据结构,这一块我还是很有基础的。

而算法,如果不打ACM的话现在知识就完全够用。

数学建模

数学建模,就是根据实际问题来建立数学模型,对数学模型来进行求解,然后根据结果去解决实际问题。

整理网上的资料可知,如果从事大数据等职业需要精通。

计算机网络

这个应该所有人都有所了解吧?但涉及到具体的实现原理及各种网络协议,又令人头大,等本科阶段学习吧。

数据库原理

数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。

一言蔽之,电子化的文件柜。MySQL必学,很重要。

常见的数据库技术有:MySQL, Redis, MongoDB, PostgreSQL, HBase, SQL,Oracle 分布式数据库技术。

也是本科阶段需要重点学习的内容。

嵌入式

嵌入式即嵌入式系统,IEEE(美国电气和电子工程师协会)对其定义是用于控制、监视或者辅助操作机器和设备的装置,是一种专用的计算机系统;国内普遍认同的嵌入式系统定义是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统;从应用对象上加以定义来说,嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。

看不懂,我自己的浅显理解是:微波炉,洗衣机等家电的控制系统算是嵌入式。

嵌入式的特点: 目标单一,只能做一两件事情,例如,汽车的点火器,只能打火和熄火;(不像PC这么有通用性,能上QQ、PS、玩各种各样的游戏)

计算机图形学

计算机图形学是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。

应该是一门很精深的学问,和许多方向有交叉。可以狭义的理解为:如何在计算机中表示三维几何图形,以及如何利用计算机进行图形的生成、处理和显示的相关原理与算法。

另外发现了个冷知识:1980年,第一次给出了光线跟踪算法。所以RTX的光追并不是什么新技术,这也显示了一个理论付诸商业化实现的不易。

软件设计模式

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

知乎上有人总结:

如果我们将程序员简单分为两类人:一类对于软件设计模式一头雾水,代码写的随心所欲;另一类将设计模式玩的炉火纯青,代码写的优雅如诗。

我个人的理解是:设计模式更像是敲代码的哲学,熟悉软件设计模式后,可以让代码更优雅易读。

unix\linux系统

Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单机操作系统使用。Unix作为一种开发平台和台式操作系统获得了广泛使用,目前主要用于工程应用和科学计算等领域

而unix系统和linux系统的关系,就像大清王朝和新中国一样。Linux脱胎于unix,而又不完全是unix

一直有一个疑问:为什么程序猿都使用Linux而不是windows呢?

在知乎上找到了答案:Linux具有:开源,稳定,安全,低成本等特点。

所以一名合格的程序猿一定要把Linux玩到炉火纯青。

分布式原理

分布式计算是计算机科学中一个研究方向,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给多个计算机进行处理,最后把这些计算结果综合起来得到最终的结果。

举个例子,假设需要开发一个在线商城。按照微服务的思想,我们需要按照功能模块拆分成多个独立的服务,如:用户服务、产品服务、订单服务、后台管理服务、数据分析服务等等。这一个个服务都是一个个独立的项目,可以独立运行。(摘自知乎)

但是分布式虽然具有扩展性强等优点,但是难以运维,这就考研架构师的能力了。

目前分布式前景很光明。

研读过至少一到两种开源软件的代码和原理

这个要看你自己的兴趣来的 Github 上面开源软件多得很。 例如JAVA的 那些开源的中间件 简单的:mybatis ,hibernate,HTTPclient 稍微复杂点的:MQ,定时调度,memcache. 复杂的:搜索引擎,HDFS, Netty,akka, spark,strom ,hotspot

打算尽快学习git技术,熟练运用github。

熟悉整体软件工程的流程

什么产品经理,数据开发,运营,前台开发,运维,hr,Branding。先看看他们都是干啥的

知乎该问题下高赞答案很详细,此处直接引用。

开发一个 app 有多难?