這篇文章是一個完整的程式設計入門課程。
一般的程式設計。
在開始學習特定的程式語言之前,有一些基本概念你需要熟悉。這些概念並不依賴於特定的程式語言,但對每個開發者來說都是必要的。
如果你是程式設計的新手,這篇文章的目標是幫助你準備並提供基本的概念。
具體來說,你將學習以下內容:
- 什麼是電腦
- 什麼是程式
- 什麼是程式語言
- 作為一個程式設計師的工作
- 作為一個程式設計師不需要做的事情
- 不同的程式設計範式
- 可以使用的不同程式設計語言,以及應該選擇哪一個
- 什麼是錯誤
以及更多!
為什麼你應該成為一個程式設計師?
我教學程式設計,每天收到很多電子郵件。我和很多程式設計師和想成為程式設計師的人都有很好的交流。
我對於如何讓人們學習程式設計有一個很好的理解。
人們想要建立自己夢寐以求的應用程式。他們想要將這個項目變成現實,想要實現他們的夢想。在您的電腦或手機上運行的應用程式,創建您和朋友夢想中的遊戲!
人們想以興趣的形式學習這個技能。我與70和80歲的人交談過,他們正在學習編程。出於娛樂。享受新的挑戰。為他們的朋友創建一個應用程式。
人們想在技術方面開始一個新職業。這並不奇怪 - 程式設計作為一份工作非常有吸引力:需求量很大,工作在室內,平均工資也不錯。當然,這取決於地點和水平。你也可以遠程工作,這是我認為的一個巨大的優勢。
當然,這只是其中的3個例子。你可能有不同的需求,但無論需求是什麼,學習程式設計絕對是一個你將來希望擁有的技能。
成為一個程式設計師所需要的
你不需要成為一個計算機科學家或學習工程學,也不需要成為數學天才才能學習程式設計。
這是一個你可以隨時學習的技能,無論年齡如何,而且 - 讓我說 - 它是一個非常棒的技能。
從零開始成為一個程式設計師只需要四件事:
- 耐心
- 專注力
- 時間
- 一致性
這就是你所需要的一切。
耐心,因為每次學到一些新知識時,你需要耐心,一步一步地學習,直到能夠把知識點連接起來。
專注力,因為它絕對不是一個容易掌握的技能。
時間,因為學習需要時間。在編程方面,你有時候會卡在某些問題上,需要一些時間進行研究。一個優秀的程式設計師在思考問題的時間和編程的時間上花費的時間是相等的。
一致性,因為如果你每天都能花一點時間,比如1或2小時,學習編程,你將在短時間內成為一個優秀的程式設計師。
哦,你可能也需要一台電腦。任何適度新的電腦都足夠好,你並不需要一台高級的MacBook Pro。別把這個當作藉口:)
一台電腦如何工作?概覽
當我說電腦時,我指的是每一個可以編程的電子設備:筆記本電腦和桌上型電腦,智能手機,智能手錶,您的汽車,洗碗機,相機,甚至像狗的GPS裝置這樣的小東西。許多事物,對吧?我們周圍都是電腦。
計算機是由程序驅動的電子設備。從20世紀中葉以來,程序員一直在努力使計算機速度更快,並且更容易和更可靠地編程。
機器是愚蠢的。它們只能遵循您的指示。它們真的無法思考或做決定。它們只能遵循您的指示,所以作為一個程式設計師,您就成為了一個非常強大的人。
我們稱計算機的電子部分為硬體,程序部分稱為軟體。
當您編寫一個程式給計算機時,您提供的指令會被轉換成位元,這是電子設備可以理解的唯一內容。位元只能具有兩個值:0和1。
當您查看電腦或智能手機時,您會看到一個漂亮的界面。這是多年演變的結果。在其後,每秒執行數百萬次指令,為您提供附近最佳餐廳列表。它通過與網絡溝通實現,這是我們人類建造的最大的人工生態系統。
涵蓋計算機如何工作(以及計算機網絡)將需要很多時間。在這個簡要的概述之後,我將重點放在軟體部分上。
關於程式
現在讓我們來看看什麼是程式。你的瀏覽器(Chrome,Firefox或你使用的那個)就是一個程式。
這個網站是應用程式生成的一個程式使它成為可能。我提供內容,程式生成HTML頁面。
你的手機由一個名為iOS或Android的大型程式控制。這是一個巨大的程式,當然將其稱為程式是不公平的–它是一個集合,一個程式生態系統。我們給它取了一個名字。
你電腦上的應用程式就是程式。您手機上的應用程式也是如此。
你的汽車是由程式控制的。
程式是一組指令,程式設計師組合這些指令以使機器執行特定的操作。
通常,在執行程式之前,程式將由程式設計師進行編譯。有時候程序會由另外一個程序解譯。
比如JavaScript,它在瀏覽器中運行。在此准確的時刻,您使用的瀏覽器正在執行我撰寫的某些JavaScript代碼。
所以,這是程式的第一個主要區分:編譯和解譯。不同的程式語言將允許其中之一。
最終,程式是您用來執行特定操作的東西。它可能是幫助簡化企業管理的方式,或者通過創建最終玩家遊戲來解決的問題,比如無聊的問題。
現在我們已經定義了程式是什麼,讓我們深入了解什麼是程式設計。
什麼是程式設計
通常情況下,我們通常使用程式語言中的編碼結構指示來創建一個工作的程式。
然而,我想向這個概念引入更深的內容。
對我而言,程式設計是解決問題。因此,程式設計比您拿起鍵盤並在計算機上鍵入指令的時間要早得多。
程式設計從思考問題開始。或者這個應用程式。
當您收集需求時,與涉及到的所有人,客戶,分析所需做的所有不同事物進行對話時,程式設計開始。
程式設計是定義應用程式不需要做的事情。
在開始工作之前,程式設計是確定您的應用程式是否不可能或代價過高的地方。
程式設計是繪製所有流程圖以幫助您解決問題。
程式設計也是當您卡住並需要解決問題時進行的操作。如何在Google上搜索答案以及如何提出好問題都是另一種技能。
最後,程序設計的70%是在您的程式編輯器之外完成的。
什麼是程式語言?
電腦是愚蠢的。儘管談論人工智慧,我們還沒有走到那一步。
我們正在使用的電腦只是執行我們告訴它們的東西的機器。
而我們使用程式語言與它們溝通。
程式語言是我們用來與一台機器接口的一組指令和規則。
有很多很多不同的程式語言。如果你有興趣的話,你甚至可以創建自己的程式語言。但更常見的情況是你會想使用其他人很早以前創建的程式語言,這些程式語言經過長時間的完善,只要使用就不會給你帶來麻煩。
一些例子?JavaScript。Python。Swift。Ruby。
每一種程式語言都在不同的領域解決問題,或者在某些情況下非常適合使用。
JavaScript是Web的主要語言。它是瀏覽器唯一可以在Web頁面中運行的語言。
Python和Ruby主要用於Web服務器或作為更通用的語言。例如,Python在數據科學社區很有名。
由Apple推出的Swift是用於創建iPhone應用程式和通常運行在Apple硬體上的程式的語言。
我只提到了這些,但還有很多其他的程式語言。沒有一個最好的程式語言。這都取決於情況,您和您的團隊的知識,它需要在哪種硬體上運行,以及其他因素。
計算機科學與程式設計
許多程式設計師在大學里選修了計算機科學(CS)課程。計算機科學是程序員的常見學位,因為名字中的“計算機”非常具有吸引力。
但是,計算機科學和日常程式設計相去甚遠。
計算機科學課程將教授你許多理論,例如算法分析,但實際需要在業界中程式設計的理論很少。它也可以看作是數學的一個分支。如果你問我,這也相當複雜(我在數學方面一直不擅長)。
另一方面,程式設計是使用計算機來執行非常實際的事情。
我個人在米蘭的大學裡選修了一門名為計算機工程的課程,這門課程與計算機科學相比更偏向於工程而不是程式設計。與CS相比,理論更少,實際技能也較少。關於程式設計的所有知識,我都是自學的方式學習的。或者是在實際工作中學會了。
這是對你來說的好消息。
當你閱讀這篇文章時,你可能沒有上過計算機科學或計算機工程的課程,並且你可能認為那些上過那些課程的人比你具有巨大的優勢。
好吧,猜猜看?他們沒有。
大學通常是一個緩慢運動的巨人,他們可能會教你過時的程式語言,過時的“最佳實踐”以及你需要隨著時間推移需要重新學習的各種事物 - 這不是一個容易的任務。
當然,上這些學校的人會自己學到一些東西,就像你一樣,但你可以在合理的時間內輕鬆達到CS學生的水平。此外,你可以避免學習那些在現實生活中無法應用的各種理論。
所有這些事情當然有助於學習,但在日常程式設計中適用性不大。
不同的程式設計範式
不僅有不同的程式語言。
還有不同的程式設計範式。
目前最普遍和最知名的範式有:
- 程序式程式設計
- 物件導向程式設計
- 函數式程式設計
在程序程式設計中,代碼按線性方式從開始到結束執行。您告訴電腦從頭到尾做什麼,它就會去做。
名稱來源於“程序”。這是指使用特定的指令執行某些操作。
從初學者的角度來看,這種方式可能更為熟悉。我們都認為代碼像是告訴電腦做的事情列表。C語言是程序程式設計語言的好例子。
物件導向程式設計是一種不同的模式。我們試圖使用物件來模擬正在解決的問題領域。物件具有一種被稱為類的類型。使用物件導向方法編寫的程式比一個計算機必須做的事情列表更抽象。我們以對象為中心思考,以及對象之間的互動。例如,你有一個汽車對象和一個人對象。人駕駛汽車,依此類推。對象可以維護它們自己的狀態並封裝它們。這真的很像現實世界。一個人不需要知道一輛車在機械部件下是如何工作的。他們只是開車。汽車將它的複雜性抽象出來並提供了特定的驅動方式(剎車,方向盤,等等)。
函數式程式設計採用數學函數的方法來進行編程。但請不要害怕 - 這並不複雜。實際上,我認為這是解決複雜問題並找到解決方案的最簡單方法。而JavaScript非常適用於進行函數式編程(FP)。在FP中,您將代碼組織為小函數,每個函數都返回一個結果,給予相同的輸入永遠有相同的輸出。相同的輸入=相同的輸出。這是一個基本觀點。函數可以組合,作為參數傳遞,函數操作如遞歸使我們能夠解決所有問題,而無需創建複雜的結構來實現我們的抽象。
這些只是最流行的三種方法之一。哪一種最好?這完全取決於手頭的問題。喜歡的方法也可以受到現狀或市場偏好的影響。例如,物件導向程式設計更多或更少是事實上的標準。今天我看到它被廣泛使用,但我也看到有很多人談論函數式程式設計。
現在,我提到了幾個可以與這些方法相關聯的程式語言,但是許多程式語言可以支持不同的風格。例如,JavaScript允許所有3種風格。
現在我們必須進行另一個區分,即命令式和聲明式程式設計。命令式意味著我們告訴計算機要做什麼。確切的操作。C是一種非常命令式的語言。我們將X字節移動到內存中,檢索變量Y,等等。
聲明式程式設計意味著我們描述我們想要的內容,並且我們不關心計算機是如何執行的。
如果你熟悉HTML,HTML是一種聲明式語言。如果你了解JSX,它是一種聲明式定義用戶界面的方式。
哪一種是最好的?取決於情況。一般來說,命令式程式設計最適合低層次的語言,如C或Go,用於創建非常高性能的應用程序。我們與實際計算機細節越遠,我們的代碼性能就越差。但是,編寫代碼就越容易。這是一個折衷。如常。
編譯和解譯
我們將代碼編寫到文本文件中,然後計算機處理這個文件。
它可以以2種方式處理,取決於使用的程式語言。我已經提到我們可以將程式語言分為兩大類:編譯和解譯。
如果程式語言是編譯型的,則程序將由一個稱為編譯器的程序分析,並在執行之前必須進行編譯。
在這種情況下,我們的程式以文本為基礎被轉換為一個不再是文本的可執行文件。例如,在Windows上,它將是一個.exe
文件。這是C,Go,Swift的情況。
使用解譯程式語言(如JavaScript,Python,Ruby或PHP)則不需要這一步。有時您將看到這些語言被稱為腳本語言,但我覺得這個術語對於這些語言的能力來說有點。。冒犯。
在這種情況下,有一個名為解譯器的程序,具有執行我們自己的程式的能力。我們跳過了編譯階段,直接進入執行階段。
這個區別有很大的不同。編譯的程式語言能夠在執行前檢測到錯誤,錯誤或可能的問題。使用解譯語言,只有在出現特定情況時才會發現錯誤(請注意,這也會發生在編譯語言中,但是發生的機會更小)。
但解譯語言的編寫感覺更輕巧。這個過程與每種方法都有粉絲。
圖形界面(GUI)vs命令行界面(CLI)
你可以創建(以及找到)許多類型的應用程式。一般而言,我們可以將它們分為2大類:
- 擁有圖形用戶界面(GUI)的應用程式
- 擁有命令行界面(CLI)的應用程式
兩者之間的區別很大,如果你熟悉這兩個環境(DOS和Windows),你就能理解。
或者你在服務器上運行的Linux和你在桌面計算機上運行的基於Gnome或KDE的Linux之間的區別。
GUI應用程序具有使用鼠標進行交互的界面,並且在屏幕上可以清楚地看到它,通常在一個視窗中,與其他GUI應用程序一起。許多GUI應用程序同時運行。
CLI應用程序是從一個稱為終端的文本界面訪問的,只允許您一次與一個應用程序交互。
一般而言,CLI應用程序是專業用戶的好應用程序,他們知道如何在系統中訪問終端(可以在任何類型的計算機上使用),以及如何使用任何CLI應用程序。他們知道如何找到app的幫助,通常是技術精通的。
CLI應用程序是最靈活的應用程序,因為UI不需要填充選項 - 如果需要,可以由用戶鍵入選項。他們最適合一次性任務。或者是長時間的任務,只要你可以運行多個終端窗口。
想想create-react-app
,Vim,C編譯器等。
CLI應用程序的一個特例是不與系統上的用戶進行界面交互,而是在網絡上接受交互的後端應用程序。在這種情況下,CLI用於啟動(和停止)應用程序。或者提供一種指示系統運行應用程序作為守護程序(長時間運行的進程)的方法。
另一方面,GUI應用程序需要一種方式在屏幕上視覺地提供所有可用的選項。他們最適合為基於鼠標的輸入提供豐富的互動。想想Microsoft Word、Google Earth或Chrome瀏覽器。
在JavaScript中,你通常會創建這兩種應用程序。使用React,Vue或任何其他運行在瀏覽器中的框架(實際的GUI應用程序)。
並使用Node.js創建CLI應用程序,以通過網絡連接提供服務。
從這裡開始
下載我的JavaScript初學者手冊!