程序员应该造的五大轮子
每个程序员都有一个操作系统梦吧, 我记得年轻的时候, 意气风发,给女朋友说过要做一个像Windows那样的操作系统,女朋友当时很崇拜的样子,十多年过去了,孩子都上学了, 这件事我不敢给她提了。
最近有个同学在微信上问我, 又提到了这回事:
我双手支持、赞成,因为写不了Windows, 造个轮子还不是不错的。
尤其是学生阶段,有充裕的、大块的时间,造轮子再合适不过了。
01 操作系统
造轮子操作系统当排名第一,原因前面也说了,操作系统的诱惑实在太大,在一个裸机上运行一个系统,让冰冷的机器听从自己的指挥, 让这个系统管理所有的硬件,支持上层的应用,说实话, 有一种当上帝的感觉。
但是造操作系统难度也是最高的, 首先得理解Intel CPU的那一大堆细节, 什么实模式、保护模式、A20, GDT, IDT, 中断处理…… 深入进去,如果你不头晕脑胀一段时间,说明你还没有透彻理解。
系统的启动得用汇编编写, 度过了这一段难熬的时间,才能进入C语言的世界,去实现进程调度、内存管理、文件系统、I/O管理。
我觉得一般人写个玩具,体验一下和硬件打交道的感觉,在实践中精确理解进程、线程、文件等抽象就够了。 只有大神才会在上面折腾GUI, 移植游戏,然后搞成了Linux ,宁静OS。
难度指数:5颗星
吹牛皮指数:爆棚
相关书籍:
《操作系统真象还原》
《Orange’S:一个操作系统的实现》
《Linux内核设计的艺术》
《Linux内核完全剖析》
02 数据库
排名第二的我认为是数据库, 但现实中我发现很少有人去写,不知道是什么原因,也许是吹牛皮指数太低?
其实数据库是很有料的:
1. 编译原理的知识
因为你得做SQL语句的解析,转化成内部的数据结构。
不需要特别深入,因为现在有很多趁手的工具了,例如Antlr,挺好用的。
2. 索引
B+树, 因为关系数据库存储需要用它
3. 事务
你需要自己去实现事务,undo ,redo日志等。
深入一点的话要考虑事务的隔离级别。
4. 查询优化
对数据库感兴趣的同学,强烈推荐SQLite,可以从最早期的源码开始看起。
难度指数 :4颗星
吹牛皮指数:??
相关书籍:
惨,中文的居然没有,可以去看SQLite官网,资料很齐全
03 网络软件
第三名是网络程序。这个范围很广,可以是:
像Ngnix 那样的HTTP服务器:实现HTTP协议,学习epoll,反向代理,模块化设计等等
或者像Tomcat这样Web应用服务器,既支持HTTP协议,又可以运行Servlet和JSP。
或者是Redis这样的高性能的缓存服务,学习它和客户端的协议设计,如何快速地存取数据,对外提供的API,持久化等。
有人说它们属于中间件,也有道理,因为不是OS和数据库这样的基础软件,又不是单纯的应用软件,将来工作以后,日常打交道非常多,造一个轮子,发到GitHub上, 写到简历中,非常吸睛。
难度指数:4 颗星
吹牛皮指数 :5颗星
相关书籍:
《Redis设计与实现》
《How Tomcat Works》
04 虚拟机
第四名是虚拟机, 这个轮子也是我非常推荐的。
以Java为例, 写个虚拟机能非常透彻地理解Java 的字节码,因为在执行之前,必须要解析.class文件,在实现执行引擎的时候,得理解栈帧、本地变量表、方法区、堆等概念。
然后还得实现各种指令:存储指令、栈指令、数学指令、比较指令等
如果你还能实现垃圾回收,那就更牛了!
折腾一圈下来,这门语言对你基本上就没有什么秘密了。再去看别的语言和虚拟机:怎么都长得差不多啊!
难度指数:4颗星
吹牛皮指数:5颗星
相关书籍:
《自己动手写Java虚拟机》
《深入理解Java虚拟机》
05 编程语言
最后是编程语言, 造这个轮子的人更少,因为现在编程语言很成熟, 即使你造出来了,估计也是没人用的。
现在GitHub火热的都是那些“文言文编程”,“东北话编程”,没啥实战意义,在自媒体的追逐下一时比较吸睛,但是热点一过就烟消云散。当然,你要是追求流量那另当别论。
造编程语言主要的知识是《编译原理》, 这门课喜欢的人不多,讨厌的不少, 在公司也很少用到相关的知识,所以除非你对编程语言有强烈的爱好,否则大概率是赔本的。
不过造编程语言很可能会让你对“为什么XXX的语法这么设计”有较深理解,并且会培养独特的“品味”, 这点儿挺不错。
难度指数:4颗星
吹牛皮指数:就看你的语言有多少人用了
相关书籍
《自制编程语言》
《编程语言实现模式》
可能有人要问了,你BB这么多,你自己写过啥,造过啥轮子?
这真是个好问题,我还真造过,答案就在我的公众号“码农翻身”中。