今年春節用C++七天談下,三十天完成,結果小賺了30萬(wàn)的小項目。我還真有用C++賺外快的“惡習”。
先回答問(wèn)題:建議可以(試試)用C++寫(xiě)WEB項目。
插個(gè)尋找興趣團:看此問(wèn)題的應該主要是C++程序員吧! 有興趣玩轉C++搭高性能WEB應用的同學(xué),請私信我并留下微信號。一起學(xué)一起玩吧。
~7/14 補充:
評論中許多人還停留在C++寫(xiě)東西,特別是WEB后端,需要大量重新發(fā)明輪子的思維。。。確實(shí),當初WEB程序最早就是CGI行式,就是用C或C++,然后漂亮的輪子出來(lái)了,比如PHP。但現在是什么情況呢?補一段讓大家可以輕松理解:
# 前端 :html5 ,css ,js(jquery) ,ajax,前端模板技術(shù)。
# 后端框架:nginx(web接入和負載均衡) , redis (全局緩存,跨主機session管理) ,MySQL 和MySQL官方C++SDK。 CPPCMS(只用了它作為高性能的jsonRPC服務(wù)端,有許多代替品,restful 風(fēng)格 API,封裝了所有線(xiàn)程,異步,html請求響應的參數自動(dòng)綁定……)。
# 無(wú)聊而噴噴不平的C++程序員: 媽的,不讓我處理并發(fā),不讓我處理異步,不讓我寫(xiě)內存池,不讓我寫(xiě)數據庫連接池,不讓我自個(gè)兒寫(xiě)網(wǎng)絡(luò )連接池,不讓我接觸linux下的socket網(wǎng)絡(luò )函數,甚至不讓我寫(xiě)json報文的解析(信不信我就是有志氣和能力分分鐘寫(xiě)一個(gè)干死fastjson的新庫??),啊,連個(gè)帶終端彩色輸出日志庫也不讓我寫(xiě)?我還是個(gè)C++程序員嗎?我倒要看看誰(shuí)敢攔著(zhù)我從零開(kāi)始,以C為主,雜夾一點(diǎn)匯編,寫(xiě)一個(gè)MQ?!啊,這位是zeroMQ,您好,你請坐。老板,快TM過(guò)來(lái)告訴你賣(mài)這個(gè)干果要放在哪個(gè)虛擬貨架上,要不要支持多地倉庫出貨?要不要做拆單?購物車(chē)要不支持黃金奢華版和東南亞草裙版皮膚自動(dòng)切換?老板:別急,這里有個(gè)很復雜的設計,你要滿(mǎn)足我一鍵將所有菲律賓水果全部換成廣西的功能!你用這什么C草草開(kāi)發(fā)行嗎?不行還是換我有聽(tīng)說(shuō)過(guò)的那兩門(mén)語(yǔ)言吧?
# 一個(gè)月以后……系統上線(xiàn),關(guān)鍵幾個(gè)性能提升了30倍,肉眼可識別。老板痛快給錢(qián),C++程序員在羞辱中接過(guò)現金,數錢(qián)數到手抽筋(實(shí)事,這老板就是給我現金)。一邊數一邊哭泣:一個(gè)輪子都不讓我發(fā)明……我以后在C++朋友圈里還要不要做人啊……
-~~~以下正文~~~~
某傳統銷(xiāo)售企業(yè)高舉互聯(lián)網(wǎng)旗幟轉型。要在節后一些城市搞現場(chǎng)活動(dòng)。系統是去年8月找不靠譜小公司做的,PHP,報價(jià)15萬(wàn)(約)。
功能很亂,例:不同商城買(mǎi)東西要用不同購物車(chē)。
性能有問(wèn)題,服務(wù)器就一臺(因為也沒(méi)做負載分攤的考慮),開(kāi)發(fā)商自己也沒(méi)信心能支撐五千人大會(huì )。吱吱唔唔。
有安全問(wèn)題,嚴重邏輯漏洞,被(猜測,內部出去的人)攻擊過(guò),客戶(hù)說(shuō)一下午和一晚上損失了快二十萬(wàn),急關(guān)停。
七拐八拐關(guān)系,找到我救急。大會(huì )日期臨近了。
但我是個(gè)1997年入行的傳統程序員。硬沒(méi)寫(xiě)過(guò)像樣的WEB/BS 應用。
工作上寫(xiě)過(guò)工控程序,寫(xiě)過(guò)類(lèi)office這么傳統的桌面軟件,也搞過(guò)C和j2me嵌入式開(kāi)發(fā),用C#寫(xiě)過(guò)wince程序。
外快方面用delphi寫(xiě)第一個(gè)程序就直接用來(lái)賺外快,醫藥標準多媒體宣傳光盤(pán),在2000那年,七天賺了5000元,大概是04年還用C++ builder 寫(xiě)過(guò)擦邊球軟件一個(gè)月賺了20K。
WEB網(wǎng)站?后臺java 或PHP程序,確實(shí)沒(méi)正經(jīng)寫(xiě)過(guò)什么。這二十年。
沒(méi)敢答應,先同意幫走讀下PHP代碼找找有什么問(wèn)題可指導??戳似咛?。這一看肯定就犯了程序員的臭毛病,想重寫(xiě)它。
第一步應對大會(huì ),在當前PHP代碼上改掉或繞過(guò)壞事的一些問(wèn)題。成功后,第二步雙方開(kāi)始談如何全部重寫(xiě)。我報價(jià)一百萬(wàn)。我想找個(gè)朋友一起,花一個(gè)月重寫(xiě)這商城。與客戶(hù)公司的其他股東當面聊了聊。我拿出報價(jià)明細表??蛻?hù)說(shuō)另有一家十來(lái)人開(kāi)發(fā)團隊報價(jià)才十二萬(wàn)云云,又從美國請來(lái)一技術(shù)總監說(shuō)重寫(xiě)的關(guān)鍵是什么什么的。。。
談判很快結束。開(kāi)始正式談如何推倒……重來(lái)。對方本不懂IT的負責人,這小半年來(lái)“久病成醫”,很專(zhuān)業(yè)地說(shuō):重寫(xiě)可以,但不能再用PHP,必須用JAVA。
嚴肅地指正了他對PHP的誤解,告訴他世上有許多著(zhù)名的大型網(wǎng)站都是用這門(mén)語(yǔ)言建設了迪拜城。他說(shuō),這個(gè)比喻應該是羅馬城啊。一個(gè)這么聰明的老板在文學(xué)修辭也還是不夠與時(shí)俱進(jìn),所以許多C++客堅守 C++不能寫(xiě)WEB后端的觀(guān)點(diǎn)也不算離奇。
我會(huì )HTML5和JS(主要是Jquery)。我會(huì )C++。我雖然沒(méi)動(dòng)手過(guò)但我一直對用C++也可以(輕松)寫(xiě)很棒的web 應用有著(zhù)不可置信的盲目樂(lè )觀(guān)。
因為我根本就沒(méi)打算用C++寫(xiě)出一行用于吐出HTML的代碼。我比較不舒服帶某特定含義的字母P結束的WEB 編程語(yǔ)言背后的軟件架構和思路,比如 PHP ASP JSP ,就像身為C++ 程序員,我從MFC 第一個(gè)版本就開(kāi)始倒胃口它的結構和設計思路而堅持寧可用原生的WIN SDK開(kāi)發(fā)OFFICE套件。(不是微軟那個(gè),但微軟那個(gè)也沒(méi)有用MFC嘛)。我比較愛(ài)在品味方面以丟失工作的代價(jià)裝裝逼。
這次是賺外快,我應該有自己做決定的權利嘛。所以在起草合同時(shí)寫(xiě)上了:“系統后臺主要程序,應采用JAVA等非解釋型編程語(yǔ)言進(jìn)行開(kāi)發(fā)”。這個(gè)等字很重要。
上開(kāi)源中國(oschina),安裝一個(gè)估計已經(jīng)沒(méi)人維護的CPPCMS框架。這框架的名字是騙人的,和CMS沒(méi)有什么關(guān)系。有不少問(wèn)題,但拿它作為json-rpc的服務(wù)端,簡(jiǎn)單,結實(shí),高效(開(kāi)發(fā)及運行),雖然它不支持JSON-RPC的2.0標準,但一個(gè)遠程調用的需要可以滿(mǎn)足就好。
安裝ngnix 。把所有原來(lái)的PHP網(wǎng)頁(yè),全部改造為靜態(tài)網(wǎng)頁(yè)。純 html5 加 js 發(fā)起 ajax 從c++ (cppcms)寫(xiě)的后臺拉數據(json 格式),然后用jquery-templates 組織數據基于模板的展現。(這個(gè)模板采用html的 “data-”屬性,所以沒(méi)有破壞純HTML這個(gè)特點(diǎn))。
靜態(tài)頁(yè)面,JS腳本文件,CSS文件,圖片,這些都交給俄羅斯人的ngnix,我從大致知道系統功能及系統用戶(hù)不到二十萬(wàn)的背景起,就相信一個(gè)20兆帶寬ngnix可以擋住一切。這個(gè)判斷在后來(lái)實(shí)際運行時(shí),被打臉了,因為可愛(ài)的美工做商品圖片都很高保真。一邊催她們把圖壓一下,一邊讓老板花點(diǎn)小錢(qián)買(mǎi)了七牛云服務(wù)。
@許式偉 。七牛很好。因為你欠費好久,服務(wù)也繼續可用,他們也不太愛(ài)催你交錢(qián),另一種判斷是小錢(qián)容易忘了催 。反正我覺(jué)得許老板應該還是很技術(shù)型的,像我,不太愛(ài)搭理錢(qián)。
唯一不爽的是,騰訊的微信SDK包(用于獲得用戶(hù)信息,支付等等功能)好像,反正我沒(méi)找到C++版本。我看了一眼PHP版本,原來(lái)是用libcurl ,莞爾一樂(lè ):小樣你不是純C的嗎?別以為套上世界上最好的馬甲,我就認不出你來(lái) 。于是花了一下午搞了個(gè)微信SDK的C++版本。
web 商城技術(shù)結構:
一,純HTML + JS(jquery) + CSS 負責頁(yè)面布局 。 使用ajax 請求數據,用jquery-templates 動(dòng)態(tài)展現數據。
二,網(wǎng)站后臺 部署一個(gè)nginx,一負責吐出所有靜態(tài)文件,圖片數據套了層七牛緩存,二負責以反向代理的方式 ,向C++寫(xiě)的REST 服務(wù) 要數據。
三,C++寫(xiě)的REST 服務(wù)。獨立進(jìn)程,可在多臺服務(wù)器上部署多個(gè)。讓nginx負責負載均衡。
四,上redis作為大量數據的緩存。和小伙伴花了兩個(gè)小時(shí),挑出一個(gè)比較爽的c++封裝。忘了叫什么了----好的工具就是這樣,讓我們只是用它,忘記它的存在。
五,MySQL 。用官方(Oracle)的C++ 客戶(hù)端SDK,mysqlpp。
六,PHP沒(méi)全丟。但把它當Python使用(php client) ,寫(xiě)個(gè)可以獨立運行的程序,在后臺讀數據做一些非實(shí)時(shí)任務(wù)處理。(比如計算一下這位今天一口氣買(mǎi)了不少東西的顧客,系統該送多少個(gè)積分給他。。)
后記:程序上線(xiàn)一運行就到五月底,哇,居然掛掉了。商城熱線(xiàn)電話(huà)接不停,客服很生氣。我也不急。于是:七,用linux shell 寫(xiě)個(gè)守護程序,20秒檢查一下,一看進(jìn)程消失就重啟它。周末我走讀了下代碼。循環(huán)比較std::map的每個(gè)元素,然后通達iterator 刪除(erase)時(shí),好像搞錯。。。。NND ,好像是C++涉及迭代器的很經(jīng)典的面試題吧?你能猜到了吧!
用著(zhù)STL,用著(zhù)第三方庫接收http請求,再用官方的庫讀讀寫(xiě)寫(xiě)數據庫,再處理下吐出json 數據,(轉換json數據也是第③方的庫)。對了,我們也用了不少C++11舒服的特性。沒(méi)有手工分配和維護的內存,這門(mén)傳說(shuō)中恐怖之致的語(yǔ)言其實(shí)乖巧得像一頭奶牛依靠在ngnix之后的草地上吃的是草吐的是奶。除了結構上加了redis作緩存,完全沒(méi)去想什么特別的優(yōu)化,但實(shí)測性能(處理并發(fā)能力)比原來(lái)的版本飚出快三十倍。
老板表示很開(kāi)心。當初合同在一百萬(wàn)殺價(jià)后,有六十多萬(wàn)。但因為雙方合作太開(kāi)心。老板說(shuō)成立一家新公司負責IT。我和一起開(kāi)發(fā)的小伙伴變成股東,合同上未付的30多萬(wàn)折成股本金-——我們很開(kāi)心了一陣呀,但也就一陣。很快發(fā)現:沒(méi)外快賺了
:(。
補個(gè)開(kāi)發(fā)環(huán)境:ubuntu ,QtCreator(CMake)
看此問(wèn)題的應該主要是C++程序員吧! 有興趣玩轉C++搭高性能WEB應用的同學(xué),請私信我并留下微信號。一起玩(我說(shuō)的是外快)吧。