A. 程序員會裝電腦系統嗎
程序員和裝電腦系統完全是兩個不同的概念。一般來說裝電腦系統的人一般不會做程序。但是有的程序員還是會裝系統的。
這個和人有關系。因為程序員相對來說做事更縝密,所以抓系統有時候也會學習一下。但並不是所有的程序員都是會裝系統。畢竟是兩個概念。
B. 程序員平常用什麼系統做開發
windows, macOS,linux是當今主流三大操作系統,普通用戶一般是選擇windows或macOS, linux主要是占據伺服器領域市場。
普通用戶對於操作系統的選擇很簡單,經濟實用選windows,錢多講究格調選macOS, 畢竟普通用戶切換操作系統的成本並不大。而程序員就不一樣了,換一個操作系統,就意味著所有開發環境都要一並更換。而且在程序員群體中,操作系統有以下的鄙視鏈:macOS-->linux-->windows。
其實操作系統的比較並不是簡單粗暴的單一維度比較,用windows並不意味著low,用linux也不等同於你就是一個極客。關鍵在於你是如何使用。就好比編程語言的選擇,php是最招人黑的語言(沒有之一), 但黑php的人中有不少人寫的代碼同樣不堪入目。
不過作為一個程序員,你很有必要學會linux,如果你的程序最終是跑在線上的Linux伺服器上,那麼你就更應該從現在開始投入linux的懷抱中,早日從windows脫坑。至於macOS,在命令行上與linux絕大部分相同,都是類unix的操作系統。
如何學linux?
工作中,看到不少工作好幾年的程序員,在操作linux時特別生疏,只會最基本的幾個命令:cdls mkdir 等。vim編輯器的操作更是讓人看了很著急,被譽為編輯器之神的vim在他們手中,完全沒有半點靈氣,感覺就像是編輯器之屎。
之所以會出現這種現象,很大原因在於他們的學習方式錯了,不少人都知道linux很重要,不掌握linux,基本上就只能停留在最基本的增刪改查功能上。他們學linux的方式可能是看書,也可能是看視頻,甚至有些還會去背命令,但由於他們的操作環境是windows,linux的應用場景很少。根本沒辦法將所學的知識運用,更加感受不到linux的魅力。
學linux最好地方式,就是直接去用!直接將自己的開發環境都改成linux,一開始很蹩腳,很不適應,這很正常。如果你一直感到很舒服,只能說明你一直沒有進步。想想我們學了那麼多年英語,絕大多數人還是無法掌握英語,看到英語文檔就直接自動屏蔽。其原因都是:一直在學,但從來沒在用。只學而不用,沒有半點用。
C. 要成為一名專業的程序員,從零開始需要怎麼一步步來比較好,要把最底層的先學精通嗎(個人認為)求學長
前言
你是否覺得自己從學校畢業的時候只做過小玩具一樣的程序?走入職場後哪怕沒有什麼經驗也可以把以下這些課外練習走一遍(朋友的抱怨:學校課程總是從理論出發,作業項目都看不出有什麼實際作用,不如從工作中的需求出發)
建議:
不要亂買書,不要亂追新技術新名詞,基礎的東西經過很長時間積累而且還會在未來至少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等。
D. 現在軟體行業已經很成熟,為什麼程序員還在沒日沒夜敲代碼搞系統更新
時代不同了,之所以程序員還在沒日沒夜敲代碼製作更新系統是因為要突破創新,不然就要被別的產品給淘汰了,所以程序員敢不設計新產品嘛?
現在的電子產品並不好用,才更要運用好創新設計,爭取製作出好成品。無論是電視、藍牙耳機、電腦、網站應用、游戲…以及很多的領域都在不斷地更新。
畢竟除了所有應用軟體更新創新的辦法,也別無他法。我打個比方吧,比如說我想買個消除噪音的耳機,那我在天貓或者京東上購買了自己看中的耳塞,買回家後我塞在耳朵里,外邊的聲音就能夠減輕許多了嘛?最多也只能減輕一點點,完全降噪肯定不行的。
就像以前的老台式電腦,到後來的筆記本電腦,還有台式一體機電腦,這也是系統更新的過程紀錄。
好的產品為了避免被取代只能不斷更新,停止創新的產品終將被人們遺忘舍棄!
E. 你見過最厲害的程序員是怎麼樣的
以前曾經做過十餘年的編程,見識過不少程序員,其中有兩位是比較厲害的。
第一位,J同學,非科班出身,糧食專業畢業的,之後在一個食品廠工作,因為比較清閑,於是他突發奇想,想考某個211的計算機研究生,就去買了書來看,但是要實踐啊,他又沒有計算機,就有空總去公司的電腦室蹭機器用,電腦室的人,就讓他幫忙開發一個工資管理系統,不知道是不是想為難他,結果他研究生是沒考上了,但是經過一個月的摸索之後,居然把工資系統給做出來了。讓電腦室那些科班畢業的人臉上掛不住啊!
之後他就斗膽去了一個國內知名的企業應聘程序員,居然還給應聘上了,慢慢做到了華南區的技術總監,再後來他幾個同事出來創業,高新挖走他。
他這個人就是傳說中的怪俠,非常低調,樸素,不按時上班,不按時下班,工作效率非常高,愛抽煙,請教他什麼問題,他一時想不出來的話,就去外面抽根煙,煙抽完了,回來就會有答案,反正非常神奇。
第二位,B同學,科班出身,211大學計算機研究生,當時是他的導師跟我們單位有來往,推薦過來的,我面試的他,惜話如金,聽說他C語言非常厲害,但是當時我們做項目需要PB,他說他不會,我就說,那給你一個星期的時候,你回去學習一下,再來面試。一個星期後,再過來,給他一個小模塊,很快就做出來,非常棒,之後,項目的技術難題,大部分都是他解決的。平時,他也不怎麼跟我們來往,但是有事就做,也不打 游戲 ,按時上班,按時下班,非常討厭加班。
遇到技術問題,下班後打電話給他,他不接的。有一次,我們第二天系統要上線,大家都在忙著測試,加班,他到點就走了,領導追到電梯門口,問他,XX哥,你走了,他說了一個字,是,就進電梯了。後來也是被高薪挖走,聽說到現在40歲也還沒結婚。
我們公司有一位非常厲害的程序員,基本上一個人當做一個排兵力使用。也就是說一個人寫代碼的效率基本上抵得上10+人的能力,一年隨隨便便寫個幾十萬高質量的代碼。這種人對編程語言的理解已經到了登峰造極的地步,且能夠靈活自如地使用。
在自己編碼能力強的同時,對架構的理解能力也是超強,一個大的系統能夠很快地進行模塊拆分,快速的定義不同模塊間的交互介面,可以快速的安排任務下去。
另外代碼的質量基本上沒地說,導致跟著他的測試人員幾乎發現不了Bug,這哥們在寫代碼的同時基本上順手就把單元測試寫好了,代碼質量高的簡直出奇。
當然了,至於學習什麼新的開源框架或者新的技術架構,基本上就是2-3天的功夫,就可以全面掌握。
目前為止,公司一直當做寶一樣供著。
我見過最厲害的程序員,是在2001年入職的一間香港電路板公司的電腦部經理,他也是最值得我尊重的程序員,那他最厲害的地方在哪裡呢?
編程語言只懂Foxpro DOS版本,但所有的ERP流程,英文、管理方法說得滴水不漏,有一次和財務的同事聊天,才知道他的月薪達8萬多。
很多程序員最怕大老闆提問題,但在他的眼裡,大老闆提問題就是一個商機,多多少少都要老闆加工資加設備。 高情商的表現就是無論下屬或老闆通通管理得服服帖帖,包括我自己,甚至老闆還沒有說話就己經知道老闆的心思了。
老闆分配的編程任務應期三天完成,絕對不過4天。軟體開發效率的提高,自然要依賴下屬心甘情願的加班付出才行,做到這一點,真的是難能可貴。
最厲害也是我最佩的一點就是,40多歲了頭發還沒有一點白的跡象,每天高效率的工作,下班後就拋開工作的煩惱,盡情桑拿按摩享受。
我認為最厲害的程序員不是編程技術,而是如何利用編程技術,不知道你認不認同?
應該是讀研時的學長,精通Java和Python,畢業後進去微軟研究院工作。
當時和他在一個項目組,他獨立完成了教學平台語言分析模塊,NLP 模塊。我們團隊任何問題都能很快給出解決方法,前端後端都擅長。
當時我剛接觸Linux,他就已經把Linux作為工作學習唯一的選擇。經常用terminal 操作,敲起代碼太帥了
誠邀,本人在杭州華為研究所工作,之前在一家創業公司工作過,公司里一個工作10年的大神,撐著整個創業公司,老闆總能拿到某些項目源代碼,不同語言的,c c++ .net java總之很多,給他,一禮拜就可以全懂了,所有語言基本都是1禮拜搞定(玩代碼的都知道精通一門語言後學其他的特別容易,不外乎面向對象的,面向過程的,然後就是各種API )上手做項目,之前很多不懂的問題問他都可以從本質上分析得很明白,主要是基本上看幾眼就可以知道哪裡錯了。或者大概方向,我後來去華為,都是他建議的,現在還在那公司的他聽說是技術總監了,應該不怎麼敲代碼了。
核心的代碼總是有那一兩個程序員來實現的。比方說現在微信的一開始的核心代碼。
比方說Linux的核心代碼, 都是由林納斯·托瓦茲編寫的, 並且為了能夠讓開源社區的人一起進行開發, 又編寫了Git版本控制。當你不滿意某個軟體或者系統的時候, 能夠自己實現並製作出更好的也許就是厲害的程序員吧。一直到現在很多的系統分支都是來源於Linux的內核。
最後如何成為最厲害的程序員, 還是要學習基礎核心的知識, 操作系統, 數據結構, 演算法, 編譯原理, 計算機網路, 在這個基礎上學習編程都是為了更好地實現自己的心中所想。為什麼這樣寫, 這樣寫會產生什麼效果。 為什麼Golang最近這么熱, 為什麼鴻蒙會被看好, 它又和其他的有什麼區別, 就可以自我判斷, 而不是見風就是雨。
最後希望自己也成為那個最厲害的程序員。
很久以前,我用win98的時候有次我系統崩潰了,因為我是電腦白痴,我朋友給我介紹了一個高手來幫我修電腦。
他看了一下電腦,問我有沒有98的盤,我說沒有。
他想了一下,叫我把固定電話拿給他,我想修電腦要電話干什麼,但人家是高手,我也不好說什麼,就把電話拔下來給他了。
他把電話線空著的一頭接在電腦的一個插孔內,然後進入dos,就開始在電話上不停的按著鍵,他按鍵的速度異常快,但是只按0,1兩個鍵,我搞不懂這有什麼用,但也不敢問,看了半個多小時,他還是不停的按這兩個鍵,我徐徐的有些困,我問他這東西要搞多久,他說要幾個小時,我給他倒了杯茶,就一個人去隔壁睡覺了。
醒來的時候,一看已經過了4個多小時,我起身到隔壁,看見他正在98裡面調試,過了一會兒,他說,你試試,我坐上椅子用了一下,真的好了,我當時也不懂電腦,謝過人家就走了。 後來我慢慢對電腦有了了解,終於了解,原來當時那位高手是用機器語言編了一個98系統,我後來問我朋友那位高手的下落,我朋友說前幾年去了美國之後,杳無音訊....
五年前有幸在一家軟體公司做產品經理。小的軟體公司。坐標西安。招人還挺不好招的。雖然給的薪水還不錯。但是真心不好招人。這種小軟體公司沒有名氣。真正牛逼的人都不來。
百試幾百人,包括做產品和前端的也算在裡面。光程序員這塊。有百分之六十的投簡歷的都是從某培訓機構出來的。所以的項目經歷。和待過的公司都是一模一樣,有明顯的人為的痕跡。
但是後來實在沒有人手。招了一兩個,差。差。差。真是差到極點
後來又經人推薦,招了一個,說是做安卓開發的。結果連個軟體的心跳包都調不好。軟體的升級這塊都搞不定。最後還是我這個外行,逼著他。一點一點卡,才把軟體升級這塊稍微搞上路了。
說出來真是讓大家笑話,華為的外包中軟國際。有個孩子實在忍受不了裡面的虐待,在裡面工作了一年半。然後跳到我們公司。這個孩子,才是稍微讓人可以用一下。就是起碼。你給他的工作。他能完成。其他的人都是在摸魚。因為這個公司的老闆以前也不是做手機軟體這塊。沒有資源,不認識人。
他是做電腦PC軟體,到後面做BS系統多一點。其實這種沒有技術含量,找的別人的框架。去修改。
普通人見不到最牛逼的程序員,最牛逼的程序員,一定是在最牛逼的軟體或者互聯網公司的深宮後院裡面。還沒出世的。就像當初的張小龍,史玉柱,裘伯君一樣。
你現在能看的牛逼的,感覺牛逼的。都是因為你不懂這個。你才覺得牛逼。包括前幾年比較活躍的黑客們,製造一些病毒。這都不是牛逼。包括熊貓燒香的李俊,普通人覺得他可牛逼了。但是真正的他出來後,去金山 360這種公司,提鞋別人都不要。
因為搞破壞不是牛逼。也不是自己水平有多牛逼。
我來講一個我見過最厲害的程序員。
這個程序員是我第一份工作碰到的大牛,我的第一份工作在中興通訊成都研究所,當時是做操作系統研發的。
我們當時經常會做一些培訓和技術分享,那時候我才入職3個月,我發現公司里有個人每次技術分享時候,就很多人去聽,並且會議室爆滿,連站的地方都沒有,然後我有次也去聽了一下, 第一每次目睹大牛的風采,因此操作系統是最底層的研發工作,會涉及到內核這塊知識,而linux內核知識特別抽象,看書根本很難看懂,但是這個大牛能把很難的東西講的很容易理解,並且在會上面對大家的提問總是能對答如流,實在是厲害。
而後我通過公司里的老員工才了解到,這位大牛是自學成才的,他的文化程度才初中,破格錄取到中興通訊,當時是操作系統部門的技術專家,他都能自己編寫操作系統,對各硬體都非常了解,也出了很多書。可見興趣是最好的老師,讓他能夠在程序員中發光。
必須是ACM大神,樓天成,樓教主。不了解他的可以網路之。是個天才一般的存在。
幾年前清華大學找同學玩,他那時是清華軟體學院的學生,突然說要帶我去見他的偶像,還說是最後的機會了,我們跑去計算機學院,當時博士正在答辯,通過在場的同學找到了他,他很靦腆的千呼萬喚始出來。他們兩在那裡交流了半個多小時,最後互留了EMail,我跟他聊了些我專業的內容,他還蠻好說話。 後面還通過這位同學認識另一位ACM屆大神,上海交大的戴文淵。我對編程略有了解,主要還是崇拜天才。
F. 程序員,不會重裝系統,不懂計算機硬體基礎知識,正常嗎
不懂硬體 是正常,不會重裝系統 是不正常的。
很正常
怎樣定義懂?
你是程序員,你應該至少至少有一些模糊的概念,你的程序是怎麼運行的,內存怎麼回事,緩存什麼東西,cpu怎麼運算的,數據切入切回硬碟是什麼意思。
我見過不少程序員,一個「運行慢」就能讓他直接攤手,那些頻繁的IO開銷,不斷讀寫硬碟數據,甚至在里三層外三層的循環里去訪問資料庫,這些在他們眼裡根本就不是問題,或者說他們根本意識不到這里會有問題。
因為「編譯通過了呀,程序能運行呀,我電腦上沒問題呀」。
程序員可以不專精英硬體知識,但是想要自己提升,最好還是了解一些比較好。
至於了解到什麼程度,每個人都有差異,自己把握。
至於那些業界被奉為大神的早期程序員,其實他們當年寫程序,都是需要自己手工碼代碼去控制硬體的,包括那些你能想到和想不到的。
我是網路維護的,經常被人請教word Excel ps O_o 我說不會,,他們就說你就是干這個的怎麼能不會
正常,人家是另外一個層次,解說員和教練或伏不一定會打球
正常,術業有專攻。越是大的單位越這樣
太正常不過了。我公司里幾個程序員不會裝電腦。電腦有硬岩啟件問題也不知道怎麼解決。但寫代碼確實比較厲害
不正常。不會切菜的廚師,不是真廚師。
只要掉頭發就行,標配
很正常,這兩者之間並沒有必然的聯系,解決電腦系統問題,硬體問題是維修人員商家售後的事情。程序員很多在大學開始粗團如學的時候都是小白,除了玩 游戲 什麼也不懂,大學也只會講講計算機硬體的基本組成,不會講什麼重裝系統和Windows系統故障分析,只會講編程軟體的環境部署,編譯原理什麼。也就是說很多程序員除了編程等相關方面外對計算機和普通人一樣什麼也不懂,除非這個人是一個計算機愛好者對計算機各種硬體顯卡,各種操作系統有自己的興趣。
G. 程序員30歲真的是坎其實,過了30歲,還能更上一層樓!
程序員干到30歲,好不容易從碼奴混到了白領,卻再也干不動了,還時時面臨失業的危險。30歲,是一個程序員傷不起的年齡。明天,何去何從?
在官場上,曾經有一個59歲現象,就是官員們會在59歲時,會使勁撈上一把。很明顯嘛,權力過期作廢,再不撈就要退休了,沒有機會了。
在程序員的圈子裡,也有一個30歲現象。當然,如果你有鐵飯碗,比如在國企或政府機關,那你是無法理解底層勞動人民的感受的。同時也要恭喜你成為體制內的一員,可以一直干到退休無憂。
30歲現象人人都明白,但要給出一個定義並不容易。列舉幾個表現,也許你會覺得心有戚戚焉。
面臨職業瓶頸,程序寫不動,上升又困難。
薪水較高,加班變少,後浪追前浪,面臨失業壓力;生活壓力劇增,不敢跳槽;
招聘程序員年齡限制在30歲以下成為行業潛規則,跳槽困難。
30 歲現象和59歲現象貌似不搭邊,其實都出於同樣的原因:價值貶值。 官員老爺在任就像皇帝,一旦退休,就成為了平民百姓,貶值那是自然的。而程序員也一樣, 所謂三十而立,一旦到了30歲左右,由於面臨結婚生子,一方面需要高薪撫養家庭,另一方面卻無法像以前那樣全身心投入到工作,性價比急劇下降;與此同時, 大批廉價的新手湧入,他們往往還使用最新的技術,老一輩程序員只能慢慢的靠邊站了。
30歲現象產生,只能程序員自身身上找原因。
當然我們也可以產業、從社會、從政府、從制度等多方面進行分析,發現不足,這些分析未必沒有道理,但是肯定沒有用,因為我們無法改變。所謂「 命苦不能怪政府,命背不能怪社會」 ,從外部找原因,只會讓我們滿腹牢騷,整天覺得自己生不逢時,苦悶不堪。
從自身找原因,試著問自己幾個問題:「為什麼我的性價比以下降?老闆為什麼要請我,給我高工資呢?一個人有價值是由什麼決定的呢?」
你也許可以列出很長很長的答案,但我想應該都可以濃縮為一句話:「一個的價值是由他的不可替代性決定的」。不可替代性可以理解為,為了替代你老闆需要付出的代價。
因為你的可替代性高,所以性價比下降。反之,因為你不可替代性高,所以老闆會給你開高工資。不是這樣的嗎?
有一則小故事:
技師退休時告誡自己的徒弟:「少說話,多做事。」
十年後徒弟也成了技師,他找到師傅,苦著臉說:「師傅,我一直都按您的教導做,只知埋頭苦幹,可那些比我技術差的都升職了、加薪了,我還是拿著過去的工資。」
師傅想了想,說:「你請一次假吧。如果一盞燈一直亮著,那就沒人會注意到它……」
徒弟恍然大悟,真的請了一星期假,等他回去上班時,廠長找到他說要給他加薪。原來,在他請假時,廠長發現,工廠已經離不開他了。
徒弟很高興,以後他時不時就請幾天假,每次請假後廠長都會給他加薪。一天徒弟請假後准備去上班,廠長卻告訴他:「你不用來上班了。」
徒弟苦惱地去找師傅,師傅說:「那天我的話還沒說完呢。一盞燈偶爾可以熄滅一次,可如果它總是熄滅,性質就不一樣了,因為沒人會需要一盞時亮時熄的燈。」
故事中,因為徒弟的不可替代,所以廠長給他加薪;後來因為有其它的燈亮了,他被替代了,廠長不需要他了,所以被炒了魷魚。
所以我們 歸根到底還是要提高自己的不可替代性。否則,一旦老闆覺得用較低的代價就可以替代你,那麼你就面臨可能失業的危險了。
那程序員到了30歲,怎樣提高自己的不可替代性呢?我們打算做一輩子程序員嗎?敢問路在何方?
作為一個過來人、一個資深程序員,我覺得有幾個方向可以選擇:
(1)成為技術大拿
其實,做一輩子程序員並沒有什麼問題,重要的是,你必須成為一個不可替代的程序員,也就是說,你要成為技術大拿,能夠解決普通程序員所不能解決的問題。技術大拿有兩個版本:
一 是程序員加強版。 你仍然是一個程序員,但你是一個很牛的程序員,憑借多年的積累,你在知識廣度和深度方面均已不是等閑之輩。從匯編到java,你樣樣精 通。你在意數據結構和演算法,對系統的優化有獨到見解,對設計模式如 數家珍,你還有完備的工具箱和自己的專用類庫。其實,加強版程序員有非常獨特的價值,可 惜的是,在現實中卻很少見,因為對任何一個公司而言,人才總是很稀缺的。老闆的眼睛是雪亮的,他怎麼會對你這種技術大牛視而不見呢,在你還沒有成為真正的 大拿之前,早已經被任命為系統架構師、項目經理或者更高的職位了。因此,你想守住自己的一畝三分地,悠閑的做自己的大拿,往往是不可能的。
二 是程序員升級版。 雖然你的內在仍然是一個程序員,但你的職位已經升級了,你成為了系統分析師或系統架構師。這是非常自然和現實的選擇。程序員與系統分析師 或架構師之間並有鴻溝,只需一步而已,你就可以從崎嶇山路駛向寬闊的大馬路。但這一步卻並不容易,需要幾年時間不斷思考、學習、實踐,才能化蛹成蝶。
(2)成為行業專家
行業專家也是一個公司不可缺少的角色,他們對公司的行業知識、業務流程和細節了如指掌。行業專家一般並不是從外部招聘的一個只懂業務、不懂技術的超人,而往 往是從程序員經過多年的摸爬滾打成長起來的。作為從程序員成長起來的行業專家,你往往還肩負系統分析師之職。在公司里,對業務有一般了解的人很多, 但專 家級別的往往很少,為了後30年的職業生涯,你必須成為專家。
(3)朝管理方向發展
向管理方向發展的第一步,一般是被任命為項目經理。在大部分IT公司里, 項目經理是最小的管理崗位了,可能你不會覺得有太多驚喜,工資也沒有大的提升,但這個轉變,可以說會成為你一生中最重要的轉變之一。
不 要小看了項目經理。有人說, 項目經理是一個古老的職業。也人有人說,21世紀是項目管理的世紀。 事實上,從人類有組織以來,就一直有項目管理,以前的項目 經理可能是部落首領,一次集體打獵、一次攻城拔寨,都可以視為一個項目。項目管理的知識可以應用到我們生活的方方面面,大至登月計劃的實施,小至家庭聚會 的組織,都離不開項目管理。
一個優秀的項目經理,不僅需要高智商,還需要高情商。可以不誇張的說,如果你能勝任項目管理,你就可以勝任戰術層的所有管理崗位,甚至你有家庭生活質量,也會提高到新層次。
然而,要成為一名優秀的項目經理,並不是一件容易的事情。可以說,需要一定的天分,有些人無師自通,有些人卻永遠也學不會。程序員屬於高智商人群,情商卻往往存在不足,這註定了只有少數程序員能夠成長為項目經理,成為優秀的項目經理,則非常稀少了。
如果你覺得這幾方面都不合適,那你還有幾條出路:
一是塌塌實實混日子。
說老實話,做老實人,辦老實事,拿老實的工資,這種員工公司也是非常需要的,一般不會遭遇炒魷魚的命運;
二是轉行或者創業。
因 為這個行業已經不再適合你,已經沒有更大的發展前途,只能轉行。如果可以轉行,未必是壞事,也許在新的環境中,可以激發出更強的能量,創造出一番事業來。 至於創業,那就更具有挑戰性了,建議你在創業之前,已經成為了一名優秀的項目經理。試想,如果轉不動一個項目,如何能轉動一個公司?
春招季節到來,我總結出了互聯網公司java程序員面試涉及到的絕大部分面試題及答案做成了文檔和架構視頻資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高並發等架構技術資料),希望能幫助到您面試前的復習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習,也可以點贊和關注一下以後會有更多干貨分享。
資料領取方式:加Q群:721886889 領取!