從接觸編程到工作,你們對編程的認識是一個怎樣的變化過程?


澄清一下,文中對前端的錯誤認識是幾年前了,而且可能我見到的確實是那個樣子。現在還是很膜拜前端大牛的。各位勿噴。

===================+=============

這道題好好答一下。

我今年6月份剛畢業,但是實際上已近工作了1年多了。我是大一的時候才接觸編程,上C語言課的時候覺得寫代碼這東西沒啥難度么。就是實現一些什麼交換變數啊,找最大值的這種弱智問題。後來,我很幸運的進入了校內的ACM集訓隊。大多數ACM題目都是非常燒腦的,而我恰巧數學又爛,思路也慢,導致搞了兩年多才拿了一個銀獎。對編程一度失去興趣,覺得自己真特么不適合干這行。那時候才疏學淺,見識也短,覺得只有把演算法寫好,做出眼前的這道題目才算是真正的會編程。這裡並不是說我覺得ACM不好,相反,迄今為止,我仍然覺得兩年的ACM經歷對我的編程生涯起到了很重要的作用。不說別的,編碼基礎是有一個很大的提升的。

退役之後就想著學點啥以後才能找到工作。周圍一些沒進入ACM的人,很多都已經把WEB搞的風生水起了。我那個時候是非常鄙視前端的,因為我總是看到一些人寫前端代碼的時候,大量的copy和paste。我不太喜歡這種寫代碼的方式,或者說我更喜歡造輪子。在找工作之前,我學過安卓,搞過MFC,啃過C++ PRIMER,說實話,接近一年的時間,對編程一點感覺也沒有。

大三的暑假,開始招實習。找了一圈,最後敲定了金山軟體。職位是金山毒霸的研發實習生。這對我一個雙非學校且能力又不怎麼樣的本科生是一個不錯的機會。進入公司之後,我發現,工作中需要用的東西,要全部重新學。之前搞ACM留下來的把所有的代碼都寫在main函數裡面惡習也在導師的帶領下一點點的改過來,懂得封裝,抽象。這個時候對編程最大的感覺就是,不但要把代碼寫出來,還要寫好,寫漂亮,寫的可維護。

金山實習的後半段,日常的編程工作已經成了複製和粘貼,每天都是無聊的寫gui,一點意思也沒有。總覺得編程是創造的過程,而不是複製。然後,毅然決然的從金山離職,來到了七牛。

在七牛工作期間,我開始慢慢懂得,編程表面上看起來是一種術,但其實是道的體現。編程能力的強弱不在於你學了多少的技術,而在於把一個問題交給你,你能否在有限的資源下解決它。我現在覺得,編程更多的是一種做事或者解決問題的思想。我感受最深的就是,和非程序員交流和辦事的時候,我的頭腦中潛移默化的用編程的思路和方式在處理一切。雖然有好有壞,但是我覺得目前的狀態讓我對編程有了一個全新的認識。相信之後還會有變化。

幾個月前,我認識了一名交大的朋友。在他的博客中我看到過類似這樣的一句話,讓我覺得很有道理。

四年的計算機本科生涯並非去教會你一身找工作的本領,而是在傳授你一套學習知識解決問題的思維方式。理論上來說,CS畢業的學生可以效力與任何職業。


一開始覺得大公司的人都好牛逼,啥都會,啥都懂這麼多。

後來過了一兩年發現…不過如此,80%以上的人都在寫ifelse,沒有創新,不學新東西,甚至連ifelse都寫不好。


小時候:c好屌啊,寫起來就像寫英語

稍微大一點:python好屌啊,寫起來就像寫英語

再大一點:英語好屌啊,再也不碰nlp了啊!

//TODO fix this

小時候:學毛線java

稍微大一點:學毛線python

再大一點:學毛線

//TODO FIX THIS!!!

小時侯:我要自己寫自己的library

稍微大一點:把別人library拼起來就好了

再大一點:直接抄別人代碼就好了

//TODO FIX THIS NOW

小時候:我寫的程序絕對不會有bug

稍微大一點:這個bug不想修了

再大一點:這是feature,滾

//TODO if you don"t fix this, it will backfire on you

小時候:我代碼簡潔不需要注釋

稍微大一點:我tm寫的這是啥

再大一點:什麼垃圾代碼,哪個傻逼寫的ヽ( `д′*)ノ

//TODO if you don"t fix this, it will explode

小時候:我要當黑客

稍微大一點:其實研究一下信息安全就好了

再大一點:我就想乖乖當個碼農

//TODO I know you can"t see me, but please fix this

小時候:我要寫個貪吃蛇

稍微大一點:我要寫個MMO

再大一點:寫個hello world就行了

//TODO if you fix this, you will be promoted

小時候:這個看起不難,我做好了發給你

稍微大一點:這個其實挺麻煩的,你多少請我吃頓飯唄

再大一點:不會,滾

//TODO fix this for a kiss from Katy

小時候:我不但懂軟體還懂硬體

稍微大一點:我只會寫程序,硬體不熟悉

再大一點:我只是搞理論的,不會寫程序

//TODO Ok, I lied. Nobody here knows a girl named Katy, but can you just fix this, plz

小時候:linux就是屌

稍微大一點:mac就是屌

再大一點:都什麼什麼狗屁os還不如windows呢

//TODO sir, I"m dying, please fix me

小時候:要買最貴的電腦

稍微大一點:要買性能最好的電腦

再大一點:買好看的

//TODO fuck you, programmers! fuck you all!

小時候:我要找個漂亮女朋友

稍微大一點:我要找個女朋友

再大一點:我要找個(女?)朋友

//分割線

轉眼100個贊了,承蒙各位錯愛,在下不勝感激。還是說點正經的吧,我這個人說正經的東西大家都不太喜歡看,所以如果不喜歡的話看到這一行就可以了。非常非常感謝各位的時間與耐心!

我剛開始編程的時候,本來是覺得黑客技術好酷炫,要是我也能成為一個黑客就好了。那時候什麼都不懂,沒有健全的人格,也沒有完善的知識體系。生活中也遇到了各種各樣的挫折,然後面對了一個選擇:大學要選什麼專業?

我不是一個聰明人,數學什麼的一直不是我擅長的領域,雖然現在的我也是數學計算機雙專業本科畢業的,但是數學對於我來說,就跟黑客的幻想一樣遙不可及。「我熱愛數學,可是數學愛的是別人。」我這麼自己騙自己。

剛剛接觸編程技術的時候,我並不理解「我是誰,我在幹什麼,我寫的是什麼東西」。其實花了大概兩年三年的本科學習我才明白了現在我奉為真理的一句話「編程就是為了把重複出現的流程自動化」。

但是當時的我,面對那個選擇的問題,我對一切都一無所知。我只知道一件事「計算機是我學習經歷里唯一看到新內容不慌的東西」然後我就傻著個臉選了計算機玄學。我幻想著學學如何編程,以後就可以當黑客了。

後來慢慢的,我發現,計算機玄學根本就不講如何編程啊,什麼鬼!總之我也硬著頭皮活到了本科畢業,在逐漸學習,了解編程的過程中,與黑客夢想漸行漸遠,成為了現在這個鬼樣子。

這個過程中,我的轉變很大,我曾經自詡掌握一點編程技巧,覺得看別人都高人一等。到現在,真正見識過了各種各樣的人以後,我發現我智力有障礙。

曾經我以為編程就是非常簡單的一個把「重複流程自動化」的過程,直到我經歷了各種各樣硬體、軟體、數據量、用戶需求、用戶行為、用戶智商的限制,才發現重複流程自動化的水其實很深。

我不再認為編程是「是個人長個腦子就能學會的東西」了,我開始承認「不會就是不會,不丟人」「每個人擅長的領域不同,我並不比任何人強」。我學會了不要輕易斷言,除非你能證明你是對的,或者你能用你的方法解決問題。

我認為學習編程的過程,對於我整個人生是一種提升。而我對編程的看法的轉變則在於,一開始我是相信鄙視鏈的,我寫assembly就是比你寫c強,我寫底層就是比你寫應用強。到現在,大家只是分工不一樣,一個程序需要我也需要你,任何一環壞掉了這都不是一個好程序。從一開始我相信,我一定能寫出最好的程序,到現在我承認你寫的比我寫的好,謝謝你的努力與創意,希望我能在你的工作的基礎上完善整個項目。從一開始我相信寫程序就要用什麼什麼操作系統,用其他操作系統的都是智障,到現在你喜歡哪個平台就用哪個,舒服就好,寫出來好程序才是最重要的。從一開始用vim鄙視ide,到現在覺得只要這個工具能幫助我簡化流程,用就好了。從一開始為了面板數據買alienware,到給我一台機器我就能創造一個世界(這個還到不了)。

這個過程我發現了更多關於編程、關於計算機本身的東西,像是computability, complexity, polynomiality, NP hardness這些理論。像是用戶需求,產品質量,代碼可維護性這些和應用息息相關的東西。還有一些計算機的細節方向的理論比如learning, graphics, algorithm, compiler, DBMS。而不是一些非常片面的表象:系統,語言,IDE,面板數據。本科的學習帶我探索到了編程更深的一個層次。

以至於再拿到什麼問題,我不會再像個蠢貨一樣(雖然我還是蠢貨)直著個臉然後滿嘴跑火車。而是開始漸漸分析問題,提出方案,改進方案,實現方案,評估結果。然後再滿嘴跑火車。

總之就是,我還是之前那個蠢貨,但是我現在知道自己蠢了。


編程其實就是想辦法解決問題。其根本之道與萬事萬物都是相通的。


自己玩的時候,屁點大的數據,代碼邏輯可以各種花哨;

到了公司,邏輯看似變簡單了,但是你就要考慮為了讓伺服器一秒能承受多少的並發量,你需要加緩存,加反向代理之類其他架構(你想想淘寶只不過是簡單的crud,幾億人同時進入系統,你如何讓你的服務經得起虐)

所以,簡簡單單的echo伺服器,放到高並發的系統中,這個問題就不僅僅是代碼層面的問題了;一個簡單的爬蟲,如何在最短的時間內爬去上百萬的頁面;一個簡單的聚合,如何在大規模數據中快速計算;只有在一定規模的公司才有可能接觸到這些有趣的東西


四年級開始編程……現在碩士即將畢業。

期間搞過各領域亂七八糟的技術。

開始的時候,學過多種編程語言,各種語法,前後寫過二三十種語言,當然,只是說語法本身,並不包含各種庫,框架……

這個階段,感覺編程像一門外語,可以給計算機下命令,讓他幹活兒。

然後,學數據結構,學演算法……NOIP,ACM/ICPC這種比賽也去打過醬油。

這個階段,感覺編程像是工具,解決現實問題,避免人工計算,節省勞動力。

後來學一些比如面向對象設計模式,關係型資料庫的範式,各種比較火的框架的架構……

這個階段,感覺編程像是一門藝術,把一個大的問題庖丁解牛一般,有條不紊地解決,是理性的優雅。

再後來,學範疇論,抽象代數,可計算性,複雜度……也接觸了很多其它範式的編程語言。

這個階段,編程是一門哲學。編程描述的是物件與物件間的變換……離散世界的本源之理。


編程是寫代碼--&>編程是邏輯的組合

解決問題就是解決問題--&>解決問題的一半是定義問題,另一半是解決問題


有一種模仿上帝造物的快感。


原以為計算機是理學,多年後才明白這貨競是工學


小學——照著書敲,

初中——照著大犇敲,

高中——照著oj敲(巔峰期,關屏幕生擼快排無壓力),

大學——照著實驗數據敲(學的專業是過程裝備與控制),

現在——照著github敲


剛開始覺得C語言好牛,各種計算理論好牛,後來覺得卵用沒有,站在更高的肩膀上才能站得更更高;

剛開始覺得一個功能一定要用優美的方式實現,對別人的代碼也是吹毛疵,後來覺得能跑的代碼都是不差的代碼;

剛開始覺得計算機底層好厲害,後來發現底層沒什麼搞頭了;

剛開始好鄙視那些搞研究的人,後來發現這些人好牛;

剛開始覺得黑客好牛,後來發現黑客們都搞安全去了;

剛開始藐視前端,後來發現專業的前端也是遙不可及的存在;

剛開始覺得無視各種大數據之類的概念就是純炒作,後來發現這些東西確實影響著現在和未來;

剛開始沒想過程序或軟體怎麼賺錢,後來發現要通過程序或軟體去賺錢好難;

剛開始是一個蠢萌的小正太,現在是一個蠢宅的墮落大叔。


ctrl+c ctrl+v


大學開始接觸感覺好難,什麼鬼全是英文。我這種渣渣估計一輩子學不會了吧。

然後培訓班,就是這樣子啊,挺簡單的么。在培訓班天天被老師鼓勵,感覺自己就是編程的天才。

工作後,什麼鬼這是什麼東西,我這是寫了一堆什麼。 不說了我要去寫bug了。


現在還沒有畢業,沒有工作,在大一。

最開始在初中學過Python,那時候還在用諾基亞的塞班手機,Python在塞班上非常火的,在論壇里很多軟體開發者都用Python寫軟體,解包sis,改主題,改軟體icon等等好多軟體。我最開始沒想去學,但是越來越多的軟體出現,我想知道這些軟體是如何工作的,就想學Python。

Python是我接觸的第一個編程語言,但是沒學多少就初中畢業了,高中放棄了三年。Python學會的也沒多少,並沒有任何接觸系統底層的東西,感覺Python這個語言非常好,對字元串,list,dict的調用,修改都非常方便。

到了大一,開始學c,習慣了Python感覺把非常難用,像一維數組不能修改個數;字元串需要用一維的char;更變態的是每個語句都要加一個分號,不像Python那樣,換行縮進就行;需要先編譯在運行,而Python方便到可以在解釋器里寫一句運行一句。

當然現在適應了這些。

但是這其中學到了一些東西,知道了很多系統底層的原理。比如c中的一維數組不能修改個數是因為已經在初始化時候指定了要佔用的內存,Python只教會了我怎麼寫代碼。要做一個好的軟體開發者,必須要知道系統的最底層是如何工作的,這樣才是一個合格的軟體開發著,我不希望別人給我一個api拿過來用。


第一份工作,聽老大說所有的開發,歸根結底就是從輸入如何得到輸出的過程。一瞬間醍醐灌頂,覺得整個世界清晰了。

然後我倆第二年同時離職了。。。。他去了IBM,那時候一直希望自己能在他手下好好歷練一番。


讓我來,我認為題主的意思是從接觸編程到靠這門手藝生存的心路歷程。

想必大多數coder和我一樣剛學的時候完全是出於興趣,不然每天面對枯燥的代碼真的很難讓人堅持。隨著沉澱的知識點增加,開發的能力自然也會提升,但瓶頸期會出現,有更高追求的coder會更加註重架構,追求小而美,愛簡潔等…,其實這是一個很自然的過程,細想就會發現其實這和學習其他專業沒有什麼不同。

其實寫代碼於我而言是一種享受,一直都是!

很慶幸自己從事著自己喜歡的職業。

就這樣。


現在還記得大一各種寫小學時候學的算數題,寫來寫去沒發現什麼用,大三時候接觸安卓開發,自己寫app,運行自己寫的應用,成就感油然而生,發現編程真的可以實際有用了。工作後做安卓系統軟體開發,看到幾個g大小,上萬個文件共同支撐起一個手機的軟體系統,看到了軟體系統的層次結構,makefile的編譯方式,每個模塊中數不盡的if else簡單又全面的邏輯判斷,協調不同硬體不同晶元共同工作的配置文件,不同模塊項目的宏控,儘管我對它們力不從心,解bug又慢又笨,但是它們給我一個努力的方向,讓我感受到了編程真是了不起的事。


剛開始學的時候會把問題弄懂再寫,現在是寫了就寫了,不管懂不懂,問題解決了就扔到一邊了。


總的來說就是由淺入深

1:最開始關注的是語法,是程序本身,是程序的行數:入門級

2:漸漸的開始關注程序的設計:初級

3:有了一定的開發經歷後開始關心架構的設計:高級

4: 關注問題本身,抽象成邏輯問題或者數學問題:專家級


學編程之前:這工作一定很枯燥

學編程的時候:好像也不是很枯燥

工作後:累……


推薦閱讀:

為什麼C語言的Hello,world都是用printf輸出而不是puts?
C#與VC++在桌面軟體的開發比較?
一行 JS (以分號結束)能實現什麼喪心病狂的功能?
Matlab求一個矩陣中所有元素的平方和,兩種循環寫法為什麼性能相差很大?
C 語言指針的指針和二維數組的區別?

TAG:前端開發 | 程序員 | 後端技術 | 編程 | 計算機 |