當你學會了什麼之後感覺自己的編程算是入門了?

太久了,入不了門,沒頭緒。不知道從哪裡下手。譚的書看不懂,之後兩年轉到硬體了,現在想重拾。我不知道什麼時候算是開始。


當我大概搞清楚了一句 「Hello world!」是怎麼出現在屏幕上的時候

printf("Hello world!");

printf 是一個C runtime的函數,「Hello world!" 是一個常量字元串,編碼是ASCII的""結尾的,傳遞給printf的是const char * 類型的指針,指針通過push指令壓棧,通過call指令調用函數。

printf會把這個字元串寫入一個叫 stdout的抽象文件句柄,而這個文件句柄會被console接管。

當console從stdout讀取這個字元串後,會把他寫入console的緩衝區,根據當前游標位置決定字元的位置

console的會根據緩衝來刷新屏幕顯示

顯示字元的時候需要根據當前字體設置,用」Hello world!"的每個字元的Unicode值去計算字體內對應的字元索引,根據索引獲取字模。

根據字模來繪製字元圖形,用當前字體顏色填充,做字體邊緣平滑,生成包含字元的RGB32點陣圖

把RGB32點陣圖複製到console窗口對應的frame buffer

操作系統的圖形引擎把窗口的frame buffer渲染到屏幕對應的顯存內的frame buffer

顯卡根據顯存buffer 生成信號給顯示器,顯示器根據信號調整屏幕上每個像素的顏色和亮度。

終於可以看到「Hello world!」了

註:這只是個粗略過程,中間省略了不少於10萬字。


----------------------2017年7月27日----------------------------

寫代碼時的頓悟:不懼怕任何陌生的技術,就算入門了。

推而廣之:不懼怕學習,就是學習的入門;不懼怕生活,就是生活的入門。

--------------------------------------------------

建了一個編程交流群,一起來玩,群號: 577362102

--------------------------------------------------

離開公司回學校,看到一張橫幅,閱畢,豪氣頓生,分享給大家。

---------------以下是正文-------------
在我累積了一定代碼量之後,突然有一天,開始關注邏輯、流程、項目、需求,而不再執著於特定語言,特定技術。應該關注那些抽象的,根本的,不易變動的東西。

很多技術,我現在不會,也不熟悉,但大致了解。如果需要,我知道去哪裡尋找資料,並很快上手。看到身邊有人做一些我沒研究過的技術時(如網站前端,微信開發,服務端,手機APP,樹莓派,Unity3D……),不再害怕或羨慕。我了解大致涉及哪些技術棧,如果有必要,我可以立馬開始練習。

有一門自己特別喜歡的編程語言,並且能用它做很多事情。

不因抽象層次高而自卑。曾經一段時間,我覺得越底層越厲害,越高層越垃圾。操作系統、編譯器、嵌入式編程等開發工作,比做web開發、app開發牛逼多了。C/C++比Java和Python好太多,JS和PHP簡直就是玩具,寫Shell腳本也能叫編程?後來發現,其實是我當時太弱智。只看到程序設計的表象,而不見本質。代碼是人思想的固化,重點是思想的表達,而不在於用什麼符號。

什麼是「程序」?我的理解,它是用「代碼」表達的一系列步驟序列。如果再抽象一點,不用「代碼」來表達呢?菜譜,日程表,路書……這些也算是「程序」吧?只不過執行者是人,不是機器。

編程離不開代碼庫和API。現實中也有各種「庫」和API。對我來說,手機是一個庫,可以打電話、發簡訊、刷微信、玩遊戲;電腦是一個庫,可以寫程序、看動漫、編輯照片、逛網站;雲伺服器是一個庫,可以搭網站、放爬蟲、搭建VPN……淘寶是一個購物API,噹噹網是買書API,知乎是學習經驗API,優酷是發布視頻API,YouTube是尋找教程API……每一本書籍,每一位朋友,每一個群組,都是一個庫或API。剩下的,無窮無盡,自行發揮。

關注大情境。我打算或正在用技術做什麼事?作為一顆螺絲釘(上班族),我的主體(公司)正在幹什麼?當我意識到國內主流手游公司的目的只是為了賺(keng)錢,而不是為了做出真正好玩的遊戲時,我感到自己的遊戲編程工作(僅僅實習)毫無意義。人生苦短,遲早有一天,要去做真正想做的事情,做振奮人心的事業。作為一名有理想有抱負的程序員,難道僅僅滿足於出賣自己的手藝,為資本家牟利,然後領取一點可憐工資嗎?

我希望程序員們不要太局限。以編程之眼觀大千世界,能看到怎樣的景象?

再強調一次。抽象,透過現象看本質。

----------------彩蛋---------------

謝謝那麼多朋友點贊。最近看到 phodal 兄的一本書,正在學習中。對全棧工程師感興趣的朋友,強烈推薦看一看:

《Growth: 全棧增長工程師指南》 http://growth.phodal.com

---------------------------------

強烈推薦蕭井陌的《編程入門指南》編程入門指南 v1.5 - 蕭井陌的專欄 - 知乎專欄

常讀常新。說來慚愧,我仍在啟蒙階段徘徊,修鍊去了。


讀完這本書掌握其中要領你就入門了


利益相關:四年211學校軟體學院學生,四年的軟體公司開發經驗。

這八年覺得入了好幾次門,但是現在是不是入門我也不知道了。
第一個月:學會了C語言寫了個簡單的加減法計算器,覺得我入門了。
第一年:寫了個支持四則運算,括弧,開方,字母運算的計算器。學習過程中自動領悟了模塊化,覺得進入了一個新天地,覺得我入門了。
第二年:和舍友合作,做了個魔獸主題的俄羅斯方塊,有動畫聲效。體驗了多人合作,代碼管理,高層設計,模塊測試,覺得我入門了。
第三年:做了個和同學合作,做了個搜索引擎,有索引演算法,網站,網頁,搜到了H網站,覺得百度也就這樣了,我一定入門了。
第四年:做了個基於Java web,資料庫的房產管理系統,管理軟體也不過如此嘛,覺得我入門了。

------------------畢業工作的分隔線--------------------------

工作一個月:用了一天的時間自學了JavaScript,html,發現自學一門新技術也就這樣了,這一定是入門的徵兆。
工作第二個月:開始接觸公司裡面的一個10W行級別的軟體,發現直接繞暈,無法理解。覺得自己有點虛。
工作第六個月:突然頓悟如何在一個陌生的中型項目(10w級別)工作。當時感覺這就是入門吧。
工作一年零六個月:帶領兩個校招的畢業生,負責了一個3W行左右的小型項目,做的不錯,老闆還給精神+物質嘉獎了,覺得做一個leader可能就是這樣吧,入門一定是這個感覺。
工作兩年:和我們組的leader,一個寫了12年代碼的資深工程師深入合作,發現難以望其項背啊,突然覺得自己好弱。然後在他的指導下,學習設計,重構,敏捷等等。
工作三年:公司有一個新項目,需要研究新技術,派我上了。當時奮戰了一個月,研究技術,出了一些成果之後做了原型,老闆覺得不錯,決定立項開工。頭一次獨立開荒,並且結果不錯,可能這就是真的入門了吧。

------------------跳槽的分隔線--------------------------

工作四年-現在:跳了個槽,入職當天就開始改代碼,修bug了。發現新的項目,新的技術已經不再是障礙了。這是入門嗎?
新工作三個月:發現這個項目裡面有諸多的設計失誤,堅信如果初期架構由我來做,一定會更好些。

這到底怎麼樣才算是入門呢?


===============原答案的分隔線============


編輯草稿的時候正好100個贊了,惶恐,知乎的第一個稱得上「高票」的答案了。

鑒於評論區裡面有幾位問我演算法不好或者不是計算機專業的,適不適合做開發,並且看起來是學生,這裡統一回答一下這個問題。
數據結構和演算法到底有多重要。對於學生來說,很重要。因為如果你這個學不好,能通過大公司的校招可能性微乎其微。因為公司評價一個學生的素質基本上就是看潛力(你得聰明),能做事(學習紮實),能學好數據結構這兩條是缺一不可的。但是工作中我卻從來沒有直接的寫過一個所謂演算法或者數據結構,因為大多數的開發工作是應用開發,數據結構大可以用STL之類的庫裡面的,你自己幾乎不可能寫一個質量或者效率超過這些庫的代碼的。

專業有多重要。我自己是軟體工程專業的,算是科班出身了。我不太好判斷非科班會有多少劣勢。但是我在公司中見過很多很多非科班的高手,有學生物的,機械的,還有設計的。如果你是非科班的話,自學就很重要了。學什麼呢?我憑記憶寫一下我大學時候的專業課吧,可能不全,盡量憑記憶寫,如果我寫了書名號,你可以百度這本書,這就是教材。《計算系統基礎》,數據結構與演算法,操作系統,面向對象編程,計算機組成原理,網路技術原理,資料庫原理,《代碼大全》,統計數學,離散數學,c++,軟體工程導論,軟體設計導論。
加粗的地方是我認為比較重要,至少對於校招面試是有幫助的。

校招是去大公司還是小公司呢?有人說小公司可以迅速獨當一面,成長快,大公司只是螺絲釘。這點我承認。但是根據我的判斷,小公司,長得快;大公司,長得高。
我第一份工作是大公司。公司名我不說了,大致描述一下吧,國際化上市公司,從公司離職的有去BAT,google,microsoft的,從BAT出來的也有到這家公司的。我在裡面就算一個中流選手吧。大公司的一個好處,無法替代的,對於成長很重要的好處,就是你和優秀的人一起工作,見識了成熟的開發方法,見識了大牛是什麼樣的,見識了複雜的軟體是怎麼做出來的,這對於一個剛步入工作的人很重要。並且這些在小公司是很難見識到的。並且大公司裡面你往往會有一個資深且優秀的Leader進行輔導帶領,這點小公司同樣很難提供。

我的第二份工作是一個創業公司,技術團隊十幾個人吧。假如我第一份工作就在這裡,很可能我的開發路子就會變得很「野」,不正規。這種野路子可能會很快,但是大量的軟體工程先驅探索出的正路子才能夠幫你走的更遠。並且小公司人水平良莠不齊,業務壓力也大,能讓你跟著一個資深的高手學習的機會和時間也有限。

學過打字的都感覺得到,剛開始隨心所欲的打字,開始是打的快。但是真正要打的快,打得好,剛開始就得用「彆扭」的正規姿勢和指法來打。
綜上,如果你想在軟體開發作為職業生涯,第一份工作建議大公司。


有些人認為學習語言,熟悉各種語法要素和特點,比如指針、多態性就算入門了;
有些人認為會仿一個圖書館管理、設備管理、學生管理之類的程序,有一定代碼量就算入門了;
有些人認為能仿一個公交查詢之類的APP,能跑就算就入門了;

我覺得不是。第一次編出真正用於實際的應用程序,才能消除新手心中的忐忑,極大地增強自信,這才是真的入門。

畢業後初到某軟體公司公司,公司里人手緊缺,新手拿錢不多,也得一個蘿蔔一個坑地頂小項目,項目經理看擬隨意地扔出來一個國企的增值稅發票列印程序的開發任務,工期2星期,需求簡單到只是一張A4紙,然後和對方一通電話,我就出現在企業財務科高高櫃檯內部區域某角落的一張空桌子上了。

項目當然沒有想得那麼簡單,數據要和老舊的財務系統和銷售系統對接,這兩個系統又是不同時間不同公司開發的,資料庫種種奇怪和不規範;增值稅票列印要求多多,套打位置要求精準,又是針式平推連續列印,連續打近百張不能有明顯的位移,列印者的身份驗證和LOG還歸我管。

每天跟著企業的滾滾人流上班,工作服也和企業一樣,還有企業的臨時飯卡。每天電腦一開,混跡在財務科的大媽大姐和銷售科的老煙槍中,吹牛打屁了解需求,把客戶模糊而多變的說法變為書面的內容給公司和國企確認;遇到各種問題上網、問朋友、做實驗,哪有什麼按步就班,一切以編出來為導向。

高強度工作大約10天後,風格慘不忍睹但經多次調試運行正常的程序接上了財務和銷售系統,銷售員到財務科來的辦事的時候,平推式印表機精準地吐出一張張多聯的增值稅發票,我順手還幫財務科改了一個漂亮的應收帳款分地區分級別報表,深受老阿姨們的喜歡,程序有小BUG的時候她們就不向科長告狀,而是直接向我抱怨,我默默改掉。科長問大家意見的時候,大家雙挑大指說:大海,OK!

開發結束基本按時結束,我背上電腦包晃出財務科的大櫃檯,看著三台辦事電腦顯示器上我寫的程序界面,聽著我程序運行時,平推印表機發出的吱吱聲,我覺得這程序算是踏踏實實為社會作貢獻了,這才是真正的入門。

這個感覺還不止一次出現過,我喜歡項目結束的感覺,喜歡別人用我程序的感覺,這也是我一直不斷寫程序的動力之一。
程序員的情趣在何處? - 知乎用戶的回答


遇到一個問題(不知道演算法,不知道怎麼實現或者bug)不再慌張,知道自己憑藉Google,Stackoverflow和各種其他資源幫助,就可以解決這個問題的時候,就入門了。入門是一種心態,你知道自己以後可以通過學習使自己越來越厲害,就是入門。否則就是在門外轉,轉來轉去轉很久,可能收穫卻很小。

推薦一下我的專欄,分享程序員技術面試題目的心得和套路,歡迎關注/投稿:總結我們刷過的演算法題 - 知乎專欄


我覺得是當你的程序寫完發現完全沒有bug,你會感到焦慮的時候,編程就算入門了。


如何對函數和變數命名;的確我還沒入門


看題主的標題,第一反應是想到關於用數學歸納法證明所有人是禿頂的哏:

如果一個人沒有頭髮,那麼他是禿頂
如果一個人有一根頭髮,那麼他是禿頂
如果一個有n根頭髮,且他是禿頂,那麼有n+1根頭髮,仍然是禿頂
歸納可得,所有人都是禿頂

同理,如果你還沒有入門,那麼多寫一行代碼,還是沒有入門。
所以無論你寫多少行代碼,都不算入門,從來沒有什麼入了門的程序員。
(不得不加句說明:以上只是個哏,請勿較真。)

我的意思只是想說,並不存在什麼一個概念,你學了之後,你就入門了。就算有人給你這麼一個定義,然後你去學了他說的那個,宣告自己入門了,也沒有什麼意義。

題主的困惑其實是:

沒頭緒。不知道從哪裡下手。

我的建議就是找本合適的基礎教程,從頭啃到尾,把裡面的代碼全部自己敲進電腦運行一遍。
你說看不懂書,那麼要麼是選錯了書,要麼是你看的方式不對。

做到這一點,我認為多少也會對一門編程語言有一定的了解了。至於之後是不是學了又忘,或者無法學以致用,那是另外的問題,與「入門」無關。相反,如果一本書也沒法看完,甚至看不了幾章,那肯定不算入門。

如果你學 python,或者不在乎通過什麼語言入門,那我這裡有「獨門秘方」,專治不入門:
Crossin的編程教室 - 面向零基礎的 python 入門教程

其他一些建議可參考 你是如何自學 Python 的? - Crossin 的回答

最後補充一句:沒有速成的入門方法


看到lisp之後


差遠了。。。。越學越感覺不會的越多


每當我做完任務覺得通關了的時候,結果就發現還有下一個場景

參考:


編程又不是為了考試,沒啥一定得掌握XX,YY,ZZ的說法。

編程是為了做東西。你能做東西了,那你就入門了。

但是總有你做不了的東西,所以你入門了還是得學習,才能做新的東西。

所以你編程的過程,就是不斷入各種門的過程。


看到這裡,明白了嗎? 事實上根本就不存在入門這種事情。 「入門」不是個證,也不是個標籤。 即便全世界的人都認為你已經入門了,又能如何? 你不會做的東西你還是不會做。 因為你具備了「已經入門」這個標籤不會帶給你任何額外的知識和能力

所以你問這個問題,「怎麼樣才算入門」是很奇怪的。這不就是讓別人用他們自己的標準來給你打分嗎?

「做xxx,如何才能入門」才能算是個好問題。

題主有現在的問題,是你總suppose編程的過程是;

  • 學習一段時間。出師! 然後我什麼都會了」
  • 如果之後遇上什麼不會的,那我一定是當時沒學好,再回去學一段時間
  • 回爐學了一段時間,再次出師,發現還有不會的。於是就迷茫了,問自己「我到底入門了嗎?」

用圖來說話,編程並不是:

而是:

關於學習編程的方法,之前我也做過一個回答,供參考。
iOS 開發怎麼入門? - aaaron7 的回答


很多次覺得自己入門了,然後就上github和stackoverflow看看,我覺得自己寫不出那樣的代碼,轉頭又拿起書。就是遊戲里只有普攻技能的人遇上大招暴擊那種挫敗感。


學會了遞歸


通過不斷的編程和學習,你發現自己打開了一扇門,這扇門背後是一個更為廣袤的世界,而你發現在這個世界中是自己是那麼渺小。

所以,有沒有入門,你自己會知道的,如果還不知道自己有沒有入門,那就是沒有入門。


一開始掌握了某個語言語法以為算是入門了。

後來前後移動端都掌握了,能做全棧以為算是入門了。

再後來以為能模仿出一些主流應用算是入門了。

現在,能用自己喜歡的語言能實現自己大部分無厘頭腦洞的奇葩想法,應該是入門了吧……

可是從以往來看,到頭來總是學無止境,從未入門吶。


當與人對噴的時候,不用心虛的偷偷摸摸Google的時候


學會變數,順序結構,條件結構,循環結構,子程序,會(編譯)運行,會跟蹤就算入門了


當年開始看四人幫的設計模式的時候,並且發現自己在看這本書之前已經用Tcl/Tk擼過很多設計模式的時候,覺得算是入門了。

請原諒我剛工作是用的是Tcl/Tk,其實之前我還寫過C++/C#/Java以及ASP很多年,包括我高中就學了數據結構和演算法,包括寫過一些很實用的,為自己目的服務的小工具,但那些,真心覺得是在門外玩。


推薦閱讀:

程序員必須掌握哪些演算法?
為什麼點贊手速過快會出現計贊 2 次?
零基礎自學 Android 並去找工作可行性大么?
「傳輸自動生成代碼並執行、生成所需文件」能否成為未來的下載方式?
在 GitHub 上保持 365 天全綠是怎樣一種體驗?

TAG:編程語言 | 編程 | C(編程語言) | Java 編程 | 自學編程 |