網路框架重構之路plain2.0(c++23 without module) 環境

戀月發表於2023-04-16

接下來本來就直接打算分享框架重構的具體環節,但重構的程式碼其實並沒有完成太多,許多的實現細節在我心中還沒有形成一個定型。由於最近迴歸崗位後,新的開發環境需要自己搭建,搭建的時間來說花了我整整一天的時間才勉強搞定。人們常說工欲善其事必先利其器,開發環境和工具是必不可少的,否則你會發現在接下來的過程中遇到困難的時候就會走很多彎路。雖然最後我們仍舊達到了目的,但是我們大概也會心力憔悴、得不償失。於是我萌生了一個想法,那就是何不自己寫一個指令碼(該節我會分享,裡面有許多有意思的寫法,有興趣的朋友可以閱讀研究一下,如有錯誤希望不吝指正),讓指令碼把一切安裝到位,那麼自己就不會因為遺漏一些東西而撓頭抓腮。而對於一個開發來說首先就是要搭建開發環境,這個其實是極其重要的,許多的書籍上對搭建開發環境都是簡單幾筆的帶過。雖然網上有許多的資料,可是如果沒有做一些系統的介紹或者相應的指令碼,那麼初學者或者會為此犯難不已。由於這一節開發環境可能篇幅不長,又考慮到不久後就即將迎來畢業季,因此我在這裡就稍微將這個環境分為兩個部分,它們分別叫做開發環境和工作環境,希望對於各位朋友有所助益。

 開發環境

 主開發環境

  1、系統

    plain因為支援跨平臺,所以主要的兩個作業系統是linux和windows,而linux中我選擇了中小企業中常用的centos 7(centos 8 已經停止支援了,但是7還有一段時間才會停,估計之後大家可能會被迫使用centos stream)。而對於windows環境下,我選擇的版本是目前比較流行的win10系統,畢竟這個系統對老的硬體相容性強點,新的win11似乎要Intel系列的CPU在8代以後才支援。在windows下我的開發環境是直接使用Microsoft Visual Studio 2022進行開發,當然如果不喜歡它的重量級的朋友可以使用其免費的Code進行開發,不過現在Microsoft Visual Studio 2022也有個人免費版,我覺得如果想要專業一些直接使用這個重器吧,除錯和各方面都支援的不錯。

    至於linux選擇centos 7的原因,純粹屬於個人比較熟悉而已,如果有其他linux系統經驗的朋友可以直接使用自己所熟悉的系統(只不過需要修改一下我的安裝指令碼來進行開發環境的構建,如果你已經有了成熟的環境,那麼使用自己的即可)。我處在的行業中使用該系統的比較多,當然還有另一個叫ubuntu的系統,其實類linux系統的操作都大同小異,熟悉了一個系統後其他系統的差異也估計只在一些系統命令的區別(主要是包管理方面、網路、安全等等)。如果選用的是centos系統,那麼你可以使用我的安裝指令碼,該指令碼可以靈活定製編譯器的版本,還有可以安裝基於vim編輯器的開發環境,同時也有相應的定製映象進行下載(製作後上傳)。

  2、編譯器

    windows上的編譯器主要使用Microsoft Visual Studio 2022,所以編譯器是自帶的,因此在這裡不做過多描述。由於要使用新的特性,因此編譯器必須為最新的,隨著未來的情況,編譯器都應該保持最新的狀態。有些人會發現如果拿老的專案使用最新的編譯器就會遇到一些莫名其妙的錯誤,就算沒有錯誤也會遇到很多刷屏的警告資訊,這都是以前編譯器版本對於不規範的程式碼過於寬鬆的原因。比如我現在這家公司的這個專案就是,拿最新的編譯器的話是編譯不過的,而且數不清的警告讓人無從下手,所以只能使用舊的指定的編譯器版本。

    在《Effect C++》中Item 53: 不要輕忽編譯器的警告,告訴我們不要輕易忽視編譯器產生的抱怨,據我所知在google程式設計規範中就是將所有的警告視為錯誤,可見警告並非只是編譯器的無理取鬧,在編譯器版本升級後,編譯器的作者朋友們都儘可能地給出一些忠告,這樣會減少程式在執行時的錯誤,因為有的一個小的疏忽就可能導致程式崩潰或者異常。這裡我舉一個簡單的例子,一個函式返回Int32_t型別,但實際使用中我們使用了int16_t型別,這時候會發生什麼呢?如果看過C++基礎知識相關書籍的朋友不難想到,這個叫做寬到窄的轉換,形象的說法可以比作原來用大桶裝的東西要放到一個小桶裡,如果桶裡裝的是水,假如大桶裡的水小桶裝得下還好,假如裝不下呢?這時候必然有部分的水杯捨棄,在C++中就有資料截斷這個概念了。這時候你使用的這個資料,就是部分資料,使用部分資料實際上往往不比越界、懸吊指標造成的災難小。因此《Effect C++》中Item 27: 將強制轉型減到最少專門列出該條目,用以說明強轉帶來的總總壞處,但有些時候我們不得不使用轉換,比如介面設計的原因,那麼我們也最好使用C++風格的轉換方式(static_cast、const_cast等等)。

    在plain開發中,重點在於centos系統下的開發,要使用最新的編譯器我所知的有兩種途徑:gcc-toolsetgcc原始碼編譯。如果你的yum源支援gcc-toolset12則直接進行安裝即可,否則你可能需要使用原始碼安裝了,關於如何進行gcc-toolset的安裝,以及gcc原始碼編譯安裝網上有太多的文章了,我在這裡就不在重複(如果原始碼安裝你可以嘗試使用我的安裝指令碼,目前這個指令碼我只在centos下測試過,如果是其他系統估計需要改動才能使用)。今年的gcc 13釋出後,我也即將使用最新的gcc 13,可以在gcc的git版本管理中發現gcc 13已經在開發階段,如下圖:

 

 

  3、編輯器

    在windows上我們可以使用其提供的強大的編譯編輯一體的專業IDE,所以我在這裡就不討論這個平臺了。其實編輯器的選擇是靠個人的喜好做選擇,並非使用某個編輯器就一定好,只要你用的順手即可。多年前剛開始進入網際網路行業的時候我開始使用的編輯器是zend studio,在此之前我在學校只接觸過eclipse、VS,但eclipse我不是很喜歡,因此到現在我都不願意使用它,這其實都是正常的事情。剛剛進入行業的時候,聽說某某程式設計師使用記事本來進行開發,聽上去很厲害,可是我覺得那樣的開發多半是無奈之舉,誰不願意自己的程式碼多點提示,錯誤的時候也能夠幫我們及時發現?

    最後我選擇的編輯器為vimVS,至於vim和emacs之間做出了選擇vim是因為個人覺得vim更輕量一些,不過你也需要使用外掛。對於emacs,其實這個編輯器的功能似乎更強大,它整合的編譯環境讓我們的除錯更加快速,不過這也看個人的喜好了。有人說為什麼不用新生代的neovim?因為不少人覺得vim太慢、過時、很久沒更新(吃老本),所以才有neovim的出現,可是我想說的是vim走到今天很不容易,而且現在程式碼的更新也很快了,作者似乎也意識到了大家所指出的那些毛病都是正確的,因此才有了更加快速的vim script等等加快編輯器速度的最佳化。由於習慣了使用vim,我覺得也沒有必要再去嘗試別的東西了,編輯器只是編寫程式碼的輔助工具,所以在這個方面個人認為沒必要做的本末倒置,只要自己認為用起來得心應手就好。

    由於要使用最新的vim,因此我的安裝方式也是原始碼安裝,其實也可以去vim網站上下載rpm包進行安裝,不過rpm包安裝要注意依賴的關係。原始碼安裝vim的指令碼在這裡:https://github.com/viticm/cpp_misc/blob/main/script/install_vim.sh

 工作環境

 職業發展

  1、剛工作和工作不久

    我本不打算在這裡說自己這方面的心得,畢竟自己從來似乎就沒有做過職業規劃方面的事情,所以該條款僅僅是一點點微不足道的建議(以自身的經歷和經驗)。想起十多年前(2011)剛畢業在北方那座不大的城市頂著火熱的太陽找工作的情形,頗感畢業生想要進入社會生存是多麼不易(特別是自己本專業,據我所知90%以上都是從事了和自己專業無關的工作),其實不容易的也還有許許多多的打工人。那時候我還記得在學校的畢業設計,我是用的一個網上弄下來的圖書管理系統,其程式碼是asp寫的,剛好是我學校所學,為了完成任務在上面做了一些修改,然後進行一番分析後做出論文。雖然最後透過了答辯拿到了畢業證,可是找工作的時候卻四處碰壁,一方面是因為學校所處的城市相關的工作較少,另一方面出來後用asp這個語言的公司幾乎沒有,其實我想大部分原因是公司不願意培養一個完全沒有經驗的人。經過一個多月簡歷石沉大海,去公司唯唯諾諾的面試毫無結果之後,我開始想要提升一下自己。既然外面生存環境需要自己掌握技能,那麼我就只能去提升了,那時候我發現做網站用的比較多的是PHP,因此我在網上搜了一圈後找到了一個培訓班(先聽我講完)。我還記得當時的那位授課老師姓候,似乎是一位碩士,當時給了三天免費試聽的課程。我到了那裡之後聽了一天課,發現其實那些內容如果自己找資料同樣可以掌握,而且進度會更加快,所以一天以後我沒有再去,而是轉向圖書館買了三百多的書,這些書有C/C++開發、PHP開發、C/C++演算法速查。至於為什麼想學PHP卻又買了C/C++的書,忘記聽那位朋友說的,是自己對該語言產生了一定興趣的結果。

    在購買圖書之後,我在網上找了一些影片,開始大約一個月的系統學習,其實每天也沒有想象學習的那麼滿,而且天氣也開始又炎熱轉涼,我只是有計劃的慢慢推動自己的學習。對於絕頂聰明的人來說,他們知識消化的速度快,可能要不了多久就可以掌握新的知識,但對於我這樣普通的人來說正應了老話”貪多嚼不爛“,因此我總的進度並不快。就算是因為這樣,一個月左右我基本上掌握了PHP,算是入了門,畢竟一些高階用法只有在實踐中才能慢慢掌握。總算在當年的11月左右我進入了職業生涯的第一家公司,這家公司是一個十人左右的小公司,其業務是外包一些網站產品的開發。所實話當時全沒有想過職業發展的事情,認為首先讓自己多年所學能夠讓自己生存下來就滿足了,而且那時候工資也就兩千左右,哪裡像現在有的朋友起薪都過萬,雖然說是都是十年前了,可是我想要說的是近兩年大家的環境比之前要好很多了,雖然今年的環境似乎變差了一些,但我覺得那總是暫時的。第一份工作其實挺重要的,也許是上天不曾虧待我,第一份工作我遇到了好的工作環境,有一個挺不錯的上級。我還記得那位上級其實年齡不小了,當時大概有四五十歲左右的年紀,想一想現在覺得35就過時未免覺得有點兒悲哀,至於年齡的坎大家紛紛認為這是中國產業升級失敗的問題,至於真正的原因為何現在還沒有定論。我的上級是原因分享和耐心的人,工作上不懂得只要你請教他都能耐心回答,而且也會組織我們一起對專案遇到的問題進行總結和分享,雖然我沒有什麼太好的建議,但也會對他們所說的問題發出疑問。有人說小公司就可以不注意規範問題,但是我第一個公司就不是,他們極力想要避免規範不一致帶來的問題。或許規範這個從根本上來說確實是處於公司和專案上的考量,是為了讓你的去留不會對專案造成過多的影響,不過總得來說多人協作開發的時候統一的規範會讓組員能夠更快地理解彼此所寫的程式碼,在你沒事的時候使用code review就能夠看出一些問題,所以規範的統一還是有必要的。第二年我來到了南方的沿海城市,其實我還是挺感激第一家公司中我學習到的東西,雖然那時候來到新的城市也還是碰了不少壁。最後在次年大約五月份的時候,我進入了一家創業公司,從此開始了遊戲開發之路。

    遊戲開發在當下並不陌生,不過近兩年發展的也是良莠不齊,以及因為本行業的高工作強度為大家所詬病(據我所知軟體大部分其實都差不多,否則github上也不會有996icu這個專案了)。一開始我是作為PHP做後臺開發,這個後臺就是用來對接遊戲介面還有就是統計遊戲中資料的功能,這一做大概就做了一年。順嘴提一句,當時那家公司同一層有一個網易著名團隊出來自創的公司,在同一層樓我感覺他們的福利確實挺好,而且能看到其作品質量也很不錯。在做後臺開發的時候,我也兼著做了一些運維的工作,當時忙的焦頭爛額,小公司沒有運維真的是很難,不過在這一年我確實學習了不少知識,不僅僅學會了許多曾經不熟悉的linux相應的操作和命令、還讓我學會了使用vim編輯器,就是從這裡開始vim就成為我的常用開發編輯器了(手動狗頭,必須帶外掛)。能夠掌握這些知識主要還是得感謝我那位同鄉的上級,他不厭其煩甚至還借了一本書給我,並不因為我不瞭解就嗤之以鼻。在後來新的運維加入之後,我的負擔大大降低後,就開始轉向了後端開發,這一轉就到了現在。後來我從這家創業公司去到一家當地在頁遊排行前幾名的公司,這次其實我是和創業公司的一些小夥伴一起出去的,原因是老闆不願意繼續那個專案了。

    來到頁遊的公司,其實實際上我們專案還是手機遊戲開發,我們專案也作為未來公司的一個開發方向得到了老闆的重視。可是我們的組員並不齊全,特別是核心認為,前端和後端的老大需要從外引入,雖然這時候我們專案過去就有了前端和後端的人員。但是由於經驗不足,我們不願意也不敢去承擔那份重任,所以希望從外面招攬人才來帶領我們。也不知道什麼原因,那種高階別的人才在當年6月份的時候像是特別缺乏,一個月了都未能找到合適的人員,是不是因為薪資問題我就不得而知了。但最後還是進來了一個客戶端老大,不過他要求改用他熟悉的引擎(一個國外開源引擎),後來不到一個月似乎沒有成效他就離開了。過後不久我們後端才來了一個老大,號稱十多年資深的C++開發經驗,進來之後也想要使用自己熟悉的程式碼(但我們專案本來已經正在用之前專案的程式碼在進行開發),所以他需要將我們以前的程式碼做一定的移植。然後問題就出現了,他進來不久後似乎是看我們是抱團進入的,不是他親自招的人,所以甩手就讓我們寫幾個功能,當時我以為是專案需要用到,所以連忙查詢資料一邊修改除錯弄出來了,結果到了他那邊不滿意說存在問題,但是具體問題在哪裡他又不願意告知,甚至開始有點冷嘲熱諷,說這麼簡單的問題都不會(後來我才發現原來他有可能就是存心要排擠,當時我們由於年輕沒有感覺出來)。當時由於這個專案和我們幾個人一起跟老闆確定面談下來,所以他只好離開了,後來我們後端的程式還被經理稍微數落了一下,他們其實也明白其中的原因(畢竟他們的年齡和經歷比我們豐富)。這個上級對我們來說,我覺得他一點也懂不得分享(或許是我們確實缺乏經驗,手動狗頭),甚至還有點自高自大(其實看不出來真實水準,就算很厲害吧)。你想如果遇到這樣的領導,你還能在專案中得到收穫、獲得快樂嗎?

    後來我回到了內地,依舊做後端開發,所遇到的領導都是原因分享的,不過這時候我從那家頁遊公司的那位上級處看到了其實知識有些時候也需要自己去掌握,所以近幾年我都是自己查詢資料進行學習。說了自己一大段的經歷,其實我想說的是對於剛工作或者工作不久的朋友,在考慮薪資的同時,如果想要職業更好的發展,那麼在選擇你的上級和公司時,就需要關注他們是否有open精神,如果面對的是close的人那麼你需要慎重考慮。在手裡有選擇的餘地之下,儘量選擇一個open的工作環境,那樣可以快速提升自己的技術實力。

    舉個例子,可以提供大家參考,比如面試過我的一位面試官,他將會作為你的上級,在面試溝通中會問一些技術方面的問題。剛開始聊的都挺好,但是一聽到我有開源過專案,並沒有得到讚賞,反而變了一副嘲笑的態度,說是那不是很簡單的嗎?工作幾年人人都會開源多少?最重點的一句是,他說其實真正好的東西其實不願意分享的。當時我就在想,如果公司不用還好,因為站在公司立場它試錯的風險是很大的,如果公司願意使用你的功能和技術,為何不願意分享出來,藏著掖著怎麼能在實踐中證明自己所實現的正確和可靠?從這裡多多少少就能看出該上級close程度,特別是後來他抓著面試者不熟悉或遺忘的技術窮追猛打,我認為可能是公司大概是不缺人,或者就是想要透過所謂技術碾壓來壓低你商談薪資的籌碼,我認為這樣都是不合適的。一個求職者來說,薪資如果不理想工作的時候總是會缺少一些幹勁,就算是大環境不好情況下,也無需做出那麼多讓人感覺不舒服的舉措,畢竟求職就是雙向選擇的過程。大部分技術面試的時候,你可以詢問一下公司狀況,和麵試官的交談中其實可以用技巧性的話術曲折打聽出公司的open程度,在你考慮職業發展時儘量不要選擇close的公司(如果薪資水平差別不大的情況下)。

  2、不要覺得自己不夠聰明

    這句話是我從別人那裡引來的,我認為這句話十分有道理,如果你覺得自己不夠聰明那麼你很多時候就會變得畏縮不前,對於未來的發展來說很有阻礙。就拿我自己來說,我曾經就是認為那些深入的軟體設計就是高深莫測,所以剛開始的時候根本就不敢涉足。但就我的專案經歷來說,我經歷過由淺入深的過程,有些特別複雜的系統設計(比如遊戲的戰鬥系統),這些我以前都沒有接觸過,就連自己維護都沒有過,但是我參考了幾個遊戲的設計後,加上自己的理解,在幾個型別不同的專案中仍舊能夠遊刃有餘,那多半是多虧了自己的經驗和不斷學習的結果。

    如果你覺得自己不夠聰明,其實有時候往往只是一種經驗缺乏的錯覺,這時候你只需要補充你不足的經驗即可。現在不比以前,現在是資訊的時代,許多的技術知識在網上可以免費獲取,你只需要花費一點點時間,接下來的就是看你對此的興趣和堅持了。我相信大部分人都是差不多的,只是他們掌握知識的快慢不同而已,而且掌握的快不一定應用的好,而掌握的慢也不一定應用的不行。就像一個人在面試的時候很多技術問題可能回答的不好,但實際工作的時候表現得反而十分出色。

    學歷是否很重要?我就在這裡說說自己的認知,當然的學歷是一個人在以往學習優秀的證明,這一點上是毋庸置疑的,在某種程度上來說它是重要的。因此現在許多人大學畢業之後都選擇繼續深造,這一點上來說我也十分贊同。但是繼續深造,還有為了更好的工作提升學歷,就真的是必須的麼?筆者並不認為學歷是必須的,這不是我因為高考不理想的藉口(差幾分上本科,卻不願復讀)。在這個世界上有許許多多的人,但是人活著並不是非得和學歷掛鉤,中國為何學歷風盛行的原因追根究底其實是因為封建長久的科舉制度造成的。特別是許多企業,標榜自己員工的本科率多少多少,其實這都是社會的問題,並不是我們的問題。但是說到這裡,為了讓自己有更好的生活,或者提升自己的知識水平,在自身條件充足的情況下,我還是比較支援去提升學歷(雖然我個人比較懶,但是各位朋友只要有時間讀個碩士還是可以的),特別有些知識要到了一定學歷高度才會接觸,一些高階的演算法你沒有進行相應的教育上手就比較困難。但如果自己沒有條件,特別是家庭環境不好,需要自己考慮生計的事情,那麼這時候學歷對自己可能無法短時間去獲得提升了,那麼這時候可以利用零碎的時間多閱讀書籍來提升自己的實力。在國外聽說許多的企業不在乎學歷和年齡,別人眼中就在乎你的skills,這就是他們那邊的環境更加尊重人的能力,我相信有一天我們這裡也會如此。

    假如真的覺得自己不夠聰明,就不斷提升自己吧。

  3、身體第一

    本來打算寫兩個條目就足夠,但是上面我說的都是工作上一些令人厭煩的事情,特別是學習,有些人總會覺得枯燥乏味。所以我在最後增加了這一條,一切的一切你都需要有個良好的身體,所以朋友們最需要關心自己的健康。工作是為了更好的生活,學習為了更好的工作,但一切的前提身體要健康、心裡要快樂。

 寫在最後

 雜七雜八

  1、centos開發環境映象

    地址:待制作上傳

  2、開發環境指令碼

    地址:https://github.com/viticm/cpp_misc/blob/main/script

相關文章