写点什么

5 天!软件开发考试该如何准备?

作者:统信软件
  • 2024-01-29
    北京
  • 本文字数:1983 字

    阅读完需:约 7 分钟

作者:统信 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

结束


大概如此,既然记不住全部的代码,就需要像葡萄一样抓住核心的蒂,然后一把抓起。


文已至此,行程将近,收拾行囊,干!~

用户头像

统信软件

关注

还未添加个人签名 2022-08-11 加入

还未添加个人简介

评论

发布
暂无评论
5天!软件开发考试该如何准备?_统信软件_InfoQ写作社区