我应该了解哪些计算机科学概念?

你认为计算机科学中的哪些概念使你成为一个更好的程序员?

我的学位是机械工程,所以最终成为一名程序员,我有点缺乏基础知识。 我最近了解到一些标准的CS概念,使我对自己在做的事情有了更深入的了解,特别是:

语言function

  • 指针和recursion(感谢Joel!)

数据结构

  • 链接列表
  • 散列表

algorithm

  • 泡沫sorting

显然,目前这个名单有点短暂,所以我希望提出一些build议:

  1. 我应该理解什么概念,
  2. 任何良好的资源,正确理解它们(因为维基百科有时可能有点密集和学术)。

看一下Steve Yegge(原亚马逊,现在在Google)的博客文章:

  • 五个基本的电话屏幕问题

它详细介绍了开发人员应该了解的五个最重要的概念:

  1. 基本的编程(包括recursion,文件I / O,格式化输出,循环等)
  2. 面向对象的devise(包括devise模式等)。 你应该能够产生明智的面向对象的devise以及理解概念。
  3. 脚本和正则expression式。
  4. 数据结构 – 列表,集合,哈希表,树,图等等,以及大O符号和algorithm的复杂性。
  5. 位,字节和二进制数字 – 数字在计算机中的表示方式,以及如何操纵它们。

您绝对应该理解algorithm的Big-O符号和Big-O估计 – 它是什么,它是如何使用的,为什么它是重要的,如何比较两个algorithm的大O估计,如何build立大O估计为简单的algorithm。

我发现你在寻找计算机科学科目有点有趣,但是发现维基百科也是学术的:D

无论如何,这里没有特别的顺序:

  • 关系模型: 数据库系统介绍
  • 面向对象: 对象思维
  • 复杂性和计算理论(思考图灵机和自动机):计算理论导论
  • 一个小小的编译器devise: 龙书 ,虽然这可能是太深入你的需求的一点点。
  • 操作系统概念: 现代操作系统
  • 人的技能: 如何赢得朋友和影响人
  • 团队合作: Peopleware
  • 用户界面devise: 犯人正在运行避难所

一些帮助我发展的概念(智力和代码):

  • Lexing,parsing,string匹配,正则expression式
  • 记忆化
    • 封装/作用域/闭合
    • 高速caching
  • recursion
  • 迭代器/发电机
  • 函数式编程 – 约翰·休斯的神奇文章让我“为什么”

这些都是离散math的整个领域,但CS需要一个严肃的介绍:

  • matrix/线性代数
  • 图论

尽pipeMark Jason-Dominus的讲座和文章经常被引向Perl黑客,但是我认为任何程序员都可以从他清晰的expression和真实的代码中受益,特别是在高阶Perl中 。

我现在要说的是,面向对象编程的理解是必须的,即使你不需要每天都使用它。

从这我也可以说,了解最常见的模式也可以帮助。

我看到几个很好的CS概念,但很less谈论math。

我build议你看看离散math 。 它具有广泛的有用的问题,从逻辑certificate开始,帮助你在代码中编写条件。 图论和组合学也有助于复杂的问题解决和algorithm优化。

当我们谈math时,线性代数通常是高级计算机graphics类的先决条件。

我发现graphics和一些应用algorithm,如深度优先,呼吸优先search,最短path等非常有用。 面向对象也是一个非常普遍的概念。

规则1: 软件是知识捕获 。 软件意味着什么。 如果您对意义不清楚,请花更多时间与用户交谈,以了解他们的工作。

algorithm和数据结构是同一枚硬币的两面。 algorithm依赖于数据结构,数据结构依赖于algorithm。

尽可能快地学习泡泡sorting。 认真。 所有现代语言(Java,Python等)都有集合类,它们实现比气泡sorting更好的sorting。 在任何情况下都绝对不可以使用冒泡sorting。 您应该查找包含sorting方法的集合类。 更好的是,你应该寻找一种避免完全sorting的algorithm。

你必须学习几种语言。

  • 编程语言(Java,Python等)

  • 壳牌语言。

  • 数据库语言(SQL)

  • 演示语言(HTML和CSS)

  • 其他数据表示语言(XML,JSON)

你必须学习几个数据结构。

  • 序列(列表,元组,文件)

  • 分层的(如XML和HTML文档,以及基本的文件系统)

  • 关系(如数据库,以及带有硬链接和软链接的文件系统)

  • 地图(或索引或​​关联数组),包括散列图和树图

加上一些algorithm复杂性分析。 有时被称为“大O”。 为什么冒泡sorting不好就是On ^ 2),其中的sorting是On log n )。

程序员能力matrix详细地介绍了这一点,但我会强调一下:

  • 数据结构
    • 先进的数据结构,如B树,二项和斐波那契堆,AVL /红黑树,Splay树,跳过列表,尝试等。
  • algorithm
    • 树,图,简单的贪婪和分而治之algorithm,能够理解这个matrix的层次的相关性。
  • 系统编程
    • 了解整个编程堆栈,硬件(CPU +内存+高速caching+中断+微码),二进制代码,汇编,静态和dynamic链接,编译,解释,JIT编译,垃圾收集,堆栈,内存寻址…
  • 源代码版本控制
    • 分布式VCS系统的知识。 已经尝试过Bzr / Mercurial / Darcs / Git
  • 构build自动化
    • 可以设置脚本来构build系统,还可以创build文档,安装程序,生成发行说明并在源代码pipe理中标记代码
  • 自动化testing
    • 了解并能够设置自动function,负载/性能和UItesting
  • 问题分解
    • 使用适当的数据结构和algorithm,并提出通用/面向对象的代码,封装可能会改变的问题的各个方面。
  • 系统分解
    • 能够可视化和devise具有多个产品线和与外部系统集成的复杂系统。 还应该能够devise运营支持系统,如监测,报告,失败等。

对于我来说,我在代表队学到了很多

  • 项目pipe理
  • 人机交互(帮助我们创造更多用户友好的屏幕)
  • 数据库devise(包括数据库如何工作,事务日志,locking等)
  • 数据仓库
  • graphics(OpenGL)
  • 高级algorithm
  • 数据结构

我希望我在大学里做的事情

  • 编译器构造
  • devise模式
  • 自动机理论

逻辑 – 我只是夸大了编程中逻辑的重要性。 你说你做了机械工程,所以你必须知道有多lessmath可以让你的生活更轻松。

命题逻辑 , 一阶逻辑 , 二阶逻辑 :这些都是非常强大的工具。 也许是我在大学学到的最重要的(也是唯一的)重要的东西。 逻辑就像一个程序员的重炮 – 一旦你把它们组织起来,逻辑的forms,很多非常复杂的问题(以及不那么复杂的问题)变得更加简单。 就像线性代数是用于机械工程师的。

我认为对编译器的工作原理有一个很好的理解是很好的了解的。 Aho有关于创build编译器的概念的经典书籍。 标题是编译器:原则,技术和工具。 它的绰号是龙书。 为了真正理解这本书,你应该对正式语言有所了解。 Hopcroft有一本好书 – 介绍自动机理论,语言和计算。

封装

在计算机科学中,封装是隐藏定义的接口后面的软件组件的内部机制和数据结构,使得组件(其他软件)的用户只需要知道组件的function,而不能使自己依赖于它是如何做的细节

这里已经提到了很多好的反应,但是我想添加一个重要的子集,但是迄今为止还没有被覆盖。

经过15年的本科专业软件开发,我发现我经常使用学校的以下一些概念:

  • 一般OO概念和现代编程语言特性(类,数据隐藏等)。
  • algorithm性能指标(大O表示法)。 在devisealgorithm时,执行一个大的O分析来确定algorithm的成本,并在瓶颈区域寻找更高效的替代scheme。
  • 链表和其他复杂的数据结构。
  • 快速sorting,不同的sorting概念。
  • 树和快速树操作。

如果你的语言/平台不支持垃圾收集,内存分配和清理是至关重要的,并将被添加到列表中。

我upvote离散math。 计算机科学是抽象的。 学会像math家一样思考是非常有帮助的。

我也想补充一下S.Lott所说的语言。 学习一堆types的语言也很重要。 不只是编译和脚本。 但function(ML,Lisp,Haskell)逻辑(Prolog)面向对象(C ++,Java,Smalltalk)势在必行(C,Pascal,FORTRAN甚至)。

你知道的编程范例越多,当新的热门语言出现时,就越容易挑选新的语言!

一些操作系统的概念

( memory, IO, Scheduling, process\Threads, multithreading ) 

[一本好书“ Modern Operating Systems ,2nd Edition,Andrew S. Tanenbaum”]

计算机networking基础知识

[ Tanenbaum的一本好书

OOPS概念

有限autometa

一种编程语言(我先学习C然后C ++)

algorithm(时间\空间复杂度,sorting,search,树,链表,堆栈,队列)

[一本好书algorithm介绍 ]

那么蠕虫的jar头现在是开放的! 🙂
我开始从事电气工程。

关系数据库devise:跟踪数据就像阿诺德在“幼儿园警察”中一样。
这可能是混乱。 它必须被控制。
如何以最less的信息重复来保存数据。 如何保持数据清晰,并易于访问。 如何控制数据增长和完整性。

用户界面(UI)devise:这是用户必须访问我们跟踪的数据的方式。
大多数UI是由开发人员devise的。 因此,不幸的是,大多数UI与数据库devise并行。 用户根本不关心数据devise。 他们只是想要什么,他们想要什么。 他们想要得到它很容易。 通常这要求与数据devise和用户界面有很大的分离。 学会把你从“南方热情好客”中分离出来。

面向对象编程:许多语言归结为这种格式。

并行处理 – multithreading:许多处理器使工作更快!
并行计算机已经存在数十年了。 他们已经在我们的桌面上了一段时间了。 随着“云计算”事件的发生,大规模并行处理不仅是有限的,而且也是可取的。 这是非常强大的! 并行开发人员有很大的工作潜力。

了解业务规则:这可以帮助您制定很多基于表格的逻辑。
许多IFblock条件可以放在业务规则表中。 要更改逻辑,只需更改表中的信息即可。 很less/没有重新编码。 很less/没有重新编译。

活动监督…方法做的工作:
在你的代码中保持独立。 这使得其他人更容易在将来进行更新。 它也有点类似于模型/视图/控制器(MVC)框架。

PJ

尝试了解各个层次的编程。 从最低级别(汇编)到最高级别。

以recursion为例,这是一个简单的function:)尝试学习汇编,并创build一个程序,将在程序集中使用recursion。

algorithm。

学习如何使用程序devise语言是一种随时可以学习的东西,但是实际上不可能自己发明所有被广泛使用的algorithm。一个真正应该至less知道什么是可以或不可以做的有一些问题。

例如,一个人不能用bubble-sort编写一些程序,并期望它被认为是好的,不pipe代码有多好。

总结一下 – 看看algorithm介绍

不需要掌握它,只要知道发生了什么…

作为最近从计算机科学学位gradle,我build议如下:

对于面向对象编程, SOLID原则等良好的指导原则和遵循既定模式和实践,显然是一个很好的理解。

如果你看看SOA或DDD,他们最终都会回到某种forms的OOP概念。

我会build议你得到一些很好的面向对象的书籍,并select像C#或Java这样的丰富的语言开始

OOP通过Grady Booch

(PHP的,ruby请不要投我一票,我只是给他一些例子,他可以提供你自己的答案和build议在这里)

计算机程序的结构和解释 。 如果你理解了这本书,其他的一切都可以很容易地build立在这个基础上。 如果你在书中的概念有问题,你可能是一个软件开发者,但不是计算机科学家。

我不会告诉你任何具体的学习概念,而是build议你在广泛的主题上进行大量的阅读。 不要担心深入了解你所读到的每一个主题 – 在这一点上,更重要的是你能够认识到你正在看什么的问题,这样你就可以做一些简单的事情,及时学习,当你真的面对它。 换句话说,如果你不知道如何解决组合问题,只要你有足够的知识来查看“组合”,当你需要查看有多less种方法你可以安排一组对象或select一个子集。

对于这种广泛的浏览,维基百科是一个相当不错的资源,特别是如果你只是开始浏览。 一个更好的,特别是如果你发现维基百科太学术或无法访问,是C2维基 。 (有趣的是,Ward Cunningham发明原来的wiki)。

争取低耦合,高凝聚力

低耦合,高内聚http://www.codeodor.comhttp://img.dovov.comfrom_spaghetti_code_to_better_code.jpg

(我从上面链接的网站上偷走了这个图片)

我认为理解multithreading背后的基本理论是非常重要的,否则在星期天早上四点钟的时候在一台服务器上进行debugging之前,甚至很难发现问题的存在。

信号量,关键部分和事件。

不,不是冒泡sorting,快速sorting。 这是大O的东西 – 气泡sorting平均O(n ^ 2),快排是O(N * log(n))。

我会说下面是最重要的东西

  • 面向对象编程
  • 操作系统的概念
    • 进程和线程
    • 调度algorithm
  • 数据结构
    • 数据存储和收集的types,types(链表,散列,数组等)
    • sortingalgorithm
    • algorithm的复杂性

然后转到特定的语言相关的东西。 我希望这是有帮助的!!

我会从报价开始:

“如果你所拥有的唯一工具就是一把锤子,那么你就像一个钉子一样对待一切”。 (亚伯拉罕·马斯洛)

国际海事组织最重要的原则是了解许多不同的编程模式,语言,并且很好地告诉你自己处理的工具。 任何问题都可以用你select的几乎任何一种语言来解决,无论是大型默认库还是像AutoHotKey这样的小型专业语言,都可以成为主stream语言。 程序员的第一个工作就是根据问题的规范确定使用什么。 无论您的主要目标是什么 – 复杂性,模糊性,性能,可移植性,维护,小代码的大小,一些概念提供更好的主题方法…

否则,你会像一些拼命尝试用他们专门的语言来做某事的程序员一样完成,而在不同的编程环境下,这个问题可能会很微不足道。

这个build议随着今天的多语言项目的趋势(以Web应用程序为例,这可能涉及单个应用程序中的多种语言,如C#,JS,CSS,XPath,SQL,XML,HMTL,RegExp …甚至不同的编程范例(例如,C#最近引入了函数式编程范例lambda的一些概念)。

所以,基本的东西是不断学习,永远 🙂

我认为3D-Graphics是每个人都应该学习的东西。 或者至less如何正确使用均匀vector和matrix变换。

它不仅可以用于创build3D应用程序, 还可以用于机器人领域的逆向运动学,计算时刻以及其他许多方面。

直到我读了三维graphics之后,我才完全理解线性代数,即使我们的老师不好,我也曾经学过最好的课程之一。

由于具有多个内核(包括CPU和GPU)的机器正在成为标准,所以我会说包含分布式algorithm (从多个线程到多个机器)。 了解multithreading和分布式处理是至关重要的。 对不起,链接并没有真正提供很多帮助。