网站首页 > 教程分享 正文
鱼羊 编译整理
量子位 报道 | 公众号 QbitAI
编程这件事,光有理论是不够的,动手实践是必修课。
不过,从什么项目入手,往往让人犯了难。
如果你还在纠结,应该拿什么项目来开始自己的编程练习,不妨来看看这份“程序员都应该尝试的挑战性项目”清单。
这是田纳西大学助理教授奥斯汀·亨利(Austin Z. Henley)结合自身经验,给出的良心推荐。不仅总结了知识要点,让你在学习中有的放矢,还贴心整理了拓展阅读资料。
你可以多次构建这些项目,每次从中收获新的知识。
每当我不知道该拿什么练手,或者想学习一种新的编程语言或框架时,我就会从以下项目中选择一种开始coding:
每个程序员都应该尝试的挑战性项目
文本编辑器
不使用GUI框架中内置的文本框组件,要如何搭建支持光标移动、选择、插入和删除操作的文本框?
这个项目中,存在两个主要挑战:
- 如何将文本文档存储在内存中
- 学习文本光标在流行的编辑器中的行为
不要小看这些基础的功能,其中有许多细节值得注意。比如当光标位于文本当中,按下向上箭头,光标会移动到何处?
△图源:Austin Z. Henley
如果你觉得这太简单,还有进阶测试:
- 撤销/重做
- 自动换行
最后总结一下知识要点:
- 用于存储文本的数据结构:数组,rope,gap buffer,piece table
- 文本光标的行为和实现
- 撤销/重做的设计模式:记忆,命令
- 分离文本视觉和记忆的抽象
别忘了还有拓展阅读哟:
2D游戏-太空侵略者
即使是最简单的游戏也需要考虑数据结构和设计模式。
在这个项目中,你的任务是从头到尾实现一个定义明确的游戏。最好使用SDL,SFML,PyGame这样的2D图形库。
△图源:Austin Z. Henley
第一步,创建对象移动的效果。
第二步,了解有关游戏循环的所有信息。游戏实际上是在绘图、获取用户输入和处理游戏逻辑之间循环。
第三步,处理用户输入。
第四步,学习如何创建和管理所有游戏对象及其状态。比如如何生成动态数量的敌人。
第五步,学习如何应用游戏的逻辑。子弹头位置何时更新?什么时候会有更多敌人出现在屏幕上?怎么判定敌人被干掉了?游戏何时结束?
甚至,在进阶阶段,你还可以考虑引入AI,来制造更加“智能”的敌人。
编译器-Tiny BASIC
从头开始编写一种非常小的类似于BASIC的语言编译器,然后将其编译为任何其他语言。比如,用Python编写可以输出C#代码的Tiny BASIC编译器。
△图源:Austin Z. Henley
知识点:
- 词法分析
- 句法分析
- 递归下降解析
- 抽象语法树
- 语义分析
- 优化passes
- 代码生成
迷你操作系统
从这个项目开始,难度就加大了。
操作系统依赖于硬件,因此入门门槛比较高。但这个项目可以帮助你更好地理解计算机底层都发生了什么。
作者亨利推荐了一本免费电子书《使用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 · 头条号签约
关注我们,第一时间获知前沿科技动态
猜你喜欢
- 2024-10-12 零基础学做游戏,三步成为程序员(零基础学做游戏,三步成为程序员)
- 2024-10-12 自学编程该如何入手?编程入门不难,但是切忌"上对花轿嫁错郎"
- 2024-10-12 Python编程绝对初学者指南,一步一步的指南,有示例和实验练习
- 2024-10-12 看不懂代码,不会用框架,新手程序员入职后如何快速上手项目?
- 2024-10-12 编程入门须知:常用的编程语言都有哪些?怎样做才能更快地入门?
- 2024-10-12 西门子1200你用过吗?如何快速编写程序?西门子入门教程!
- 2024-10-12 10个PLC入门编程指令,老电工一一讲解,弄清楚了再谈深入学习PLC
- 2024-10-12 低代码时代,如何零基础做开发?(低代码开发平台 开源)
- 2024-10-12 PLC快速入门:6个PLC编程实例,学会了可以让你由入门变精通!
- 2024-10-12 如何零基础入门PLC?这份全面详解PPT准能用上
你 发表评论:
欢迎- 最近发表
-
- 免费10年VPS-serv00服务器,注册与自动化保号
- Consul微服务注册中心使用指南
- 谷歌云代理商:注册谷歌云服务器需要准备哪些资料?
- steam账号注册不了/注册失败?好用的解决方法看这里
- 微服务架构中的服务注册与发现有哪些?Zookeeper、Eu
- # 从浅入深 学习 SpringCloud 微服务架构(三)注册中心 Eureka(1)
- 一文深入理解AP架构Nacos注册原理
- 群晖NAS本地搭建NVIDIA v-GPU License Server 授权许可服务器的教程
- IDEA 2024解决We could not validate your license XX
- 保障数据完整性:深入解析Oracle数据库的主键和外键约束
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)