導航:首頁 > 程序命令 > api程序員遇到更新

api程序員遇到更新

發布時間:2024-05-20 03:35:54

1. 浣跨敤API鏃訛紝澶у朵富瑕佷細閬囧埌浠涔堥棶棰

寰堝氫漢閮戒嬌鐢ㄨ繃浠g悊IP錛屽湪浣跨敤榪囩▼涓涔熺粡甯擱亣鍒頒竴浜涢棶棰橈紝閭d箞鏈夊摢浜涙妧宸у彲浠ユ彁鍓嶉伩鍏嶅憿錛熺幇鍦ㄦ垜浠鎬葷粨涓涓嬨
1銆両P鍒版湡鍓嶅垏鎹IP
浠g悊IP涓鑸鏈夋晥鏈燂紙錛堥櫎闈欐佷唬鐞嗕漢IP澶栵級錛屾瘮濡傜煭鏁堜紭璐ㄤ唬鐞嗕漢鐨勬湁鏁堟湡涓3-6鍒嗛挓錛屾垜浠鍙浠ヨ幏寰椾唬鐞嗕漢IP鐨勫墿浣欑敓瀛樻椂闂達紝鐒跺悗鍦↖P澶辨晥鍓嶅垏鎹浠g悊浜篒P錛屼互鍏嶄唬鐞嗕漢IP澶辨晥瀵艱嚧緗戠粶涓鏂錛屾棤娉曠戶緇宸ヤ綔銆
2銆両P騫跺彂涓嶅簲璇ュお澶
鏃犺轟唬鐞咺P鏄鍚︽湁騫跺彂闄愬埗錛屽崟涓浠g悊IP鐨勫苟鍙戞ч兘涓嶈兘澶澶с傚洜涓哄苟鍙戞ц秺澶ц秺鎱錛岀敋鑷寵秴鏃躲備負浜嗕繚璇佸伐浣滀換鍔$殑鎸佺畫榪涜岋紝鎴戜滑蹇呴』鍚堢悊鎺у埗鍗旾P鐨勫苟鍙戞с侀熷害銆佺ǔ瀹氬伐浣溿
3銆佹敞鎰忓弽鐖鎴樼暐
姣忎釜緗戠珯閮芥湁涓浜涘弽鍚戠埇琛岀瓥鐣ワ紝鏈変簺鏄瑕佹眰棰戠巼鎴栨悳緔㈤戠巼錛屾湁浜涙槸鍗曚竴鐭ヨ瘑浜ф潈璁塊棶嬈℃暟錛屾湁浜涙槸涓ユ牸鐨勫弽鍚戠埇琛岀瓥鐣ワ紝鏈変簺鏄鐩稿瑰芥澗鐨勭埇琛岀瓥鐣ャ傚湪浣跨敤浠g悊IP宸ヤ綔涔嬪墠錛屾垜浠闇瑕佺爺絀剁洰鏍囩綉絝欑殑鍙嶅悜鐖琛屾垬鐣ワ紝灝介噺涓嶈佽Е鍙戝弽鍚戠埇琛屾垬鐣ヨ屽伐浣溿
浠ヤ笂鏄浣跨敤浠g悊IP鐨勫皬鎶宸э紝甯屾湜瀵規湅鍙嬫湁鎵甯鍔┿傚緢澶氫漢璁や負鏈変簡IP浠h繍钀ュ氨鍙浠ヨ倖鏃犲繉鎯鐨勮塊棶緗戠珯錛屽叾瀹烇紝IP浠h繍钀ヤ篃浼氳Е鍙戠洰鏍囩綉絝欑殑鍙嶇埇絳栫暐錛屽叾浼樺娍鍦ㄤ簬鏁伴噺搴炲ぇ錛屽彲浠ュ湪鍙楅檺鍓嶅垏鎹㈡柊鐨勪唬榪愯惀IP錛屼繚璇佸伐浣滅殑鎸佺畫紼沖畾銆

2. 程序員遇到百度不出來的bug都是怎麼解決的

筆者不同意下面網友的回答。程序員如果解決bug的水平停留在網路,那麼本質上只是一個「面向搜索引擎的代碼搬運工」,是不合格的程序員。

程序員對面bug,正確的「打開方式」是像福爾摩斯和柯南那樣,尋找線索、運用邏輯推理來縮小問題可能的根因范圍,最終精準定位。

常用的方法有:

1. 壞境上下文變換法

2. 工具調試法

3. 版本回溯對比法

4. 代碼審計法

……

沒有編程問題是stack overflow和Google解決不了的,假設你在編程中遇到了問題,你自己解決不了、你周圍的的人都解決不了的時候,我覺得stack overflow、Google是你最好、也是最後的幫手。

作為一個程序員,我覺得Google、stack overflow是你必須要學會使用的兩個工具,這兩個工具本身並沒有使用門檻,只不過因為一些眾所周知的原因,很多人不能使用Google和stack overflow這兩款工具。

Google主要還是方便,而且很多編程問題都需要用到英文搜索,當然現在網路在專業能力上也提升明顯,不過跟Google也還是有比較大的差距,因此我還是強烈建議要學會使用Google,這會幫你在工作、學習上事半功倍。假設Google確實因為某些原因沒辦法很好的使用,我也建議你至少要會使用Bing搜索。

現在可以說stack overflow上沒有你找不到的問題了,從IDE環境安裝問題,到各類編程語言問題。演算法問題,數據結構問題,調試,重構等等,幾乎這里就沒有你找不到的答案,可以說在stack overflow上你可以找到任何解決方案,並且上面的回答者基本上都是非常有經驗,而且都是實際中遇到的問題分享出來的,這個工具一定要會使用。同理,除了stack overflow這個專業的垂直程序員問答社區,你也可以使用Quora這個綜合問答社區,這上面也能找到很多問題的答案。

一些比較優秀的文本編輯器: Emacs/Vim,Visual Studio Code,Sublime Text,Atom,Ultraedit,Hbuilder等。

一些比較非常出色的IDE集成開發環境: visual studio,IntelliJ IDEA,PhpStorm,Haskell for Mac ,eclipse,WebStorm,GoLand,CLion,Android Studio,Xcode,QT等。

macOS平台比較好的第三方包管理工具: Fink,Macports,Homebrew等。

一些比較好的終端工具: Zoc7,iTerm2,Cmder,terminus,hyper等。

一些比較好的筆記軟體、markdown工具、效率工具: Evernote,有道雲筆記,為知筆記,Ulysses,MWeb,FileZilla,Snipaste,Kantu等。

虛擬機軟體、容器軟體: Parallels Desktop,VMWare Fusion,Virtual Box,Docker等。

我是個程序員,職務是linux底層驅動工程師。平時的主要工作是調試驅動,但產品遇到諸如死機、重啟、不開機之類的問題時,也要參與查找原因。一部分問題,確實可以查看相關的log,然後網路這些log的關鍵字來解決;但更多的問題,牽扯的條件太多,並不是簡單的網路就能解決的。

觀察了周圍同事們的做法,我總結出以下幾種解決方法:

網路因為競價排名的原因,搜索出來的結果有很多廣告的成分,所以有時候要翻好幾頁才能看到一條相關的答案,有些甚至要翻幾十頁。

因為網路搜索使用的是SEO技術,即普通用戶可以通過優化網站內容來提升關鍵詞排名。

而這就會導致一個問題:你搜索關鍵詞後展現出來的結果是有人想要讓你看到的,並不是質量最好的。

也就是說,網路搜索結果被人為干預了。所以網路一直被網民所詬病。

但網路搜索不出結果,未必是網路的原因,也有可能是自己輸入的搜索詞不準確造成的。所以對於網路,我們要做到如下幾點:

除此之外,網路搜索還有點小技巧,粥左羅《萬字干貨,徹底講透搜索技巧,10倍提升你的搜索力(免費教程)》這篇文章寫得非常好,我整理幾點,僅供參考:

01 過濾目標內容

命令:「+」「-」

用法:通過「+」和「-」來對搜索結果進行過濾

比如在關鍵詞後加上「-推廣 -推廣鏈接」就可以排除搜索結果中包含相應字樣的鏈接。如果你發現廣告還沒有排除干凈,你也可以再加上「-廣告」通常就能徹底的消滅廣告。

02 搜索包含某關鍵詞的內容

命令:「intitle」

用法:通過「intitle」命令指定搜索結果中要包含的關鍵詞,注意「intitle」後邊連接的冒號是英文狀態下的。

03 搜索某一個格式的文件

命令:「filetype」

用法:通過「filetype」命令可以限制我們要搜索文件的類型,注意「filetype」後邊接的冒號也是英文狀態下的。

04 搜索特定時間范圍的內容

命令:「時間..時間」

用法:通過「時間..時間」命令可以限制我們要搜索的文件的時間,注意兩個時間的中間頓號沒有空格。

相對網路,谷歌、必應對於技術搜索,就相對准確許多,所以當你網路搜索不到時,嘗試下別的搜索引擎,說不定會有新發現。

現在程序員使用的機器語言,都是國外的,更准確的說,都是美國的。所以很多論壇、資料等,都是英文。如果你只會用中文來搜索,某些小眾的問題,當然搜不到啦。

所以,要學會使用英文關鍵字來搜索。

有時候甚至要去國外的一些論壇來搜索想要的答案,這就要求要有一定的英語閱讀能力,不能一看到英文帖就放棄。

有時候不管你如何搜索,都找不到自己想要的答案,該怎麼辦呢?這種情況下,就只能硬著頭皮嘗試自己解決了。

或者,尋求同事或朋友的幫助,尋求大腦風暴,說不定就會有思路。

如果有些問題是因為新器件帶來的,還可以找到器件供應商,讓他們安排技術支持幫忙查找原因。

除此之外,還可以把問題整理好,寫清發生的條件、復現步驟、測試方法、相關的LOG截圖等資料,去一些技術論壇發求助帖,尋找大牛的幫助。

做技術時間久了,發現有些問題確實無解,根本沒有辦法去解決它。

這時候,我一般會嘗試把它繞過,就是說,想辦法讓它無法復現,雖然問題還是存在,但是能把它掩蓋過去。

比如有些驅動在開機啟動時會載入不正常,那麼就讓它晚點啟動,或者手動載入。這也不失為一種解決問題的方法。

以上就是我的建立,希望對你有幫助。

首先作為一個程序員,一個優秀的程序員最最最重要的能力就是解決問題的能力。這里解決問題的能力當然就包含了解決 bug 能力了

畢竟,程序員這一生,可能會寫無數個 bug ,沒有說哪個程序員敢保證自己寫的程序沒有 bug 。 所以,寫了 bug ,遇到 bug 並不可怕,可怕的是你沒有解決 bug 的能力 。

作為一個程序員,解決 bug 的途徑有哪些呢?我們來一起聊一聊!

其實,每個程序員在學習編程的時候,都會使用編程工具,而現在的開發工具,其實功能都很強大。如果你自己合理利用編程工具,都了解和懂得開發工具的一些技巧,其實不僅僅能夠提高開發效率,而且還能夠幫助你解決很多編程中的實際問題。

debug 調試,大部分你常用的開發工具,都會有調試模式的,簡而言之,就是你編程的時候,遇到了不是自己所想的結果的時候,你可以使用 debug 模式,來一步一步的調試,在調試模式下一般每一步都會顯示所執行的結果,你可以看看在哪一步出錯了,執行的結果與你預想的結果不對,那麼你就能夠找到問題所在了。

還有就是,開發工具的控制台,都會提示出報錯信息的,現在的開發工具,都會直接告訴你哪一行,報了什麼錯。其實,很容易定位到錯誤的。你只需要在編程的過程中積累經驗,知道報什麼錯,用什麼方法來解決就行啦。

可是,提示的報錯信息,我不知道用什麼方法來解決的時候,該怎麼辦呢?這就是你需要積累的,也是問題中所描述的,就是通過搜索引擎來找答案。

不對,這里不應該是合理使用搜索引擎,應該是學會正確使用搜索引擎。比如:網路,你就不要用了,搜出一堆重復的信息,而且廣告也多。作為程序員,建議你使用谷歌搜索。

其實,你在編程中所遇到的幾乎所有的問題和 bug ,別人也同樣遇到過,因為不管是經驗豐富的老程序員,他技術再牛逼,也是初學者過來的,也都踩過你踩的坑。所以,互聯網是個好地方,裡麵包含了你想要的問題的答案。

你只要把報錯信息往搜索引擎上一放,回車一下,很多關於這個 bug 的答案就出來很多,你只需要找到跟你一樣的 bug ,就能找到答案了。

在這里必須提一下這個網站,所有的程序員有必要學會使用這個網站,其實,你編程中所遇到的問題,這個網站上幾乎都是由解答的。

Stack Overflow 可以說是最好的軟體程序類問答網站了,給軟體開發人員工作和學習提供了非常大的便利,以至於像小白,離了 Stack Overflow 簡直都不會寫程序了。

所以,建議大家一定要學會使用這個網站,對你編程肯定會有非常大的幫助的。

通過上面的方法,幾乎應該能夠解決到你所遇到的問題,但是,實在找不到答案的話,你可以問經驗比你豐富的老程序員,實在解決不了,那就換種方法吧!

網路,谷歌,debug,斷點調試,業務上的bug就需要問下同事或者產品。如果能知道大致范圍,哪一部分錯了,就換一種方法唄,一般都不會只有一種方法。

1.reload

2.restart

3.rewrite and then goto 2 or 4

4.reboot

5.rm -rf /

6.原諒我編不下去了[捂臉][捂臉][捂臉][捂臉][捂臉][捂臉][捂臉]

找bug跟醫生看病的思路是一樣的,要對症下葯。得先把問題的根源找到,找到根源以後問題就容易處理了。搜索引擎找不到的問題,說明這個問題不是一個常見的問題,具有獨特性,那麼從bug出現的路徑上一步一步去排查。必要時可以用排除法,盡可能的縮小排查范圍。另外,當軟體的業務邏輯比較繁多復雜的時候,一個結構清晰的架構能為你節省不少找bug的時間。還有,充分的單元測試能夠幫你減少出bug的機會。以上均為個人看法,歡迎討論!

一般程序員能碰到的bug無外乎其他上遊程序員寫庫時手抖留下些不匹配或者容易溢出的問題,搜一下差不多能解決問題。如果是自己寫的,那無非就是時序錯誤類型錯誤之類的,用break point一行行的調就好了。

再復雜點的bug就是程序員拿高薪的根本了,只可意會,不可言傳~

僅僅靠搜索引擎、其他網站那必然無法解決大量問題,因為很多問題是跟業務邏輯相關的,是沒有直接答案的。比如 游戲 開發有個界面一直無法顯示,這個問題就不是網路可以解決的。問題需要調試分析,這和破案非常像,但在開發過程中更有利的是問題有機會可以重現。破案是逆向工程,需要反推。解決代碼問題不僅僅可以反推,也可以通過閱讀代碼正向分析。下面說說如何debug一個業務邏輯問題。回到剛剛的例子,有個界面一直出不來,我們如何快速去定位:

1.思考這個問題發生的可能性。比如 游戲 內大量界面都是正常的,那麼可以對比正常界面代碼和異常界面代碼的區別,這是對比法。

2.假設創建正常界面和這個異常界面的邏輯代碼是一樣的,那麼問題就落到了這兩個界面內部,繼續在內部重復上面的對比法進行判斷,直到鎖定最終位置。

上面說的方法基本上可以杜絕卡在一個簡單問題上,這是擺脫新手的一個過程。選擇使用對比法或者其他方法的前提都是基於觀察和對項目的認識,所以,搜集「案發現場」是最關鍵的。

其他的問題,不屬於邏輯的,像其他網友說的那樣,有些通過到github、stackoverflow等地方解決的。這些問題也不是直接就去查找的,它通常也有個分析過程。比如你使用了一個庫,但是目前它不支持你的模塊。對於新手,就是直接網路或者google了。實際上這樣的問題也是有「案發現場」的。對於作者提供的api介面的統一性和便捷程度去推斷作者在相關支持模塊的位置以及命名以及拓展,再嘗試在文件夾中搜索。如果都找不到,再去Google上獲取更多的信息。重復推斷、分析,決定如何拓展或者繞過。

綜合上面的幾種問題,可以看到的是都離不開對現場的觀察和推理分析。這種能力也被稱為經驗。但是一般情況下你看不到它們這個分析過程,你能做的就是在實際環境中反復逼迫自己去思考,去訓練。這個推理的培養,不僅僅是對事情,也是對人。

我在入行 游戲 開發的前期,也是類似的情況。卡在不同種類的問題上,有些在簡單邏輯,有些在別人的代碼支持上。後面解決的問題多了,就會發現裡面共通的思維方式。常用的一些方法如下:

1.對比法,比較正常與異常代碼區別

2.二分查找法。分段注釋找問題,也會用在很多方面。比如最近版本突然出了一個奇怪bug,可以通過svn還原來定位。這個還原不是一個一個版本還原,而是用二分法去還原。

3.增加信息。在懷疑的位置或者過程添加日誌或者打斷點輔助自己更好的推理。

4.相似推理。比如一個引擎在api、性能使用程度上都非常友好,那麼它在別的地方也有可能相對表現比較好。這時候如果有個功能我們的實現需要很復雜才能完成,那麼就有可能是我們用錯了。相似推理不一定都能正確,但會提供一些幫助。

以上。

3. 現在軟體行業已經很成熟,為什麼程序員還在沒日沒夜敲代碼搞系統更新

時代不同了,之所以程序員還在沒日沒夜敲代碼製作更新系統是因為要突破創新,不然就要被別的產品給淘汰了,所以程序員敢不設計新產品嘛?

現在的電子產品並不好用,才更要運用好創新設計,爭取製作出好成品。無論是電視、藍牙耳機、電腦、網站應用、游戲…以及很多的領域都在不斷地更新。

畢竟除了所有應用軟體更新創新的辦法,也別無他法。我打個比方吧,比如說我想買個消除噪音的耳機,那我在天貓或者京東上購買了自己看中的耳塞,買回家後我塞在耳朵里,外邊的聲音就能夠減輕許多了嘛?最多也只能減輕一點點,完全降噪肯定不行的。

就像以前的老台式電腦,到後來的筆記本電腦,還有台式一體機電腦,這也是系統更新的過程紀錄。

好的產品為了避免被取代只能不斷更新,停止創新的產品終將被人們遺忘舍棄!

4. 程序員遇到很難的技術問題是怎樣的感覺

昨天剛領一個線上P0級重大事故,持續時間1小時,影響范圍全站 !准確的時間點是下午17點開始,具體問題定位且聽我下文細細道來。


先說感覺,那感覺真是太刺激了,本來下午五點,昏昏沉沉的,瞬間一個激靈就清醒了(想像一下高中課堂,你在打瞌睡,突然老師走到你面前給你一下子的感覺),原本准備再過一小時吃晚飯了,吃完晚飯再摸魚到21點就可以下班了呀,別問我為啥到21點,問你就不是程序員!


帶著無比緊張且顫抖的心情開始定位問題,先來個錯誤日誌嘗嘗鮮:




整個事情的發酵是這樣的:

1、下午五點開始有少量的慢sql報警,沒有人當回事,因為這種事情總發生,雖然大家都知道在實際開發中如何避免慢sql,但是整個團隊要想完全避免慢sql卻很難;

2、五點十分左右,開始零星有用戶反饋指定功能不可用,SLB開始報警,技術開始介入排查;

3、十五分左右,客服部門電話開始爆炸,用戶密集反饋指定功能不可用,技術部開始重視;

4、二十分左右,所有服務大面積出現介面無法響應,整體服務不可用;

5、我們一開始定位覺得是MySQL的問題,因為前面有mycat的慢SQL報警,後來定位並不是MySQL,因為MySQL的內存、連接數、流量這些指標都很平穩;

6、最終在五點三十分的時候我們定位到是ES出問題了,因為所有的Java服務不可用最終都指向上面的錯誤日誌,bbo提供的服務線程池滿了,再有請求進來直接拒絕了,查看這個服務的代碼,最終查詢的是ES,此時的ES進程已經處於假死狀態。


那接下來大家說怎麼辦?如何快速的恢復線上服務?



重啟!


是的,只有重啟大法此時是最快的解決辦法,你不可能說保留ES事故現場,讓我用arthas之類的工具來現場分析jvm內存情況。

然而重啟之後服務依舊是不可用,介面還是無法響應, 大家知道這個時候是什麼原因嗎?為什麼重啟了ES服務還是不行?


後續繼續重啟報錯bbo日誌的相應服務,當這些服務全部重啟完畢後,我們的服務終於恢復訪問了,這個過程持續了十幾分鍾,確切的說,直到17點五十多分,我們的所有服務才恢復了訪問。


接下來就是事故總結、相關責任人、產生問題的原因、接下來的優化方案,全公司郵件通報!


你說這個難不難?本身並不難,難的是事情緊急且重要,這個時候你慌了啊,亂手亂腳的,大家你一言我一語的,如何冷靜提取有效信息然後盡可能快的解決生產的重大故障才是最難的!


最後,當一切都恢復平靜的時候,你會發現:「卧槽,好累啊!」。

虛脫的感覺!

最後祝大家程序員節日快樂,今年可是程序員的本命年哦



2020 = 1024 + 996 = 404 + 404 + 404 + 404

這種感覺能難受,很壓抑。

技術難題,對於程序員來說,是經常有的事,關鍵是如何面對吧。

說下我的事情,雖然也會寫點代碼,但並不是以此為正業,所以對於真正的程序員來說,可能說法會有點偏頗。

遇到難題時,一般都在網上搜索解決方法,一般來說,都有很優秀的程序員分享他的勞動成果,所以一般都能解決問題。但也真正碰到難的問題,一個就是循環的問題,無限極菜單問題,當時都是找了很久,看了很多遍才明白過來,當時自己是幾天都不太開心,也不太想說話,總是在測試著程序。挺煩也挺不開心的。只是最後做出來了,心情就好多了。

這是我的一些經歷,當然,如果全職程序員,可能壓力就更大了。

如何形容這種感覺呢?焦躁,緊張,失落,無助,亞歷山大...

再多詞可能都描述不清楚。本人在工作中經常遇到難題,有些問題一兩個月都搞不定。遇到這種問題,估計只有下面這張圖的表情能描述此時此刻的心態了。

程序員遇到的難題其實分為兩種,一種是沒有辦法定位清除的問題,另外一種是定位清除了,但是沒辦法,或者很難解決的問題。

難定位的問題

所謂難定位的問題,其實就是你根本不知道這個問題是什麼。比如系統突然掛掉了,你從現有的信息根本不能確定問題在哪。這個時候你剩下的可能只有滿腦子的問號了。


如果系統只掛了一次,後面不再出問題,那就很難找出問題的根源了。不過這樣也有好處,那就是問題的影響的程度相對較輕,畢竟不容易出現。所以在軟體開發中通常不是什麼問題都解決的,因為不是所有問題都能搞清楚是什麼問題,談何解決呢!

難解決的問題

難解決的問題是問題搞清楚了,但是基於現有架構很難,或者沒法搞定。遇到這種情況,通常先是很高興,興奮,然後就只剩下無奈了。

當然,從技術層面來說並不是完全解決不掉。只是如果要解決需要涉及架構調整或者其它方面的改動,修改調整的內容太多。這種情況下就要考慮利弊得失了。


如果改動太大,可能會引入很多新的問題,可能得不償失。因此,遇到此類問題可能會採取一些規避方案。

當然,在開發和運營當中遇到各種問題是很正常的,關鍵是遇到不同的問題採用不同的策略。首先保證的是業務的正常運行,然後是考慮是否需要徹底解決。這樣慢慢調整,心理壓力會小一些。

作為一個工作多年的老碼農,在工作也遇到過一些艱難的技術問題,就以切身體會談談對這個問題的看法。

首先需要明確一下,問題是否困難除了取決於問題本身之外,還在於解決問題的人的水平,也許對你很難的問題,在別人看來不過是小菜一碟。明白了這一點,那麼這些技術問題也就成了考察程序員水平的試金石,有些人可能會因此氣餒,甚至放棄;而有些人則通過解決問題學到了很多新的技術,也讓自己進一步成長。

記得多年前看工作中要用到一款開源庫,那時候剛學完C++不久,自以為對面向對象了解甚深,然而學習這個庫時卻是一頭霧水,最後在經過泡論壇,然後又認真的學習了面向對象設計模式,後來不但能使用那個庫,更重要的是對面向對象編程有了更深的認識!

後來還有很多類似的事情,剛開始時感覺無比困難,但是通過自己的努力,或求助他人、或查閱資料,當最終問題解決時,你會發現自己又牛逼了一些,然後再遇到一些新的問題,如此循環……

其實編程也是一個學習的過程,就如同爬山一樣,每一階段都會有一些山頭,只有當你爬上山頭才能欣賞美麗的風景,但是當你爬上一座山頭的時候,就會發現更高山峰!只有當你爬上最高峰,才能「一覽眾山小」,可是到那時,你可能會嚮往地球之外的天地!

很難解決一般就是遇到某些瓶頸了,不同瓶頸的感覺是不一樣的,但無非可以歸結為下面幾類。

成本原因
不讓馬兒吃草,還想讓馬跑。這個是有些不太理解互聯網的一些領導的錯誤觀念,他們會給你安排一個老舊台式機,想要讓你承載幾萬、幾十萬並發的秒殺系統,你當然很難解決。
外界的評論可能是,「這幫程序員是吃干飯的么?這系統也太垃圾了!」
老闆的評論是,「我這台式機也不少錢呢。」
程序員的評論是,「這摳門老闆不會是個傻子吧。哎,再優化優化吧。」

當然,有些情況也是能夠理解的,公司明白需要更好的設備,但是由於成本控制,不得不在某些方面節省。但換句話說,設備成本是占不了一個大頭的,可能有其他方面的成本更加需要收緊。

如果是因為成本原因,我們的心情可能是無奈,又有些不能施展拳腳的束縛感。


歷史 原因
舉個例子,系統用了5年了,迭代了N個版本,在面對新的需求的時候,就會出現需求限制於系統的情況,常常會有程序員說,這個實現不了,那個不符合現在系統規則。其中很大一部分是這些年的積累,欠下的技術債造成的。俗話說,大船難調頭。

這種情況更多的出現在剛創業之後的幾年,由於一開始的快速迭代,追求先把業務流程跑通,先生存再規范,會讓一開始的軟體開發流程並不那麼規范,如果在1-2年內沒有進行重構,那麼積攢的3-5年的技術債就會慢慢把你壓得喘不過氣來。

解決這種情況,一是需要時機,給出足夠的空間和時間讓技術團隊重構,二是需要魄力,你得有成功的把握,不能幹著干著說不行了,咱們還是回到原來吧。

如果是因為 歷史 原因,我們的心情可能是期待和渴望,又有些對現狀的無奈。


能力原因
雖然說專家很厲害,但說白了,大部分企業需要的研發人員,還到不了需要專家的級別。所以,一般而言,沒有什麼技術是攻克不了的。如果真的遇上了,那就說明你的公司已經到達了一個新的層次,從而需要那個層次的人員來解決,可以通過外聘或者顧問的方式,引進新的技術。

如果是因為能力原因,我們的心情雖然有些力不從心,但又為公司在新的台階而高興。

不管怎樣,程序員是一群追求美好的人,不管是外部限制還是內部限制,不能解決的難題對於技術人員來說總是很憋屈的。

不能著急,慢慢分析,找到問題點,沒有解決不了的問題

程序員的技術問題,排除架構師技術選型錯誤以外,都是程序員的功夫不到家所致。

1,面向網路的程序員會第一時間問度娘,各大社區求助大神。

2,面向源碼的程序員會第一時間查看源碼實現,查找api文檔,思考解決方案。

3,不管技術如何發展,架構如何延伸,不變的是基本功,再先進的組件都是由基礎語法書寫出來的 。

練武不練功,到老一場空,共勉!

首先說下這個很難的技術定義,個人認為在你知道之外的知識都是很難的,一旦你深入了解其使用方式,原理,甚至閱讀了他的源碼,你會覺得有的時候會恍然大悟。程序員是一個不斷要學習的崗位,就要面臨很多從未知到已知技術的時候,每當遇到這樣的情況時候,總有種不解決了這個問題,睡不著覺的感覺,心裡不踏實,總是想盡各種辦法去解決這個問題。甚至可以一直追查這個問題。也許這就是一種執拗吧

我老公最近就遇到一個大石頭需要敲碎,我作為一個旁觀者,都挺心疼他。

他還在讀博,最近遇到的問題是他一個項目上的問題,也跟他的畢業設計相關。他剛讀博的時候確定了一個方向,去年開題的時候他覺得這個方向沒有什麼前景,真的是考慮了好久要不要換,如果不換,就是安穩的畢業,換的話接下來的一年多時間他會很艱難,很多新的問題需要一一克服,最後他決定換了,他說他讀博就是為了提高自己,還是想挑戰一下。

年前,系統板設計好了,然後最近做好回來了,開始調試,說這個板子跟個石頭一樣,不工作。本來就是禮拜一到禮拜六待在學校不回來,周日是休息的。現在放假回來都是在啃變壓器的東西,早上起的很早,晚上又很晚。真的挺心疼的,他還安慰我說,他又要進步了。挺擔心他的身體的,我特別希望時間能快點過去,能順利畢業。他卻不希望,總覺得時間過的太快,沒有時間搞研究。

今年的生日願望,希望他科研順利,身體 健康 。

以我的從業經歷,說說遇到很難的技術問題是什麼感覺吧: 興奮、充滿挑戰性 。尤其是在開發中遇到了技術難題,很多情況下真有種可遇不可求的感覺。

我認為能遇到技術難題,至少證明這個工作是有價值的。 這種價值體現了兩個方面,一是你的工作在整個產品開發中占據重要地位,甚至是核心地位。二是你的認知和經驗,仍然有成長的空間。如果你的工作一直沒有遇到難題,輕而易舉地就解決了一切,那麼很可能是你沒有機會深入重要的核心部分,或者你的工作性質可替代性很高,簡單重復性很高。

分解法。 把技術難題拆分,盡量的單元化、模塊化,這樣有利於逐步攻破,逐步解決。主要是降低技術難度,尋找真正的難點所在。如果問題無法拆分,就是那麼一個點,那麼需要逆向思維,可以先把問題擴大,看看涉及面有哪些,然後再縮小范圍,鎖定關鍵之處。

刨根法。 把技術難題抽象化,理論化,從根本的源頭去解決。很多技術問題,從基礎理論的角度去看,其實真的不難,只要你能定位到相關的技術點,困難點,知識點,就很容易進行快速解決。解決的終極辦法就是從理論上徹底解決,做到知行統一。

討論法。 三人行,必有我師。很多情況下,所謂的技術難題,在別人的眼中,也許並不是難題。很多情況下,小組討論,交換意見,方案互補,就可以解決難題。有些情況下,還需要和供應商一起討論,主要是補充信息的錯漏。經常出現的晶元問題,很多情況下供應商都更加有經驗。因為供應商有更多的使用客戶,有很多解決問題的經驗。最主要的是,晶元是他們設計的,他們更加清楚緣由。

沒有絕對的技術難題,有的只是尚未解決的技術難題。

5. 如何讓客戶端程序 自動更新 版本

用C#實現軟體自動更新思路

前言

長期以來,廣大程序員為到底是使用Client/Server,還是使用Browser/Server結構爭論不休,在這些爭論當中,C/S結構的程序可維護性差,布置困難,升級不方便,維護成本高就是一個相當重要的因素。有很多企業用戶就是因為這個原因而放棄使用C/S。然而當一個應用必須要使用C/S結構才能很好的實現其功能的時候,我們該如何解決客戶端的部署與自動升級問題?部署很簡單,只要點擊安裝程序即可,難的在於每當有新版本發布時,能夠實現自動升級[3]。現在好了,我們的目標很簡單,我們希望開發一個與具體應用無關的能夠復用的自動升級系統。下面我為大家提供了一套可復用的用C#編寫的自動升級系統。

2 實現軟體的自動升級存在的困難

第一,為了查找遠程伺服器上的更新,應用程序必須有查詢網路的途徑,這需要網路編程、簡單的應用程序與伺服器通訊的協議。

第二是下載。下載看起來不需要考慮聯網的問題,但要考慮下載用戶請求的文件,以及在沒有用戶同意時下載大文件。友好的自動更新應用程序將使用剩餘的帶寬下載更新。這聽起來簡單,但卻是一個技術難題,幸運的是已經有了解決方法。

第三個考慮因素是使用新版應用程序更換原應用程序的過程。這個問題比較有趣,因為它要求代碼運行時將自己從系統刪除,有多種辦法可以實現該功能[5],本文程序主要通過比較新舊版本的日期號來實現替換新版本應用程序的功能。

3 實現軟體自動在線升級的原理

寫兩個程序,一個是主程序;一個是升級程序;所有升級任務都由升級程序完成。

1.啟動升級程序,升級程序連接到網站,下載新的主程序(當然還包括支持的庫文件、XML配置文檔等)到臨時文件夾;

2.升級程序獲取伺服器端XML配置文件中新版本程序的更新日期或版本號或文件大小;

3.升級程序獲取原有客戶端應用程序的最近一次更新日期或版本號或文件大小,兩者進行比較;如果發現升級程序的日期大於原有程序的最新日期,則提示用戶是否升級;或者是採用將現有版本與最新版本作比較,發現最新的則提示用戶是否升級;也有人用其它屬性如文件大小進行比較,發現升級程序的文件大小大於舊版本的程序的大小則提示用戶升級。本文主要採用比較新舊版本更新日期號來提示用戶升級。

4.如果用戶選擇升級,則獲取下載文件列表,開始進行批量下載文檔;

5.升級程序檢測舊的主程序是否活動,若活動則關閉舊的主程序;

6.刪除舊的主程序,拷貝臨時文件夾中的文件到相應的位置;

7.檢查主程序的狀態,若狀態為活動的,則啟動新的主程序;

8.關閉升級程序,升級完成[4]。

4 用C#實現在線升級的關鍵步驟
這里我主要使用日期信息來檢測是否需要下載升級版本。
4.1 准備一個XML配置文件
名稱為AutoUpdater.xml,作用是作為一個升級用的模板,顯示需要升級的信息。

名稱為AutoUpdater.xml,作用是作為一個升級用的模板,顯示需要升級的信息。

<?xml version="1.0"?> //xml版本號
<AutoUpdater>
<URLAddres URL="http://192.168.198.113/vbroker/log/"/>//升級文件所在伺服器端的網址
<UpdateInfo>
<UpdateTime Date = "2005-02-02"/> //升級文件的更新日期
<Version Num = "1.0.0.1"/> //升級文件的版本號
</UpdateInfo>
<UpdateFileList> //升級文件列表
<UpdateFile FileName = "aa.txt"/> //共有三個文件需升級
<UpdateFile FileName = "VB40.rar"/>
<UpdateFile FileName = "VB4-1.CAB"/>
</UpdateFileList>
<RestartApp>
<ReStart Allow = "Yes"/> //允許重新啟動應用程序
<AppName Name = "TIMS.exe"/> //啟動的應用程序名
</RestartApp>
</AutoUpdater>

//xml版本號

//升級文件所在伺服器端的網址

//升級文件的更新日期
//升級文件的版本號

//升級文件列表
//共有三個文件需升級

//允許重新啟動應用程序
//啟動的應用程序名

從以上XML文檔中可以得知升級文檔所在伺服器端的地址、升級文檔的更新日期、需要升級的文件列表,其中共有三個文件需升級:aa.txt、VB40.rar、VB4-1.CAB。以及是否允許重新啟動應用程序和重新啟動的應用程序名。

4.2 獲取客戶端應用程序及伺服器端升級程序的最近一次更新日期
通過GetTheLastUpdateTime()函數來實現。

private string GetTheLastUpdateTime(string Dir)
{
string LastUpdateTime = "";
string AutoUpdaterFileName = Dir + @"\AutoUpdater.xml";
if(!File.Exists(AutoUpdaterFileName))
return LastUpdateTime;
//打開xml文件
FileStream myFile = new FileStream(AutoUpdaterFileName,FileMode.Open);
//xml文件閱讀器
XmlTextReader xml = new XmlTextReader(myFile);
while(xml.Read())
{
if(xml.Name == "UpdateTime")
{
//獲取升級文檔的最後一次更新日期
LastUpdateTime = xml.GetAttribute("Date");
break;
}
}
xml.Close();
myFile.Close();
return LastUpdateTime;
}

通過XmlTextReader打開XML文檔,讀取更新時間從而獲取Date對應的值,即伺服器端升級文件的最近一次更新時間。

函數調用實現:
//獲取客戶端指定路徑下的應用程序最近一次更新時間
string thePreUpdateDate = GetTheLastUpdateTime(Application.StartupPath);
Application.StartupPath指客戶端應用程序所在的路徑。

//獲得從伺服器端已下載文檔的最近一次更新日期
string theLastsUpdateDate = GetTheLastUpdateTime(theFolder.FullName);
theFolder.FullName指在升級文檔下載到客戶機上的臨時文件夾所在的路徑。

4.3 比較日期
客戶端應用程序最近一次更新日期與伺服器端升級程序的最近一次更新日期進行比較。

//獲得已下載文檔的最近一次更新日期
string theLastsUpdateDate = GetTheLastUpdateTime(theFolder.FullName);
if(thePreUpdateDate != "")
{
//如果客戶端將升級的應用程序的更新日期大於伺服器端升級的應用程序的更新日期
if(Convert.ToDateTime(thePreUpdateDate)>=Convert.ToDateTime(theLastsUpdateDate))
{
MessageBox.Show("當前軟體已經是最新的,無需更新!","系統提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
this.Close();
}
}
this.labDownFile.Text = "下載更新文件";
this.labFileName.Refresh();
this.btnCancel.Enabled = true;
this.progressBar.Position = 0;
this.progressBarTotal.Position = 0;
this.progressBarTotal.Refresh();
this.progressBar.Refresh();

//通過動態數組獲取下載文件的列表
ArrayList List = GetDownFileList(GetTheUpdateURL(),theFolder.FullName);
string[] urls = new string[List.Count];
List.CopyTo(urls, 0);

將客戶端升級的應用程序的日期與伺服器端下載的應用程序日期進行比較,如果前者大於後者,則不更新;如果前者小於後者,則通過動態數組獲取下載文件的列表,開始下載文件。

4.2 獲取客戶端應用程序及伺服器端升級程序的最近一次更新日期
通過GetTheLastUpdateTime()函數來實現。

private string GetTheLastUpdateTime(string Dir)
{
string LastUpdateTime = "";
string AutoUpdaterFileName = Dir + @"\AutoUpdater.xml";
if(!File.Exists(AutoUpdaterFileName))
return LastUpdateTime;
//打開xml文件
FileStream myFile = new FileStream(AutoUpdaterFileName,FileMode.Open);
//xml文件閱讀器
XmlTextReader xml = new XmlTextReader(myFile);
while(xml.Read())
{
if(xml.Name == "UpdateTime")
{
//獲取升級文檔的最後一次更新日期
LastUpdateTime = xml.GetAttribute("Date");
break;
}
}
xml.Close();
myFile.Close();
return LastUpdateTime;
}

通過XmlTextReader打開XML文檔,讀取更新時間從而獲取Date對應的值,即伺服器端升級文件的最近一次更新時間。

函數調用實現:
//獲取客戶端指定路徑下的應用程序最近一次更新時間
string thePreUpdateDate = GetTheLastUpdateTime(Application.StartupPath);
Application.StartupPath指客戶端應用程序所在的路徑。

//獲得從伺服器端已下載文檔的最近一次更新日期
string theLastsUpdateDate = GetTheLastUpdateTime(theFolder.FullName);
theFolder.FullName指在升級文檔下載到客戶機上的臨時文件夾所在的路徑。

4.3 比較日期
客戶端應用程序最近一次更新日期與伺服器端升級程序的最近一次更新日期進行比較。

//獲得已下載文檔的最近一次更新日期
string theLastsUpdateDate = GetTheLastUpdateTime(theFolder.FullName);
if(thePreUpdateDate != "")
{
//如果客戶端將升級的應用程序的更新日期大於伺服器端升級的應用程序的更新日期
if(Convert.ToDateTime(thePreUpdateDate)>=Convert.ToDateTime(theLastsUpdateDate))
{
MessageBox.Show("當前軟體已經是最新的,無需更新!","系統提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
this.Close();
}
}
this.labDownFile.Text = "下載更新文件";
this.labFileName.Refresh();
this.btnCancel.Enabled = true;
this.progressBar.Position = 0;
this.progressBarTotal.Position = 0;
this.progressBarTotal.Refresh();
this.progressBar.Refresh();

//通過動態數組獲取下載文件的列表
ArrayList List = GetDownFileList(GetTheUpdateURL(),theFolder.FullName);
string[] urls = new string[List.Count];
List.CopyTo(urls, 0);

將客戶端升級的應用程序的日期與伺服器端下載的應用程序日期進行比較,如果前者大於後者,則不更新;如果前者小於後者,則通過動態數組獲取下載文件的列表,開始下載文件。

通過BatchDownload()函數來實現。升級程序檢測舊的主程序是否活動,若活動則關閉舊的主程序;刪除舊的主程序,拷貝臨時文件夾中的文件到相應的位置;檢查主程序的狀態,若狀態為活動的,則啟動新的主程序。

private void BatchDownload(object data)
{
this.Invoke(this.activeStateChanger, new object[]{true, false});
try
{
DownloadInstructions instructions = (DownloadInstructions) data;
//批量下載
using(BatchDownloader bDL = new BatchDownloader())
{
bDL.CurrentProgressChanged += new DownloadProgressHandler(this.SingleProgressChanged);
bDL.StateChanged += new DownloadProgressHandler(this.StateChanged);
bDL.FileChanged += new DownloadProgressHandler(bDL_FileChanged);
bDL.TotalProgressChanged += new DownloadProgressHandler(bDL_TotalProgressChanged);
bDL.Download(instructions.URLs, instructions.Destination, (ManualResetEvent) this.cancelEvent);
}
}
catch(Exception ex)
{
ShowErrorMessage(ex);
}
this.Invoke(this.activeStateChanger, new object[]{false, false});
this.labFileName.Text = "";
//更新程序
if(this._Update)
{
//關閉原有的應用程序
this.labDownFile.Text = "正在關閉程序....";
System.Diagnostics.Process[]proc=System.Diagnostics.Process.GetProcessesByName("TIMS");
//關閉原有應用程序的所有進程
foreach(System.Diagnostics.Process pro in proc)
{
pro.Kill();
}
DirectoryInfo theFolder=new DirectoryInfo(Path.GetTempPath()+」JurassicUpdate");
if(theFolder.Exists)
{
foreach(FileInfo theFile in theFolder.GetFiles())
{
//如果臨時文件夾下存在與應用程序所在目錄下的文件同名的文件,則刪除應用程序目錄下的文件
if(File.Exists(Application.StartupPath + \\"+Path.GetFileName(theFile.FullName)))
File.Delete(Application.StartupPath + "\\"+Path.GetFileName(theFile.FullName));
//將臨時文件夾的文件移到應用程序所在的目錄下
File.Move(theFile.FullName,Application.StartupPath + \\"+Path.GetFileName(theFile.FullName));
}
}
//啟動安裝程序
this.labDownFile.Text = "正在啟動程序....";
System.Diagnostics.Process.Start(Application.StartupPath + "\\" + "TIMS.exe");
this.Close();
}
}

6. 應用程序編程介面API究竟是什麼呢,我就是不理解

api的介面模式包括用戶介面和程序介面兩種介面類型。

用戶介面:操作系統專門為用戶提供了「用戶與操作系統的逗含介面」 ,通常稱為用戶介面。該介面支持用戶與 OS 之間進行交互,即由用戶向 OS 請求提供特定的服務,而系統則把服務的結果返回給用戶。

程序介面:操作系統向編程人員提供了「程序與操作系統的介面」 ,簡稱程序介面,又稱應用程序介面 API。 該介面是為程序員在編程時使用的,系統和應用程序通過這個介面,可在執行中訪問系統如指基中的資源和取得 OS 的服務。

它也是程序能取得操作系統服務的唯一途徑。大多數操作系統的程序介面是由一組系統調用(system call)組成,每一個系統調用都是一個能完成特渣謹定功能的子程序。

API(Application Programming Interface,應用程序介面)是一些預先定義的介面(如函數、HTTP介面),或指軟體系統不同組成部分銜接的約定。

用來提供應用程序與開發人員基於某軟體或硬體得以訪問的一組常式,而又無需訪問源碼,或理解內部工作機制的細節。

基於互聯網的應用正變得越來越普及,在這個過程中,有更多的站點將自身的資源開放給開發者來調用。

對外提供的API 調用使得站點之間的內容關聯性更強,同時這些開放的平台也為用戶、開發者和中小網站帶來了更大的價值。

閱讀全文

與api程序員遇到更新相關的資料

熱點內容
壓縮機90兆帕 瀏覽:928
程序員調侃語句 瀏覽:579
不是php函數的是 瀏覽:998
壓縮文件好處 瀏覽:785
3d266期神童三膽計演算法 瀏覽:189
通過愛思助手怎麼下載app 瀏覽:323
vi命令將文件創在桌面上 瀏覽:923
程序員做競價 瀏覽:696
江蘇中小學編程納入課程 瀏覽:730
單純形法包括動態規劃演算法 瀏覽:951
cpdf百度網盤 瀏覽:671
綜合布線工程中配線架的演算法 瀏覽:925
單片機碩士論文 瀏覽:329
股票預測演算法現狀 瀏覽:430
程序員三高 瀏覽:181
pythonfiddle 瀏覽:216
韓信分油總共有幾種演算法 瀏覽:941
程序員思維方案 瀏覽:970
編譯環境要裝c盤嗎 瀏覽:650
單片機生成pwm 瀏覽:206