您认为计算机科学中的哪些概念使您成为更好的程序员?
我的学位是机械工程,所以最终成为一名程序员,我有点缺乏基础知识 . 我最近学到的一些标准CS概念让我对我正在做的事情有了更深刻的理解,特别是:
Language Features
- 指针和递归(谢谢乔尔!)
Data Structures
-
链接列表
-
哈希表
Algorithms
- 泡泡排序
显然,目前这个名单有点短,所以我希望得到以下建议:
-
我应该了解哪些概念,
-
正确理解它们的任何好资源(因为维基百科有时可能有点密集和学术) .
30 回答
我认为 3D-Graphics 是每个人都应该学习的东西 . 或者至少如何正确使用齐次向量和矩阵变换 .
它不仅可以用于创建3d应用程序,还可以用于机器人上的反向运动学,计算力矩和许多其他东西 .
我没有完全明白线性代数,直到我读过3D图形,这是我用过的最好的课程之一,即使我们的老师很糟糕 .
算法 .
学习以下降的方式使用编程语言是你可以随时学习的东西,但是你自己发明所有广泛使用的算法几乎是不可能的..至少应该知道什么可以做和不可以做有一些问题 .
例如,无论代码有多精细,人们根本无法使用冒泡排序编写一些程序并期望它被认为是好的 .
总结一下 - 看看Introduction to Algorithms
不需要掌握它,只知道发生了什么......
我发现图形和一些应用算法,如深度优先,呼吸优先搜索,最短路径等非常有用 . 面向对象也是一个非常普遍的概念 .
不,不是冒泡排序,快速排序 . 这是大O事 - 泡沫排序平均值O(n ^ 2),快速排序是O(n * log(n)) .
一些有助于我发展的概念(智力和代码):
Lexing,Parsing,String matching,Regex
Memoization
封装/作用/封闭
缓存
递归
迭代器/发生器
函数式编程 - 约翰休斯的惊人article让我在"why"
这些是离散数学的整个领域,但CS需要认真介绍:
矩阵/线性代数
图论
虽然lectures and articles by Mark Jason-Dominus经常被导向Perl黑客,但我认为任何程序员都会从他清晰的演示和实际代码中受益,特别是在Higher Order Perl .
Encapsulation
In computer science, encapsulation is the hiding of the internal mechanisms and data structures of a software component behind a defined interface, in such a way that users of the component (other pieces of software) only need to know what the component does, and cannot make themselves dependent on the details of how it does it
我看到了几个很好的CS概念,但很少谈论数学 .
我建议你看看 discrete mathematics . 它具有广泛的有用问题,从逻辑证明开始,可以帮助您在代码中编写条件 . 图论和组合学也有助于复杂的问题解决和算法优化 .
虽然我们处于数学的主题,但线性代数通常是高级计算机图形课程的先决条件 .
LOGIC - 我只是夸大逻辑在编程中的重要性 . 你说你做过机械工程,所以你必须知道有多少数学可以让你的生活更轻松 .
Propositional Logic,First-Order Logic,Second-Order Logic:这些都是非常强大的工具 . 可能是最重要的(也是唯一的)重要的东西我就像机械工程师的线性代数一样 .
一些操作系统概念
[一本好书“Modern Operating Systems,第2版,Andrew S. Tanenbaum”]
计算机网络基础知识
[一本好书Tanenbaum
OOPS概念
有限的autometa
一种编程语言(我首先学习C然后C)
算法(时间\空间复杂度,排序,搜索,树,链表,堆栈,队列)
[一本好书Introduction to Algorithms]
Structure and Interpretation of Computer Programs . 如果您理解本书,其他所有内容都可以在此基础上轻松构建 . 如果您对本书中的概念有疑问,您可能是软件开发人员,但不是计算机科学家 .
Programmer Competency Matrix详细介绍了这一点,但我要强调一下:
数据结构
高级数据结构,如B树,二项式和斐波纳契堆,AVL /红黑树,Splay树,跳过列表,尝试等 .
算法
树,图,简单贪婪和分治算法,能够理解这个矩阵的水平的相关性 .
系统编程
了解整个编程堆栈,硬件(CPU内存缓存中断微码),二进制代码,汇编,静态和动态链接,编译,解释,JIT编译,垃圾收集,堆栈,堆栈,内存寻址......
源代码版本控制
分布式VCS系统的知识 . 尝试过Bzr / Mercurial / Darcs / Git
构建自动化
可以设置脚本来构建系统以及文档,安装程序,生成发行说明以及标记源代码管理中的代码
自动化测试
了解并能够设置自动功能,负载/性能和UI测试
问题分解
使用适当的数据结构和算法,并提出通用/面向对象的代码,这些代码封装了可能发生变化的问题的各个方面 .
系统分解
能够通过多个产品线和与外部系统的集成来可视化和设计复杂的系统 . 还应该能够设计运营支持系统,如监控,报告,故障转移等 .
对我来说,我在大学代表队的以下课程中获得了很多
项目管理
人机交互(帮助我们的极客制作更多用户友好的屏幕)
数据库设计(包括数据库的工作方式,事务日志,锁定等)
数据仓库
图形(OpenGL)
高级算法
数据结构
我希望我在大学代表队做过的事情
编译器构造
设计模式
自动机理论
我认为很好地理解编译器如何工作是很好的 . Aho有关于创建编译器时使用的概念的经典书籍 . Headers 是编译器:原理,技术和工具 . 它的昵称是龙书 . 为了真正理解这本书,你应该对形式语言有所了解 . 霍普克罗夫特有一本很好的书 - 自动理论,语言和计算简介 .
你肯定应该理解算法的Big-O符号和Big-O估计 - 它是什么,如何使用,为什么它很重要,你如何比较两个算法给出他们的Big-O估计,你如何构建Big-O估计简单的算法 .
我会从引用开始:
IMO最重要的原则是了解许多不同的编程范例,语言并很好地了解您可以使用的工具 . 几乎任何你选择的语言都可以解决任何问题,无论是使用庞大的默认库还是像AutoHotKey这样的小型专业语言,它都是完整的主流语言 . 程序员的第一项工作是根据问题的规范确定要使用的内容 . 一些概念提供了更好的主题方法,无论您的主要目标是什么 - 复杂性,混淆,性能,可移植性,维护,小代码大小......
否则你会像一些程序员那样拼命地尝试用他们专业的1种语言做某事,而在不同的编程环境中解决这个问题可能是微不足道的 .
这个建议伴随着当今多语言项目的趋势(以Web应用程序为例,在单个应用程序中可能涉及多种语言,如C#,JS,CSS,XPath,SQL,XML,HMTL,RegExp ......甚至不同的编程范例(例如,C#最近介绍了函数式编程范例中的一些概念,lambdas) .
所以,基本的东西是 constant learning, forever :)
我赞成离散数学 . 计算机科学是抽象的 . 学习像数学家一样思考是非常有帮助的 .
我还想补充S.Lott关于语言的内容 . 学习一堆类型的语言也很重要 . 不只是编译与脚本 . 但功能(ML,Lisp,Haskell)逻辑(Prolog)面向对象(C,Java,Smalltalk)命令式(C,Pascal,FORTRAN甚至) .
您知道的编程范例越多,在热门的新语言出现时就越容易学习新语言!
我想说下面是最重要的东西
面向对象编程
操作系统概念
进程和线程
调度算法
数据结构
数据存储和集合的类型,类型(链表,散列,数组等)
排序算法
算法的复杂性
然后转到特定语言相关的东西 . 我希望这是有帮助的!!
那些虫子现在已经开放了! :)
我刚开始从事电气工程 .
Relational Database Design: 跟踪数据就像"Kindergarden Cop"中的阿诺德一样 .
这可能是完全混乱 . 必须加以控制 .
如何使用最少的信息重复,在最少的位置保存您的数据 . 如何保持数据清晰,易于访问 . 如何控制数据增长和完整性 .
User Interface (UI) Design: 这就是用户 must 访问我们正在跟踪的数据的方式 .
大多数UI都是由开发人员设计的 . 因此,遗憾的是,大多数UI与数据库设计并行 . 用户根本不关心数据设计 . 他们只是想要,他们想要什么 . 他们想轻松搞定 . 通常,这需要与数据设计和用户界面完全分离 . 学会将"engineering"与你分开"southern-hospitality" .
Object Oriented Programming: 许多语言归结为这种格式 .
Parallel Processing - Multi-Threading: 许多处理器制造了工作快!
并行计算机已存在数十年 . 他们已经在我们的台式机上待了一段时间 . 随着"cloud computing"事件的发生,大规模并行处理不仅是强制性的,而且更可取 . 它非常强大!并行开发人员有很多工作潜力 .
Understanding Business Rules: 这可以帮助您创建大量基于表格的逻辑 .
许多IFblock条件可以位于业务规则表中 . 要更改逻辑,只需更改表中的信息即可 . 很少/没有重新编码 . 很少/没有重新编译 .
Events Supervise...Methods do the work:
在代码中将内容分开 . 它使其他人更容易在将来进行更新 . 它也与模型/视图/控制器(MVC)框架有些相似 .
PJ
由于具有多个内核(CPU和GPU)的机器正在成为标准,我想说包括Distributed Algorithms(从多个线程到多台机器) . 理解多线程和分布式处理至关重要 . 很抱歉,该链接并没有真正提供很多帮助 .
尝试了解所有级别的编程 . 从最低级别(汇编)到最高级别 .
以递归为例,这是一个简单的特性:)尝试学习汇编并创建一个将在汇编中使用递归的程序 .
这显然是对面向对象编程,良好指导原则(如SOLID Principles)以及遵循既定模式和实践的良好理解 .
如果你看一下SOA或DDD,它们最终都会回归到某种形式的OOP概念 .
我建议你先阅读一些优秀的OOP书籍,然后选择C#或Java等丰富的语言
OOP by Grady Booch
(PHP,红宝石家伙请不要投票给我,我只是给他一些例子开始,你可以在这里提供你自己的答案和建议)
规则1: Software is Knowledge Capture . 软件意味着什么 . 如果您不清楚其含义,请花更多时间与用户交谈以了解他们的工作 .
算法和数据结构是同一枚硬币的两面 . 算法取决于数据结构,数据结构取决于算法 .
尽可能快地取消冒泡 . 认真 . 所有现代语言(Java,Python等)都有集合类,它们实现了比冒泡排序更好的排序 . 绝对没有任何情况下你应该使用冒泡排序 . 您应该寻找包含排序方法的集合类 . 更好的是,你应该寻找一种避免完全排序的算法 .
你必须学习几种语言 .
编程语言(Java,Python等)
Shell语言 .
数据库语言(SQL)
演示语言(HTML和CSS)
其他数据表示语言(XML,JSON)
您必须学习几种数据结构 .
序列(列表,元组,文件)
分层(如XML和HTML文档,以及基本文件系统)
关系(如数据库,以及引入硬链接和软链接的文件系统)
Map (或索引或关联数组),包括哈希映射和树映射
集
加上一些算法复杂性分析 . 有时称为"Big O" . 为什么冒泡排序不好是它是 O (n ^ 2),其中快速排序是 O (n log n) .
我发现你正在寻找计算机科学科目有点好笑,但发现维基百科太学术了:D
无论如何,这里没有特别的顺序:
关系模型:Introduction to Database systems
面向对象:Object Thinking
复杂性和计算理论(认为图灵机和自动机):Introduction to theory of computation
一个小编译器设计:The Dragon Book,虽然这可能对您的需求有点过于深入 .
操作系统概念:Modern operating systems
人员技能:How to win friends and influence people
团队合作:Peopleware
用户界面设计:The inmates are running the asylum
我认为理解多线程背后的基本理论是必不可少的,如果没有这个,甚至可能很难看到可能存在问题,直到你在星期天早上4点在现场服务器上进行调试 .
信号量,关键部分和事件 .
争取 low coupling, high cohesion .
low coupling, high cohesion http://www.codeodor.com/images/from_spaghetti_code_to_better_code.jpg
(我从上面链接的网站上偷了这张图片)
这里已经提到了很多好的回答,但是我想添加一个重要的子集,但到目前为止尚未涉及 .
经过15年的本科专业软件开发,我发现我经常在学校使用以下一些概念:
一般OO概念,以及现代编程语言特性(类,数据隐藏等) .
算法性能指标(Big O表示法) . 在设计算法时,执行Big O分析以确定算法的成本,并在瓶颈区域中寻找更有效的替代方案 .
链接列表和其他复杂数据结构 .
快速排序和不同的排序概念 .
树木和快速树操纵 .
如果您的语言/平台不支持垃圾收集,内存分配和清理至关重要,并将添加到列表中 .
作为最近从计算机科学学位毕业,我建议如下:
OO设计
数据结构和算法(如果我记得的话,不记得我用过的书的确切 Headers 会更新)
操作系统http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580
NP问题
看一下Steve Yegge(前亚马逊,现在谷歌)的这篇博文:
它详细介绍了开发人员应该了解的五个最重要的概念:
基本编程(包括递归,文件I / O,格式化输出,循环等)
面向对象的设计(包括设计模式等) . 您应该能够生成合理的OO设计以及理解概念 .
脚本和正则表达式 .
数据结构 - 列表,集合,哈希表,树,图等 - 以及Big O表示法和算法复杂性 .
位,字节和二进制数 - 如何在计算机中表示数字,以及如何操作它们 .
我想说现在对面向对象编程的理解是必须的,即使你不需要每天都使用它 .
从这一点我也会说,了解最常见的模式也可以提供帮助 .
我很担心能够深入了解你所读到的每一个主题 - 在这一点上,'s more important that you'能够识别出你真正面临的问题 . 换句话说,它知道如何解决组合问题,只要你知道足够查找"combinatorics",当你需要查看有多少种方法可以安排一组对象或选择一个子集时 .
对于这种广泛的浏览,维基百科是一个非常好的资源,特别是如果你只是开始浏览 . 一个更好的,特别是如果你发现维基百科太学术或无法访问,是C2 wiki . (有趣的是,这是Ward Cunningham发明的原始维基) .