作者:统信UOS技术团队
那是一个阳光明媚的早晨,我正走早上班的路上,慢悠悠地享受着早餐。忽然,我的手机发出了提示音。一条来自领导的消息突然打破了宁静的早餐时光。它通知我,五天后将有一场考试——离线软件开发考试。这不是我第一次听说这场考试,以往在办公室里聊八卦时,同事们偶尔会提及,它以其独特的考核方式和极高的难度而出名。但我从未想过,有一天,我会成为其中的一员。
消息透露,这是一场在没有互联网的环境下进行的考试,要求参赛者在一天内完成一个软件的设计和开发。更具挑战性的是,考试内容可能涉及徒手实现文件系统或者桌面环境工程量的开发。我放下手中的油条,震惊中带着一丝难以置信。这对我来说,不仅仅是一次技术挑战,更是一次前所未有的心理考验。
大多数现代开发者,包括我自己,都已经习惯了在互联网的帮助下进行开发。突然之间,我意识到自己将面临没有参考资料、没有社区支持的情况下独立开发的挑战。想到这里,我的心情从震惊转为焦虑。但很快,我提醒自己,作为一名程序员,解决问题和克服困难是我的职责。我开始调整心态,告诉自己:这是一次展示自己能力的机会,我必须重振旗鼓。
既然没有网络,我必须充分利用手头的资源。我决定利用AI工具帮助我梳理思路,并策划我的准备路线图。我意识到,由于网络的缺失,考试不可能要求使用依赖性强的现代编程语言。于是我决定主要集中在Shell、C和C++上,这些语言系统自带,且不过度依赖外部库。当然,Python作为胶水语言,可能在某些地方发挥作用。
面对即将到来的挑战,我开始系统地复习Shell语法和常用命令,以及C、C++的系统调用。幸运的是,系统自带的man手册提供了大量命令的介绍。但是对于C++来说就没这么好的运气了,信息少了很多,网友推荐的zeal,Dash也因为软件的资源需要二次下载,面对没有网络的情况不得不放弃这条路线。
我开始思考,考试中允许我们访问Linux的仓库。这意味着我可以下载其他重要的帮助手册。我的心情稍微放松了一些,至少我不会完全手足无措。同时,我也考虑到了Qt。作为C++的一个强大框架,Qt框架对于C++基本语言的二次封装,为开发者提供了丰富的功能,这在开发桌面环境时将是一个宝贵的资源。Qt助手也将大幅度帮助我熟悉Qt调用,我决定提前熟悉Qt及其相关工具,尽可能地掌握其核心功能。
我忽的意识到,如果可以访问Linux仓库,显然源码应该也能下载,我计划到时下载一些重要的软件源码,如Redis和MySQL。这些项目的源码涵盖了丰富的数据结构,string,hash,list,set及zset,跳表,红黑树,B+树等等,我只需要简单的grep一下关键字,对应的实现便可拿来复用。
作为一个不太熟悉设计模式的开发者,我决定利用AI工具来帮我梳理并理解各种常见的设计模式。
单例模式(Singleton): Systemd,它是Linux系统中的一个系统和服务管理器,通常作为PID 1运行,并以单例模式管理系统服务。
工厂模式(Factory Method):GTK+,它是一种广泛使用的GUI工具包,用于创建图形界面。GTK+在创建不同类型的窗口或控件时,使用工厂模式来隐藏实例化逻辑。
观察者模式(Observer):GIMP,一个图像编辑软件,它使用观察者模式来更新UI元素,当底层数据模型改变时,相关的UI自动更新。
策略模式(Strategy):GNU Compiler Collection (GCC),它允许用户选择不同的优化策略和编译器后端。
适配器模式(Adapter):PulseAudio,它是一个声音服务器,允许饰器模式(Decorator):Apache HTTP Server,它允许通过模块来扩展功能,这些模块可以被视为装饰器,为核心服务器添加额外功能。
命令模式(Command):Bash,一个Linux命令行解释器,它将用户输入的每个命令视为一个要执行的命令对象。
责任链模式(Chain of Responsibility):iptables,网络包过滤框架,它通过责任链模式将包传递给一系列规则,直到找到匹配项。
状态模式(State):NetworkManager,它管理各种网络连接,并根据网络环境变化调整其状态。
模板方法模式(Template Method):Make,一个建构管理工具,它定义了一个算法的框架,允许子类在不改变算法结构的情况下覆盖算法的特定步骤。
之前与其他同事八卦常听说,有次考试考徒手撕一个文件系统,这种层级的概念我是熟悉的,线程进程怎么区别,inode是怎么回事,网络协议syn+ack传的飞起,但若是手撕,打扰了。
我想还需要一些底层软件提供支持。AI给了我一些建议
对于文件系统(如Ext4): e2fsprogs, fuse
对于进程调度:源码可能拿不到(没记错是闭源的),这里打算使用nginx的调度工具,nginx是负载均衡的好手,想然这里也可以起到类似的作用。
对于网络通讯协议:iproute2(这将下载包含网络工具的源代码,这些工具用于控制和监视网络配置。)
对于GUI底层实现: gtk+3.0,qt5-default
大概如此,既然记不住全部的代码,就需要像葡萄一样抓住核心的蒂,然后一把抓起。
文已至此,行程将近,收拾行囊,干!~