您认为计算机科学中的哪些概念使您成为了更好的程序员?
我的学位是机械工程学,所以最终以一名程序员的身份开始工作,但我在基础知识方面有些欠缺。我最近学到了一些标准的CS概念,这些概念使我对自己正在做的事情有了更深入的了解:
语言特征
- 指针与递归(感谢乔尔!)
数据结构
- 链表
- 哈希表
演算法
- 气泡排序
显然,此列表目前很短,所以我希望就以下方面提出建议:
- 我应该了解什么概念
- 任何正确理解它们的好资源(因为Wikipedia有时可能有点密集和学术性)。
您认为计算机科学中的哪些概念使您成为了更好的程序员?
我的学位是机械工程学,所以最终以一名程序员的身份开始工作,但我在基础知识方面有些欠缺。我最近学到了一些标准的CS概念,这些概念使我对自己正在做的事情有了更深入的了解:
语言特征
数据结构
演算法
显然,此列表目前很短,所以我希望就以下方面提出建议:
Answers:
看看Steve Yegge(以前是Amazon,现在在Google)的博客文章:
它详细介绍了开发人员应了解的五个最重要的概念:
您绝对应该了解算法的Big-O表示法和Big-O估计-它是什么,如何使用,为什么重要,如何比较两种算法的给定Big-O估计,如何构建Big-O估计对于简单的算法。
我在找计算机科学专业有点可笑,但是维基百科太学术了:D
无论如何,这里没有特别的顺序:
我要说的是,即使您不需要每天使用它,对面向对象编程的理解也是必须的。
因此,我还要说,了解最常见的模式也有帮助。
我看到了一些好的CS概念,但很少谈论数学。
我建议您研究离散数学。从逻辑证明开始,它有很多有用的问题,可以帮助您编写代码条件。图论和组合学还有助于解决复杂的问题和优化算法。
当我们处于数学主题时,线性代数通常是高级计算机图形课程的先决条件。
程序员能力矩阵对此进行了详细介绍,但我将重点介绍以下几点:
规则1:软件就是知识捕获。软件意义重大。如果您不清楚含义,请花更多时间与用户交谈以了解他们的工作。
算法和数据结构是同一枚硬币的两个方面。算法取决于数据结构,数据结构取决于算法。
尽快取消对气泡的排序。说真的 所有现代语言(Java,Python等)都具有实现比冒泡排序更好的排序的集合类。绝对没有任何情况下应该对任何内容使用冒泡排序。您应该在寻找一个包含排序方法的集合类。更好的是,您应该寻找一种避免完全排序的算法。
您必须学习几种语言。
编程语言(Java,Python等)
外壳语言。
数据库语言(SQL)
表示语言(HTML和CSS)
其他数据表示语言(XML,JSON)
您必须学习几种数据结构。
序列(列表,元组,文件)
分层的(如XML和HTML文档以及基本文件系统)
关系型(例如数据库,以及带有硬链接和软链接的文件系统)
映射(或索引或关联数组),包括哈希映射和树形映射
套装
加上一些算法复杂度分析。有时称为“大O”。冒泡排序之所以不好是因为它是O(n ^ 2),而快速排序是O(n log n)。
蠕虫的罐子现在开放了!:)
我刚开始从事电气工程。
关系数据库设计: 跟踪数据就像《幼稚园警察》中的Arnold。
可能是完全混乱。必须对其进行控制。
如何将数据保存在最少的位置,信息的重复最少。如何使您的数据保持明亮且易于访问。如何控制数据增长和完整性。
用户界面(UI)设计: 这是用户必须访问我们跟踪的数据的方式。
大多数UI由开发人员设计。因此,不幸的是,大多数UI与数据库设计并行。用户根本不关心数据设计。他们只是想要他们想要的东西。他们想轻松获得它。通常,这要求与数据设计和用户界面有很大的分离。学会将“工程人员”与“热情好客”分开。
面向对象的编程: 许多语言都归结为这种格式。
并行处理-多线程: 许多处理器使工作速度更快!
并行计算机已经存在了数十年。他们已经在我们的桌面上呆了一段时间了。对于“云计算”,大规模并行处理不仅是必不可少的,而且也是可取的。它非常强大!并行开发人员有很多工作潜力。
了解业务规则: 这可以帮助您基于表创建许多逻辑。
许多IFblock条件可以放在业务规则表中。要更改逻辑,只需更改表中的信息。很少/不需要重新编码。很少/不需要重新编译。
事件监督...方法可以完成工作:
将代码中的各个部分分开。它使其他人将来更容易进行更新。它还在某种程度上类似于Model / View / Controller(MVC)框架。
睡衣
我赞成离散数学。计算机科学是抽象的。学会像数学家一样思考是非常有帮助的。
我还想补充一下S.Lott关于语言的内容。学习一堆类型的语言也很重要。不只是编译还是脚本。但是功能性(ML,Lisp,Haskell)逻辑(Prolog)面向对象(C ++,Java,Smalltalk)势在必行(C,Pascal,甚至FORTRAN)。
您知道的编程范例越多,当新的热门语言问世时,就越容易选择新的语言!
算法。
学习以下降的方式使用编程语言是您可以随时学到的东西,但实际上不可能自己发明所有广泛使用的算法。有一些问题。
例如,无论代码多么精细,人们根本无法编写带有冒泡排序的程序,并期望它被认为是好的。
总结一下-看一下算法介绍
无需掌握它,只需知道发生了什么...
作为计算机科学学位的应届毕业生,我建议以下内容:
如各篇文章所述,Big O符号
面向对象设计
数据结构和算法(如果我记得,我将不记得我用过的书的确切标题)
操作系统 http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580
NP问题
显然,这是对面向对象编程的良好理解,是诸如SOLID Principles之类的良好指导原则。以及遵循的既定模式和实践。
如果您查看SOA或DDD,它们最终都会退回到某种形式的OOP概念。
我建议您获得一些不错的OOP书籍,并开始选择像C#或Java这样的丰富语言。
(PHP,红宝石们,请不要对我投反对票,我只是给他一些例子,您可以在此处提供自己的答案和建议)
计算机程序的结构与解释。如果您了解这本书,则可以在此基础上轻松构建其他所有内容。如果您对本书中的概念有疑问,则可以是软件开发人员,而不是计算机科学家。
我不会告诉您要学习的任何特定概念,而是建议您对广泛的主题进行大量的阅读。不必担心对阅读的每个主题都有深入的了解-此时,更重要的是,您能够识别哪种类型您正在寻找的问题,这样就可以做一些只是-真正面对面时及时学习。换句话说,如果您不知道如何解决组合问题,只要知道的程度足以查找“组合”,就可以了,因为您需要了解可以用多少种方式排列一组对象或选择一个子集。
Wikipedia是进行此类广泛浏览的不错的资源,尤其是如果您只是略读而已。C2 wiki是一个更好的选择,尤其是如果您发现Wikipedia太学术或难以访问时。(有趣的是,这是Ward Cunningham发明的原始Wiki)。
我将从报价开始:
“如果您仅有的工具是锤子,您将像钉子一样对待一切”。(亚伯拉罕·马斯洛)
IMO最重要的原则是了解许多不同的编程范例,语言,并充分了解自己可以使用的工具。任何问题都可以用您选择的几乎任何一种语言解决,无论是功能强大的默认库是功能强大的主流语言,还是像AutoHotKey这样的小型专用语言。程序员的首要任务是根据问题的规格确定使用什么。无论您的主要目标是什么,某些概念都可以为主题提供更好的方法-复杂性,混淆性,性能,可移植性,可维护性,较小的代码长度...
否则,您将像某些程序员一样拼命尝试以他们专用的1种语言来完成某些工作,而在不同的编程环境中解决该问题可能是微不足道的。
该建议与当今多语言项目的发展趋势保持一致(例如,Web应用程序,它可能在单个应用程序中涉及多种语言,例如C#,JS,CSS,XPath,SQL,XML,HMTL,RegExp ....甚至不同的编程范例(例如,C#最近从功能编程范例lambda中引入了一些概念)。
因此,基本的东西就是永远的不断学习 :)
由于具有多核(CPU和GPU)的计算机已成为标准,因此我要说包括分布式算法(从多线程到多台计算机)。了解多线程和分布式处理至关重要。抱歉,该链接确实没有提供很多帮助。