頭條創(chuàng)作挑戰(zhàn)賽#
??這幾天在論壇看到一個(gè)有趣的問題:新人入職公司做C++開發(fā),發(fā)現(xiàn)公司用的界面GUI還是微軟古老的MFC框架,想問大家MFC是不是已經(jīng)過時(shí)了?是否還有深入學(xué)習(xí)的必要? 其實(shí),個(gè)人覺得在討論這個(gè)問題之前還有一個(gè)更寬泛的問題:C++語言本身是否適合做GUI界面?
MFC
??先說結(jié)論:根據(jù)多數(shù)開發(fā)C++的人來說,單純做界面GUI的話,C++本身其實(shí)并不太適合寫GUI。因?yàn)镃++本身不具備反射和自省,類體系結(jié)構(gòu)非常的靜態(tài),且抽象能力有限,而界面GUI本身是個(gè)相當(dāng)動(dòng)態(tài)的東西,所以最基礎(chǔ)的C++并不適合用來寫GUI,硬寫的話最后的程序會(huì)非常的冗長和啰唆的。
C++
所以聰明的GUI庫通常會(huì)用一些技巧繞過這個(gè)問題:
??嚴(yán)格意義上講,后兩種手段都屬于DSL方法,所以已經(jīng)不能算是純粹的C++開發(fā)GUI了。其實(shí)最適合寫native GUI的語言是Objective-C語言,即便拋棄Cocoa庫來講,單純的論語言能力也是如此,可惜的是它針對(duì)IOS系統(tǒng),并不能支持跨平臺(tái)。
??圖形用戶界面(Graphical User Interface,簡稱 GUI),下面介紹一下C++常用的GUI開發(fā)框架:
(1) QT
Qt 是Qt Company開發(fā)的跨平臺(tái)C++圖形用戶界面應(yīng)用程序開發(fā)框架,目前使用很廣泛;
支持平臺(tái):Windows、Linux、MacOS等等;
網(wǎng)址:https://www.qt.io;
Qt
(2) MFC
Windows下的GUI庫,使用比較廣泛;
支持平臺(tái):Windows;
網(wǎng)址:https://www.microsoft.com/zh-cn/;
MFC
(3) wxWidgets
wxWidgets是一個(gè)C ++庫,開發(fā)人員可以使用它為Windows,Linux,MacOS和其他平臺(tái)創(chuàng)建應(yīng)用程序;
支持平臺(tái):Windows、Linux、MacOS;
網(wǎng)址:https://wxwidgets.org
wxWidgets
(4) gtkmm
gtkmm 是流行的圖形界面庫 GTK+的官方 C++ 接口;
支持平臺(tái):Windows、Linux、MacOS;
網(wǎng)址:https://www.gtkmm.org;
gtkmm
其他界面庫還有:
imgui (https://github.com/ocornut/imgui)
duilib (https://github.com/duilib/duilib)
xcgui (http://www.xcgui.com/)
GuiLite (https://gitee.com/idea4good/GuiLite)
??至于為什么這么多流行的GUI庫都用C++實(shí)現(xiàn),很多原因不是在語言本身的能力上,幾個(gè)可能的原因是:
1)GUI是個(gè)基礎(chǔ)構(gòu)件,用C/C++這種較基礎(chǔ)和非常流行的語言來實(shí)現(xiàn)的話,可以讓這個(gè)庫被更多的其它語言所使用。
2)原生性。很多實(shí)際應(yīng)用需求可能不允許類似C#語言這種附帶一個(gè)編譯運(yùn)行時(shí)的東西,或者帶一個(gè)臃腫的Webkit,尤其對(duì)互聯(lián)網(wǎng)客戶端來講,需要發(fā)布的東西越小越輕量越好,所以這些公司的客戶端基本上都是自己造一個(gè)輕量級(jí)的DirectUI,只滿足自己的需求即可,而不用考慮推廣性和普遍性。
3)保留了在性能和抽象之間做權(quán)衡的能力。如果采用了HTML/CSS/JS,那么當(dāng)你需要高性能實(shí)時(shí)渲染時(shí),可能無法實(shí)現(xiàn)。做為一個(gè)庫來講的話,用戶的應(yīng)用場景千變?nèi)f化,必須要為這些可能性保留相關(guān)的能力。
??總得來說用C++寫GUI需要付出更多的努力,但回報(bào)也更高,前提是有一個(gè)或輪一個(gè)靠譜的DSL。事實(shí)上HTML/CSS/JS也可以看作是一個(gè)DSL,運(yùn)行在C++寫成的解釋器(瀏覽器)上。
??Microsoft Foundation Classes,是微軟公司提供的類庫,以 C++類的形式封裝了Windows API,也是一個(gè)應(yīng)用程序框架,用以減少應(yīng)用程序開發(fā)人員的工作量。但令人遺憾的是MFC 在很多年前就已經(jīng)停止更新了,微軟官方現(xiàn)在也是在主推自家的 .net 技術(shù),雖然 MFC 也被保留了下來,但更多的是為了一些舊的產(chǎn)品的維護(hù)開發(fā)使用,比如一些大公司的老舊產(chǎn)品是用MFC開發(fā)的,多年積累下來,想換一種框架重寫的話,可能工作量無法估計(jì),另外很可能會(huì)出現(xiàn)大量未知的bug,因此仍舊采用當(dāng)下的MFC來維護(hù)不失為一種最穩(wěn)妥的方式。
??單純做界面的話,那么最適合的可能是HTML/CSS/JS,理論上來講它是把結(jié)構(gòu)描述(HTML)、樣式描述(CSS)和動(dòng)態(tài)計(jì)算(JS)劃分的最好的,并且高度標(biāo)準(zhǔn)化。假如你的GUI程序中不存在高性能實(shí)時(shí)渲染的話(如毫秒級(jí)更新的圖表、或嵌入OpenGL/D3D窗口),那么配合前端之類的MVC庫,軟件操作手感和響應(yīng)幾乎可以達(dá)到和native程序一樣,并且寫起來比C++輕松和簡潔很多,并且界面的美觀性也可以得到保證。
??對(duì)于不那么追求軟件包大小以及運(yùn)行效率要求非頂尖的軟件,其實(shí)目前比較流行的是C++混合開發(fā),大體就是利用html+js來編寫界面,然后利用控件方式嵌入C++中,后臺(tái)的程序處理用C++來實(shí)現(xiàn),這樣也能保證客戶端和web端的界面統(tǒng)一性,例如Qt提供的QWebengine控件,或者自己編譯谷歌瀏覽器內(nèi)核CEF,然后與Qt結(jié)合成QCefView使用,這是目前個(gè)人了解的較為流行的混合開發(fā)方式。
現(xiàn)在有很多小伙伴都在學(xué)習(xí)C/C++,正在向程序員進(jìn)擊。然而大家學(xué)習(xí)C++目的無非就是為了將來大學(xué)畢業(yè)后的就業(yè)問題,畢業(yè)后能否拿到一份好的薪酬。今天小編就來跟大家談?wù)凜++現(xiàn)在的就業(yè)前景。
(一)網(wǎng)上有人談?wù)摰紺++現(xiàn)在是否沒落了?
其實(shí)C++并沒有沒落,本來一門編程語言的生命周期就很長。C++至今都一直在更新,試問一門已經(jīng)沒落了的語言還會(huì)有人去維護(hù)更新嗎?只是說說現(xiàn)在C++在windows平臺(tái)上開發(fā)的確實(shí)少之又少,大多都是基于linux開發(fā)。
“有一種觀點(diǎn)是:C++不會(huì)沒落,但會(huì)走向精英化。也就是說一般不會(huì)用C++,但只要是用C++的地方,都是高大上的領(lǐng)域。”這種觀點(diǎn)是有一定道理的。在某些領(lǐng)域C++有著不可忽視的地位,目前來說還沒又可以替代C++的語言出現(xiàn),如果現(xiàn)在缺少C++的話各個(gè)領(lǐng)域都會(huì)出現(xiàn)一片空白嚴(yán)重的情況下可能癱瘓掉。
(二)C++可以從事的領(lǐng)域
其實(shí)C++技術(shù)本身,應(yīng)用是很廣的。后臺(tái)服務(wù)器程序、大型游戲、大數(shù)據(jù)、機(jī)器人、人工智能等,都會(huì)用到C++。
達(dá)妹之前寫過一篇關(guān)于C++能從事領(lǐng)域《C和C++的工作崗位,看看你想做什么?》的文章。有興趣的小伙伴可以去看一下C++程序員可以涉及的領(lǐng)域。
想在C++方向發(fā)展好,需要做好哪些準(zhǔn)備呢?
如果你想做服務(wù)器端的開發(fā),那么就要熟悉Linux平臺(tái)的編程,C/C++本身要熟悉。服務(wù)器端編程通常需要的水平都比較高,你需要對(duì)操作系統(tǒng)編程有很深的認(rèn)識(shí),要對(duì)內(nèi)存管理、多線程編程等等很熟悉。作為服務(wù)器端,都需要網(wǎng)絡(luò)支撐。那么需要熟悉掌握網(wǎng)絡(luò)編程SOCKET套接字編程、TCP/IP協(xié)議和數(shù)據(jù)庫開發(fā)。那么這些都是服務(wù)器端要重點(diǎn)掌握的基礎(chǔ)技術(shù)。
如果你想在Windows界面上發(fā)展,那么對(duì)于Windows的消息機(jī)制、自繪技術(shù)等有深入的了解,最好是要熟悉DirectUI技術(shù),熟悉duilib。
如果你要從事游戲開發(fā),自然游戲原理需要掌握,游戲編程需要很熟悉,還要熟悉一些游戲引擎,對(duì)于圖形圖像處理也要很熟悉。游戲開發(fā)也會(huì)涉及到服務(wù)器端的開發(fā),就看你主要從事游戲客戶端還是游戲服務(wù)器端了。
這些都是幾個(gè)基本的準(zhǔn)備方向。對(duì)于需求程度來說,服務(wù)器端需求最大,游戲次之,客戶端相對(duì)較少。
(三)C++程序員的薪酬
目前各大招聘網(wǎng)站掛出的C++程序員的薪酬在7K-20K不等,甚至有些招聘網(wǎng)站對(duì)那些有多年經(jīng)驗(yàn)的【架構(gòu)師】掛出了百萬年薪等~~就實(shí)際情況來看,在各大一線城市大型互聯(lián)網(wǎng)企業(yè)初級(jí)C++程序員的薪酬在8K左右,而那些學(xué)的不較好有幾年工作經(jīng)驗(yàn)的大多數(shù)在10K-30K不等。
(四)就業(yè)崗位
C++涉及的領(lǐng)域很廣所以C++程序的崗位選擇也很多。然而現(xiàn)在大大小小的公司企業(yè)都在招聘,甚至某些大型互聯(lián)網(wǎng)公司直接招收應(yīng)屆專業(yè)畢業(yè)生自己培養(yǎng)人才。由此可見誰會(huì)上現(xiàn)在還是缺少這類技術(shù)型人才,所以就業(yè)方面還是非常可觀的。
C++在編程界有不可替代的地位不存在沒落一說,薪酬和就業(yè)就會(huì)也是相當(dāng)可觀的,當(dāng)然這個(gè)需要根據(jù)個(gè)人能力來覺定結(jié)果。所以說現(xiàn)在C++的前景還是非常可觀的。
(五)C++工作現(xiàn)在需求怎么樣?
不管是哪門技術(shù),哪個(gè)行業(yè),都有一個(gè)對(duì)口的說法。如果你學(xué)的,和工作需要的不匹配,就會(huì)導(dǎo)致很難找得到工作。并不是說某一種工作沒有,而只是需求已經(jīng)飽和,如果你足夠幸運(yùn),剛好一個(gè)公司需要,也會(huì)有所作為。
那么現(xiàn)在的趨勢(shì)是哪樣的,我們應(yīng)該做哪些準(zhǔn)備呢?如果不關(guān)注技術(shù)和市場的發(fā)展方向,一味閉門自學(xué),很可能到頭來,找工作成為你的一個(gè)心病。所以在此建議不管是不是要找工作,時(shí)常去招聘網(wǎng)站上看看最新的工作需求,可以讓我們很清楚的了解,現(xiàn)在的市場正需要什么技術(shù),也好指導(dǎo)我們接著往什么方向去學(xué)習(xí)和鉆研。
關(guān)注招聘的技術(shù)要求,也就可以看到市場對(duì)于技術(shù)的需要程度。各個(gè)公司都要求的,我們還是需要學(xué)會(huì)。畢竟我們是去找工作,必須要滿足工作的需要。不過你不用擔(dān)心,C++的市場還是有很大的空間的。但這個(gè)并不意味著,你做什么行業(yè),機(jī)會(huì)都很多。這就是市場選擇的結(jié)果。
這些都是讓C++的工作分布變化的因素。我希望通過這些分析,能夠給你帶去一點(diǎn)點(diǎn)的指引,也就很不錯(cuò)了。如果你是正打算學(xué)編程的話,那么推薦你先學(xué)C語言入門后切換到C++。應(yīng)為你學(xué)會(huì)C++再去學(xué)想java此類的語言,你會(huì)發(fā)現(xiàn)學(xué)起來簡單了很多。。