您认为计算机科学中的哪些概念使您成为更好的程序员?
我的学位是机械工程,所以最终成为一名程序员,我有点缺乏基础知识。我最近学到了一些标准的 CS 概念,这些概念让我对自己正在做的事情有了更深入的了解,特别是:
语言特点
- 指针和递归(感谢 Joel!)
数据结构
- 链表
- 哈希表
算法
- 冒泡排序
显然,目前该列表有点短,所以我希望得到以下建议:
- 我应该理解哪些概念,
- 任何可以正确理解它们的好资源(因为维基百科有时可能有点密集和学术性)。
您认为计算机科学中的哪些概念使您成为更好的程序员?
我的学位是机械工程,所以最终成为一名程序员,我有点缺乏基础知识。我最近学到了一些标准的 CS 概念,这些概念让我对自己正在做的事情有了更深入的了解,特别是:
语言特点
数据结构
算法
显然,目前该列表有点短,所以我希望得到以下建议:
看看 Steve Yegge(以前在亚马逊,现在在谷歌)的这篇博文:
它详细介绍了开发人员应该了解的五个最重要的概念:
您绝对应该了解算法的Big-O表示法和 Big-O 估计 - 它是什么、如何使用、为什么重要、如何根据 Big-O 估计比较两种算法、如何构建 Big-O 估计对于简单的算法。
我觉得你在寻找计算机科学科目有点好笑,但觉得维基百科太学术了:D
无论如何,这里没有特别的顺序:
一些帮助我发展的概念(智力和代码):
这些是离散数学的整个领域,但 CS 需要认真介绍:
尽管Mark Jason-Dominus的讲座和文章经常针对 Perl 黑客,但我认为任何程序员都会从他清晰的演示文稿和真实代码中受益,尤其是在高阶 Perl中。
我想说的是,现在必须了解面向对象编程,即使您不需要每天都使用它。
由此,我还想说了解最常见的模式也有帮助。
我看到了几个很好的 CS 概念,但很少谈论数学。
我建议你研究离散数学。它有很多有用的问题,从逻辑证明开始,可以帮助您在代码中编写条件。图论和组合学也有助于解决复杂问题和优化算法。
当我们讨论数学时,线性代数通常是高级计算机图形课程的先决条件。
程序员能力矩阵详细介绍了这一点,但我会强调几个:
我发现图表和一些应用算法,如深度优先、呼吸优先搜索、最短路径等非常有用。面向对象也是一个非常普遍的概念。
规则 1:软件是知识获取。软件意味着什么。如果您不清楚含义,请花更多时间与用户交谈以了解他们的工作。
算法和数据结构是同一枚硬币的两个方面。算法取决于数据结构,数据结构取决于算法。
尽快忘记冒泡排序。严重地。所有现代语言(Java、Python 等)都有实现比冒泡排序更好的排序的集合类。绝对没有任何情况下您应该对任何事情使用冒泡排序。您应该寻找一个包含排序方法的集合类。更好的是,您应该寻找一种完全避免排序的算法。
你必须学习几种语言。
编程语言(Java、Python 等)
外壳语言。
数据库语言 (SQL)
演示语言(HTML 和 CSS)
其他数据表示语言(XML、JSON)
您必须学习几种数据结构。
序列(列表、元组、文件)
分层(如 XML 和 HTML 文档,以及基本文件系统)
关系型(如数据库,以及带有硬链接和软链接的文件系统)
映射(或索引或关联数组),包括哈希映射和树映射
套
加上一些算法复杂度分析。有时称为“大 O”。为什么冒泡排序不好,因为它是O ( n ^ 2 ),而快速排序是O ( n log n )。
那么蠕虫罐现在打开了!:)
我从电气工程开始。
关系数据库设计: 跟踪数据就像《幼儿园警察》中的阿诺德。
这可能是完全的混乱。必须加以控制。
如何以最少的重复信息将数据保存在最少的位置。如何让您的数据轻松且易于访问。如何控制数据增长和完整性。
用户界面 (UI) 设计: 这是用户必须访问我们正在跟踪的数据的方式。
大多数 UI 都是由开发人员设计的。因此,不幸的是,大多数 UI 与数据库设计并行。用户根本不关心数据设计。他们只是想要,他们想要什么。他们想轻松获得它。通常这需要与数据设计和用户界面有很大的分离。学会将“工程”的你与“南方的热情好客”的你分开。
面向对象编程: 许多语言归结为这种格式。
并行处理 - 多线程: 许多处理器使工作变得更快!
并行计算机已经存在了几十年。它们已经在我们的桌面上使用了一段时间了。随着“云计算”的兴起,海量并行处理不仅是强制性的,也是可取的。它非常强大!并行开发人员有很多工作潜力。
了解业务规则: 这可以帮助您将大量逻辑基于表。
许多 IFblock 条件可以位于业务规则表中。要更改逻辑,只需更改表中的信息。很少/没有重新编码。很少/没有重新编译。
事件监督...方法完成工作:
在代码中保持独立。它使其他人将来更容易进行更新。它也与模型/视图/控制器 (MVC) 框架有些相似。
PJ
对我来说,我从大学的以下课程中得到了很多
我希望我在大学里做过的事情
我认为很好地了解编译器是如何工作的。Aho 有一本关于创建编译器所用概念的经典书籍。标题是编译器:原理、技术和工具。它的别称是龙书。为了真正理解那本书,你应该了解形式语言。Hopcroft 有一本关于这方面的好书 - 自动机理论、语言和计算导论。
这里已经提到了很多好的回应,但我想添加一个重要的子集,但到目前为止还没有被覆盖。
经过 15 年的本科后专业软件开发,我发现我经常使用学校中的以下一些概念:
如果您的语言/平台不支持垃圾收集,内存分配和清理至关重要,并将被添加到列表中。
我赞成离散数学。计算机科学是抽象的。学习像数学家一样思考是非常有帮助的。
我还想补充一下 S.Lott 关于语言的说法。学习一堆语言类型也很重要。不仅仅是编译 vs 脚本。但是函数式(ML、Lisp、Haskell)逻辑(Prolog)面向对象(C++、Java、Smalltalk)命令式(C、Pascal、FORTRAN 甚至)。
你知道的编程范式越多,当热门的新语言出现时,学习新语言就越容易!
尝试了解所有级别的编程。从最低级别(装配)到最高级别。
以递归为例,这是一个简单的功能:) 尝试学习汇编并创建一个将在汇编中使用递归的程序。
这显然是对面向对象编程的良好理解、良好的指导原则(如SOLID 原则)以及遵循既定模式和实践。
如果您查看 SOA 或 DDD,它们最终都会退回到某种形式的 OOP 概念。
我建议你买一些好的 OOP 书籍,然后选择一门丰富的语言,比如 C# 或 Java
(PHP、ruby 的人请不要投我的票,我只是举一些例子让他开始,你可以在这里提供你自己的答案和建议)
算法。
学习以一种下降的方式使用编程语言是你可以边做边学的东西,但是你自己发明所有广泛使用的算法几乎是不可能的。一个人至少应该知道什么可以做,什么不能做有一些问题。
例如,一个人根本无法编写一些带有冒泡排序的程序并期望它被认为是好的,无论代码多么好。
总结一下 - 看看算法简介
不需要掌握它,只要知道发生了什么...
作为计算机科学学位的应届毕业生,我建议以下内容:
正如各种帖子中提到的大 O 符号
面向对象设计
数据结构和算法(不记得我用过的书的确切标题,如果我记得会更新)
操作系统 http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580
NP问题
计算机程序的结构和解释。如果你理解了这本书,那么其他一切都可以轻松地建立在这个基础上。如果你对书中的概念有疑问,你可能是一名软件开发人员,但不是计算机科学家。
我不会告诉你任何要学习的具体概念,而是建议你对广泛的主题进行大量的轻读。不要担心对你读到的每个主题有深入的理解——在这一点上,更重要的是你能够识别出你在看什么样的问题,这样你就可以做一些只是——当你真正面对它时,及时学习。换句话说,如果您不知道如何解决组合数学问题,那也没关系,只要您知道的足够多,以便在需要查看可以排列一组对象或选择子集的方式时查找“组合数学” .
对于这种广泛的浏览,维基百科是一个很好的资源,特别是如果你只是开始浏览。一个更好的,特别是如果你觉得 Wikipedia 太学术或难以访问,是C2 wiki。(有趣的是,这是Ward Cunningham 发明的原始 wiki)。
软件开发生命周期——需求收集、设计和分析、实施、测试、支持和维护序列。这与将这些步骤付诸实践的方法论(如瀑布和敏捷)一起也是学习的重要内容。
我认为理解多线程背后的基本理论是很重要的,如果没有这些,甚至很难看出可能存在问题,直到您在周日早上 4 点在实时服务器上进行调试。
信号量、关键部分和事件。
不,不是冒泡排序,而是快速排序。这是大 O 的事情 - 冒泡排序平均 O(n^2),快速排序是 O(n*log(n))。
我会说下面是最重要的东西
然后转到特定语言相关的东西。我希望这是有帮助的!!
我将从引用开始:
“如果你拥有的唯一工具是一把锤子,那么你将一切都视为钉子”。(亚伯拉罕·马斯洛)
IMO 最重要的原则是了解许多不同的编程范式、语言,并充分了解您可以使用的工具。几乎可以用您选择的任何语言解决任何问题,无论是具有庞大默认库的成熟主流语言,还是像 AutoHotKey 这样的小型专业语言。程序员的首要工作是根据问题的规范确定使用什么。一些概念提供了更好的主题方法,无论您的主要目标是什么 - 复杂性、混淆、性能、可移植性、维护性、小代码量......
否则你会像一些程序员一样拼命尝试用他们专门的语言做某事,而在不同的编程环境中解决问题可能很简单。
这个建议符合当今多语言项目的趋势(以 Web 应用程序为例,它可能在单个应用程序中涉及多种语言,如 C#、JS、CSS、XPath、SQL、XML、HMTL、RegExp ......甚至不同的编程范式(例如,C# 最近从函数式编程范式中引入了一些概念,lambdas)。
所以,基本的事情是不断学习,永远:)
我认为3D-Graphics是每个人都应该学习的东西。或者至少如何正确使用齐次向量和矩阵变换。
它不仅有助于创建 3d 应用程序,而且还有助于机械领域,如机器人的逆运动学、计算力矩和许多其他东西。
直到我读了 3d 图形,我才完全理解线性代数,这是我上过的最好的课程之一,尽管我们的老师很糟糕。
由于具有多核(CPU 和 GPU)的机器正在成为标准,我想说包括分布式算法(从多线程到多台机器)。了解多线程和分布式处理至关重要。抱歉,该链接并没有真正提供很多帮助。
除了冒泡排序之外的任何东西:
最重要的是:大 O 表示法,因此您知道为什么应该使用其中一种而不是冒泡排序。
如果你要教 big-O,至少要解释一下它描述了算法的时间如何随着更大的输入而扩展——这并不意味着算法会花费更少的时间。
例如,建造金字塔是 O(n),而对它们的照片进行排序最多是 O(n ln n)。因此,建造另一个金字塔比整理假期照片要快。
学生需要了解寄存器、缓存、主存、磁盘和网络上的操作需要多长时间。许多只教授非常高级语言的人没有概念。
(这是有人想讨论的评论)