以拥有电子工程学位而不是计算机科学学位的人的身份讲,要使我成为一个更好的现实世界程序员,我应该知道的一点计算机科学知识是什么?
(在现实世界中,我的意思是我在作为程序员的日常工作中会使用并从中受益—例如,我建议理解数据库规范化比理解快速的分类更实用。的图书馆)。
if
和loop
声明写过用途研究这两个领域的一个子集。
以拥有电子工程学位而不是计算机科学学位的人的身份讲,要使我成为一个更好的现实世界程序员,我应该知道的一点计算机科学知识是什么?
(在现实世界中,我的意思是我在作为程序员的日常工作中会使用并从中受益—例如,我建议理解数据库规范化比理解快速的分类更实用。的图书馆)。
if
和loop
声明写过用途研究这两个领域的一个子集。
Answers:
如果我只需要选择一点,这是一个困难的决定,那我就说使用Big O表示法。了解O(n),O(ln n),O(n²),O(2 ^ n),O(n!)的含义有助于您避免很多昂贵的错误,这些错误在测试环境,但灾难性地使生产失败。
这是一个问题,每个人都会有不同的答案。我会说:复杂性理论是最重要的部分,无论如何您都不是直接以程序员的身份学习的(例如算法和数据结构),但是可能会影响您的工作。如果我知道问题是三次复杂的,这将很有帮助,如果知道问题的规模增加,它将很难扩展。
了解数据结构,算法和复杂性。
仅仅为了了解机器不是无限功率的魔盒,也不过分。您不能向它扔任何东西,并且期望它在毫秒内崩溃。您知道有限制。您需要学习不使用代码测试它们。
还可以查看解决编程中特定设计问题的常用方法。设计模式即。不要崇拜他们,只是接受他们交流的想法。
数据库建模知识也是必不可少的。
之后,只有不同的编程语言,框架和库才能实现或让您实现核心概念。拿起您喜欢的东西,然后与他们一起练习。
是的,这把我踢了好几个小时。
在此过程中,我已经删除了此处给出的一些常见答案。
没有清单
大O(n)表示法。很难把它放在这里,但是不,我们可以直观地算出效率低下的情况,并比较不同的过程集,而无需甚至没有听说过渐近算法分析。
功能语言 不,一种语言只是思考问题的一种方法。为什么只有这一点很重要?
停止问题 有些问题过于具体,人们过着不知道存在的生活。
聆听 如果您不听,那么您将生活在自己的世界中。不一定有害!
软件开发周期不 !我们仍然可以尝试一些令人难以置信的软件或英雄般的努力。
复杂性理论, 我想可能是这样,但是没有所有形式主义
Comp Science的一点想法
我会说-“ 抽象抽象抽象... ”。了解它。查看周围的示例,并学习如何使用它进行构建。到处都是。整个计算机科学,工程学和应用程序看起来像抽象的分层。
一旦知道了这一点,便开始学习环顾四周。
当您看到list insertion
在python
和中使用某个代码时not append
,您会笑着,因为您知道python列表是使用数组抽象构建的,其中插入既昂贵又附加廉价。
这只是一个例子。
只有三个数字很重要:
存在与计算机相关的问题这一事实根本无法通过计算机解决。
您应该了解足够的自动机理论,以便能够知道您要处理的问题在形式语言的层次结构中所处的位置。由此,您可以找出一些重要的实际用途,例如为什么不应该使用REGEX来解析HTML。(HTML需要上下文无关的语法来描述它),以及为什么编译C ++所需的时间要长得多,而不是Java或C#(C ++需要使用图灵机,而Java和C#可以使用上下文无关的语法来描述)。
形式语言最重要的层次是从最弱到最强:
可以通过有限自动机或REGEX解析的语言(带有反向引用的REGEX实现比该类别更强大,但它们仍然无法解析类别2中的所有内容)
可以由具有堆栈存储器的自动机或上下文无关语法解析的语言。
可以由图灵机或具有随机存取存储器的自动机解析的语言。
我建议您了解软件开发生命周期。当然,这是在第二年的计算机科学课程中介绍的,并且在软件项目中反复使用。这对于了解项目从头到尾如何运作很有用,尽管如果您想更深入地了解,可以学习瀑布方法或敏捷方法,以获取更多具体知识。
数学和计算机科学系的霍巴特大学和威廉史密斯学院提供了计算机科学124程序设计导论:
主题包括控制结构,对象,类,继承,简单数据结构和软件开发的基本概念。
如果您不能编程,那么您在实际计算中就不会走得太远。
而且,是的,我已经注意到您是程序员。这是为了提高您对编程理论的全面了解,以及您可以使用哪些其他方法。
是我们所知道的编程计算机科学吗?
在回应@Thomas Owens的评论时(非常正确地指出编程不是严格的计算机科学),我想引用Wikipedia的Computer Science文章:
...计算机科学的重点更多是在理解用于实现软件(例如游戏和网络浏览器)的程序的属性,并利用这种理解来创建新程序或改进现有程序...
因此,在我阅读本文时,通过编程,您正在展示对编程理论的理解。反过来,这应该可以帮助您创建简单,优雅的代码,这对于其他人来说很有趣。
我不得不不同意康拉德·鲁道夫。为了使您成为更好的“现实世界的程序员”,您应该了解计算机科学的“一点点”。如果您没有其他答案,请至少考虑一下-满足要求与满足客户不同!最终用户将始终以您从未想到或未编码的方式尝试使用您的程序。总是,总是,总是。
因此,为了成为一个更好的程序员,您必须首先收听。听客户。听他们的需求。听他们的想要。特别是,听听他们的“技术专长”水平。我无法告诉您我已经看到多少次构建的项目正是所要求的,但根本没有客户实际需要的。都是因为收集需求的程序员没有真正在听。
除非您具有UI设计的背景知识,否则您可以带走的其他东西就是让别人来设计UI。我总能发现一个由程序员而非专家设计的用户界面。对您而言合理的逻辑对客户而言毫无意义。而且,如果您的客户不精通技术(谁是谁?),那么您的“功能正确但外观上很丑陋”的解决方案将在晚宴上令人回味。
功能语言!
学习函数式语言可以使您根据表达式而不是步骤和命名的可变状态(变量)进行思考。这对您有效处理日常编程问题的能力产生了重大影响-尤其是现在几乎每种流行语言都具有功能特性。
算法和复杂性理论也很重要,但是它没有那么有趣,因为它主要是让您在通常已经知道并可以推断出的名称上加上名称。