為什麼有些大公司技術弱爆了?

来源:https://www.cnblogs.com/qiaogeli/archive/2019/08/15/11361177.html
-Advertisement-
Play Games

本文整理自知乎上的同名討論帖:《為什麼有些大公司技術弱爆了?》,版權歸原作者所有,原文地址: www.zhihu.com/question/32039226 有網友提問: 今年年初,到一家互聯網公司實習,該公司是國內行業龍頭。不過技術和管理方面,卻弱爆了。那裡的程式員,每天都在看郵件,查問題工單。這 ...


本文整理自知乎上的同名討論帖:《為什麼有些大公司技術弱爆了?》,版權歸原作者所有,原文地址:
www.zhihu.com/question/32039226
有網友提問:
今年年初,到一家互聯網公司實習,該公司是國內行業龍頭。不過技術和管理方面,卻弱爆了。那裡的程式員,每天都在看郵件,查問題工單。這些問題,多半是他們設計不當,造成的。代碼寫的一團糟,全是複製粘貼,連作者都沒改,大家普遍不寫註釋,也不格式化,代碼歪歪扭扭。
一個項目里,httpclient竟然出現了四種。一種是該公司研發部寫的,一種是老版本的開源項目,一種是新版本的開源項目,還有一種是開發人員造的輪子。
打介面請求響應日誌,竟然不知道用攔截器。
打錯誤日誌竟然不打上下文信息,每個人一種日誌風格,千奇百怪。
許多重要的中間流程,居然不打日誌。
idea、eclipse、myeclipse的配置文件竟然全部傳到項目里去了。
該公司混了兩年的程式員,跟快遞公司做查詢介面,竟然不知道加密運單號。
所有服務間通訊,都沒有設requestId,導致跟蹤會話很困難。
一個沒什麼qps的邊緣介面,居然做消費者生產者+阻塞隊列的非同步模式。
顯得你技術少是不是。
不知道非同步會增加維護成本,提高測試難度嗎?
而且,任務隊里沒有考慮持久化,趕上發佈,丟了好多任務。
讀取一個小小的xml和exc配置文件,居然用流式解析,沒見過這麼二逼的,真是醉了。
做優化全靠拍腦門拍大腿,難道不會用excel分析日誌,用jprofile掃項目?
一個100以內的常數集合遍歷,他也要寫個優化演算法進去,演算法跟業務還攪在一起,一團亂麻。
每個人都在嚷嚷性能、演算法、分散式計算……
幾乎沒有文檔,全靠從代碼反推邏輯。
有枚舉他不用,非要在每個頁面上,把枚舉值挨個兒寫死,知道後面改代碼多麼費勁嗎?
欺騙性的變數名,裡面存儲的是AES加密的,變數名尾碼卻寫成了DES;裡面存的是小寫字母,卻寫成upperStr。
一個方法十幾個參數,有三分之一是極其簡略的縮寫,註釋肯定也沒有的。
一個類寫到三四千行是常事。
開發自測,居然要把代碼全丟到公共機器上,而且都是走svn,他們把svn當ftp用。
svn裡面大量的無意義提交,一多半的提交連都編譯不過去。
我看到有個應屆生,改了兩句話,馬上提交,說是怕代碼丟失。
一個運行了兩年的項目,spring的包掃描明顯配錯了,有些bean根本掃不進來,居然沒有人發現。
一半的bean在spring管理下,另一半的bean他們自己寫單例模式來實例化。
他們用mysql來做審計系統,出報表,有個報表要跑8分鐘。
原來是有人用字元串來存多值(逗號分隔),sql里寫了like,導致沒有利用到索引。
為什麼不用pg,pg在sql編程方面,功能更豐富,更適合做統計,它本身就支持數組。
程式員們都是得過且過的態度,怎麼把代碼灌進去,跑的通測試,就算交差了。
為什麼大型互聯網公司,技術和管理這麼差勁,是怎麼形成的?
蕭井陌的回答:
地址:
www.zhihu.com/question/32039226/answer/76059969
樓主你好,我試著給你解釋一下,希望你能滿意。
新手經常會有這樣的想法——「這代碼怎麼這麼爛?寫的人乾什麼吃的?怎麼能這樣?為什麼不按照書上說的做?」,這很正常,大家都年輕過,經歷過這種階段,我懂你心裡的想法,所以也願意詳細地向你解釋,這一切發生的原因是什麼。
你說

不過技術和管理方面,卻弱爆了。那裡的程式員,每天都在看郵件,查問題工單。這些問題,多半是他們設計不當,造成的。
你真的覺得『國內行業老大的互聯網公司』會是技術和管理弱爆了的樣子嗎?
你以為團隊應該像永動機,但現實永遠有各種摩擦、輻射、損耗。
內燃機的能量轉化率,通常只有 30% – 50%,但是它卻是驅動全世界運轉的核心引擎,順豐京東的快遞小車、聯通全國的高鐵動車綠皮、瞬時直達的飛機……
機器尚不能 100% 效率運轉,何況是人呢?
你說我們的程式員每天都在查看郵件、問題工單,你說這些問題多半是我們設計不當造成的,請問你有試過統計數據嗎?你大概只是『感覺』如此吧?
事實上,經過十幾年的發展,我們內部的『效率改進團隊』已經非常高效成熟,每月、每周、甚至每天都會有新的改進,現在的業務處理方式,不說全世界,我可以自豪地說在全國我們是領先的,甚至是遙遙領先,不然憑啥坐到了全國龍頭老大的位置呢?
所以啊,你只看到了程式員花在業務上的時間,沒看到我們內部的『效率改進團隊』為程式員們省掉的時間,我覺得我有必要站出來為默默付出的『效率改進團隊』說幾句。
當然,樓主作為實習生,不知道這些事情進而產生了這些疑問,也暴露了我們的不足。我已經在『團隊建設委員會』里提出了這個問題,大家一致通過了決議,以後我們會對新員工——包括實習生加強企業文化、歷史培訓,確保我們的新伙伴們不僅知道要去哪兒,也要清楚我們從哪裡來,長路漫漫,我們一同前行。
你覺得

代碼寫的一團糟,全是複製粘貼,連作者都沒改,大家普遍不寫註釋,也不格式化,代碼歪歪扭扭。
當初公司起步的時候,整個項目都是幾個初創程式員加班加點熬出來的,我知道你看過《代碼大全》、《程式員修煉之道》、《Unix 編程藝術》,你對上面的準則信手拈來,你可否翻開床頭柜上的這幾本書,看看它們的出版時間呢?
是的,公司起步的時候,這幾本書根本還沒有出版,彼時中國互聯網方興未艾,大家都是摸著石頭過河。現在你遇到問題,你可以問朋友、問導師、用谷歌、用棧溢出、用知乎,我們寫程式那個年代,看的是譚浩強、嚴蔚敏,用的是 52k 撥號上網,語言只有 C,編輯器是沒有語法高亮和實時編譯的,編譯器是沒有智能準確的報錯的,沒有現在這麼多知識、也沒有這麼多規範和好資源、好工具。不過我們還是把項目做出來了,把公司一步步推到了現在的位置。
不過這個問題是客觀存在的問題,誰也不否認,但是你知道為什麼你被分配到了一個『代碼看上去一團糟也不夠規範』的項目嗎?我們需要新鮮血液來重構一些老代碼,所以你會被分配到艱苦的崗位上。我們希望你是勇於戰鬥的戰士,我們更希望你能成長為經驗豐富的老兵,而把你放到這種崗位,是對你來說成長最快的方式。
你認為

一個項目里,httpclient竟然出現了四種。一種是該公司研發部寫的,一種是老版本的開源項目,一種是新版本的開源項目,還有一種是開發人員造的輪子。
你不知道的是,我們最初用了開源軟體(也就是你所說的『老版本』),它構成了我們早期項目的基石,隨著業務複雜性增加,我們改進並最終切換到新版本。
這個軟體跑老業務非常成熟,但是在一些新業務上有不可調和的矛盾,所以在痛苦的適配後,研發部的同事們自告奮勇用 20% 的時間寫了新業務的組件——是的你沒看錯我們也有 20% 時間,我們鼓勵工程師的創新。
至於你說的開發人員造的輪子——這說起來可真有趣,它其實是前年來的一個清華大學實習生寫的。
當時他來了之後,針對他接手業務的需求,向我抱怨說現有的 3 種都不好,要寫一個新的來『統一天下』,這話是他的原話,我記得非常清楚,因為以我多年經驗來看這樣的做法是不可取的,但是本著鍛煉年輕人的心態(加上他的確是不可多得的天才),我同意了他的請求,於是我用自己的業餘時間接管了他的大部分工作,全力支持他寫一個新的組件,幫他擋住了所有上面的壓力,後來的故事就是你看到的這樣。
是的,他後來越深入、就越來越感到業務的複雜,不斷推翻重構、拆東牆補西牆,但始終發現和自己想的根本完全不一樣,受不了了就走了,留下來這個。
我們明年的規劃中,就包括剔除這個組件的 codebase,因為它實在是太糟糕了。
你又說

打介面請求響應日誌,竟然不知道用攔截器。打錯誤日誌竟然不打上下文信息,每個人一種日誌風格,千奇百怪。許多重要的中間流程,居然不打日誌。idea、eclipse、myeclipse的配置文件竟然全部傳到項目里去了。該公司混了兩年的程式員,跟快遞公司做查詢介面,竟然不知道加密運單號。所有服務間通訊,都沒有設requestId,導致跟蹤會話很困難。
攔截器並不如你所想的那班美好,也許你在自己的電腦上寫過一些玩具代碼,覺得這樣很方便、酷炫,但是真正到了戰場,你會發現沒什麼才是必須的、好的,只有適合的才是對的。
至於配置文件,這麼說吧,IDE 的配置文件傳到代碼倉庫是我定下的規矩,『怎麼會有人定這樣的規矩?』,是的你可能從軟體工程的教科書上或者某些『知名博客』上讀到了不能這樣做,但實際上這樣做在很多情況下是必須的。
原因何在?

這樣可以確保代碼克隆即可用,而不是讓每個人都去設置一大堆無聊的東西,這樣不僅節省時間,也確保了每個人的環境一致性,你想想這幾年火熱的 docker,應該明白了這樣做的正確性和必要性了吧?
你可能會說即便如此、插件也不用上傳到伺服器保存,我告訴你這樣是不行的,你要考慮到我們這個項目前後十餘年,你覺得幾個插件能堅挺十餘年?很可能我們早期用的軟體,現在你已經完全不可能找到了,所以保存一份備份是非常有必要的,決不能錯誤地認為是冗餘。
教科書只會教你基本通用的原則,樹立你基本正確的觀念,但是如果只是死守教條,如何能擁抱日益複雜的變化呢?
你看的教科書,且不說時間上已經是二十多年前的了,在適用性上,也不說就是真理,IT 行業發展日新月異,幾個月就是滄海桑田,為了適應這樣的變化,認真地思考、總結、判斷才是最重要的。
你覺得

一個沒什麼qps的邊緣介面,居然做消費者生產者+阻塞隊列的非同步模式。顯得你技術少是不是。不知道非同步會增加維護成本,提高測試難度嗎?而且,任務隊里沒有考慮持久化,趕上發佈,丟了好多任務。讀取一個小小的xml和exc配置文件,居然用流式解析,沒見過這麼二逼的,真是醉了。
你大概不知道,當初跑在你口中的「一個沒什麼qps的邊緣介面」上面的業務帶來了公司曾經 90% 的收入,所以我們用了複雜的設計以應對當時的需求,當然現在業務轉變,老系統不再需要處理那麼多業務了,但是更沒有理由為一個『works perfectly well』並且不再重要的業務重構代碼吧?
所以,不是我們秀技術,而是業務需求 + 業務變更使然,年輕人還需要多學習一個。
你抱怨

做優化全靠拍腦門拍大腿,難道不會用excel分析日誌,用jprofile掃項目?一個100以內的常數集合遍歷,他也要寫個優化演算法進去,演算法跟業務還攪在一起,一團亂麻。每個人都在嚷嚷性能、演算法、分散式計算……幾乎沒有文檔,全靠從代碼反推邏輯。有枚舉他不用,非要在每個頁面上,把枚舉值挨個兒寫死,知道後面改代碼多麼費勁嗎?欺騙性的變數名,裡面存儲的是AES加密的,變數名尾碼卻寫成了DES;裡面存的是小寫字母,卻寫成upperStr。一個方法十幾個參數,有三分之一是極其簡略的縮寫,註釋肯定也沒有的。一個類寫到三四千行是常事。
我再強調一次——我們是全中國同類公司中技術能力第一的,你所說的問題,當然是不存在的。
我們有專門的 Hadoop 集群來分析日誌,當然也就用不著 Excel 了。
對於我們這種體量的公司來說,不存在什麼『常數集合』,代碼必須用合適的數據結構——這是常識吧?
特殊的演算法和業務摻雜以增加內聚性,這是我們多年的經驗,的確,它和教科書上說的不一樣,但是我前面說了,死守教條是不行的——想必你一定知道 OSI 7 層網路模型吧?
公司的技術氛圍濃厚,是和公司的基因分不開的,我們公司最重要的原則就是——『擁抱變化』,從十幾年前的機房托管單機到現在的龐大自建集群,技術躍遷了何止千萬里,所以每個人都在學習新知識、每個人都沉浸在新知識的喜悅中。
你的問題,大多都是因為沒有考慮到公司的龐大體量和十幾年的技術躍遷才有的疑問,這點不再贅述,自行體會吧。
你想的是

開發自測,居然要把代碼全丟到公共機器上,而且都是走svn,他們把svn當ftp用。svn裡面大量的無意義提交,一多半的提交連都編譯不過去。我看到有個應屆生,改了兩句話,馬上提交,說是怕代碼丟失。一個運行了兩年的項目,spring的包掃描明顯配錯了,有些bean根本掃不進來,居然沒有人發現。一半的bean在spring管理下,另一半的bean他們自己寫單例模式來實例化。
其實那不是 SVN,那是我們公司自主研發的適應我們內部需求的 源代碼管理系統 和 文件管理系統,你可以往裡面放任何東西。
你所說的「無意義提交、一多半的提交連都編譯不過去」其實只是表象,這套系統代號 TITAN,它自帶 CIDD(持續繼承、交付、部署),所以這些無法編譯的提交都是不會有機會走到下一步流程的的。
如果你工作了一年,你就會發現這個需求是很重要的,改動、尤其是大型改動,中間會有很多非可用但有需要存檔的步驟,現有的源代碼管理系統都不能很好地支持這些需求,因此你也被教育了一套適應落後工具的思想。人啊,最重要的能力是改進工具,所以用 TITAN 的時候要擁抱全新思維,不要被落後思維捆綁。
如果你工作了幾年,你可能還會問為什麼我們沒用 Jenkins、Travis 等工具,其實呀,就在 TITAN 之中呀,它凝結了公司最優秀的人才的十幾年寶貴經驗和心血。
By the way,我們最近正計劃開源它,為中國開源社區做貢獻,也希望提高業界的綜合素質。歡迎你提交 PR 哦。
你最後說

他們用mysql來做審計系統,出報表,有個報表要跑8分鐘。原來是有人用字元串來存多值(逗號分隔),sql里寫了like,導致沒有利用到索引。為什麼不用pg,pg在sql編程方面,功能更豐富,更適合做統計,它本身就支持數組。程式員們都是得過且過的態度,怎麼把代碼灌進去,跑的通測試,就算交差了。為什麼大型互聯網公司,技術和管理這麼差勁,是怎麼形成的?
為什麼不用 pg?如果你抱著這種想法,那用了 pg 也要被噴的,到時候就就會說 —— 「為什麼不用 sqlite,輕量簡單,搞這麼複雜真的有必要嗎?」,真的有必要。。。
這隻是一個很簡單的系統,做的事情也很簡單,當初做這個系統的同事更熟悉 MySQL,當然 MySQL 是不二之選了,對於簡單的東西,追求的是開發速度、使用便利性。
你覺得一個月跑一次的審計代碼,8 分鐘有什麼問題嗎?就算是一周跑一次,當然也是沒問題的。
程式員的單位時間是如此寶貴,為了優化一段一個月跑一次的 8 分鐘代碼,值得花費數天的時間來做這件事嗎?
重覆一遍,你的問題,大多都是因為『沒有考慮到公司的龐大體量和十幾年的技術躍遷才有的疑問』,這點不再贅述,還請自行體會。
當然,年輕人樂於思考,這是好事,是希望,新鮮血液替換老舊部件系統才能健康發展成長,人如此、公司如此、國家也是如此。
希望你勤於思考,努力學習,有問題的話,我們公司是鼓勵同事們向 CEO、CTO 寫信的,不然也不會有 CEO、CTO 信箱了你說對嗎?
當然,這樣的技術性問題、你寫給我就好,CEO 是船長,不需要關心底層鍋爐房的細節。
另外我想補充一下我的想法,希望對你有所幫助。
你看你都沒說加班問題,我們公司沒加班啊,這多好,怎麼做到激烈競爭下還能不加班的?都虧了公司老領導和元老們的一手決策
所以我想補充的不是技術問題,技術問題都不是問題,年輕人可以學習、交流,技術都會很快成長,畢竟年輕人的衝勁大、頭腦靈活。
我想說的是整體觀、大局觀、大棋戰略。
黃金的導電性最好,為什麼電腦主板還要用銅?
清華大學最好,為什麼有人要去普通學校?
飛機最快,為什麼還有人坐火車?
因為資源都是有限的,我們在現實生活中——而不是教科書上——必須兼顧成本和產出的平衡。
你問我每行代碼都多人多層人工 review 好不好?問我支不支持?我說好,review 我怎麼能不支持呢?我今天在知乎這個公眾平臺我明確說了我支持。
但是你也應該多學習一個,這個現實畢竟是現實,我們要兼顧各種考量。
你今天在這裡渲染「大公司技術和管理這麼差勁」,是不對的、是失實的、是欠妥的、是缺乏認真思考的、是未加深入考量的。
將來輿論出了偏差,你雖然不用負責任,但是你認識到自己的錯誤的時候,會後悔、會內疚、會難過的吧?
何處烏托邦?或許……等下一代?
總結就是,生產效率才是最重要的,世間萬物最重要的是平衡。
怎樣取捨、如何妥協,這不僅是大自然的規律,也是我們前進、發展的準繩和仰仗的原則。
陳萌萌的回答:
地址:
www.zhihu.com/question/32039226/answer/75823779
題主你看到了很多槽點,但我認為你不能只看到槽點和大概怎麼解決。有沒有想過怎麼改進,如果是你的話你怎麼做,這些項目裡面臨的主要挑戰是什麼,次要的挑戰又是什麼?
不要只告訴我技術A弱爆了,用B就可以完爆這個項目了。你知道用B的優劣,B的適用場景以及適用B的成本嗎?對於一間公司來說,成本是很重要的。我這裡說的成本不是金錢。而是,假如你看不爽一份代碼,你打算重構它,你覺得你需要投入多少時間,多少人力?重構之後,又要花費多少時間和人力去升級依賴這份代碼的其他項目?不要以為開會無用,老闆就只是在天天發郵件。如果你重構了一份代碼,不能通過溝通說服其他組去升級他們的組件,又或者你只是重構了一份雖然很醜陋,但其實並沒有多少程式依賴它的代碼,又又或者你重構了代碼只是讓代碼技術含量更高了,更好看了,卻沒給公司帶來多少收入甚至KPI,那你的工作和成果就很尷尬了。
其實上述也解釋了為什麼你身邊的同事都眼睜睜地看著這些醜陋的shit存在而無動於衷。因為他們也是需要投入成本的。先不論他們個人技術水平高低,試問誰願意挑一個又艱難,又不能產生多少效益的任務去做?當然,你會說,寫好代碼是程式員的節操。抱歉,節操多少錢一斤,北京三環商品房多少錢一平?
編程高手都有真愛,但現實就是編程高手鳳毛麟角。我們身邊的大部分同事可能只是希望養家糊口,他們頭上還掛著十幾個bug等著修。我們數落他們沒追求,但追求從來都不是嘴上說說,吐吐槽就能實現的。
人心如此,公司也如是。

矛盾分主次,公司的目標都是一樣的:用最少的成本投入到最能產生效益的項目中去,或者投入大成本去解決公司最需要解決的問題,這間公司才能繼續運作。
所以題主你想想,在你吐槽的個案中,有多少是公司真正關心的?有哪些是你的老闆認為可以創造最大效益的?有哪些才是主要矛盾或者挑戰需要最牛逼的人挺身而出第一時間解決?去辨別,解決這些關鍵的問題吧,騷年。必要時帶上(忽悠)一隊人馬(同事)跟你一起乾,苟富貴,勿相忘。不要像祥林嫂一樣,天天抱怨著生活,日日思考著辭職。得罪點說一句:“淪落”到要跟這樣的人共事工作,難道自己身上就沒有原因?
這個世界有更好的公司,有更牛逼的人。如果你認為解決這間公司的這堆問題不值得,又或者同事實在太不給力,就遠走高飛吧。
我以前也跟題主一樣,看我第一份正式工作的很多技術環節都相當不爽。這份代碼寫得醜,那個設計像大學生作品,重要的項目居然連單元測試都沒有……但是我後來反觀我自己,並沒有發現比起那些醜陋代碼和糟糕實現強悍多少。我跟我的同事沒有質的區別。我笑話他們代碼混亂bug不盡,我何嘗不是少處理了一個field,倒騰錯了一個片段的數據搞到要翻工重跑?在我心底裡艹了隔壁組那個“我的程式好像不能跑,你幫我debug下”的同事一千次之後,帶我做ML讓我倒騰數據並且被我的程式搞壞了幾份數據(當然後來搞好了)的T9君在會議上說:“她已經很努力了,我承認我有時候也逼得她太緊,她應該有多些時間的。”

覺得文章不錯的歡迎關註我的WX公眾號:程式員喬戈里
我是百度後臺開發工程師,哈工大電腦本碩,專註分享技術乾貨/編程資源/求職面試/成長感悟等,關註送5000G編程資源和自己整理的一份幫助不少人拿下java的offer的面經附答案,免費下載CSDN資源。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 文章轉載自:http://www.pythonheidong.com/blog/article/3339/ 這些面試題是我在今年年初換工作的時候整理,沒有重點。包括java基礎,數據結構,網路,Android相關等等。適合中高級工程師。由於內容過多,將會分為上下兩部分。下部分跳轉鏈接:http:// ...
  • 文章轉載自:http://www.pythonheidong.com/blog/article/3329/ 本文為開發者奉獻了70道經典Android面試題加答案--重要知識點幾乎都涉及到了,你還等啥,趕緊收藏吧!! 1. 下列哪些語句關於記憶體回收的說明是正確的? (b) A、 程式員必須創建一個線 ...
  • 文章轉載自:http://www.pythonheidong.com/blog/article/3327/ iOS面試題 1.Difference between shallow copy and deep copy? 淺複製和深複製的區別? 淺層複製:指向對象的指針,而不複製引用對象本身。深層複製 ...
  • Data Structure Notes Chapter 1 Sorting Algorithm Insert Sorting: 對於近乎有序的數組可以降到$ O(n)$的時間複雜度。 Merge Sorting: Tips1 :Merge Sort Optimize in nearly order ...
  • 前言 前面一篇文章寫了 "《SimpleDateFormat 如何安全的使用?》" , 裡面介紹了 SimpleDateFormat 如何處理日期/時間,以及如何保證線程安全,及其介紹了在 Java 8 中的處理時間/日期預設就線程安全的 DateTimeFormatter 類。那麼 Java 8 ...
  • 以 Spring MVC 啟動 Servlet 為例,其應用上下文為 ServletWebServerApplicationContext,繼承了 GenericWebApplicationContext 的大部分方法,主要重寫了 postProcessBeanFactory()、refresh() ...
  • 一個簡單的Restful Crud實驗 預設首頁的訪問設置: 項目結構: Bean: package com.project.javasystem.Bean; public class Department { private Integer id; private String departmen ...
  • 1.日誌文件列表 比如:/data1/logs/2019/08/15/ 10.1.1.1.log.gz 10.1.1.2.log.gz 2.統計日誌中的某關鍵字shell腳本 zcat *.gz|grep 關鍵字 |grep -oP "deviceid=[^=]+"|uniq|sort -u > / ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...