4

我作为一名开发人员已经工作了大约 2 年,我的 IT 学位有点糟糕,我希望我已经获得了一个“适当的”计算机科学学位,因为我已经意识到我的知识存在巨大差距。

我完全在 c# 中工作,并进行了一些前端 Web 开发。有些东西真的很想学,我想知道人们是否可以向我指出一些好的资源。我基本上一直在尝试列出我不知道的内容并按优先级排序。任何人都可以建议我可以为列出的每个项目和要使用的资源尝试的示例项目(欢迎网络和书籍建议)。

  • 网络,了解完整的 IP 堆栈等。
  • http 协议,OReilly 的书值得一​​看吗?
  • 多线程应用程序
  • 低级编程,目前从头开始使用此编程的汇编
  • 数据结构和算法。
  • 操作系统
  • 您认为应该在此列表中的任何其他内容!

我想我在问,“每个开发人员应该知道什么?他们应该在自己的时间尝试哪些项目以确保他们很好地理解这个主题”。我知道我的清单是相当分散的枪,但我想这就是为什么我要在我的方向上寻求一些帮助。

提前感谢任何花时间对此做出回应的人。

..布里

4

7 回答 7

2

好的,攻击您给出的列表(顺便说一句,它们听起来一点也不杂乱无章-您听起来好像对计算机系统感兴趣,这是一个成熟而活跃的研究领域)。

我将为您提供每个领域的资源和示例项目:

数据结构和算法。

  • 资源:规范的书,我仍然认为是最好的一本,是 Cormen 等人的《算法导论》。这不是很容易,但它非常丰富且解释清楚。使用 wikipedia(其 DS+A 页面总体上还不错)和 NIST 词典备份您无法从那里完全掌握的内容。
  • 项目:用您选择的语言实现尽可能多的您喜欢的算法。如果你使用上面的 ITA,我只推荐 Python,因为它是最接近他们使用的伪代码的语言,但不要太担心你的语言选择。我再说一遍,不要陷入选择语言的困境;有足够的时间来学习它们:)

联网。

  • 资源:要了解它们如何组合在一起,有几本好书。我喜欢 Tanenbaum 的“计算机网络”,但另一个可能更适合您的好选择(尽管需要注意的是,我自己没有彻底阅读过)是 Kurose 和 Ross 的计算机网络:使用 Internet 的自顶向下方法。这本书可能会很好用,因为你更有可能接触到你早期熟悉的概念。

    要将这一切付诸实践,请阅读 Linux 或 FreeBSD 内核源代码,了解其中的网络堆栈是如何组合在一起的。有很好的资源,无论是印刷版还是网络上,都可以帮助您完成此过程。顺便说一句,我真的不会太担心 HTTP。这是一个重要的协议,但并不是一个非常有趣的协议。在我看来,TCP、IP、UDP、BGP 和朋友们更有趣!

  • 项目:很难知道什么是可行的项目。回答本书章节末尾的问题。通过编写一个简单的客户端-服务器程序自学用户空间套接字编程(“Hello world!”在网上做起来并不难!)。一旦你有了这个,你可能会自己想出一个扩展——也许你想写一个非常简单的网络服务器。

多线程编程:

  • 资源:这是一个巨大的话题。如果您只想了解多线程原语如何在您选择的语言中运行,请在网上查找教程 - 至少有 Python、Java 和 C 的负载。如果您对该理论感兴趣,请在 DDJ 中搜索 Herb Sutter 的关于并发编程的系列(但现在这对您来说可能有点高级)。Herlihy 和 Shavit 的《多处理器编程艺术》是一本关于并发编程的精彩书籍,从非常(非常!)实用的学术角度来看,尽管第一版需要修复一堆错误。
  • 项目:从网络项目中获取您的服务器,并在一个新线程中为每个客户端提供服务,这样您就可以一次接受多个连接。为用餐哲学家的问题编写一个解决方案:)

操作系统:

  • 资源:有几本很好的入门书籍。同样,我是 Tanenbaum 的Modern Operating Systems的粉丝,但 Silberschatz 等。人。书也不错。恕我直言,您真的想要一本书,因为您想在研究特定操作系统的工作原理之前对可用的设计选择进行全面概述。

    但是,当您确实达到了这一点时,我建议您再次阅读 Linux 源代码。网上有很好的文章,也有一些很好的印刷书籍(我喜欢Linux Kernel Development,但它必然有点过时了)。

  • 项目:在虚拟机中安装 Linux 发行版。向内核添加系统调用,并从用户空间对其进行测试。那么内核就是你的牡蛎!尝试破解调度程序 - 首先让它变得非常愚蠢,然后慢慢添加功能。

    如果您愿意,您可以尝试从头开始编写操作系统,但这是一个巨大且可能非常令人沮丧的体验。我建议开始使用现存的内核 - 至少当它坏了你知道这是因为你刚刚做的事情:)

于 2009-02-08T13:33:27.127 回答
2

你读过完整的代码吗?这是一个很好的起点,因为它突出了各种主题的大量额外阅读。

于 2009-02-07T18:28:15.737 回答
0

值得一看的一本好书是 Silberschatz、Galvin 和 Gagne 的“操作系统概念”。

它引导您思考从线程、内存管理到操作系统设计结构的各个方面。书中的例子都是C语言的,所以很容易掌握。它确实填补了您对整个操作系统可能存在的任何空白。

于 2009-02-07T18:26:15.693 回答
0

您可能会尝试的一件事是为计算机科学课程找到一些公共教学大纲。看看他们在做什么类型的项目并自己尝试。当您需要帮助时,请根据需要查阅书籍、论坛和 SO。

我认为我在本科期间学习的最基础的 CS 课程是编程语言理论、计算机组织、操作系统和理论/离散数学课程。

尝试采用经典算法并用 4 种不同类型的语言实现它。(例如尝试 C#、LISP、Prolog 和 C)向 Linux 内核的本地副本添加一些玩具功能,以查看它是如何运行的。编写分布式文件系统。这些是学校里教会我最多的一些项目。

于 2009-02-07T18:30:33.673 回答
0

一定要看看计算理论。几本很棒的书是: http ://www.amazon.com/Introduction-Theory-Computation-Michael-Sipser/dp/053494728X http://www.amazon.com/Computability-Complexity-Languages-Second-Fundamentals/dp /0122063821

我还会查看 projecteuler.net 并解决其中的一些问题。避免使用蛮力解决问题......相反,查看数学并尝试学习将在 CS 理论课中讨论的常见算法和概念。

于 2009-02-07T18:32:59.503 回答
-2

我的必备知识是:

  • 依赖注入容器
  • 单元测试
  • 模式(有点)
  • 领域模式(原型)
于 2009-02-07T18:29:09.307 回答