由鱼和羊编辑
量子报道|微信官方账号QbitAI
光有理论对编程来说是不够的。动手实践是必修课。
但是,往往很难从什么项目入手。
如果你还在纠结哪些项目可以开始自己的编程实践,请看看这份“程序员应该尝试的挑战项目”清单。
这是奥斯汀亨利,田纳西大学的助理教授。
Henley)结合自己的经历,给出了良心推荐。它不仅总结了知识要点,还使你在学习中有了明确的目标,并密切组织扩展的阅读材料。
你可以多次构建这些项目,每次都能从中获得新的知识。
每当我不知道该练习什么,或者想学习一门新的编程语言或框架时,我会选择以下项目之一开始编码:
# #每个程序员都应该尝试的具有挑战性的项目
# # #文本编辑器
如何在不使用GUI框架中内置的文本框组件的情况下,构建一个支持光标移动、选择、插入和删除的文本框?
这个项目有两个主要挑战:
*如何在内存中存储文本文档
*了解流行编辑器中文本光标的行为。
不要低估这些基金会的作用,有很多细节值得注意。例如,当光标在文本中间时,按向上箭头,光标会移动到哪里?
# # # # # 来源:奥斯汀亨利
如果你认为这太简单,有一些高级测试:
*撤消/重做
*自动换行
最后,总结知识要点:
*存储文本的数据结构:数组、绳子、间隙缓冲区、片表
*文本光标的行为和实现
*撤消/重做设计模式:内存、命令
*分离文本视觉和记忆的抽象
别忘了拓展阅读:
### 2D游戏-太空入侵者
即使是最简单的游戏也需要考虑数据结构和设计模式。
在这个项目中,你的任务是从头到尾实现一个定义明确的游戏。最好使用2D图形库,如SDL,SFML和PyGame。
# # # # # 来源:奥斯汀亨利
第一步是创建对象移动的效果。
第二步:了解游戏周期的所有信息。游戏实际上是在绘制、获取用户输入和处理游戏逻辑之间的一个循环。
第三步是处理用户输入。
第四步:学习如何创建和管理所有游戏对象及其状态。比如如何生成动态的敌人数量。
第五步是学习如何应用游戏的逻辑。子弹位置什么时候更新?什么时候屏幕上会出现更多的敌人?如何确定敌人已经被击毙?游戏什么时候结束?
即使到了高级阶段,也可以考虑引入AI来制造更多的“智能”敌人。
# # #编译器-微型BASIC
从头开始写一个非常小的类似BASIC的语言编译器,然后编译成任何其他语言。比如用Python编写可以输出C#代码的Tiny BASIC编译器。
# # # # # 来源:奥斯汀亨利
知识点:
*词汇分析
*语法分析
*递归下降分析
*抽象语法树
*语义分析
*优化通道
*代码生成
# # #迷你操作系统
从这个项目开始,难度就增加了。
系统的运行依赖硬件,所以入门门槛比较高。但是这个项目可以帮助你。
更好地理解计算机底层都发生了什么。作者亨利推荐了一本免费电子书《使用Rust构建RISC-V操作系统》作为入门教材(地址见文末)。
###### △图源:Austin Z. Henley
知识点:
* 交叉编译
* Bootloading
* BIOS中断
* x86模式
* 内存管理和分页
* 排程(Scheduling)
* 文件系统
如果以上四个项目,你都觉得so easy,那么就来尝试一下最后这两个高难度项目吧。
### 电子表格
电子表格应用程序(如Excel)将文本编辑器和编译器的挑战结合在了一起。
在这个项目中,你需要学会如何在内存中表示单元格内容,并实现用于方程式的编程语言解释器。
### 电子游戏机模拟器
这是一个操作系统+编译器的二合一挑战项目。
挑战内容是,编写一个虚拟机,让虚拟机可以像真实的CPU和其他硬件组件一样运行。
亨利的建议,是从简单的虚拟控制台入手,比如CHIP-8。
## 网友建言献策
博客一出,在Hacker News、Reddit上受到了广大码农们的欢迎。
有网友说:
> 这些项目能让我接触到完全不同的领域和问题,比我日常的工作更能激励我。
并且,网友们纷纷建言献策,又推举出好几个优质上手项目:
* 从零搭建数据库
* 光线追踪器
* 矢量图形编辑器
* 图像解码器
* 网页聊天室
* pi计算器的位数
* 通用终端实用程序(如grep)
* FTP客户端和服务器
所以,这些项目是否激发了你的灵感?
Talk is cheap. Show me the code. 快动手练起来吧~
## 传送门
博客地址:
http://web.eecs.utk.edu/~azh/blog/challengingprojects.html
Hacker News讨论(内含更多项目推荐):
https://news.ycombinator.com/item?id=21790779
《使用Rust构建RISC-V操作系统》:
http://osblog.stephenmarz.com/index.html
― 完 ―
量子位 QbitAI 头条号签约
关注我们,第一时间获知前沿科技动态