11

每个程序员都应该尝试的项目

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzIzNjUxMzk2NQ%3D%3D&%3Bmid=2247504858&%3Bidx=1&%3Bsn=d0090492f8b8187ebbe62949749cafd4
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

zEj6v2e.png!mobile

作者 | Austin Z. Henley

译者 | 王者

策划 | 万佳

一年前,我发表了“每个程序员都应该尝试的项目”一文。文中列出了每个程序员都应该去尝试的项目,包括一个文本编辑器、太空入侵者游戏、一个 BASIC 编译器、一个小型的操作系统、一个电子表格和一个视频游戏控制台模拟器。这篇文章在网上爆红,一个月内浏览量超过 10 万次。

https://web.eecs.utk.edu/~azh/blog/challengingprojects.html

现在,我要加入更多“现代”的项目:

  • 光线追踪器

  • 键值存储 Web API

  • Web 浏览器

  • 股票交易机器人

1 光线追踪者

它是 3D 图形!在发表前一篇文章后,我收到很多评论,建议加入光线追踪器。我同意了他们的建议。事实上,这是我在 2009 年学习 C# 时最先尝试的一个项目。如果你无法马上理解所有与数学相关的东西或术语,请不要担心,你可以循序渐进,努力取得进步。网上有很多关于光线追踪器的资源优势,在学习过程中,你会获得强烈的视觉感受。

iiEB7jF.png!mobile

光线跟踪器可以生成一些非常好看的图像,只需要 300 行代码!首先,你可能需要支持各种反射、光线和纹理,或者你开始意识到原来渲染一张图片需要几分钟,所以你开始优化。你可以使用线程并行化光线追踪器、减少交集的数量,或者使用分析器来跟踪分配了多少对象并找出瓶颈。

创意!我不想再去做另一个优化到半路的光线追踪器,也不想追求超现实的折射效果。相反,我特意降低了分辨率,这样就可以做出实时动画。一个带有下落粒子旋转圆环的动图可以让你在推特上获得不少点赞。我认为独立游戏可以走这条路,创造出独特的艺术风格。请期待我的 8 位复古视频游戏!

更多资料:

  • 系列书籍之“Ray Tracing In One Weekend”- https://raytracing.github.io/

  • 《计算机图形程序设计入门》- https://www.scratchapixel.com/lessons/3d-basic-rendering/get-started

  • 计算机图形入门- https://www.gabrielgambetta.com/computer-graphics-from-scratch/introduction.html

  • 用 Python 开发光线跟踪器- https://medi um.com/swlh/ray-tracing-from-scratch-in-python-41670e6a96f9%22

  • Go 光线追踪器优化- https://dzone. com/articles/optimizing-a-simple-ray-tracer-written-in-go-part

  • 用 JavaScript 实现实时的光线追踪- https://johanneshoff.com/raytrace-mirror/

  • 层次包围盒结构- https://en.wikipedia.org/wiki/Bounding_volume_hierarchy

  • 光线追踪宝石- https://am zn.to/374vhM4

  • 光线追踪器挑战- https://amzn.to/2VZCirf

  • 实时渲染- https://amzn.to/3mbkILo

2 键值存储 Web API

键值存储实际上就是一个字典。向它提供一个键,它就返回一个值。你可以添加新键、删除键或更新值。实际上,这就是一个 NoSQL 数据库!不过你可以更进一步,将其作为 Web API,这样你未来的所有 Web 应用程序都可以使用你的数据库服务。

我真的很喜欢这个项目,因为用它来创建最基本的“数据库”真的很容易。你可以从使用任何一门编程语言所提供的字典数据结构开始,并在这个基础之上添加一个 Web API。除此之外,你还可以添加更多的内容:性能优化、安全性和多用户、原子事务、数据类型、批处理操作、持久性、故障恢复,以及跨多个服务器运行能力。很快,你就会拥有像 Redis 或 Amazon DynamoDB 那样价值 10 亿美元的产品。

说真的,打开你的代码编辑器,并使用你最喜欢的编程语言尝试一下。为了获得不同的体验,我用 Go 和 Racket 试过了,并从中获得了很多启发。在一些小型的测试中,我的 Go 版本的性能已经足够好了。

更多资料:

  • 键值数据库- https://en. wikipedia.org/wiki/Key%E2%80%93value_database

  • B 树数据结构- https://en.wikipedia.org/wiki/B-tree

  • 原子性- https://en.wikipedia.org/wiki/Atomicity_(database_systems)

  • 如何使用 Go 构建一个键值存储- https://medium.com/@naqvi.jafar91/how-i-built-a-key-value-store-in-go-bd89f68062a8

  • Badger:超快的 Go 键值数据库- https://github.com/dgraph-io/badger

  • 如果你想深入了解数据库,可以看看这本《自己动手设计数据库》- https://amzn.to/3m8r5is

3 Web 浏览器

第一次面试一个软件开发岗位时,面试官问我:“当你在浏览器上输入 Yelp.com 并按回车键时,都发生了什么”?我回答得不好,没有通过面试。于是,我开始了解万物运作原理的旅程。我发现最有趣的是浏览器如何将 HTML 和 CSS 转换成渲染好的 Web 页面。这是一个很常见的面试题,但我却因为太无知没有回答好。有一个非常棒的资源,它为很多问题提供了答案。

https://github.com/alex/what-happens-when

想要设计出一些足以击垮 Safari 或 Brave 的杀手级用户界面?不要抱太大希望了。在你达到那个目标之前,还有很多事情要做!不如让我们来缩小一下范围,假设你有一个 HTTP 库和一个 HTML 解析器,你必须实现自己的渲染器。你不能使用 WebBrowser 或 WebKit 之类的东西。你会怎么做?

RJZ7Jb6.png!mobile

我的建议是从创建一个基于文本的 Web 浏览器开始。实际上,你也可以忽略所有的格式化问题,忽略所有的 JavaScript 和 CSS。你要做的是使用给定的 URL 执行 HTTP GET,解析 HTML,找到需要显示的文本,并将其显示在屏幕上。你要做的就是这些。

获得纯文本之后,你就可以添加其他功能了。你可以添加标签、历史、后退和前进按钮,等等。但到了某个时候,你可能想要的不只是文本……那么祝你们好运。渲染网页视觉元素可能是我永远不会去尝试的事情,或许要等到我有用不完的时间。一步一步来,每次只关注一个 HTML 标记和属性。如果你想尝试这么做,请让我知道是如何进行的。

更多资料:

  • Browsh:一个基于文本的浏览器- https://github.com/browsh-org/browsh

  • HTML 标准- https://html.spec.whatwg.org/

  • Mozilla 的 HTTP 文档- https://developer.mozilla.org/en-US/docs/Web/HTTP

  • 让我们来构建一个浏览器引擎- https://limpet.net/mbrubeck/2014/08/08/toy-layout-engine-1.html

  • Web 浏览器工程- https://browser.engineering/

4 股票交易机器人

现在,你有机会构建一些理论上可以让你变得富有的东西:股票交易机器人!构建一个基础的交易机器人是非常简单的,你可以添加无穷无尽的功能。你甚至不需要了解任何与投资有关的知识。在这个过程中,你至少可以学到如何利用不同的 Web API、如何处理数据,并应用现有或创建自己的交易策略。你可以使用大量的历史数据来测试它。

这样还不够?那就用上机器学习或搭建一个 Twitch 流,让陌生人来控制你的钱。

https://socialblade.com/blog/twitch-stockstream-bot/

bueYN3V.png!mobile

这是一个基础的交易机器人开发路线。首先,找出几家你感兴趣的大公司 (如苹果、特斯拉和 Target)。第二,确定何时买进、何时卖出。例如,如果当前价格达到 52 周低点就买入,如果达到 52 周高点就卖出。(千万不要把这个策略用在实际当中,这个策略其实是个愚蠢的策略)。第三,弄清楚如何使用一个免费的 API 来获取股票数据。第四,建立测试环境,让它跑起来!

现在可以找乐子了……使用历史数据进行自动化测试,实现几十种交易算法,并对它们进行比较,添加可视化,使用 API 连接到真正的券商服务器,尝试一些机器学习或进化算法,并将成功的交易结果共享到 Twitter 上。

更多资料:

  • 交易信号- https://www.investopedia.com/terms/t/trade-signal.asp

  • trump2cash:一个交易机器人- https://github.com/maxbbraun/trump2cash

  • Q 学习- https://en.wikipedia.org/wiki/Q-learning

  • 如何从零开始构建一个股票交易机器人- https://towardsdatascience.com/how-to-get-started-building-a-stock-cryptocurrency-forex-trading-program-2abbf0a4729f

  • 免费构建一个人工智能股票交易机器- https://medium.com/swlh/build-an-ai-stock-trading-bot-for-free-4a46bec2a18

  • 如何用 Python 构建算法交易机器人- https://www.activestate.com/blog/how-to-build-an-algorithmic-trading-bot/

  • 罗宾汉 API 指南- https://algotrading101.com/learn/robinhood-api-guide/

原文链接:

https://web.eecs.utk.edu/~azh/blog/morechallengingprojects.html

点个在看少个 bug :point_down:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK