1. 程式人生 > >你肯定學了假的程式設計

你肯定學了假的程式設計

更多內容關注公眾號:SAP Technical

很多人開始學程式設計的時候都會有一個疑惑,我到底該學什麼程式語言?參考的依據要麼來自“磚家”、要麼是來自熱門語言排行榜、要麼是來自薪資排行榜等。殊途同歸,所有的人都會給出他們的依據和這樣做的利弊。如果說一開始這樣還可以理解,但是我們發現很多軟體工程師、或者計算機專業畢業的人、甚至是從事軟體研發工作的人每隔一段時間都會來這麼一次內心掙扎的過程(那些靠一門語言就像混到退休的人除外)。

隨著人工智慧越來越火,很多人開始意識到程式設計的重要性,也想要找到好的入門祕籍。針對這一問題,我給大家普及下。程式語言要怎麼選。

其實很多學計算機和程式設計的人其實不懂程式設計,其實程式設計沒有你們想象的這麼深奧,程式設計的基礎其實是計算模型(這個我們以後會將,如圖靈機、遞迴論、Lambda演算等)當然還有細胞自動機。。。 如果你不懂計算模型其實你是學不懂程式設計的。因為程式設計依賴計算模型。而且程式設計和程式設計過程又是兩個截然不同的東西。程式設計體現的是一個概念而程式設計的過程體現的是一個動態的尋找解的過程。

程式設計的過程其實也是思維活動的基本過程,所以程式設計活動本身要訓練的其實是人的思維過程。它會間接影響一個人的思維模式。所以學程式設計最終的目的一個是學會程式設計的技能(這個是大多數人學程式設計的目的)但是最重要的其實是學會用一種新的思維方式(分析問題、解決問題的能力)。人類改造自然的基本過程也是人類文明發展的必然結果,而人類改造自然的基本過程是建立在人類這個種族利用已有的知識結構對現實世界進行建模並且用人腦特有的計算模型去推演最終執行反饋到現實世界從而改造自然創造出人類璀璨的文明形態。這個和程式設計的過程是不謀而合。

我通過分享一個例子來給大家解釋下前面這些話的意思

氣泡排序(Bubble Sort):作為計算機演算法裡面最簡單的排序演算法(該演算法的時間複雜度是O(n²)屬於穩定排序演算法)

這個演算法的描述:它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從A到Z)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“氣泡排序”。

原理如下:

1、比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

2、對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

3、針對所有的元素重複以上的步驟,除了最後一個。

4、持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

這個演算法涉及到兩個基本過程(遍歷其實也可以叫遞迴、條件)

我們先用人類的語言來程式設計

如何把一個隊伍按照從低到高排列(你要按照高到低也是可以的)?

1、比較相鄰的兩個人之間的身高,如果後面一個比較矮就讓他們交換位置。

2、對整個隊伍裡面的每個相鄰的人都做同樣的操作。從開始第一對到最後一對,這個步驟執行完畢,隊伍的最後一個肯定是最高的(但是整個隊伍現在還沒有按照從低到高的順序排列,想一想為什麼?)

3、對隊伍裡面的每一個人都做上面1、2步所做的操作,除了最後一個。

4、持續對越來越少的隊伍重複上面的步驟,直到隊伍裡面所有的人都比較過了。

然後你就得到了一個從低到高排列的隊伍,時間最短而且不需要一個人站出來指揮排隊的過程。

其實這個問題你不用學任何演算法也不用懂任何排序你都可以做到,區別就是如果你學過程式設計那你會找到最快的方式做到這一點。

接下來我們展示一下其它語言是如何做到的

Python3

C

彙編

Scratch(少兒程式設計圖形化程式設計)

這幾種程式語言的實現版本都用到了一種資料抽象:列表(一隊人)還有兩個基本過程:條件、迴圈(遍歷)無論你使用哪種語言來實現,最終你都需要藉助這三個概念。也就是說你要學會的其實是學會對問題建模,把執行這個問題的步驟編寫成演算法,演算法其實就是你思考的過程。學會程式設計可以幫助你用最低的成本去驗證結果,僅此而已。但是最終的目的還是要把這種思考問題、解決問題的方式變成自己的思維活動的基本過程,而不是漫無目的、誤打誤撞。雖然不會程式設計也可以解決這個問題,但是程式設計要教會你的就是用最高效的方式解決。如果你每一件事情都用最高效的方式解決,那你和別人的差距就會產生質的變化。

當然還有其它的語言實現,程式語言千千萬萬。但是萬變不離其宗。

舉這個例子其實就是想告訴大家,你選擇用什麼程式語言其實本質是一樣的,不同語言背後的語法、語義不同。但是他們所教會你的思考問題的方式是通用的。所以學程式設計的最高境界其實是通過程式設計學會了解決一類問題的方式當然是用最高效的方式。也就是程式設計教會你用心的方式去思考問題、解決問題。

講到這些對一些還要糾結學什麼程式語言的人相信應該有一些啟發。當然作為程式語言的選擇還要考量的還有團隊的因素、團隊運作成本、培訓成本、以及所涉及的業務領域和業務模型、對已有庫的依賴等很多因素,這些已經不是程式設計的內容了這些已經屬於軟體工程的的內容了(那些技術總監、系統架構師、專案經理、產品經理、老闆所要考慮的內容了)。

但是對於我們少兒程式設計來說有什麼借鑑意義呢。

我個人認為可以從以下幾點來考慮

首先少兒程式設計是一個新的領域,畢竟一開始所有人都覺得程式設計是大人的權利,或者準確的說應該是那些軟體公司上班的工程師的事情,但是隨著人工智慧的發展很多人意識到程式設計的重要性,而且希望孩子也從小就接觸到程式設計。所以才催生了少兒程式設計。

但是因為少兒程式設計不需要像培養一個軟體工程師一樣有這麼多標準要遵循也不夠系統化,至少現在市面上的少兒程式設計產品是這種情形,所以就出現了很多機器人,其實機器人也會涉及到一些程式設計的內容,但是在我看來更像是高階玩具。它是程式設計的區域性應用並不能系統的告訴你程式設計是怎麼一回事所以很多學了機器人的人以為就是少兒程式設計到最後其實學會的只是說明書的內容而已,很多人就會問那這樣為什麼還是有那麼多人買單呢。這就涉及到一個很微妙的點了。因為很多人其實想要的就是接觸下高科技的東西而已並不是真正想學少兒程式設計,對於這部分人群來說那些機器人是很好的一個產品,當然僅僅是”高階玩具“因為他們足夠吸引小孩子。

當然除了機器人剩下的就是那些主打遊戲程式設計之類的程式設計產品,其實道理一樣。通過很好玩的方式去吸引小孩子,這個出發點是非常棒的,但是有一個問題。缺乏後續,而且是為了程式設計而教程式設計。並不是通過程式設計這個過程教會孩子一種新的思維方式。

所以現在市面上的少兒程式設計產品其實仍然處於早期階段,同質化嚴重、缺乏系統性(課程體系不完善、有些甚至沒有課程體系,或者直接把成人工程師的那一套照抄過來)、缺乏實踐意義、師資不完善、缺乏行業標準和考核規範。到最後都變成了賣高階玩具(帶著程式設計樣子的說明書)、玩加盟模式、賺快錢。當然話說回來,也不乏有些優秀的專案和產品。所以就需要家長們擦亮你們的雙眼。

其實程式設計不神祕,學習程式設計是因為我們進入了一個新的時代,物聯網、人工智慧高速發展的階段。當然也對我們每個人的能力提出了新的要求,學習程式設計說訓練的程式設計思維其實就是其中最關鍵也是最基礎的一種新時代下的技能。所以不應該是淺嘗輒止、也不是玩玩就好、更不是最後演變成各種比賽、競賽。而是要系統性學習程式設計,並且學習到程式設計的真正精髓也就是程式設計思維-新的思維方式。