當你寫幾萬行代碼時,你在寫什麼?

今天上課,老師跟我們說寫上10萬行代碼,就可以找到不錯的工作了;請問各位大大,【大學期間,大家都在寫什麼完成代碼量的積累的】,我現在是準備敲C++primer上的例題?


10-200行代碼-&>終於把框架搞定了/工程建好了, 配置了一點相關的東西, 做了一點微小的工作

200-1000行代碼-&>爽

1000-3000行代碼-&>在享受創造的快感,為實踐人類歷史上最偉大的智力密集型工作(實際上並不是)感到自豪

3000-5000行-&>無腦的實現一些輔助的功能,有點厭煩了

5000-6000行-&>開始反思自己之前寫的函數,類,介面。伴隨著一系列抱怨和髒話

6000-6500行-&>開始反思設計模式,代碼結構,邊界檢查等等一系列東西。開始用一些比較低級的手段修補問題

6500-7000行-&>發現之前的代碼裡面有重大失誤,開始不斷的罵人

7000-6500行-&>ヽ(#`Д′)?ヽ(≧Д≦)ノ (╬ ̄皿 ̄)凸

(╯‵□′)╯︵┴─┴

6500-7000 天啊我不想繼續下去了啊(>﹏<)

7000-9000 沒有添加任何新的功能,在修補之前的代碼,添加(必要和不必要的)邊界檢查。用try和catch把搞不明白道老出錯的東西包起來

9000-10000: 把整個代碼封裝起來, 幹掉經常出錯的部分,細心的定義一些介面並幻想著再也不改動這些代碼了

10000-10500行代碼-&>開始寫程序的另一個,與之前不大相關的部分

10500-11500行代碼-&>爽

11500-12500行代碼-&>感覺這是逸種循環,經歷了之前的苦難終於又可以爽了

12500+ -&>卧槽,之前的api 有毒!

程序員卒

以上代碼行數用c++計算,Java 黨請自覺乘3,Lisp黨請除以42。


一個小的C語言容器庫就5000+行

一個完整的C++庫,比如輪子叔的vlpp,130000+

一個勉強能用的C++GUI庫,比如輪子叔大學時期封裝的一個Win32界面庫,10000+行

一個能用的客戶端應用,最近用C#寫的某簡陋網盤客戶端,3000+

差不多就這個量級


2-8原則。

80%的精力和代碼量,用來處理那些很少會發生,一旦發生要收拾起來確很費力的事情上。

舉個例子:

網路通訊,send/recv誰都會,100個培訓學校出來的畢業生,有80個聲稱會做多人在線聊天系統。

教材里的例子,都是以recv會block,send不會為假設,來書寫的。

然而真實世界中,send這個API也會block住,

為此就要配套增加 "待發送消息隊列/專職消息發送員" 等機制來處理。

儘管,在大部分情況下,那一大堆機制,和一句簡單的send() API沒啥區別。

但是作為職業程序員,必定要寫那一大堆機制,而不是一句send() 完事。


坑.

10萬行代碼里應該包含了各種類型的坑.


代碼量這玩意,不光得看量,更重要的是質。你想想,一個hello world複製10萬行,對你能有啥好處呢?

大學期間積累代碼量,我個人認為要從廣度和深度兩個層面去入手。

廣度是指,各類語言、各種不同類型的程序,你最好都寫一點。許多東西,不去寫一寫是很難建立一個直觀印象的,而寫過的話,即使寫的東西再簡陋再爛,總歸會有不少收穫。每當學到一個新的領域,動手寫一寫實踐一下是非常好的選擇。

我從大一到現在大四寫過500行以上代碼的語言至少有C, C++, Java, Python, Ruby, Lisp, Haskell, Bash, Makefile, verilog, Lua(有可能還有別的不過沒印象了),寫過的程序類型包括演算法題、CPU、維護Linux的雜七雜八的小腳本、編譯器和解釋器、桌面應用、爬蟲、Rails網站、殘缺的系統內核、很渣的命令行遊戲(沒錯,就是貪吃蛇)、WM的複雜配置文件、pretty printer庫、parser combinator庫、各種數據結構庫、某些公式的自動推導程序、五子棋AI、聊天室等等。我寫的這些東西,有很大一部分都是非常簡陋的玩具級練手程序,可是在寫完之後,對於那個領域面對的問題、大概的解決方案之類多少會有一些更深刻認識。代碼量在廣度上的積累,其實就是在拓寬視野。

深度則是在某個特有領域的不斷磨練。深度上的積累主要靠不斷地在某領域裡造輪子,且輪子要越造越複雜。在造輪子的過程中,你會面對一個接一個的麻煩。每搞定一個你就在深度上更進了一步,就離成為該領域的大牛又近了一步。你的最高技能水平往往是在這個過程練成的。

從大一到現在為止,我寫過的程序大概有5w多行,其中有將近2w行都是各類編譯器(早知道我2014年9月才接觸到編譯原理)。以我目前寫代碼的速度估算,大四畢業時我至少還能再寫1.5w行和編譯器相關的代碼。毫無疑問,這些代碼量會讓我對編譯器有著非常深刻的理解;同時,我最擅長的技能是寫編譯器這也是理所應當的。

從時間上來說,首先進行的是廣度上的積累。只有在碰觸各個不同領域,對它有了一些非空想的理解後,才可能找到真正的興趣。如果只是跟著大學裡的課程走,這個過程大概需要2~3年。如果你覺得這個時間太長了,那麼你可以通過自學來提前接觸更多的東西。自學什麼這個問題可以參考程序員三大浪漫。

通過廣度上的積累發現興趣之後,要做的就是不斷學習不斷練習了。我的建議是多學,然後才是多寫,這樣的效率往往比埋頭苦寫遇到問題再去學習高一些。後面就比較枯燥了,基本就是看書或看論文——寫代碼的無限循環了,所以一定要找到真正的興趣再投入,否則很難堅持下去。

如果不幸地沒有發現興趣。。。。那麼或許可以找一個好找工作的領域去好好磨練一下┐( ̄ー ̄)┌


你們老師其實說得有一定道理,多動手,多動腦,這才是正道!!

不過你們老師漏了一種情況就是,這十萬行不能是XML啊!!


libDullyDesignedCPP


你學會了Rails,並不用寫多少代碼也能找工作。

就是這樣。


瞎寫


天天關心代碼行數的 基本都是HR

第一這東西沒人記得住 沒人有概念

說白了你問一個人 你一共創建過多少個文件 你看誰能答出來 這都不知道你TM是怎麼知道你寫過多少行代碼的?

基本上,大家都是胡說。對面就跟著裝懂的點頭。其實是完全沒有意義的對話。真蛋疼的去自己統計的,有幾個?

第二這東西沒法衡量 大一孩子普通程序都能寫成大型程序 工業界其實更多暴力解法的code。

第三你工作後很多時候是需要思考很久,然後十幾行代碼解決問題的

當然你可以說只說滿意代碼,不過能問出這樣問題的人,你敢往少了說,他就敢拿這個把你刷掉。


shift v Ctrl d d d y p


上大學的時候寫過一個基於 MIT 6.828 JOS 的支持 Intel VMX 和 AMD SVM 的可以在實際機器上啟動多個 Linux 的 Toy Hypervisor,大概有兩三萬行 C 和彙編的樣子;還用 Java 寫過一個簡單的編譯器,大概只有 8000 多行的樣子。我覺得關鍵不在於堆代碼的絕對行數,而在於堆代碼的過程中對知識的深刻理解和獲得的解決複雜問題的經驗。


今年6月份,10多年的c++技能和桌面開發全部歸零。

從頭開始學OC,全職以實際項目需求的方式寫代碼,

當然都是淺嘗輒止,1個來月,20000多行源碼下來。

之後人員齊備,我已經可以對著他們的代碼指手畫腳了。

軍隊裡面有句話,神槍手都是用子彈喂出來的,

同理,好的程序員也是靠代碼喂出來。


我不生產代碼,我只是bug的搬運工。


把幾萬行掛在嘴邊的,基本上是業務代碼。


曾經大學時期寫的一個 AVG 引擎:nekocode/FScript0.15 · GitHub

單個項目的話大概只有接近一萬,但是衍生出的其他項目加起來估計就有好幾萬了,當時的感覺就是 書中看到的東西永遠都不如真正實踐一次來的實在 而且寫的是你感興趣的東西的話,更容易帶動你去思考。

順便提一下,其實大多數對遊戲感興趣的人,在大學階段都可以去嘗試下寫些簡單的遊戲,甚至是 Game Engine ,開發一個 GE 所需要學習的知識太多了,例如 數學知識,三維空間知識,渲染技術,演算法,語法解析,GPU 編程 甚至 簡單的平面設計 等(參考:遊戲開發的編程算不算是 IT 行業中難度最大的? - 程序員)

從遊戲編程領域轉到其他編程領域,很大程度上也會讓你看事物的角度也發生改變,特別是轉到前端開發上~ 你能理解大致知道程序 UI 是通過哪些步驟最終渲染到屏幕上的,對 Render 這個詞也變得有特殊情感了

總而言之,你老師的話 大體上是沒有錯的,代碼寫得越多,你與機器就越親近,越能理解如何通過語言與機器溝通。


for (int i = 1; i &<= 100000; i++)

{

printf("char *code%d = "hello world!";
", i);

}

看著屏幕刷刷刷的工作,一分鐘後10萬行代碼成就達成。


寫bug


一些回答都在討論寫10萬行等同於寫10萬行重複或無意義代碼,這樣鑽牛角尖真的好嗎?

不討論高精尖與高大上,普通的練習代碼,個人體會,可以分為三類。

第一類是演算法與數據結構,我以前的方式是先看描述進行理解,然後直接按照自己想法實現,然後對比參考實現的代碼進一步理解。

第二類是基於興趣的代碼,這類大部分與工具平台有一些關係,每隔一段時間規劃一個這樣的項目,規模需要合適且找到成就感。就我在N年以前來說,會做一些智能五子棋,俄羅斯方塊,基於哈夫曼編碼的壓縮軟體,簡易木馬,簡易郵件收發客戶端等等。這些小的興趣項目大多數基於某個啟發然後再去找資料解決若干問題,成為自己的東西。比如做郵件收發是因為看了stmp與pop協議,其餘就自己構建;壓縮軟體是看到哈夫曼編碼,於是想實踐應用;木馬是發現socket編程可以有很酷的應用等等。

第三類是實際的工程項目,這類可以通過實習或兼職或承接小項目實現。此類項目大部分並不有趣但平台工具熟悉/團隊合作/收入/職業規劃等有很大幫助。


大學期間並沒有去刻意刷代碼量,最大的還是實習的時候一個月3000行C++,寫了快一年。千萬不要刻意按照代碼量來衡量,一個業務代碼可以寫的非常長,但是對技術提升並不大。


推薦閱讀:

有什麼現有函數,輸入是一個單詞變式的字元串,如複數,過去式,現在進行時等,輸出這個單詞的原型?
如何評價開學季知乎上大量出現C/C++新手問作業題?
為什麼有些人罵 C++,如 Linux 之父對 C++ 進行了炮轟,說它是糟糕程序員的垃圾語言?
C++中if(x==8)和if(8==x)有什麼區別?
有什麼像a=a+b;b=a-b;a=a-b;這樣的演算法或者知識?

TAG:程序員 | 編程語言 | 編程 | 計算機科學 | C |