1. 程序員競爭力太大了,怎麼樣才能提升自己呢
1、程序員要學會主動學習,要不斷地更新自己的技能,提高自己的「基線」。
2、程序員程序員要學會自我營銷,在業界打造自己的個人品牌,要有品牌意識。
3、程序員要善於對付中斷。如果你在跟別人結對編程,或者你用了TDD,那麼保存上下文信息就變得非常簡單。
4、程序員要重視單元測試。要知道單元測試的重要性,把測試代碼和產品代碼看的一樣重要。
2. 程序員怎麼提高自己的開發水平 知乎
自己研究啊,找點小項目來搞搞,搞著搞著你就對技術知道的多了,自己的技術水平自然也就上去了。
比如,自己寫個WebServer,寫完以後你就知道,從單線程響應http請求,到多線程響應;從只支持html,到支持圖片、音頻啥的,慢慢的,你就能體會server的基本原理;
再比如,自己寫個網路爬蟲,爬點天氣預報數據、新聞啥的,從單線程爬,到多線程爬,從每隔一段時間爬,到每天定時定點爬,從爬不需要登錄的,到爬需要登錄認證的,完事後,啥是多線程、線程池、怎麼模擬登錄,你還能不明白?
爬到天氣預報,那你還不寫個小android/ios/html5程序,把天氣呈現出來,從只呈現一個城市的,到呈現可以選城市的,從沒有動畫的,到有動畫的...什麼sqlite、自定義控制項、handler、ajax、webservice你還會不熟?
我就這么乾的,我不是程序猿,這只是我的愛好,但學習讓我挺快樂。
3. 怎麼做一個優秀的java程序員
主要是勤奮刻苦、開拓思想、堅持不懈、不斷學習的精神。
1、先說素質:欲做事,先做人。做技術類的童鞋往往忽視做人,覺得學好習,搞好技術,就一定能獲得好的發展。其實未必,大部分程序員不是天才,也不是神通。要想讓別人教你知識,與你分享技術,與你共事,素質是最關鍵的。高素質又高技能的人才才能獲得別人的敬仰與尊敬,也能獲得領導的賞識與提拔,更能獲得更高的回報和機會。
2、再說代碼:優秀的程序員必需能寫優秀的代碼,程序員就好比計算機界的作家,你寫的程序就如一篇篇優美的文章,計算機才能很好的閱讀並執行,別的程序員也能看懂你的代碼。最優勢的程序員寫的代碼就如詩歌一樣,引人入勝。
3、編程思想:java是面向對象編程,很多Java程序員,尤其是一些走培訓班的,不認真思考原理和思想,囫圇吞棗。結果學了技術,不懂思想,沒有掌握Java的精髓。
4、基礎扎實:有些Java工程師都做了好幾年了,結果一些最基本的知識還沒記牢,再編程的時候總用工具的提示,沒有工具就寫不出正確的代碼,這樣的人怎麼會成為高手呢,更不會被別人認為高手,就好比一個大作家連很多字都寫錯一樣。
5、編程速度:優秀的程序員編程必不慢,這除了基礎扎實、經驗豐富外,更需要清晰的編程思路和節奏,在寫程序前,一定做好規劃和設計,預想到各種情況,尋找最快速的演算法。
6、注重效率:一個功能,張三用了100000行代碼,而你只用了300行代碼,那你做的既簡單又高效,運行速度還快,還省內存和資源,那你就是牛人,那個人就是低手。
7、學習能力:優秀的程序員永遠不停的學習,其學習能力是最強的。他隨時隨地掌握最先進的技術,這都離不開快速的學習能力。
8、博學:掌握J2EE 、J2SE等,同時精通SQL語言及資料庫技術, 會使用MYSQL、SQLSERVER等資料庫,掌握WebLogic、Jboss、Spring、Struts、Hibernate等流行技術,掌握JS,掌握linux、軟體架構設計思想、搜索引擎優化、緩存系統設計、網站負載均衡、系統性能調優等實用技術。
參考:http://www.java800.com/peixun-9032125.html
4. 剛踏入職場的程序員,如何快速踏實地提升自己的能力
程序員提升主要靠實踐,跟一個完整的項目能最大限度的提升項目能力,以後找工作不用愁啊,現實工作中很難達成,你可以去找找培養這方面人才的,提升一下自己,你看看願碼ChainDesk,有你需要的
5. mysql 伺服器CPU佔用過高,如何調優,求助
通過以前對mysql的操作經驗,先將mysql的配置問題排除了,查看msyql是否運行正常,通過查看mysql data目錄裡面的*.err文件(將擴展名改為.txt)記事本查看即可。如果過大不建議用記事本了,容易死掉,可以用editplus等工具。
簡單的分為下面幾個步驟來解決這個問題:
1、mysql運行正常,也有可能是同步設置問題導致
2、如果mysql運行正常,那就是php的一些sql語句導致問題發現,用root用戶進入mysql管理
mysql -u root -p
輸入密碼
mysql:show processlist 語句,查找負荷最重的 SQL 語句,優化該SQL,比如適當建立某欄位的索引。
通過這個命令我看到原來是有人惡意刷搜索,因為dedecms搜索後面調用搜索最高的詞,導致很多人用工具刷這個,而且是定時有間隔的,所以將這個php程序改名跳轉都方法解決了。
當然如果你的確實是sql語句用了大量的group by等語句,union聯合查詢等肯定會將mysql的佔用率提高。所以就需要優化sql語句,網站盡量生成靜態的,一般4W ip的靜態網站,mysql佔用率幾乎為0的。所以這對於程序員的經驗是個考慮。盡量提高mysql性能 (MySQL 性能優化的最佳20多條經驗分享)
下面是豆芽收集的文章,大家都可以參考下
MYSQL CPU 佔用 100% 的現象描述
早上幫朋友一台伺服器解決了 Mysql cpu 佔用 100% 的問題。稍整理了一下,將經驗記錄在這篇文章里
朋友主機(Windows 2003 + IIS + PHP + MYSQL )近來 MySQL 服務進程 (mysqld-nt.exe) CPU 佔用率總為 100% 高居不下。此主機有10個左右的 database, 分別給十個網站調用。據朋友測試,導致 mysqld-nt.exe cpu 佔用奇高的是網站A,一旦在 IIS 中將此網站停止服務,CPU 佔用就降下來了。一啟用,則馬上上升。
MYSQL CPU 佔用 100% 的解決過程
今天早上仔細檢查了一下。目前此網站的七日平均日 IP 為2000,PageView 為 3萬左右。網站A 用的 database 目前有39個表,記錄數 60.1萬條,占空間 45MB。按這個數據,MySQL 不可能佔用這么高的資源。
於是在伺服器上運行命令,將 mysql 當前的環境變數輸出到文件 output.txt:
d:\web\mysql> mysqld.exe --help >output.txt
發現 tmp_table_size 的值是默認的 32M,於是修改 My.ini, 將 tmp_table_size 賦值到 200M:
d:\web\mysql> notepad c:\windows\my.ini
[mysqld]
tmp_table_size=200M
然後重啟 MySQL 服務。CPU 佔用有輕微下降,以前的CPU 佔用波形圖是 100% 一根直線,現在則在 97%~100%之間起伏。這表明調整 tmp_table_size 參數對 MYSQL 性能提升有改善作用。但問題還沒有完全解決。
於是進入 mysql 的 shell 命令行,調用 show processlist, 查看當前 mysql 使用頻繁的 sql 語句:
mysql> show processlist;
反復調用此命令,發現網站 A 的兩個 SQL 語句經常在 process list 中出現,其語法如下:
SELECT t1.pid, t2.userid, t3.count, t1.date
FROM _mydata AS t1
LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
LEFT JOIN _mydata_body AS t2 ON t1.pid=t3.pid
ORDER BY t1.pid
LIMIT 0,15
調用 show columns 檢查這三個表的結構 :
mysql> show columns from _myuser;
mysql> show columns from _mydata;
mysql> show columns from _mydata_body;
終於發現了問題所在:_mydata 表,只根據 pid 建立了一個 primary key,但並沒有為 userid 建立索引。而在這個 SQL 語句的第一個 LEFT JOIN ON 子句中:
LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
_mydata 的 userid 被參與了條件比較運算。於是我為給 _mydata 表根據欄位 userid 建立了一個索引:
mysql> ALTER TABLE `_mydata` ADD INDEX ( `userid` )
建立此索引之後,CPU 馬上降到了 80% 左右。看到找到了問題所在,於是檢查另一個反復出現在 show processlist 中的 sql 語句:
SELECT COUNT(*)
FROM _mydata AS t1, _mydata_key AS t2
WHERE t1.pid=t2.pid and t2.keywords = '孔雀'
經檢查 _mydata_key 表的結構,發現它只為 pid 建了了 primary key, 沒有為 keywords 建立 index。_mydata_key 目前有 33 萬條記錄,在沒有索引的情況下對33萬條記錄進行文本檢索匹配,不耗費大量的 cpu 時間才怪。看來就是針對這個表的檢索出問題了。於是同樣為 _mydata_key 表根據欄位 keywords 加上索引:
mysql> ALTER TABLE `_mydata_key` ADD INDEX ( `keywords` )
建立此索引之後,CPU立刻降了下來,在 50%~70%之間震盪。
再次調用 show prosslist,網站A 的sql 調用就很少出現在結果列表中了。但發現此主機運行了幾個 Discuz 的論壇程序, Discuz 論壇的好幾個表也存在著這個問題。於是順手一並解決,cpu佔用再次降下來了。(2007.07.09 附註:關於 discuz 論壇的具體優化過程,我後來另寫了一篇文章,詳見:千萬級記錄的 Discuz! 論壇導致 MySQL CPU 100% 的 優化筆記 )
解決 MYSQL CPU 佔用 100% 的經驗總結
增加 tmp_table_size 值。mysql 的配置文件中,tmp_table_size 的默認大小是 32M。如果一張臨時表超出該大小,MySQL產生一個 The table tbl_name is full 形式的錯誤,如果你做很多高級 GROUP BY 查詢,增加 tmp_table_size 值。
對 WHERE, JOIN, MAX(), MIN(), ORDER BY 等子句中的條件判斷中用到的欄位,應該根據其建立索引 INDEX。索引被用來快速找出在一個列上用一特定值的行。沒有索引,MySQL不得不首先以第一條記錄開始並然後讀完整個表直到它找出相關的行。表越大,花費時間越多。如果表對於查詢的列有一個索引,MySQL能快速到達一個位置去搜尋到數據文件的中間,沒有必要考慮所有數據。如果一個表有1000行,這比順序讀取至少快100倍。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B樹中存儲。
根據 mysql 的開發文檔:
索引 index 用於:
快速找出匹配一個WHERE子句的行
當執行聯結(JOIN)時,從其他表檢索行。
對特定的索引列找出MAX()或MIN()值
如果排序或分組在一個可用鍵的最左面前綴上進行(例如,ORDER BY key_part_1,key_part_2),排序或分組一個表。如果所有鍵值部分跟隨DESC,鍵以倒序被讀取。
在一些情況中,一個查詢能被優化來檢索值,不用咨詢數據文件。如果對某些表的所有使用的列是數字型的並且構成某些鍵的最左面前綴,為了更快,值可以從索引樹被檢索出來。
假定你發出下列SELECT語句:
mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
如果一個多列索引存在於col1和col2上,適當的行可以直接被取出。如果分開的單行列索引存在於col1和col2上,優化器試圖通過決定哪個索引將找到更少的行並來找出更具限制性的索引並且使用該索引取行。
6. 要成為一名專業的程序員,從零開始需要怎麼一步步來比較好,要把最底層的先學精通嗎(個人認為)求學長
前言
你是否覺得自己從學校畢業的時候只做過小玩具一樣的程序?走入職場後哪怕沒有什麼經驗也可以把以下這些課外練習走一遍(朋友的抱怨:學校課程總是從理論出發,作業項目都看不出有什麼實際作用,不如從工作中的需求出發)
建議:
不要亂買書,不要亂追新技術新名詞,基礎的東西經過很長時間積累而且還會在未來至少10年通用。
回顧一下歷史,看看歷史上時間線上技術的發展,你才能明白明天會是什麼樣。
一定要動手,例子不管多麼簡單,建議至少自己手敲一遍看看是否理解了里頭的細枝末節。
一定要學會思考,思考為什麼要這樣,而不是那樣。還要舉一反三地思考。
註:你也許會很奇怪為什麼下面的東西很偏Unix/Linux,這是因為我覺得Windows下的編程可能會在未來很沒有前途,原因如下:
現在的用戶界面幾乎被兩個東西主宰了,1)Web,2)移動設備iOS或Android。Windows的圖形界面不吃香了。
越來越多的企業在用成本低性能高的Linux和各種開源技術來構架其系統,Windows的成本太高了。
微軟的東西變得太快了,很不持久,他們完全是在玩弄程序員。詳情參見《Windows編程革命史》
所以,我個人認為以後的趨勢是前端是Web+移動,後端是Linux+開源。開發這邊基本上沒Windows什麼事。
啟蒙入門
1、 學習一門腳本語言,例如python/Ruby
可以讓你擺脫對底層語言的恐懼感,腳本語言可以讓你很快開發出能用得上的小程序。實踐項目:
處理文本文件,或者csv (關鍵詞 python csv, python open, python sys) 讀一個本地文件,逐行處理(例如 word count,或者處理log)
遍歷本地文件系統 (sys, os, path),例如寫一個程序統計一個目錄下所有文件大小並按各種條件排序並保存結果
跟資料庫打交道 (python sqlite),寫一個小腳本統計資料庫里條目數量
學會用各種print之類簡單粗暴的方式進行調試
學會用Google (phrase, domain, use reader to follow tech blogs)
為什麼要學腳本語言,因為他們實在是太方便了,很多時候我們需要寫點小工具或是腳本來幫我們解決問題,你就會發現正規的編程語言太難用了。
2、 用熟一種程序員的編輯器(不是IDE) 和一些基本工具
Vim / Emacs / Notepad++,學會如何配置代碼補全,外觀,外部命令等。
Source Insight (或 ctag)
使用這些東西不是為了Cool,而是這些編輯器在查看、修改代碼/配置文章/日誌會更快更有效率。
3、 熟悉Unix/Linux Shell和常見的命令行
如果你用windows,至少學會用虛擬機里的linux, vmware player是免費的,裝個Ubuntu吧
一定要少用少用圖形界面。
學會使用man來查看幫助
文件系統結構和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …
學會使用一些文本操作命令 sed/awk/grep/tail/less/more …
學會使用一些管理命令 ps/top/lsof/netstat/kill/tcpmp/iptables/dd…
了解/etc目錄下的各種配置文章,學會查看/var/log下的系統日誌,以及/proc下的系統運行信息
了解正則表達式,使用正則表達式來查找文件。
對於程序員來說Unix/Linux比Windows簡單多了。(參看我四年前CSDN的博文《其實Unix很簡單》)學會使用Unix/Linux你會發現圖形界面在某些時候實在是太難用了,相當地相當地降低工作效率。
4、 學習Web基礎(HTML/CSS/JS) + 伺服器端技術 (LAMP)
未來必然是Web的世界,學習WEB基礎的最佳網站是W3School。
學習HTML基本語法
學習CSS如何選中HTML元素並應用一些基本樣式(關鍵詞:box model)
學會用 Firefox + Firebug 或 chrome 查看你覺得很炫的網頁結構,並動態修改。
學習使用Javascript操縱HTML元件。理解DOM和動態網頁(Dynamic HTML: The Definitive Reference, 3rd Edition - O'Reilly Media) 網上有免費的章節,足夠用了。或參看 DOM 。
學會用 Firefox + Firebug 或 chrome 調試Javascript代碼(設置斷點,查看變數,性能,控制台等)
在一台機器上配置Apache 或 Nginx
學習PHP,讓後台PHP和前台HTML進行數據交互,對伺服器相應瀏覽器請求形成初步認識。實現一個表單提交和反顯的功能。
把PHP連接本地或者遠程資料庫 MySQL(MySQL 和 SQL現學現用夠了)
跟完一個名校的網路編程課程(例如:http://www.stanford.e/~ouster/cgi-bin/cs142-fall10/index.php ) 不要覺得需要多於一學期時間,大學生是全職一學期選3-5門課,你業余時間一定可以跟上
學習一個javascript庫(例如jQuery 或 ExtJS)+ Ajax (非同步讀入一個伺服器端圖片或者資料庫內容)+JSON數據格式。
HTTP: The Definitive Guide 讀完前4章你就明白你每天上網用瀏覽器的時候發生的事情了(proxy, gateway, browsers)
做個小網站(例如:一個小的留言板,支持用戶登錄,Cookie/Session,增、刪、改、查,上傳圖片附件,分頁顯示)
買個域名,租個空間,做個自己的網站。
進階加深
1、 C語言和操作系統調用
重新學C語言,理解指針和內存模型,用C語言實現一下各種經典的演算法和數據結構。推薦《計算機程序設計藝術》、《演算法導論》和《編程珠璣》。
學習(麻省理工免費課程)計算機科學和編程導論
學習(麻省理工免費課程)C語言內存管理
學習Unix/Linux系統調用(Unix高級環境編程),,了解系統層面的東西。
用這些系統知識操作一下文件系統,用戶(實現一個可以拷貝目錄樹的小程序)
用fork/wait/waitpid寫一個多進程的程序,用pthread寫一個多線程帶同步或互斥的程序。多進程多進程購票的程序。
用signal/kill/raise/alarm/pause/sigprocmask實現一個多進程間的信號量通信的程序。
學會使用gcc和gdb來編程和調試程序(參看我的《用gdb調試程序》)
學會使用makefile來編譯程序。(參看我的《跟我一起寫makefile》)
IPC和Socket的東西可以放到高級中來實踐。
學習Windows SDK編程(Windows 程序設計 ,MFC程序設計)
寫一個窗口,了解WinMain/WinProcere,以及Windows的消息機制。
寫一些程序來操作Windows SDK中的資源文件或是各種圖形控制項,以及作圖的編程。
學習如何使用MSDN查看相關的SDK函數,各種WM_消息以及一些常式。
這本書中有很多常式,在實踐中請不要照抄,試著自己寫一個自己的常式。
不用太多於精通這些東西,因為GUI正在被Web取代,主要是了解一下Windows 圖形界面的編程。@virushuo 說:「 我覺得GUI確實不那麼熱門了,但充分理解GUI工作原理是很重要的。包括移動設備開發,如果沒有基礎知識仍然很吃力。或者說移動設備開發必須理解GUI工作,或者在win那邊學,或者在mac/iOS上學」。
2、學習Java
Java 的學習主要是看經典的Core Java 《Java 核心技術編程》和《Java編程思想》(有兩卷,我僅鏈了第一卷,足夠了,因為Java的圖形界面了解就可以了)
學習JDK,學會查閱Java API Doc Java Platform SE 6
了解一下Java這種虛擬機語言和C和Python語言在編譯和執行上的差別。從C、Java、Python思考一下「跨平台」這種技術。
學會使用IDE Eclipse,使用Eclipse 編譯,調試和開發Java程序。
建一個Tomcat的網站,嘗試一下JSP/Servlet/JDBC/MySQL的Web開發。把前面所說的那個PHP的小項目試著用JSP和Servlet實現一下。
3、Web的安全與架構
學習HTML5,網上有很多很多教程,以前酷殼也介紹過很多,我在這里就不羅列了。
學習Web開發的安全問題(參考新浪微博被攻擊的這個事,以及Ruby的這篇文章)
學習HTTP Server的rewrite機制,Nginx的反向代理機制,fast-cgi(如:PHP-FPM)
學習Web的靜態頁面緩存技術。
學習Web的非同步工作流處理,數據Cache,數據分區,負載均衡,水平擴展的構架。
實踐任務:
使用HTML5的canvas 製作一些Web動畫。
嘗試在前面開發過的那個Web應用中進行SQL注入,JS注入,以及XSS攻擊。
把前面開發過的那個Web應用改成構造在Nginx + PHP-FPM + 靜態頁面緩存的網站
4、學習關系型資料庫
你可以安裝MSSQLServer或MySQL來學習資料庫。
學習教科書里資料庫設計的那幾個範式,1NF,2NF,3NF,……
學習資料庫的存過,觸發器,視圖,建索引,游標等。
學習SQL語句,明白表連接的各種概念(參看《SQL Join的圖示》)
學習如何優化資料庫查詢(參看《MySQL的優化》)
實踐任務:設計一個論壇的資料庫,至少滿足3NF,使用SQL語句查詢本周,本月的最新文章,評論最多的文章,最活躍用戶。
5、一些開發工具
學會使用SVN或Git來管理程序版本。
學會使用JUnit來對Java進行單元測試。
學習C語言和Java語言的coding standard 或 coding guideline。(我N年前寫過一篇關C語言非常簡單的文章——《編程修養》,這樣的東西你可以上網查一下,一大堆)。
推薦閱讀《代碼大全》《重構》《代碼整潔之道》
高級深入
1、C++ / Java 和面向對象
我個人以為學好C++,Java也就是舉手之勞。但是C++的學習曲線相當的陡。不過,我覺得C++是最需要學好的語言了。參看兩篇趣文「C++學習信心圖」 和「21天學好C++」
學習(麻省理工免費課程)C++面向對象編程
讀我的 「如何學好C++」中所推薦的那些書至少兩遍以上(如果你對C++的理解能夠深入到像我所寫的《C++虛函數表解析》或是《C++對象內存存局(上)(下)》,或是《C/C++返回內部靜態成員的陷阱》那就非常不錯了)
然後反思為什麼C++要干成這樣,Java則不是?你一定要學會對比C++和Java的不同。比如,Java中的初始化,垃圾回收,介面,異常,虛函數,等等。
實踐任務:
用C++實現一個BigInt,支持128位的整形的加減乘除的操作。
用C++封裝一個數據結構的容量,比如hash table。
用C++封裝並實現一個智能指針(一定要使用模板)。
《設計模式》必需一讀,兩遍以上,思考一下,這23個模式的應用場景。主要是兩點:1)鍾愛組合而不是繼承,2)鍾愛介面而不是實現。(也推薦《深入淺出設計模式》)
實踐任務:
使用工廠模式實現一個內存池。
使用策略模式製做一個類其可以把文本文件進行左對齊,右對齊和中對齊。
使用命令模式實現一個命令行計算器,並支持undo和redo。
使用修飾模式實現一個酒店的房間價格訂價策略——旺季,服務,VIP、旅行團、等影響價格的因素。
學習STL的用法和其設計概念 - 容器,演算法,迭代器,函數子。如果可能,請讀一下其源碼。
實踐任務:嘗試使用面向對象、STL,設計模式、和WindowsSDK圖形編程的各種技能
做一個貪吃蛇或是俄羅斯方塊的游戲。支持不同的級別和難度。
做一個文件瀏覽器,可以瀏覽目錄下的文件,並可以對不同的文件有不同的操作,文本文件可以打開編輯,執行文件則執行之,mp3或avi文件可以播放,圖片文件可以展示圖片。
學習C++的一些類庫的設計,如: MFC(看看候捷老師的《深入淺出MFC》) ,Boost, ACE, CPPUnit,STL (STL可能會太難了,但是如果你能了解其中的設計模式和設計那就太好了,如果你能深入到我寫的《STL string類的寫時拷貝技術》那就非常不錯了,ACE需要很強在的系統知識,參見後面的「加強對系統的了解」)
Java是真正的面向對象的語言,Java的設計模式多得不能再多,也是用來學習面向對象的設計模式的最佳語言了(參看Java中的設計模式)。
推薦閱讀《Effective Java》 and 《Java解惑》
學習Java的框架,Java的框架也是多,如Spring, Hibernate,Struts 等等,主要是學習Java的設計,如IoC等。
Java的技術也是爛多,重點學習J2EE架構以及JMS, RMI, 等消息傳遞和遠程調用的技術。
學習使用Java做Web Service (官方教程在這里)
實踐任務: 嘗試在Spring或Hibernate框架下構建一個有網路的Web Service的遠程調用程序,並可以在兩個Service中通過JMS傳遞消息。
C++和Java都不是能在短時間內能學好的,C++玩是的深,Java玩的是廣,我建議兩者選一個。我個人的學習經歷是:
深究C++(我深究C/C++了十來年了)
學習Java的各種設計模式。
2、加強系統了解
重要閱讀下面的幾本書:
《Unix編程藝術》了解Unix系統領域中的設計和開發哲學、思想文化體系、原則與經驗。你一定會有一種醍醐灌頂的感覺。
《Unix網路編程卷1,套接字》這是一本看完你就明白網路編程的書。重要注意TCP、UDP,以及多路復用的系統調用select/poll/epoll的差別。
《TCP/IP詳解 卷1:協議》- 這是一本看完後你就可以當網路黑客的書。了解乙太網的的運作原理,了解TCP/IP的協議,運作原理以及如何TCP的調優。
實踐任務:
理解什麼是阻塞(同步IO),非阻塞(非同步IO),多路復用(select, poll, epoll)的IO技術。
寫一個網路聊天程序,有聊天伺服器和多個聊天客戶端(服務端用UDP對部分或所有的的聊天客戶端進Multicast或Broadcast)。
寫一個簡易的HTTP伺服器。
《Unix網路編程卷2,進程間通信》信號量,管道,共享內存,消息等各種IPC…… 這些技術好像有點老掉牙了,不過還是值得了解。
實踐任務:
主要實踐各種IPC進程序通信的方法。
嘗試寫一個管道程序,父子進程通過管道交換數據。
嘗試寫一個共享內存的程序,兩個進程通過共享內存交換一個C的結構體數組。
學習《Windows核心編程》一書。把CreateProcess,Windows線程、線程調度、線程同步(Event, 信號量,互斥量)、非同步I/O,內存管理,DLL,這幾大塊搞精通。
實踐任務:使用CreateProcess啟動一個記事本或IE,並監控該程序的運行。把前面寫過的那個簡易的HTTP服務用線程池實現一下。寫一個DLL的鉤子程序監控指定窗口的關閉事件,或是記錄某個窗口的按鍵。
有了多線程、多進程通信,TCP/IP,套接字,C++和設計模式的基本,你可以研究一下ACE了。使用ACE重寫上述的聊天程序和HTTP伺服器(帶線程池)
實踐任務:通過以上的所有知識,嘗試
寫一個服務端給客戶端傳大文件,要求把100M的帶寬用到80%以上。(注意,磁碟I/O和網路I/O可能會很有問題,想一想怎麼解決,另外,請注意網路傳輸最大單元MTU)
了解BT下載的工作原理,用多進程的方式模擬BT下載的原理。
3、系統架構
負載均衡。HASH式的,純動態式的。(可以到Google學術里搜一些關於負載均衡的文章讀讀)
多層分布式系統 – 客戶端服務結點層、計算結點層、數據cache層,數據層。J2EE是經典的多層結構。
CDN系統 – 就近訪問,內容邊緣化。
P2P式系統,研究一下BT和電驢的演算法。比如:DHT演算法。
伺服器備份,雙機備份系統(Live-Standby和Live-Live系統),兩台機器如何通過心跳監測對方?集群主結點備份。
虛擬化技術,使用這個技術,可以把操作系統當應用程序一下切換或重新配置和部署。
學習Thrift,二進制的高性能的通訊中間件,支持數據(對象)序列化和多種類型的RPC服務。
學習Hadoop。Hadoop框架中最核心的設計就是:MapRece和HDFS。MapRece的思想是由Google的一篇論文所提及而被廣為流傳的,簡單的一句話解釋MapRece就是「任務的分解與結果的匯總」。HDFS是Hadoop分布式文件系統(Hadoop Distributed File System)的縮寫,為分布式計算存儲提供了底層支持。
了解NoSQL資料庫(有人說可能是一個過渡炒作的技術),不過因為超大規模以及高並發的純動態型網站日漸成為主流,而SNS類網站在數據存取過程中有著實時性等剛性需求,這使得目前NoSQL資料庫慢慢成了人們所關注的焦點,並大有成為取代關系型資料庫而成為未來主流數據存儲模式的趨勢。當前NoSQL資料庫很多,大部分都是開源的,其中比較知名的有:MemcacheDB、Redis、Tokyo Cabinet(升級版為Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。
7. 程序員怎麼才能提高代碼編寫速度
方法很多,說說我的想法
電子文檔,可修改性強,想到方案,覺得差不多,就去做。因為復雜的程序,靠單純思考是做不出來的。
例如你現在正在看的回答。我看到這個問題時,腦子里有很多想法,但不知道怎麼寫才能通俗易懂,所以我就一個一個列出來,
然後一個一個完善,然後調整順序,不需要的還得刪除。而代碼也是如此,在寫與改的過程中,你會有更好的方案,這也是一個練習的過程。
善於利用軟體,使用寫代碼的專業軟體。像 VS Code、eclipse等。有很多功能,我都不知道,但我知道vscode可以搜索文件內容,當你在一堆文件里找一個文件,或文件里找某個函數時,在知道名字的情況下用搜索功能,能幫你省很多時間,還減輕眼睛負擔。用好手中軟體。對開發十分便利。
記不住文件名,可以建個txt文件備忘。txt是個好東西。很多記不住的都可以用txt,只是得規劃好。別建了一堆txt,自己都分不清。當然這規劃也需要時間歷練。
有空還可以了解一下命令行,腳本文件。有些固定的操作可以寫成腳本。不需要專門去學,只要了解一下,知道有哪些功能,就行了。具體編寫可以網路。
注意休息,疲勞的狀態肯定是跑不快的。早睡也許覺得沒有更精神,但熬夜會更沒有精神。早睡睡不著??可以試試早起,強迫自己早起,到了晚上不信睡不著。工作期間記得每小時休息幾分鍾,放鬆放鬆精神,活動活動身體。注意飲食,馬無夜草還不肥呢,要按時吃好飯。適當運動,運動能改善體液循環,下蹲、俯卧撐、仰卧起坐。這些可以早上在室內做,只要二十分鍾。
看完這些可能還是一臉懵逼。能寫的還有很多,但世上沒有完全相同的兩個人,一切還得靠自己。自己觀察時間耗在哪裡,總結,尋找解決方案。然後實行。
從意識到,到了解,到改變,到掌握是需要時間的,耐心點會有回報的。
8. 作為一名程序員,經常感到工作壓力大,該怎麼調節
大家可能都了解,程序員的工作是非常累的,也為大家稱為碼農,而且程序員的工作是從早到晚不間斷的,並且總是有加班到深夜的可能,工作真的是非常累。所以這個時候必須有一點東西來調節一下自己的生活。
晚上大家可以一起喝個酒,擼個串,在現在的社會喝酒擼串兒是最開心的事情了,再煩惱的事情也可以解決。無論做什麼工作的,生活總是需要調味劑的,不然生活總是一成不變,也沒有什麼意思。
如果你感到壓力非常大的話,可以給自己釋放一下,工作還是得干一行愛一行,所以這個時候你需要說服自己喜歡上你的工作,畢竟你的工作確實能給很多人帶來無限的好處,這也就是你作為程序員的價值。
9. 想做程序員做後端都需要掌握哪些知識
目前掌握的僅能:
1,研發(基本吧,產品總得有人來做)
2,調優(主要是Mysql調優,在符合業務需求的情況下盡可能提高TPS)
3,運維(小公司不會像大公司一樣還標配運維,通常後端兼任運維職能)
擴展下:
研發:php入行,選個好框架(推薦Yaf),然後研發過程中多注意下性能,多用php本身的函數來解決需求,php本身函數豐富,而且都是C擴展,性能非常可靠。
調優:這個我實在不知道該放到研發還是運維,所以就單獨拿出來說。因為其實對於伺服器性能的調優本身兩邊都需要進行,一是研發時注意,二是各個軟體(主要是DB)的配置項。我的調優很粗暴,用阿里雲的壓力測試(耗費了公司一些錢財,罪過罪過)每次壓一分到5分鍾,然後看看瓶頸在哪裡,把配置項全部列出來,肉眼+自行判斷調整哪個參數看看能不能提升性能(233),我也會在代碼中把每個核心部分的消耗時間打入日誌,來判斷到底該進行哪裡的優化。
運維:主要分三部分,
快速部署:雖然是小公司,但是老闆有些資源,所以可以預計上線第一波的壓力不小,如果產品良好的情況下壓力只能會越來越大,所以要求如果感覺到系統有壓力後,需要快速進行橫向擴展系統,這里我選用的Puppet,理由很簡單:老牌,使用廣泛,社區強大。
監控報警:這是運維的眼睛,我選用的zabbix,理由跟上面一樣:老牌,使用廣泛,社區強大。
日誌採集:因為是集群的原因,看日誌不方便,最開始是用nfs來收集,後來隨著日誌越來越分散,日誌越來越大,沒用多久就被我拋棄了,然後在朋友的推薦下使用ELK進行日誌採集和查看。理由只是因為沒有別的更好選擇(朋友強烈推薦這個,其他的都是沒有啥強大社區,這個看著更靠譜點)
10. 初級程序員該如何逆襲
初級程序員該如何逆襲
如何在工作中成長
其實你想問的是這些出去程序員並不可怕
只要你有一顆上進的心
去問多去學去接觸
慢慢的就會發現一大牛越來越近
不要害怕去接觸一些新的東西
慢慢地去適應它
在工作中積累
在工作中學習
不懂的就去問那些大牛
慢慢的你也會成為他們中的一份子