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

Jon*_*tus 92 computer-science

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

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

语言特色

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

数据结构

  • 链接列表
  • 散列表

算法

  • 泡泡排序

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

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

jam*_*kes 59

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

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

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

  • 我同意除正则表达式之外的所有内容.这些都是一个很好的奖励,但大多数东西都是基础的基础知识,是构建一切的基础......正则表达式很棒,但我知道很多优秀的程序员从不使用它们,也从不需要. (3认同)

sha*_*oth 35

你肯定应该理解算法的Big-O表示法和Big-O估计 - 它是什么,如何使用,为什么它很重要,你如何比较两个算法给出他们的Big-O估计,你如何构建Big-O估计对于简单的算法.

  • 你必须对高级数学有很低的评价.我在大学的第一年就明白这一点,那时我只是微积分的一部分. (3认同)
  • 有点像.它告诉你哪一个具有最好的最坏情况,而不是必须哪一个"更快",因为它取决于输入集. (3认同)
  • 您还应该知道大O不会告诉您哪种算法花费的时间更少.大多数CS毕业生都没有掌握 (2认同)

Rik*_*Rik 30

我觉得你在寻找计算机科学科目有点好笑,但发现维基百科太学术了:D

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

  • +1是因为您提到过数据库,这些类型的列表通常会忽略它们,但是对于任何全面的CS毕业生来说,这都是一个非常重要的概念。 (2认同)

bub*_*ker 14

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

  • Lexing,Parsing,String matching,Regex
  • 记忆化
    • 封装/作用域/闭合
    • 高速缓存
  • 递归
  • 迭代器/发电机
  • 函数式编程 - 约翰休斯的惊人文章让我知道"为什么"

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

  • 矩阵/线性代数
  • 图论

尽管Mark Jason-Dominus的讲座和文章经常针对Perl黑客,但我认为任何程序员都会从他清晰的演示和实际代码中受益,特别是在高阶Perl中.


Jer*_*nch 10

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

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


Ber*_*ire 10

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

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

虽然我们处于数学的主题,但线性代数通常是高级计算机图形课程的先决条件.


cgp*_*cgp 6

程序员能力矩阵详细介绍了这一点,但我要强调一下:

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


Mor*_*075 5

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