天天看點

如何學習C語言?

很多剛入職的新人,都喜歡問一個類似的問題:“如何學習……?”,然後一些朋友就會給拷貝一大堆書籍資料,更熱心的還會指導先看哪本在看哪本。

但不幸的事,很多時候就截至于此了,一大堆資料依然靜靜的躺在電腦硬碟裡,隻是在偶然的情況下才會打開翻看兩眼目錄。

走過一些企業,教育訓練體系一般是這樣的:

1、新人入職後,師傅會給一堆資料讓看,然後新人硬着頭皮看一些;

2、哪天師傅不忙了,惦記起這個新人,然後交給其一個産品,讓其折騰;

3、可惜具體産品一般都涉及多個學科,面對一大堆疑問,新人會感覺騰雲駕霧般難以前行;4.一段時間後部分人邁過了入職時的絕望懸崖,有了自己的積累,開始慢慢的深入接觸産品,但因各種文檔資料奇缺,隻能一邊學習一邊調整;

5、數年後,新人成為了老手,同時新的産品體系也誕生了;

6、然後重複以上死循環。

長此以往,公司的産品體系變得非常的雜亂,技術難以複用,無法進行有效的積累,那種如臂使指的團隊建構更是空談。

如何才能跳出上述死循環呢?我在自己的職業生涯中進行了大量的探索嘗試,有了一點感悟:不僅需要将新人的教育訓練工作盡可能前移,盡可能體系化,而且要盡早的融入我們的設計及團隊理念。是以在後續的三個C語言例子中大家會體會到很多東西不僅僅是C文法層次的内容。

前面我談到,在公司,不可能在重複學校的填鴨式的教育模式,也不會有人手把手的教你。那麼在這種情況下,如何組織教育訓練工作,很多時候反而成了一件頗具藝術感的選擇難題。

随着移動網際網路的盛行,線上教育也流行了起來,網絡上出現了大量的視訊教程。緊随時代的脈絡,我嘗試過将入職需要學習的内容做成書籍和視訊,但效果一般。後來細細研究這個領域,發現大多數視訊僅僅是将大學課堂的内容移到了網絡上,很多人也僅僅是耐着性子看個幾集,然後就不了了之了,是以導緻的效果不佳。關于線上教育我也有一些自己的想法和思考,後面會專門撰文描述,這兒就不深入介紹了,總之,初期的嘗試是不太成功的。

C語言第一個例子:需求不明确

第一個例子:“編寫一個控制台程式,已知内層和外層菱形的高度,輸出一個空心菱形”。

是否看上去很簡單啊,寫到這兒,很是期望正在閱讀的你能先停下來,思考思考,然後付諸行動,編寫幾行代碼小試一番,然後在繼續讀下去,收獲會更大。

這些年,我帶過很多人,大部分人看到這個題目後,然後立即就開始寫程式去了,自己内心多少有點小小的失望,為何?

一般通過公司層層把關招聘進來的軟體人員,這個例子總是可以弄出來的,不過可惜的是,近一半以上的人不能準确的實作出來,僅一個菱形高度的了解,就是五花八門,亂七八糟的,執行如這樣的:

或者這樣的:

或者幹脆是這樣的:

為何會出現這種情況,這恰恰是該例子的第一個大坑:需求不明确。一開始就碰到挫折,對很多新人來說,這無異于當頭一棒,不過記憶也最為深刻。

一個團隊協作時,會存在大量的交流,而交流過程中,總是會産生或多或少的歧義,而恰恰是這些歧義會導緻需求的不明确,會導緻大量的返工,甚至會導緻項目的失敗。我給新人的第一份建議:将需求用自己的語言表達出來,和對方确認後再實施。這一點在以後的團隊協作中非常的重要,是以我早早的将這一點嵌入到了入職教育訓練中。

經過這麼一折騰,第一個例子重新描述如下:“寫一個控制台程式,使用者輸入内層和外層菱形的高度,輸出一個空心菱形,菱形的高度定義為菱形的上三角形的高度,如輸入5和3,輸出如下:

這兒稍微補充兩點:

1、菱形高度定義好似有違常理,但在程式設計的世界中,簡潔就是常理,如果定義為整個菱形高度,那麼不僅需要進行正整數判斷,而且還需要奇數判斷,增加了程式的複雜度。

如何學習C語言?

2.、用一個例子描述,比一大堆文字管用多了,是所謂一圖頂千言。

明确知道要做什麼了,然後很多人又回去,然而很多情況下執行結果确超乎意料。

這兒引出了第二個很重要的概念:邊界判斷。給出兩個數,如何簡潔且完備的判斷其是合理的輸入,這是程式設計的基本功,這些内容在大學教學過程中一般不太重視,但想做出合格的嵌入式産品,這一點必須引起足夠的重視。如何做出優雅的邊界判斷,這個例子比較簡單,留給正在閱讀的你吧,順便回頭想一想我前面菱形高度的定義吧。

第二次被打道回府後,很多人會有急躁情緒,菱形還沒輸出呢,就給灌輸了一堆規則。碰到這種情況,我會給他們講解嵌入式程式的特點(這一點留待後文慢慢描述),以及我以前的經曆。我剛開始工作時,因CPU速度受限,程式還主要是彙編語言,上司讓寫一小段彙程式設計式,但每次送出後,都被劈頭蓋臉的罵一通,讓回去整改,直到後來一行彙編語句都省不下去了,才算通過了。回頭看,為了一個小小的例子,竟然将大多數彙編指令熟悉了,方才明白上司的良苦用心。現在的新人臉皮薄了一些,不敢亂罵了,隻好慢慢講道理了。

經過第二次的折騰,大部分新人态度都能稍微端正起來,而且這次寫出來的例子,和需求基本吻合了,但當興緻沖沖的跑過來交差時,我反而不看程式,開始問起在實作這個程式過程中用到的調試技巧。

繼續閱讀