浅谈入行Qt桌面端开发程序员-从毕业到上岗(1):当我们说到桌面端开发时,我们在谈论什么?
阅读原文时间:2023年07月09日阅读:1

大家好,我是轩先生,是一个刚入行的Qt桌面端开发程序员。我的本科是双非一本的数学专业,22年毕业,只是部分课程与计算机之间有所交叉,其实在我毕业的时候并没有想过会成为一名程序员,也没有想过会成为一名桌面端开发的程序员。我记得大学的时候我最想去做的事是做一名记者,大学呢也在学校校报的通讯社做了三年的记者兼版面编辑,后来还当了副社长,当然了记者的工资和程序员的工资肯定是没法比哈,而且我的本科专业也比较偏理科,投了几家报社和几家软件公司,拿到offer比较了一下之后就来到了现在这家公司哈。所以可以说我目前的工作是我之前完全没有准备过的。

我来到这个部门的时候正好遇到整个项目要从c#到Qt转型,所以我是先学了C#,再学的Qt,这两个语言之间花了一段时间去转换,也从中了解到很多不同语言之间的异同,之后有空我会简单聊聊C#和Qt。

这篇文章我想简单谈谈关于应届生想做Qt桌面端的一些就业问题,以及就业之后如何从实习到转正,算是记录一点我的心路历程,将来如果有新同事想了解一下学习路线,我也会把这篇文章或者将来会拍一期视频,给他们看看。

就业问题想必是大部分看到这篇博客的同学会关注到的。前几年是什么情况我不太清楚,就目前来说岗位少人多貌似已经是常态了,但不同的是C++仍然招人比较困难。我听说的是Java岗很多都投爆了,但是我们组现在还招不到C++的…

其实我对就业是没有什么建议的,网上有很多什么背八股文、刷算法试题的攻略了,但是我现在作为一个从业人员的建议是:C++面试这块,不要太过于纠结于八股文和算法,因为技术面不一定会问,即使你过了一面,二面也不好过。但不是要你完全不去了解,而是在了解的基础上,更多的是去实践,因为开发不是做题,不是你题做的好,代码就写得好的。

就我主管这个月面的一些人来说,八股文一个背的比一个溜,结果一些实际场景问起来,连最基础的进程间通信和跨线程同步这样的问题都完全答不上来,或者最简单的如何判断char类型的字符是英文、是数字、是中文,都不说具体方法了,连提供思路也提供不了。这是非常糟糕的,说明你一点基础的开发经验都没有,而现在就业市场作为买方市场,企业或者主管更多的愿意去招一些不用培训就可以上岗的新人,退而求其次才会去看别的。你算法玩的再溜,也不是所有的企业的所有位置需要你那么懂算法,甚至比起算法,你懂怎么跨进程通信甚至都更重要。

四大件,四大件,四大件。数据结构与算法,计算机网络,操作系统,计算机组成原理,这四大件才是最重要的,如果你想要进一步提升,还有一个设计模式也是非常重要的。

我这里可以列一个我主管面试硕士的面试题,你可以看一下自己能答出多少,反正当时面了三四个硕士,有的人支支吾吾地一个都没答出来。题目其实很简单,但是如果你只是停留在算法层面,不借助百度,当场能流利地答出来,那也算不错了。

注:以下题目都是在纯c++语境下进行的,记得很模糊,不一定就是对的,我也是边摸边记的

1.怎么判断字符串是汉字还是英文?退而求其次,怎么判断字符串是不是数字?

2.bmp文件的头信息是什么样的?不用说全,说个大概就行(背景是面试的人说自己有图像处理的研究经历)

3.如何判断线程的同步状态?如何使不同线程同步执行?

4.一个线程如何获取另一个线程的数据?假设有一个监听数据的线程,我现在希望这个数据能显示在界面上,我该如何跨线程保证数据的显示安全呢?

5.了解过GDI吗?界面绘制这一块了解过吗?怎么通过GDI+在界面上画一条线?

6.有一个txt格式的文件,我该如何得知这个文件是什么编码格式?

7.知道什么是Unicode什么是UTF8什么是GBK格式吗?他们有什么区别?为什么要这么多编码格式,是为了解决什么问题有了解过吗?

8.Windows消息机制了解过吗?知道有哪些进程间通信的类型?

9.搭建过webrtc的项目吗?(背景是对方说自己有音视频处理的科研经历),跑得起来吗?音频数据有了解过结构吗?搭建过流媒体服务器吗?

10.nodejs怎么调试?比如写了一些脚本,用什么工具来调试nodejs?vscode了解过吗?

11.数据库了解过吗?怎么创建一个存储过程?

还有很多问题,这里就不一一写上了。总之我说这么多,是希望找工作的同学们知道一点:公司看重的是工程应用的能力,不是你做题的能力。

另外我要提一点,如果你是科班出身,就不要写计算机二级证书了,真的有点掉价。

其实桌面端开发,我个人觉得和前后端没什么区别,甚至和前端没什么区别,特别是在qt中,你甚至还可以用qml去实现界面。但是也有不同,就你在做桌面端开发的时候,更多的时候其实是像一个全栈:又要管前面又要管后面。虽然大部分时间后端的功能都是通过提供的第三方库实现,但是还是有很多功能和数据都是你自己内部去处理的。或者作为刚入门的开发者,你可以这么理解,Qt只是一个界面库,至于那么多乱七八糟的类库只是为了让你更好地连接你的c++后台和他的界面。

我们要学习什么:

1.界面:

首先我们开发一个桌面端程序,最重要的肯定是界面。界面上而言,最重要的肯定是用什么写。Qt其实提供了很多比起MFC那种把窗体当成一个个指针更好的方法(其实我没用过MFC…),比如QSS,QML,开发界面省事这两个肯定是要学的。

除此之外还有就是如何自己开发自定义组件,除了Qt自带的组件,怎么把一些组件拼在一起成为一个新的组件供你差遣?比如我一个列表

中间这个内容肯定是经常增减的,所以不可能每次都单独写,肯定是一个独立的控件,这样的自定义控件该如何开发?

2.进程间通信

作为一个新人,你开发的程序大概率是一个独立的进程,而且是一个大进程的一个小模块。那么Windows的几个基本的进程间通信的模型得搞搞清楚。比较常见的是Windows的消息机制,当然也可能有COM组件形式,DBUS模式,内存共享形式等等都有可能,这个不同项目组形式不同,但是一般情况下都是Windows消息机制用的最多,稍微要了解一下。

3.线程同步相关

当你稍微进阶了一点之后,可能就要开始调用第三方的exe或者dll,这个时候就会可能要调用dll提供的回调函数了,这个回调函数中传来的事件极大可能就是跨线程的。跨线程带来的问题有很多,Qt中跨线程控制ui是有可能导致崩溃的,要怎么处理这个跨线程的信号量。有时候可能你自己要把一些费时操作丢到别的线程,这些事情该怎么操作?这也是一个问题。

4.网络通信相关

你开发的软件产品面对的用户群体不同,可能就要接触不同的网络协议。如果你是局域网内通信(比如我),那一些本地常用的TCP,UDP通信至少要懂,还有一些不同应用场景的,比如可靠的广播协议UDT,Quic这类的协议,也要稍微了解一下。不一定要知道原理,知道怎么工程应用就行。

5.学会看官方文档。

Qt在国内的资料和讨论并不多(其实国外也不能算多…)但是比较好的一点是Qt的官方文档是写的比较简单好懂的,去翻一下就能知道这个类是怎么用的,有哪些方法、参数、依赖等等。最好看英文的,貌似有个Qt的中文文档,但是内容比较有限,而且很久没有人维护了。

6.学会用VS+Qt

VS,世界上最好的编译器,不接受反驳

7.有一个好的代码习惯

C++ 风格指南 - 内容目录 其实我觉得这个才应该放在第一个…但是作为学习阶段嘛,可以先把重要的工作任务摆在前面。

一个好的代码规范不仅可以让你的代码的可读性 提升好几个档次,还能让你能更好地写出流畅的代码。我觉得这篇文章真的每一个程序员都要看,特别是那种老的MFC c++命名规范,我真的看一眼我就要死了。

8.学会没事就按ctrl + s保存

这个血的教训,我反正没事就按一下,代码不像剪辑,保存一下不会卡的。

9.善用ctrl+c ctrl+f ctrl+v连招

很帅好吗!