我应该知道什么是计算机科学概念?

时间:2009-04-14 12:27:33

标签: computer-science

您认为计算机科学中的哪些概念能让您成为更好的程序员?

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

语言功能

  • 指针&递归(谢谢乔尔!)

数据结构

  • 链接列表
  • 散列表

算法

  • Bubble Sorts

显然,目前这个名单有点短,所以我希望得到以下建议:

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

33 个答案:

答案 0 :(得分:59)

看一下Steve Yegge(以前是亚马逊,现在谷歌)的博客文章:

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

  1. 基本编程(包括递归,文件I / O,格式化输出,循环等)
  2. 面向对象的设计(包括设计模式等)。您应该能够生成合理的OO设计以及理解这些概念。
  3. 脚本和正则表达式。
  4. 数据结构 - 列表,集合,哈希表,树,图等 - 以及Big O表示法和算法复杂性。
  5. 位,字节和二进制数 - 如何在计算机中表示数字,以及如何操作它们。

答案 1 :(得分:35)

你绝对应该理解算法的Big-O符号和Big-O估计 - 它是什么,如何使用,为什么它很重要,你如何比较两个算法给出他们的Big-O估计,你是怎么做的为简单算法构建Big-O估计。

答案 2 :(得分:30)

我发现你正在寻找计算机科学科目有点好笑,但发现维基百科过于学术化:D

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

答案 3 :(得分:14)

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

  • Lexing,Parsing,String matching,Regex
  • Memoization
    • 封装/作用域/密封件
    • 缓存
  • 递归
  • 迭代器/发电机
  • 功能编程 - 约翰休斯的惊人article让我知道“为什么”

这些是离散数学的整个领域,但CS需要认真介绍

  • 矩阵/线性代数
  • 图论

虽然lectures and articles by Mark Jason-Dominus通常是针对Perl黑客的,但我认为任何程序员都会从他清晰的演示文稿和实际代码中受益,特别是在Higher Order Perl中。

答案 4 :(得分:10)

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

从这一点我也会说理解最常见的模式也有帮助。

答案 5 :(得分:10)

我看到了几个很好的CS概念,但很少谈论数学。

我建议您查看 discrete mathematics 。它具有广泛的有用问题,从逻辑证明开始,可以帮助您在代码中编写条件。图论和组合学也有助于复杂的问题解决和算法优化。

虽然我们在数学方面,但线性代数通常是高级计算机图形课程的先决条件。

答案 6 :(得分:5)

我发现图形和一些应用算法,如深度优先,广度优先搜索,最短路径等非常有用。面向对象也是一个非常普遍的概念。

答案 7 :(得分:5)

Programmer Competency Matrix详细介绍了这一点,但我要强调一下:

  • 数据结构
    • 高级数据结构,如B树,二项式和斐波纳契堆,AVL /红黑树,Splay树,跳过列表,尝试等。
  • 算法
    • Tree,Graph,简单贪婪和分治算法,能够理解这个矩阵的相关性。
  • 系统编程
    • 理解整个编程堆栈,硬件(CPU +内存+缓存+中断+微代码),二进制代码,汇编,静态和动态链接,编译,解释,JIT编译,垃圾收集,堆栈,堆栈,内存寻址... < / LI>
  • 源代码版本控制
    • 了解分布式VCS系统。已经尝试过Bzr / Mercurial / Darcs / Git
  • 构建自动化
    • 可以设置脚本来构建系统以及文档,安装程序,生成发行说明以及在源代码管理中标记代码
  • 自动化测试
    • 了解并能够设置自动功能,负载/性能和UI测试
  • 问题分解
    • 使用适当的数据结构和算法,并提供通用/面向对象的代码,用于封装可能发生变化的问题的各个方面。
  • 系统分解
    • 能够可视化和设计具有多个产品线和与外部系统集成的复杂系统。还应该能够设计运营支持系统,如监控,报告,故障转移等。

答案 8 :(得分:4)

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

算法和数据结构是同一枚硬币的两面。算法取决于数据结构,数据结构取决于算法。

尽快取消冒泡冒号。认真。所有现代语言(Java,Python等)都有集合类,它们实现了比冒泡排序更好的排序。绝对没有任何情况下你应该使用冒泡排序。您应该寻找包含排序方法的集合类。更好的是,你应该寻找一种避免完全排序的算法。

你必须学习几种语言。

  • 编程语言(Java,Python等)

  • Shell语言。

  • 数据库语言(SQL)

  • 演示语言(HTML和CSS)

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

您必须学习几种数据结构。

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

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

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

  • 包含哈希地图和树图的地图(或索引或​​关联数组)

  • 设定

加上一些算法复杂性分析。有时被称为“大O”。为什么冒泡排序不好是 O n ^ 2),其中快速排序 O n log n )。

答案 9 :(得分:3)

对于我来说,我从大学的以下课程中获得了很多东西

  • 项目管理
  • 人机交互(帮助我们的极客制作更多用户友好的屏幕)
  • 数据库设计(包括数据库的工作方式,事务日志,锁定等)
  • 数据仓库
  • 图形(OpenGL)
  • 高级算法
  • 数据结构

我希望我在大学代表队做过的事情

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

答案 10 :(得分:3)

我认为很好地理解编译器的工作原理。 Aho有关于创建编译器时使用的概念的经典书籍。标题是编译器:原理,技术和工具。它的绰号是龙书。为了真正理解这本书,你应该对形式语言有所了解。霍普克罗夫特有一本很好的书 - “自动机理论,语言和计算导论”。

答案 11 :(得分:3)

LOGIC - 我只是夸大逻辑在编程中的重要性。你说你做过机械工程,所以你必须知道有多少数学可以让你的生活更轻松。

Propositional LogicFirst-Order LogicSecond-Order Logic:这些都是非常强大的工具。可能是我在大学里学到的最重要(也是唯一)重要的事情。逻辑就像程序员的重型炮兵 - 一旦你把它们组织成一个有组织的逻辑形式,许多非常复杂的问题(以及不太复杂的问题)变得更加简单。这就像线性代数对于机械工程师来说。

答案 12 :(得分:2)

争取 low coupling, high cohesion

low coupling, high cohesion

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

答案 13 :(得分:2)

好吧,蠕虫病毒现在已经开放了! :)
我刚开始从事电气工程。

关系数据库设计:跟踪数据就像“幼儿园警察”中的阿诺德一样。它可能完全混乱。必须加以控制。
如何在最少的位置保存您的数据,信息重复最少。如何保持数据清晰,易于访问。如何控制数据增长和完整性。

用户界面(UI)设计:这是用户必须访问我们要跟踪的数据的方式。
大多数UI都是由开发人员设计的。因此,不幸的是,大多数UI与数据库设计并行。用户根本不关心数据设计。他们只是想要,他们想要什么。他们想轻松搞定。通常,这需要与数据设计和用户界面完全分离。学会将“工程”与“南方好客”分开。

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

并行处理 - 多线程:许多处理器可以快速完成工作!
并行计算机已经存在了几十年。他们已经在我们的台式机上待了一段时间。随着“云计算”的发生,大规模并行处理不仅是强制性的,而且也是可取的。它非常强大!并行开发人员有很多工作潜力。

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

活动监督......方法完成工作:
在代码中保持分开。它使其他人更容易在将来进行更新。它也与模型/视图/控制器(MVC)框架有些相似。

PJ

答案 14 :(得分:2)

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

我还想补充S.Lott关于语言的内容。学习一堆类型的语言也很重要。不只是编译与脚本。但功能性(ML,Lisp,Haskell)逻辑(Prolog)面向对象(C ++,Java,Smalltalk)势在必行(C,Pascal,FORTRAN甚至)。

您知道的编程范例越多,在热门的新语言出现时就越容易学习新语言!

答案 15 :(得分:2)

此处已经提到了很多好的回复,但我想添加一些重要的内容,但到目前为止尚未涉及。

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

  • 一般OO概念,以及现代编程语言功能(类,数据隐藏等)。
  • 算法性能指标(Big O表示法)。在设计算法时,执行大O分析以确定算法的成本,并在瓶颈区域中寻找更有效的替代方案。
  • 链接列表和其他复杂数据结构。
  • 快速排序和不同的排序概念。
  • 树木和快速树木操纵。

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

答案 16 :(得分:2)

一些操作系统概念

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

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

计算机网络基础知识

[{3}}

的好书

OOPS概念

有限autometa

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

算法  (时间\空间复杂性,排序,搜索,树,链表,堆栈,队列)

[一本好书Tanenbaum]

答案 17 :(得分:2)

答案 18 :(得分:1)

尝试了解所有级别的编程。从最低级别(汇编)到最高级别。

以递归为例,这是一个简单的特性:)尝试学习汇编并创建一个将在汇编中使用递归的程序。

答案 19 :(得分:1)

Structure and Interpretation of Computer Programs。如果您理解本书,那么其他所有内容都可以在此基础上轻松构建。如果您对本书中的概念有疑问,您可能是软件开发人员,但不是计算机科学家。

答案 20 :(得分:1)

这显然是对面向对象编程的良好理解,良好的指导原则,如SOLID Principles,并遵循既定的模式和实践。

如果你看一下SOA或DDD,它们最终都会回归到某种形式的OOP概念。

我建议你先购买一些优秀的OOP书籍,然后选择C#或Java等丰富的语言来开始

OOP by Grady Booch

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

答案 21 :(得分:1)

算法。

学习使用下降方式的编程语言是你可以随时学习的东西,但是你自己发明所有广泛使用的算法几乎是不可能的..一个人至少应该知道什么可以和可以'做一些问题。

例如,一个人根本无法用bubble-sort编写一些程序,并且无论代码多么精细,都希望它被认为是好的。

总结一下 - 看看Introduction to Algorithms

无需掌握它,只知道发生了什么......

答案 22 :(得分:1)

作为最近从计算机科学学位毕业的学生,​​我建议如下:

答案 23 :(得分:1)

我不打算告诉你任何具体的学习概念,而是建议你在很多主题上做很多的阅读。不要担心深入了解您阅读的每个主题 - 此时,您能够识别出正在查看的问题的更为重要,因此当你真正面对它时,你可以做一些即时学习。换句话说,如果你不知道如何解决组合学问题就好了,只要你知道在你需要看多少种方法来安排一组对象或选择一个子集时就能查找“组合”。

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

答案 24 :(得分:0)

除了冒泡之外的任何东西:

  • 堆排序
  • 快速排序

最重要的是:大O符号,所以你知道为什么你应该使用其中一个而不是冒泡排序。

答案 25 :(得分:0)

如果你要教大-O至少解释它描述了算法的时间如何随着较大的输入而缩放 - 这并不意味着算法将花费更少的时间。
例如,建筑金字塔是O(n),而排序它们的照片最多是O(n ln n)。因此,建立另一个金字塔比整理你的假期快照更快。

学生需要了解寄存器,缓存,主内存,磁盘和网络上的操作需要多长时间。许多只教授非常高级语言的人没有概念。

(这是有人想要讨论的评论)

答案 26 :(得分:0)

我认为理解多线程背后的基本理论至关重要,如果没有这个,甚至可能很难看到可能存在问题,直到你在星期天4点钟在现场服务器上进行调试早晨。

信号量,关键部分&amp;事件

答案 27 :(得分:0)

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

  • 面向对象编程
  • 操作系统概念
    • 流程和主题
    • 调度算法
  • 数据结构
    • 数据存储和收集的类型,类型(链表,散列,数组等)
    • 排序算法
    • 算法的复杂性

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

答案 28 :(得分:0)

Software Development Life Cycle - 需求收集,设计和分析,实施,测试以及支持和维护顺序。这些以及诸如瀑布和敏捷等方法,这些步骤付诸实践也是一个重要的事情。

答案 29 :(得分:0)

不,不是冒泡排序,快速排序。这是大O事 - 泡沫排序平均值O(n ^ 2),快速排序是O(n * log(n))。

答案 30 :(得分:0)

由于具有多个核心(CPU和GPU)的计算机正在成为标准,我想说要包括Distributed Algorithms(从多个线程到多台计算机)。理解多线程和分布式处理至关重要。很抱歉,该链接并没有真正提供很多帮助。

答案 31 :(得分:0)

我认为 3D-Graphics 是每个人都应该学习的东西。或者至少如何正确使用齐次向量和矩阵变换。

它不仅可以帮助创建3D应用程序,还可以帮助在机械领域,例如机器人上的反向运动学,计算力矩和许多其他东西。

直到我读过3D图形,我还没有完全理解线性代数,这是我见过的最好的课程之一,即使我们的老师很糟糕。

答案 32 :(得分:0)

我会从引用开始:

  

“如果您拥有的唯一工具是   锤子,你把一切都当作一个   指甲“。(亚伯拉罕马斯洛)

IMO最重要的原则是了解许多不同的编程范例,语言并很好地了解您可以使用的工具。几乎任何你选择的语言都可以解决任何问题,无论是使用庞大的默认库还是像AutoHotKey这样的小型专业语言,它都是完整的主流语言。程序员的第一项工作是根据问题的规范确定要使用的内容。一些概念提供了更好的主题方法,无论您的主要目标是什么 - 复杂性,混淆,性能,可移植性,维护,小代码大小......

否则你会像一些拼命尝试用他们专业的1种语言做某事的程序员一样完成,而在不同的编程环境中解决问题可能是微不足道的。

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

所以,基本的事情是不断学习,永远:)

相关问题